scip-query 0.10.11 → 0.10.12
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.
- package/README.md +56 -35
- package/dist/augment-vue-worker.js +1 -1
- package/dist/chunk-2DOW7QCA.js +71 -0
- package/dist/chunk-2FMFF4RI.js +2 -0
- package/dist/{chunk-LSET2TXH.js → chunk-2GLNBCHB.js} +2 -2
- package/dist/chunk-2UVCH7CQ.js +2 -0
- package/dist/{chunk-LM5SHAN4.js → chunk-3XSNW5XB.js} +2 -2
- package/dist/chunk-4ISHQ7UW.js +35 -0
- package/dist/{chunk-BFXPG2VN.js → chunk-5GXTUANY.js} +2 -2
- package/dist/{chunk-FXNWFMKW.js → chunk-5JHEN5VN.js} +2 -2
- package/dist/chunk-62ULXMQ7.js +18 -0
- package/dist/chunk-63CI3IXR.js +102 -0
- package/dist/{chunk-P753MDDE.js → chunk-6BN3EHQE.js} +2 -2
- package/dist/chunk-7C6JBBE4.js +23 -0
- package/dist/chunk-7EK7OSWS.js +2 -0
- package/dist/chunk-7IWIMNHI.js +2 -0
- package/dist/chunk-7XTO4YXB.js +8 -0
- package/dist/{chunk-Z3YYR4OS.js → chunk-A4UTLKHU.js} +2 -2
- package/dist/{chunk-FDEQIPPK.js → chunk-ANUEY5WV.js} +2 -2
- package/dist/chunk-AOWFUGDL.js +2 -0
- package/dist/chunk-AREANYIA.js +3 -0
- package/dist/{chunk-6IR2AOBM.js → chunk-AZBELWZQ.js} +2 -2
- package/dist/{chunk-JME7OWD3.js → chunk-CXWCLVYL.js} +2 -2
- package/dist/chunk-CYHIKTJN.js +3 -0
- package/dist/{chunk-BVRS7RKQ.js → chunk-DDQONX6B.js} +2 -2
- package/dist/{chunk-IHUETYFW.js → chunk-DFSEARAU.js} +2 -2
- package/dist/{chunk-EY43NV4M.js → chunk-DQ6433ZG.js} +2 -2
- package/dist/chunk-DVFP6PZI.js +2 -0
- package/dist/chunk-E3ADDB43.js +2 -0
- package/dist/{chunk-YWOOQ4FF.js → chunk-ELC77ZDE.js} +1 -1
- package/dist/chunk-EOLGSSDR.js +2 -0
- package/dist/chunk-F6IXELII.js +20 -0
- package/dist/{chunk-QYB5P7GL.js → chunk-FMGVZBS2.js} +2 -2
- package/dist/{chunk-VOYOYC5T.js → chunk-FX6ULETZ.js} +2 -2
- package/dist/chunk-GG5LHT27.js +2 -0
- package/dist/chunk-GKB4JJDU.js +2 -0
- package/dist/chunk-H7JF2CKK.js +2 -0
- package/dist/chunk-HHOMJCP5.js +4 -0
- package/dist/chunk-HRDSU5FN.js +9 -0
- package/dist/{chunk-BZ53S4ZN.js → chunk-HWVYTJOV.js} +2 -2
- package/dist/chunk-JJ5SAWBT.js +2 -0
- package/dist/chunk-JNMLBL36.js +2 -0
- package/dist/chunk-JS6B76AQ.js +2 -0
- package/dist/{chunk-Z4HICZGY.js → chunk-KZ4MG5NY.js} +2 -2
- package/dist/{chunk-RNM6LMCF.js → chunk-L446VQYQ.js} +2 -2
- package/dist/{chunk-FFVIFETB.js → chunk-LDJUB7XW.js} +2 -2
- package/dist/{chunk-54KGX7EX.js → chunk-LEHVP4DY.js} +2 -2
- package/dist/chunk-MNCQPMCH.js +2 -0
- package/dist/chunk-MYTUWXHK.js +4 -0
- package/dist/chunk-N25HPUOK.js +2 -0
- package/dist/chunk-NABVR6B7.js +2 -0
- package/dist/{chunk-TK7O5ER5.js → chunk-NBNEVLRC.js} +2 -2
- package/dist/chunk-NTSR6SRP.js +2 -0
- package/dist/{chunk-7B6LP46R.js → chunk-OFXN2BCT.js} +2 -2
- package/dist/chunk-PWAK75BU.js +2 -0
- package/dist/chunk-Q5P7NOVM.js +2 -0
- package/dist/{chunk-G5UPYQGL.js → chunk-RGKRYO22.js} +4 -4
- package/dist/chunk-RM2WQ75T.js +2 -0
- package/dist/chunk-ROGZXWN2.js +2 -0
- package/dist/chunk-RSSXKJ6J.js +38 -0
- package/dist/chunk-RUV5IY25.js +7 -0
- package/dist/chunk-RVGEZYMQ.js +2 -0
- package/dist/{chunk-6LJHXREW.js → chunk-RXINFVBN.js} +2 -2
- package/dist/{chunk-YWYFU2V3.js → chunk-S2MRVIJ5.js} +2 -2
- package/dist/chunk-SA3DPTHT.js +7 -0
- package/dist/chunk-SGTKURU6.js +52 -0
- package/dist/chunk-SQNHOOJ5.js +3 -0
- package/dist/chunk-T3AEVJBG.js +4 -0
- package/dist/{chunk-NOJAM5ZV.js → chunk-T4N2ZRVY.js} +2 -2
- package/dist/{chunk-JATUZIEH.js → chunk-TBCHRDAC.js} +2 -2
- package/dist/chunk-THB6AM3V.js +11 -0
- package/dist/{chunk-TQ5W2H3S.js → chunk-ULHLDOD6.js} +1 -1
- package/dist/chunk-UQ73QF5D.js +43 -0
- package/dist/chunk-UVPY3RUZ.js +2 -0
- package/dist/chunk-V5FGK3DZ.js +2 -0
- package/dist/{chunk-ZQDIXAF5.js → chunk-VB2EZZPA.js} +2 -2
- package/dist/{chunk-7TWLSZK5.js → chunk-WTY5FERW.js} +2 -2
- package/dist/chunk-WUOB4DHH.js +6 -0
- package/dist/chunk-XHMVZFA6.js +2 -0
- package/dist/chunk-XRUGSM76.js +10 -0
- package/dist/{chunk-BASVXNY3.js → chunk-XUCZ3RQ5.js} +2 -2
- package/dist/chunk-YFQIKYOP.js +2 -0
- package/dist/chunk-Z2LDWIJV.js +5 -0
- package/dist/chunk-ZNWWVYQL.js +3 -0
- package/dist/{chunk-FKCGBZAC.js → chunk-ZUUNREKS.js} +2 -2
- package/dist/cli.js +238 -216
- package/dist/{config-types-BDIWAYzr.d.ts → config-types-dvHOz0zU.d.ts} +4 -1
- package/dist/{db-Djj3Nqrb.d.ts → db-rMZO5JFK.d.ts} +1 -1
- package/dist/{health-D5J42g4D.d.ts → health-CtTIGh6H.d.ts} +1 -1
- package/dist/index.d.ts +9 -5
- package/dist/index.js +2 -2
- package/dist/queries/affected.d.ts +2 -2
- package/dist/queries/affected.js +1 -1
- package/dist/queries/bottlenecks.d.ts +2 -2
- package/dist/queries/bottlenecks.js +1 -1
- package/dist/queries/by-kind.d.ts +2 -2
- package/dist/queries/by-kind.js +1 -1
- package/dist/queries/call-graph.d.ts +2 -2
- package/dist/queries/call-graph.js +1 -1
- package/dist/queries/change-surface.d.ts +2 -2
- package/dist/queries/change-surface.js +1 -1
- package/dist/queries/cleanup-plan.d.ts +2 -2
- package/dist/queries/cleanup-plan.js +1 -1
- package/dist/queries/co-change.d.ts +2 -2
- package/dist/queries/co-change.js +1 -1
- package/dist/queries/code.d.ts +2 -2
- package/dist/queries/code.js +1 -1
- package/dist/queries/complexity-hotspots.d.ts +2 -2
- package/dist/queries/complexity-hotspots.js +1 -1
- package/dist/queries/complexity.d.ts +2 -2
- package/dist/queries/complexity.js +1 -1
- package/dist/queries/convergence.d.ts +2 -2
- package/dist/queries/convergence.js +1 -1
- package/dist/queries/coupling.d.ts +2 -2
- package/dist/queries/coupling.js +1 -1
- package/dist/queries/cycles.d.ts +2 -2
- package/dist/queries/cycles.js +1 -1
- package/dist/queries/dataflow.d.ts +2 -2
- package/dist/queries/dataflow.js +1 -1
- package/dist/queries/dead.d.ts +2 -2
- package/dist/queries/dead.js +1 -1
- package/dist/queries/deep-chains.d.ts +2 -2
- package/dist/queries/deep-chains.js +1 -1
- package/dist/queries/deps.d.ts +2 -2
- package/dist/queries/deps.js +1 -1
- package/dist/queries/diff-gate.d.ts +2 -2
- package/dist/queries/diff-gate.js +1 -1
- package/dist/queries/diff-impact.d.ts +2 -2
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.d.ts +2 -2
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/drift.d.ts +2 -2
- package/dist/queries/drift.js +1 -1
- package/dist/queries/extract-candidates.d.ts +2 -2
- package/dist/queries/extract-candidates.js +1 -1
- package/dist/queries/fan.d.ts +2 -2
- package/dist/queries/fan.js +1 -1
- package/dist/queries/files.d.ts +2 -2
- package/dist/queries/health.d.ts +3 -3
- package/dist/queries/health.js +1 -1
- package/dist/queries/hierarchy.d.ts +2 -2
- package/dist/queries/hierarchy.js +1 -1
- package/dist/queries/hotspots.d.ts +2 -2
- package/dist/queries/hotspots.js +1 -1
- package/dist/queries/imports.d.ts +2 -2
- package/dist/queries/imports.js +1 -1
- package/dist/queries/incomplete-migration.d.ts +2 -2
- package/dist/queries/incomplete-migration.js +1 -1
- package/dist/queries/index.d.ts +3 -3
- package/dist/queries/index.js +1 -1
- package/dist/queries/isolated.d.ts +2 -2
- package/dist/queries/isolated.js +1 -1
- package/dist/queries/locality-candidates.d.ts +2 -2
- package/dist/queries/locality-candidates.js +1 -1
- package/dist/queries/members.d.ts +2 -2
- package/dist/queries/members.js +1 -1
- package/dist/queries/methods.d.ts +2 -2
- package/dist/queries/methods.js +1 -1
- package/dist/queries/outline.d.ts +2 -2
- package/dist/queries/outline.js +1 -1
- package/dist/queries/passthrough-candidates.d.ts +2 -2
- package/dist/queries/passthrough-candidates.js +1 -1
- package/dist/queries/plan-context.d.ts +2 -2
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/react-component-duplicates.d.ts +2 -2
- package/dist/queries/react-component-duplicates.js +1 -1
- package/dist/queries/react-hook-candidates.d.ts +2 -2
- package/dist/queries/react-hook-candidates.js +1 -1
- package/dist/queries/react-large-component-pressure.d.ts +2 -2
- package/dist/queries/react-large-component-pressure.js +1 -1
- package/dist/queries/recent-duplicates.d.ts +2 -2
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/redundant-reexports.d.ts +2 -2
- package/dist/queries/redundant-reexports.js +1 -1
- package/dist/queries/refs.d.ts +2 -2
- package/dist/queries/refs.js +1 -1
- package/dist/queries/self-audit.d.ts +7 -4
- package/dist/queries/self-audit.js +1 -1
- package/dist/queries/similar-chains.d.ts +2 -2
- package/dist/queries/similar-chains.js +1 -1
- package/dist/queries/similar-files.d.ts +2 -2
- package/dist/queries/similar-files.js +1 -1
- package/dist/queries/similar-signatures.d.ts +2 -2
- package/dist/queries/similar-signatures.js +1 -1
- package/dist/queries/similar.d.ts +46 -17
- package/dist/queries/similar.js +1 -1
- package/dist/queries/slice.d.ts +2 -2
- package/dist/queries/slice.js +1 -1
- package/dist/queries/stale-abstractions.d.ts +2 -2
- package/dist/queries/stale-abstractions.js +1 -1
- package/dist/queries/stats.d.ts +2 -2
- package/dist/queries/surface.d.ts +2 -2
- package/dist/queries/surface.js +1 -1
- package/dist/queries/symbols.d.ts +2 -2
- package/dist/queries/symbols.js +1 -1
- package/dist/queries/system.d.ts +2 -2
- package/dist/queries/system.js +1 -1
- package/dist/queries/trace.d.ts +2 -2
- package/dist/queries/trace.js +1 -1
- package/dist/queries/unused-imports.d.ts +2 -2
- package/dist/queries/unused-imports.js +1 -1
- package/dist/queries/unused-params.d.ts +2 -2
- package/dist/queries/unused-params.js +1 -1
- package/dist/queries/vue-component-duplicates.d.ts +2 -2
- package/dist/queries/vue-component-duplicates.js +1 -1
- package/dist/queries/vue-composable-candidates.d.ts +2 -2
- package/dist/queries/vue-composable-candidates.js +1 -1
- package/dist/queries/vue-large-view-pressure.d.ts +2 -2
- package/dist/queries/vue-large-view-pressure.js +1 -1
- package/dist/queries/wrapper-candidates.d.ts +2 -2
- package/dist/queries/wrapper-candidates.js +1 -1
- package/dist/reindex-worker.js +9 -9
- package/dist/reindex.d.ts +30 -4
- package/dist/reindex.js +19 -19
- package/dist/runtime.d.ts +4 -3
- package/dist/runtime.js +2 -2
- package/dist/{scip-cli-CnK9Va4O.d.ts → scip-cli-trnNvymv.d.ts} +1 -1
- package/docs/COMMAND_REFERENCE.md +1 -1
- package/docs/analyzer-inventory.md +8 -0
- package/docs/analyzer-validation-ledger.md +7 -0
- package/package.json +3 -1
- package/scripts/evidence-product-contract.mjs +197 -0
- package/dist/chunk-2KHTSEIL.js +0 -102
- package/dist/chunk-3VD3JMK2.js +0 -2
- package/dist/chunk-4UZO3XCV.js +0 -35
- package/dist/chunk-5GOLFJEO.js +0 -8
- package/dist/chunk-5OST6GYB.js +0 -2
- package/dist/chunk-65AU3HFZ.js +0 -2
- package/dist/chunk-6GN7FXCH.js +0 -2
- package/dist/chunk-6JRV4MY2.js +0 -23
- package/dist/chunk-6QSOCTZT.js +0 -18
- package/dist/chunk-72KY2ZFO.js +0 -2
- package/dist/chunk-7GO4EQF5.js +0 -2
- package/dist/chunk-7IVSJJZU.js +0 -7
- package/dist/chunk-A536TEU4.js +0 -3
- package/dist/chunk-AVWPHM2Q.js +0 -4
- package/dist/chunk-BSN22NRK.js +0 -9
- package/dist/chunk-C5CTSJ6X.js +0 -6
- package/dist/chunk-CO5GJRP7.js +0 -2
- package/dist/chunk-CW5YFOCP.js +0 -5
- package/dist/chunk-DS6QEB3G.js +0 -5
- package/dist/chunk-E35O7UCB.js +0 -2
- package/dist/chunk-EXDQ35NN.js +0 -2
- package/dist/chunk-FAYI6KZ5.js +0 -2
- package/dist/chunk-FG4NT6VY.js +0 -2
- package/dist/chunk-GQBMH2TQ.js +0 -2
- package/dist/chunk-GRJY65YT.js +0 -2
- package/dist/chunk-HF25DFSC.js +0 -3
- package/dist/chunk-HHN2B5KA.js +0 -2
- package/dist/chunk-JCLDUKT6.js +0 -38
- package/dist/chunk-JGN2ZFJR.js +0 -2
- package/dist/chunk-JM72FNGA.js +0 -2
- package/dist/chunk-KDFONWTW.js +0 -40
- package/dist/chunk-LPL4MA6R.js +0 -2
- package/dist/chunk-LZHUWKGD.js +0 -2
- package/dist/chunk-M4COR2H6.js +0 -2
- package/dist/chunk-O6ZH6C6Y.js +0 -2
- package/dist/chunk-OBGRLXWF.js +0 -3
- package/dist/chunk-OLTESY4K.js +0 -3
- package/dist/chunk-P4KYUPBD.js +0 -4
- package/dist/chunk-P5RYBRIO.js +0 -4
- package/dist/chunk-P7AL7Y37.js +0 -2
- package/dist/chunk-PFOCOG57.js +0 -2
- package/dist/chunk-QLAUCRDJ.js +0 -2
- package/dist/chunk-QPU7EXAW.js +0 -2
- package/dist/chunk-RVWSAMTT.js +0 -2
- package/dist/chunk-USPV3T5K.js +0 -2
- package/dist/chunk-VCQYSG2M.js +0 -10
- package/dist/chunk-VUKC6F77.js +0 -20
- package/dist/chunk-W2CBNBEL.js +0 -71
- package/dist/chunk-W6BVEKYC.js +0 -3
- package/dist/chunk-WUCEKFQC.js +0 -3
- package/dist/chunk-XUGQU7PM.js +0 -41
- package/dist/chunk-Y5NBHMQX.js +0 -2
- package/dist/chunk-YCOFCT4B.js +0 -2
- package/dist/chunk-YZA6PPZL.js +0 -3
package/dist/cli.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{program as
|
|
2
|
+
import{program as Aa}from"commander";import{realpathSync as Fx}from"fs";import{fileURLToPath as AU}from"url";import{createRequire as hj}from"module";import{availableParallelism as yj}from"os";import{fileURLToPath as yu}from"url";import{statSync as Tx}from"fs";function We(e){let t=e.get("SELECT COUNT(*) as c FROM documents").c,n=e.get("SELECT COUNT(*) as c FROM global_symbols").c,i=e.get("SELECT COUNT(*) as c FROM mentions WHERE role = 1").c,r=e.get("SELECT COUNT(*) as c FROM mentions WHERE role != 1").c;return{documents:t,symbols:n,definitions:i,references:r,..._x(e.config.dbPath)}}function _x(e){try{let t=Tx(e);return{indexSizeBytes:t.size,lastBuilt:t.mtime}}catch{return{indexSizeBytes:0,lastBuilt:null}}}function O(e,t={}){let n=t.scope?"AND relative_path LIKE ?":"",i=t.like?"AND relative_path LIKE ?":"",r=[...t.scope?[`%${t.scope}%`]:[],...t.like?[t.like]:[]],o=e.all(`SELECT relative_path
|
|
3
3
|
FROM documents
|
|
4
4
|
WHERE 1 = 1
|
|
5
5
|
${e.pathExclusionsFor("documents")}
|
|
6
6
|
${n}
|
|
7
7
|
${i}
|
|
8
|
-
ORDER BY relative_path`,...r).map(a=>a.relative_path),s=t.extensions?o.filter(a=>t.extensions.some(c=>a.toLowerCase().endsWith(c.toLowerCase()))):o;return t.includeIgnored===!1?s.filter(a=>!e.isIgnored(a)):s}function
|
|
9
|
-
`):[]})}var
|
|
10
|
-
`).length}function
|
|
11
|
-
`).length-1):0;return{kind:n,ownerPath:t,sourcePath:c,external:!0,src:s,attrs:r,lang:o,body:l,startLine:0,endLine:
|
|
12
|
-
`.repeat(i.startLine)+i.body;return
|
|
8
|
+
ORDER BY relative_path`,...r).map(a=>a.relative_path),s=t.extensions?o.filter(a=>t.extensions.some(c=>a.toLowerCase().endsWith(c.toLowerCase()))):o;return t.includeIgnored===!1?s.filter(a=>!e.isIgnored(a)):s}function Ax(e){return/[*?]/.test(e)?e.replace(/\*\*/g,"%").replace(/\*/g,"%").replace(/\?/g,"_"):`%${e}%`}function Ma(e,t){let n=Ax(t);return O(e,{like:n,includeIgnored:!1}).map(i=>({relativePath:i}))}import{extname as cd}from"path";var Mx={".rs":"rust",".ts":"typescript",".mts":"typescript",".cts":"typescript",".tsx":"tsx",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".pyi":"python",".java":"java",".kt":"kotlin",".kts":"kotlin",".scala":"scala",".sc":"scala",".rb":"ruby",".c":"c",".h":"c",".cc":"cpp",".cpp":"cpp",".cxx":"cpp",".hpp":"cpp",".hh":"cpp",".hxx":"cpp",".cs":"csharp",".php":"php",".vb":"vb",".clj":"clojure",".cljs":"clojure",".cljc":"clojure"};function H(e){return Mx[cd(e).toLowerCase()]??null}function Ht(e){return cd(e).toLowerCase()===".vue"}var ld=[];function on(e){e.groups.length>0&&ld.push(e)}function $a(e,t){let n=new Set(t.groups);for(let i of ld)i.groups.some(r=>n.has(r))&&(t.file!==void 0&&i.clearFile?i.clearFile(e,t.file):i.clearAll(e))}function ud(){let e=new WeakMap;return{cache:e,ensure(t){let n=e.get(t);return n||(n=new Map,e.set(t,n)),n}}}function W(e,t){let{cache:n,ensure:i}=ud(),r={get(o,s,a){let c=i(o);if(c.has(s))return c.get(s);let l=a();return c.set(s,l),l},invalidate(o,s){n.get(o)?.delete(s)},invalidateAll(o){n.delete(o)},size(o){return n.get(o)?.size??0}};return on({name:e,groups:t.clearGroups,clearAll:o=>r.invalidateAll(o),clearFile:(o,s)=>r.invalidate(o,s)}),r}function ie(e,t){let n=new WeakMap,i={get(r,o){let s=n.get(r);if(s)return s.value;let a=o();return n.set(r,{value:a}),a},invalidate(r){n.delete(r)},has(r){return n.has(r)}};return on({name:e,groups:t.clearGroups,clearAll:r=>i.invalidate(r)}),i}var $x={clearGroups:["whole-project","source-file"]};function sn(e){return wn(e,$x)}function wn(e,t){let{cache:n,ensure:i}=ud(),r={get(o,s,a,c){let l=i(o),d=l.get(s);if(d&&d.source===a)return d.value;let u=c();return l.set(s,{source:a,value:u}),u},invalidate(o,s){n.get(o)?.delete(s)},invalidateAll(o){n.delete(o)}};return on({name:e,groups:t.clearGroups,clearAll:o=>r.invalidateAll(o),clearFile:(o,s)=>r.invalidate(o,s)}),r}import{createRequire as jx}from"module";var $e=jx(import.meta.url),ko=null,dd=!1;function Ox(){if(dd)return null;if(ko)return ko;try{return ko=$e("tree-sitter"),ko}catch{return dd=!0,null}}var md=new Map,wo=new Set;function Bx(e){if(wo.has(e))return null;let t=md.get(e);if(t)return t;let n;try{switch(e){case"rust":n=$e("tree-sitter-rust");break;case"typescript":n=$e("tree-sitter-typescript").typescript;break;case"tsx":n=$e("tree-sitter-typescript").tsx;break;case"javascript":n=$e("tree-sitter-javascript");break;case"python":n=$e("tree-sitter-python");break;case"java":n=$e("tree-sitter-java");break;case"kotlin":n=$e("tree-sitter-kotlin");break;case"scala":n=$e("tree-sitter-scala");break;case"ruby":n=$e("tree-sitter-ruby");break;case"c":n=$e("tree-sitter-c");break;case"cpp":n=$e("tree-sitter-cpp");break;case"csharp":n=$e("tree-sitter-c-sharp");break;case"php":n=$e("tree-sitter-php").php;break;case"vb":{let i=$e("tree-sitter-vb-dotnet");n=i.language??i;break}case"clojure":return wo.add(e),null}}catch{return wo.add(e),null}return md.set(e,n),n}var pd=new Map;function Hx(e){let t=pd.get(e);if(t)return t;let n=Bx(e);if(!n)return null;let i=Ox();if(!i)return null;let r=new i;try{r.setLanguage(n)}catch{return wo.add(e),null}return pd.set(e,r),r}function Vx(e,t){return e.parse(i=>i>=t.length?null:t.slice(i,Math.min(t.length,i+16384)))}function dr(e,t){let n=Hx(e);if(!n)return null;try{return Vx(n,t)}catch{return null}}import{readFileSync as qx}from"fs";import{join as Ux}from"path";var zx=W("source-text",{clearGroups:["whole-project","source-file"]}),Wx=W("source-lines",{clearGroups:["whole-project","source-file"]});function M(e,t){let n=t.replace(/\\/g,"/");return zx.get(e,n,()=>{let i=Ux(e.config.projectRoot,n);try{return qx(i,"utf-8")}catch(r){if(Gx(r))return"";throw r}})}function Gx(e){return typeof e=="object"&&e!==null&&"code"in e&&(e.code==="ENOENT"||e.code==="ENOTDIR")}function Ye(e,t){let n=t.replace(/\\/g,"/");return Wx.get(e,n,()=>{let i=M(e,n);return i?i.split(`
|
|
9
|
+
`):[]})}var Kx=/^\s*(?:\/\/|#|\/\*+|\*)\s*scip-query[\s:-]*ignore(?:[\s:-]+(dead(?:-code)?|stale|wrapper|passthrough|drift|extract|similar))?\b/i;function mr(e){let t=Kx.exec(e);return t?t[1]??"":null}function Po(e,t,n){if(n<=0)return!1;let i=Ye(e,t);if(i.length===0)return!1;for(let r=n-1;r>=0&&r>=n-5;r-=1){let o=(i[r]??"").trim();if(o!==""){if(mr(o)!==null)return!0;if(!o.startsWith("//")&&!o.startsWith("*")&&!o.startsWith("/*")&&!o.startsWith("@")&&!o.startsWith("#"))return!1}}return!1}import{parse as eC}from"@vue/compiler-sfc";import{posix as ja}from"path";import{parse as Jx}from"@vue/compiler-sfc";var Xx=sn("vue-sfc-units");function yi(e,t){let n=hd(t),i=M(e,n);return Xx.get(e,n,i,()=>Qx(e,n,i))}function hd(e){return e.replace(/\\/g,"/").replace(/^\.\//,"")}function Oa(e){let t=e?.toLowerCase();return!t||t==="js"||t==="javascript"||t==="jsx"?"javascript":t==="ts"||t==="typescript"?"typescript":t==="tsx"?"tsx":null}function Pn(e){return!e||e.body.length===0?0:e.body.split(`
|
|
10
|
+
`).length}function Qx(e,t,n){let i={relativePath:t,template:null,scripts:[],styles:[],customBlocks:[],errors:[]};if(!n)return i;let r;try{r=Jx(n,{filename:t})}catch(s){return i.errors.push(gd(s)),i}i.errors.push(...r.errors.map(gd));let{descriptor:o}=r;return o.template&&(i.template=Io(e,t,"template",o.template)),o.script&&i.scripts.push(fd(e,t,o.script,!1)),o.scriptSetup&&i.scripts.push(fd(e,t,o.scriptSetup,!0)),i.styles=o.styles.map(s=>Io(e,t,"style",s)),i.customBlocks=o.customBlocks.map(s=>Io(e,t,"custom",s)),i.errors.push(...[i.template,...i.scripts,...i.styles,...i.customBlocks].flatMap(s=>s?.errors??[])),i}function fd(e,t,n,i){let r=Io(e,t,"script",n);return{...r,kind:"script",setup:i,astLanguage:Oa(r.lang)}}function Io(e,t,n,i){let r=Zx(i.attrs),o=typeof r.lang=="string"?r.lang:null,s=typeof r.src=="string"?r.src:typeof i.src=="string"?i.src:void 0;if(s){let c=Yx(t,s);if(!c)return{kind:n,ownerPath:t,sourcePath:t,external:!0,src:s,attrs:r,lang:o,body:"",startLine:0,endLine:0,errors:[`Could not resolve Vue ${n} block source: ${s}`]};let l=M(e,c),d=l?Math.max(0,l.split(`
|
|
11
|
+
`).length-1):0;return{kind:n,ownerPath:t,sourcePath:c,external:!0,src:s,attrs:r,lang:o,body:l,startLine:0,endLine:d,errors:l?[]:[`Vue ${n} block source not found: ${c}`]}}let a=Math.max(0,i.loc.start.line-1);return{kind:n,ownerPath:t,sourcePath:t,external:!1,attrs:r,lang:o,body:i.content,startLine:a,endLine:Math.max(a,i.loc.end.line-1),errors:[]}}function Yx(e,t){let n=t.split(/[?#]/,1)[0];if(!n||n.startsWith("/")||n.includes("://"))return null;let i=hd(ja.normalize(ja.join(ja.dirname(e),n)));return i===".."||i.startsWith("../")?null:i}function Zx(e){return{...e}}function gd(e){return e instanceof Error?e.message:String(e)}function Lo(e){let t=eC(e),n=t.descriptor.scriptSetup??t.descriptor.script;if(!n||n.src)return null;let i=Oa(n.lang??null);return i?{body:n.content,startLine:Math.max(0,n.loc.start.line-1),language:i}:null}var yd=wn("ast-trees",{clearGroups:["whole-project","source-file"]});function Pe(e,t){if(Ht(t))return tC(e,t);let n=H(t);if(!n)return null;let i=M(e,t);return i?yd.get(e,t,i,()=>dr(n,i)):null}function tC(e,t){let n=M(e,t);return n?yd.get(e,t,n,()=>{let i=Lo(n);if(!i)return null;let r=`
|
|
12
|
+
`.repeat(i.startLine)+i.body;return dr(i.language,r)}):null}function Si(e,t){let n=nC(e,t);if(!n)return null;let i=bi(n);return i?{calleeLeaf:i,memberAccess:iC(n),line:e.startPosition.row}:null}function nC(e,t){if(t==="rust")return e.type==="call_expression"?e.childForFieldName("function")??e.namedChild(0):e.type==="macro_invocation"?e.childForFieldName("macro")??e.namedChild(0):null;if(t==="python")return e.type!=="call"?null:e.childForFieldName("function")??e.namedChild(0);if(t==="typescript"||t==="tsx"||t==="javascript"){if(e.type==="call_expression")return e.childForFieldName("function")??e.namedChild(0);if(e.type==="new_expression")return e.childForFieldName("constructor")??e.namedChild(0)}return null}function iC(e){switch(e.type){case"field_expression":case"member_expression":case"attribute":return!0;default:return!1}}function bi(e){switch(e.type){case"identifier":case"type_identifier":case"property_identifier":case"shorthand_property_identifier":return e.text;case"field_expression":case"member_expression":case"attribute":{let t=e.namedChild(e.namedChildCount-1);return t?bi(t):null}case"scoped_identifier":{let t=e.childForFieldName("name")??e.namedChild(e.namedChildCount-1);return t?bi(t):null}case"super":case"self":case"this":return null;default:return null}}import{createHash as rC}from"crypto";import{readFileSync as oC}from"fs";import{dirname as bd,join as Sd}from"path";import sC from"better-sqlite3";var aC="evidence.db",Eo=new WeakMap,cC=W("evidence-content-hash",{clearGroups:["whole-project","source-file"]}),lC=W("evidence-project-fingerprint",{clearGroups:["whole-project"]}),an="evidence-v1",Do="version NOT LIKE 'evidence-%'";function Vt(e){return rC("sha256").update(e).digest("hex")}function re(e,t,n){return cC.get(e,t,()=>Vt(n))}function In(e){return lC.get(e,"current",()=>{try{let t=JSON.parse(oC(Sd(bd(e.config.dbPath),"meta.json"),"utf-8"));if(t.version!==2&&t.version!==3||t.status!=="complete"||t.fingerprint===void 0)return null;let n=Array.isArray(t.indexedLanguages)?[...t.indexedLanguages].sort():[];return Vt(JSON.stringify({fingerprint:t.fingerprint,indexedLanguages:n}))}catch(t){return Ba("project fingerprint unavailable",t),null}})}function Ba(e,t){process.env.SCIP_QUERY_DEBUG&&console.error(`evidence-cache: ${e}: ${t instanceof Error?t.message:String(t)}`)}function cn(e){if(Eo.has(e))return Eo.get(e)??null;let t=null;try{let n=new sC(Sd(bd(e.config.dbPath),aC));n.pragma("journal_mode = WAL"),n.pragma("busy_timeout = 5000"),n.pragma("synchronous = NORMAL"),n.exec(`
|
|
13
13
|
CREATE TABLE IF NOT EXISTS file_evidence (
|
|
14
14
|
kind TEXT NOT NULL,
|
|
15
15
|
relative_path TEXT NOT NULL,
|
|
@@ -18,6 +18,14 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
18
18
|
payload TEXT NOT NULL,
|
|
19
19
|
PRIMARY KEY (kind, relative_path)
|
|
20
20
|
);
|
|
21
|
+
CREATE TABLE IF NOT EXISTS project_evidence (
|
|
22
|
+
kind TEXT NOT NULL,
|
|
23
|
+
cache_key TEXT NOT NULL,
|
|
24
|
+
project_fingerprint TEXT NOT NULL,
|
|
25
|
+
version TEXT NOT NULL,
|
|
26
|
+
payload TEXT NOT NULL,
|
|
27
|
+
PRIMARY KEY (kind, cache_key)
|
|
28
|
+
);
|
|
21
29
|
CREATE TABLE IF NOT EXISTS semantic_callees (
|
|
22
30
|
relative_path TEXT NOT NULL,
|
|
23
31
|
symbol TEXT NOT NULL,
|
|
@@ -36,28 +44,40 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
36
44
|
PRIMARY KEY (relative_path, symbol)
|
|
37
45
|
);
|
|
38
46
|
`),t={evidence:n,readFileEvidence:n.prepare("SELECT payload FROM file_evidence WHERE kind = ? AND relative_path = ? AND content_hash = ? AND version = ?"),readLegacyFileEvidence:n.prepare(`SELECT payload FROM file_evidence
|
|
39
|
-
WHERE kind = ? AND relative_path = ? AND content_hash = ? AND ${
|
|
47
|
+
WHERE kind = ? AND relative_path = ? AND content_hash = ? AND ${Do}
|
|
40
48
|
ORDER BY version DESC
|
|
41
|
-
LIMIT 1`),writeFileEvidence:n.prepare("INSERT OR REPLACE INTO file_evidence (kind, relative_path, content_hash, version, payload) VALUES (?, ?, ?, ?, ?)"),
|
|
49
|
+
LIMIT 1`),writeFileEvidence:n.prepare("INSERT OR REPLACE INTO file_evidence (kind, relative_path, content_hash, version, payload) VALUES (?, ?, ?, ?, ?)"),readProjectEvidence:n.prepare("SELECT payload FROM project_evidence WHERE kind = ? AND cache_key = ? AND project_fingerprint = ? AND version = ?"),readLegacyProjectEvidence:n.prepare(`SELECT payload FROM project_evidence
|
|
50
|
+
WHERE kind = ? AND cache_key = ? AND project_fingerprint = ? AND ${Do}
|
|
51
|
+
ORDER BY version DESC
|
|
52
|
+
LIMIT 1`),writeProjectEvidence:n.prepare("INSERT OR REPLACE INTO project_evidence (kind, cache_key, project_fingerprint, version, payload) VALUES (?, ?, ?, ?, ?)"),readCallees:n.prepare(`SELECT payload FROM semantic_callees
|
|
42
53
|
WHERE relative_path = ? AND symbol = ? AND content_hash = ? AND deps_digest = ? AND version = ?`),readLegacyCallees:n.prepare(`SELECT payload FROM semantic_callees
|
|
43
|
-
WHERE relative_path = ? AND symbol = ? AND content_hash = ? AND deps_digest = ? AND ${
|
|
54
|
+
WHERE relative_path = ? AND symbol = ? AND content_hash = ? AND deps_digest = ? AND ${Do}
|
|
44
55
|
ORDER BY version DESC
|
|
45
56
|
LIMIT 1`),writeCallees:n.prepare(`INSERT OR REPLACE INTO semantic_callees
|
|
46
57
|
(relative_path, symbol, content_hash, deps_digest, version, payload) VALUES (?, ?, ?, ?, ?, ?)`),dropStaleCallees:n.prepare("DELETE FROM semantic_callees WHERE relative_path = ? AND content_hash != ?"),readReferences:n.prepare(`SELECT payload FROM semantic_references
|
|
47
58
|
WHERE relative_path = ? AND symbol = ? AND project_fingerprint = ? AND version = ?`),readLegacyReferences:n.prepare(`SELECT payload FROM semantic_references
|
|
48
|
-
WHERE relative_path = ? AND symbol = ? AND project_fingerprint = ? AND ${
|
|
59
|
+
WHERE relative_path = ? AND symbol = ? AND project_fingerprint = ? AND ${Do}
|
|
49
60
|
ORDER BY version DESC
|
|
50
61
|
LIMIT 1`),writeReferences:n.prepare(`INSERT OR REPLACE INTO semantic_references
|
|
51
|
-
(relative_path, symbol, project_fingerprint, version, payload) VALUES (?, ?, ?, ?, ?)`),dropStaleReferences:n.prepare("DELETE FROM semantic_references WHERE project_fingerprint != ?")}}catch(n){ya("disabled (open failed)",n)}return ho.set(e,t),t}function oi(e,t,n){ya(`disabled (${t})`,n),ho.set(e,null)}function ae(e,t,n,i){let r=ri(e);if(!r)return null;try{return(r.readFileEvidence.get(t,n,i,ni)??r.readLegacyFileEvidence.get(t,n,i))?.payload??null}catch(o){return oi(e,"file_evidence read",o),null}}function ce(e,t,n,i,r){let o=ri(e);if(o)try{o.writeFileEvidence.run(t,n,i,ni,r)}catch(s){oi(e,"file_evidence write",s)}}function $u(e,t,n,i,r){let o=ri(e);if(!o)return null;try{return(o.readCallees.get(t,n,i,r,ni)??o.readLegacyCallees.get(t,n,i,r))?.payload??null}catch(s){return oi(e,"semantic_callees read",s),null}}function Mu(e,t,n,i){let r=ri(e);if(!r)return null;try{return(r.readReferences.get(t,n,i,ni)??r.readLegacyReferences.get(t,n,i))?.payload??null}catch(o){return oi(e,"semantic_references read",o),null}}function Ou(e,t){if(t.length===0)return;let n=ri(e);if(n)try{n.evidence.transaction(()=>{let i=new Set;for(let r of t){let o=`${r.relativePath}\0${r.contentHash}`;i.has(o)||(i.add(o),n.dropStaleCallees.run(r.relativePath,r.contentHash)),n.writeCallees.run(r.relativePath,r.symbol,r.contentHash,r.depsDigest,ni,r.payload)}})()}catch(i){oi(e,"semantic_callees write",i)}}function ju(e,t){if(t.length===0)return;let n=ri(e);if(n)try{n.evidence.transaction(()=>{let i=new Set;for(let r of t)i.has(r.projectFingerprint)||(i.add(r.projectFingerprint),n.dropStaleReferences.run(r.projectFingerprint)),n.writeReferences.run(r.relativePath,r.symbol,r.projectFingerprint,ni,r.payload)})()}catch(i){oi(e,"semantic_references write",i)}}function tr(e){return e.type==="comment"||e.type==="line_comment"||e.type==="block_comment"}var VS=new Set(["function_declaration","method_definition","method_signature","function_signature"]);function yo(e,t){let n=US(e,t);if(n)return{name:n.name,startLine:n.definitionNode.startPosition.row,endLine:n.definitionNode.endPosition.row,paramCount:Vu(n.functionNode),params:Bu(n.functionNode),paramsEndLine:Hu(n.functionNode),isLiteralPassthrough:qu(n.functionNode,t)};if(!qS(e.type,t))return null;let i=e.childForFieldName("name")??e.namedChildren.find(r=>r.type==="identifier"||r.type==="property_identifier");return i?{name:i.text,startLine:e.startPosition.row,endLine:e.endPosition.row,paramCount:Vu(e),params:Bu(e),paramsEndLine:Hu(e),isLiteralPassthrough:qu(e,t)}:null}function Uu(e){return e.namedChildren.find(t=>t.type==="parameters"||t.type==="formal_parameters")}function Bu(e){let t=Uu(e);if(!t)return[];let n=[];for(let i of t.namedChildren){if(tr(i))continue;if(i.type==="identifier"){n.push({name:i.text,simple:!0});continue}let r=i.namedChildren.some(a=>a.type.endsWith("_modifier"))||/^\s*(?:public|private|protected|readonly|override)\b/.test(i.text),o=i.childForFieldName("pattern");if(!r&&o&&o.type==="identifier"){n.push({name:o.text,simple:!0});continue}let s=i.namedChildren.find(a=>a.type==="identifier");n.push({name:o?.type==="identifier"?o.text:s?.text??"",simple:!1})}return n}function Hu(e){let t=Uu(e);return t?t.endPosition.row:e.startPosition.row}function qS(e,t){return t==="rust"?e==="function_item"||e==="function_signature_item":t==="python"?e==="function_definition":t==="typescript"||t==="tsx"||t==="javascript"?VS.has(e):!1}function US(e,t){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript")return null;if(e.type==="variable_declarator"){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);return!n||!i||i.type!=="arrow_function"&&i.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:i}}if(e.type==="public_field_definition"){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);return!n||!i||i.type!=="arrow_function"&&i.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:i}}return null}function Vu(e){let t=e.namedChildren.find(i=>i.type==="parameters"||i.type==="formal_parameters");if(!t)return 0;let n=0;for(let i of t.namedChildren)tr(i)||(n+=1);return n}function qu(e,t){let n=e.namedChildren.find(d=>d.type==="block"||d.type==="statement_block");if(!n)return!1;let i=n.namedChildren.filter(d=>!tr(d));if(i.length!==1)return!1;let r=i[0],o=null;if(r.type==="return_statement"||r.type==="expression_statement"?o=r.namedChild(0)??null:t==="rust"&&(r.type==="call_expression"||r.type==="macro_invocation")&&(o=r),!o)return!1;let s=t==="python"?"call":"call_expression";if(o.type!==s)return!1;let a=o.namedChildren.find(d=>d.type==="arguments"||d.type==="argument_list");if(!a)return!1;let c=a.namedChildren.filter(d=>!tr(d)),l=e.namedChildren.find(d=>d.type==="parameters"||d.type==="formal_parameters");if(!l)return!1;let u=[];for(let d of l.namedChildren){if(d.type==="identifier"){u.push(d.text);continue}let m=d.namedChildren.find(p=>p.type==="identifier");m&&u.push(m.text)}if(c.length!==u.length)return!1;for(let d=0;d<u.length;d+=1){let m=c[d];if(m.type!=="identifier"||m.text!==u[d])return!1}return!0}var WS=new Set(["identifier","type_identifier","field_identifier"]),zS=new Set(["identifier"]),GS=new Set(["identifier","property_identifier","type_identifier","shorthand_property_identifier","shorthand_property_identifier_pattern"]),JS=new Set(["rust","python"]),KS=/\{([^{}]*)\}/g,QS=/\b([A-Za-z_][\w]*)\b/g;function Wu(e,t){return XS(t).has(e.type)}function zu(e,t){return JS.has(t)&&e.type==="string_content"}function ba(e){let t=0;for(let i of e.values()){let r=i[i.length-1];r!==void 0&&r>t&&(t=r)}let n=new Array(t+1);for(let i=0;i<=t;i+=1)n[i]=new Set;for(let[i,r]of e)for(let o of r)n[o].add(i);return n}function XS(e){return e==="rust"?WS:e==="python"?zS:GS}function Gu(e,t){let n=e.startPosition.row;for(let i of e.text.matchAll(KS)){let r=i[1]??"";for(let o of r.matchAll(QS))o[1]&&t(o[1],n)}}var YS=[/\bdefault\s*=\s*"([^"]+)"/g,/\bwith\s*=\s*"([^"]+)"/g,/\bserialize_with\s*=\s*"([^"]+)"/g,/\bdeserialize_with\s*=\s*"([^"]+)"/g,/\bskip_serializing_if\s*=\s*"([^"]+)"/g,/\bgetter\s*=\s*"([^"]+)"/g,/\brename_all_with\s*=\s*"([^"]+)"/g,/\bschema_with\s*=\s*"([^"]+)"/g],ZS=/^#!?\[\s*serde\s*\(/,ex=/^#!?\[\s*schemars\s*\(/,tx=/^#!?\[\s*validate\s*\(/,nx=new Set(["invoke","invokeTauriCommand","listen","once","emit","subscribe","dispatch","sendCommand","callRust"]);function Ju(e,t,n){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript"||e.type!=="call_expression")return;let i=e.childForFieldName("function")??e.namedChild(0);if(!i)return;let r=ei(i);if(!r||!nx.has(r))return;let o=e.namedChildren.find(c=>c.type==="arguments");if(!o)return;let s=o.namedChild(0);if(!s||s.type!=="string")return;let a=s.namedChildren.find(c=>c.type==="string_fragment");a&&n.add(a.text)}function Ku(e,t){let n=ZS.test(e),i=ex.test(e),r=tx.test(e);if(!(!n&&!i&&!r))for(let o of YS){o.lastIndex=0;let s;for(;(s=o.exec(e))!==null;){let a=s[1],c=a.split("::").pop()??a;c==="is_none"&&/\bOption\b/.test(a)||c==="is_empty"&&/\b(String|Vec|HashMap|BTreeMap|HashSet|BTreeSet)\b/.test(a)||c&&t.add(c)}}}function Qu(e,t){let n=new Map,i=(s,a)=>{if(s===a)return;let c=n.get(s);c||(c=new Set,n.set(s,c)),c.add(a)},r=t==="python"?new Set(["identifier"]):new Set(["type_identifier"]),o=(s,a)=>{let c=l=>{r.has(l.type)&&l.text!==a&&i(l.text,a);for(let u of l.children)c(u)};for(let l of s.children)c(l)};if(t==="rust")for(let s of e.rootNode.descendantsOfType(["struct_item","enum_item","union_item","type_item"])){let a=s.namedChildren.find(l=>l.type==="type_identifier")?.text;if(!a)continue;let c=s.namedChildren.find(l=>l.type==="field_declaration_list"||l.type==="enum_variant_list"||l.type==="ordered_field_declaration_list");c&&o(c,a),s.type==="type_item"&&o(s,a)}else if(t==="python")for(let s of e.rootNode.descendantsOfType("class_definition")){let a=s.namedChildren.find(l=>l.type==="identifier")?.text;if(!a)continue;let c=s.namedChildren.find(l=>l.type==="block");if(c)for(let l of c.descendantsOfType("type"))for(let u of l.descendantsOfType("identifier"))u.text!==a&&i(u.text,a)}else for(let s of e.rootNode.descendantsOfType(["interface_declaration","type_alias_declaration","class_declaration"])){let a=s.namedChildren.find(c=>c.type==="type_identifier")?.text;a&&o(s,a)}return n}var ix=dn("source-facts",{clearGroups:["whole-project","source-file"]});function ye(e,t){let n=F(e,t);if(!n)return null;let i=rx(t,n);return i?ix.get(e,t,n,()=>ox(e,t,i,n)):null}function rx(e,t){return Nt(e)?go(t)?.language??null:K(e)}function ox(e,t,n,i){let r=Z(e,t,i),o=ae(e,"source-facts",t,r);if(o){let c=ax(o);if(c&&c.language===n)return c}let s=ke(e,t);if(!s)return null;let a=lx(s,n);return ce(e,"source-facts",t,r,sx(a)),a}function sx(e){let t={language:e.language,callables:e.callables,callSites:e.callSites,typeContainerMap:[...e.typeContainerMap.entries()].map(([n,i])=>[n,[...i]]),identifierLineMap:[...e.identifierLineMap.entries()],rustAttrReferencedNames:[...e.rustAttrReferencedNames],crossLanguageDispatchNames:[...e.crossLanguageDispatchNames]};return JSON.stringify(t)}function ax(e){try{let t=JSON.parse(e),n=new Map(t.identifierLineMap);return{language:t.language,callables:t.callables,callSites:t.callSites,typeContainerMap:new Map(t.typeContainerMap.map(([i,r])=>[i,new Set(r)])),identifierLineMap:n,identifiersByLine:ba(n),fileIdentifiers:new Set(n.keys()),rustAttrReferencedNames:new Set(t.rustAttrReferencedNames),crossLanguageDispatchNames:new Set(t.crossLanguageDispatchNames)}}catch{return null}}function Sa(e,t,n,i){let r=ye(e,t);return r?cx(r,n,i)?.isLiteralPassthrough??!0:!0}function cx(e,t,n){return e.callables.find(i=>i.startLine===t&&i.endLine===n)??null}function lx(e,t){let n=[],i=[],r=new Set,o=new Set,s=new Map,a=(l,u)=>{let d=s.get(l);if(!d){s.set(l,[u]);return}d[d.length-1]!==u&&d.push(u)},c=l=>{let u=yo(l,t);u&&n.push(u);let d=ti(l,t);d&&i.push(d),Ju(l,t,o),t==="rust"&&(l.type==="attribute_item"||l.type==="inner_attribute_item")&&Ku(l.text,r),Wu(l,t)&&a(l.text,l.startPosition.row),zu(l,t)&&Gu(l,a);for(let m of l.children)c(m)};return c(e.rootNode),{language:t,callables:n,callSites:i,typeContainerMap:Qu(e,t),identifierLineMap:s,identifiersByLine:ba(s),fileIdentifiers:new Set(s.keys()),rustAttrReferencedNames:r,crossLanguageDispatchNames:o}}var Xu=new Set(["rust","typescript","tsx","javascript","python"]);function xa(e,t){let n=ye(e,t);return!n||!Xu.has(n.language)?null:n.callables.map(i=>({name:i.name,startLine:i.startLine,endLine:i.endLine}))}function si(e,t){let n=ye(e,t);return!n||!Xu.has(n.language)?null:n.callSites}function Ca(e,t){return ye(e,t)?.typeContainerMap??new Map}import{ElementTypes as ux,NodeTypes as Zu,parse as dx}from"@vue/compiler-dom";import{parse as ZV}from"@vue/compiler-sfc";function bo(e,t){return e.split(t).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}var mx=qt("vue-template-facts"),px=new Set(["component","keep-alive","slot","suspense","teleport","template","transition","transition-group"]),fx=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","menu","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"]),gx=new Set(["div","span","template"]),hx=new Set(["as","await","break","case","catch","class","const","continue","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","if","import","in","instanceof","let","new","null","of","return","super","switch","this","throw","true","try","typeof","undefined","var","void","while","with","yield"]);function ed(e,t){let n=t.replace(/\\/g,"/"),i=F(e,n);return mx.get(e,n,i,()=>yx(n,fo(e,n).template))}function yx(e,t){let n={relativePath:e,template:t?{startLine:t.startLine,endLine:t.endLine}:null,componentTags:[],nativeTags:[],builtinTags:[],props:[],events:[],directives:[],slots:[],expressionIdentifiers:[],structuralTokens:[]};if(!t)return n;let i;try{i=dx(t.body,{comments:!1})}catch{return n}let r=new Set,o=s=>{s.trim()&&r.add(s)};return td(i.children,t.startLine,n,o),n.structuralTokens=[...r].sort(),n}function td(e,t,n,i){for(let r of e)r.type===Zu.ELEMENT&&(bx(r,t,n,i),td(r.children,t,n,i))}function bx(e,t,n,i){let r=Ix(e.tag),o={tag:e.tag,normalized:r,kind:wx(e),startLine:ai(t,e.loc.start.line),endLine:ai(t,e.loc.end.line)};o.kind==="component"?(n.componentTags.push(o),i(`component:${r}`)):o.kind==="builtin"?(n.builtinTags.push(o),i(`builtin:${r}`)):(n.nativeTags.push(o),gx.has(e.tag)||i(`native:${e.tag}`));for(let s of e.props)Sx(s,t,n,i)}function Sx(e,t,n,i){if(e.type===Zu.ATTRIBUTE){let a=e.value?.content??null,c=Yu("prop",e.name,a,t,e.loc.start.line,e.loc.end.line);n.props.push(c),i(`prop:${e.name}`);return}let r=Cx(e),o=nd(e.exp),s=Yu(xx(e.name),r,o,t,e.loc.start.line,e.loc.end.line);switch(s.kind){case"prop":n.props.push(s),i(`prop:${r}`);break;case"event":n.events.push(s),i(`event:${r}`);break;case"slot":n.slots.push(s),i(`slot:${r}`);break;case"directive":n.directives.push(s),i(`directive:${r}`);break}o&&vx(o,t,e.loc.start.line,n,i)}function Yu(e,t,n,i,r,o){return{kind:e,name:t,value:n,startLine:ai(i,r),endLine:ai(i,o)}}function xx(e){switch(e){case"bind":case"model":return"prop";case"on":return"event";case"slot":return"slot";default:return"directive"}}function Cx(e){let t=nd(e.arg);return t||e.name}function nd(e){if(!e)return null;let t=("content"in e&&typeof e.content=="string"?e.content:e.loc.source).trim();return t||null}function vx(e,t,n,i,r){for(let o of Rx(e)){let s={name:o,startLine:ai(t,n),endLine:ai(t,n)};i.expressionIdentifiers.push(s),r(`id:${o}`)}}function Rx(e){let t=new Set,n=kx(e),i=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,r;for(;r=i.exec(n);){let o=r[0];hx.has(o)||/^[A-Z_]+$/.test(o)||t.add(o)}return[...t].sort()}function kx(e){return e.replace(/\/\*[\s\S]*?\*\//g," ").replace(/\/\/.*$/gm," ").replace(/`(?:\\[\s\S]|\$\{([^}]*)\}|[^`\\])*`/g,(t,n)=>n??" ").replace(/'(?:\\[\s\S]|[^'\\])*'/g," ").replace(/"(?:\\[\s\S]|[^"\\])*"/g," ")}function wx(e){let t=e.tag;return e.tagType===ux.COMPONENT?"component":px.has(t)?"builtin":fx.has(t)?"native":/^[A-Z]/.test(t)||t.includes("-")?"component":"native"}function Ix(e){return bo(e,/[-_:]/)}function ai(e,t){return e+Math.max(0,t-1)}import{readdirSync as Lx}from"fs";import{execFileSync as Dx}from"child_process";import{extname as So,join as Px}from"path";var va=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".vue",".rs",".py",".pyi",".java",".kt",".kts",".scala",".sc",".rb",".c",".h",".cc",".cpp",".cxx",".hpp",".hh",".hxx",".cs",".vb",".php",".dart"],id=[".vue"],rd=[".tsx",".jsx"],od=[".vue"],Nx=[...rd,...od],Ex=new Set(rd),Tx=new Set(od),sd=new Set(va.map(e=>e.toLowerCase())),Fx=[...sd].sort().join(","),Ra=new Set(["node_modules",".git","target","dist","build",".next",".nuxt",".cache",".turbo","out","coverage",".scipquery-cache","__pycache__",".venv","venv",".idea",".vscode"]);function $e(e,t={}){let n=t.includeIndexed??!0,i=t.includeAuxiliary??!0,r=t.extensions?.map(c=>c.toLowerCase()),o=r?new Set(r):sd,s=r?[...o].sort().join(","):Fx,a=`${n?"1":"0"}|${i?"1":"0"}|${s}`;return _x.get(e,a,()=>{let c=new Set;if(n)for(let l of B(e,{includeIgnored:!1}))o.has(So(l).toLowerCase())&&c.add(l);if(i)for(let l of Ax(e.config.projectRoot,o))e.isIgnored(l)||n&&c.has(l)||c.add(l);return[...c].sort()})}function xo(e,t={}){let n=!1,i=!1;for(let r of $e(e,{extensions:Nx})){if(t.scope&&!r.includes(t.scope))continue;let o=So(r).toLowerCase();if(n||=Ex.has(o),i||=Tx.has(o),n&&i)break}return{react:n,vue:i}}var _x=U("source-files",{clearGroups:[]});function Ax(e,t){return $x(e,t)??Mx(e,t)}function $x(e,t){try{let n=Dx("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e,encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}),i=new Set;for(let r of n.split(`
|
|
52
|
-
`)
|
|
53
|
-
`).length:0,u=mn(i.template),d=o.lineCount,m=i.styles.reduce((f,g)=>f+mn(g),0),p=i.customBlocks.reduce((f,g)=>f+mn(g),0);return{file:t,sfc:i,templateFacts:r,scriptFacts:o,templateTokens:new Set(r.structuralTokens),behaviorTokens:tC(r,o,a),templateBindingNames:a,templateLocalNames:s,componentNames:c,sfcLines:l,totalLines:l+o.externalLineCount,templateLines:u,scriptLines:d,styleLines:m,externalScriptLines:o.externalLineCount,externalScriptPaths:o.externalScriptPaths,customBlockLines:p}}function Zx(e){let t=eC(e.scriptFacts);return{...e,scriptFacts:t,templateTokens:new Set(e.templateTokens),behaviorTokens:new Set(e.behaviorTokens),templateBindingNames:[...e.templateBindingNames],templateLocalNames:[...e.templateLocalNames],componentNames:[...e.componentNames],externalScriptPaths:t.externalScriptPaths}}function eC(e){return{...e,imports:e.imports.map(t=>({...t})),functions:e.functions.map(t=>({...t})),calls:e.calls.map(t=>({...t,categories:[...t.categories]})),composables:[...e.composables],stores:[...e.stores],reactivity:[...e.reactivity],lifecycle:[...e.lifecycle],requests:[...e.requests],macros:[...e.macros],externalScriptPaths:[...e.externalScriptPaths],unresolvedScripts:e.unresolvedScripts.map(t=>({...t}))}}function tC(e,t,n){let i=new Set;for(let r of t.composables)i.add(`composable:${r}`);for(let r of t.stores)i.add(`store:${r}`);for(let r of t.reactivity)i.add(`reactivity:${r}`);for(let r of t.lifecycle)i.add(`lifecycle:${r}`);for(let r of t.requests)i.add(`request:${r}`);for(let r of t.macros)i.add(`macro:${r}`);for(let r of t.functions){if(Kx.has(r.name))continue;i.add(`function:${r.name}`);let o=/^[a-z]+/.exec(r.name)?.[0]??null;o&&o.length>2&&o!==r.name&&i.add(`function-verb:${o}`)}for(let r of e.events)i.add(`template-event:${r.name}`);for(let r of n)i.add(`template-binding:${r}`);return i}function nC(e){let t=new Set;for(let n of e.directives)if(n.name==="for"&&n.value)for(let i of iC(n.value))t.add(i);for(let n of e.slots)if(n.value)for(let i of ud(n.value))t.add(i);return[...t].sort()}function iC(e){let t=/^(.*?)\s+(?:in|of)\s+/.exec(e.trim());return t?ud(t[1]??""):[]}function ud(e){let t=[];for(let n of e.matchAll(/\b[A-Za-z_$][\w$]*\b/g)){let i=n[0];Jx.has(i)||t.push(i)}return t}import{extname as rC}from"path";function pn(e){return typeof e=="object"&&e!==null}function Me(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}var oC=[".tsx",".jsx"],dd=new Set(["useActionState","useCallback","useContext","useDebugValue","useDeferredValue","useEffect","useId","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useOptimistic","useReducer","useRef","useState","useSyncExternalStore","useTransition"]),sC=new Set(["useEffect","useInsertionEffect","useLayoutEffect"]),aC=new Set(["useActionState","useOptimistic","useReducer","useRef","useState"]),cC=new Set(["useLocation","useNavigate","useParams","useSearchParams","useTranslation"]),lC=new Set(["axios","fetch","gql","graphql","mutate","query","request","useMutation","useQuery","useSuspenseQuery"]),uC=new Set(["add","apply","cancel","change","clear","close","create","delete","fetch","filter","handle","load","open","refresh","remove","render","reset","save","select","submit","toggle","update"]),dC=new Set(["children","className","false","key","null","style","true","undefined"]),mC=new Set(["aria-hidden","className","clipRule","d","fill","fillRule","height","role","stroke","strokeLinecap","strokeLinejoin","strokeWidth","style","viewBox","width","xmlns"]),pC=qt("react-component-behavior-profiles");function ui(e,t={}){let n=$e(e,{extensions:oC}).filter(r=>!t.scope||r.includes(t.scope)).sort();return(typeof t.scanLimit=="number"&&t.scanLimit>0?n.slice(0,t.scanLimit):n).flatMap(r=>fC(e,r)).filter(r=>(t.minJsxTokens===void 0||r.jsxTokens.size>=t.minJsxTokens)&&(t.minBehaviorTokens===void 0||r.behaviorTokens.size>=t.minBehaviorTokens))}function fC(e,t){let n=t.replace(/\\/g,"/"),i=F(e,n);return pC.get(e,n,i,()=>gC(e,n,i)).map(yC)}function gC(e,t,n){let i=Z(e,t,n),r=ae(e,"react-component-behavior-profiles",t,i);if(r){let s=SC(r);if(s)return s}let o=hC(e,t);return ce(e,"react-component-behavior-profiles",t,i,bC(o)),o}function hC(e,t){let n=CC(t);if(!n)return[];let i=ke(e,t);if(!i)return[];let r=Ke(e,t).length;return vC(i.rootNode,n).filter(s=>s.kind==="hook"||hd(s.bodyNode)).map(s=>{let a=LC(s.bodyNode),c=TC(s.bodyNode,n);return{file:t,name:s.name,kind:s.kind,startLine:s.node.startPosition.row,endLine:s.node.endPosition.row,loc:Math.max(1,s.node.endPosition.row-s.node.startPosition.row+1),fileLines:r,jsxTokens:a.tokens,behaviorTokens:c.tokens,componentNames:Et(a.componentNames),nativeTags:Et(a.nativeTags),propNames:Et(a.propNames),eventNames:Et(a.eventNames),hookNames:Et(c.hookNames),requestNames:Et(c.requestNames),stateNames:Et(c.stateNames),effectNames:Et(c.effectNames),handlerNames:Et(c.handlerNames)}})}function yC(e){return{...e,jsxTokens:new Set(e.jsxTokens),behaviorTokens:new Set(e.behaviorTokens),componentNames:[...e.componentNames],nativeTags:[...e.nativeTags],propNames:[...e.propNames],eventNames:[...e.eventNames],hookNames:[...e.hookNames],requestNames:[...e.requestNames],stateNames:[...e.stateNames],effectNames:[...e.effectNames],handlerNames:[...e.handlerNames]}}function bC(e){return JSON.stringify(e.map(t=>({...t,jsxTokens:[...t.jsxTokens],behaviorTokens:[...t.behaviorTokens]})))}function SC(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=[];for(let i of t){let r=xC(i);if(!r)return null;n.push(r)}return n}catch{return null}}function xC(e){if(!pn(e))return null;let{file:t,name:n,kind:i,startLine:r,endLine:o,loc:s,fileLines:a,jsxTokens:c,behaviorTokens:l,componentNames:u,nativeTags:d,propNames:m,eventNames:p,hookNames:f,requestNames:g,stateNames:y,effectNames:S,handlerNames:R}=e;if(typeof t!="string"||typeof n!="string"||i!=="component"&&i!=="hook"||!vo(r)||!vo(o)||!vo(s)||!vo(a))return null;let k={jsxTokens:Me(c),behaviorTokens:Me(l),componentNames:Me(u),nativeTags:Me(d),propNames:Me(m),eventNames:Me(p),hookNames:Me(f),requestNames:Me(g),stateNames:Me(y),effectNames:Me(S),handlerNames:Me(R)};return Object.values(k).some(x=>x===null)?null:{file:t,name:n,kind:i,startLine:r,endLine:o,loc:s,fileLines:a,jsxTokens:new Set(k.jsxTokens),behaviorTokens:new Set(k.behaviorTokens),componentNames:k.componentNames,nativeTags:k.nativeTags,propNames:k.propNames,eventNames:k.eventNames,hookNames:k.hookNames,requestNames:k.requestNames,stateNames:k.stateNames,effectNames:k.effectNames,handlerNames:k.handlerNames}}function vo(e){return typeof e=="number"&&Number.isFinite(e)}function CC(e){let t=rC(e).toLowerCase();return t!==".tsx"&&t!==".jsx"?null:K(e)}function vC(e,t){let n=[],i=new Set,r=o=>{let s=RC(o);if(s&&!wC(o)){let a=`${s.name}:${s.node.startIndex}:${s.node.endIndex}`;i.has(a)||(i.add(a),n.push(s));return}for(let a of o.namedChildren)r(a)};return(t==="tsx"||t==="javascript")&&r(e),n}function RC(e){if(e.type==="function_declaration"){let o=gd(e);return!o||!md(o)?null:{name:o,kind:pd(o),node:e,bodyNode:e}}if(e.type!=="variable_declarator")return null;let t=e.childForFieldName("name")??e.namedChild(0),n=e.childForFieldName("value")??e.namedChild(1),i=nr(t);if(!i||!n||!md(i))return null;let r=kC(n);return r?{name:i,kind:pd(i),node:e,bodyNode:r}:null}function md(e){return/^[A-Z]/.test(e)||/^use[A-Z0-9_]/.test(e)}function pd(e){return/^use[A-Z0-9_]/.test(e)?"hook":"component"}function kC(e){if(e.type==="arrow_function"||e.type==="function_expression")return e;if(e.type!=="call_expression")return null;let t=IC(e);return t!=="memo"&&t!=="forwardRef"?null:e.namedChildren.find(r=>r.type==="arguments")?.namedChildren.find(r=>r.type==="arrow_function"||r.type==="function_expression")??null}function wC(e){let t=e.parent;for(;t;){if(t.type==="function_declaration"||t.type==="function_expression"||t.type==="arrow_function"||t.type==="method_definition")return!0;t=t.parent}return!1}function gd(e){return nr(e.childForFieldName("name")??e.namedChild(0))}function IC(e){let t=e.childForFieldName("function")??e.namedChild(0);return t?t.text.split(".").pop()??t.text:null}function hd(e){return e.type.startsWith("jsx_")?!0:e.namedChildren.some(hd)}function LC(e){let t={tokens:new Set,componentNames:new Set,nativeTags:new Set,propNames:new Set,eventNames:new Set},n=i=>{i.type==="jsx_opening_element"||i.type==="jsx_self_closing_element"?DC(i,t):i.type==="jsx_expression"?PC(i,t):i.type==="jsx_fragment"&&t.tokens.add("jsx:fragment");for(let r of i.namedChildren)n(r)};return n(e),t}function DC(e,t){let n=NC(e),i=!1;if(n){let r=fd(n);i=MC(r),i?(t.componentNames.add(r),t.tokens.add(`component:${r}`)):(t.nativeTags.add(r),t.tokens.add(`native:${r}`))}for(let r of e.namedChildren)if(r.type==="jsx_attribute"){let o=EC(r);if(!o)continue;let s=fd(o);if(s.startsWith("on")&&s.length>2){let a=s.slice(2).replace(/^[A-Z]/,c=>c.toLowerCase());t.eventNames.add(a),t.tokens.add(`event:${a}`)}else mC.has(s)||(t.propNames.add(s),t.tokens.add(`${i?"prop":"native-prop"}:${s}`))}else r.type==="jsx_spread_attribute"&&t.tokens.add("prop:spread")}function PC(e,t){let n=e.text;(n.includes("&&")||n.includes("?"))&&t.tokens.add("jsx:conditional"),(n.includes(".map(")||n.includes(".flatMap("))&&t.tokens.add("jsx:list");for(let i of OC(n))dC.has(i)||t.tokens.add(`binding:${i}`)}function NC(e){for(let t of e.namedChildren)if(t.type==="identifier"||t.type==="jsx_identifier"||t.type==="property_identifier"||t.type==="member_expression"||t.type==="jsx_member_expression")return t.text;return/^<\s*([A-Za-z][\w$.]*)/.exec(e.text)?.[1]??null}function EC(e){for(let t of e.namedChildren)if(t.type==="property_identifier"||t.type==="identifier"||t.type==="jsx_identifier")return t.text;return/^([A-Za-z_$][\w$:-]*)/.exec(e.text)?.[1]??null}function TC(e,t){let n={tokens:new Set,hookNames:new Set,requestNames:new Set,stateNames:new Set,effectNames:new Set,handlerNames:new Set},i=r=>{if(r.type==="call_expression"){let o=ti(r,t);o&&FC(o.calleeLeaf,n)}else if(r.type==="variable_declarator")AC(r,n);else if(r.type==="function_declaration"){let o=gd(r);o&&yd(o,n)}for(let o of r.namedChildren)i(o)};return i(e),n}function FC(e,t){/^use[A-Z0-9_]/.test(e)&&(t.hookNames.add(e),!dd.has(e)&&!cC.has(e)&&t.tokens.add(`hook:${e}`)),dd.has(e)&&t.tokens.add(`react-hook:${e}`),sC.has(e)&&(t.effectNames.add(e),t.tokens.add(`effect:${e}`)),aC.has(e)&&t.tokens.add(`state-hook:${e}`),_C(e)&&(t.requestNames.add(e),t.tokens.add(`request:${e}`))}function _C(e){if(lC.has(e))return!0;let t=/^use([A-Z0-9_].*)$/.exec(e)?.[1];return t?/(Query|Mutation|Fetch|Resource)$/.test(t):!1}function AC(e,t){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);if(n?.type==="array_pattern"&&i?.text.includes("useState")){let o=n.namedChildren.find(a=>nr(a)),s=nr(o);s&&(t.stateNames.add(s),t.tokens.add(`state:${s}`))}let r=nr(n);r&&yd(r,t)}function yd(e,t){let n=$C(e);!n||!uC.has(n)||(t.handlerNames.add(e),t.tokens.add(`handler:${e}`),t.tokens.add(`handler-verb:${n}`))}function $C(e){let t=e.startsWith("handle")&&e.length>6?e.slice(6).replace(/^[A-Z]/,n=>n.toLowerCase()):e;return/^[a-z]+/.exec(t)?.[0]??null}function MC(e){return/^[A-Z]/.test(e)||e.includes(".")}function fd(e){return e.replace(/^this\./,"").replace(/\$/g,".")}function nr(e){return e&&(e.type==="identifier"||e.type==="property_identifier"||e.type==="shorthand_property_identifier"||/^[A-Za-z_$][\w$]*$/.test(e.text))?e.text:null}function OC(e){let t=[];for(let n of e.matchAll(/\b[A-Za-z_$][\w$]*\b/g)){let i=n[0];t.includes(i)||t.push(i)}return t}function Et(e){return[...e].sort()}function fn(e,t,n={}){let i=ye(e,t);if(!i)return[];let r=[];if(n.includeCrossLanguageDispatchNames)for(let o of i.crossLanguageDispatchNames)r.push({name:o,kind:"cross-language-dispatch",occurrences:1});if(n.includeRustAttributeNames&&i.language==="rust")for(let o of i.rustAttrReferencedNames)r.push({name:o,kind:"rust-attribute",occurrences:1});return r}var jC={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function we(e){if(e.startsWith("local "))return{kind:"local",id:e.slice(6),raw:e};let t=e.split(" ");if(t.length<4)return{scheme:t[0]??"",manager:t[1]??"",packageName:t[2]??"",version:"",descriptors:[],raw:e};let n=t[0],i=t[1],r=e.slice(n.length+1+i.length+1),o;if(r.startsWith("`")){let l=r.indexOf("`",1);l===-1?(o=r.slice(1),r=""):(o=r.slice(1,l),r=r.slice(l+2))}else{let l=r.indexOf(" ");l===-1?(o=r,r=""):(o=r.slice(0,l),r=r.slice(l+1))}let s,a=r.indexOf(" ");a===-1?(s=r,r=""):(s=r.slice(0,a),r=r.slice(a+1));let c=BC(r);return{scheme:n,manager:i,packageName:o,version:s,descriptors:c,raw:e}}function yt(e){let t=we(e);if("kind"in t)return null;for(let n=t.descriptors.length-2;n>=0;n--){let i=t.descriptors[n];if(i?.suffix==="type")return i.name}return null}function BC(e){let t=[],n=0;for(;n<e.length;){if(e[n]==="["){let o=e.indexOf("]",n+1);if(o===-1){t.push({name:e.slice(n+1),suffix:"type-param"});break}t.push({name:e.slice(n+1,o),suffix:"type-param"}),n=o+1;continue}if(e[n]==="("&&(t.length===0||n===0||bd(e[n-1]))){let o=e.indexOf(")",n+1);if(o!==-1&&e[o+1]!=="."){t.push({name:e.slice(n+1,o),suffix:"parameter"}),n=o+1;continue}}let i;if(e[n]==="`"){let o=e.indexOf("`",n+1);if(o===-1){i=e.slice(n+1),t.push({name:i,suffix:"term"});break}i=e.slice(n+1,o),n=o+1}else{let o=n;for(;n<e.length&&!bd(e[n]);)n++;i=e.slice(o,n)}if(n>=e.length){i&&t.push({name:i,suffix:"term"});break}let r=e[n];if(r==="("){let o=e.indexOf(")",n+1);o!==-1&&e[o+1]==="."?(t.push({name:i,suffix:"method"}),n=o+2):o!==-1?(t.push({name:i,suffix:"method"}),n=o+1):(t.push({name:i,suffix:"term"}),n++)}else{let o=jC[r];o&&t.push({name:i,suffix:o}),n+=1}}return t}function bd(e){return e==="/"||e==="#"||e==="."||e==="("||e==="["||e===":"||e==="!"}function v(e){let t=we(e);if("kind"in t&&t.kind==="local")return`local:${t.id}`;let n=t;if(n.descriptors.length===0)return n.raw;let i=[];for(let r of n.descriptors){let o=HC(r);o&&i.push(o)}return i.join(":")}function HC(e){let t=e.suffix==="namespace"?VC(e.name):e.name;return t?e.suffix==="method"?`${t}()`:t:""}function VC(e){return e.replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/,"").replace(/\.(py|pyi)$/,"").replace(/\.(rs)$/,"").replace(/\.(java|scala|kt|kts)$/,"").replace(/\.(rb)$/,"").replace(/\.(go)$/,"").replace(/\.(cs|vb)$/,"").replace(/\.(dart)$/,"").replace(/\.(php)$/,"").replace(/\.(c|cc|cpp|cxx|h|hpp)$/,"")}function M(e){let t=we(e);if("kind"in t&&t.kind==="local")return t.id;let n=t;return n.descriptors.length===0?"":n.descriptors[n.descriptors.length-1].name}function ee(e){let t=we(e);if("kind"in t&&t.kind==="local")return null;let n=t;return n.descriptors[n.descriptors.length-1]?.suffix??null}function le(e){return e.endsWith("().")||ee(e)==="method"}function ue(e){let t=ee(e);return t==="method"||t==="term"}function Ut(e){return ee(e)==="namespace"}var qC=/^rust-analyzer\b.*[\s/]impl#\[[^\]]+\]\[[^\]]+\]/;function Ro(e){return qC.test(e)}var UC=new Set(["test","tests","_tests"]);function di(e){let t=we(e);if("kind"in t)return!1;for(let n=0;n<t.descriptors.length-1;n+=1){let i=t.descriptors[n];if(i?.suffix==="namespace"&&i.name&&UC.has(i.name))return!0}return!1}function Sd(e,t){let n=we(e),i=we(t);if("kind"in n||"kind"in i)return!1;let r=n.descriptors,o=i.descriptors;if(o.length!==r.length+1)return!1;for(let s=0;s<r.length;s++){let a=r[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function xd(e,t){let n=we(e),i=we(t);if("kind"in n||"kind"in i)return!1;let r=n.descriptors,o=i.descriptors;if(o.length<=r.length)return!1;for(let s=0;s<r.length;s++){let a=r[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function mi(e,t){return e.all(`SELECT gs.id, gs.symbol, der.document_id, der.start_line, der.end_line, d.relative_path, gs.display_name, gs.documentation
|
|
62
|
+
(relative_path, symbol, project_fingerprint, version, payload) VALUES (?, ?, ?, ?, ?)`),dropStaleReferences:n.prepare("DELETE FROM semantic_references WHERE project_fingerprint != ?")}}catch(n){Ba("disabled (open failed)",n)}return Eo.set(e,t),t}function ln(e,t,n){Ba(`disabled (${t})`,n),Eo.set(e,null)}function xd(e,t,n,i){let r=cn(e);if(!r)return null;try{return(r.readFileEvidence.get(t,n,i,an)??r.readLegacyFileEvidence.get(t,n,i))?.payload??null}catch(o){return ln(e,"file_evidence read",o),null}}function Cd(e,t,n,i,r){let o=cn(e);if(o)try{o.writeFileEvidence.run(t,n,i,an,r)}catch(s){ln(e,"file_evidence write",s)}}function vd(e,t,n,i){let r=cn(e);if(!r)return null;try{return(r.readProjectEvidence.get(t,n,i,an)??r.readLegacyProjectEvidence.get(t,n,i))?.payload??null}catch(o){return ln(e,"project_evidence read",o),null}}function Rd(e,t,n,i,r){let o=cn(e);if(o)try{o.writeProjectEvidence.run(t,n,i,an,r)}catch(s){ln(e,"project_evidence write",s)}}function kd(e,t,n,i,r){let o=cn(e);if(!o)return null;try{return(o.readCallees.get(t,n,i,r,an)??o.readLegacyCallees.get(t,n,i,r))?.payload??null}catch(s){return ln(e,"semantic_callees read",s),null}}function wd(e,t,n,i){let r=cn(e);if(!r)return null;try{return(r.readReferences.get(t,n,i,an)??r.readLegacyReferences.get(t,n,i))?.payload??null}catch(o){return ln(e,"semantic_references read",o),null}}function Pd(e,t){if(t.length===0)return;let n=cn(e);if(n)try{n.evidence.transaction(()=>{let i=new Set;for(let r of t){let o=`${r.relativePath}\0${r.contentHash}`;i.has(o)||(i.add(o),n.dropStaleCallees.run(r.relativePath,r.contentHash)),n.writeCallees.run(r.relativePath,r.symbol,r.contentHash,r.depsDigest,an,r.payload)}})()}catch(i){ln(e,"semantic_callees write",i)}}function Id(e,t){if(t.length===0)return;let n=cn(e);if(n)try{n.evidence.transaction(()=>{let i=new Set;for(let r of t)i.has(r.projectFingerprint)||(i.add(r.projectFingerprint),n.dropStaleReferences.run(r.projectFingerprint)),n.writeReferences.run(r.relativePath,r.symbol,r.projectFingerprint,an,r.payload)})()}catch(i){ln(e,"semantic_references write",i)}}function pe(e){return{kind:e.kind,read(t,n,i){let r=xd(t,e.kind,n,i);if(r===null)return null;try{return e.deserialize(r)}catch{return null}},write(t,n,i,r){Cd(t,e.kind,n,i,e.serialize(r))}}}function Ld(e){return{kind:e.kind,read(t,n,i){let r=vd(t,e.kind,n,i);if(r===null)return null;try{return e.deserialize(r)}catch{return null}},write(t,n,i,r){Rd(t,e.kind,n,i,e.serialize(r))}}}function pr(e){return e.type==="comment"||e.type==="line_comment"||e.type==="block_comment"}var uC=new Set(["function_declaration","method_definition","method_signature","function_signature"]);function No(e,t){let n=mC(e,t);if(n)return{name:n.name,startLine:n.definitionNode.startPosition.row,endLine:n.definitionNode.endPosition.row,paramCount:Nd(n.functionNode),params:Dd(n.functionNode),paramsEndLine:Ed(n.functionNode),isLiteralPassthrough:Fd(n.functionNode,t)};if(!dC(e.type,t))return null;let i=e.childForFieldName("name")??e.namedChildren.find(r=>r.type==="identifier"||r.type==="property_identifier");return i?{name:i.text,startLine:e.startPosition.row,endLine:e.endPosition.row,paramCount:Nd(e),params:Dd(e),paramsEndLine:Ed(e),isLiteralPassthrough:Fd(e,t)}:null}function Td(e){return e.namedChildren.find(t=>t.type==="parameters"||t.type==="formal_parameters")}function Dd(e){let t=Td(e);if(!t)return[];let n=[];for(let i of t.namedChildren){if(pr(i))continue;if(i.type==="identifier"){n.push({name:i.text,simple:!0});continue}let r=i.namedChildren.some(a=>a.type.endsWith("_modifier"))||/^\s*(?:public|private|protected|readonly|override)\b/.test(i.text),o=i.childForFieldName("pattern");if(!r&&o&&o.type==="identifier"){n.push({name:o.text,simple:!0});continue}let s=i.namedChildren.find(a=>a.type==="identifier");n.push({name:o?.type==="identifier"?o.text:s?.text??"",simple:!1})}return n}function Ed(e){let t=Td(e);return t?t.endPosition.row:e.startPosition.row}function dC(e,t){return t==="rust"?e==="function_item"||e==="function_signature_item":t==="python"?e==="function_definition":t==="typescript"||t==="tsx"||t==="javascript"?uC.has(e):!1}function mC(e,t){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript")return null;if(e.type==="variable_declarator"){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);return!n||!i||i.type!=="arrow_function"&&i.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:i}}if(e.type==="public_field_definition"){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);return!n||!i||i.type!=="arrow_function"&&i.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:i}}return null}function Nd(e){let t=e.namedChildren.find(i=>i.type==="parameters"||i.type==="formal_parameters");if(!t)return 0;let n=0;for(let i of t.namedChildren)pr(i)||(n+=1);return n}function Fd(e,t){let n=e.namedChildren.find(u=>u.type==="block"||u.type==="statement_block");if(!n)return!1;let i=n.namedChildren.filter(u=>!pr(u));if(i.length!==1)return!1;let r=i[0],o=null;if(r.type==="return_statement"||r.type==="expression_statement"?o=r.namedChild(0)??null:t==="rust"&&(r.type==="call_expression"||r.type==="macro_invocation")&&(o=r),!o)return!1;let s=t==="python"?"call":"call_expression";if(o.type!==s)return!1;let a=o.namedChildren.find(u=>u.type==="arguments"||u.type==="argument_list");if(!a)return!1;let c=a.namedChildren.filter(u=>!pr(u)),l=e.namedChildren.find(u=>u.type==="parameters"||u.type==="formal_parameters");if(!l)return!1;let d=[];for(let u of l.namedChildren){if(u.type==="identifier"){d.push(u.text);continue}let m=u.namedChildren.find(p=>p.type==="identifier");m&&d.push(m.text)}if(c.length!==d.length)return!1;for(let u=0;u<d.length;u+=1){let m=c[u];if(m.type!=="identifier"||m.text!==d[u])return!1}return!0}var pC=new Set(["identifier","type_identifier","field_identifier"]),fC=new Set(["identifier"]),gC=new Set(["identifier","property_identifier","type_identifier","shorthand_property_identifier","shorthand_property_identifier_pattern"]),hC=new Set(["rust","python"]),yC=/\{([^{}]*)\}/g,bC=/\b([A-Za-z_][\w]*)\b/g;function _d(e,t){return SC(t).has(e.type)}function Ad(e,t){return hC.has(t)&&e.type==="string_content"}function Ha(e){let t=0;for(let i of e.values()){let r=i[i.length-1];r!==void 0&&r>t&&(t=r)}let n=new Array(t+1);for(let i=0;i<=t;i+=1)n[i]=new Set;for(let[i,r]of e)for(let o of r)n[o].add(i);return n}function SC(e){return e==="rust"?pC:e==="python"?fC:gC}function Md(e,t){let n=e.startPosition.row;for(let i of e.text.matchAll(yC)){let r=i[1]??"";for(let o of r.matchAll(bC))o[1]&&t(o[1],n)}}var xC=[/\bdefault\s*=\s*"([^"]+)"/g,/\bwith\s*=\s*"([^"]+)"/g,/\bserialize_with\s*=\s*"([^"]+)"/g,/\bdeserialize_with\s*=\s*"([^"]+)"/g,/\bskip_serializing_if\s*=\s*"([^"]+)"/g,/\bgetter\s*=\s*"([^"]+)"/g,/\brename_all_with\s*=\s*"([^"]+)"/g,/\bschema_with\s*=\s*"([^"]+)"/g],CC=/^#!?\[\s*serde\s*\(/,vC=/^#!?\[\s*schemars\s*\(/,RC=/^#!?\[\s*validate\s*\(/,kC=new Set(["invoke","invokeTauriCommand","listen","once","emit","subscribe","dispatch","sendCommand","callRust"]);function $d(e,t,n){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript"||e.type!=="call_expression")return;let i=e.childForFieldName("function")??e.namedChild(0);if(!i)return;let r=bi(i);if(!r||!kC.has(r))return;let o=e.namedChildren.find(c=>c.type==="arguments");if(!o)return;let s=o.namedChild(0);if(!s||s.type!=="string")return;let a=s.namedChildren.find(c=>c.type==="string_fragment");a&&n.add(a.text)}function jd(e,t){let n=CC.test(e),i=vC.test(e),r=RC.test(e);if(!(!n&&!i&&!r))for(let o of xC){o.lastIndex=0;let s;for(;(s=o.exec(e))!==null;){let a=s[1],c=a.split("::").pop()??a;c==="is_none"&&/\bOption\b/.test(a)||c==="is_empty"&&/\b(String|Vec|HashMap|BTreeMap|HashSet|BTreeSet)\b/.test(a)||c&&t.add(c)}}}function Od(e,t){let n=new Map,i=(s,a)=>{if(s===a)return;let c=n.get(s);c||(c=new Set,n.set(s,c)),c.add(a)},r=t==="python"?new Set(["identifier"]):new Set(["type_identifier"]),o=(s,a)=>{let c=l=>{r.has(l.type)&&l.text!==a&&i(l.text,a);for(let d of l.children)c(d)};for(let l of s.children)c(l)};if(t==="rust")for(let s of e.rootNode.descendantsOfType(["struct_item","enum_item","union_item","type_item"])){let a=s.namedChildren.find(l=>l.type==="type_identifier")?.text;if(!a)continue;let c=s.namedChildren.find(l=>l.type==="field_declaration_list"||l.type==="enum_variant_list"||l.type==="ordered_field_declaration_list");c&&o(c,a),s.type==="type_item"&&o(s,a)}else if(t==="python")for(let s of e.rootNode.descendantsOfType("class_definition")){let a=s.namedChildren.find(l=>l.type==="identifier")?.text;if(!a)continue;let c=s.namedChildren.find(l=>l.type==="block");if(c)for(let l of c.descendantsOfType("type"))for(let d of l.descendantsOfType("identifier"))d.text!==a&&i(d.text,a)}else for(let s of e.rootNode.descendantsOfType(["interface_declaration","type_alias_declaration","class_declaration"])){let a=s.namedChildren.find(c=>c.type==="type_identifier")?.text;a&&o(s,a)}return n}var wC=new Map([["defn","function"],["defn-","function"],["defmacro","macro"],["defmacro-","macro"],["defmethod","method"]]),Va=new Set(["catch","comment","def","defprotocol","defrecord","deftype","defmethod","defmacro","defmacro-","defn","defn-","do","doseq","dotimes","fn","for","if","let","loop","ns","quote","recur","throw","try","extend-protocol","extend-type","when","when-let","when-not"]);function Bd(e){let t=[],n=[],i=[],r=new Map,o=[],s=0,a=0,c=(l,d)=>{let u=r.get(l);if(!u){r.set(l,[d]);return}u[u.length-1]!==d&&u.push(d)};for(;a<e.length;){let l=e[a];if(l===`
|
|
63
|
+
`){s+=1,a+=1;continue}if(/\s|,/.test(l)){a+=1;continue}if(l===";"){a=FC(e,a);continue}if(l==='"'){let f=TC(e,a,s);s=f.line,a=f.index;continue}if(l==="("||l==="["||l==="{"){o.push({kind:l,startLine:s,endLine:s,headTokens:[],tokens:[],children:[]}),a+=1;continue}if(l===")"||l==="]"||l==="}"){let f=o.pop();f&&(f.endLine=s,PC(f,{callables:t,callSites:n,clojureMembers:i,recordIdentifier:c}),o[o.length-1]?.children.push(f)),a+=1;continue}if(_C(l)){a+=1;continue}let d=s,u=a;for(;a<e.length&&!AC(e[a]);)a+=1;let m=e.slice(u,a);if(!m)continue;let p={text:m,line:d};IC(o[o.length-1],p),c(Ze(m),d)}return{language:"clojure",callables:t,callSites:n,clojureMembers:i,typeContainerMap:new Map,identifierLineMap:r,identifiersByLine:MC(r),fileIdentifiers:new Set(r.keys()),rustAttrReferencedNames:new Set,crossLanguageDispatchNames:new Set}}function PC(e,t){if(e.kind!=="("||e.headTokens.length===0)return;let n=e.headTokens[0],i=Ze(n.text),r=wC.get(n.text);if(r){let s=e.headTokens[1];if(s){let a=Ze(s.text);t.recordIdentifier(a,s.line),t.callables.push({name:a,startLine:e.startLine,endLine:e.endLine,paramCount:0,params:[],paramsEndLine:s.line,isLiteralPassthrough:!1,clojureKind:r})}}if(LC(e,t),!i||Va.has(n.text)||Va.has(i)||i.startsWith(":"))return;let o=NC(n.text);t.callSites.push({calleeLeaf:o.leaf,calleeQualifier:o.qualifier,calleeText:o.text,memberAccess:!1,line:n.line})}function IC(e,t){e&&(e.headTokens.length<2&&e.headTokens.push(t),e.tokens.length<200&&e.tokens.push(t))}function LC(e,t){let n=Ze(e.tokens[0]?.text??"");if(n==="defprotocol"){let i=Ze(e.tokens[1]?.text??"");if(!i)return;for(let r of Fo(e))fr(t,i,"protocol",r,"protocol-method");return}if(n==="defrecord"||n==="deftype"){let i=Ze(e.tokens[1]?.text??"");if(!i)return;let r=n==="defrecord"?"record":"type",o=n==="defrecord"?"record-method":"type-method";for(let s of Fo(e))fr(t,i,r,s,o);return}if(n==="extend-type"){let i=Ze(e.tokens[1]?.text??"");if(!i)return;for(let r of Fo(e))fr(t,i,"extension",r,"extension-method");return}if(n==="extend-protocol"){let i=Ze(e.tokens[1]?.text??"");for(let r of Fo(e)){i&&fr(t,i,"extension",r,"extension-method");let o=EC(e,r.startLine);o&&o!==i&&fr(t,o,"extension",r,"extension-method")}}}function Fo(e){return e.children.filter(DC)}function DC(e){if(e.kind!=="(")return!1;let t=Ze(e.tokens[0]?.text??"");return!!(t&&!Va.has(t)&&!t.startsWith(":"))}function fr(e,t,n,i,r){let o=i.tokens[0],s=Ze(o?.text??"");!o||!s||(e.recordIdentifier(s,o.line),e.clojureMembers.push({ownerName:t,ownerKind:n,memberName:s,memberKind:r,startLine:i.startLine,endLine:i.endLine}))}function EC(e,t){let n=null;for(let i=2;i<e.tokens.length;i+=1){let r=e.tokens[i];if(r.line>t)break;let o=Ze(r.text);o&&!o.startsWith(":")&&(n=o)}return n}function Ze(e){return e.replace(/^#?['`~@]+/,"").split("/").pop()?.replace(/^\./,"")??""}function NC(e){let t=e.replace(/^#?['`~@]+/,""),n=t.lastIndexOf("/"),i=Ze(t);if(n<=0)return{leaf:i,text:t};let r=t.slice(0,n);return{leaf:i,qualifier:r,text:t}}function FC(e,t){let n=t;for(;n<e.length&&e[n]!==`
|
|
64
|
+
`;)n+=1;return n}function TC(e,t,n){let i=t+1,r=n;for(;i<e.length;){let o=e[i];if(o==="\\"){i+=2;continue}if(o===`
|
|
65
|
+
`&&(r+=1),i+=1,o==='"')break}return{index:i,line:r}}function _C(e){return e==="'"||e==="`"||e==="~"||e==="@"||e==="^"||e==="#"}function AC(e){return/\s|,/.test(e)||e==="("||e===")"||e==="["||e==="]"||e==="{"||e==="}"}function MC(e){let t=[];for(let[n,i]of e)for(let r of i)t[r]??=new Set,t[r].add(n);return t}var $C=wn("source-facts",{clearGroups:["whole-project","source-file"]}),qa=pe({kind:"source-facts",serialize:BC,deserialize:HC});function X(e,t){let n=M(e,t);if(!n)return null;let i=jC(t,n);return i?$C.get(e,t,n,()=>OC(e,t,i,n)):null}function jC(e,t){return Ht(e)?Lo(t)?.language??null:H(e)}function OC(e,t,n,i){let r=re(e,t,i),o=qa.read(e,t,r);if(o&&o.language===n)return o;if(n==="clojure"){let c=Bd(i);return qa.write(e,t,r,c),c}let s=Pe(e,t);if(!s)return null;let a=qC(s,n);return qa.write(e,t,r,a),a}function BC(e){let t={language:e.language,callables:e.callables,callSites:e.callSites,clojureMembers:e.clojureMembers,typeContainerMap:[...e.typeContainerMap.entries()].map(([n,i])=>[n,[...i]]),identifierLineMap:[...e.identifierLineMap.entries()],rustAttrReferencedNames:[...e.rustAttrReferencedNames],crossLanguageDispatchNames:[...e.crossLanguageDispatchNames]};return JSON.stringify(t)}function HC(e){try{let t=JSON.parse(e);if(t.language==="clojure"&&(t.clojureMembers===void 0||t.callSites.some(i=>i.calleeText===void 0)))return null;let n=new Map(t.identifierLineMap);return{language:t.language,callables:t.callables,callSites:t.callSites,clojureMembers:t.clojureMembers??[],typeContainerMap:new Map(t.typeContainerMap.map(([i,r])=>[i,new Set(r)])),identifierLineMap:n,identifiersByLine:Ha(n),fileIdentifiers:new Set(n.keys()),rustAttrReferencedNames:new Set(t.rustAttrReferencedNames),crossLanguageDispatchNames:new Set(t.crossLanguageDispatchNames)}}catch{return null}}function Ua(e,t,n,i){let r=X(e,t);return r?VC(r,n,i)?.isLiteralPassthrough??!0:!0}function Ln(e,t){return t.relativePath.includes(".clj-kondo/hooks/")?!0:X(e,t.relativePath)?.callables.find(i=>i.startLine===t.startLine&&i.endLine===t.endLine)?.clojureKind==="macro"}function VC(e,t,n){return e.callables.find(i=>i.startLine===t&&i.endLine===n)??null}function qC(e,t){let n=[],i=[],r=new Set,o=new Set,s=new Map,a=(l,d)=>{let u=s.get(l);if(!u){s.set(l,[d]);return}u[u.length-1]!==d&&u.push(d)},c=l=>{let d=No(l,t);d&&n.push(d);let u=Si(l,t);u&&i.push(u),$d(l,t,o),t==="rust"&&(l.type==="attribute_item"||l.type==="inner_attribute_item")&&jd(l.text,r),_d(l,t)&&a(l.text,l.startPosition.row),Ad(l,t)&&Md(l,a);for(let m of l.children)c(m)};return c(e.rootNode),{language:t,callables:n,callSites:i,clojureMembers:[],typeContainerMap:Od(e,t),identifierLineMap:s,identifiersByLine:Ha(s),fileIdentifiers:new Set(s.keys()),rustAttrReferencedNames:r,crossLanguageDispatchNames:o}}var Hd=new Set(["rust","typescript","tsx","javascript","python","clojure"]);function za(e,t){let n=X(e,t);return!n||!Hd.has(n.language)?null:n.callables.map(i=>({name:i.name,startLine:i.startLine,endLine:i.endLine}))}function xi(e,t){let n=X(e,t);return!n||!Hd.has(n.language)?null:n.callSites}function Wa(e,t){return X(e,t)?.typeContainerMap??new Map}import{ElementTypes as UC,NodeTypes as qd,parse as zC}from"@vue/compiler-dom";import{parse as Jz}from"@vue/compiler-sfc";function To(e,t){return e.split(t).filter(Boolean).map(n=>n.charAt(0).toUpperCase()+n.slice(1)).join("")}var WC=sn("vue-template-facts"),GC=new Set(["component","keep-alive","slot","suspense","teleport","template","transition","transition-group"]),KC=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","menu","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"]),JC=new Set(["div","span","template"]),XC=new Set(["as","await","break","case","catch","class","const","continue","debugger","default","delete","do","else","export","extends","false","finally","for","from","function","if","import","in","instanceof","let","new","null","of","return","super","switch","this","throw","true","try","typeof","undefined","var","void","while","with","yield"]);function _o(e,t){let n=t.replace(/\\/g,"/"),i=M(e,n);return WC.get(e,n,i,()=>QC(n,yi(e,n).template))}function QC(e,t){let n={relativePath:e,template:t?{startLine:t.startLine,endLine:t.endLine}:null,componentTags:[],nativeTags:[],builtinTags:[],props:[],events:[],directives:[],slots:[],expressionIdentifiers:[],structuralTokens:[]};if(!t)return n;let i;try{i=zC(t.body,{comments:!1})}catch{return n}let r=new Set,o=s=>{s.trim()&&r.add(s)};return Ud(i.children,t.startLine,n,o),n.structuralTokens=[...r].sort(),n}function Ud(e,t,n,i){for(let r of e)r.type===qd.ELEMENT&&(YC(r,t,n,i),Ud(r.children,t,n,i))}function YC(e,t,n,i){let r=sv(e.tag),o={tag:e.tag,normalized:r,kind:ov(e),startLine:Ci(t,e.loc.start.line),endLine:Ci(t,e.loc.end.line)};o.kind==="component"?(n.componentTags.push(o),i(`component:${r}`)):o.kind==="builtin"?(n.builtinTags.push(o),i(`builtin:${r}`)):(n.nativeTags.push(o),JC.has(e.tag)||i(`native:${e.tag}`));for(let s of e.props)ZC(s,t,n,i)}function ZC(e,t,n,i){if(e.type===qd.ATTRIBUTE){let a=e.value?.content??null,c=Vd("prop",e.name,a,t,e.loc.start.line,e.loc.end.line);n.props.push(c),i(`prop:${e.name}`);return}let r=tv(e),o=zd(e.exp),s=Vd(ev(e.name),r,o,t,e.loc.start.line,e.loc.end.line);switch(s.kind){case"prop":n.props.push(s),i(`prop:${r}`);break;case"event":n.events.push(s),i(`event:${r}`);break;case"slot":n.slots.push(s),i(`slot:${r}`);break;case"directive":n.directives.push(s),i(`directive:${r}`);break}o&&nv(o,t,e.loc.start.line,n,i)}function Vd(e,t,n,i,r,o){return{kind:e,name:t,value:n,startLine:Ci(i,r),endLine:Ci(i,o)}}function ev(e){switch(e){case"bind":case"model":return"prop";case"on":return"event";case"slot":return"slot";default:return"directive"}}function tv(e){let t=zd(e.arg);return t||e.name}function zd(e){if(!e)return null;let t=("content"in e&&typeof e.content=="string"?e.content:e.loc.source).trim();return t||null}function nv(e,t,n,i,r){for(let o of iv(e)){let s={name:o,startLine:Ci(t,n),endLine:Ci(t,n)};i.expressionIdentifiers.push(s),r(`id:${o}`)}}function iv(e){let t=new Set,n=rv(e),i=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,r;for(;r=i.exec(n);){let o=r[0];XC.has(o)||/^[A-Z_]+$/.test(o)||t.add(o)}return[...t].sort()}function rv(e){return e.replace(/\/\*[\s\S]*?\*\//g," ").replace(/\/\/.*$/gm," ").replace(/`(?:\\[\s\S]|\$\{([^}]*)\}|[^`\\])*`/g,(t,n)=>n??" ").replace(/'(?:\\[\s\S]|[^'\\])*'/g," ").replace(/"(?:\\[\s\S]|[^"\\])*"/g," ")}function ov(e){let t=e.tag;return e.tagType===UC.COMPONENT?"component":GC.has(t)?"builtin":KC.has(t)?"native":/^[A-Z]/.test(t)||t.includes("-")?"component":"native"}function sv(e){return To(e,/[-_:]/)}function Ci(e,t){return e+Math.max(0,t-1)}import{readdirSync as av}from"fs";import{execFileSync as cv}from"child_process";import{extname as Ao,join as lv}from"path";var Ga=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".vue",".rs",".py",".pyi",".java",".kt",".kts",".scala",".sc",".clj",".cljs",".cljc",".rb",".c",".h",".cc",".cpp",".cxx",".hpp",".hh",".hxx",".cs",".vb",".php",".dart"],Wd=[".vue"],Gd=[".tsx",".jsx"],Kd=[".vue"],uv=[...Gd,...Kd],dv=new Set(Gd),mv=new Set(Kd),Jd=new Set(Ga.map(e=>e.toLowerCase())),pv=[...Jd].sort().join(","),Mo=new Set(["node_modules",".git","target","dist","build",".next",".nuxt",".cache",".turbo",".nbb",".cpcache",".shadow-cljs","out","coverage",".scipquery-cache","__pycache__",".venv","venv",".idea",".vscode"]);function et(e,t={}){let n=t.includeIndexed??!0,i=t.includeAuxiliary??!0,r=t.extensions?.map(c=>c.toLowerCase()),o=r?new Set(r):Jd,s=r?[...o].sort().join(","):pv,a=`${n?"1":"0"}|${i?"1":"0"}|${s}`;return fv.get(e,a,()=>{let c=new Set;if(n)for(let l of O(e,{includeIgnored:!1}))o.has(Ao(l).toLowerCase())&&c.add(l);if(i)for(let l of gv(e.config.projectRoot,o))e.isIgnored(l)||n&&c.has(l)||c.add(l);return[...c].sort()})}function $o(e,t={}){let n=!1,i=!1;for(let r of et(e,{extensions:uv})){if(t.scope&&!r.includes(t.scope))continue;let o=Ao(r).toLowerCase();if(n||=dv.has(o),i||=mv.has(o),n&&i)break}return{react:n,vue:i}}var fv=W("source-files",{clearGroups:[]});function gv(e,t){return hv(e,t)??bv(e,t)}function hv(e,t){try{let n=cv("git",["ls-files","--cached","--others","--exclude-standard"],{cwd:e,encoding:"utf-8",timeout:1e4,stdio:["ignore","pipe","ignore"]}),i=new Set;for(let r of n.split(`
|
|
66
|
+
`)){let o=r.trim();o&&(yv(o)||t.has(Ao(o).toLowerCase())&&i.add(o))}return i}catch{return null}}function yv(e){return e.split("/").some(t=>Mo.has(t))}function bv(e,t){let n=new Set,i=r=>{let o=r?lv(e,r):e,s;try{s=av(o,{withFileTypes:!0})}catch{return}for(let a of s)if(!Mo.has(a.name)){if(a.isDirectory()){i(r?`${r}/${a.name}`:a.name);continue}t.has(Ao(a.name).toLowerCase())&&n.add(r?`${r}/${a.name}`:a.name)}};return i(""),n}var Sv=new Set(["ref","shallowRef","reactive","computed","watch","watchEffect"]),xv=new Set(["onBeforeMount","onMounted","onBeforeUpdate","onUpdated","onBeforeUnmount","onUnmounted","onActivated","onDeactivated","onErrorCaptured"]),Cv=new Set(["axios","fetch","runRequest","useAsyncData","useFetch","useResource"]),vv=new Set(["defineEmits","defineExpose","defineModel","defineOptions","defineProps","withDefaults"]),Rv=new Set(["catch","for","function","if","return","switch","while"]);function Oo(e){let t={imports:[],functions:[],calls:[],composables:[],stores:[],reactivity:[],lifecycle:[],requests:[],macros:[],lineCount:0,externalLineCount:0,externalScriptPaths:[],unresolvedScripts:[]};for(let n of e.scripts){t.lineCount+=Pn(n),n.external&&(t.externalLineCount+=Pn(n),t.externalScriptPaths.push(n.sourcePath));for(let r of n.errors)t.unresolvedScripts.push({sourcePath:n.sourcePath,reason:r});if(!n.body||!n.astLanguage){n.astLanguage||t.unresolvedScripts.push({sourcePath:n.sourcePath,reason:`Unsupported Vue script language: ${n.lang??"unknown"}`});continue}t.imports.push(...Iv(n));let i=dr(n.astLanguage,n.body);i?wv(n,i.rootNode,t):Pv(n,t)}return kv(t),t.externalScriptPaths=Qd(t.externalScriptPaths),t}function kv(e){e.composables=vi(e,"composable"),e.stores=vi(e,"store"),e.reactivity=vi(e,"reactivity"),e.lifecycle=vi(e,"lifecycle"),e.requests=vi(e,"request"),e.macros=vi(e,"macro")}function vi(e,t){return Qd(e.calls.filter(n=>n.categories.includes(t)).map(n=>n.name))}function wv(e,t,n){let i=new Set,r=new Set,o=s=>{let a=No(s,e.astLanguage);if(a){let l=`${a.name}:${a.startLine}:${a.endLine}`;r.has(l)||(r.add(l),n.functions.push({name:a.name,sourcePath:e.sourcePath,startLine:e.startLine+a.startLine,endLine:e.startLine+a.endLine,setup:e.setup}))}let c=Si(s,e.astLanguage);if(c){let l=`${c.calleeLeaf}:${c.line}`;i.has(l)||(i.add(l),n.calls.push({name:c.calleeLeaf,sourcePath:e.sourcePath,line:e.startLine+c.line,categories:Xd(c.calleeLeaf),setup:e.setup}))}for(let l of s.children)o(l)};o(t)}function Pv(e,t){for(let n of e.body.matchAll(/\b([A-Za-z_$][\w$]*)\s*\(/g)){let i=n[1];!i||Rv.has(i)||t.calls.push({name:i,sourcePath:e.sourcePath,line:e.startLine+jo(e.body,n.index??0),categories:Xd(i),setup:e.setup})}for(let n of e.body.matchAll(/\bfunction\s+([A-Za-z_$][\w$]*)\b/g)){let i=n[1];if(!i)continue;let r=e.startLine+jo(e.body,n.index??0);t.functions.push({name:i,sourcePath:e.sourcePath,startLine:r,endLine:r,setup:e.setup})}for(let n of e.body.matchAll(/\b(?:const|let|var)\s+([A-Za-z_$][\w$]*)\s*=\s*(?:async\s*)?(?:function\b|\([^)]*\)\s*=>|[A-Za-z_$][\w$]*\s*=>)/g)){let i=n[1];if(!i)continue;let r=e.startLine+jo(e.body,n.index??0);t.functions.push({name:i,sourcePath:e.sourcePath,startLine:r,endLine:r,setup:e.setup})}}function Iv(e){let t=[];for(let n of e.body.matchAll(/\bimport\s+(?:type\s+)?([^'";]+?)\s+from\s+['"]([^'"]+)['"]/g)){let i=n[1]?.trim(),r=n[2];if(!i||!r)continue;let o=e.startLine+jo(e.body,n.index??0);for(let s of Lv(i))t.push({local:s,source:r,sourcePath:e.sourcePath,line:o,setup:e.setup})}return t}function Lv(e){let t=[],i=e.split(",").map(s=>s.trim()).filter(Boolean)[0];i&&!i.startsWith("{")&&!i.startsWith("*")&&t.push(i);let r=/\{([^}]*)\}/.exec(e)?.[1];if(r)for(let s of r.split(",")){let a=s.trim();if(!a)continue;let c=/\bas\s+([A-Za-z_$][\w$]*)$/.exec(a)?.[1];t.push(c??a.replace(/^type\s+/,"").trim())}let o=/\*\s+as\s+([A-Za-z_$][\w$]*)/.exec(e)?.[1];return o&&t.push(o),t.filter(s=>/^[A-Za-z_$][\w$]*$/.test(s))}function Xd(e){let t=["call"];return/^use[A-Z0-9_]/.test(e)&&t.push("composable"),/^use[A-Z0-9_].*Store$/.test(e)&&t.push("store"),Sv.has(e)&&t.push("reactivity"),xv.has(e)&&t.push("lifecycle"),Cv.has(e)&&t.push("request"),vv.has(e)&&t.push("macro"),t}function jo(e,t){let n=0;for(let i=0;i<t&&i<e.length;i+=1)e.charCodeAt(i)===10&&(n+=1);return n}function Qd(e){return[...new Set(e)].sort()}var Dv=new Set(["in","key","of"]),Ev=new Set(["computed","defineEmits","defineProps","reactive","ref","watch","watchEffect"]),Nv=sn("vue-component-behavior-profiles");function Yd(e,t={}){let n=et(e,{extensions:[".vue"]}).filter(r=>!t.scope||r.includes(t.scope)).sort();return(typeof t.scanLimit=="number"&&t.scanLimit>0?n.slice(0,t.scanLimit):n).map(r=>Ka(e,r)).filter(r=>(t.minTemplateTokens===void 0||r.templateTokens.size>=t.minTemplateTokens)&&(t.minBehaviorTokens===void 0||r.behaviorTokens.size>=t.minBehaviorTokens))}function Ka(e,t){let n=t.replace(/\\/g,"/"),i=M(e,n),r=Nv.get(e,n,i,()=>Fv(e,n,i));return Tv(r)}function Fv(e,t,n){let i=yi(e,t),r=_o(e,t),o=Oo(i),s=Mv(r),a=r.expressionIdentifiers.map(f=>f.name).filter(f=>!s.includes(f)).filter((f,g,b)=>b.indexOf(f)===g).sort(),c=r.componentTags.map(f=>f.normalized).filter((f,g,b)=>b.indexOf(f)===g).sort(),l=n?n.split(`
|
|
67
|
+
`).length:0,d=Pn(i.template),u=o.lineCount,m=i.styles.reduce((f,g)=>f+Pn(g),0),p=i.customBlocks.reduce((f,g)=>f+Pn(g),0);return{file:t,sfc:i,templateFacts:r,scriptFacts:o,templateTokens:new Set(r.structuralTokens),behaviorTokens:Av(r,o,a),templateBindingNames:a,templateLocalNames:s,componentNames:c,sfcLines:l,totalLines:l+o.externalLineCount,templateLines:d,scriptLines:u,styleLines:m,externalScriptLines:o.externalLineCount,externalScriptPaths:o.externalScriptPaths,customBlockLines:p}}function Tv(e){let t=_v(e.scriptFacts);return{...e,scriptFacts:t,templateTokens:new Set(e.templateTokens),behaviorTokens:new Set(e.behaviorTokens),templateBindingNames:[...e.templateBindingNames],templateLocalNames:[...e.templateLocalNames],componentNames:[...e.componentNames],externalScriptPaths:t.externalScriptPaths}}function _v(e){return{...e,imports:e.imports.map(t=>({...t})),functions:e.functions.map(t=>({...t})),calls:e.calls.map(t=>({...t,categories:[...t.categories]})),composables:[...e.composables],stores:[...e.stores],reactivity:[...e.reactivity],lifecycle:[...e.lifecycle],requests:[...e.requests],macros:[...e.macros],externalScriptPaths:[...e.externalScriptPaths],unresolvedScripts:e.unresolvedScripts.map(t=>({...t}))}}function Av(e,t,n){let i=new Set;for(let r of t.composables)i.add(`composable:${r}`);for(let r of t.stores)i.add(`store:${r}`);for(let r of t.reactivity)i.add(`reactivity:${r}`);for(let r of t.lifecycle)i.add(`lifecycle:${r}`);for(let r of t.requests)i.add(`request:${r}`);for(let r of t.macros)i.add(`macro:${r}`);for(let r of t.functions){if(Ev.has(r.name))continue;i.add(`function:${r.name}`);let o=/^[a-z]+/.exec(r.name)?.[0]??null;o&&o.length>2&&o!==r.name&&i.add(`function-verb:${o}`)}for(let r of e.events)i.add(`template-event:${r.name}`);for(let r of n)i.add(`template-binding:${r}`);return i}function Mv(e){let t=new Set;for(let n of e.directives)if(n.name==="for"&&n.value)for(let i of $v(n.value))t.add(i);for(let n of e.slots)if(n.value)for(let i of Zd(n.value))t.add(i);return[...t].sort()}function $v(e){let t=/^(.*?)\s+(?:in|of)\s+/.exec(e.trim());return t?Zd(t[1]??""):[]}function Zd(e){let t=[];for(let n of e.matchAll(/\b[A-Za-z_$][\w$]*\b/g)){let i=n[0];Dv.has(i)||t.push(i)}return t}import{extname as jv}from"path";function kt(e){return typeof e=="object"&&e!==null}function je(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")?e:null}var Ov=[".tsx",".jsx"],em=new Set(["useActionState","useCallback","useContext","useDebugValue","useDeferredValue","useEffect","useId","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useOptimistic","useReducer","useRef","useState","useSyncExternalStore","useTransition"]),Bv=new Set(["useEffect","useInsertionEffect","useLayoutEffect"]),Hv=new Set(["useActionState","useOptimistic","useReducer","useRef","useState"]),Vv=new Set(["useLocation","useNavigate","useParams","useSearchParams","useTranslation"]),qv=new Set(["axios","fetch","gql","graphql","mutate","query","request","useMutation","useQuery","useSuspenseQuery"]),Uv=new Set(["add","apply","cancel","change","clear","close","create","delete","fetch","filter","handle","load","open","refresh","remove","render","reset","save","select","submit","toggle","update"]),zv=new Set(["children","className","false","key","null","style","true","undefined"]),Wv=new Set(["aria-hidden","className","clipRule","d","fill","fillRule","height","role","stroke","strokeLinecap","strokeLinejoin","strokeWidth","style","viewBox","width","xmlns"]),Gv=sn("react-component-behavior-profiles"),tm=pe({kind:"react-component-behavior-profiles",serialize:Qv,deserialize:Yv});function om(e,t={}){let n=et(e,{extensions:Ov}).filter(r=>!t.scope||r.includes(t.scope)).sort();return(typeof t.scanLimit=="number"&&t.scanLimit>0?n.slice(0,t.scanLimit):n).flatMap(r=>Ja(e,r)).filter(r=>(t.minJsxTokens===void 0||r.jsxTokens.size>=t.minJsxTokens)&&(t.minBehaviorTokens===void 0||r.behaviorTokens.size>=t.minBehaviorTokens))}function Ja(e,t){let n=t.replace(/\\/g,"/"),i=M(e,n);return Gv.get(e,n,i,()=>Kv(e,n,i)).map(Xv)}function Kv(e,t,n){let i=re(e,t,n),r=tm.read(e,t,i);if(r)return r;let o=Jv(e,t);return tm.write(e,t,i,o),o}function Jv(e,t){let n=eR(t);if(!n)return[];let i=Pe(e,t);if(!i)return[];let r=Ye(e,t).length;return tR(i.rootNode,n).filter(s=>s.kind==="hook"||am(s.bodyNode)).map(s=>{let a=sR(s.bodyNode),c=dR(s.bodyNode,n);return{file:t,name:s.name,kind:s.kind,startLine:s.node.startPosition.row,endLine:s.node.endPosition.row,loc:Math.max(1,s.node.endPosition.row-s.node.startPosition.row+1),fileLines:r,jsxTokens:a.tokens,behaviorTokens:c.tokens,componentNames:qt(a.componentNames),nativeTags:qt(a.nativeTags),propNames:qt(a.propNames),eventNames:qt(a.eventNames),hookNames:qt(c.hookNames),requestNames:qt(c.requestNames),stateNames:qt(c.stateNames),effectNames:qt(c.effectNames),handlerNames:qt(c.handlerNames)}})}function Xv(e){return{...e,jsxTokens:new Set(e.jsxTokens),behaviorTokens:new Set(e.behaviorTokens),componentNames:[...e.componentNames],nativeTags:[...e.nativeTags],propNames:[...e.propNames],eventNames:[...e.eventNames],hookNames:[...e.hookNames],requestNames:[...e.requestNames],stateNames:[...e.stateNames],effectNames:[...e.effectNames],handlerNames:[...e.handlerNames]}}function Qv(e){return JSON.stringify(e.map(t=>({...t,jsxTokens:[...t.jsxTokens],behaviorTokens:[...t.behaviorTokens]})))}function Yv(e){try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=[];for(let i of t){let r=Zv(i);if(!r)return null;n.push(r)}return n}catch{return null}}function Zv(e){if(!kt(e))return null;let{file:t,name:n,kind:i,startLine:r,endLine:o,loc:s,fileLines:a,jsxTokens:c,behaviorTokens:l,componentNames:d,nativeTags:u,propNames:m,eventNames:p,hookNames:f,requestNames:g,stateNames:b,effectNames:x,handlerNames:S}=e;if(typeof t!="string"||typeof n!="string"||i!=="component"&&i!=="hook"||!Bo(r)||!Bo(o)||!Bo(s)||!Bo(a))return null;let R={jsxTokens:je(c),behaviorTokens:je(l),componentNames:je(d),nativeTags:je(u),propNames:je(m),eventNames:je(p),hookNames:je(f),requestNames:je(g),stateNames:je(b),effectNames:je(x),handlerNames:je(S)};return Object.values(R).some(C=>C===null)?null:{file:t,name:n,kind:i,startLine:r,endLine:o,loc:s,fileLines:a,jsxTokens:new Set(R.jsxTokens),behaviorTokens:new Set(R.behaviorTokens),componentNames:R.componentNames,nativeTags:R.nativeTags,propNames:R.propNames,eventNames:R.eventNames,hookNames:R.hookNames,requestNames:R.requestNames,stateNames:R.stateNames,effectNames:R.effectNames,handlerNames:R.handlerNames}}function Bo(e){return typeof e=="number"&&Number.isFinite(e)}function eR(e){let t=jv(e).toLowerCase();return t!==".tsx"&&t!==".jsx"?null:H(e)}function tR(e,t){let n=[],i=new Set,r=o=>{let s=nR(o);if(s&&!rR(o)){let a=`${s.name}:${s.node.startIndex}:${s.node.endIndex}`;i.has(a)||(i.add(a),n.push(s));return}for(let a of o.namedChildren)r(a)};return(t==="tsx"||t==="javascript")&&r(e),n}function nR(e){if(e.type==="function_declaration"){let o=sm(e);return!o||!nm(o)?null:{name:o,kind:im(o),node:e,bodyNode:e}}if(e.type!=="variable_declarator")return null;let t=e.childForFieldName("name")??e.namedChild(0),n=e.childForFieldName("value")??e.namedChild(1),i=gr(t);if(!i||!n||!nm(i))return null;let r=iR(n);return r?{name:i,kind:im(i),node:e,bodyNode:r}:null}function nm(e){return/^[A-Z]/.test(e)||/^use[A-Z0-9_]/.test(e)}function im(e){return/^use[A-Z0-9_]/.test(e)?"hook":"component"}function iR(e){if(e.type==="arrow_function"||e.type==="function_expression")return e;if(e.type!=="call_expression")return null;let t=oR(e);return t!=="memo"&&t!=="forwardRef"?null:e.namedChildren.find(r=>r.type==="arguments")?.namedChildren.find(r=>r.type==="arrow_function"||r.type==="function_expression")??null}function rR(e){let t=e.parent;for(;t;){if(t.type==="function_declaration"||t.type==="function_expression"||t.type==="arrow_function"||t.type==="method_definition")return!0;t=t.parent}return!1}function sm(e){return gr(e.childForFieldName("name")??e.namedChild(0))}function oR(e){let t=e.childForFieldName("function")??e.namedChild(0);return t?t.text.split(".").pop()??t.text:null}function am(e){return e.type.startsWith("jsx_")?!0:e.namedChildren.some(am)}function sR(e){let t={tokens:new Set,componentNames:new Set,nativeTags:new Set,propNames:new Set,eventNames:new Set},n=i=>{i.type==="jsx_opening_element"||i.type==="jsx_self_closing_element"?aR(i,t):i.type==="jsx_expression"?cR(i,t):i.type==="jsx_fragment"&&t.tokens.add("jsx:fragment");for(let r of i.namedChildren)n(r)};return n(e),t}function aR(e,t){let n=lR(e),i=!1;if(n){let r=rm(n);i=hR(r),i?(t.componentNames.add(r),t.tokens.add(`component:${r}`)):(t.nativeTags.add(r),t.tokens.add(`native:${r}`))}for(let r of e.namedChildren)if(r.type==="jsx_attribute"){let o=uR(r);if(!o)continue;let s=rm(o);if(s.startsWith("on")&&s.length>2){let a=s.slice(2).replace(/^[A-Z]/,c=>c.toLowerCase());t.eventNames.add(a),t.tokens.add(`event:${a}`)}else Wv.has(s)||(t.propNames.add(s),t.tokens.add(`${i?"prop":"native-prop"}:${s}`))}else r.type==="jsx_spread_attribute"&&t.tokens.add("prop:spread")}function cR(e,t){let n=e.text;(n.includes("&&")||n.includes("?"))&&t.tokens.add("jsx:conditional"),(n.includes(".map(")||n.includes(".flatMap("))&&t.tokens.add("jsx:list");for(let i of yR(n))zv.has(i)||t.tokens.add(`binding:${i}`)}function lR(e){for(let t of e.namedChildren)if(t.type==="identifier"||t.type==="jsx_identifier"||t.type==="property_identifier"||t.type==="member_expression"||t.type==="jsx_member_expression")return t.text;return/^<\s*([A-Za-z][\w$.]*)/.exec(e.text)?.[1]??null}function uR(e){for(let t of e.namedChildren)if(t.type==="property_identifier"||t.type==="identifier"||t.type==="jsx_identifier")return t.text;return/^([A-Za-z_$][\w$:-]*)/.exec(e.text)?.[1]??null}function dR(e,t){let n={tokens:new Set,hookNames:new Set,requestNames:new Set,stateNames:new Set,effectNames:new Set,handlerNames:new Set},i=r=>{if(r.type==="call_expression"){let o=Si(r,t);o&&mR(o.calleeLeaf,n)}else if(r.type==="variable_declarator")fR(r,n);else if(r.type==="function_declaration"){let o=sm(r);o&&cm(o,n)}for(let o of r.namedChildren)i(o)};return i(e),n}function mR(e,t){/^use[A-Z0-9_]/.test(e)&&(t.hookNames.add(e),!em.has(e)&&!Vv.has(e)&&t.tokens.add(`hook:${e}`)),em.has(e)&&t.tokens.add(`react-hook:${e}`),Bv.has(e)&&(t.effectNames.add(e),t.tokens.add(`effect:${e}`)),Hv.has(e)&&t.tokens.add(`state-hook:${e}`),pR(e)&&(t.requestNames.add(e),t.tokens.add(`request:${e}`))}function pR(e){if(qv.has(e))return!0;let t=/^use([A-Z0-9_].*)$/.exec(e)?.[1];return t?/(Query|Mutation|Fetch|Resource)$/.test(t):!1}function fR(e,t){let n=e.childForFieldName("name")??e.namedChild(0),i=e.childForFieldName("value")??e.namedChild(1);if(n?.type==="array_pattern"&&i?.text.includes("useState")){let o=n.namedChildren.find(a=>gr(a)),s=gr(o);s&&(t.stateNames.add(s),t.tokens.add(`state:${s}`))}let r=gr(n);r&&cm(r,t)}function cm(e,t){let n=gR(e);!n||!Uv.has(n)||(t.handlerNames.add(e),t.tokens.add(`handler:${e}`),t.tokens.add(`handler-verb:${n}`))}function gR(e){let t=e.startsWith("handle")&&e.length>6?e.slice(6).replace(/^[A-Z]/,n=>n.toLowerCase()):e;return/^[a-z]+/.exec(t)?.[0]??null}function hR(e){return/^[A-Z]/.test(e)||e.includes(".")}function rm(e){return e.replace(/^this\./,"").replace(/\$/g,".")}function gr(e){return e&&(e.type==="identifier"||e.type==="property_identifier"||e.type==="shorthand_property_identifier"||/^[A-Za-z_$][\w$]*$/.test(e.text))?e.text:null}function yR(e){let t=[];for(let n of e.matchAll(/\b[A-Za-z_$][\w$]*\b/g)){let i=n[0];t.includes(i)||t.push(i)}return t}function qt(e){return[...e].sort()}function tt(e){return{capability:(t,n)=>bR(t,n),reactProfiles:(t={})=>om(e,t),reactProfilesForFile:t=>Ja(e,t),vueProfiles:(t={})=>Yd(e,t),vueProfileForFile:t=>Ka(e,t),vueTemplateFacts:t=>_o(e,t),vueScriptFacts:t=>Oo(yi(e,t))}}function bR(e,t){let n=e.startsWith("react-")?"react":"vue";if(t===void 0)return{slot:e,available:!0,framework:n};let i=t.replace(/\\/g,"/").toLowerCase();return n==="react"&&!i.endsWith(".tsx")&&!i.endsWith(".jsx")?{slot:e,available:!1,framework:n,reason:"React behavior profiles are only available for .tsx and .jsx files"}:n==="vue"&&!i.endsWith(".vue")?{slot:e,available:!1,framework:n,reason:"Vue behavior facts are only available for .vue files"}:{slot:e,available:!0,framework:n}}function Dn(e,t,n={}){let i=X(e,t);if(!i)return[];let r=[];if(n.includeCrossLanguageDispatchNames)for(let o of i.crossLanguageDispatchNames)r.push({name:o,kind:"cross-language-dispatch",occurrences:1});if(n.includeRustAttributeNames&&i.language==="rust")for(let o of i.rustAttrReferencedNames)r.push({name:o,kind:"rust-attribute",occurrences:1});return r}import{existsSync as Ho}from"fs";import{basename as lm,dirname as un,extname as Ut,join as mt,relative as hr,resolve as nt}from"path";var SR=ie("indexed-paths",{clearGroups:[]}),xR=ie("indexed-path-digest",{clearGroups:[]}),En=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".vue"],Vo=[".py",".pyi"],Ge=[".java",".scala",".kt",".kts"],qo=[".rs"],Uo=[".rb"],zo=[".c",".h",".cc",".cpp",".cxx",".hpp",".hh",".hxx"],dn=[".cs",".vb"],Wo=[".dart"],Nn=[".php"],Ri=[".clj",".cljs",".cljc"],CR=new Set(En),Xa=new Set(Vo),um=new Set(Ge),Qa=new Set(qo),Ya=new Set(Uo),dm=new Set(zo),mm=new Set(dn),Za=new Set(Wo),pm=new Set(Nn),fm=new Set(Ri),vR=[{extensions:En,lookup:CR},{extensions:Vo,lookup:Xa},{extensions:Ge,lookup:um},{extensions:qo,lookup:Qa},{extensions:Uo,lookup:Ya},{extensions:zo,lookup:dm},{extensions:dn,lookup:mm},{extensions:Wo,lookup:Za},{extensions:Nn,lookup:pm},{extensions:Ri,lookup:fm}];function zt(e,t){return t.has(Ut(e).toLowerCase())}function RR(e){return zt(e,Xa)}function kR(e){return zt(e,um)}function wR(e){return zt(e,Qa)}function PR(e){return zt(e,Ya)}function IR(e){return zt(e,dm)}function LR(e){return zt(e,mm)}function gm(e){return Ut(e).toLowerCase()===".vb"}function DR(e){return zt(e,Za)}function ER(e){return zt(e,pm)}function NR(e){return zt(e,fm)}function ec(e){let t=Ut(e).toLowerCase();for(let n of vR)if(n.lookup.has(t))return n.extensions;return En}function FR(e){return kR(e)||LR(e)||ER(e)}function ft(e,t,n){return RR(t)?ki(e,t,n):wR(t)?Wt(e,t,n):PR(t)?Go(e,t,n):IR(t)?Ko(e,t,n):FR(t)?fe(e,n.replace(/\\/g,"."),ec(t)):DR(t)?Jo(e,t,n):NR(t)?tc(e,n):TR(e,t,n)}function TR(e,t,n){if(!n.startsWith(".")&&!n.startsWith("/"))return null;let i=un(mt(e.config.projectRoot,t)),r=nt(i,n),o=Fn(e);for(let s of jR(r)){let a=pt(hr(e.config.projectRoot,s));if(o.has(a)||Ho(s))return a}return pt(hr(e.config.projectRoot,r))}function ki(e,t,n){let i=Fn(e),r;if(n.startsWith(".")){let o=n.match(/^(\.+)(.*)$/);if(!o)return null;let s=o[1].length,a=o[2].replace(/^\./,""),c=un(mt(e.config.projectRoot,t));for(let l=1;l<s;l++)c=un(c);r=a?nt(c,a.replace(/\./g,"/")):c}else r=nt(e.config.projectRoot,n.replace(/\./g,"/"));for(let o of _R(r)){let s=pt(hr(e.config.projectRoot,o));if(i.has(s)||Ho(o))return s}return null}function Wt(e,t,n){if(!n)return null;let i=n.replace(/\s+as\s+.+$/,"").trim();if(!i.startsWith("crate::")&&!i.startsWith("self::")&&!i.startsWith("super::"))return null;let r=un(mt(e.config.projectRoot,t)),o;return i.startsWith("crate::")?o=nt(e.config.projectRoot,"src",i.slice(7).replace(/::/g,"/")):i.startsWith("self::")?o=nt(r,i.slice(6).replace(/::/g,"/")):o=nt(un(r),i.slice(7).replace(/::/g,"/")),nc(e,AR(o))}function Go(e,t,n){let i=un(mt(e.config.projectRoot,t)),r=nt(i,n);return nc(e,MR(r))}function Ko(e,t,n){let i=un(mt(e.config.projectRoot,t)),r=[nt(i,n),nt(e.config.projectRoot,n),nt(e.config.projectRoot,"include",n),nt(e.config.projectRoot,"src",n)];return nc(e,r)}function fe(e,t,n){let i=Fn(e),r=t.replace(/\\/g,".").replace(/::/g,".").replace(/^global::/,""),o=r.replace(/\./g,"/"),s=r.split(".").pop()??r;for(let c of n){let l=`${o}${c}`,d=[...i].find(u=>u.endsWith(l));if(d)return d}for(let c of n){let l=[...i].find(d=>lm(d)===`${s}${c}`);if(l)return l}let a=[...i].filter(c=>n.includes(Ut(c).toLowerCase())).filter(c=>c.includes(`/${o}/`)||c.includes(`/${s}/`)).sort((c,l)=>c.localeCompare(l));return a.length===1?a[0]:null}function Jo(e,t,n){let i=Fn(e);if(n.startsWith("package:")){let s=n.slice(8),a=s.indexOf("/");if(a<0)return null;let c=s.slice(a+1),l=pt(c.startsWith("lib/")?c:`lib/${c}`);return i.has(l)?l:null}let r=un(mt(e.config.projectRoot,t)),o=nt(r,n);for(let s of $R(o)){let a=pt(hr(e.config.projectRoot,s));if(i.has(a)||Ho(s))return a}return null}function tc(e,t){let n=t.replace(/-/g,"_").replace(/\./g,"/"),i=Fn(e);for(let r of Ri){let o=`${n}${r}`,s=[...i].find(a=>a.endsWith(o));if(s)return s}for(let r of Ri){let o=[...i].find(s=>lm(s)===`${n.split("/").pop()}${r}`);if(o)return o}return null}function _R(e){let t=Ut(e);return Xa.has(t)?[e]:[`${e}.py`,`${e}.pyi`,mt(e,"__init__.py"),mt(e,"__init__.pyi")]}function nc(e,t){let n=Fn(e);for(let i of t){let r=pt(hr(e.config.projectRoot,i));if(n.has(r)||Ho(i))return r}return null}function AR(e){let t=Ut(e);return Qa.has(t)?[e]:[`${e}.rs`,mt(e,"mod.rs")]}function MR(e){let t=Ut(e);return Ya.has(t)?[e]:[`${e}.rb`,mt(e,"index.rb")]}function $R(e){let t=Ut(e);return Za.has(t)?[e]:[`${e}.dart`,e]}function jR(e){let t=Ut(e),n=new Set;if(t){n.add(e);for(let i of En)n.add(e.slice(0,-t.length)+i)}else for(let i of En)n.add(`${e}${i}`),n.add(mt(e,`index${i}`));return[...n]}function Fn(e){return SR.get(e,()=>new Set(O(e,{includeIgnored:!1}).map(pt)))}function ic(e){return xR.get(e,()=>Vt([...Fn(e)].sort().join(`
|
|
68
|
+
`)))}function pt(e){return e.replace(/\\/g,"/")}import{basename as ym}from"path";function Tn(e){return e.replace(/'''[\s\S]*?'''/g,mn).replace(/"""[\s\S]*?"""/g,mn).replace(/#.*$/gm,mn).replace(/\/\/.*$/gm,mn).replace(/\/\*[\s\S]*?\*\//g,mn).replace(/`(?:\\[\s\S]|[^`])*`/g,mn).replace(/'(?:\\.|[^'\\\r\n])*'/g,mn).replace(/"(?:\\.|[^"\\\r\n])*"/g,mn)}function mn(e){return e.replace(/[^\r\n]/g," ")}var tG=wn("stripped-lines",{clearGroups:["whole-project","source-file"]});on({name:"stripped-source-singleton",groups:["whole-project","source-file"],clearAll:()=>{Xo=null,yr=""},clearFile:()=>{Xo=null,yr=""}});var Xo=null,yr="";function OR(e){return Xo===e||(Xo=e,yr=Tn(e)),yr}function pn(e,t,n){let i=OR(e);return`${i.slice(0,t)}${" ".repeat(n-t)}${i.slice(n)}`}function Be(e,t){return new RegExp(`\\b${hm(t)}\\b`,"m").test(e)}function wi(e,t){let n=new Set,i=new RegExp(`\\b${hm(t)}\\s*\\.\\s*([A-Za-z_$][\\w$]*)`,"g");for(let r of e.matchAll(i)){let o=r[1];o&&n.add(o)}return[...n]}function hm(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function br(e){let t=0;for(let n of e)n==="("&&(t+=1),n===")"&&(t-=1);return t}var BR=new Set(["identifier","type_identifier","property_identifier","shorthand_property_identifier","field_identifier"]);function He(e){let t=[],n=0,i=0;for(let r=0;r<e.length;r++){let o=e[r];(o==="{"||o==="["||o==="(")&&n++,(o==="}"||o==="]"||o===")")&&n--,o===","&&n===0&&(t.push(e.slice(i,r)),i=r+1)}return t.push(e.slice(i)),t}function Ke(e,t){for(let n of e.namedChildren)if(n.type===t)return n;return null}function ge(e,t){let n=new Set,i=(r,o)=>{let s=o||t.has(r.type);!s&&BR.has(r.type)&&n.add(r.text);for(let a of r.children)i(a,s)};return i(e.rootNode,!1),n}function wt(e,t,n,i,r,o,s){return{importedName:r,localName:o,sourcePath:s??fe(e,i,ec(t)),kind:"named",used:Be(n,o),usedMembers:[]}}function ue(e,t,n,i,r="named",o={}){return{importedName:e,localName:t,sourcePath:n,kind:r,used:i.has(t),usedMembers:[],isTypeOnly:o.isTypeOnly}}function Gt(e,t,n,i,r="named",o=[],s={}){return{importedName:e,localName:t,sourcePath:n,kind:r,used:i,usedMembers:o,isTypeOnly:s.isTypeOnly}}function _n(e,t){return{importedName:e,localName:null,sourcePath:t,kind:"side-effect",used:!0,usedMembers:[]}}function An(e,t,n={}){return{importedName:e,localName:n.localName??null,sourcePath:t,kind:"namespace",used:n.used??!0,usedMembers:n.usedMembers??[],isTypeOnly:n.isTypeOnly}}function it(e,t,n){let i=[];for(let r of e.matchAll(t)){let o=r[0];if(!o||typeof r.index!="number")continue;let s=pn(e,r.index,r.index+o.length);for(let a of n(r,s))i.push(a)}return i}function rt(e,t,n,i){let r=Pe(e,t);if(r){let o=n(r);if(o)return o}return i()}function Qo(e,t,n,i){let r=Pe(e,t),o=H(t),s=o?n[o]:void 0;return r&&s?s(r):i()}function bm(e,t,n){return rt(e,t,i=>VR(e,t,i),()=>HR(e,t,n))}function HR(e,t,n){return it(n,/^[ \t]*#include\s+[<"]([^">]+)[">]\s*$/gm,(i,r)=>{let o=i[1]?.trim();if(!o)return[];let s=ym(o).replace(/\.[^.]+$/,"");return[Gt(o,s,Ko(e,t,o),Be(r,s))]})}function VR(e,t,n){let i=ge(n,new Set(["preproc_include"])),r=[];for(let o of n.rootNode.descendantsOfType("preproc_include")){let s=null;for(let c of o.namedChildren){if(c.type==="system_lib_string"){s=c.text.replace(/^<|>$/g,"");break}if(c.type==="string_literal"){s=c.namedChildren.find(d=>d.type==="string_content")?.text??c.text.replace(/^"|"$/g,"");break}}if(!s)continue;let a=ym(s).replace(/\.[^.]+$/,"");r.push(ue(s,a,Ko(e,t,s),i))}return r}var qR=new Set([":require",":require-macros",":use"]),ac=String.raw`A-Za-z0-9_$*+!?.<>=-`;function xm(e,t,n){let i=ek(n);if(!i)return[];let r=ZR(n,i.start,i.end),o=[];for(let s of i.children.slice(2)){if(s.type!=="list"||s.children.length===0)continue;let a=Pt(s.children[0]);if(a){if(qR.has(a)){for(let c of WR(s.children.slice(1)))o.push(...zR(e,c,r));continue}if(a===":import")for(let c of KR(s.children.slice(1)))o.push(c)}}return o}function UR(e){return e.type==="list"&&Pt(e.children[0])==="ns"}function zR(e,t,n){let i=tc(e,t.namespace),r=t.alias??t.namespace,o=XR(n,r),s=[{importedName:t.namespace,localName:r,sourcePath:i,kind:"namespace",used:t.refers.length>0||t.referAll||o.length>0||QR(n,t.namespace),usedMembers:o}];t.referAll&&s.push({importedName:"*",localName:null,sourcePath:i,kind:"side-effect",used:!0,usedMembers:[]});for(let a of t.refers)s.push({importedName:a,localName:a,sourcePath:i,kind:"named",used:YR(n,a),usedMembers:[]});return s}function WR(e){return e.flatMap(t=>Cm(t,null))}function Cm(e,t){if(e.type==="atom")return e.text.startsWith(":")?[]:[{namespace:oc(t,e.text),alias:null,refers:[],referAll:!1}];if(e.type==="vector")return GR(e,t);if(e.type==="list"&&e.children.length>0){let n=Pt(e.children[0]);return!n||n.startsWith(":")?[]:e.children.slice(1).flatMap(i=>Cm(i,oc(t,n)))}return[]}function GR(e,t){let n=Pt(e.children[0]);if(!n||n.startsWith(":"))return[];let i={namespace:oc(t,n),alias:null,refers:[],referAll:!1};for(let r=1;r<e.children.length;r+=1){let o=Pt(e.children[r]);if(!o?.startsWith(":"))continue;let s=e.children[r+1];if((o===":as"||o===":as-alias")&&s){i.alias=Pt(s),r+=1;continue}o===":refer"&&s&&(Pt(s)===":all"?i.referAll=!0:(s.type==="vector"||s.type==="list")&&i.refers.push(...s.children.map(Pt).filter(JR)),r+=1)}return[i]}function KR(e){let t=[];for(let n of e){if(n.type==="atom"){let r=n.text.split(".").pop()??n.text;t.push(Gt(r,r,null,!0));continue}if(n.type!=="vector")continue;let i=Pt(n.children[0]);if(i)for(let r of n.children.slice(1)){let o=Pt(r);o&&t.push(Gt(`${i}.${o}`,o,null,!0))}}return t}function oc(e,t){return e?`${e}.${t}`:t}function Pt(e){return e?.type==="atom"?e.text:null}function JR(e){return!!(e&&!e.startsWith(":"))}function XR(e,t){let n=new Set,i=new RegExp(`${cc()}${lc(t)}\\s*/\\s*([${ac}]+)`,"g");for(let r of e.matchAll(i)){let o=r[1];o&&n.add(o)}return[...n]}function QR(e,t){return new RegExp(`${cc()}${lc(t)}\\s*/`,"m").test(e)}function YR(e,t){return new RegExp(`${cc()}${lc(t)}(?![${ac}])`,"m").test(e)}function cc(){return`(?<![${ac}])`}function lc(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function ZR(e,t,n){let i="",r=0;for(;r<e.length;){if(r>=t&&r<n){i+=e[r]===`
|
|
69
|
+
`?`
|
|
70
|
+
`:" ",r+=1;continue}let o=e[r];if(o===";"){let s=vm(e,r);i+=Sm(e.slice(r,s)),r=s;continue}if(o==='"'){let s=sc(e,r);i+=Sm(e.slice(r,s)),r=s;continue}i+=o,r+=1}return i}function ek(e){let t=0;for(;t<e.length&&(t=dc(e,t),!(t>=e.length));){let n=uc(e,t);if(!n){t+=1;continue}if(UR(n.form))return n.form;t=n.index}return null}function uc(e,t){let n=dc(e,t);if(e.startsWith("#_",n)){let r=uc(e,n+2);return r?{form:{type:"atom",text:"",start:n,end:r.index},index:r.index}:null}for(;nk(e[n]);)n+=1;let i=e[n];return i?i==="("?rc(e,n,"list",")"):i==="["?rc(e,n,"vector","]"):i==="{"?rc(e,n,"map","}"):i==='"'?{form:{type:"atom",text:"",start:n,end:sc(e,n)},index:sc(e,n)}:tk(e,n):null}function rc(e,t,n,i){let r=[],o=t+1;for(;o<e.length;){if(o=dc(e,o),e[o]===i)return{form:{type:n,children:r,start:t,end:o+1},index:o+1};let s=uc(e,o);if(!s){o+=1;continue}s.form.type==="atom"&&s.form.text===""||r.push(s.form),o=s.index}return{form:{type:n,children:r,start:t,end:e.length},index:e.length}}function tk(e,t){let n=t;for(;n<e.length&&!ik(e[n]);)n+=1;return{form:{type:"atom",text:e.slice(t,n),start:t,end:n},index:n}}function dc(e,t){let n=t;for(;n<e.length;){let i=e[n];if(/\s|,/.test(i)){n+=1;continue}if(i===";"){n=vm(e,n);continue}break}return n}function vm(e,t){let n=t;for(;n<e.length&&e[n]!==`
|
|
71
|
+
`;)n+=1;return n}function sc(e,t){let n=t+1;for(;n<e.length;){let i=e[n];if(i==="\\"){n+=2;continue}if(n+=1,i==='"')break}return n}function nk(e){return e==="'"||e==="`"||e==="~"||e==="@"||e==="^"}function ik(e){return/\s|,/.test(e)||e==="("||e===")"||e==="["||e==="]"||e==="{"||e==="}"||e==='"'||e===";"}function Sm(e){return e.replace(/[^\r\n]/g," ")}function Rm(e,t,n){let i=[];for(let r of n.matchAll(/^[ \t]*import\s+['"]([^'"]+)['"](?:\s+as\s+([A-Za-z_]\w*))?[\s\S]*?;$/gm)){let o=r[1]?.trim(),s=r[2]?.trim()??null,a=r[0];if(!o||!a||typeof r.index!="number")continue;let c=pn(n,r.index,r.index+a.length);i.push({importedName:o,localName:s,sourcePath:Jo(e,t,o),kind:s?"namespace":"side-effect",used:s?Be(c,s):!0,usedMembers:s?wi(c,s):[]})}return i}function km(e,t,n){let i=[];for(let r of n.matchAll(/^[ \t]*export\s+['"]([^'"]+)['"][\s\S]*?;$/gm)){let o=r[1]?.trim();o&&i.push({specifier:o,sourcePath:Jo(e,t,o)})}return i}function wm(e,t,n){return Qo(e,t,{csharp:i=>ok(e,t,i),vb:i=>rk(e,t,i)},()=>{let i=gm(t)?/^[ \t]*Imports\s+(.+?)\s*$/gm:/^[ \t]*using\s+(.+?)\s*;$/gm;return it(n,i,(r,o)=>{let s=r[1]?.trim();if(!s)return[];let[a,c]=s.split(/\s*=\s*/),l=!!c,d=(l?c:a)?.trim()??s,u=d.split(".").pop()??d,m=l?a?.trim()??u:u;return[wt(e,t,o,d,u,m,fe(e,d,dn))]})})}function rk(e,t,n){let i=ge(n,new Set(["imports_statement"])),r=[];for(let o of n.rootNode.descendantsOfType("imports_statement")){let s=o.namedChildren.filter(m=>m.type==="namespace_name");if(s.length===0)continue;let a=s[s.length-1],c=s.length>1?s[0]:null,l=a.text,d=l.split(".").pop()??l,u=c?.text??d;r.push(ue(d,u,fe(e,l,dn),i,c?"namespace":"named"))}return r}function ok(e,t,n){let i=ge(n,new Set(["using_directive"])),r=[];for(let o of n.rootNode.descendantsOfType("using_directive")){let s=o.namedChildren;if(s.length===0)continue;let a=null,c;s.length>=2&&s[0].type==="identifier"&&(s[1].type==="qualified_name"||s[1].type==="identifier")?(a=s[0],c=s[1]):c=s[s.length-1];let l=c.text,d=l.split(".").pop()??l,u=a?.text??d;r.push(ue(d,u,fe(e,l,dn),i,a?"namespace":"named"))}return r}var sk=W("vue-non-script-identifiers",{clearGroups:["whole-project","source-file"]});function Pm(e,t){return sk.get(e,t,()=>{let n=new Set,i=M(e,t);if(!i)return n;let o=i.replace(/<script\b[^>]*>[\s\S]*?<\/script>/g,s=>s.replace(/[^\r\n]/g," ")).replace(/<!--[\s\S]*?-->/g,s=>s.replace(/[^\r\n]/g," ")).replace(/\/\*[\s\S]*?\*\//g,s=>s.replace(/[^\r\n]/g," "));for(let s of o.matchAll(/[A-Za-z_$][\w$]*/g))n.add(s[0]);return n})}function mc(e,t,n){return rt(e,t,i=>ck(e,t,i),()=>ak(e,t,n))}function ak(e,t,n){return Sk(n).flatMap(i=>xk(e,t,i.clause,i.specifier,i.start,i.end,n))}function ck(e,t,n){let i=lk(e,t,n),r=[];for(let o of n.rootNode.descendantsOfType("import_statement"))r.push(...uk(e,t,n,o,i));return r}function lk(e,t,n){let i=ge(n,new Set(["import_statement"]));if(Ht(t))for(let r of Pm(e,t))i.add(r);return i}function uk(e,t,n,i,r){let o=gk(i);if(!o)return[];let s=ft(e,t,o),a=Ke(i,"import_clause");return a?dk(n,a,s,r,hk(i.text)):[_n("*",s)]}function dk(e,t,n,i,r){let o=[];for(let s of t.namedChildren)if(s.type==="identifier")o.push(mk(s.text,n,i,r));else if(s.type==="namespace_import"){let a=pk(e,s,n,i,r);a&&o.push(a)}else s.type==="named_imports"&&o.push(...fk(s,n,i,r));return o}function mk(e,t,n,i){return ue("default",e,t,n,"default",{isTypeOnly:i})}function pk(e,t,n,i,r){let s=Ke(t,"identifier")?.text??"";if(!s)return null;let a=bk(e,s);return An("*",n,{localName:s,usedMembers:a,isTypeOnly:r,used:a.length>0||i.has(s)})}function fk(e,t,n,i){let r=[];for(let o of e.namedChildren){if(o.type!=="import_specifier")continue;let s=o.namedChild(0),a=o.namedChild(1);if(!s)continue;let c=s.text,l=a?.text??c;r.push(ue(c,l,t,n,"named",{isTypeOnly:i||yk(o.text)}))}return r}function gk(e){let t=Ke(e,"string");if(!t)return null;let n=Ke(t,"string_fragment");return n?n.text:null}function hk(e){return/^\s*import\s+type\b/.test(e)}function yk(e){return/^\s*type\b/.test(e.trim())}function bk(e,t){let n=new Set;for(let i of e.rootNode.descendantsOfType("member_expression")){let r=i.namedChild(0),o=i.namedChild(1);!r||!o||r.type!=="identifier"||r.text!==t||(o.type==="property_identifier"||o.type==="identifier")&&n.add(o.text)}return[...n]}function Sk(e){let t=[],n=/^[ \t]*import\s+([\s\S]*?)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let r of e.matchAll(n)){let o=r[0],s=r[1],a=r[2];!o||!a||typeof r.index!="number"||t.push({clause:s,specifier:a,start:r.index,end:r.index+o.length})}let i=/^[ \t]*import\s+['"]([^'"]+)['"]\s*;?/gm;for(let r of e.matchAll(i)){let o=r[0],s=r[1];!o||!s||typeof r.index!="number"||t.push({clause:null,specifier:s,start:r.index,end:r.index+o.length})}return t.sort((r,o)=>r.start-o.start)}function xk(e,t,n,i,r,o,s){let a=ft(e,t,i),c=pn(s,r,o);return n?Ck(n).map(d=>({...d,sourcePath:a})).map(d=>{if(d.kind==="namespace"){let u=wi(c,d.localName);return An(d.importedName,d.sourcePath,{localName:d.localName,usedMembers:u,used:u.length>0||Be(c,d.localName),isTypeOnly:d.isTypeOnly})}return d.kind==="side-effect"?_n(d.importedName,d.sourcePath):Gt(d.importedName,d.localName??"",d.sourcePath,d.localName?Be(c,d.localName):!1,d.kind,[],{isTypeOnly:d.isTypeOnly})}):[_n("*",a)]}function Ck(e){let t=e.trim(),n=/^type\b/.test(t),i=t.replace(/^type\s+/,""),[r,o]=vk(i),s=[];return r&&s.push(...Im(r,n)),o&&s.push(...Im(o,n)),s}function Im(e,t){let n=e.trim();if(!n)return[];if(n.startsWith("{")){let i=n.slice(1,-1).trim();return i?He(i).map(r=>{let o=r.trim(),s=t||/^type\b/.test(o),a=o.replace(/^type\s+/,""),[c,l]=a.split(/\s+as\s+/);return{importedName:c.trim(),localName:(l??c).trim(),kind:"named",isTypeOnly:s}}):[]}return n.startsWith("* as ")?[{importedName:"*",localName:n.slice(5).trim(),kind:"namespace",isTypeOnly:t}]:[{importedName:"default",localName:n,kind:"default",isTypeOnly:t}]}function vk(e){let t=0;for(let n=0;n<e.length;n++){let i=e[n];if(i==="{"&&t++,i==="}"&&t--,i===","&&t===0)return[e.slice(0,n).trim(),e.slice(n+1).trim()]}return[e.trim(),null]}function pc(e,t,n){let i=Pe(e,t);return i?Lk(e,t,i):Rk(e,t,n)}function Rk(e,t,n){return[...kk(e,t,n),...wk(e,t,n),...Pk(e,t,n)]}function kk(e,t,n){let i=[],r=/^[ \t]*export\s+(?:type\s+)?\{([\s\S]*?)\}\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[1]??"",a=o[2]??"",c=He(s).map(u=>Ik(u.trim())).filter(u=>!!u),l=Pi(n,o.index),d=Pi(n,o.index+o[0].length-1);i.push({kind:"named",sourcePath:ft(e,t,a),names:c,startLine:l,endLine:d})}return i}function wk(e,t,n){let i=[],r=/^[ \t]*export\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[2]??"",a=Pi(n,o.index),c=Pi(n,o.index+o[0].length-1);i.push({kind:"star-as",sourcePath:ft(e,t,s),names:[],startLine:a,endLine:c})}return i}function Pk(e,t,n){let i=[],r=/^[ \t]*export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[1]??"",a=Pi(n,o.index),c=Pi(n,o.index+o[0].length-1);i.push({kind:"star",sourcePath:ft(e,t,s),names:[],startLine:a,endLine:c})}return i}function Ik(e){if(!e)return null;let t=e.replace(/^type\s+/,"").trim();if(!t)return null;let n=t.match(/^(\w+)\s+as\s+(\w+)$/);if(n)return n[2]??null;let i=t.match(/^(\w+)$/);return i?i[1]??null:null}function Pi(e,t){let n=0;for(let i=0;i<t&&i<e.length;i++)e.charCodeAt(i)===10&&n++;return n}function Lk(e,t,n){let i=[];for(let r of n.rootNode.descendantsOfType("export_statement")){let o=Dk(e,t,r);if(o===void 0)continue;let s=r.startPosition.row,a=r.endPosition.row,c=Ek(r,o,s,a);i.push(c)}return i}function Dk(e,t,n){let i=Ke(n,"string");if(!i)return;let r=Ke(i,"string_fragment");if(r)return ft(e,t,r.text)}function Ek(e,t,n,i){let r=Ke(e,"export_clause");if(r){let s=[];for(let a of r.namedChildren){if(a.type!=="export_specifier")continue;let c=a.namedChild(0),l=a.namedChild(1);c&&s.push((l??c).text)}return{kind:"named",sourcePath:t,names:s,startLine:n,endLine:i}}return Ke(e,"namespace_export")?{kind:"star-as",sourcePath:t,names:[],startLine:n,endLine:i}:{kind:"star",sourcePath:t,names:[],startLine:n,endLine:i}}function Lm(e,t,n){return Qo(e,t,{java:i=>Nk(e,t,i),kotlin:i=>Fk(e,t,i),scala:i=>Tk(e,t,i)},()=>it(n,/^[ \t]*import\s+(?:static\s+)?(.+?)\s*;?$/gm,(i,r)=>{let o=i[1]?.trim();return o?_k(e,t,o,r):[]}))}function Nk(e,t,n){let i=ge(n,new Set(["import_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.children.some(u=>u.type==="asterisk"),c=o.namedChildren.find(u=>u.type==="scoped_identifier")??o.namedChildren.find(u=>u.type==="identifier");if(!c)continue;let l=c.text;if(s){r.push(An("*",fe(e,l,Ge)));continue}let d=l.split(".").pop()??l;r.push(ue(d,d,fe(e,l,Ge),i))}return r}function Fk(e,t,n){let i=ge(n,new Set(["import_header","import_list"])),r=[];for(let o of n.rootNode.descendantsOfType("import_header")){let s=o.namedChildren.find(p=>p.type==="identifier");if(!s)continue;let a=o.namedChildren.some(p=>p.type==="wildcard_import"),c=o.namedChildren.find(p=>p.type==="import_alias");if(a){r.push(An("*",fe(e,s.text,Ge)));continue}let l=s.text,d=l.split(".").pop()??l,m=c?.namedChild(0)?.text??d;r.push(ue(d,m,fe(e,l,Ge),i))}return r}function Tk(e,t,n){let i=ge(n,new Set(["import_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.namedChildren.find(u=>u.type==="namespace_selectors"||u.type==="namespace_wildcard"),a=o.namedChildren.filter(u=>u!==s&&(u.type==="identifier"||u.type==="stable_identifier")),c=a.map(u=>u.text).join(".");if(!c)continue;if(s?.type==="namespace_wildcard"){r.push(An("*",fe(e,c,Ge)));continue}if(s?.type==="namespace_selectors"){for(let u of s.namedChildren)if(u.type==="arrow_renamed_identifier"){let[m,p]=u.namedChildren;if(!m)continue;let f=m.text,g=p?.text??f;if(f==="_")continue;r.push(ue(f,g,fe(e,`${c}.${f}`,Ge),i))}else if(u.type==="identifier"){let m=u.text;r.push(ue(m,m,fe(e,`${c}.${m}`,Ge),i))}continue}let l=a[a.length-1]?.text??c,d=a.slice(0,-1).map(u=>u.text).join(".")||c;r.push(ue(l,l,fe(e,d&&a.length>1?`${d}.${l}`:c,Ge),i))}return r}function _k(e,t,n,i){if(n.includes("{")&&n.includes("}")){let r=n.slice(0,n.indexOf("{")).replace(/\.$/,"").trim(),o=n.slice(n.indexOf("{")+1,n.lastIndexOf("}")).trim();return He(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.includes("=>")?a.split(/\s*=>\s*/):a.split(/\s+as\s+/),d=c?.trim();if(!d||d==="_")return[];let u=(l??d.split(".").pop()??d).trim(),m=d==="_"?r:`${r}.${d}`.replace(/\.\./g,".");return[wt(e,t,i,m,d,u)]})}return[wt(e,t,i,n,n.split(".").pop()??n,n.split(".").pop()??n)]}function Em(e,t,n){return rt(e,t,i=>Ak(e,t,i),()=>it(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(i,r)=>{let o=i[1]?.trim();return o?He(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.split(/\s+as\s+/i),d=c?.trim()??a,u=d.split("\\").pop()??d,m=(l??u).trim();return[wt(e,t,r,d,u,m,fe(e,d.replace(/\\/g,"."),Nn))]}):[]}))}function Ak(e,t,n){let i=ge(n,new Set(["namespace_use_declaration"])),r=[],o=(s,a,c)=>{r.push(ue(a,c,fe(e,s.replace(/\\/g,"."),Nn),i))};for(let s of n.rootNode.descendantsOfType("namespace_use_declaration")){let a=s.namedChildren.find(c=>c.type==="namespace_use_group");if(a){let c=s.namedChildren.find(l=>l.type==="namespace_name")?.text??"";for(let l of a.namedChildren){if(l.type!=="namespace_use_clause")continue;let{importedName:d,localName:u,qualified:m}=Dm(l,c);d&&o(m,d,u)}continue}for(let c of s.namedChildren){if(c.type!=="namespace_use_clause")continue;let{importedName:l,localName:d,qualified:u}=Dm(c,"");l&&o(u,l,d)}}return r}function Dm(e,t){let n=e.namedChildren.find(l=>l.type==="qualified_name"),i=e.namedChildren.filter(l=>l.type==="name"),r="";n?r=n.text:i.length>=1&&(r=i[0].text);let o=n&&i.length>0?i[i.length-1]:null,s=r.split("\\").pop()??r,a=o?.text??s,c=t?`${t}\\${r}`:r;return{importedName:s,localName:a,qualified:c}}function Fm(e,t,n){return rt(e,t,i=>Mk(e,t,i),()=>jk(n).flatMap(i=>Bk(e,t,i,n)))}function Mk(e,t,n){let i=ge(n,new Set(["import_statement","import_from_statement"])),r=[];for(let o of n.rootNode.descendantsOfType("import_statement"))for(let s of o.namedChildren){let a=Nm(s);if(!a)continue;let c=ki(e,t,a.qualifiedName);r.push({importedName:a.qualifiedName,localName:a.localName,sourcePath:c,kind:"namespace",used:i.has(a.localName),usedMembers:[]})}for(let o of n.rootNode.descendantsOfType("import_from_statement")){let s=o.namedChild(0);if(!s)continue;let a=$k(s);if(a===null)continue;let c=ki(e,t,a);for(let l=1;l<o.namedChildCount;l+=1){let d=o.namedChild(l);if(d.type==="wildcard_import"){r.push({importedName:"*",localName:null,sourcePath:c,kind:"side-effect",used:!0,usedMembers:[]});continue}let u=Nm(d);u&&r.push({importedName:u.qualifiedName,localName:u.localName,sourcePath:c,kind:"named",used:i.has(u.localName),usedMembers:[]})}}return r}function Nm(e){if(e.type==="aliased_import"){let t=e.namedChild(0),n=e.namedChild(1);return!t||!n?null:{qualifiedName:t.text,localName:n.text}}if(e.type==="dotted_name"){let t=e.text;return{qualifiedName:t,localName:t.split(".")[0]??t}}return e.type==="identifier"?{qualifiedName:e.text,localName:e.text}:null}function $k(e){if(e.type==="dotted_name")return e.text;if(e.type==="relative_import"){let t=Ke(e,"import_prefix")?.text??"",n=Ke(e,"dotted_name")?.text??"";return`${t}${n}`}return null}function jk(e){let t=e.split(`
|
|
72
|
+
`),n=[],i=0;for(let r=0;r<t.length;r++){let o=t[r],s=o.trimStart(),a=i;if(i+=o.length+1,!s.startsWith("import ")&&!s.startsWith("from "))continue;let c=o,l=a+o.length,d=br(o);for(;r+1<t.length&&(d>0||c.trimEnd().endsWith("\\"));){r++;let m=t[r];c+=`
|
|
73
|
+
${m}`,l+=1+m.length,d+=br(m),i+=m.length+1}let u=Ok(c);u&&n.push({...u,start:a,end:l})}return n}function Ok(e){let t=e.replace(/\\\s*\n/g," ").trim();if(t.startsWith("import "))return{kind:"import",module:null,clause:t.slice(7).trim()};let n=t.match(/^from\s+([.\w]+)\s+import\s+([\s\S]+)$/);if(!n)return null;let i=n[2].trim();return i.startsWith("(")&&i.endsWith(")")&&(i=i.slice(1,-1).trim()),{kind:"from",module:n[1],clause:i}}function Bk(e,t,n,i){let r=pn(i,n.start,n.end),o=n.clause.replace(/\n/g," ").trim();if(n.kind==="import")return He(o).flatMap(c=>{let l=c.trim().replace(/,$/,"");if(!l)return[];let[d,u]=l.split(/\s+as\s+/),m=d.trim(),p=(u??m.split(".")[0]??m).trim(),f=ki(e,t,m),g=wi(r,p);return[{importedName:m,localName:p,sourcePath:f,kind:"namespace",used:Be(r,p)||g.length>0,usedMembers:g}]});let s=n.module?ki(e,t,n.module):null,a=[];for(let c of He(o)){let l=c.trim().replace(/,$/,"");if(!l)continue;if(l==="*"){a.push({importedName:"*",localName:null,sourcePath:s,kind:"side-effect",used:!0,usedMembers:[]});continue}let[d,u]=l.split(/\s+as\s+/),m=(u??d).trim();a.push({importedName:d.trim(),localName:m,sourcePath:s,kind:"named",used:Be(r,m),usedMembers:[]})}return a}import{basename as Hk}from"path";function Tm(e,t,n){return rt(e,t,i=>qk(e,t,i),()=>Vk(e,t,n))}function Vk(e,t,n){return it(n,/^[ \t]*(require_relative|require)\s+["']([^"']+)["']\s*$/gm,(i,r)=>{let o=i[1],s=i[2];if(!o||!s)return[];let a=o==="require_relative"?Go(e,t,s):null;if(a){let c=_m(s);return[Gt(c,c,a,Be(r,c))]}return[_n(s,a)]})}function qk(e,t,n){let i=ge(n,new Set([])),r=[],o=new Set(["require","require_relative","load"]);for(let s of n.rootNode.descendantsOfType("call")){let a=s.namedChild(0);if(!a||a.type!=="identifier"||!o.has(a.text))continue;let l=s.namedChildren.find(p=>p.type==="argument_list")?.namedChild(0);if(!l||l.type!=="string")continue;let u=l.namedChildren.find(p=>p.type==="string_content")?.text;if(!u)continue;let m=a.text==="require_relative"?Go(e,t,u):null;if(m){let p=_m(u);r.push(ue(p,p,m,i))}else r.push(_n(u,m))}return r}function _m(e){return To(Hk(e).replace(/\.[^.]+$/,""),/_/)}function Am(e,t,n){return rt(e,t,i=>Uk(e,t,i),()=>it(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(i,r)=>{let o=i[1]?.trim();return o?zk(e,t,o,r):[]}))}function Uk(e,t,n){let i=ge(n,new Set(["use_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("use_declaration")){let s=o.namedChild(0);if(s)for(let a of Sr(s,"")){if(!a.importedName||a.importedName==="*")continue;let c=Wt(e,t,a.qualifiedName)??Wt(e,t,a.qualifiedName.split("::").slice(0,-1).join("::"));r.push(ue(a.importedName,a.localName,c,i))}}return r}function Sr(e,t){switch(e.type){case"identifier":case"super":case"self":case"crate":{let n=e.text;return[{qualifiedName:Yo(t,n),importedName:n,localName:n}]}case"scoped_identifier":{let n=e.text,i=n.split("::").pop()??n;return[{qualifiedName:Yo(t,n),importedName:i,localName:i}]}case"scoped_use_list":{let n=e.namedChild(0),i=e.namedChild(1);if(!n||!i)return[];let r=Yo(t,n.text),o=[];for(let s of i.namedChildren)o.push(...Sr(s,r));return o}case"use_list":{let n=[];for(let i of e.namedChildren)n.push(...Sr(i,t));return n}case"use_as_clause":{let n=e.namedChild(0),i=e.namedChild(1);if(!n||!i)return[];let r=Sr(n,t),o=i.text;return r.map(s=>({...s,localName:o}))}case"use_wildcard":{let n=e.namedChild(0),i=n?n.text:"";return[{qualifiedName:Yo(t,`${i}::*`),importedName:"*",localName:"*"}]}default:return[]}}function Yo(e,t){return e?t?`${e}::${t}`:e:t}function zk(e,t,n,i){let r=n.trim();if(r.includes("{")&&r.includes("}")){let d=r.slice(0,r.indexOf("{")).replace(/::$/,"").trim(),u=r.slice(r.indexOf("{")+1,r.lastIndexOf("}")).trim();return He(u).flatMap(m=>{let p=m.trim();if(!p||p==="self")return[];let[f,g]=p.split(/\s+as\s+/),b=f?.trim();if(!b)return[];let x=(g??b.split("::").pop()??b).trim(),S=`${d}::${b}`.replace(/::::/g,"::");return[wt(e,t,i,S,b.split("::").pop()??b,x,Wt(e,t,d))]})}let[o,s]=r.split(/\s+as\s+/),a=o?.trim()??r,c=(s??a.split("::").pop()??a).trim(),l=Wt(e,t,a)??Wt(e,t,a.split("::").slice(0,-1).join("::"));return[wt(e,t,i,a,a.split("::").pop()??a,c,l)]}function Mm(e,t,n){let i=Pe(e,t);if(i)return Wk(e,t,i);let r=[];for(let o of n.matchAll(/^[ \t]*pub\s+use\s+(.+?)\s*;$/gm)){let s=o[1]?.trim();s&&r.push(...Kk(e,t,s))}return r}function Wk(e,t,n){let i=[];for(let r of n.rootNode.descendantsOfType("use_declaration")){if(!Gk(r))continue;let o=r.namedChildren.find(s=>s.type!=="visibility_modifier");if(o)for(let s of Sr(o,""))s.importedName&&i.push(fc(e,t,s.qualifiedName))}return i}function Gk(e){for(let t of e.children)if(t.type==="visibility_modifier"&&t.text.startsWith("pub"))return!0;return!1}function Kk(e,t,n){let i=n.trim();if(i.includes("{")&&i.includes("}")){let r=i.slice(0,i.indexOf("{")).replace(/::$/,"").trim(),o=i.slice(i.indexOf("{")+1,i.lastIndexOf("}")).trim();return He(o).flatMap(s=>{let a=s.trim();if(!a||a==="self")return[];let[c]=a.split(/\s+as\s+/),l=`${r}::${c?.trim()??a}`.replace(/::::/g,"::");return[fc(e,t,l)]})}return[fc(e,t,i)]}function fc(e,t,n){return{specifier:n,sourcePath:Wt(e,t,n)??Wt(e,t,n.split("::").slice(0,-1).join("::"))}}function fn({language:e,extensions:t,imports:n,parseImports:i}){return{language:e,extensions:t,capabilities:{imports:n},parseImports:i}}function $m(e,t){let n=t.toLowerCase();for(let i of e)for(let r of i.extensions)if(n.endsWith(r))return i;return null}var Jk={language:"javascript",extensions:En,capabilities:{imports:"ast-with-regex-fallback",reExports:"ast-with-regex-fallback"},parseImports:mc,parseReExports:pc},Xk=fn({language:"python",extensions:Vo,imports:"ast-with-regex-fallback",parseImports:Fm}),Qk=fn({language:"jvm",extensions:Ge,imports:"ast-dispatch-with-regex-fallback",parseImports:Lm}),Yk={language:"rust",extensions:qo,capabilities:{imports:"ast-with-regex-fallback",exports:"ast-with-regex-fallback"},parseImports:Am,parseExports:Mm},Zk=fn({language:"ruby",extensions:Uo,imports:"ast-with-regex-fallback",parseImports:Tm}),ew=fn({language:"c/cpp",extensions:zo,imports:"ast-with-regex-fallback",parseImports:bm}),tw=fn({language:"dotnet",extensions:dn,imports:"ast-dispatch-with-regex-fallback",parseImports:wm}),nw={language:"dart",extensions:Wo,capabilities:{imports:"regex-only",exports:"regex-only"},parseImports:Rm,parseExports:km},iw=fn({language:"php",extensions:Nn,imports:"ast-with-regex-fallback",parseImports:Em}),rw=fn({language:"clojure",extensions:Ri,imports:"regex-only",parseImports:xm}),ow=[Jk,Xk,Qk,Yk,Zk,ew,tw,nw,iw,rw];function Zo(e){return $m(ow,e)}var gc={clearGroups:["whole-project","source-file"]},sw=W("source-imports",gc),aw=W("source-exports",gc),cw=W("source-reexports",gc),jm=pe({kind:"source-imports",serialize:lw,deserialize:uw}),Om=pe({kind:"source-reexports",serialize:dw,deserialize:mw});function xr(e,t){let n=pt(t);return cw.get(e,n,()=>{let i=Zo(n);if(!i?.parseReExports)return[];let r=M(e,n);if(!r)return[];let o=re(e,n,r),s=ic(e),a=Om.read(e,n,o);if(a?.resolutionFingerprint===s)return a.reExports;let c=i.parseReExports(e,n,r);return Om.write(e,n,o,{resolutionFingerprint:s,reExports:c}),c})}function oe(e,t){let n=pt(t);return sw.get(e,n,()=>{let i=Zo(n);if(!i)return[];let r=M(e,n);if(!r)return[];let o=re(e,n,r),s=ic(e),a=jm.read(e,n,o);if(a?.resolutionFingerprint===s)return a.imports;let c=i.parseImports(e,n,r);return jm.write(e,n,o,{resolutionFingerprint:s,imports:c}),c})}function es(e,t){let n=pt(t);return aw.get(e,n,()=>{let i=Zo(n);if(!i?.parseExports)return[];let r=M(e,n);return r?i.parseExports(e,n,r):[]})}function lw(e){return JSON.stringify(e)}function uw(e){try{let t=JSON.parse(e);return!kt(t)||typeof t.resolutionFingerprint!="string"||!Array.isArray(t.imports)?null:{resolutionFingerprint:t.resolutionFingerprint,imports:t.imports}}catch{return null}}function dw(e){return JSON.stringify(e)}function mw(e){try{let t=JSON.parse(e);return!kt(t)||typeof t.resolutionFingerprint!="string"||!Array.isArray(t.reExports)?null:{resolutionFingerprint:t.resolutionFingerprint,reExports:t.reExports}}catch{return null}}function gt(e){return{forFile(t,n){return Bm(e,t,n)},forFiles(t,n){let i=new Map;for(let r of t)i.set(r,Bm(e,r,n));return i}}}function Bm(e,t,n){let i={file:t},r=n.facts||n.identifiers;if(n.text&&(i.text=M(e,t)),n.lines&&(i.lines=Ye(e,t)),n.ast&&(i.ast=Pe(e,t)),n.imports&&(i.imports=oe(e,t)),n.reexports&&(i.reexports=xr(e,t)),r){let o=X(e,t);n.facts&&(i.facts=o),n.identifiers&&o&&(i.identifiers=o.fileIdentifiers,i.identifierLineMap=o.identifierLineMap)}return i}var pw={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function Ie(e){if(e.startsWith("local "))return{kind:"local",id:e.slice(6),raw:e};let t=e.split(" ");if(t.length<4)return{scheme:t[0]??"",manager:t[1]??"",packageName:t[2]??"",version:"",descriptors:[],raw:e};let n=t[0],i=t[1],r=e.slice(n.length+1+i.length+1),o;if(r.startsWith("`")){let l=r.indexOf("`",1);l===-1?(o=r.slice(1),r=""):(o=r.slice(1,l),r=r.slice(l+2))}else{let l=r.indexOf(" ");l===-1?(o=r,r=""):(o=r.slice(0,l),r=r.slice(l+1))}let s,a=r.indexOf(" ");a===-1?(s=r,r=""):(s=r.slice(0,a),r=r.slice(a+1));let c=fw(r);return{scheme:n,manager:i,packageName:o,version:s,descriptors:c,raw:e}}function It(e){let t=Ie(e);if("kind"in t)return null;for(let n=t.descriptors.length-2;n>=0;n--){let i=t.descriptors[n];if(i?.suffix==="type")return i.name}return null}function fw(e){let t=[],n=0;for(;n<e.length;){if(e[n]==="["){let o=e.indexOf("]",n+1);if(o===-1){t.push({name:e.slice(n+1),suffix:"type-param"});break}t.push({name:e.slice(n+1,o),suffix:"type-param"}),n=o+1;continue}if(e[n]==="("&&(t.length===0||n===0||Hm(e[n-1]))){let o=e.indexOf(")",n+1);if(o!==-1&&e[o+1]!=="."){t.push({name:e.slice(n+1,o),suffix:"parameter"}),n=o+1;continue}}let i;if(e[n]==="`"){let o=e.indexOf("`",n+1);if(o===-1){i=e.slice(n+1),t.push({name:i,suffix:"term"});break}i=e.slice(n+1,o),n=o+1}else{let o=n;for(;n<e.length&&!Hm(e[n]);)n++;i=e.slice(o,n)}if(n>=e.length){i&&t.push({name:i,suffix:"term"});break}let r=e[n];if(r==="("){let o=e.indexOf(")",n+1);o!==-1&&e[o+1]==="."?(t.push({name:i,suffix:"method"}),n=o+2):o!==-1?(t.push({name:i,suffix:"method"}),n=o+1):(t.push({name:i,suffix:"term"}),n++)}else{let o=pw[r];o&&t.push({name:i,suffix:o}),n+=1}}return t}function Hm(e){return e==="/"||e==="#"||e==="."||e==="("||e==="["||e===":"||e==="!"}function v(e){let t=Ie(e);if("kind"in t&&t.kind==="local")return`local:${t.id}`;let n=t;if(n.descriptors.length===0)return n.raw;let i=[];for(let r of n.descriptors){let o=gw(r);o&&i.push(o)}return i.join(":")}function gw(e){let t=e.suffix==="namespace"?hw(e.name):e.name;return t?e.suffix==="method"?`${t}()`:t:""}function hw(e){return e.replace(/\.(ts|tsx|js|jsx|mjs|cjs)$/,"").replace(/\.(py|pyi)$/,"").replace(/\.(rs)$/,"").replace(/\.(java|scala|kt|kts)$/,"").replace(/\.(rb)$/,"").replace(/\.(go)$/,"").replace(/\.(cs|vb)$/,"").replace(/\.(dart)$/,"").replace(/\.(php)$/,"").replace(/\.(c|cc|cpp|cxx|h|hpp)$/,"")}function $(e){let t=Ie(e);if("kind"in t&&t.kind==="local")return t.id;let n=t;return n.descriptors.length===0?"":n.descriptors[n.descriptors.length-1].name}function se(e){let t=Ie(e);if("kind"in t&&t.kind==="local")return null;let n=t;return n.descriptors[n.descriptors.length-1]?.suffix??null}function he(e){return e.endsWith("().")||se(e)==="method"}function de(e){let t=se(e);return t==="method"||t==="term"}function gn(e){return se(e)==="namespace"}var yw=/^rust-analyzer\b.*[\s/]impl#\[[^\]]+\]\[[^\]]+\]/;function ts(e){return yw.test(e)}var bw=new Set(["test","tests","_tests"]);function Ii(e){let t=Ie(e);if("kind"in t)return!1;for(let n=0;n<t.descriptors.length-1;n+=1){let i=t.descriptors[n];if(i?.suffix==="namespace"&&i.name&&bw.has(i.name))return!0}return!1}function Vm(e,t){let n=Ie(e),i=Ie(t);if("kind"in n||"kind"in i)return!1;let r=n.descriptors,o=i.descriptors;if(o.length!==r.length+1)return!1;for(let s=0;s<r.length;s++){let a=r[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function qm(e,t){let n=Ie(e),i=Ie(t);if("kind"in n||"kind"in i)return!1;let r=n.descriptors,o=i.descriptors;if(o.length<=r.length)return!1;for(let s=0;s<r.length;s++){let a=r[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function Li(e,t){return e.all(`SELECT gs.id, gs.symbol, der.document_id, der.start_line, der.end_line, d.relative_path, gs.display_name, gs.documentation
|
|
54
74
|
FROM global_symbols gs
|
|
55
75
|
JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
|
|
56
76
|
JOIN documents d ON der.document_id = d.id
|
|
57
77
|
WHERE ${t.where}
|
|
58
78
|
${e.pathExclusionsFor("d")}
|
|
59
|
-
${
|
|
60
|
-
${
|
|
79
|
+
${zm(t.orderBy)}
|
|
80
|
+
${Wm(t.limit)}`,...t.params??[])}function Di(e,t){return e.all(`SELECT
|
|
61
81
|
gs.id,
|
|
62
82
|
gs.symbol,
|
|
63
83
|
c.document_id,
|
|
@@ -74,8 +94,8 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
74
94
|
AND ${t.where}
|
|
75
95
|
${e.pathExclusionsFor("d")}
|
|
76
96
|
GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path, gs.display_name, gs.documentation
|
|
77
|
-
${
|
|
78
|
-
${
|
|
97
|
+
${zm(t.orderBy)}
|
|
98
|
+
${Wm(t.limit)}`,...t.params??[])}function zm(e){return e?`ORDER BY ${e}`:""}function Wm(e){return typeof e=="number"?`LIMIT ${e}`:""}function Mn(e){return!e||!e.trim()?null:e.replace(/^```\w*\s*/,"").replace(/\s*```$/,"").replace(/^\(method\)\s*/,"").replace(/^\(property\)\s*/,"").replace(/^\(function\)\s*/,"").replace(/^\(class\)\s*/,"").replace(/^\(interface\)\s*/,"").replace(/^\(enum\)\s*/,"").replace(/^\(type alias\)\s*/,"").replace(/^\(const\)\s*/,"").replace(/^\(var\)\s*/,"").trim()||null}function $n(e){if(!e)return null;let t=Um(e);if(t)return t.replace(/\n/g," ");let n=e.indexOf("|");if(n===-1)return e.replace(/\n/g," ");let i=e.slice(n+1);return(Um(i)??i).replace(/\n/g," ")}function Um(e){return/^```(?:\w+)?\s*\n?([\s\S]*?)\n?```/.exec(e.trimStart())?.[1]?.trim()||null}function Sw(e){if(It(e.symbol)!==null)return!1;let n=(e.documentation??"").replace(/^```\w*\s*/,"").replace(/\s*```$/,"").trim();return/^(?:var|let|const|function|class|interface|type|enum)\b/.test(n)}function jn(e,t,n={}){let i=new Map;for(let o of t)e.length>0&&!Sw(o)||i.set(o.id,o);for(let o of e)i.set(o.id,o);let r=[...i.values()];return n.sort?r.sort((o,s)=>o.start_line-s.start_line||o.end_line-s.end_line||o.symbol.localeCompare(s.symbol)):r}var xw=W("file-definitions",{clearGroups:["definition-catalog"]}),Cw=W("file-function-like-definitions",{clearGroups:["definition-catalog"]}),Gm=new WeakMap;function Q(e,t){return xw.get(e,t,()=>{let n=Qm(e,t);if(n)return n;let i=Ym(e,t),r=In(e),o=gt(e).forFile(t,{text:!0}).text;return r&&o&&Xm.write(e,t,re(e,t,o),{projectFingerprint:r,definitions:i.map(s=>({...s}))}),i})}function vw(e,t){return Cw.get(e,t,()=>{let n=Qm(e,t);return n?n.filter(i=>i.isFunctionLike):Ym(e,t,i=>i.isFunctionLike)})}var Xm=pe({kind:"file-definitions",serialize:Rw,deserialize:kw});function Qm(e,t){let n=In(e);if(!n)return null;let i=gt(e).forFile(t,{text:!0}).text;if(!i)return null;let r=Xm.read(e,t,re(e,t,i));return r?ww(r,n,t):null}function Rw(e){return JSON.stringify(e)}function kw(e){try{let t=JSON.parse(e);return!kt(t)||typeof t.projectFingerprint!="string"||!Array.isArray(t.definitions)?null:{projectFingerprint:t.projectFingerprint,definitions:t.definitions}}catch{return null}}function ww(e,t,n){if(e.projectFingerprint!==t)return null;let i=[];for(let r of e.definitions){let o=Pw(r,n);if(!o)return null;i.push(o)}return i}function Pw(e,t){return!kt(e)||typeof e.symbolId!="number"||typeof e.symbol!="string"||typeof e.documentId!="number"||typeof e.startLine!="number"||typeof e.endLine!="number"||e.relativePath!==t||typeof e.leaf!="string"||typeof e.parentTypeName!="string"&&e.parentTypeName!==null||typeof e.isFunctionLike!="boolean"||typeof e.isTypeLike!="boolean"||typeof e.kind!="number"&&e.kind!==null||typeof e.documentation!="string"&&e.documentation!==null||typeof e.enclosingSymbol!="string"&&e.enclosingSymbol!==null?null:{symbolId:e.symbolId,symbol:e.symbol,documentId:e.documentId,startLine:e.startLine,endLine:e.endLine,relativePath:e.relativePath,leaf:e.leaf,parentTypeName:e.parentTypeName,isFunctionLike:e.isFunctionLike,isTypeLike:e.isTypeLike,kind:e.kind,documentation:e.documentation,enclosingSymbol:e.enclosingSymbol}}function Ym(e,t,n){let i=jn(Iw(e,t),Lw(e,t),{sort:!0}).map(Zm);return n&&(i=i.filter(n)),np(e,t,i)}function Iw(e,t){return e.all(`SELECT
|
|
79
99
|
gs.id,
|
|
80
100
|
gs.symbol,
|
|
81
101
|
der.document_id,
|
|
@@ -91,7 +111,7 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
91
111
|
JOIN documents d ON der.document_id = d.id
|
|
92
112
|
WHERE d.relative_path = ?
|
|
93
113
|
${e.symbolNoiseFor("gs")}
|
|
94
|
-
ORDER BY der.start_line, der.end_line`,t)}function
|
|
114
|
+
ORDER BY der.start_line, der.end_line`,t)}function Lw(e,t){return e.all(`SELECT
|
|
95
115
|
gs.id,
|
|
96
116
|
gs.symbol,
|
|
97
117
|
c.document_id,
|
|
@@ -110,7 +130,7 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
110
130
|
AND m.role = 1
|
|
111
131
|
${e.symbolNoiseFor("gs")}
|
|
112
132
|
GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path
|
|
113
|
-
ORDER BY start_line, end_line`,t)}function
|
|
133
|
+
ORDER BY start_line, end_line`,t)}function Zm(e){return{symbolId:e.id,symbol:e.symbol,documentId:e.document_id,startLine:e.start_line,endLine:e.end_line,relativePath:e.relative_path,leaf:$(e.symbol),parentTypeName:It(e.symbol),isFunctionLike:de(e.symbol),isTypeLike:se(e.symbol)==="type",kind:e.kind??null,documentation:e.documentation??null,enclosingSymbol:e.enclosing_symbol??null}}function Lt(e,t={}){return hc(e,t.scope)}function hc(e,t){return O(e,{scope:t,includeIgnored:!1}).flatMap(n=>Q(e,n)).filter(n=>!e.isIgnored(n.relativePath))}function ep(e,t){return O(e,{scope:t,includeIgnored:!1}).flatMap(n=>vw(e,n)).filter(n=>!e.isIgnored(n.relativePath))}function Cr(e,t){let n=Km(Dw(e,t.scope,t.sqlPrefilter)),i=Km(Ew(e,t.scope,t.sqlPrefilter)),r=new Set([...n.keys(),...i.keys()]),o=[];for(let s of[...r].sort()){if(e.isIgnored(s))continue;let a=jn(n.get(s)??[],i.get(s)??[],{sort:!0}).filter(c=>t.symbolMatches(c.symbol));a.length!==0&&o.push(...np(e,s,a.map(Zm)))}return o}function Dw(e,t,n){let i=t?"AND d.relative_path LIKE ?":"",r=n?`AND ${tp("gs",n)}`:"",o=t?[`%${t}%`]:[];return e.all(`SELECT
|
|
114
134
|
gs.id,
|
|
115
135
|
gs.symbol,
|
|
116
136
|
der.document_id,
|
|
@@ -129,7 +149,7 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
129
149
|
${i}
|
|
130
150
|
${r}
|
|
131
151
|
${e.symbolNoiseFor("gs")}
|
|
132
|
-
ORDER BY d.relative_path, der.start_line, der.end_line`,...o)}function
|
|
152
|
+
ORDER BY d.relative_path, der.start_line, der.end_line`,...o)}function Ew(e,t,n){let i=t?"AND d.relative_path LIKE ?":"",r=n?`AND ${tp("gs",n)}`:"",o=t?[`%${t}%`]:[];return e.all(`SELECT
|
|
133
153
|
gs.id,
|
|
134
154
|
gs.symbol,
|
|
135
155
|
c.document_id,
|
|
@@ -150,11 +170,10 @@ import{program as ua}from"commander";import{realpathSync as lS}from"fs";import{f
|
|
|
150
170
|
${r}
|
|
151
171
|
${e.symbolNoiseFor("gs")}
|
|
152
172
|
GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path
|
|
153
|
-
ORDER BY d.relative_path, start_line, end_line`,...o)}function
|
|
154
|
-
AND `),o=
|
|
155
|
-
`)))}function ct(e){return e.replace(/\\/g,"/")}import{basename as qd}from"path";function Cn(e){return e.replace(/'''[\s\S]*?'''/g,Jt).replace(/"""[\s\S]*?"""/g,Jt).replace(/#.*$/gm,Jt).replace(/\/\/.*$/gm,Jt).replace(/\/\*[\s\S]*?\*\//g,Jt).replace(/`(?:\\[\s\S]|[^`])*`/g,Jt).replace(/'(?:\\.|[^'\\\r\n])*'/g,Jt).replace(/"(?:\\.|[^"\\\r\n])*"/g,Jt)}function Jt(e){return e.replace(/[^\r\n]/g," ")}var kU=dn("stripped-lines",{clearGroups:["whole-project","source-file"]});Vt({name:"stripped-source-singleton",groups:["whole-project","source-file"],clearAll:()=>{Mo=null,or=""},clearFile:()=>{Mo=null,or=""}});var Mo=null,or="";function Yv(e){return Mo===e||(Mo=e,or=Cn(e)),or}function Kt(e,t,n){let i=Yv(e);return`${i.slice(0,t)}${" ".repeat(n-t)}${i.slice(n)}`}function He(e,t){return new RegExp(`\\b${Vd(t)}\\b`,"m").test(e)}function Si(e,t){let n=new Set,i=new RegExp(`\\b${Vd(t)}\\s*\\.\\s*([A-Za-z_$][\\w$]*)`,"g");for(let r of e.matchAll(i)){let o=r[1];o&&n.add(o)}return[...n]}function Vd(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function sr(e){let t=0;for(let n of e)n==="("&&(t+=1),n===")"&&(t-=1);return t}var Zv=new Set(["identifier","type_identifier","property_identifier","shorthand_property_identifier","field_identifier"]);function Ve(e){let t=[],n=0,i=0;for(let r=0;r<e.length;r++){let o=e[r];(o==="{"||o==="["||o==="(")&&n++,(o==="}"||o==="]"||o===")")&&n--,o===","&&n===0&&(t.push(e.slice(i,r)),i=r+1)}return t.push(e.slice(i)),t}function ze(e,t){for(let n of e.namedChildren)if(n.type===t)return n;return null}function me(e,t){let n=new Set,i=(r,o)=>{let s=o||t.has(r.type);!s&&Zv.has(r.type)&&n.add(r.text);for(let a of r.children)i(a,s)};return i(e.rootNode,!1),n}function St(e,t,n,i,r,o,s){return{importedName:r,localName:o,sourcePath:s??de(e,i,Ea(t)),kind:"named",used:He(n,o),usedMembers:[]}}function oe(e,t,n,i,r="named",o={}){return{importedName:e,localName:t,sourcePath:n,kind:r,used:i.has(t),usedMembers:[],isTypeOnly:o.isTypeOnly}}function xi(e,t,n,i,r="named",o=[],s={}){return{importedName:e,localName:t,sourcePath:n,kind:r,used:i,usedMembers:o,isTypeOnly:s.isTypeOnly}}function vn(e,t){return{importedName:e,localName:null,sourcePath:t,kind:"side-effect",used:!0,usedMembers:[]}}function Rn(e,t,n={}){return{importedName:e,localName:n.localName??null,sourcePath:t,kind:"namespace",used:n.used??!0,usedMembers:n.usedMembers??[],isTypeOnly:n.isTypeOnly}}function Ye(e,t,n){let i=[];for(let r of e.matchAll(t)){let o=r[0];if(!o||typeof r.index!="number")continue;let s=Kt(e,r.index,r.index+o.length);for(let a of n(r,s))i.push(a)}return i}function Ze(e,t,n,i){let r=ke(e,t);if(r){let o=n(r);if(o)return o}return i()}function Oo(e,t,n,i){let r=ke(e,t),o=K(t),s=o?n[o]:void 0;return r&&s?s(r):i()}function Ud(e,t,n){return Ze(e,t,i=>tR(e,t,i),()=>eR(e,t,n))}function eR(e,t,n){return Ye(n,/^[ \t]*#include\s+[<"]([^">]+)[">]\s*$/gm,(i,r)=>{let o=i[1]?.trim();if(!o)return[];let s=qd(o).replace(/\.[^.]+$/,"");return[xi(o,s,Ao(e,t,o),He(r,s))]})}function tR(e,t,n){let i=me(n,new Set(["preproc_include"])),r=[];for(let o of n.rootNode.descendantsOfType("preproc_include")){let s=null;for(let c of o.namedChildren){if(c.type==="system_lib_string"){s=c.text.replace(/^<|>$/g,"");break}if(c.type==="string_literal"){s=c.namedChildren.find(u=>u.type==="string_content")?.text??c.text.replace(/^"|"$/g,"");break}}if(!s)continue;let a=qd(s).replace(/\.[^.]+$/,"");r.push(oe(s,a,Ao(e,t,s),i))}return r}function Wd(e,t,n){let i=[];for(let r of n.matchAll(/^[ \t]*import\s+['"]([^'"]+)['"](?:\s+as\s+([A-Za-z_]\w*))?[\s\S]*?;$/gm)){let o=r[1]?.trim(),s=r[2]?.trim()??null,a=r[0];if(!o||!a||typeof r.index!="number")continue;let c=Kt(n,r.index,r.index+a.length);i.push({importedName:o,localName:s,sourcePath:$o(e,t,o),kind:s?"namespace":"side-effect",used:s?He(c,s):!0,usedMembers:s?Si(c,s):[]})}return i}function zd(e,t,n){let i=[];for(let r of n.matchAll(/^[ \t]*export\s+['"]([^'"]+)['"][\s\S]*?;$/gm)){let o=r[1]?.trim();o&&i.push({specifier:o,sourcePath:$o(e,t,o)})}return i}function Gd(e,t,n){return Oo(e,t,{csharp:i=>iR(e,t,i),vb:i=>nR(e,t,i)},()=>{let i=Hd(t)?/^[ \t]*Imports\s+(.+?)\s*$/gm:/^[ \t]*using\s+(.+?)\s*;$/gm;return Ye(n,i,(r,o)=>{let s=r[1]?.trim();if(!s)return[];let[a,c]=s.split(/\s*=\s*/),l=!!c,u=(l?c:a)?.trim()??s,d=u.split(".").pop()??u,m=l?a?.trim()??d:d;return[St(e,t,o,u,d,m,de(e,u,zt))]})})}function nR(e,t,n){let i=me(n,new Set(["imports_statement"])),r=[];for(let o of n.rootNode.descendantsOfType("imports_statement")){let s=o.namedChildren.filter(m=>m.type==="namespace_name");if(s.length===0)continue;let a=s[s.length-1],c=s.length>1?s[0]:null,l=a.text,u=l.split(".").pop()??l,d=c?.text??u;r.push(oe(u,d,de(e,l,zt),i,c?"namespace":"named"))}return r}function iR(e,t,n){let i=me(n,new Set(["using_directive"])),r=[];for(let o of n.rootNode.descendantsOfType("using_directive")){let s=o.namedChildren;if(s.length===0)continue;let a=null,c;s.length>=2&&s[0].type==="identifier"&&(s[1].type==="qualified_name"||s[1].type==="identifier")?(a=s[0],c=s[1]):c=s[s.length-1];let l=c.text,u=l.split(".").pop()??l,d=a?.text??u;r.push(oe(u,d,de(e,l,zt),i,a?"namespace":"named"))}return r}var rR=U("vue-non-script-identifiers",{clearGroups:["whole-project","source-file"]});function Jd(e,t){return rR.get(e,t,()=>{let n=new Set,i=F(e,t);if(!i)return n;let o=i.replace(/<script\b[^>]*>[\s\S]*?<\/script>/g,s=>s.replace(/[^\r\n]/g," ")).replace(/<!--[\s\S]*?-->/g,s=>s.replace(/[^\r\n]/g," ")).replace(/\/\*[\s\S]*?\*\//g,s=>s.replace(/[^\r\n]/g," "));for(let s of o.matchAll(/[A-Za-z_$][\w$]*/g))n.add(s[0]);return n})}function _a(e,t,n){return Ze(e,t,i=>sR(e,t,i),()=>oR(e,t,n))}function oR(e,t,n){return yR(n).flatMap(i=>bR(e,t,i.clause,i.specifier,i.start,i.end,n))}function sR(e,t,n){let i=aR(e,t,n),r=[];for(let o of n.rootNode.descendantsOfType("import_statement"))r.push(...cR(e,t,n,o,i));return r}function aR(e,t,n){let i=me(n,new Set(["import_statement"]));if(Nt(t))for(let r of Jd(e,t))i.add(r);return i}function cR(e,t,n,i,r){let o=pR(i);if(!o)return[];let s=lt(e,t,o),a=ze(i,"import_clause");return a?lR(n,a,s,r,fR(i.text)):[vn("*",s)]}function lR(e,t,n,i,r){let o=[];for(let s of t.namedChildren)if(s.type==="identifier")o.push(uR(s.text,n,i,r));else if(s.type==="namespace_import"){let a=dR(e,s,n,i,r);a&&o.push(a)}else s.type==="named_imports"&&o.push(...mR(s,n,i,r));return o}function uR(e,t,n,i){return oe("default",e,t,n,"default",{isTypeOnly:i})}function dR(e,t,n,i,r){let s=ze(t,"identifier")?.text??"";if(!s)return null;let a=hR(e,s);return Rn("*",n,{localName:s,usedMembers:a,isTypeOnly:r,used:a.length>0||i.has(s)})}function mR(e,t,n,i){let r=[];for(let o of e.namedChildren){if(o.type!=="import_specifier")continue;let s=o.namedChild(0),a=o.namedChild(1);if(!s)continue;let c=s.text,l=a?.text??c;r.push(oe(c,l,t,n,"named",{isTypeOnly:i||gR(o.text)}))}return r}function pR(e){let t=ze(e,"string");if(!t)return null;let n=ze(t,"string_fragment");return n?n.text:null}function fR(e){return/^\s*import\s+type\b/.test(e)}function gR(e){return/^\s*type\b/.test(e.trim())}function hR(e,t){let n=new Set;for(let i of e.rootNode.descendantsOfType("member_expression")){let r=i.namedChild(0),o=i.namedChild(1);!r||!o||r.type!=="identifier"||r.text!==t||(o.type==="property_identifier"||o.type==="identifier")&&n.add(o.text)}return[...n]}function yR(e){let t=[],n=/^[ \t]*import\s+([\s\S]*?)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let r of e.matchAll(n)){let o=r[0],s=r[1],a=r[2];!o||!a||typeof r.index!="number"||t.push({clause:s,specifier:a,start:r.index,end:r.index+o.length})}let i=/^[ \t]*import\s+['"]([^'"]+)['"]\s*;?/gm;for(let r of e.matchAll(i)){let o=r[0],s=r[1];!o||!s||typeof r.index!="number"||t.push({clause:null,specifier:s,start:r.index,end:r.index+o.length})}return t.sort((r,o)=>r.start-o.start)}function bR(e,t,n,i,r,o,s){let a=lt(e,t,i),c=Kt(s,r,o);return n?SR(n).map(u=>({...u,sourcePath:a})).map(u=>{if(u.kind==="namespace"){let d=Si(c,u.localName);return Rn(u.importedName,u.sourcePath,{localName:u.localName,usedMembers:d,used:d.length>0||He(c,u.localName),isTypeOnly:u.isTypeOnly})}return u.kind==="side-effect"?vn(u.importedName,u.sourcePath):xi(u.importedName,u.localName??"",u.sourcePath,u.localName?He(c,u.localName):!1,u.kind,[],{isTypeOnly:u.isTypeOnly})}):[vn("*",a)]}function SR(e){let t=e.trim(),n=/^type\b/.test(t),i=t.replace(/^type\s+/,""),[r,o]=xR(i),s=[];return r&&s.push(...Kd(r,n)),o&&s.push(...Kd(o,n)),s}function Kd(e,t){let n=e.trim();if(!n)return[];if(n.startsWith("{")){let i=n.slice(1,-1).trim();return i?Ve(i).map(r=>{let o=r.trim(),s=t||/^type\b/.test(o),a=o.replace(/^type\s+/,""),[c,l]=a.split(/\s+as\s+/);return{importedName:c.trim(),localName:(l??c).trim(),kind:"named",isTypeOnly:s}}):[]}return n.startsWith("* as ")?[{importedName:"*",localName:n.slice(5).trim(),kind:"namespace",isTypeOnly:t}]:[{importedName:"default",localName:n,kind:"default",isTypeOnly:t}]}function xR(e){let t=0;for(let n=0;n<e.length;n++){let i=e[n];if(i==="{"&&t++,i==="}"&&t--,i===","&&t===0)return[e.slice(0,n).trim(),e.slice(n+1).trim()]}return[e.trim(),null]}function Aa(e,t,n){let i=ke(e,t);return i?IR(e,t,i):CR(e,t,n)}function CR(e,t,n){return[...vR(e,t,n),...RR(e,t,n),...kR(e,t,n)]}function vR(e,t,n){let i=[],r=/^[ \t]*export\s+(?:type\s+)?\{([\s\S]*?)\}\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[1]??"",a=o[2]??"",c=Ve(s).map(d=>wR(d.trim())).filter(d=>!!d),l=Ci(n,o.index),u=Ci(n,o.index+o[0].length-1);i.push({kind:"named",sourcePath:lt(e,t,a),names:c,startLine:l,endLine:u})}return i}function RR(e,t,n){let i=[],r=/^[ \t]*export\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[2]??"",a=Ci(n,o.index),c=Ci(n,o.index+o[0].length-1);i.push({kind:"star-as",sourcePath:lt(e,t,s),names:[],startLine:a,endLine:c})}return i}function kR(e,t,n){let i=[],r=/^[ \t]*export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(r)){if(typeof o.index!="number")continue;let s=o[1]??"",a=Ci(n,o.index),c=Ci(n,o.index+o[0].length-1);i.push({kind:"star",sourcePath:lt(e,t,s),names:[],startLine:a,endLine:c})}return i}function wR(e){if(!e)return null;let t=e.replace(/^type\s+/,"").trim();if(!t)return null;let n=t.match(/^(\w+)\s+as\s+(\w+)$/);if(n)return n[2]??null;let i=t.match(/^(\w+)$/);return i?i[1]??null:null}function Ci(e,t){let n=0;for(let i=0;i<t&&i<e.length;i++)e.charCodeAt(i)===10&&n++;return n}function IR(e,t,n){let i=[];for(let r of n.rootNode.descendantsOfType("export_statement")){let o=LR(e,t,r);if(o===void 0)continue;let s=r.startPosition.row,a=r.endPosition.row,c=DR(r,o,s,a);i.push(c)}return i}function LR(e,t,n){let i=ze(n,"string");if(!i)return;let r=ze(i,"string_fragment");if(r)return lt(e,t,r.text)}function DR(e,t,n,i){let r=ze(e,"export_clause");if(r){let s=[];for(let a of r.namedChildren){if(a.type!=="export_specifier")continue;let c=a.namedChild(0),l=a.namedChild(1);c&&s.push((l??c).text)}return{kind:"named",sourcePath:t,names:s,startLine:n,endLine:i}}return ze(e,"namespace_export")?{kind:"star-as",sourcePath:t,names:[],startLine:n,endLine:i}:{kind:"star",sourcePath:t,names:[],startLine:n,endLine:i}}function Qd(e,t,n){return Oo(e,t,{java:i=>PR(e,t,i),kotlin:i=>NR(e,t,i),scala:i=>ER(e,t,i)},()=>Ye(n,/^[ \t]*import\s+(?:static\s+)?(.+?)\s*;?$/gm,(i,r)=>{let o=i[1]?.trim();return o?TR(e,t,o,r):[]}))}function PR(e,t,n){let i=me(n,new Set(["import_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.children.some(d=>d.type==="asterisk"),c=o.namedChildren.find(d=>d.type==="scoped_identifier")??o.namedChildren.find(d=>d.type==="identifier");if(!c)continue;let l=c.text;if(s){r.push(Rn("*",de(e,l,We)));continue}let u=l.split(".").pop()??l;r.push(oe(u,u,de(e,l,We),i))}return r}function NR(e,t,n){let i=me(n,new Set(["import_header","import_list"])),r=[];for(let o of n.rootNode.descendantsOfType("import_header")){let s=o.namedChildren.find(p=>p.type==="identifier");if(!s)continue;let a=o.namedChildren.some(p=>p.type==="wildcard_import"),c=o.namedChildren.find(p=>p.type==="import_alias");if(a){r.push(Rn("*",de(e,s.text,We)));continue}let l=s.text,u=l.split(".").pop()??l,m=c?.namedChild(0)?.text??u;r.push(oe(u,m,de(e,l,We),i))}return r}function ER(e,t,n){let i=me(n,new Set(["import_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.namedChildren.find(d=>d.type==="namespace_selectors"||d.type==="namespace_wildcard"),a=o.namedChildren.filter(d=>d!==s&&(d.type==="identifier"||d.type==="stable_identifier")),c=a.map(d=>d.text).join(".");if(!c)continue;if(s?.type==="namespace_wildcard"){r.push(Rn("*",de(e,c,We)));continue}if(s?.type==="namespace_selectors"){for(let d of s.namedChildren)if(d.type==="arrow_renamed_identifier"){let[m,p]=d.namedChildren;if(!m)continue;let f=m.text,g=p?.text??f;if(f==="_")continue;r.push(oe(f,g,de(e,`${c}.${f}`,We),i))}else if(d.type==="identifier"){let m=d.text;r.push(oe(m,m,de(e,`${c}.${m}`,We),i))}continue}let l=a[a.length-1]?.text??c,u=a.slice(0,-1).map(d=>d.text).join(".")||c;r.push(oe(l,l,de(e,u&&a.length>1?`${u}.${l}`:c,We),i))}return r}function TR(e,t,n,i){if(n.includes("{")&&n.includes("}")){let r=n.slice(0,n.indexOf("{")).replace(/\.$/,"").trim(),o=n.slice(n.indexOf("{")+1,n.lastIndexOf("}")).trim();return Ve(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.includes("=>")?a.split(/\s*=>\s*/):a.split(/\s+as\s+/),u=c?.trim();if(!u||u==="_")return[];let d=(l??u.split(".").pop()??u).trim(),m=u==="_"?r:`${r}.${u}`.replace(/\.\./g,".");return[St(e,t,i,m,u,d)]})}return[St(e,t,i,n,n.split(".").pop()??n,n.split(".").pop()??n)]}function Yd(e,t,n){return Ze(e,t,i=>FR(e,t,i),()=>Ye(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(i,r)=>{let o=i[1]?.trim();return o?Ve(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.split(/\s+as\s+/i),u=c?.trim()??a,d=u.split("\\").pop()??u,m=(l??d).trim();return[St(e,t,r,u,d,m,de(e,u.replace(/\\/g,"."),xn))]}):[]}))}function FR(e,t,n){let i=me(n,new Set(["namespace_use_declaration"])),r=[],o=(s,a,c)=>{r.push(oe(a,c,de(e,s.replace(/\\/g,"."),xn),i))};for(let s of n.rootNode.descendantsOfType("namespace_use_declaration")){let a=s.namedChildren.find(c=>c.type==="namespace_use_group");if(a){let c=s.namedChildren.find(l=>l.type==="namespace_name")?.text??"";for(let l of a.namedChildren){if(l.type!=="namespace_use_clause")continue;let{importedName:u,localName:d,qualified:m}=Xd(l,c);u&&o(m,u,d)}continue}for(let c of s.namedChildren){if(c.type!=="namespace_use_clause")continue;let{importedName:l,localName:u,qualified:d}=Xd(c,"");l&&o(d,l,u)}}return r}function Xd(e,t){let n=e.namedChildren.find(l=>l.type==="qualified_name"),i=e.namedChildren.filter(l=>l.type==="name"),r="";n?r=n.text:i.length>=1&&(r=i[0].text);let o=n&&i.length>0?i[i.length-1]:null,s=r.split("\\").pop()??r,a=o?.text??s,c=t?`${t}\\${r}`:r;return{importedName:s,localName:a,qualified:c}}function em(e,t,n){return Ze(e,t,i=>_R(e,t,i),()=>$R(n).flatMap(i=>OR(e,t,i,n)))}function _R(e,t,n){let i=me(n,new Set(["import_statement","import_from_statement"])),r=[];for(let o of n.rootNode.descendantsOfType("import_statement"))for(let s of o.namedChildren){let a=Zd(s);if(!a)continue;let c=yi(e,t,a.qualifiedName);r.push({importedName:a.qualifiedName,localName:a.localName,sourcePath:c,kind:"namespace",used:i.has(a.localName),usedMembers:[]})}for(let o of n.rootNode.descendantsOfType("import_from_statement")){let s=o.namedChild(0);if(!s)continue;let a=AR(s);if(a===null)continue;let c=yi(e,t,a);for(let l=1;l<o.namedChildCount;l+=1){let u=o.namedChild(l);if(u.type==="wildcard_import"){r.push({importedName:"*",localName:null,sourcePath:c,kind:"side-effect",used:!0,usedMembers:[]});continue}let d=Zd(u);d&&r.push({importedName:d.qualifiedName,localName:d.localName,sourcePath:c,kind:"named",used:i.has(d.localName),usedMembers:[]})}}return r}function Zd(e){if(e.type==="aliased_import"){let t=e.namedChild(0),n=e.namedChild(1);return!t||!n?null:{qualifiedName:t.text,localName:n.text}}if(e.type==="dotted_name"){let t=e.text;return{qualifiedName:t,localName:t.split(".")[0]??t}}return e.type==="identifier"?{qualifiedName:e.text,localName:e.text}:null}function AR(e){if(e.type==="dotted_name")return e.text;if(e.type==="relative_import"){let t=ze(e,"import_prefix")?.text??"",n=ze(e,"dotted_name")?.text??"";return`${t}${n}`}return null}function $R(e){let t=e.split(`
|
|
156
|
-
`),
|
|
157
|
-
${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,end:l})}return n}function MR(e){let t=e.replace(/\\\s*\n/g," ").trim();if(t.startsWith("import "))return{kind:"import",module:null,clause:t.slice(7).trim()};let n=t.match(/^from\s+([.\w]+)\s+import\s+([\s\S]+)$/);if(!n)return null;let i=n[2].trim();return i.startsWith("(")&&i.endsWith(")")&&(i=i.slice(1,-1).trim()),{kind:"from",module:n[1],clause:i}}function OR(e,t,n,i){let r=Kt(i,n.start,n.end),o=n.clause.replace(/\n/g," ").trim();if(n.kind==="import")return Ve(o).flatMap(c=>{let l=c.trim().replace(/,$/,"");if(!l)return[];let[u,d]=l.split(/\s+as\s+/),m=u.trim(),p=(d??m.split(".")[0]??m).trim(),f=yi(e,t,m),g=Si(r,p);return[{importedName:m,localName:p,sourcePath:f,kind:"namespace",used:He(r,p)||g.length>0,usedMembers:g}]});let s=n.module?yi(e,t,n.module):null,a=[];for(let c of Ve(o)){let l=c.trim().replace(/,$/,"");if(!l)continue;if(l==="*"){a.push({importedName:"*",localName:null,sourcePath:s,kind:"side-effect",used:!0,usedMembers:[]});continue}let[u,d]=l.split(/\s+as\s+/),m=(d??u).trim();a.push({importedName:u.trim(),localName:m,sourcePath:s,kind:"named",used:He(r,m),usedMembers:[]})}return a}import{basename as jR}from"path";function tm(e,t,n){return Ze(e,t,i=>HR(e,t,i),()=>BR(e,t,n))}function BR(e,t,n){return Ye(n,/^[ \t]*(require_relative|require)\s+["']([^"']+)["']\s*$/gm,(i,r)=>{let o=i[1],s=i[2];if(!o||!s)return[];let a=o==="require_relative"?_o(e,t,s):null;if(a){let c=nm(s);return[xi(c,c,a,He(r,c))]}return[vn(s,a)]})}function HR(e,t,n){let i=me(n,new Set([])),r=[],o=new Set(["require","require_relative","load"]);for(let s of n.rootNode.descendantsOfType("call")){let a=s.namedChild(0);if(!a||a.type!=="identifier"||!o.has(a.text))continue;let l=s.namedChildren.find(p=>p.type==="argument_list")?.namedChild(0);if(!l||l.type!=="string")continue;let d=l.namedChildren.find(p=>p.type==="string_content")?.text;if(!d)continue;let m=a.text==="require_relative"?_o(e,t,d):null;if(m){let p=nm(d);r.push(oe(p,p,m,i))}else r.push(vn(d,m))}return r}function nm(e){return bo(jR(e).replace(/\.[^.]+$/,""),/_/)}function im(e,t,n){return Ze(e,t,i=>VR(e,t,i),()=>Ye(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(i,r)=>{let o=i[1]?.trim();return o?qR(e,t,o,r):[]}))}function VR(e,t,n){let i=me(n,new Set(["use_declaration"])),r=[];for(let o of n.rootNode.descendantsOfType("use_declaration")){let s=o.namedChild(0);if(s)for(let a of ar(s,"")){if(!a.importedName||a.importedName==="*")continue;let c=Ft(e,t,a.qualifiedName)??Ft(e,t,a.qualifiedName.split("::").slice(0,-1).join("::"));r.push(oe(a.importedName,a.localName,c,i))}}return r}function ar(e,t){switch(e.type){case"identifier":case"super":case"self":case"crate":{let n=e.text;return[{qualifiedName:jo(t,n),importedName:n,localName:n}]}case"scoped_identifier":{let n=e.text,i=n.split("::").pop()??n;return[{qualifiedName:jo(t,n),importedName:i,localName:i}]}case"scoped_use_list":{let n=e.namedChild(0),i=e.namedChild(1);if(!n||!i)return[];let r=jo(t,n.text),o=[];for(let s of i.namedChildren)o.push(...ar(s,r));return o}case"use_list":{let n=[];for(let i of e.namedChildren)n.push(...ar(i,t));return n}case"use_as_clause":{let n=e.namedChild(0),i=e.namedChild(1);if(!n||!i)return[];let r=ar(n,t),o=i.text;return r.map(s=>({...s,localName:o}))}case"use_wildcard":{let n=e.namedChild(0),i=n?n.text:"";return[{qualifiedName:jo(t,`${i}::*`),importedName:"*",localName:"*"}]}default:return[]}}function jo(e,t){return e?t?`${e}::${t}`:e:t}function qR(e,t,n,i){let r=n.trim();if(r.includes("{")&&r.includes("}")){let u=r.slice(0,r.indexOf("{")).replace(/::$/,"").trim(),d=r.slice(r.indexOf("{")+1,r.lastIndexOf("}")).trim();return Ve(d).flatMap(m=>{let p=m.trim();if(!p||p==="self")return[];let[f,g]=p.split(/\s+as\s+/),y=f?.trim();if(!y)return[];let S=(g??y.split("::").pop()??y).trim(),R=`${u}::${y}`.replace(/::::/g,"::");return[St(e,t,i,R,y.split("::").pop()??y,S,Ft(e,t,u))]})}let[o,s]=r.split(/\s+as\s+/),a=o?.trim()??r,c=(s??a.split("::").pop()??a).trim(),l=Ft(e,t,a)??Ft(e,t,a.split("::").slice(0,-1).join("::"));return[St(e,t,i,a,a.split("::").pop()??a,c,l)]}function rm(e,t,n){let i=ke(e,t);if(i)return UR(e,t,i);let r=[];for(let o of n.matchAll(/^[ \t]*pub\s+use\s+(.+?)\s*;$/gm)){let s=o[1]?.trim();s&&r.push(...zR(e,t,s))}return r}function UR(e,t,n){let i=[];for(let r of n.rootNode.descendantsOfType("use_declaration")){if(!WR(r))continue;let o=r.namedChildren.find(s=>s.type!=="visibility_modifier");if(o)for(let s of ar(o,""))s.importedName&&i.push($a(e,t,s.qualifiedName))}return i}function WR(e){for(let t of e.children)if(t.type==="visibility_modifier"&&t.text.startsWith("pub"))return!0;return!1}function zR(e,t,n){let i=n.trim();if(i.includes("{")&&i.includes("}")){let r=i.slice(0,i.indexOf("{")).replace(/::$/,"").trim(),o=i.slice(i.indexOf("{")+1,i.lastIndexOf("}")).trim();return Ve(o).flatMap(s=>{let a=s.trim();if(!a||a==="self")return[];let[c]=a.split(/\s+as\s+/),l=`${r}::${c?.trim()??a}`.replace(/::::/g,"::");return[$a(e,t,l)]})}return[$a(e,t,i)]}function $a(e,t,n){return{specifier:n,sourcePath:Ft(e,t,n)??Ft(e,t,n.split("::").slice(0,-1).join("::"))}}function kn({language:e,extensions:t,imports:n,parseImports:i}){return{language:e,extensions:t,capabilities:{imports:n},parseImports:i}}function om(e,t){let n=t.toLowerCase();for(let i of e)for(let r of i.extensions)if(n.endsWith(r))return i;return null}var GR={language:"javascript",extensions:Sn,capabilities:{imports:"ast-with-regex-fallback",reExports:"ast-with-regex-fallback"},parseImports:_a,parseReExports:Aa},JR=kn({language:"python",extensions:Po,imports:"ast-with-regex-fallback",parseImports:em}),KR=kn({language:"jvm",extensions:We,imports:"ast-dispatch-with-regex-fallback",parseImports:Qd}),QR={language:"rust",extensions:No,capabilities:{imports:"ast-with-regex-fallback",exports:"ast-with-regex-fallback"},parseImports:im,parseExports:rm},XR=kn({language:"ruby",extensions:Eo,imports:"ast-with-regex-fallback",parseImports:tm}),YR=kn({language:"c/cpp",extensions:To,imports:"ast-with-regex-fallback",parseImports:Ud}),ZR=kn({language:"dotnet",extensions:zt,imports:"ast-dispatch-with-regex-fallback",parseImports:Gd}),ek={language:"dart",extensions:Fo,capabilities:{imports:"regex-only",exports:"regex-only"},parseImports:Wd,parseExports:zd},tk=kn({language:"php",extensions:xn,imports:"ast-with-regex-fallback",parseImports:Yd}),nk=[GR,JR,KR,QR,XR,YR,ZR,ek,tk];function Bo(e){return om(nk,e)}var Ma={clearGroups:["whole-project","source-file"]},ik=U("source-imports",Ma),rk=U("source-exports",Ma),ok=U("source-reexports",Ma);function cr(e,t){let n=ct(t);return ok.get(e,n,()=>{let i=Bo(n);if(!i?.parseReExports)return[];let r=F(e,n);if(!r)return[];let o=Z(e,n,r),s=Fa(e),a=ae(e,"source-reexports",n,o);if(a!==null)try{let l=JSON.parse(a);if(l.resolutionFingerprint===s&&Array.isArray(l.reExports))return l.reExports}catch{}let c=i.parseReExports(e,n,r);return ce(e,"source-reexports",n,o,JSON.stringify({resolutionFingerprint:s,reExports:c})),c})}function Ie(e,t){let n=ct(t);return ik.get(e,n,()=>{let i=Bo(n);if(!i)return[];let r=F(e,n);if(!r)return[];let o=Z(e,n,r),s=Fa(e),a=ae(e,"source-imports",n,o);if(a!==null)try{let l=JSON.parse(a);if(l.resolutionFingerprint===s&&Array.isArray(l.imports))return l.imports}catch{}let c=i.parseImports(e,n,r);return ce(e,"source-imports",n,o,JSON.stringify({resolutionFingerprint:s,imports:c})),c})}function Ho(e,t){let n=ct(t);return rk.get(e,n,()=>{let i=Bo(n);if(!i?.parseExports)return[];let r=F(e,n);return r?i.parseExports(e,n,r):[]})}var sk=U("file-dep-graph",{clearGroups:["whole-project"]});function pe(e,t){return sk.get(e,t??"",()=>{let n=new Map,i=new Set(B(e,{includeIgnored:!1})),r=(o,s)=>ck(e,n,i,o,s);for(let o of ak(e,t))r(o.from_file,o.to_file);for(let o of i)if(!(t&&!o.includes(t)))for(let s of Ie(e,o))s.sourcePath&&r(o,s.sourcePath);return n})}function ak(e,t){let n=t?`AND d1.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT
|
|
173
|
+
ORDER BY d.relative_path, start_line, end_line`,...o)}function Nw(e){return`(${e}.symbol LIKE '%().' OR ${e}.symbol LIKE '%()')`}function tp(e,t){return t==="callable"?Nw(e):Fw(e)}function Fw(e){return`(${e}.symbol LIKE '%.' OR ${e}.symbol LIKE '%()')`}function Km(e){let t=new Map;for(let n of e){let i=t.get(n.relative_path);i?i.push(n):t.set(n.relative_path,[n])}return t}function ns(e,t,n={}){if(t.length===0)return[];let i=t.flatMap(r=>Q(e,r)).filter(r=>!e.isIgnored(r.relativePath));return n.onlyDocumented&&(i=i.filter(r=>r.documentation!==null&&r.documentation!=="")),n.sort&&(i=i.sort((r,o)=>r.relativePath.localeCompare(o.relativePath)||r.startLine-o.startLine||r.endLine-o.endLine)),i.map(r=>({startLine:r.startLine,endLine:r.endLine,symbol:r.symbol,shortName:v(r.symbol),signature:Mn($n(r.documentation)),relativePath:r.relativePath,enclosingSymbol:r.enclosingSymbol}))}function yc(e){let t=new Map,n=e.map((i,r)=>({definition:i,index:r,span:i.endLine-i.startLine})).sort((i,r)=>i.span-r.span||i.index-r.index);for(let{definition:i}of n)for(let r=i.startLine;r<=i.endLine;r+=1)t.has(r)||t.set(r,i);return t}function ot(e,t){let n=Gm.get(e);return n||(n=yc(e),Gm.set(e,n)),n.get(t)??null}function On(e,t){let n=Q(e,t.relative_path).find(i=>i.symbolId===t.id);return n?{symbolId:n.symbolId,symbol:n.symbol,documentId:n.documentId,startLine:n.startLine,endLine:n.endLine,relativePath:n.relativePath}:{symbolId:t.id,symbol:t.symbol,documentId:t.document_id,startLine:t.start_line,endLine:t.end_line,relativePath:t.relative_path}}function np(e,t,n){let i=gt(e).forFile(t,{text:!0}).text,r=za(e,t);return r?jw(n,r,i):i?Tw(n,i):n}function Tw(e,t){let n=t.split(/\r?\n/),i=_w(e,n),r=Aw(e,i),o=Mw(r,n);return $w(e,o)}function _w(e,t){let n=e.some(r=>is(r.symbol))?Hw(t):null,i=new Map;for(let r of e)i.set(r.symbolId,Bw(t,n,r));return i}function Aw(e,t){return e.filter(n=>is(n.symbol)).map(n=>({definition:n,startLine:t.get(n.symbolId)??n.startLine})).sort((n,i)=>n.startLine-i.startLine||n.definition.startLine-i.definition.startLine||n.definition.symbol.localeCompare(i.definition.symbol))}function Mw(e,t){let n=new Map;for(let i=0;i<e.length;i+=1){let r=e[i],o=e[i+1],s=o?Math.max(r.startLine,o.startLine-1):t.length-1;n.set(r.definition.symbolId,{startLine:r.startLine,endLine:Vw(t,r.definition,r.startLine,s)})}return n}function $w(e,t){return e.map(n=>{let i=t.get(n.symbolId);return i?{...n,startLine:i.startLine,endLine:i.endLine}:n})}function jw(e,t,n=null){let i=new Map;for(let r of t){let o=i.get(r.name);o?o.push(r):i.set(r.name,[r])}return e.map(r=>{if(!Ow(r)||!r.leaf)return Jm(r,n);let o=i.get(r.leaf);if(!o||o.length===0)return Jm(r,n);let s=o[0],a=Math.abs(s.startLine-r.startLine);for(let c=1;c<o.length;c+=1){let l=o[c],d=Math.abs(l.startLine-r.startLine);d<a&&(s=l,a=d)}return{...r,startLine:s.startLine,endLine:s.endLine}})}function Ow(e){return is(e.symbol)?!0:se(e.symbol)==="term"&&It(e.symbol)===null}function Jm(e,t){if(!t||!e.leaf||se(e.symbol)!=="term"||It(e.symbol)!==null)return e;let n=e.leaf.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`\\b(?:export\\s+)?(?:const|let|var)\\s+${n}\\b`),o=t.split(/\r?\n/).findIndex(s=>i.test(s));return o>=0?{...e,startLine:o,endLine:o}:e}function Bw(e,t,n){if(!is(n.symbol))return n.startLine;let i=Math.max(0,Math.min(n.startLine,e.length-1));if(!t)return i;let r=t.get(n.leaf);if(!r||r.length===0)return i;let o=null;for(let s of r){let a=Math.abs(s-n.startLine);(!o||a<o.distance)&&(o={line:s,distance:a})}return o?.line??i}function Hw(e){let t=/\b(?:function|def|fn)\s+([A-Za-z_$][\w$]*)/g,n=/\b([A-Za-z_$][\w$]*)\s*[:=]\s*(?:async\s*)?(?:function\b|\()/g,i=/^\s*(?:(?:export|public|private|protected|static|readonly|async|abstract|get|set)\s+)*([A-Za-z_$][\w$]*)\s*(?:<[^(]*>)?\s*\(/,r=/\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<e.length;a+=1){let c=e[a]??"";for(let d of c.matchAll(t))d[1]&&s(d[1],a);for(let d of c.matchAll(n))d[1]&&s(d[1],a);let l=c.match(i);l?.[1]&&s(l[1],a);for(let d of c.matchAll(r))d[1]&&s(d[1],a)}return o}function Vw(e,t,n,i){let r=Math.max(n,Math.min(e.length-1,i)),o=Math.max(n,Math.min(r,t.endLine)),s=0,a=0,c=!1;for(let l=n;l<=r;l+=1){let d=qw(e[l]??"");for(let u of d)u==="{"?(s+=1,c=!0):u==="}"?s=Math.max(0,s-1):u==="("?a+=1:u===")"&&(a=Math.max(0,a-1));if(c&&s===0||!c&&a===0&&l>=o)return l}return o}function qw(e){let t="",n=null,i=!1;for(let r=0;r<e.length;r+=1){let o=e[r],s=e[r+1];if(!n&&o==="/"&&s==="/"){t+=" ".repeat(e.length-r);break}if(n){if(i){i=!1,t+=" ";continue}if(o==="\\"){i=!0,t+=" ";continue}o===n&&(n=null),t+=" ";continue}if(o==='"'||o==="'"||o==="`"){n=o,t+=" ";continue}t+=o}return t}function is(e){return e.includes("().")}function rs(e){let t=Ie(e);if("kind"in t)return[];let n=[];for(let i=t.descriptors.length-2;i>=0;i-=1){let r=t.descriptors[i];r?.suffix==="type"&&r.name&&n.push(r.name)}return n}import{existsSync as iP}from"fs";import{basename as ip,isAbsolute as rP,join as oP}from"path";function q(e,t){let n=Ni(e,t.trim());if(n)return n;let i=Jw(e,t);if(i)return i;let r=Uw(e,t);return r||Kw(e,t)}function Uw(e,t){let n=Sc(t),i=bc(n);if(!i)return null;let r=`%${i.path}%`,o=i.leaf,a=zw(e,r,o,n)[0];return a?On(e,a):null}function zw(e,t,n,i){let r=jn([],[...Ww(e,t,n),...Gw(e,t,n)]).filter(o=>!e.isIgnored(o.relative_path)).filter(o=>Ei(o,i)>1);return r.sort((o,s)=>Ei(s,i)-Ei(o,i)||o.end_line-o.start_line-(s.end_line-s.start_line)||o.start_line-s.start_line||o.symbol.localeCompare(s.symbol)),r}function Ww(e,t,n){return Li(e,{where:"d.relative_path LIKE ? AND (gs.display_name = ? OR gs.symbol LIKE ?)",params:[t,n,`%/${n}.%`]})}function Gw(e,t,n){return Di(e,{where:"d.relative_path LIKE ? AND (gs.display_name = ? OR gs.symbol LIKE ?)",params:[t,n,`%/${n}.%`]})}function Kw(e,t){let n=Sc(t),i=tP(t),r=Zw(e,i),o=nP(r,t,n);if(o&&!e.isIgnored(o.relative_path))return On(e,o);let s=null;for(let a of r){if(e.isIgnored(a.relative_path))continue;let c=eP(a,t,n,i);c<=0||(!s||c>s.score)&&(s={row:a,score:c})}return s?On(e,s.row):null}function Jw(e,t){let n=t.match(/^(.+):(\d+)-(\d+)$/);if(!n)return null;let[,i,r,o]=n,s=Math.max(0,parseInt(r,10)-1),a=Math.max(s,parseInt(o,10)-1),c=Xw(e,i,s,a)??Qw(e,i,s,a);return c&&!e.isIgnored(c.relative_path)?On(e,c):null}function Xw(e,t,n,i){return Li(e,{where:"d.relative_path LIKE ? AND der.start_line <= ? AND der.end_line >= ?",params:[`%${t}%`,n,i],orderBy:"(der.end_line - der.start_line) ASC",limit:1})[0]}function Qw(e,t,n,i){return Di(e,{where:"d.relative_path LIKE ? AND c.start_line <= ? AND c.end_line >= ?",params:[`%${t}%`,n,i],orderBy:"(MAX(c.end_line) - MIN(c.start_line)) ASC",limit:1})[0]}function Ni(e,t){let i=Li(e,{where:"gs.symbol = ?",params:[t],orderBy:"d.relative_path, der.start_line",limit:1})[0]??Di(e,{where:"gs.symbol = ?",params:[t],orderBy:"d.relative_path, start_line",limit:1})[0];return!i||e.isIgnored(i.relative_path)?null:On(e,i)}function os(e,t){if("symbol"in t&&"relativePath"in t)return t;let n=Yw(e,t.symbolId)[0];return n?On(e,n):null}function Yw(e,t){let n=Li(e,{where:"gs.id = ?",params:[t],orderBy:"der.start_line, der.end_line"}),i=Di(e,{where:"gs.id = ?",params:[t],orderBy:"start_line, end_line"});return jn(n,i)}function Zw(e,t){let n=t.map(()=>"(gs.symbol LIKE ? OR d.relative_path LIKE ? OR COALESCE(gs.display_name, '') LIKE ?)"),i=t.flatMap(a=>{let c=`%${a}%`;return[c,c,c]}),r=n.join(`
|
|
174
|
+
AND `),o=Li(e,{where:r,params:i,limit:200}),s=Di(e,{where:r,params:i,limit:200});return jn(o,s)}function eP(e,t,n,i){let r=t.trim(),o=n,s=o.replace(/\(\)$/,""),a=t.toLowerCase(),c=n.toLowerCase(),l=c.replace(/\(\)$/,""),d=e.symbol,u=v(e.symbol),m=$(e.symbol),p=e.display_name??"",f=e.symbol.toLowerCase(),g=u.toLowerCase(),b=m.toLowerCase(),x=p.toLowerCase(),S=e.relative_path.toLowerCase(),R=/[/:.]/.test(n),C=bc(n),y=C?.leaf.toLowerCase(),w=0;return(d===r||d===o)&&(w+=1150),(u===r||u===o)&&(w+=1100),p===s&&(w+=1180),m===s&&(w+=1160),(`${m}()`===r||`${m}()`===o)&&(w+=955),(f===a||f===c)&&(w+=1e3),(g===a||g===c)&&(w+=950),(S===a||S===c)&&(w+=925),(S.endsWith(`/${c}`)||S.endsWith(`/${a}`))&&(w+=875),x===l&&(w+=850),b===l&&(w+=825),(`${b}()`===a||`${b}()`===c)&&(w+=820),(g.endsWith(`:${c}`)||g.endsWith(`:${l}`)||g.endsWith(`:${l}()`))&&(w+=800),f.includes(c)&&(w+=120),g.includes(c)&&(w+=140),S.includes(c)&&(w+=140),x.includes(c)&&(w+=110),i.every(L=>{let k=L.toLowerCase();return f.includes(k)||g.includes(k)||S.includes(k)||x.includes(k)})&&(w+=100+i.length*15),C&&S.includes(C.path.toLowerCase())&&(w+=360,y&&(b===y||`${b}()`===y||`${b}()`==`${y}()`)&&(w+=700),he(e.symbol)&&(w+=180)),de(e.symbol)&&b===l&&(w+=60),!R&&gn(e.symbol)&&(w-=160),w-=Math.min(50,Math.max(0,e.end_line-e.start_line)),w}function bc(e){let t=e.trim().replace(/\\/g,"/"),n=t.lastIndexOf("/");if(n<=0||n===t.length-1)return null;let i=t.slice(n+1).replace(/\(\)$/,"");return!i||i.includes(".")?null:{path:t.slice(0,n),leaf:i}}function Sc(e){return e.trim().replace(/\(\)$/,"").replace(/\(.*$/,"")}function tP(e){let t=Sc(e),n=t.split(/[^A-Za-z0-9_]+/).map(i=>i.trim()).filter(i=>i.length>0);return n.length>0?[...new Set(n)]:[t]}function nP(e,t,n){let i=t.trim(),r=e.filter(o=>{let s=v(o.symbol),a=(o.display_name??"").trim();return o.symbol===i||s===i||s===n||a===i||a===n||`${a}()`===i||Ei(o,n)>1||o.relative_path===i});return r.length===0?null:(r.sort((o,s)=>Ei(s,n)-Ei(o,n)||o.end_line-o.start_line-(s.end_line-s.start_line)||o.relative_path.localeCompare(s.relative_path)||o.symbol.localeCompare(s.symbol)),r[0]??null)}function Ei(e,t){let n=bc(t);if(!n)return 0;let i=e.relative_path.toLowerCase(),r=$(e.symbol).toLowerCase(),o=n.path.toLowerCase(),s=n.leaf.toLowerCase();return i.includes(o)?r!==s?1:he(e.symbol)?It(e.symbol)===null?5:4:It(e.symbol)===null?3:2:0}function Ve(e,t){let n=rp(e,t,{allowMultiple:!1})[0]?.relativePath;return n||sP(e,t)}function Fi(e,t){return rp(e,t,{allowMultiple:!0}).map(n=>n.relativePath)}function sP(e,t){if(!t)return null;let n=t.replace(/\\/g,"/").replace(/^\.\//,""),i=rP(n)&&n.startsWith(e.config.projectRoot)?n.slice(e.config.projectRoot.length).replace(/^\/+/,""):n,r=oP(e.config.projectRoot,i);return iP(r)?i:null}function rp(e,t,n){let i=op(t);if(!i)return[];let r=O(e,{includeIgnored:!1}).map(a=>({relativePath:a,score:aP(a,i)})).filter(a=>a.score>0).sort((a,c)=>c.score-a.score||a.relativePath.localeCompare(c.relativePath));if(r.length===0){let a=q(e,t);return!a||e.isIgnored(a.relativePath)?[]:[{relativePath:a.relativePath,score:700}]}let o=r.filter(a=>a.score>=1100);if(o.length>0)return n.allowMultiple?o:[o[0]];let s=r.filter(a=>a.score>=800);return s.length>0?n.allowMultiple?s:[s[0]]:n.allowMultiple?r:[r[0]]}function aP(e,t){let n=op(e),i=ip(n),r=ip(t),o=0;return n===t&&(o+=1200),n.endsWith(`/${t}`)&&(o+=1100),i===r&&(o+=900),n.startsWith(`${t}/`)&&(o+=850),n.includes(t)&&(o+=250),o}function op(e){return e.trim().replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"")}import{basename as ML}from"path";import{appendFileSync as cP,mkdirSync as lP}from"fs";import{dirname as uP}from"path";import{performance as xc}from"perf_hooks";var dP="SCIP_QUERY_PROFILE",mP="SCIP_QUERY_PROFILE_OUT",pP="SCIP_QUERY_PROFILE_COMMAND",sp=new Set,ap=!1;function me(){let e=process.env[dP];return e==="1"||e==="true"}function fP(){return process.env[mP]}function gP(){return process.env[pP]}function D(e,t,n){if(!me())return t();let i=xc.now();try{let r=t();return Bn({type:"span",name:e,durationMs:Math.round(xc.now()-i),ok:!0,...cp(n)??{}}),r}catch(r){throw Bn({type:"span",name:e,durationMs:Math.round(xc.now()-i),ok:!1,error:r instanceof Error?r.message:String(r),...cp(n)??{}}),r}}function Bn(e,t=fP()){let n={timestamp:new Date().toISOString(),pid:process.pid,command:gP(),...e},i=`${JSON.stringify(n)}
|
|
175
|
+
`;if(t)try{let r=uP(t);sp.has(r)||(lP(r,{recursive:!0}),sp.add(r)),cP(t,i);return}catch(r){ap||(ap=!0,process.stderr.write(`[profile] failed to write ${t}: ${r instanceof Error?r.message:String(r)}
|
|
176
|
+
`));return}me()&&process.stderr.write(i)}function cp(e){return typeof e=="function"?e():e}var lp=Ld({kind:"file-dependency-graph",serialize:e=>JSON.stringify(e),deserialize:RP}),hP=W("file-dep-graph",{clearGroups:["whole-project"]});function ye(e,t){return hP.get(e,t??"",()=>{let n=new Set(O(e,{includeIgnored:!1})),i=0,r=0,o=D("file-dep-graph.source-imports",()=>{let u=yP(e,n,t);return i=u.files.length,r=u.edges.length,u},()=>({scope:t??null,files:i,edges:r})),s=In(e),a=s?xP(s,o.fingerprint):null,c=!1,l=0,d=0;return D("file-dep-graph.product",()=>{let u=SP(t);if(a){let f=lp.read(e,u,a);if(f?.sourceImportFingerprint===o.fingerprint){c=!0;let g=vP(f);return d=g.size,g}}let m=new Map,p=(f,g)=>IP(e,m,n,f,g);D("file-dep-graph.scip-edges",()=>{for(let f of PP(e,t))l+=1,p(f.from_file,f.to_file)},()=>({scope:t??null,edges:l}));for(let f of o.edges)p(f.fromFile,f.toFile);return d=m.size,a&&lp.write(e,u,a,{sourceImportFingerprint:o.fingerprint,sourceFileCount:o.files.length,sourceEdgeCount:o.edges.length,scipEdgeCount:l,graph:CP(m)}),m},()=>({scope:t??null,available:a!==null,hit:c,files:o.files.length,sourceEdges:o.edges.length,scipEdges:l,graphFiles:d,sourceImportFingerprint:o.fingerprint}))})}function yP(e,t,n){let i=[],r=[];for(let o of t)if(!(n&&!o.includes(n))){i.push(o);for(let s of oe(e,o))s.sourcePath&&r.push({fromFile:o,toFile:s.sourcePath})}return{files:i,edges:r,fingerprint:bP(i,r)}}function bP(e,t){let n=t.map(i=>`${i.fromFile}\0${i.toFile}`).sort();return Vt(JSON.stringify({files:e,edges:n}))}function SP(e){return e??"<all>"}function xP(e,t){return Vt(JSON.stringify({projectFingerprint:e,sourceImportFingerprint:t}))}function CP(e){return[...e].map(([t,n])=>[t,[...n]])}function vP(e){return new Map(e.graph.map(([t,n])=>[t,new Set(n)]))}function RP(e){let t=JSON.parse(e);return kP(t)?t:null}function kP(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.sourceImportFingerprint=="string"&&typeof t.sourceFileCount=="number"&&typeof t.sourceEdgeCount=="number"&&typeof t.scipEdgeCount=="number"&&Array.isArray(t.graph)&&t.graph.every(wP)}function wP(e){return Array.isArray(e)&&e.length===2&&typeof e[0]=="string"&&Array.isArray(e[1])&&e[1].every(t=>typeof t=="string")}function PP(e,t){let n=t?`AND d1.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT
|
|
158
177
|
d1.relative_path AS from_file,
|
|
159
178
|
d2.relative_path AS to_file
|
|
160
179
|
FROM mentions m
|
|
@@ -172,11 +191,11 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
172
191
|
WHERE d1.id != d2.id
|
|
173
192
|
AND m.role != 1
|
|
174
193
|
${e.pathExclusionsFor("d1","d2")}
|
|
175
|
-
${n}`)}function
|
|
194
|
+
${n}`)}function IP(e,t,n,i,r){if(i===r||e.isIgnored(i)||e.isIgnored(r)||!n.has(r))return;let o=t.get(i);o||(o=new Set,t.set(i,o)),o.add(r)}import{existsSync as ss,readFileSync as LP,readdirSync as dp}from"fs";import{join as vr}from"path";var DP={files:new Set,pathPrefixes:[]},Cc=/^(?:dist|build|lib|out|output|esm|cjs|umd)\//,EP=/\.(?:d\.ts|d\.mts|d\.cts|ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,mp=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],NP=new Set([".git",".next",".turbo","build","coverage","dist","node_modules","out"]),FP=4,TP=ie("package-surface",{clearGroups:["whole-project"]});function _P(e){return TP.get(e,()=>AP(e.config.projectRoot))}function _i(e,t){let n=_P(e);return n.files.has(t)?!0:n.pathPrefixes.some(i=>t.startsWith(i))}function AP(e){let t=new Set,n=[];for(let{manifest:i,packageRoot:r}of MP(e))for(let o of $P(i))jP(e,r,o,t,n);return t.size===0&&n.length===0?DP:{files:t,pathPrefixes:n}}function MP(e){let t=[],n=fp(e,"");return n&&t.push({manifest:n,packageRoot:""}),pp(e,"",t,0),t}function pp(e,t,n,i){if(i>=FP)return;let r=vr(e,t);if(ss(r))for(let o of dp(r,{withFileTypes:!0})){if(!o.isDirectory()||NP.has(o.name))continue;let s=t?`${t}/${o.name}`:o.name,a=fp(e,s);a&&n.push({manifest:a,packageRoot:s}),pp(e,s,n,i+1)}}function fp(e,t){try{let n=LP(vr(e,t,"package.json"),"utf-8"),i=JSON.parse(n);return i&&typeof i=="object"?i:null}catch{return null}}function $P(e){let t=[];for(let i of["main","module","types","browser"])typeof e[i]=="string"&&t.push(e[i]);let n=e.bin;if(typeof n=="string")t.push(n);else if(n&&typeof n=="object")for(let i of Object.values(n))typeof i=="string"&&t.push(i);return gp(e.exports,t),t}function gp(e,t){if(typeof e=="string"){t.push(e);return}if(!(!e||typeof e!="object"))for(let n of Object.values(e))gp(n,t)}function jP(e,t,n,i,r){let o=n.replace(/\\/g,"/").replace(/^\.\//,"");if(o===""||o.startsWith(".."))return;let s=o.indexOf("*");if(s>=0){let c=o.slice(0,s);for(let l of up(c))l!==""&&r.push(Ti(t,l));return}let a=o.replace(EP,"");for(let c of up(a)){c===a&&c===o&&i.add(Ti(t,o));for(let l of mp)OP(e,i,t,c+l)}i.add(Ti(t,o))}function up(e){let t=[e];return Cc.test(e)&&(t.push(e.replace(Cc,"src/")),t.push(e.replace(Cc,""))),t}function OP(e,t,n,i){let r=Ti(n,i);if(t.add(r),!i.startsWith("src/")||ss(vr(e,r)))return;let o=mp.find(d=>i.endsWith(d));if(!o)return;let s=i.slice(0,-o.length);BP(e,t,n,s,o);let a=s.lastIndexOf("/");if(a<=4)return;let c=s.slice(0,a),l=s.slice(a+1);for(let d of hp(e,n,c,`${l}${o}`))t.add(d)}function BP(e,t,n,i,r){let o=Ti(n,`${i}/index${r}`);ss(vr(e,o))&&t.add(o)}function hp(e,t,n,i){let r=vr(e,t,n);if(!ss(r))return[];let o=[];for(let s of dp(r,{withFileTypes:!0})){let a=`${n}/${s.name}`;s.isDirectory()?o.push(...hp(e,t,a,i)):s.isFile()&&s.name===i&&o.push(Ti(t,a))}return o}function Ti(e,t){return e?`${e}/${t}`:t}function Z(e){let t=Ai(e);return tI(t)?"test":nI(t)?"worker":iI(t)?"entry":rI(t)?"barrel":"source"}function as(e){return Z(e)==="barrel"}function bp(e){return HP.get(e,()=>{let n=O(e,{includeIgnored:!1}).filter(s=>{let a=Z(s);return a==="entry"||a==="worker"});if(n.length===0)return new Set;let i=ye(e),r=new Set,o=new Set;for(;n.length>0;){let s=n.shift();if(!r.has(s)){r.add(s),Z(s)==="barrel"&&o.add(s);for(let a of i.get(s)??[])r.has(a)||n.push(a)}}return o})}var HP=ie("live-barrels",{clearGroups:["whole-project"]});function vc(e,t){return bp(e).has(Ai(t))}function Sp(e){let t=bp(e);return O(e,{includeIgnored:!1}).filter(n=>as(n)&&!t.has(n)&&!VP(e,n))}function VP(e,t){let n=Ai(t),i=gt(e).forFile(n,{facts:!0}).facts?.callables;return i&&i.length>0?!0:(e.get(`SELECT COUNT(*) AS n
|
|
176
195
|
FROM defn_enclosing_ranges der
|
|
177
196
|
JOIN documents d ON d.id = der.document_id
|
|
178
197
|
WHERE d.relative_path = ?
|
|
179
|
-
AND der.end_line - der.start_line >= 2`,n)?.n??0)>0}function Oe(e,t){let n=
|
|
198
|
+
AND der.end_line - der.start_line >= 2`,n)?.n??0)>0}function Oe(e,t){let n=Z(t);return n==="entry"||n==="worker"||vc(e,t)}function be(e,t,n){let i=Ai(n);if(_i(e,i)||KP(t,i))return!0;let r=e.config.entryRoots;return r?!!(r.files?.some(o=>Ai(o)===i)||r.pathPrefixes?.some(o=>i.startsWith(Ai(o)))||r.qualifiedVars?.some(o=>oI(t,o))||r.symbolPatterns?.some(o=>{try{return new RegExp(o).test(t)}catch{return!1}})):!1}var xp=new Set(["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"]),qP=new Set(["default","generateMetadata","generateStaticParams"]),UP=new Set(["default","getStaticProps","getServerSideProps","getStaticPaths","config"]),zP=new Set(["default","loader","action","clientLoader","clientAction","headers","links","meta","shouldRevalidate","ErrorBoundary","HydrateFallback"]),WP=new Set(["load","actions","entries",...xp]),GP=new Set(["default"]);function KP(e,t){let n=$(e);return n===""?!1:JP(t)?xp.has(n):XP(t)?qP.has(n):QP(t)?UP.has(n):YP(t)?zP.has(n):ZP(t)?WP.has(n):eI(t)?GP.has(n):!1}function JP(e){return/(?:^|\/)app(?:\/[^/]+)*\/route\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(e)}function XP(e){return/(?:^|\/)app(?:\/[^/]+)*\/(?:page|layout|template|loading|error|not-found|global-error|head|default)\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(e)}function QP(e){return/(?:^|\/)pages\/.+\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(e)}function YP(e){return/(?:^|\/)app\/routes\/.+\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(e)}function ZP(e){return/(?:^|\/)src\/routes\/(?:.*\/)?\+(?:page|page\.server|layout|layout\.server|server)\.(?:ts|js)$/.test(e)}function eI(e){return/(?:^|\/)src\/(?:pages|views|routes)\/.+\.(?:ts|tsx|js|jsx|vue)$/.test(e)}function tI(e){return!!(/\.(?:test|spec)\.[a-z0-9]+$/i.test(e)||/(?:^|\/)(?:_)?test_[^/]+$/i.test(e)||/(?:^|\/)spec_[^/]+$/i.test(e)||/(?:^|\/)[^/]+_test\.[a-z0-9]+$/i.test(e)||/(?:^|\/)[^/]+_tests\.rs$/i.test(e)||/(?:^|\/)tests\.rs$/i.test(e)||/(?:^|\/)[^/]+_spec\.[a-z0-9]+$/i.test(e)||/(?:^|\/)__tests__\//i.test(e)||/(?:^|\/)test\//i.test(e)||/(?:^|\/)tests\//i.test(e)||/(?:^|\/)__fixtures__\//i.test(e)||/(?:^|\/)__mocks__\//i.test(e)||/(?:^|\/)test-support\//i.test(e)||/(?:^|\/)test-utils\//i.test(e)||/(?:^|\/)testing\//i.test(e))}function nI(e){return/(?:^|\/)[^/]*worker\.(?:ts|tsx|js|mjs|cjs|rs|py|go)$/.test(e)}function iI(e){let t=e.split("/"),n=t[t.length-1]??e;return n==="cli.ts"||n==="cli.js"||n==="postinstall.ts"||n==="postinstall.js"||n==="main.ts"||n==="main.js"||n==="main.rs"||n==="main.go"||n==="main.py"||n==="build.rs"||n==="lib.rs"||/\bsrc\/bin\/[^/]+\.rs$/.test(e)||/(?:^|\/)examples\/[^/]+\.rs$/.test(e)||/(?:^|\/)tests\/[^/]+\.rs$/.test(e)||/(?:^|\/)benches\/[^/]+\.rs$/.test(e)?!0:n==="index.ts"||n==="index.js"?/(?:^|\/)(?:apps|services)\/[^/]+\/src\/index\.(?:ts|js)$/.test(e)?!0:t.length<=2:!1}function rI(e){return e==="index.ts"||e==="index.js"||e.endsWith("/index.ts")||e.endsWith("/index.js")||e.endsWith("/mod.rs")||e.endsWith("/__init__.py")}function Ai(e){return e.replace(/\\/g,"/")}function oI(e,t){let n=t.lastIndexOf("/");if(n<0)return!1;let i=t.slice(0,n),r=t.slice(n+1);return e.includes(yp(i)+"/")&&e.includes(yp(r)+".")}function yp(e){return/^[A-Za-z0-9_$+-]+$/.test(e)?e:"`"+e.replace(/`/g,"``")+"`"}function cs(e,t,n,i={}){if(!n)return[];let r=M(e,t);return r?r.indexOf(n)===-1?[]:(Kt(e,t).get(n)??[]).filter(s=>!sI(s,i)):[]}function sI(e,t){return typeof t.excludeStartLine=="number"&&typeof t.excludeEndLine=="number"&&e>=t.excludeStartLine&&e<=t.excludeEndLine}var aI=W("file-identifiers",{clearGroups:["whole-project","source-file"]});function Cp(e,t){let n=X(e,t);return n?n.fileIdentifiers:aI.get(e,t,()=>new Set(Kt(e,t).keys()))}var cI=W("file-ident-lines",{clearGroups:["whole-project","source-file"]});function Kt(e,t){let n=X(e,t);return n?n.identifierLineMap:cI.get(e,t,()=>uI(e,t))}var lI=W("file-idents-by-line",{clearGroups:["whole-project","source-file"]});function vp(e,t){let n=X(e,t);return n?n.identifiersByLine:lI.get(e,t,()=>{let i=Kt(e,t),r=0;for(let s of i.values()){let a=s[s.length-1];a!==void 0&&a>r&&(r=a)}let o=new Array(r+1);for(let s=0;s<=r;s+=1)o[s]=new Set;for(let[s,a]of i)for(let c of a)o[c].add(s);return o})}function uI(e,t){let n=new Map,i=(a,c)=>{let l=n.get(a);if(!l){n.set(a,[c]);return}l[l.length-1]!==c&&l.push(c)},r=M(e,t);if(!r)return n;let o=Tn(r).split(/\r?\n/),s=/\b([A-Za-z_$][\w$]*)\b/g;for(let a=0;a<o.length;a+=1){let c=o[a]??"";for(let l of c.matchAll(s))l[1]&&i(l[1],a)}return n}function Rp(e,t){return ls(e,t,n=>{let i=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT
|
|
180
199
|
m.symbol_id,
|
|
181
200
|
d.relative_path,
|
|
182
201
|
COUNT(*) AS ref_count
|
|
@@ -186,13 +205,16 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
186
205
|
WHERE m.role != 1
|
|
187
206
|
${i}
|
|
188
207
|
${e.pathExclusionsFor("d")}
|
|
189
|
-
GROUP BY m.symbol_id, d.relative_path`,...n??[])})}function
|
|
208
|
+
GROUP BY m.symbol_id, d.relative_path`,...n??[])})}function kp(e,t){return ls(e,t,n=>{let i=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT DISTINCT m.symbol_id, d.relative_path
|
|
190
209
|
FROM mentions m
|
|
191
210
|
JOIN chunks c ON m.chunk_id = c.id
|
|
192
211
|
JOIN documents d ON c.document_id = d.id
|
|
193
212
|
WHERE m.role != 1
|
|
194
213
|
${i}
|
|
195
|
-
${e.pathExclusionsFor("d")}`,...n??[])}).filter(n=>n.symbol_id!==null)}function
|
|
214
|
+
${e.pathExclusionsFor("d")}`,...n??[])}).filter(n=>n.symbol_id!==null)}function wp(e,t){return ls(e,t,n=>{let i=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT DISTINCT m.symbol_id
|
|
215
|
+
FROM mentions m
|
|
216
|
+
WHERE m.role != 1
|
|
217
|
+
${i}`,...n??[])}).filter(n=>n.symbol_id!==null)}function Mi(e,t){return ls(e,t,n=>{let i=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT DISTINCT m.symbol_id, d.relative_path, c.document_id,
|
|
196
218
|
c.start_line AS chunk_start, c.end_line AS chunk_end
|
|
197
219
|
FROM mentions m
|
|
198
220
|
JOIN chunks c ON m.chunk_id = c.id
|
|
@@ -200,7 +222,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
200
222
|
WHERE m.role != 1
|
|
201
223
|
${i}
|
|
202
224
|
${e.pathExclusionsFor("d")}
|
|
203
|
-
ORDER BY d.relative_path, c.start_line`,...n??[])})}function
|
|
225
|
+
ORDER BY d.relative_path, c.start_line`,...n??[])})}function ls(e,t,n){if(!t)return n();if(t.length===0)return[];let i=[];for(let r=0;r<t.length;r+=750)i.push(...n(t.slice(r,r+750)));return i}function us(e){return e.replace(/\\/g,"/").replace(/^\.\//,"")}function Dt(e,t){return us(e)===us(t)}function ds(e,t){let n=Pp(e);return n?t.filter(i=>Pp(i.file)===n):t}function ms(e,t,n,i){let r=n.find(o=>o.file===t);if(r)return r;if(i){let o=new Set(oe(e,t).map(s=>s.sourcePath).filter(s=>!!s));for(let s of n)for(let a of o)if(Dt(a,s.file))return s;return null}return n.length===1?n[0]:null}function Pp(e){let t=H(e);return t?t==="typescript"||t==="tsx"||t==="javascript"?"javascript-family":t:null}var dI=ie("global-leaf-index",{clearGroups:["whole-project"]});function Hn(e){return dI.get(e,()=>{let t=e.all(`SELECT gs.id, gs.symbol,
|
|
204
226
|
COALESCE(der_doc.relative_path, mention_doc.relative_path) AS relative_path
|
|
205
227
|
FROM global_symbols gs
|
|
206
228
|
LEFT JOIN defn_enclosing_ranges der ON der.symbol_id = gs.id
|
|
@@ -214,10 +236,8 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
214
236
|
GROUP BY m.symbol_id
|
|
215
237
|
) mention_doc ON mention_doc.symbol_id = gs.id
|
|
216
238
|
WHERE 1 = 1
|
|
217
|
-
${e.symbolNoiseFor("gs")}`),n=new Map;for(let i of t){if(!i.relative_path||e.isIgnored(i.relative_path))continue;let r
|
|
218
|
-
`),c=[];for(let l=0;l<a.length;l++){if(l===r)continue;let u=a[l]??"";s.lastIndex=0;let d;for(;(d=s.exec(u))!==null;)c.push({file:t,line:l,column:d.index})}return dr(c.filter(l=>mr(n,Rm.join(n,l.file))===t))}function Ha(e){for(let t=e;t;t=t.getParent()){let n=t.getKindName();if(n.includes("Type")||n==="InterfaceDeclaration"||n==="TypeAliasDeclaration")return!0;if(n==="CallExpression"||n==="NewExpression"||n==="ExpressionStatement")return!1}return!1}function Va(e,t){return e.getLineAndColumnAtPos(t.getStart()).line-1}function dr(e){let t=new Set,n=[];for(let i of e){let r=`${i.file}:${i.line}:${i.column}`;t.has(r)||(t.add(r),n.push(i))}return n}function mr(e,t){let n=Rm.relative(e||process.cwd(),t).replace(/\\/g,"/");return!n||n.startsWith("..")?null:n}function Xk(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Lm(e,t,n,i){let r=Yk(t,i);return r.size===0?new Map:Zk(e,n,r)}function Yk(e,t){let n=new Map;for(let i of Q(e,t)){let r=M(i.symbol)??i.leaf;if(!r)continue;let o=n.get(r);o||(o=[],n.set(r,o)),o.push(i)}return n}function Zk(e,t,n){let i=new Map,r=new Map;return t.forEachDescendant(o=>{for(let s of ew(e,o)){let a=n.get(s);if(!a)continue;let c=Va(t,o);for(let l of a){if(c<l.startLine-1||c>l.endLine+1)continue;let u=Math.abs(c-l.startLine),d=r.get(l.symbolId);d!==void 0&&d<=u||(r.set(l.symbolId,u),i.set(l.symbolId,o))}}}),i}function ew(e,t){let n=[],i=r=>{r&&!n.includes(r)&&n.push(r)};if("getNameNode"in t&&typeof t.getNameNode=="function"){let r=t.getNameNode();i(r?.getText())}if("getName"in t&&typeof t.getName=="function"){let r=t.getName();i(r)}return e.Node.isIdentifier(t)&&i(t.getText()),n}var tw=U("ts-definition-leaf-candidates",{clearGroups:["definition-catalog"]});function Pm(e,t,n,i){let r=Em(e,t),o=Dm(r.get(i)??[],n);if(o)return o;let s=[];for(let a of r.values())for(let c of a)((c.leaf||M(c.symbol)||"").includes(i)||c.symbol.includes(i))&&s.push(c);return Dm(s,n)}function Nm(e,t){let n=new Map;for(let[i,r]of Em(e,t)){let o=r[0];o&&n.set(i,o)}return n}function Em(e,t){return tw.get(e,t,()=>{let n=new Map;for(let i of Q(e,t)){let r=i.leaf||M(i.symbol);if(!r)continue;let o=n.get(r);o||(o=[],n.set(r,o)),o.push({...i,leaf:r})}for(let i of n.values())i.sort((r,o)=>r.startLine-o.startLine||r.endLine-o.endLine||r.symbolId-o.symbolId);return n})}function Dm(e,t){let n=null,i=Number.POSITIVE_INFINITY;for(let r of e){let o=Math.abs(r.startLine-t);(o<i||o===i&&n&&r.startLine<n.startLine)&&(n=r,i=o)}return n}import Ua from"path";var pr=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function Xt(e){let t=e.toLowerCase();return pr.some(n=>t.endsWith(n))}import{appendFileSync as nw,mkdirSync as iw}from"fs";import{dirname as rw}from"path";import{performance as qa}from"perf_hooks";var ow="SCIP_QUERY_PROFILE",sw="SCIP_QUERY_PROFILE_OUT",aw="SCIP_QUERY_PROFILE_COMMAND",Tm=new Set,Fm=!1;function se(){let e=process.env[ow];return e==="1"||e==="true"}function cw(){return process.env[sw]}function lw(){return process.env[aw]}function T(e,t,n){if(!se())return t();let i=qa.now();try{let r=t();return In({type:"span",name:e,durationMs:Math.round(qa.now()-i),ok:!0,..._m(n)??{}}),r}catch(r){throw In({type:"span",name:e,durationMs:Math.round(qa.now()-i),ok:!1,error:r instanceof Error?r.message:String(r),..._m(n)??{}}),r}}function In(e,t=cw()){let n={timestamp:new Date().toISOString(),pid:process.pid,command:lw(),...e},i=`${JSON.stringify(n)}
|
|
219
|
-
`;if(t)try{let r=rw(t);Tm.has(r)||(iw(r,{recursive:!0}),Tm.add(r)),nw(t,i);return}catch(r){Fm||(Fm=!0,process.stderr.write(`[profile] failed to write ${t}: ${r instanceof Error?r.message:String(r)}
|
|
220
|
-
`));return}se()&&process.stderr.write(i)}function _m(e){return typeof e=="function"?e():e}function Am(e,t){let n=new Map,i=null,r=null,o=()=>(r??=B(e,{extensions:pr}),r),s=()=>(i??=T("typescript.source-file-index",()=>uw(e.config.projectRoot,t,o()),()=>({projects:t.length,indexedDocuments:o().length})),i),a=c=>Xt(c)?ut(n,c,()=>{let l=fr(Ua.resolve(e.config.projectRoot,c));for(let{project:u,sourceFiles:d}of s()){let m=d.get(l)??null;if(m||(m=u.addSourceFileAtPathIfExists(l)??null,m&&d.set(fr(m.getFilePath()),m)),m)return{project:u,sourceFile:m}}return null}):null;return{sourceFile:c=>a(c)?.sourceFile??null,sourceFileMatch:a,indexedTypeScriptLikeDocuments:o}}function uw(e,t,n){let i=t.map(({project:r})=>({project:r,sourceFiles:new Map(r.getSourceFiles().map(o=>[fr(o.getFilePath()),o]))}));for(let r of n){let o=fr(Ua.resolve(e,r));for(let s of i){if(s.sourceFiles.has(o))break;let a=s.project.addSourceFileAtPathIfExists(o)??null;if(a){s.sourceFiles.set(fr(a.getFilePath()),a);break}}}return i}function fr(e){return Ua.resolve(e)}import Yt from"path";import{existsSync as Qo,readdirSync as dw,readFileSync as $m}from"fs";function Mm(e){let t=Yt.join(e,"package.json");if(!Qo(t))return[];let n;try{n=JSON.parse($m(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(r=>mw(e,r)).flatMap(r=>pw(e,r))}function mw(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=Yt.join(e,t);return Qo(Yt.join(s,"package.json"))?[s]:[]}let n=t.indexOf("*"),i=t.slice(0,n).replace(/\/$/,""),r=t.slice(n+1).replace(/^\//,""),o=Yt.join(e,i||".");if(!Qo(o))return[];try{return dw(o).map(s=>Yt.join(o,s,r)).filter(s=>Qo(Yt.join(s,"package.json")))}catch{return[]}}function pw(e,t){try{let n=JSON.parse($m(Yt.join(t,"package.json"),"utf8"));if(!n.name)return[];let i=Yt.relative(e,t).replace(/\\/g,"/");return[{name:n.name,rootRelative:i,sourceRootRelative:`${i}/src`}]}catch{return[]}}function Om(e,t){for(let n of e)if(t===n.name||t.startsWith(`${n.name}/`))return n.name;return null}function jm(e){return[`${e.sourceRootRelative}/index.ts`,`${e.sourceRootRelative}/index.tsx`,`${e.sourceRootRelative}/index.mts`,`${e.sourceRootRelative}/index.cts`]}import{existsSync as gr,readFileSync as fw,readdirSync as gw,statSync as hw}from"fs";import ge from"path";var za=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function Ga(e,t){let i=t?ge.dirname(ge.join(e,t)):e,r=ge.resolve(e);for(;i.startsWith(r);){for(let s of za){let a=ge.join(i,s);if(gr(a))return a}let o=ge.dirname(i);if(o===i)break;i=o}for(let o of za){let s=ge.join(e,o);if(gr(s))return s}return null}function Bm(e){let t=e.config.projectRoot,n=new Set(Ja(t,e.config.semantic?.typescript?.tsconfigs)),i=B(e,{includeIgnored:!1,extensions:pr});for(let r of i){let o=Ga(t,r);o&&n.add(ge.resolve(o))}if(n.size===0){let r=Ga(t);r&&n.add(ge.resolve(r))}return[...n].filter(r=>!Hm(t,r)).sort((r,o)=>r.localeCompare(o))}function Ja(e,t=[]){let n=new Set;for(let i of t){let r=ge.isAbsolute(i)?i:ge.join(e,i);gr(r)&&n.add(ge.resolve(r))}for(let i of yw(e))for(let r of za){let o=ge.join(i,r);gr(o)&&n.add(ge.resolve(o))}if(n.size===0){let i=Ga(e);i&&n.add(ge.resolve(i))}return[...n].filter(i=>!Hm(e,i)).sort((i,r)=>i.localeCompare(r))}function yw(e){let t=ge.join(e,"package.json");if(!gr(t))return[];let n;try{n=JSON.parse(fw(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(r=>bw(e,r))}function bw(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=ge.join(e,t);return Wa(s)?[s]:[]}let n=t.indexOf("*"),i=t.slice(0,n).replace(/\/$/,""),r=t.slice(n+1).replace(/^\//,""),o=ge.join(e,i||".");return Wa(o)?gw(o).map(s=>ge.join(o,s,r)).filter(Wa):[]}function Wa(e){try{return hw(e).isDirectory()}catch{return!1}}function Hm(e,t){let n=ge.relative(e,t).replace(/\\/g,"/");return n.startsWith("..")||n.includes("/node_modules/")||n.startsWith("node_modules/")||n.includes("/dist/")||n.startsWith("dist/")}import{createRequire as Sw}from"module";var xw=Sw(import.meta.url),hr;function Vm(){if(hr!==void 0)return hr;try{hr=xw("ts-morph")}catch{hr=null}return hr}function qm(e,t){return t.map(n=>({tsconfigPath:n,project:new e.Project({tsConfigFilePath:n,skipFileDependencyResolution:!0})}))}function Xo(e,t,n){return{language:"typescript",availability:()=>({available:!1,reason:e,tsconfigPath:t,tsconfigPaths:n}),importUsage:()=>[],referencesFor:()=>[],calleesFor:()=>[],signatureFor:()=>null}}var Cw=32;function Km(e,t){let n=T("typescript.provider.load",()=>Vm());if(!n)return Xo("ts-morph is not installed");let i=T("typescript.provider.tsconfig-discovery",()=>Bm(e));if(i.length===0)return Xo("no tsconfig found");try{let r=T("typescript.provider.project-bundles",()=>qm(n,i),()=>({tsconfigs:i.length}));return T("typescript.provider.construct",()=>new Ka(e,n,r),()=>({tsconfigs:i.length}))}catch(r){return Xo(r instanceof Error?r.message:String(r),i[0],i)}}var Ka=class{constructor(t,n,i){this.db=t;this.tsMorph=n;this.projects=i;this.workspacePackages=Mm(t.config.projectRoot),this.sourceFiles=Am(t,i)}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(t=>t.tsconfigPath)}}importUsage(t){return ut(this.importUsageCache,t,()=>{let n=this.sourceFiles.sourceFile(t);if(!n)return[];let i=Rw();return T("typescript.import-usage.file",()=>this.importUsageForSourceFile(t,n,i),()=>({file:t,...i}))})}referencesFor(t){return ut(this.referencesCache,t.symbolId,()=>{let n=this.nodeForDefinition(t);return this.referencesForDefinitionNode(t,n)})}referencesForDefinitions(t){let n=new Map,i=se(),r=[];for(let c of t){let l=this.referencesCache.get(c.symbolId);l?n.set(c.symbolId,l):r.push(c)}if(r.length===0)return n;let o=r,s=r.filter(c=>!Wm(c));if(s.length>=Cw){let c=this.referencesForDefinitionsBySymbolScan(s);for(let l of s){let u=c.get(l.symbolId)??[];this.referencesCache.set(l.symbolId,u),n.set(l.symbolId,u)}if(o=r.filter(l=>Wm(l)),o.length===0)return n}let a=new Map;for(let c of o){let l=a.get(c.relativePath);l?l.push(c):a.set(c.relativePath,[c])}for(let[c,l]of a){let u=zm();T("typescript.references-map.file",()=>{let d=this.definitionNodesForFile(c);for(let m of l){i&&(u.cacheMisses+=1);let p=d.get(m.symbolId)??null;i&&(p?u.nodeHits+=1:u.nodeMisses+=1);let f=this.referencesForDefinitionNode(m,p,i?u:void 0);this.referencesCache.set(m.symbolId,f),n.set(m.symbolId,f)}},()=>({relativePath:c,definitions:l.length,...Gm(u)}))}return n}referencesForDefinitionsBySymbolScan(t){let n=se(),i=zm(),r=new Map,o=new Set(t.map(a=>a.symbolId)),s=new Map(t.map(a=>[a.symbolId,a]));for(let a of t)r.set(a.symbolId,[]);return T("typescript.references-map.inverted-scan",()=>{let a=n?z.now():0;for(let d of t){let m=this.packageImportReferencesForDefinition(d);if(m.length>0){let p=r.get(d.symbolId)??[];p.push(...m),r.set(d.symbolId,p)}n&&(i.packageReferenceCount+=m.length)}n&&(i.packageRefsMs+=z.now()-a);let c=new Map,l=new Set(t.map(d=>d.leaf).filter(Boolean)),u=n?z.now():0;for(let d of this.sourceFiles.indexedTypeScriptLikeDocuments()){if(this.db.isIgnored(d))continue;let m=this.sourceFiles.sourceFile(d);m&&(n&&(i.scanFiles+=1),this.addReferencesFromSourceFileScan(m,d,o,s,l,c,r,n?i:void 0))}n&&(i.scanMs+=z.now()-u);for(let[d,m]of r){let p=dr(m);r.set(d,p),n&&(i.referenceCount+=p.length)}},()=>({definitions:t.length,...Gm(i)})),r}addReferencesFromSourceFileScan(t,n,i,r,o,s,a,c){let l=this.compilerCheckerForSourceFile(t),u=t.compilerNode,d=Iw(t),m=p=>{if(this.tsMorph.ts.isIdentifier(p)){if(c&&(c.identifiers+=1),!o.has(p.text)&&!d.has(p.text)){this.tsMorph.ts.forEachChild(p,m);return}let f=this.compilerReferenceSymbol(l,p,c);if(f){let g;if(s.has(f)?g=s.get(f)??null:(g=this.definitionFromCompilerSymbol(f),s.set(f,g)),c&&(g?c.targetHits+=1:c.targetMisses+=1),g&&i.has(g.symbolId)){c&&(c.requestedHits+=1);let y=r.get(g.symbolId);if(y&&!Dw(y,n,Um(u,p))){let S=a.get(g.symbolId)??[],R=u.getLineAndCharacterOfPosition(p.getStart(u));S.push({file:n,line:R.line,column:R.character}),a.set(g.symbolId,S)}}}}this.tsMorph.ts.forEachChild(p,m)};m(u)}compilerReferenceSymbol(t,n,i){i&&(i.symbolLookups+=1);let r=t.getSymbolAtLocation(n);if(r){if((r.flags&this.tsMorph.ts.SymbolFlags.Alias)===0)return r;try{return i&&(i.aliasResolutions+=1),t.getAliasedSymbol(r)}catch{return r}}}calleesFor(t){return ut(this.calleesCache,t.symbolId,()=>ut(this.fileCalleesCache,t.relativePath,()=>this.calleeMapForFile(t.relativePath)).get(t.symbolId)??[])}calleesForDefinitions(t){let n=new Map,i=new Map;for(let r of t){let o=i.get(r.relativePath);o?o.push(r):i.set(r.relativePath,[r])}for(let[r,o]of i){let s=this.fileCalleesCache.get(r),a=new Set(o.map(l=>l.symbolId)),c=s??this.calleeMapForFile(r,a);for(let l of o){let u=c.get(l.symbolId)??[];this.calleesCache.set(l.symbolId,u),n.set(l.symbolId,u)}}return n}referencesForDefinitionNode(t,n,i){let r=i?z.now():0,o=this.packageImportReferencesForDefinition(t);if(i&&(i.packageRefsMs+=z.now()-r,i.packageReferenceCount+=o.length),!n)return o;let s=i?z.now():0,a=km(n,t,o,this.db.config.projectRoot);return i&&(i.semanticRefsMs+=z.now()-s,i.referenceCount+=a.length),a}signatureFor(t){return ut(this.signatureCache,t.symbolId,()=>{let n=this.nodeForDefinition(t);if(!n||!this.tsMorph.Node.isFunctionDeclaration(n)&&!this.tsMorph.Node.isMethodDeclaration(n)&&!this.tsMorph.Node.isArrowFunction(n)&&!this.tsMorph.Node.isFunctionExpression(n)&&!this.tsMorph.Node.isConstructorDeclaration(n))return null;let i=n.getType().getCallSignatures()[0];if(!i)return null;let r=i.getParameters().map(s=>{let a=s.getDeclarations()[0],c=a?s.getTypeAtLocation(a).getText(a):s.getValueDeclaration()?.getType().getText()??"unknown";return Jm(c)}),o=i.getReturnType().getText(n);return`(${r.join(",")})=>${Jm(o)}`})}importUsageForSourceFile(t,n,i){let r=[],o=new Map;for(let s of n.getImportDeclarations()){i.declarations+=1;let a=lt(this.db,t,s.getModuleSpecifierValue()),c=s.getImportClause()?.isTypeOnly()??!1;for(let l of Qa(s)){i.entries+=1;let u=c?null:l.identifier?.getSymbol()?.compilerSymbol??null;!c&&l.identifier&&(u?i.bindingSymbols+=1:i.missingBindingSymbols+=1);let d={sourcePath:a,entry:l,typeOnlyDeclaration:c,bindingSymbol:u,references:[]};if(r.push(d),c||!l.localName||!u)continue;let m=o.get(l.localName);m?m.push(d):o.set(l.localName,[d])}}return o.size>0&&n.forEachDescendant(s=>{if(s.getKindName()!=="Identifier")return;let a=o.get(s.getText());if(!a||kw(s))return;i.scannedIdentifiers+=1;let c=s.getSymbol()?.compilerSymbol;if(i.symbolLookups+=1,!!c){for(let l of a)if(l.bindingSymbol===c){l.references.push({location:Ko(s,this.db.config.projectRoot),node:s}),i.matchedReferences+=1;break}}}),r.map(s=>s.typeOnlyDeclaration?vw(t,s.sourcePath,s.entry):s.entry.identifier&&!s.bindingSymbol?(i.fallbackEntries+=1,this.valueImportUsageForEntry(t,s.sourcePath,s.entry)):this.valueImportUsageFromLocations(t,s.sourcePath,s.entry,s.references))}valueImportUsageForEntry(t,n,i){let r=i.identifier?i.identifier.findReferences():[],o=[];for(let s of r)for(let a of wm(s,t,i.identifier,this.db.config.projectRoot))o.push(a);return this.valueImportUsageFromLocations(t,n,i,o)}valueImportUsageFromLocations(t,n,i,r){let o=r.some(c=>!Ha(c.node)),s=r.some(c=>Ha(c.node)),a=i.isTypeOnly;return{importer:t,sourcePath:n,importedName:i.importedName,localName:i.localName,kind:i.kind,isTypeOnly:a,isUsed:a||r.length>0,isTypeUsed:a||s,isValueUsed:o,references:r.map(c=>c.location)}}packageImportReferencesForDefinition(t){return this.packageImportReferences().get(t.symbolId)??[]}packageImportReferences(){if(this.packageImportReferenceIndex)return this.packageImportReferenceIndex;let t=new Map,n=this.packageExports();for(let i of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(t,n,i);for(let[i,r]of t)t.set(i,dr(r));return this.packageImportReferenceIndex=t,t}addPackageImportReferencesForDocument(t,n,i){if(this.db.isIgnored(i))return;let r=this.sourceFiles.sourceFileMatch(i);if(r)for(let o of r.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(t,n,i,o)}addPackageImportReferencesForDeclaration(t,n,i,r){let o=Om(this.workspacePackages,r.getModuleSpecifierValue());if(!o)return;let s=n.get(o);if(s)for(let a of Qa(r)){if(a.kind!=="named"||!a.identifier)continue;let c=s.get(a.importedName);if(!c||c.size===0)continue;let l=Im(a.identifier,i,this.db.config.projectRoot);l.length>0&&Ew(t,c,l)}}packageExports(){if(this.packageExportIndex)return this.packageExportIndex;let t=new Map;for(let n of this.workspacePackages){let i=new Map;for(let r of jm(n))this.collectPackageExports(n,r,i,new Set);i.size>0&&t.set(n.name,i)}return this.packageExportIndex=t,t}collectPackageExports(t,n,i,r){if(r.has(n))return;r.add(n);let o=this.sourceFiles.sourceFile(n);if(o)for(let s of o.getExportDeclarations()){let a=s.getModuleSpecifierValue(),c=a?lt(this.db,n,a):n;if(!c||!c.startsWith(`${t.sourceRootRelative}/`))continue;let l=s.getNamedExports();if(l.length===0){if(s.isNamespaceExport())continue;this.collectPackageExports(t,c,i,r);continue}for(let u of l){let d=u.getNameNode().getText(),m=u.getAliasNode()?.getText()??d,p=this.indexedDefinitionByLeaf(c,d);if(!p)continue;let f=i.get(m);f||(f=new Set,i.set(m,f)),f.add(p.symbolId)}}}indexedDefinitionByLeaf(t,n){return ut(this.indexedDefinitionLeafCache,t,()=>Nm(this.db,t)).get(n)??null}nodeForDefinition(t){return ut(this.definitionNodeCache,t.symbolId,()=>this.definitionNodesForFile(t.relativePath).get(t.symbolId)??null)}definitionNodesForFile(t){return ut(this.fileDefinitionNodeCache,t,()=>{let n=this.sourceFiles.sourceFile(t);return n?Lm(this.tsMorph,this.db,n,t):new Map})}definitionFromCompilerSymbol(t,n){let i=t.name,r=n?z.now():0,o=t.declarations??[];n&&(n.declarationsMs+=z.now()-r,n.declarationChecks+=o.length);for(let s of o){let a=n?z.now():0,c=s.getSourceFile(),l=mr(this.db.config.projectRoot,c.fileName),u=c.getLineAndCharacterOfPosition(s.getStart(c)).line;if(n&&(n.declarationLocationMs+=z.now()-a),!l||this.db.isIgnored(l))continue;let d=n?z.now():0,m=Pm(this.db,l,u,i);if(n&&(n.indexedLookupMs+=z.now()-d),m)return{symbolId:m.symbolId,symbol:m.symbol,file:m.relativePath,line:m.startLine}}return null}calleeMapForFile(t,n){let i=se(),r=0,o=0,s=0,a=0,c=0,l=0,u=0,d=0,m=i?Pw():void 0;return T("typescript.callee-map.file",()=>{let p=i?z.now():0,f=this.sourceFiles.sourceFile(t);if(i&&(c=Math.round(z.now()-p)),!f)return new Map;let g=i?z.now():0,y=Q(this.db,t).sort((w,j)=>w.startLine-j.startLine||j.endLine-w.endLine);if(i&&(l=Math.round(z.now()-g)),r=y.length,y.length===0)return new Map;let S=new Map,R=i?z.now():0,k=this.compilerCheckerForSourceFile(f),x=f.compilerNode;i&&(u=Math.round(z.now()-R));let b=new Map,C=w=>{if(this.tsMorph.ts.isCallExpression(w)||this.tsMorph.ts.isNewExpression(w)){i&&(o+=1);let j=this.semanticCalleeForCallNode(k,x,y,w,b,n,m);j&&(i&&(s+=1),ww(S,j.callerId,j.target))}this.tsMorph.ts.forEachChild(w,C)},D=i?z.now():0;C(x),i&&(d=Math.round(z.now()-D));for(let[w,j]of S)S.set(w,Tw(j));return a=S.size,S},()=>({relativePath:t,definitions:r,callNodes:o,resolvedCallees:s,outputRows:a,requestedDefinitions:n?.size??r,sourceFileLookupMs:c,definitionsLoadMs:l,checkerLookupMs:u,traversalMs:d,...m?Nw(m):{}}))}semanticCalleeForCallNode(t,n,i,r,o,s,a){let c=a?z.now():0,l=Lw(i,Um(n,r));if(a&&(a.callerLookupMs+=z.now()-c),!l)return null;if(s&&!s.has(l.symbolId))return a&&(a.skippedUnrequestedCallers+=1),null;let u=r.expression,d=this.compilerSymbolForExpression(t,u,a),m=null;if(d)if(a&&(a.targetSymbolHits+=1),o.has(d))a&&(a.compilerSymbolCacheHits+=1),m=o.get(d)??null;else{a&&(a.compilerSymbolCacheMisses+=1);let p=a?z.now():0;m=this.definitionFromCompilerSymbol(d,a),a&&(a.targetLookupMs+=z.now()-p),o.set(d,m)}else a&&(a.targetMisses+=1);return m?{callerId:l.symbolId,target:{symbol:m.symbol,file:m.file,line:m.line}}:null}compilerSymbolForExpression(t,n,i){let r=i?z.now():0,o=t.getSymbolAtLocation(n);if(i&&(i.expressionSymbolMs+=z.now()-r),o)return o;i&&(i.typeFallbacks+=1);let s=i?z.now():0,a=t.getTypeAtLocation(n).getSymbol();return i&&(i.typeSymbolMs+=z.now()-s),a}compilerCheckerForSourceFile(t){let n=t.getProject(),i=this.compilerCheckerCache.get(n);return i||(i=n.getTypeChecker().compilerObject,this.compilerCheckerCache.set(n,i)),i}};function Qa(e){let t=[],n=e.getDefaultImport();n&&t.push({identifier:n,importedName:"default",localName:n.getText(),kind:"default",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});let i=e.getNamespaceImport();i&&t.push({identifier:i,importedName:"*",localName:i.getText(),kind:"namespace",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});for(let r of e.getNamedImports()){let o=r.getNameNode(),a=r.getAliasNode()??(o.getKindName()==="Identifier"?o:null);t.push({identifier:a,importedName:o.getText(),localName:a?.getText()??o.getText(),kind:"named",isTypeOnly:r.isTypeOnly()||(e.getImportClause()?.isTypeOnly()??!1)})}return t.length===0&&t.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),t}function vw(e,t,n){return{importer:e,sourcePath:t,importedName:n.importedName,localName:n.localName,kind:n.kind,isTypeOnly:!0,isUsed:!0,isTypeUsed:!0,isValueUsed:!1,references:[]}}function Rw(){return{declarations:0,entries:0,bindingSymbols:0,missingBindingSymbols:0,scannedIdentifiers:0,symbolLookups:0,matchedReferences:0,fallbackEntries:0}}function kw(e){for(let t=e;t;t=t.getParent())if(t.getKindName()==="ImportDeclaration")return!0;return!1}function ww(e,t,n){let i=e.get(t);i||(i=[],e.set(t,i)),i.push(n)}function Iw(e){let t=new Set;for(let n of e.getImportDeclarations())for(let i of Qa(n))i.localName&&t.add(i.localName);return t}function Lw(e,t){let n=null;for(let i of e)t<i.startLine||t>i.endLine||(!n||i.startLine>=n.startLine)&&(n=i);return n}function Um(e,t){return e.getLineAndCharacterOfPosition(t.getStart(e)).line}function Dw(e,t,n){return t===e.relativePath&&n>=e.startLine&&n<=e.endLine}function Wm(e){return e.symbol.includes("#")?ee(e.symbol)==="type"&&e.relativePath.endsWith(".d.ts"):!1}function Pw(){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 Nw(e){return{...e,callerLookupMs:Math.round(e.callerLookupMs),expressionSymbolMs:Math.round(e.expressionSymbolMs),typeSymbolMs:Math.round(e.typeSymbolMs),targetLookupMs:Math.round(e.targetLookupMs),declarationsMs:Math.round(e.declarationsMs),declarationLocationMs:Math.round(e.declarationLocationMs),indexedLookupMs:Math.round(e.indexedLookupMs)}}function zm(){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}}function Gm(e){return{...e,scanMs:Math.round(e.scanMs),packageRefsMs:Math.round(e.packageRefsMs),semanticRefsMs:Math.round(e.semanticRefsMs)}}function Ew(e,t,n){for(let i of t){let r=e.get(i)??[];r.push(...n),e.set(i,r)}}function Tw(e){let t=new Set,n=[];for(let i of e){let r=`${i.symbol}|${i.file}|${i.line}`;t.has(r)||(t.add(r),n.push(i))}return n}function Jm(e){return e.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var Xa=new WeakMap;Vt({name:"semantic-provider",groups:["semantic-provider"],clearAll:e=>Xa.delete(e)});function Zt(e,t){let n=`${e.config.projectRoot}:typescript-workspace`,i=Xa.get(e);i||(i=new Map,Xa.set(e,i));let r=i.get(n);if(r)return r;let o=Km(e,t);return i.set(n,o),o}function yr(e,t){let n=br(e,t);return n?n.importUsage(t):[]}function Ii(e,t){let n=br(e,t.relativePath);return n?n.referencesFor(t):[]}function et(e,t){let n=se(),i=new Map,r=er(e),o=[],s=[],a=[],c=0,l=0,u=0,d=0;if(T("semantic.references.cache-scan",()=>{for(let m of t){if(!r||!Xt(m.relativePath)){n&&!Xt(m.relativePath)&&(c+=1),a.push(m);continue}let p=Mu(e,m.relativePath,m.symbol,r);if(p!==null){let f=_w(p);if(f){n&&(l+=1),d+=Xm(e,i,m,f);continue}n&&(u+=1)}s.push(m)}},()=>({definitions:t.length,skippedNonTs:c,cacheHits:l,parseFailures:u,misses:s.length,unkeyed:a.length,resultRows:i.size,callerFiles:d})),s.length>0||a.length>0){let m=[...a,...s],p=0,f=T("semantic.references.compute-misses",()=>{let g=Fw(e,m);return p=g.size,g},()=>({definitions:m.length,misses:s.length,unkeyed:a.length,rows:p}));for(let g of m)d+=Xm(e,i,g,f.get(g.symbolId)??[]);if(r)for(let g of s)o.push({relativePath:g.relativePath,symbol:g.symbol,projectFingerprint:r,payload:JSON.stringify(f.get(g.symbolId)??[])})}return o.length>0&&(Zt(e).availability().available?T("semantic.references.cache-write",()=>ju(e,o),()=>({entries:o.length})):T("semantic.references.cache-write-skip",()=>{},()=>({reason:"provider-unavailable",entries:o.length}))),i}function Fw(e,t){let n=se(),i=new Map,r=0,o=0,s=0,a=0;return T("semantic.references.provider-loop",()=>{let c=new Map,l=[];for(let u of t){let d=br(e,u.relativePath);if(!d){n&&(o+=1);continue}if(n&&(r+=1),d.referencesForDefinitions){let m=c.get(d);m?m.push(u):c.set(d,[u])}else l.push({provider:d,definition:u})}for(let[u,d]of c){let m=u.referencesForDefinitions(d);for(let p of d){let f=m.get(p.symbolId)??[];Qm(i,p.symbolId,f,n,g=>{s+=1,a+=g})}}for(let{provider:u,definition:d}of l){let m=u.referencesFor(d);Qm(i,d.symbolId,m,n,p=>{s+=1,a+=p})}return i},()=>({definitions:t.length,providerHits:r,providerMisses:o,definitionsWithReferences:s,referenceCount:a,rows:i.size}))}function Qm(e,t,n,i,r){e.set(t,n),i&&n.length>0&&r(n.length)}function Xm(e,t,n,i){let r=0;for(let o of i){if(o.file===n.relativePath||e.isIgnored(o.file))continue;let s=t.get(n.symbolId);s||(s=new Set,t.set(n.symbolId,s));let a=s.size;s.add(o.file),s.size!==a&&(r+=1)}return r}function _w(e){try{return JSON.parse(e)}catch{return null}}function Yo(e,t){let n=se(),i=new Map,r=0,o=0,s=0,a=0;return T("semantic.callees.provider-loop",()=>{let c=new Map,l=[];for(let u of t){let d=br(e,u.relativePath);if(!d){n&&(o+=1);continue}n&&(r+=1);let m=u;if(d.calleesForDefinitions){let p=c.get(d);p?p.push(m):c.set(d,[m])}else l.push({provider:d,definition:m})}for(let[u,d]of c){let m=u.calleesForDefinitions(d);for(let p of d){let f=m.get(p.symbolId)??[];Ym(i,p.symbolId,f,n,g=>{s+=1,a+=g})}}for(let{provider:u,definition:d}of l){let m=u.calleesFor(d);Ym(i,d.symbolId,m,n,p=>{s+=1,a+=p})}return i},()=>({definitions:t.length,providerHits:r,providerMisses:o,definitionsWithCallees:s,calleeCount:a,rows:i.size}))}function Ym(e,t,n,i,r){n.length>0&&(e.set(t,n),i&&r(n.length))}function Zm(e,t){let n=br(e,t.relativePath);return n?n.signatureFor(t):null}function br(e,t){if(!Xt(t))return null;let n=Zt(e,t);return n.availability().available?n:null}var Aw=U("source-import-paths-by-local-name",{clearGroups:["whole-project","source-file"]});function Zo(e,t){let n=Wo(t);return Aw.get(e,n,()=>$w(e,n))}function $w(e,t){let n=new Map;for(let i of Ie(e,t)){if(!i.sourcePath)continue;let r=i.localName??i.importedName;if(r&&ep(n,r,i.sourcePath),i.kind==="namespace")for(let o of i.usedMembers)ep(n,o,i.sourcePath)}return n}function ep(e,t,n){let i=e.get(t);i||(i=new Set,e.set(t,i)),i.add(n)}function Li(e,t,n){let i=wn(e).get(n);if(!i||i.length===0)return[];if(i.length===1)return[Sr(i[0])];let r=i.filter(c=>c.file===t);if(r.length>0)return r.map(Sr);let o=Zo(e,t),s=o.get(n);if(s)for(let c of s){let l=i.filter(u=>Qt(c,u.file));if(l.length>0)return l.map(Sr)}let a=new Set;for(let c of o.values())for(let l of c)a.add(l);for(let c of a){let l=i.filter(u=>Qt(c,u.file));if(l.length>0&&l.length===i.length)return l.map(Sr)}return[]}function np(e,t,n){let i=Li(e,t,n);if(i.length>0)return i;let r=wn(e).get(n);return!r||r.length===0?[]:r.map(Sr)}function ip(e,t,n={}){let i=Lo(e,t);if(!i)return[];let r=M(i.symbol);if(!r)return[];if(n.semantic!==!1){let s=Ii(e,{...i,leaf:r,parentTypeName:null,isFunctionLike:!1,isTypeLike:!1,kind:null,documentation:null,enclosingSymbol:null});if(s.length>0){let a=new Map;for(let c of s){let l=a.get(c.file)??[];l.push(c.line),a.set(c.file,l)}return tp(e,a)}}let o=new Map;for(let s of $e(e)){let a=F(e,s);if(!a||a.indexOf(r)===-1||s!==i.relativePath&&!Li(e,s,r).some(u=>u.symbolId===i.symbolId))continue;let c=Uo(e,s,r,s===i.relativePath?{excludeStartLine:i.startLine,excludeEndLine:i.endLine}:{});c.length>0&&o.set(s,c)}return tp(e,o)}function rp(e,t){let n=new Map;for(let a of t){if(!a.leaf)continue;let c=n.get(a.leaf)??[];c.push(a),n.set(a.leaf,c)}if(n.size===0)return new Map;let i=new Set(t.map(a=>a.symbolId)),r=new Set(n.keys()),o=ur(r),s=new Map;for(let a of $e(e)){if(!Jo(F(e,a),o))continue;let c=ym(e,a);if(c.size!==0){for(let l of c)if(n.has(l))for(let u of Li(e,a,l)){if(!i.has(u.symbolId)||a===u.relativePath)continue;let d=s.get(u.symbolId);d||(d=new Set,s.set(u.symbolId,d)),d.add(a)}}}return s}function Sr(e){return{symbolId:e.symbolId,symbol:e.symbol,relativePath:e.file}}function tp(e,t){let n=[],i=new Set;for(let[r,o]of t){let s=Q(e,r);for(let a of o){let c=Qe(s,a),l=`${r}|${a}|${c?.symbol??""}`;i.has(l)||(i.add(l),n.push({file:r,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function Ln(e,t){let n=Vw(e,t);return n?qw(e,Ow(e,n.match,n.identifier)):[]}function en(e,t,n={}){return Mw(e,t,n).map(i=>({file:i.file,line:i.line,enclosingSymbol:i.enclosingSymbol}))}function Mw(e,t,n={}){let i=ip(e,t,{semantic:n.semantic}),r=i.length>0?op(i,"source-attribution"):op(Ln(e,t),"scip-reference-chunk");return n.includeIgnored===!0?r:r.filter(o=>!e.isIgnored(o.file))}function op(e,t){return e.map(n=>({...n,provenance:t}))}function Ow(e,t,n){let i=new Map;for(let[r,o]of jw(e,t.symbolId))i.set(r,Bw(e,r,o,t,n));return i}function jw(e,t){let n=new Map;for(let i of wi(e,[t])){if(e.isIgnored(i.relative_path))continue;let r=n.get(i.relative_path);r||(r=[],n.set(i.relative_path,r)),r.push({start_line:i.chunk_start,end_line:i.chunk_end})}return n}function Bw(e,t,n,i,r){let o=t===i.relativePath?{excludeStartLine:i.startLine,excludeEndLine:i.endLine}:{},s=r?Uo(e,t,r,o):[];return n.flatMap(a=>Hw(s,a))}function Hw(e,t){let n=e.filter(i=>i>=t.start_line&&i<=t.end_line);return n.length>0?n:[t.start_line]}function Vw(e,t){let n=Lo(e,t);return n?{match:n,identifier:M(n.symbol)||null}:null}function qw(e,t){let n=[],i=new Set;for(let[r,o]of t){let s=Q(e,r);for(let a of o){let c=Qe(s,a),l=`${r}|${a}|${c?.symbol??""}`;i.has(l)||(i.add(l),n.push({file:r,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function Ge(e,t,n={}){let i=es(e,[t],{additive:n.additive,semantic:n.semantic}),r=n.callableOnly?(i.get(t.symbolId)??[]).filter(o=>le(o.symbol)):i.get(t.symbolId)??[];return typeof n.limit=="number"?r.slice(0,n.limit):r}function ap(e,t,n={}){let i=zw(e)?Jw(e,t,{semantic:n.semantic!==!1}):Gw(e).get(t.symbolId)??[];return typeof n.limit=="number"?i.slice(0,n.limit):i}var Uw=re("caller-rows",{clearGroups:["whole-project"]}),Ww=2e4;function zw(e){return(e.get("SELECT COUNT(*) AS count FROM global_symbols")?.count??0)>Ww}function Gw(e){return Uw.get(e,()=>{let t=bt(e),n=es(e,t),i=new Map;for(let s of t)i.set(s.symbol,s.symbolId);let r=new Map,o=new Map;for(let s of t){let a=n.get(s.symbolId);if(!(!a||a.length===0))for(let c of a){let l=i.get(c.symbol);if(l===void 0||l===s.symbolId)continue;let u=r.get(l);u||(u=[],r.set(l,u),o.set(l,new Set));let d=`${s.symbol}|${s.relativePath}`;o.get(l).has(d)||(o.get(l).add(d),u.push({symbol:s.symbol,file:s.relativePath,source:"caller-map-inversion"}))}}return r})}function Jw(e,t,n){let i=[],r=new Set,o=a=>{if(a.symbol===t.symbol)return;let c=`${a.symbol}|${a.file}`;r.has(c)||(r.add(c),i.push(a))};for(let a of Ln(e,t))a.file!==t.relativePath&&o({symbol:a.enclosingSymbol??a.file,file:a.file,source:"resolved-reference"});let s=n.semantic?Kw(e,t):null;if(s)for(let a of Ii(e,s)){if(a.file===t.relativePath||e.isIgnored(a.file))continue;let c=Qe(Q(e,a.file),a.line);o({symbol:c?.symbol??a.file,file:a.file,source:"semantic-reference"})}return i}function Kw(e,t){return e.get(`SELECT
|
|
239
|
+
${e.symbolNoiseFor("gs")}`),n=new Map;for(let i of t){if(!i.relative_path||e.isIgnored(i.relative_path))continue;let r=$(i.symbol);if(!r)continue;let o=n.get(r);o||(o=[],n.set(r,o)),o.some(s=>s.symbolId===i.id)||o.push({symbol:i.symbol,symbolId:i.id,file:i.relative_path})}return n})}var Ip=/[A-Za-z_$][A-Za-z0-9_$]*/g,Lp=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function Rr(e){let t=[],n=!1;for(let i of e)i&&(n=!0,Lp.test(i)||t.push(i));return{candidateNames:e,hasUsableCandidate:n,nonIdentifierNames:t}}function ps(e,t){let n=mI(t)?t:Rr(t);if(n.candidateNames.size===0||!n.hasUsableCandidate)return!0;if(n.candidateNames.size<=512){for(let r of n.candidateNames)if(r){if(Lp.test(r)){if(pI(r).test(e))return!0;continue}if(e.includes(r))return!0}return!1}Ip.lastIndex=0;let i;for(;(i=Ip.exec(e))!==null;)if(n.candidateNames.has(i[0]))return!0;for(let r of n.nonIdentifierNames)if(e.includes(r))return!0;return!1}function mI(e){return"candidateNames"in e}function pI(e){return new RegExp(`(?<![A-Za-z_$0-9])${fI(e)}(?![A-Za-z_$0-9])`)}function fI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}import{performance as K}from"perf_hooks";function ht(e,t,n){if(e.has(t))return e.get(t);let i=n();return e.set(t,i),i}import Dp from"path";function gI(e,t){return e.getReferences().map(n=>{let i=n.getNode();return fs(i,t)})}function hI(e){let t=e;return typeof t.findReferences=="function"?t.findReferences():[]}function Ep(e,t,n,i){let r=[];for(let o of hI(e))for(let s of gI(o,i))s.file===t.relativePath&&s.line>=t.startLine&&s.line<=t.endLine||r.push(s);for(let o of n)r.push(o);return kr(r)}function Np(e,t,n,i){let r=[],o=n?.getStart();for(let s of e.getReferences()){let a=s.getNode();wr(i,a.getSourceFile().getFilePath())===t&&(o!==void 0&&a.getStart()===o||r.push({location:fs(a,i),node:a}))}return r}function fs(e,t){let n=e.getSourceFile(),i=n.getLineAndColumnAtPos(e.getStart());return{file:wr(t,n.getFilePath())??n.getBaseName(),line:i.line-1,column:i.column-1}}function Fp(e,t,n){let i=e.getSourceFile(),r=kc(i,e),o=e.getText(),s=new RegExp(`\\b${yI(o)}\\b`,"g"),a=i.getFullText().split(`
|
|
240
|
+
`),c=[];for(let l=0;l<a.length;l++){if(l===r)continue;let d=a[l]??"";s.lastIndex=0;let u;for(;(u=s.exec(d))!==null;)c.push({file:t,line:l,column:u.index})}return kr(c.filter(l=>wr(n,Dp.join(n,l.file))===t))}function Rc(e){for(let t=e;t;t=t.getParent()){let n=t.getKindName();if(n.includes("Type")||n==="InterfaceDeclaration"||n==="TypeAliasDeclaration")return!0;if(n==="CallExpression"||n==="NewExpression"||n==="ExpressionStatement")return!1}return!1}function kc(e,t){return e.getLineAndColumnAtPos(t.getStart()).line-1}function kr(e){let t=new Set,n=[];for(let i of e){let r=`${i.file}:${i.line}:${i.column}`;t.has(r)||(t.add(r),n.push(i))}return n}function wr(e,t){let n=Dp.relative(e||process.cwd(),t).replace(/\\/g,"/");return!n||n.startsWith("..")?null:n}function yI(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Tp(e,t,n,i){let r=bI(t,i);return r.size===0?new Map:SI(e,n,r)}function bI(e,t){let n=new Map;for(let i of Q(e,t)){let r=$(i.symbol)??i.leaf;if(!r)continue;let o=n.get(r);o||(o=[],n.set(r,o)),o.push(i)}return n}function SI(e,t,n){let i=new Map,r=new Map;return t.forEachDescendant(o=>{for(let s of xI(e,o)){let a=n.get(s);if(!a)continue;let c=kc(t,o);for(let l of a){if(c<l.startLine-1||c>l.endLine+1)continue;let d=Math.abs(c-l.startLine),u=r.get(l.symbolId);u!==void 0&&u<=d||(r.set(l.symbolId,d),i.set(l.symbolId,o))}}}),i}function xI(e,t){let n=[],i=r=>{r&&!n.includes(r)&&n.push(r)};if("getNameNode"in t&&typeof t.getNameNode=="function"){let r=t.getNameNode();i(r?.getText())}if("getName"in t&&typeof t.getName=="function"){let r=t.getName();i(r)}return e.Node.isIdentifier(t)&&i(t.getText()),n}var CI=W("ts-definition-leaf-candidates",{clearGroups:["definition-catalog"]});function Ap(e,t,n,i){let r=$p(e,t),o=_p(r.get(i)??[],n);if(o)return o;let s=[];for(let a of r.values())for(let c of a)((c.leaf||$(c.symbol)||"").includes(i)||c.symbol.includes(i))&&s.push(c);return _p(s,n)}function Mp(e,t){let n=new Map;for(let[i,r]of $p(e,t)){let o=r[0];o&&n.set(i,o)}return n}function $p(e,t){return CI.get(e,t,()=>{let n=new Map;for(let i of Q(e,t)){let r=i.leaf||$(i.symbol);if(!r)continue;let o=n.get(r);o||(o=[],n.set(r,o)),o.push({...i,leaf:r})}for(let i of n.values())i.sort((r,o)=>r.startLine-o.startLine||r.endLine-o.endLine||r.symbolId-o.symbolId);return n})}function _p(e,t){let n=null,i=Number.POSITIVE_INFINITY;for(let r of e){let o=Math.abs(r.startLine-t);(o<i||o===i&&n&&r.startLine<n.startLine)&&(n=r,i=o)}return n}import wc from"path";var Pr=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function Jt(e){let t=e.toLowerCase();return Pr.some(n=>t.endsWith(n))}function jp(e,t){let n=new Map,i=null,r=null,o=()=>(r??=O(e,{extensions:Pr}),r),s=()=>(i??=D("typescript.source-file-index",()=>vI(e.config.projectRoot,t,o()),()=>({projects:t.length,indexedDocuments:o().length})),i),a=c=>Jt(c)?ht(n,c,()=>{let l=Ir(wc.resolve(e.config.projectRoot,c));for(let{project:d,sourceFiles:u}of s()){let m=u.get(l)??null;if(m||(m=d.addSourceFileAtPathIfExists(l)??null,m&&u.set(Ir(m.getFilePath()),m)),m)return{project:d,sourceFile:m}}return null}):null;return{sourceFile:c=>a(c)?.sourceFile??null,sourceFileMatch:a,indexedTypeScriptLikeDocuments:o}}function vI(e,t,n){let i=t.map(({project:r})=>({project:r,sourceFiles:new Map(r.getSourceFiles().map(o=>[Ir(o.getFilePath()),o]))}));for(let r of n){let o=Ir(wc.resolve(e,r));for(let s of i){if(s.sourceFiles.has(o))break;let a=s.project.addSourceFileAtPathIfExists(o)??null;if(a){s.sourceFiles.set(Ir(a.getFilePath()),a);break}}}return i}function Ir(e){return wc.resolve(e)}import hn from"path";import{existsSync as gs,readdirSync as RI,readFileSync as Op}from"fs";function Bp(e){let t=hn.join(e,"package.json");if(!gs(t))return[];let n;try{n=JSON.parse(Op(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(r=>kI(e,r)).flatMap(r=>wI(e,r))}function kI(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=hn.join(e,t);return gs(hn.join(s,"package.json"))?[s]:[]}let n=t.indexOf("*"),i=t.slice(0,n).replace(/\/$/,""),r=t.slice(n+1).replace(/^\//,""),o=hn.join(e,i||".");if(!gs(o))return[];try{return RI(o).map(s=>hn.join(o,s,r)).filter(s=>gs(hn.join(s,"package.json")))}catch{return[]}}function wI(e,t){try{let n=JSON.parse(Op(hn.join(t,"package.json"),"utf8"));if(!n.name)return[];let i=hn.relative(e,t).replace(/\\/g,"/");return[{name:n.name,rootRelative:i,sourceRootRelative:`${i}/src`}]}catch{return[]}}function Hp(e,t){for(let n of e)if(t===n.name||t.startsWith(`${n.name}/`))return n.name;return null}function Vp(e){return[`${e.sourceRootRelative}/index.ts`,`${e.sourceRootRelative}/index.tsx`,`${e.sourceRootRelative}/index.mts`,`${e.sourceRootRelative}/index.cts`]}import{existsSync as Lr,readFileSync as PI,readdirSync as II,statSync as LI}from"fs";import Se from"path";var Ic=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function Lc(e,t){let i=t?Se.dirname(Se.join(e,t)):e,r=Se.resolve(e);for(;i.startsWith(r);){for(let s of Ic){let a=Se.join(i,s);if(Lr(a))return a}let o=Se.dirname(i);if(o===i)break;i=o}for(let o of Ic){let s=Se.join(e,o);if(Lr(s))return s}return null}function qp(e){let t=e.config.projectRoot,n=new Set(Dc(t,e.config.semantic?.typescript?.tsconfigs)),i=O(e,{includeIgnored:!1,extensions:Pr});for(let r of i){let o=Lc(t,r);o&&n.add(Se.resolve(o))}if(n.size===0){let r=Lc(t);r&&n.add(Se.resolve(r))}return[...n].filter(r=>!Up(t,r)).sort((r,o)=>r.localeCompare(o))}function Dc(e,t=[]){let n=new Set;for(let i of t){let r=Se.isAbsolute(i)?i:Se.join(e,i);Lr(r)&&n.add(Se.resolve(r))}for(let i of DI(e))for(let r of Ic){let o=Se.join(i,r);Lr(o)&&n.add(Se.resolve(o))}if(n.size===0){let i=Lc(e);i&&n.add(Se.resolve(i))}return[...n].filter(i=>!Up(e,i)).sort((i,r)=>i.localeCompare(r))}function DI(e){let t=Se.join(e,"package.json");if(!Lr(t))return[];let n;try{n=JSON.parse(PI(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(r=>EI(e,r))}function EI(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=Se.join(e,t);return Pc(s)?[s]:[]}let n=t.indexOf("*"),i=t.slice(0,n).replace(/\/$/,""),r=t.slice(n+1).replace(/^\//,""),o=Se.join(e,i||".");return Pc(o)?II(o).map(s=>Se.join(o,s,r)).filter(Pc):[]}function Pc(e){try{return LI(e).isDirectory()}catch{return!1}}function Up(e,t){let n=Se.relative(e,t).replace(/\\/g,"/");return n.startsWith("..")||n.includes("/node_modules/")||n.startsWith("node_modules/")||n.includes("/dist/")||n.startsWith("dist/")}import{createRequire as NI}from"module";var FI=NI(import.meta.url),Dr;function zp(){if(Dr!==void 0)return Dr;try{Dr=FI("ts-morph")}catch{Dr=null}return Dr}function Wp(e,t){return t.map(n=>({tsconfigPath:n,project:new e.Project({tsConfigFilePath:n,skipFileDependencyResolution:!0})}))}function hs(e,t,n){return{language:"typescript",availability:()=>({available:!1,reason:e,tsconfigPath:t,tsconfigPaths:n}),importUsage:()=>[],referencesFor:()=>[],calleesFor:()=>[],signatureFor:()=>null}}var TI=32;function Yp(e,t){let n=D("typescript.provider.load",()=>zp());if(!n)return hs("ts-morph is not installed");let i=D("typescript.provider.tsconfig-discovery",()=>qp(e));if(i.length===0)return hs("no tsconfig found");try{let r=D("typescript.provider.project-bundles",()=>Wp(n,i),()=>({tsconfigs:i.length}));return D("typescript.provider.construct",()=>new Ec(e,n,r),()=>({tsconfigs:i.length}))}catch(r){return hs(r instanceof Error?r.message:String(r),i[0],i)}}var Ec=class{constructor(t,n,i){this.db=t;this.tsMorph=n;this.projects=i;this.workspacePackages=Bp(t.config.projectRoot),this.sourceFiles=jp(t,i)}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(t=>t.tsconfigPath)}}importUsage(t){return ht(this.importUsageCache,t,()=>{let n=this.sourceFiles.sourceFile(t);if(!n)return[];let i=AI();return D("typescript.import-usage.file",()=>this.importUsageForSourceFile(t,n,i),()=>({file:t,...i}))})}referencesFor(t){return ht(this.referencesCache,t.symbolId,()=>{let n=this.nodeForDefinition(t);return this.referencesForDefinitionNode(t,n)})}referencesForDefinitions(t){let n=new Map,i=me(),r=[];for(let c of t){let l=this.referencesCache.get(c.symbolId);l?n.set(c.symbolId,l):r.push(c)}if(r.length===0)return n;let o=r,s=r.filter(c=>!Kp(c));if(s.length>=TI){let c=this.referencesForDefinitionsBySymbolScan(s);for(let l of s){let d=c.get(l.symbolId)??[];this.referencesCache.set(l.symbolId,d),n.set(l.symbolId,d)}if(o=r.filter(l=>Kp(l)),o.length===0)return n}let a=new Map;for(let c of o){let l=a.get(c.relativePath);l?l.push(c):a.set(c.relativePath,[c])}for(let[c,l]of a){let d=Jp();D("typescript.references-map.file",()=>{let u=this.definitionNodesForFile(c);for(let m of l){i&&(d.cacheMisses+=1);let p=u.get(m.symbolId)??null;i&&(p?d.nodeHits+=1:d.nodeMisses+=1);let f=this.referencesForDefinitionNode(m,p,i?d:void 0);this.referencesCache.set(m.symbolId,f),n.set(m.symbolId,f)}},()=>({relativePath:c,definitions:l.length,...Xp(d)}))}return n}referencesForDefinitionsBySymbolScan(t){let n=me(),i=Jp(),r=new Map,o=new Set(t.map(a=>a.symbolId)),s=new Map(t.map(a=>[a.symbolId,a]));for(let a of t)r.set(a.symbolId,[]);return D("typescript.references-map.inverted-scan",()=>{let a=n?K.now():0;for(let u of t){let m=this.packageImportReferencesForDefinition(u);if(m.length>0){let p=r.get(u.symbolId)??[];p.push(...m),r.set(u.symbolId,p)}n&&(i.packageReferenceCount+=m.length)}n&&(i.packageRefsMs+=K.now()-a);let c=new Map,l=new Set(t.map(u=>u.leaf).filter(Boolean)),d=n?K.now():0;for(let u of this.sourceFiles.indexedTypeScriptLikeDocuments()){if(this.db.isIgnored(u))continue;let m=this.sourceFiles.sourceFile(u);m&&(n&&(i.scanFiles+=1),this.addReferencesFromSourceFileScan(m,u,o,s,l,c,r,n?i:void 0))}n&&(i.scanMs+=K.now()-d);for(let[u,m]of r){let p=kr(m);r.set(u,p),n&&(i.referenceCount+=p.length)}},()=>({definitions:t.length,...Xp(i)})),r}addReferencesFromSourceFileScan(t,n,i,r,o,s,a,c){let l=this.compilerCheckerForSourceFile(t),d=t.compilerNode,u=jI(t),m=p=>{if(this.tsMorph.ts.isIdentifier(p)){if(c&&(c.identifiers+=1),!o.has(p.text)&&!u.has(p.text)){this.tsMorph.ts.forEachChild(p,m);return}let f=this.compilerReferenceSymbol(l,p,c);if(f){let g;if(s.has(f)?g=s.get(f)??null:(g=this.definitionFromCompilerSymbol(f),s.set(f,g)),c&&(g?c.targetHits+=1:c.targetMisses+=1),g&&i.has(g.symbolId)){c&&(c.requestedHits+=1);let b=r.get(g.symbolId);if(b&&!BI(b,n,Gp(d,p))){let x=a.get(g.symbolId)??[],S=d.getLineAndCharacterOfPosition(p.getStart(d));x.push({file:n,line:S.line,column:S.character}),a.set(g.symbolId,x)}}}}this.tsMorph.ts.forEachChild(p,m)};m(d)}compilerReferenceSymbol(t,n,i){i&&(i.symbolLookups+=1);let r=t.getSymbolAtLocation(n);if(r){if((r.flags&this.tsMorph.ts.SymbolFlags.Alias)===0)return r;try{return i&&(i.aliasResolutions+=1),t.getAliasedSymbol(r)}catch{return r}}}calleesFor(t){return ht(this.calleesCache,t.symbolId,()=>ht(this.fileCalleesCache,t.relativePath,()=>this.calleeMapForFile(t.relativePath)).get(t.symbolId)??[])}calleesForDefinitions(t){let n=new Map,i=new Map;for(let r of t){let o=i.get(r.relativePath);o?o.push(r):i.set(r.relativePath,[r])}for(let[r,o]of i){let s=this.fileCalleesCache.get(r),a=new Set(o.map(l=>l.symbolId)),c=s??this.calleeMapForFile(r,a);for(let l of o){let d=c.get(l.symbolId)??[];this.calleesCache.set(l.symbolId,d),n.set(l.symbolId,d)}}return n}referencesForDefinitionNode(t,n,i){let r=i?K.now():0,o=this.packageImportReferencesForDefinition(t);if(i&&(i.packageRefsMs+=K.now()-r,i.packageReferenceCount+=o.length),!n)return o;let s=i?K.now():0,a=Ep(n,t,o,this.db.config.projectRoot);return i&&(i.semanticRefsMs+=K.now()-s,i.referenceCount+=a.length),a}signatureFor(t){return ht(this.signatureCache,t.symbolId,()=>{let n=this.nodeForDefinition(t);if(!n||!this.tsMorph.Node.isFunctionDeclaration(n)&&!this.tsMorph.Node.isMethodDeclaration(n)&&!this.tsMorph.Node.isArrowFunction(n)&&!this.tsMorph.Node.isFunctionExpression(n)&&!this.tsMorph.Node.isConstructorDeclaration(n))return null;let i=n.getType().getCallSignatures()[0];if(!i)return null;let r=i.getParameters().map(s=>{let a=s.getDeclarations()[0],c=a?s.getTypeAtLocation(a).getText(a):s.getValueDeclaration()?.getType().getText()??"unknown";return Qp(c)}),o=i.getReturnType().getText(n);return`(${r.join(",")})=>${Qp(o)}`})}importUsageForSourceFile(t,n,i){let r=[],o=new Map;for(let s of n.getImportDeclarations()){i.declarations+=1;let a=ft(this.db,t,s.getModuleSpecifierValue()),c=s.getImportClause()?.isTypeOnly()??!1;for(let l of Nc(s)){i.entries+=1;let d=c?null:l.identifier?.getSymbol()?.compilerSymbol??null;!c&&l.identifier&&(d?i.bindingSymbols+=1:i.missingBindingSymbols+=1);let u={sourcePath:a,entry:l,typeOnlyDeclaration:c,bindingSymbol:d,references:[]};if(r.push(u),c||!l.localName||!d)continue;let m=o.get(l.localName);m?m.push(u):o.set(l.localName,[u])}}return o.size>0&&n.forEachDescendant(s=>{if(s.getKindName()!=="Identifier")return;let a=o.get(s.getText());if(!a||MI(s))return;i.scannedIdentifiers+=1;let c=s.getSymbol()?.compilerSymbol;if(i.symbolLookups+=1,!!c){for(let l of a)if(l.bindingSymbol===c){l.references.push({location:fs(s,this.db.config.projectRoot),node:s}),i.matchedReferences+=1;break}}}),r.map(s=>s.typeOnlyDeclaration?_I(t,s.sourcePath,s.entry):s.entry.identifier&&!s.bindingSymbol?(i.fallbackEntries+=1,this.valueImportUsageForEntry(t,s.sourcePath,s.entry)):this.valueImportUsageFromLocations(t,s.sourcePath,s.entry,s.references))}valueImportUsageForEntry(t,n,i){let r=i.identifier?i.identifier.findReferences():[],o=[];for(let s of r)for(let a of Np(s,t,i.identifier,this.db.config.projectRoot))o.push(a);return this.valueImportUsageFromLocations(t,n,i,o)}valueImportUsageFromLocations(t,n,i,r){let o=r.some(c=>!Rc(c.node)),s=r.some(c=>Rc(c.node)),a=i.isTypeOnly;return{importer:t,sourcePath:n,importedName:i.importedName,localName:i.localName,kind:i.kind,isTypeOnly:a,isUsed:a||r.length>0,isTypeUsed:a||s,isValueUsed:o,references:r.map(c=>c.location)}}packageImportReferencesForDefinition(t){return this.packageImportReferences().get(t.symbolId)??[]}packageImportReferences(){if(this.packageImportReferenceIndex)return this.packageImportReferenceIndex;let t=new Map,n=this.packageExports();for(let i of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(t,n,i);for(let[i,r]of t)t.set(i,kr(r));return this.packageImportReferenceIndex=t,t}addPackageImportReferencesForDocument(t,n,i){if(this.db.isIgnored(i))return;let r=this.sourceFiles.sourceFileMatch(i);if(r)for(let o of r.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(t,n,i,o)}addPackageImportReferencesForDeclaration(t,n,i,r){let o=Hp(this.workspacePackages,r.getModuleSpecifierValue());if(!o)return;let s=n.get(o);if(s)for(let a of Nc(r)){if(a.kind!=="named"||!a.identifier)continue;let c=s.get(a.importedName);if(!c||c.size===0)continue;let l=Fp(a.identifier,i,this.db.config.projectRoot);l.length>0&&qI(t,c,l)}}packageExports(){if(this.packageExportIndex)return this.packageExportIndex;let t=new Map;for(let n of this.workspacePackages){let i=new Map;for(let r of Vp(n))this.collectPackageExports(n,r,i,new Set);i.size>0&&t.set(n.name,i)}return this.packageExportIndex=t,t}collectPackageExports(t,n,i,r){if(r.has(n))return;r.add(n);let o=this.sourceFiles.sourceFile(n);if(o)for(let s of o.getExportDeclarations()){let a=s.getModuleSpecifierValue(),c=a?ft(this.db,n,a):n;if(!c||!c.startsWith(`${t.sourceRootRelative}/`))continue;let l=s.getNamedExports();if(l.length===0){if(s.isNamespaceExport())continue;this.collectPackageExports(t,c,i,r);continue}for(let d of l){let u=d.getNameNode().getText(),m=d.getAliasNode()?.getText()??u,p=this.indexedDefinitionByLeaf(c,u);if(!p)continue;let f=i.get(m);f||(f=new Set,i.set(m,f)),f.add(p.symbolId)}}}indexedDefinitionByLeaf(t,n){return ht(this.indexedDefinitionLeafCache,t,()=>Mp(this.db,t)).get(n)??null}nodeForDefinition(t){return ht(this.definitionNodeCache,t.symbolId,()=>this.definitionNodesForFile(t.relativePath).get(t.symbolId)??null)}definitionNodesForFile(t){return ht(this.fileDefinitionNodeCache,t,()=>{let n=this.sourceFiles.sourceFile(t);return n?Tp(this.tsMorph,this.db,n,t):new Map})}definitionFromCompilerSymbol(t,n){let i=t.name,r=n?K.now():0,o=t.declarations??[];n&&(n.declarationsMs+=K.now()-r,n.declarationChecks+=o.length);for(let s of o){let a=n?K.now():0,c=s.getSourceFile(),l=wr(this.db.config.projectRoot,c.fileName),d=c.getLineAndCharacterOfPosition(s.getStart(c)).line;if(n&&(n.declarationLocationMs+=K.now()-a),!l||this.db.isIgnored(l))continue;let u=n?K.now():0,m=Ap(this.db,l,d,i);if(n&&(n.indexedLookupMs+=K.now()-u),m)return{symbolId:m.symbolId,symbol:m.symbol,file:m.relativePath,line:m.startLine}}return null}calleeMapForFile(t,n){let i=me(),r=0,o=0,s=0,a=0,c=0,l=0,d=0,u=0,m=i?HI():void 0;return D("typescript.callee-map.file",()=>{let p=i?K.now():0,f=this.sourceFiles.sourceFile(t);if(i&&(c=Math.round(K.now()-p)),!f)return new Map;let g=i?K.now():0,b=Q(this.db,t).sort((k,T)=>k.startLine-T.startLine||T.endLine-k.endLine);if(i&&(l=Math.round(K.now()-g)),r=b.length,b.length===0)return new Map;let x=new Map,S=i?K.now():0,R=this.compilerCheckerForSourceFile(f),C=f.compilerNode;i&&(d=Math.round(K.now()-S));let y=new Map,w=k=>{if(this.tsMorph.ts.isCallExpression(k)||this.tsMorph.ts.isNewExpression(k)){i&&(o+=1);let T=this.semanticCalleeForCallNode(R,C,b,k,y,n,m);T&&(i&&(s+=1),$I(x,T.callerId,T.target))}this.tsMorph.ts.forEachChild(k,w)},L=i?K.now():0;w(C),i&&(u=Math.round(K.now()-L));for(let[k,T]of x)x.set(k,UI(T));return a=x.size,x},()=>({relativePath:t,definitions:r,callNodes:o,resolvedCallees:s,outputRows:a,requestedDefinitions:n?.size??r,sourceFileLookupMs:c,definitionsLoadMs:l,checkerLookupMs:d,traversalMs:u,...m?VI(m):{}}))}semanticCalleeForCallNode(t,n,i,r,o,s,a){let c=a?K.now():0,l=OI(i,Gp(n,r));if(a&&(a.callerLookupMs+=K.now()-c),!l)return null;if(s&&!s.has(l.symbolId))return a&&(a.skippedUnrequestedCallers+=1),null;let d=r.expression,u=this.compilerSymbolForExpression(t,d,a),m=null;if(u)if(a&&(a.targetSymbolHits+=1),o.has(u))a&&(a.compilerSymbolCacheHits+=1),m=o.get(u)??null;else{a&&(a.compilerSymbolCacheMisses+=1);let p=a?K.now():0;m=this.definitionFromCompilerSymbol(u,a),a&&(a.targetLookupMs+=K.now()-p),o.set(u,m)}else a&&(a.targetMisses+=1);return m?{callerId:l.symbolId,target:{symbol:m.symbol,file:m.file,line:m.line}}:null}compilerSymbolForExpression(t,n,i){let r=i?K.now():0,o=t.getSymbolAtLocation(n);if(i&&(i.expressionSymbolMs+=K.now()-r),o)return o;i&&(i.typeFallbacks+=1);let s=i?K.now():0,a=t.getTypeAtLocation(n).getSymbol();return i&&(i.typeSymbolMs+=K.now()-s),a}compilerCheckerForSourceFile(t){let n=t.getProject(),i=this.compilerCheckerCache.get(n);return i||(i=n.getTypeChecker().compilerObject,this.compilerCheckerCache.set(n,i)),i}};function Nc(e){let t=[],n=e.getDefaultImport();n&&t.push({identifier:n,importedName:"default",localName:n.getText(),kind:"default",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});let i=e.getNamespaceImport();i&&t.push({identifier:i,importedName:"*",localName:i.getText(),kind:"namespace",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});for(let r of e.getNamedImports()){let o=r.getNameNode(),a=r.getAliasNode()??(o.getKindName()==="Identifier"?o:null);t.push({identifier:a,importedName:o.getText(),localName:a?.getText()??o.getText(),kind:"named",isTypeOnly:r.isTypeOnly()||(e.getImportClause()?.isTypeOnly()??!1)})}return t.length===0&&t.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),t}function _I(e,t,n){return{importer:e,sourcePath:t,importedName:n.importedName,localName:n.localName,kind:n.kind,isTypeOnly:!0,isUsed:!0,isTypeUsed:!0,isValueUsed:!1,references:[]}}function AI(){return{declarations:0,entries:0,bindingSymbols:0,missingBindingSymbols:0,scannedIdentifiers:0,symbolLookups:0,matchedReferences:0,fallbackEntries:0}}function MI(e){for(let t=e;t;t=t.getParent())if(t.getKindName()==="ImportDeclaration")return!0;return!1}function $I(e,t,n){let i=e.get(t);i||(i=[],e.set(t,i)),i.push(n)}function jI(e){let t=new Set;for(let n of e.getImportDeclarations())for(let i of Nc(n))i.localName&&t.add(i.localName);return t}function OI(e,t){let n=null;for(let i of e)t<i.startLine||t>i.endLine||(!n||i.startLine>=n.startLine)&&(n=i);return n}function Gp(e,t){return e.getLineAndCharacterOfPosition(t.getStart(e)).line}function BI(e,t,n){return t===e.relativePath&&n>=e.startLine&&n<=e.endLine}function Kp(e){return e.symbol.includes("#")?se(e.symbol)==="type"&&e.relativePath.endsWith(".d.ts"):!1}function HI(){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 VI(e){return{...e,callerLookupMs:Math.round(e.callerLookupMs),expressionSymbolMs:Math.round(e.expressionSymbolMs),typeSymbolMs:Math.round(e.typeSymbolMs),targetLookupMs:Math.round(e.targetLookupMs),declarationsMs:Math.round(e.declarationsMs),declarationLocationMs:Math.round(e.declarationLocationMs),indexedLookupMs:Math.round(e.indexedLookupMs)}}function Jp(){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}}function Xp(e){return{...e,scanMs:Math.round(e.scanMs),packageRefsMs:Math.round(e.packageRefsMs),semanticRefsMs:Math.round(e.semanticRefsMs)}}function qI(e,t,n){for(let i of t){let r=e.get(i)??[];r.push(...n),e.set(i,r)}}function UI(e){let t=new Set,n=[];for(let i of e){let r=`${i.symbol}|${i.file}|${i.line}`;t.has(r)||(t.add(r),n.push(i))}return n}function Qp(e){return e.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var Fc=new WeakMap;on({name:"semantic-provider",groups:["semantic-provider"],clearAll:e=>Fc.delete(e)});function Tc(e,t){let n=`${e.config.projectRoot}:typescript-workspace`,i=Fc.get(e);i||(i=new Map,Fc.set(e,i));let r=i.get(n);if(r)return r;let o=Yp(e,t);return i.set(n,o),o}function Xt(e){return{capability:(t,n)=>rf(e,t,n),importUsage:t=>zI(e,t),references:t=>WI(e,t),callerMap:t=>GI(e,t),calleeMap:t=>XI(e,t),signature:t=>QI(e,t)}}function Er(e,t){return Xt(e).importUsage(t)}function zI(e,t){let n=Nr(e,t);return n?n.importUsage(t):[]}function $i(e,t){return Xt(e).references(t)}function WI(e,t){let n=Nr(e,t.relativePath);return n?n.referencesFor(t):[]}function st(e,t){return Xt(e).callerMap(t)}function GI(e,t){let n=me(),i=new Map,r=In(e),o=[],s=[],a=[],c=0,l=0,d=0,u=0;if(D("semantic.references.cache-scan",()=>{for(let m of t){if(!r||!Jt(m.relativePath)){n&&!Jt(m.relativePath)&&(c+=1),a.push(m);continue}let p=wd(e,m.relativePath,m.symbol,r);if(p!==null){let f=JI(p);if(f){n&&(l+=1),u+=ef(e,i,m,f);continue}n&&(d+=1)}s.push(m)}},()=>({definitions:t.length,skippedNonTs:c,cacheHits:l,parseFailures:d,misses:s.length,unkeyed:a.length,resultRows:i.size,callerFiles:u})),s.length>0||a.length>0){let m=[...a,...s],p=0,f=D("semantic.references.compute-misses",()=>{let g=KI(e,m);return p=g.size,g},()=>({definitions:m.length,misses:s.length,unkeyed:a.length,rows:p}));for(let g of m)u+=ef(e,i,g,f.get(g.symbolId)??[]);if(r)for(let g of s)o.push({relativePath:g.relativePath,symbol:g.symbol,projectFingerprint:r,payload:JSON.stringify(f.get(g.symbolId)??[])})}return o.length>0&&(rf(e,"semantic-references").available?D("semantic.references.cache-write",()=>Id(e,o),()=>({entries:o.length})):D("semantic.references.cache-write-skip",()=>{},()=>({reason:"provider-unavailable",entries:o.length}))),i}function KI(e,t){let n=me(),i=new Map,r=0,o=0,s=0,a=0;return D("semantic.references.provider-loop",()=>{let c=new Map,l=[];for(let d of t){let u=Nr(e,d.relativePath);if(!u){n&&(o+=1);continue}if(n&&(r+=1),u.referencesForDefinitions){let m=c.get(u);m?m.push(d):c.set(u,[d])}else l.push({provider:u,definition:d})}for(let[d,u]of c){let m=d.referencesForDefinitions(u);for(let p of u){let f=m.get(p.symbolId)??[];Zp(i,p.symbolId,f,n,g=>{s+=1,a+=g})}}for(let{provider:d,definition:u}of l){let m=d.referencesFor(u);Zp(i,u.symbolId,m,n,p=>{s+=1,a+=p})}return i},()=>({definitions:t.length,providerHits:r,providerMisses:o,definitionsWithReferences:s,referenceCount:a,rows:i.size}))}function Zp(e,t,n,i,r){e.set(t,n),i&&n.length>0&&r(n.length)}function ef(e,t,n,i){let r=0;for(let o of i){if(o.file===n.relativePath||e.isIgnored(o.file))continue;let s=t.get(n.symbolId);s||(s=new Set,t.set(n.symbolId,s));let a=s.size;s.add(o.file),s.size!==a&&(r+=1)}return r}function JI(e){try{return JSON.parse(e)}catch{return null}}function ys(e,t){return Xt(e).calleeMap(t)}function XI(e,t){let n=me(),i=new Map,r=0,o=0,s=0,a=0;return D("semantic.callees.provider-loop",()=>{let c=new Map,l=[];for(let d of t){let u=Nr(e,d.relativePath);if(!u){n&&(o+=1);continue}n&&(r+=1);let m=d;if(u.calleesForDefinitions){let p=c.get(u);p?p.push(m):c.set(u,[m])}else l.push({provider:u,definition:m})}for(let[d,u]of c){let m=d.calleesForDefinitions(u);for(let p of u){let f=m.get(p.symbolId)??[];tf(i,p.symbolId,f,n,g=>{s+=1,a+=g})}}for(let{provider:d,definition:u}of l){let m=d.calleesFor(u);tf(i,u.symbolId,m,n,p=>{s+=1,a+=p})}return i},()=>({definitions:t.length,providerHits:r,providerMisses:o,definitionsWithCallees:s,calleeCount:a,rows:i.size}))}function tf(e,t,n,i,r){n.length>0&&(e.set(t,n),i&&r(n.length))}function nf(e,t){return Xt(e).signature(t)}function QI(e,t){let n=Nr(e,t.relativePath);return n?n.signatureFor(t):null}function rf(e,t,n){if(n!==void 0&&!Jt(n))return{slot:t,language:"typescript",available:!1,reason:"semantic evidence is only available for TypeScript files"};try{return{slot:t,language:"typescript",...Tc(e,n).availability()}}catch(i){return{slot:t,language:"typescript",available:!1,reason:i instanceof Error?i.message:String(i)}}}function Nr(e,t){if(!Jt(t))return null;let n=Tc(e,t);return n.availability().available?n:null}var YI=W("source-import-paths-by-local-name",{clearGroups:["whole-project","source-file"]});function bs(e,t){let n=us(t);return YI.get(e,n,()=>ZI(e,n))}function ZI(e,t){let n=new Map;for(let i of oe(e,t)){if(!i.sourcePath)continue;let r=i.localName??i.importedName;if(r&&of(n,r,i.sourcePath),i.kind==="namespace")for(let o of i.usedMembers)of(n,o,i.sourcePath)}return n}function of(e,t,n){let i=e.get(t);i||(i=new Set,e.set(t,i)),i.add(n)}function ji(e,t,n){let i=Hn(e).get(n);if(!i||i.length===0)return[];if(i.length===1)return[Fr(i[0])];let r=i.filter(c=>c.file===t);if(r.length>0)return r.map(Fr);let o=bs(e,t),s=o.get(n);if(s)for(let c of s){let l=i.filter(d=>Dt(c,d.file));if(l.length>0)return l.map(Fr)}let a=new Set;for(let c of o.values())for(let l of c)a.add(l);for(let c of a){let l=i.filter(d=>Dt(c,d.file));if(l.length>0&&l.length===i.length)return l.map(Fr)}return[]}function af(e,t,n){let i=ji(e,t,n);if(i.length>0)return i;let r=Hn(e).get(n);return!r||r.length===0?[]:r.map(Fr)}function cf(e,t,n={}){let i=os(e,t);if(!i)return[];let r=$(i.symbol);if(!r)return[];if(n.semantic!==!1){let s=$i(e,{...i,leaf:r,parentTypeName:null,isFunctionLike:!1,isTypeLike:!1,kind:null,documentation:null,enclosingSymbol:null});if(s.length>0){let a=new Map;for(let c of s){let l=a.get(c.file)??[];l.push(c.line),a.set(c.file,l)}return sf(e,a)}}let o=new Map;for(let s of et(e)){let a=M(e,s);if(!a||a.indexOf(r)===-1||s!==i.relativePath&&!ji(e,s,r).some(d=>d.symbolId===i.symbolId))continue;let c=cs(e,s,r,s===i.relativePath?{excludeStartLine:i.startLine,excludeEndLine:i.endLine}:{});c.length>0&&o.set(s,c)}return sf(e,o)}function lf(e,t,n={}){let i=new Map;for(let c of t){if(!c.leaf)continue;let l=i.get(c.leaf)??[];l.push(c),i.set(c.leaf,l)}if(i.size===0)return new Map;let r=new Set(t.map(c=>c.symbolId)),o=new Set(i.keys()),s=Rr(o),a=new Map;for(let c of et(e)){if(n.skipPath?.(c)||!ps(M(e,c),s))continue;let l=Cp(e,c);if(l.size!==0){for(let d of l)if(i.has(d))for(let u of ji(e,c,d)){if(!r.has(u.symbolId)||c===u.relativePath)continue;let m=a.get(u.symbolId);m||(m=new Set,a.set(u.symbolId,m)),m.add(c)}}}return a}function Fr(e){return{symbolId:e.symbolId,symbol:e.symbol,relativePath:e.file}}function sf(e,t){let n=[],i=new Set;for(let[r,o]of t){let s=Q(e,r);for(let a of o){let c=ot(s,a),l=`${r}|${a}|${c?.symbol??""}`;i.has(l)||(i.add(l),n.push({file:r,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function Vn(e,t){let n=oL(e,t);return n?sL(e,tL(e,n.match,n.identifier)):[]}function yn(e,t,n={}){return eL(e,t,n).map(i=>({file:i.file,line:i.line,enclosingSymbol:i.enclosingSymbol}))}function eL(e,t,n={}){let i=cf(e,t,{semantic:n.semantic}),r=i.length>0?uf(i,"source-attribution"):uf(Vn(e,t),"scip-reference-chunk");return n.includeIgnored===!0?r:r.filter(o=>!e.isIgnored(o.file))}function uf(e,t){return e.map(n=>({...n,provenance:t}))}function tL(e,t,n){let i=new Map;for(let[r,o]of nL(e,t.symbolId))i.set(r,iL(e,r,o,t,n));return i}function nL(e,t){let n=new Map;for(let i of Mi(e,[t])){if(e.isIgnored(i.relative_path))continue;let r=n.get(i.relative_path);r||(r=[],n.set(i.relative_path,r)),r.push({start_line:i.chunk_start,end_line:i.chunk_end})}return n}function iL(e,t,n,i,r){let o=t===i.relativePath?{excludeStartLine:i.startLine,excludeEndLine:i.endLine}:{},s=r?cs(e,t,r,o):[];return n.flatMap(a=>rL(s,a))}function rL(e,t){let n=e.filter(i=>i>=t.start_line&&i<=t.end_line);return n.length>0?n:[t.start_line]}function oL(e,t){let n=os(e,t);return n?{match:n,identifier:$(n.symbol)||null}:null}function sL(e,t){let n=[],i=new Set;for(let[r,o]of t){let s=Q(e,r);for(let a of o){let c=ot(s,a),l=`${r}|${a}|${c?.symbol??""}`;i.has(l)||(i.add(l),n.push({file:r,line:a,enclosingSymbol:c?.symbol??null}))}}return n}import{SymbolInformation_Kind as ae}from"@c4312/scip";var Ss=new Map(Object.entries(ae).filter(([e,t])=>Number.isInteger(Number(e))&&typeof t=="string").map(([e,t])=>[Number(e),t])),df=new Map([...Ss.entries()].map(([e,t])=>[t.toLowerCase(),e]));function _c(e){return Ss.get(e)??"Unknown"}function mf(){return[ae.Function,ae.Method,ae.Macro,ae.Constructor,ae.Getter,ae.Setter,ae.StaticMethod,ae.SingletonMethod,ae.AbstractMethod,ae.ProtocolMethod,ae.TraitMethod]}function pf(){return[ae.Class,ae.Interface,ae.Struct,ae.Trait,ae.Type,ae.TypeAlias,ae.Enum,ae.Union,ae.Protocol]}function Je(e,t,n={}){let i=xs(e,[t],{additive:n.additive,semantic:n.semantic}),r=n.callableOnly?(i.get(t.symbolId)??[]).filter(o=>he(o.symbol)||o.source==="ast-callsite"):i.get(t.symbolId)??[];return typeof n.limit=="number"?r.slice(0,n.limit):r}function gf(e,t,n={}){let i=lL(e)?dL(e,t,{semantic:n.semantic!==!1}):uL(e).get(t.symbolId)??[];return typeof n.limit=="number"?i.slice(0,n.limit):i}var aL=ie("caller-rows",{clearGroups:["whole-project"]}),cL=2e4;function lL(e){return(e.get("SELECT COUNT(*) AS count FROM global_symbols")?.count??0)>cL}function uL(e){return aL.get(e,()=>{let t=Lt(e),n=xs(e,t),i=new Map;for(let s of t)i.set(s.symbol,s.symbolId);let r=new Map,o=new Map;for(let s of t){let a=n.get(s.symbolId);if(!(!a||a.length===0))for(let c of a){let l=i.get(c.symbol);if(l===void 0||l===s.symbolId)continue;let d=r.get(l);d||(d=[],r.set(l,d),o.set(l,new Set));let u=`${s.symbol}|${s.relativePath}`;o.get(l).has(u)||(o.get(l).add(u),d.push({symbol:s.symbol,file:s.relativePath,source:"caller-map-inversion"}))}}return r})}function dL(e,t,n){let i=[],r=new Set,o=a=>{if(a.symbol===t.symbol)return;let c=`${a.symbol}|${a.file}`;r.has(c)||(r.add(c),i.push(a))};for(let a of Vn(e,t))a.file!==t.relativePath&&o({symbol:a.enclosingSymbol??a.file,file:a.file,source:"resolved-reference"});let s=n.semantic?mL(e,t):null;if(s)for(let a of $i(e,s)){if(a.file===t.relativePath||e.isIgnored(a.file))continue;let c=ot(Q(e,a.file),a.line);o({symbol:c?.symbol??a.file,file:a.file,source:"semantic-reference"})}return i}function mL(e,t){let n=mf().join(", "),i=pf().join(", ");return e.get(`SELECT
|
|
221
241
|
d.id AS documentId,
|
|
222
242
|
gs.id AS symbolId,
|
|
223
243
|
gs.symbol,
|
|
@@ -226,8 +246,8 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
226
246
|
COALESCE(der.end_line, c.end_line) AS endLine,
|
|
227
247
|
COALESCE(gs.display_name, '') AS leaf,
|
|
228
248
|
NULL AS parentTypeName,
|
|
229
|
-
CASE WHEN gs.kind IN (
|
|
230
|
-
CASE WHEN gs.kind IN (
|
|
249
|
+
CASE WHEN gs.kind IN (${n}) OR gs.symbol LIKE '%().' THEN 1 ELSE 0 END AS isFunctionLike,
|
|
250
|
+
CASE WHEN gs.kind IN (${i}) THEN 1 ELSE 0 END AS isTypeLike,
|
|
231
251
|
gs.kind AS kind,
|
|
232
252
|
gs.documentation AS documentation,
|
|
233
253
|
gs.enclosing_symbol AS enclosingSymbol
|
|
@@ -236,11 +256,11 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
236
256
|
LEFT JOIN chunks c ON c.document_id = der.document_id
|
|
237
257
|
JOIN documents d ON d.id = COALESCE(der.document_id, c.document_id)
|
|
238
258
|
WHERE gs.id = ?
|
|
239
|
-
LIMIT 1`,t.symbolId)??null}function
|
|
259
|
+
LIMIT 1`,t.symbolId)??null}function xs(e,t,n={}){if(t.length===0)return new Map;let i=n.additive??!1,r=[],o=[];for(let d of t)H(d.relativePath)&&xi(e,d.relativePath)!==null?r.push(d):o.push(d);let s=new Map,a=new Map,c=d=>{for(let[u,m]of d){let p=s.get(u);p||(p=[],s.set(u,p));let f=a.get(u);f||(f=new Set,a.set(u,f));for(let g of m){let b=`${g.symbol}|${g.chunkId}`;f.has(b)||(f.add(b),p.push(g))}}};r.length>0&&c(yL(e,r)),n.semantic!==!1&&c(RL(pL(e,t)));let l=i?t:o;return l.length>0&&c(CL(e,l)),s}function pL(e,t){let n=me(),i=new Map,r=[],o=[],s=0,a=0,c=0,l=0;if(D("semantic.callees.cache-scan",()=>{for(let f of t){if(!Jt(f.relativePath)){n&&(s+=1);continue}let g=M(e,f.relativePath);if(!g){n&&(a+=1),o.push(f);continue}let b=re(e,f.relativePath,g),x=hL(e,f.relativePath),S=kd(e,f.relativePath,f.symbol,b,x);if(S!==null){let R=fL(S);if(R){n&&(c+=1),R.length>0&&i.set(f.symbolId,R);continue}n&&(l+=1)}r.push({def:f,contentHash:b,depsDigest:x})}},()=>({definitions:t.length,skippedNonTs:s,sourceMissing:a,cacheHits:c,parseFailures:l,misses:r.length,unkeyed:o.length,resultRows:i.size})),r.length===0&&o.length===0)return i;let d=[...o,...r.map(f=>f.def)],u=0,m=D("semantic.callees.compute-misses",()=>{let f=ys(e,d);return u=f.size,f},()=>({definitions:d.length,misses:r.length,unkeyed:o.length,rows:u}));for(let[f,g]of m)i.set(f,g);if(Xt(e).capability("semantic-callees").available){let f=r.map(g=>({relativePath:g.def.relativePath,symbol:g.def.symbol,contentHash:g.contentHash,depsDigest:g.depsDigest,payload:JSON.stringify(m.get(g.def.symbolId)??[])}));D("semantic.callees.cache-write",()=>Pd(e,f),()=>({entries:f.length}))}else D("semantic.callees.cache-write-skip",()=>{},()=>({reason:"provider-unavailable",misses:r.length}));return i}function fL(e){try{return JSON.parse(e)}catch{return null}}var gL=W("semantic-deps-digest",{clearGroups:["whole-project","source-file"]});function hL(e,t){return gL.get(e,t,()=>{let i=[...ye(e).get(t)??[]].sort().map(r=>`${r}:${re(e,r,M(e,r))}`);return Vt(i.join("|"))})}function yL(e,t){let n=new Map,i=bL(t,n),r=Hn(e);for(let[o,s]of i){let a=xi(e,o);if(!a)continue;let c=yc(s);for(let l of a){let d=c.get(l.line);if(!d)continue;let u=SL(e,o,r,l);u&&u.symbol!==d.symbol&&n.get(d.symbolId).push({symbol:u.symbol,file:u.file,chunkId:l.line,source:"ast-callsite"})}}return n}function bL(e,t){let n=new Map;for(let i of e){let r=n.get(i.relativePath);r?r.push(i):n.set(i.relativePath,[i]),t.set(i.symbolId,[])}for(let i of n.values())i.sort((r,o)=>r.endLine-r.startLine-(o.endLine-o.startLine));return n}function SL(e,t,n,i){let r=ds(t,n.get(i.calleeLeaf)??[]);if(r.length===0)return null;let o=xL(e,t,r,i.calleeQualifier);return o||ms(e,t,r,i.memberAccess)}function xL(e,t,n,i){if(!i||H(t)!=="clojure")return null;let o=oe(e,t).filter(s=>s.kind==="namespace"&&s.localName===i&&s.sourcePath).map(s=>s.sourcePath);for(let s of o){let a=n.find(c=>Dt(s,c.file));if(a)return a}return n.find(s=>/`([^`]+)`\//.exec(s.symbol)?.[1]===i)??null}function CL(e,t){if(t.length===0)return new Map;let i=Ac(t.map(p=>p.documentId)).flatMap(p=>e.all(`SELECT c.document_id, c.id AS chunk_id, c.start_line, c.end_line, m.symbol_id
|
|
240
260
|
FROM mentions m
|
|
241
261
|
JOIN chunks c ON m.chunk_id = c.id
|
|
242
262
|
WHERE m.role != 1
|
|
243
|
-
AND c.document_id IN (${
|
|
263
|
+
AND c.document_id IN (${p.map(()=>"?").join(",")})`,...p)),r=new Map;for(let p of i)r.has(p.document_id)||r.set(p.document_id,[]),r.get(p.document_id).push(p);let s=Ac(i.map(p=>p.symbol_id)).flatMap(p=>e.all(`SELECT gs.id AS symbol_id, gs.symbol,
|
|
244
264
|
COALESCE(der.document_id, def_chunk.document_id) AS document_id
|
|
245
265
|
FROM global_symbols gs
|
|
246
266
|
LEFT JOIN defn_enclosing_ranges der ON der.symbol_id = gs.id
|
|
@@ -249,14 +269,14 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
249
269
|
FROM mentions m
|
|
250
270
|
JOIN chunks c ON m.chunk_id = c.id
|
|
251
271
|
WHERE m.role = 1
|
|
252
|
-
AND m.symbol_id IN (${
|
|
272
|
+
AND m.symbol_id IN (${p.map(()=>"?").join(",")})
|
|
253
273
|
GROUP BY m.symbol_id
|
|
254
274
|
) def_chunk ON def_chunk.symbol_id = gs.id
|
|
255
|
-
WHERE gs.id IN (${
|
|
256
|
-
WHERE id IN (${
|
|
257
|
-
`);for(let a=0;a<s.length;a++){let c=s[a]??"";n.some(l=>new RegExp(`@${l}\\b|\\b${l}:`).test(c))&&i.push({relativePath:r,line:a})}}return i}function
|
|
275
|
+
WHERE gs.id IN (${p.map(()=>"?").join(",")})`,...p,...p)),a=Ac([...t.map(p=>p.documentId),...s.flatMap(p=>p.document_id===null?[]:[p.document_id])]),c=new Map(a.flatMap(p=>e.all(`SELECT id, relative_path FROM documents
|
|
276
|
+
WHERE id IN (${p.map(()=>"?").join(",")})`,...p).map(f=>[f.id,f.relative_path]))),l=new Map;for(let p of s)l.has(p.symbol_id)||l.set(p.symbol_id,{symbol:p.symbol,file:p.document_id!==null?c.get(p.document_id)??"":""});let d=new Map,u=c,m=vL(t);for(let[p,f]of m){let b=[...r.get(p)??[]].sort((C,y)=>C.start_line-y.start_line||C.end_line-y.end_line),x=[...f].sort((C,y)=>C.startLine-y.startLine||C.endLine-y.endLine),S=new Set,R=0;for(let C of x){for(;R<b.length&&b[R].start_line<=C.endLine;)S.add(b[R]),R+=1;for(let T of S)T.end_line<C.startLine&&S.delete(T);let y=new Set,w=[],L=null,k=()=>{if(L)return L;let T=u.get(C.documentId)??"",U=new Set;if(T){let Y=vp(e,T),ee=Math.max(0,C.startLine),we=Math.min(Y.length-1,C.endLine);for(let te=ee;te<=we;te+=1)for(let rn of Y[te])U.add(rn)}return L=U,U};for(let T of S){if(T.symbol_id===C.symbolId)continue;let U=l.get(T.symbol_id);if(!U)continue;if(!(T.start_line>=C.startLine&&T.end_line<=C.endLine)){if(!(T.start_line<=C.endLine&&T.end_line>=C.startLine))continue;let te=$(U.symbol);if(!te||!k().has(te))continue}let ee=`${U.symbol}|${T.chunk_id}`;y.has(ee)||(y.add(ee),w.push({...U,chunkId:T.chunk_id,source:"scip-chunk"}))}d.set(C.symbolId,w)}}return d}var ff=500;function Ac(e){let t=[...new Set(e)],n=[];for(let i=0;i<t.length;i+=ff)n.push(t.slice(i,i+ff));return n}function vL(e){let t=new Map;for(let n of e){let i=t.get(n.documentId);i?i.push(n):t.set(n.documentId,[n])}return t}function RL(e){let t=new Map;for(let[n,i]of e){let r=[];for(let o of i)r.push({symbol:o.symbol,file:o.file,chunkId:-1,source:"semantic-callee"});t.set(n,r)}return t}function hf(e,t,n={}){let i=new Map;if(t&&t.length===0)return i;let r=O(e,{includeIgnored:!1}),o=Hn(e),s=t??Lt(e),a=new Set(s.map(l=>l.symbolId)),c=EL(s);return kL(e,i,r,o,a,c),wL(e,i,s,a),DL(e,i,r,o,a,c),n.semantic!==!1&&FL(i,st(e,NL(s))),i}function kL(e,t,n,i,r,o){for(let s of n){if(!H(s))continue;let a=xi(e,s);if(a)for(let c of a){if(o&&!o.has(c.calleeLeaf))continue;let l=ds(s,i.get(c.calleeLeaf)??[]);if(!l||l.length===0)continue;let d=ms(e,s,l,c.memberAccess);d&&r.has(d.symbolId)&&d.file!==s&&Mc(t,d.symbolId,s)}}}function wL(e,t,n,i){let r=IL(n);for(let o of PL(e,i))e.isIgnored(o.relative_path)||LL(o,r.get(o.symbol_id))||Mc(t,o.symbol_id,o.relative_path)}function PL(e,t){return Mi(e,t?[...t]:void 0)}function IL(e){let t=new Map;for(let n of e)t.set(n.symbolId,{docId:n.documentId,startLine:n.startLine,endLine:n.endLine});return t}function LL(e,t){return!!t&&t.docId===e.document_id&&e.chunk_start>=t.startLine&&e.chunk_end<=t.endLine}function DL(e,t,n,i,r,o){for(let s of n){if(H(s)!=="rust")continue;let a=Dn(e,s,{includeRustAttributeNames:!0});if(a.length!==0)for(let{name:c}of a){if(o&&!o.has(c))continue;let l=i.get(c);if(l)for(let d of l)r.has(d.symbolId)&&d.file!==s&&Mc(t,d.symbolId,s)}}}function Mc(e,t,n){let i=e.get(t);i||(i=new Set,e.set(t,i)),i.add(n)}function EL(e){let t=new Set;for(let n of e){let i="leaf"in n&&typeof n.leaf=="string"?n.leaf:"symbol"in n&&typeof n.symbol=="string"?$(n.symbol):"";i&&t.add(i)}return t.size>0?t:null}function NL(e){return e.filter(t=>"relativePath"in t&&"symbol"in t&&"leaf"in t)}function FL(e,t){for(let[n,i]of t){let r=e.get(n);r||(r=new Set,e.set(n,r));for(let o of i)r.add(o)}}function at(e,t,n={}){return gf(e,t,n)}function $c(e,t,n={}){return hf(e,t,n)}function jc(e,t,n={}){return lf(e,t,n)}function yf(e,t,n={}){let i=$c(e,t,{semantic:n.semantic});return n.sourceFallback===!1?i:qn(i,jc(e,t))}function qn(e,t){let n=new Map;for(let[i,r]of e)n.set(i,new Set(r));for(let[i,r]of t){let o=n.get(i)??new Set;for(let s of r)o.add(s);n.set(i,o)}return n}function bf(e,t,n){let i=t.identifierResolution==="strict"?ji:af,r=t.candidateNames?Rr(t.candidateNames):null,o=0,s=0,a=0,c=0,l="";for(let d of t.paths)if(o+=1,l=d,!(!H(d)&&!(t.includeVueSfc&&Ht(d)))&&!e.isIgnored(d)&&!t.skipPath?.(d))try{if(r&&!ps(M(e,d),r))continue;s+=1;let m=(f,g,b,x)=>{if(t.candidateNames&&!t.candidateNames.has(f))return;a+=1;let S=t.resolveTargets?t.resolveTargets({sourceFile:d,name:f,kind:g,defaultTargets:x}):x();for(let R of S)c+=1,n({sourceFile:d,name:f,target:R,occurrences:b,kind:g})},p=Kt(e,d);for(let[f,g]of p)m(f,"identifier",g.length,()=>i(e,d,f));for(let f of Dn(e,d,{includeCrossLanguageDispatchNames:t.includeCrossLanguageDispatchNames,includeRustAttributeNames:t.includeRustAttributeNames})){let g=f.kind==="cross-language-dispatch"?()=>ji(e,d,f.name):()=>i(e,d,f.name);m(f.name,f.kind,f.occurrences,g)}}finally{t.afterPath?.(d),o%10===0&&D("source-reference-scan.progress",()=>{},()=>({scannedPaths:o,currentPath:l,candidateMatchedPaths:s,visitedNames:a,visitedHits:c}))}}function J(e){return e.endLine-e.startLine+1}function Sf(e,t={}){let{scope:n,files:i,minLoc:r=1,maxLoc:o=Number.POSITIVE_INFINITY,excludeSymbol:s,excludeEntrySurfaces:a=!1,excludeTypesFiles:c=!1,excludeRootedSymbols:l=!1,requireFunctionLikeSymbol:d=!1,requireCallableSymbol:u=!1,excludeRustTraitImplMembers:m=!1,includeSuppressed:p=!1,sortByLocDesc:f=!1}=t,g=[],b=TL(e,{scope:n,files:i,requireFunctionLikeSymbol:d,requireCallableSymbol:u}),x=new Map,S=new Map,R=y=>{let w=x.get(y);if(w!==void 0)return w;let L=Oe(e,y);return x.set(y,L),L},C=y=>{let w=S.get(y);if(w!==void 0)return w;let L=Z(y);return S.set(y,L),L};for(let y of b){let w=y.relativePath;if(e.isIgnored(w)||a&&R(w)||!_L(y,{requireFunctionLikeSymbol:d,requireCallableSymbol:u})||s!==void 0&&y.symbol===s)continue;let L=J(y);L<r||L>o||c&&AL(w)||l&&be(e,y.symbol,w)||m&&ts(y.symbol)||C(w)!=="test"&&(Ii(y.symbol)||!p&&Po(e,w,y.startLine)||g.push(y))}return f?g.sort((y,w)=>J(w)-J(y)):g}function TL(e,t){return t.files!==void 0?[...new Set(t.files.map(i=>i.replace(/\\/g,"/")))].sort().filter(i=>!t.scope||i.includes(t.scope)).flatMap(i=>Q(e,i)):t.requireCallableSymbol?Cr(e,{scope:t.scope,symbolMatches:he,sqlPrefilter:"callable"}):t.requireFunctionLikeSymbol?Cr(e,{scope:t.scope,symbolMatches:de,sqlPrefilter:"function-like"}):ep(e,t.scope)}function _L(e,t){return t.requireCallableSymbol?he(e.symbol):t.requireFunctionLikeSymbol?de(e.symbol):e.isFunctionLike}function AL(e){return(e.split("/").pop()??"").includes("types")}var A=class{constructor(t){this.db=t}db;scopedDefinitions(t){return hc(this.db,t)}definitionsForFile(t){return Q(this.db,t)}productionCallableDefinitions(t={}){return Sf(this.db,t)}calleeMap(t,n={}){return xs(this.db,t,n)}crossFileCallerMap(t,n={}){return $c(this.db,t,n)}sourceFallbackCallerFiles(t,n={}){return jc(this.db,t,n)}callerFileMap(t,n={}){return yf(this.db,t,n)}frameworkReferencedSymbolIds(t){let n=new Map;for(let r of t){if(!r.leaf)continue;let o=n.get(r.leaf)??[];o.push(r.symbolId),n.set(r.leaf,o)}let i=new Set;for(let r of O(this.db,{includeIgnored:!1}))if(H(r)==="rust")for(let{name:o}of Dn(this.db,r,{includeRustAttributeNames:!0}))for(let s of n.get(o)??[])i.add(s);return i}symbolsWithNonSelfCallees(t,n={}){if(t.length===0)return new Set;let i=new Map(t.map(o=>[o.symbolId,o.symbol])),r=this.calleeMap(t,n);return new Set([...r.entries()].filter(([o,s])=>{let a=i.get(o);return s.some(c=>c.symbol!==a)}).map(([o])=>o))}fileDependencyGraph(t){return ye(this.db,t)}fileKind(t){return Z(t)}hasSuppressionComment(t){return Po(this.db,t.relativePath,t.startLine)}sourceFiles(){return et(this.db)}scanSourceReferences(t,n){bf(this.db,t,n)}callableSignature(t){let n=gt(this.db).forFile(t.relativePath,{facts:!0}).facts?.callables.find(i=>i.startLine===t.startLine&&i.endLine===t.endLine);return n?{paramCount:n.paramCount}:null}};function Oc(e,t){let n=q(e,t);if(!n)return[];let i=$(n.symbol),o=new A(e).definitionsForFile(n.relativePath).filter(l=>he(l.symbol)),s=o.filter(l=>l.parentTypeName===i||l.symbol.includes(i)),c=(s.length>0?s:$L(ML(n.relativePath))===i?o.filter(l=>l.symbol.includes("<invalid-global-code>")):[]).map(l=>({startLine:l.startLine,endLine:l.endLine,name:$(l.symbol)}));return H(n.relativePath)!=="clojure"?c:OL(c,jL(e,n))}function $L(e){return e.replace(/\.[^.]+$/,"")}function jL(e,t){let n=$(t.symbol);return n?(X(e,t.relativePath)?.clojureMembers??[]).filter(i=>i.ownerName===n).map(i=>({startLine:i.startLine,endLine:i.endLine,name:i.memberName})):[]}function OL(e,t){let n=new Map;for(let i of[...e,...t])n.set(`${i.name}:${i.startLine}:${i.endLine}`,i);return[...n.values()].sort((i,r)=>i.startLine-r.startLine||i.endLine-r.endLine)}function Bc(e,t,n={}){let i=q(e,t);if(!i)return[];let o=!de(i.symbol)&&!e.isIgnored(i.relativePath)?[{relativePath:i.relativePath,line:i.startLine}]:[],s=yn(e,i,{semantic:n.semantic}).map(d=>({relativePath:d.file,line:d.line})),a=BL(e,i),c=new Set,l=[];for(let d of[...o,...s,...a]){let u=`${d.relativePath}:${d.line}`;c.has(u)||(c.add(u),l.push(d))}return l}function BL(e,t){if(!t.relativePath.endsWith(".rb"))return[];let n=HL(t.symbol);if(n.length===0)return[];let i=[];for(let r of O(e,{extensions:[".rb"],includeIgnored:!1})){let o=M(e,r);if(!o)continue;let s=o.split(`
|
|
277
|
+
`);for(let a=0;a<s.length;a++){let c=s[a]??"";n.some(l=>new RegExp(`@${l}\\b|\\b${l}:`).test(c))&&i.push({relativePath:r,line:a})}}return i}function HL(e){let n=(e.split(":").pop()??e).replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/[^A-Za-z0-9_]+/g,"_").toLowerCase().replace(/^_+|_+$/g,""),i=n.split("_").filter(Boolean),r=new Set;return n&&r.add(n),i.length>=1&&r.add(i[i.length-1]),i.length>=2&&r.add(i.slice(-2).join("_")),[...r]}function Tr(e,t,n={}){let i=q(e,t);if(!i)return{definitions:[],referencedBy:[]};let r=e.get("SELECT display_name, documentation FROM global_symbols WHERE id = ?",i.symbolId),o=$n(r?.documentation??null),s=e.isIgnored(i.relativePath)?[]:[{relativePath:i.relativePath,startLine:i.startLine,endLine:i.endLine,signature:qL(o,r?.display_name??null,i.symbol),source:VL(e,i.relativePath,i.startLine,i.endLine)}],a=yn(e,i,{semantic:n.semantic}).map(c=>({relativePath:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol,enclosingShort:c.enclosingSymbol?v(c.enclosingSymbol):"(top-level)"}));return{definitions:s,referencedBy:a}}function VL(e,t,n,i){let r=M(e,t);if(!r)return null;let s=r.split(`
|
|
258
278
|
`).slice(n,i+1).join(`
|
|
259
|
-
`).trimEnd();return s.length>0?s:null}function
|
|
279
|
+
`).trimEnd();return s.length>0?s:null}function qL(e,t,n){let i=Mn(e);if(i&&!UL(i))return i;let r=(t??"").trim();return r?de(n)&&!r.endsWith("()")?`${r}()`:r:v(n)}function UL(e){return e.startsWith("undefined")||e.includes("|")||e.includes("```")}function _r(e,t){let n=Ve(e,t);return n?e.all(`SELECT DISTINCT d2.relative_path
|
|
260
280
|
FROM mentions m
|
|
261
281
|
JOIN chunks c ON m.chunk_id = c.id
|
|
262
282
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -272,7 +292,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
272
292
|
WHERE d1.relative_path = ?
|
|
273
293
|
AND d2.relative_path <> d1.relative_path
|
|
274
294
|
AND ${e.localSymbolPredicate}
|
|
275
|
-
ORDER BY d2.relative_path`,n).filter(r=>!e.isIgnored(r.relative_path)).map(r=>({relativePath:r.relative_path})):[]}function
|
|
295
|
+
ORDER BY d2.relative_path`,n).filter(r=>!e.isIgnored(r.relative_path)).map(r=>({relativePath:r.relative_path})):[]}function Ar(e,t){let n=Ve(e,t);return n?e.all(`SELECT DISTINCT d1.relative_path
|
|
276
296
|
FROM mentions m
|
|
277
297
|
JOIN chunks c ON m.chunk_id = c.id
|
|
278
298
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -287,9 +307,9 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
287
307
|
JOIN documents d2 ON sym_def.document_id = d2.id
|
|
288
308
|
WHERE d2.relative_path = ?
|
|
289
309
|
AND d1.relative_path != ?
|
|
290
|
-
ORDER BY d1.relative_path`,n,n).filter(r=>!e.isIgnored(r.relative_path)).map(r=>({relativePath:r.relative_path})):[]}function
|
|
310
|
+
ORDER BY d1.relative_path`,n,n).filter(r=>!e.isIgnored(r.relative_path)).map(r=>({relativePath:r.relative_path})):[]}function Mr(e,t){let n=Fi(e,t);if(n.length===0)return{files:[],symbols:[],dependsOn:[],dependedOnBy:[]};let i=n.map(()=>"?").join(", "),o=e.all(`SELECT relative_path FROM documents
|
|
291
311
|
WHERE relative_path IN (${i})
|
|
292
|
-
ORDER BY relative_path`,...n).map(
|
|
312
|
+
ORDER BY relative_path`,...n).map(u=>u.relative_path).filter(u=>!e.isIgnored(u)),s=ns(e,o,{onlyDocumented:!0,sort:!0}).map(({relativePath:u,...m})=>m),c=e.all(`SELECT DISTINCT d2.relative_path
|
|
293
313
|
FROM mentions m
|
|
294
314
|
JOIN chunks c ON m.chunk_id = c.id
|
|
295
315
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -305,7 +325,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
305
325
|
WHERE d1.relative_path IN (${i})
|
|
306
326
|
AND d2.relative_path NOT IN (${i})
|
|
307
327
|
AND ${e.localSymbolPredicate}
|
|
308
|
-
ORDER BY d2.relative_path`,...n,...n).map(
|
|
328
|
+
ORDER BY d2.relative_path`,...n,...n).map(u=>u.relative_path).filter(u=>!e.isIgnored(u)),d=e.all(`SELECT DISTINCT d1.relative_path
|
|
309
329
|
FROM mentions m
|
|
310
330
|
JOIN chunks c ON m.chunk_id = c.id
|
|
311
331
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -320,7 +340,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
320
340
|
JOIN documents d2 ON sym_def.document_id = d2.id
|
|
321
341
|
WHERE d2.relative_path IN (${i})
|
|
322
342
|
AND d1.relative_path NOT IN (${i})
|
|
323
|
-
ORDER BY d1.relative_path`,...n,...n).map(
|
|
343
|
+
ORDER BY d1.relative_path`,...n,...n).map(u=>u.relative_path).filter(u=>!e.isIgnored(u));return{files:o,symbols:s,dependsOn:c,dependedOnBy:d}}function $r(e,t){let n=Fi(e,t);return n.length===0?[]:GL([...zL(e,n),...WL(e,n)]).filter(i=>!e.isIgnored(i.relative_path)).map(KL)}function zL(e,t){let n=t.map(()=>"?").join(", ");return e.all(`SELECT DISTINCT d1.relative_path, gs.symbol
|
|
324
344
|
FROM mentions m
|
|
325
345
|
JOIN chunks c ON m.chunk_id = c.id
|
|
326
346
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -347,7 +367,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
347
367
|
AND m.role != 1
|
|
348
368
|
AND ${e.localSymbolPredicate}
|
|
349
369
|
${e.pathExclusionsFor("d1")}
|
|
350
|
-
ORDER BY d1.relative_path`,...t,...t,...t)}function wI(e,t){let n=new A(e);return t.flatMap(i=>n.definitionsForFile(i).filter(r=>le(r.symbol)).map(r=>({relative_path:i,symbol:r.symbol})))}function II(e){let t=new Set;return e.filter(n=>{let i=`${n.relative_path}|${n.symbol}`;return t.has(i)?!1:(t.add(i),!0)})}function LI(e){return{consumer:e.relative_path,symbol:e.symbol,shortName:v(e.symbol)}}var wr=new WeakMap;function pp(e,t){let n=K(t);if(!(n==="rust"||n==="typescript"||n==="tsx"||n==="javascript"))return[];let r=F(e,t);if(!r)return[];let o=Z(e,t,r),s=ae(e,"definition-exclusions",t,o);if(s){let c=DI(s);if(c)return c}let a=n==="rust"?$I(e,t):TI(e,t);return ce(e,"definition-exclusions",t,o,JSON.stringify(a)),a}function DI(e){try{let t=JSON.parse(e);return!Array.isArray(t)||!t.every(PI)?null:t}catch{return null}}function PI(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.startLine!="number"||!Number.isFinite(t.startLine)||typeof t.endLine!="number"||!Number.isFinite(t.endLine)||typeof t.reason!="string"?!1:t.containerName===void 0||typeof t.containerName=="string"}var fp=new Set(["describe","it","test","fdescribe","fit","xdescribe","xit","beforeEach","afterEach","beforeAll","afterAll","before","after","suite","bench","benchmark"]),NI=/\b(?:describe|it|test|fdescribe|fit|xdescribe|xit|beforeEach|afterEach|beforeAll|afterAll|before|after|suite|bench|benchmark)\s*\(/,EI=/\b(?:export\s+)?(?:async\s+)?function\s+use[A-Z][A-Za-z0-9_$]*\b|\b(?:const|let|var)\s+use[A-Z][A-Za-z0-9_$]*\s*(?::[^=;]+)?=\s*(?:async\s*)?(?:function\b|(?:<[^=;{]+>\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/;function TI(e,t){let n=F(e,t);if(!n||!FI(n))return[];let i=ke(e,t);if(!i)return[];let r=wr.get(i);if(r)return r;let o=!1,s=i.rootNode;for(let c of s.namedChildren){if(c.type!=="expression_statement")continue;let l=c.namedChild(0);if(!l||l.type!=="call_expression")continue;let u=l.namedChild(0);if(!u)continue;let d=u.type==="member_expression"?u.namedChild(u.namedChildCount-1)?.text:u.text;if(d&&fp.has(d)){o=!0;break}}let a=[];o&&a.push({startLine:0,endLine:s.endPosition.row,reason:"TS/JS test file (describe/it/test at top level)"});for(let c of s.namedChildren){let l=null,u=null;if(c.type==="function_declaration")l=c.namedChild(0)?.text??null,u=c;else if(c.type==="export_statement"){let d=c.namedChild(0);d?.type==="function_declaration"&&(l=d.namedChild(0)?.text??null,u=d)}else if(c.type==="lexical_declaration"){let d=c.namedChild(0);if(d?.type==="variable_declarator"){let m=d.namedChild(0)?.text,p=d.namedChild(1);m&&(p?.type==="arrow_function"||p?.type==="function_expression")&&(l=m,u=d)}}l&&/^use[A-Z]/.test(l)&&u&&a.push({startLine:u.startPosition.row,endLine:u.endPosition.row,reason:"React custom hook (use*)"})}return a.push(...gp(i,new Set(["function_declaration","method_definition","class_declaration","interface_declaration","type_alias_declaration","enum_declaration","variable_declarator","export_statement"]),new Set(["comment"]))),wr.set(i,a),a}function FI(e){if(e.includes("scip-query"))return!0;let t=!1;for(let n of fp)if(e.includes(n)){t=!0;break}return t&&NI.test(e)?!0:e.includes("use")&&EI.test(e)}var _I=/scip-query[\s:-]*ignore[\s:-]*(?:dead(?:-code)?|stale)?/i;function AI(e){return _I.test(e)}function gp(e,t,n){let i=[],r=o=>{if(t.has(o.type)&&o.parent){let a=o.parent.children,c=-1;for(let l=0;l<a.length;l+=1)if(a[l].startIndex===o.startIndex&&a[l].type===o.type){c=l;break}if(c>0)for(let l=c-1;l>=0;l-=1){let u=a[l];if(n.has(u.type)){if(AI(u.text)){i.push({startLine:o.startPosition.row,endLine:o.endPosition.row,reason:"scip-query suppression comment"});break}continue}if(!(u.type==="attribute_item"||u.type==="inner_attribute_item"))break}}for(let s of o.namedChildren)r(s)};return r(e.rootNode),i}function $I(e,t){let n=ke(e,t);if(!n)return[];let i=wr.get(n);if(i)return i;let r=[],o=MI(n);return o?(wr.set(n,o),o):(hp(n.rootNode,r,!1,!1),r.push(...gp(n,new Set(["function_item","function_signature_item","struct_item","enum_item","union_item","impl_item","mod_item","static_item","const_item"]),new Set(["line_comment","block_comment"]))),r.push(...WI(n.rootNode)),wr.set(n,r),r)}function MI(e){return zI(e.rootNode)?[{startLine:0,endLine:e.rootNode.endPosition.row,reason:"generated file (@generated header)"}]:null}function hp(e,t,n,i){let r=n,o=i;e.type==="trait_item"&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait declaration body (dynamic dispatch)"}),e.type==="impl_item"&&e.childForFieldName("trait")&&(o=!0,t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait impl block (dynamic dispatch)"})),e.type==="function_item"||e.type==="function_signature_item"?OI(e,t,n,i):i&&UI(e)?t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait impl associated item (dynamic dispatch)"}):e.type==="struct_item"||e.type==="enum_item"||e.type==="union_item"?jI(e,t,n):e.type==="mod_item"&&rc(e).some(s=>/#\[\s*cfg\s*\(\s*test\s*\)/.test(s))&&(r=!0);for(let s of e.namedChildren)hp(s,t,r,o)}function OI(e,t,n,i){let r=rc(e),o=null;i?o="trait impl method (dynamic dispatch)":n&&(o="inside #[cfg(test)] mod");for(let s of r){let a=HI(s);if(a){o=a;break}if(yp(s)){o="#[allow(dead_code)]";break}}o&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:o})}function jI(e,t,n){let i=rc(e),r=e.namedChildren.find(o=>o.type==="type_identifier")?.text;i.some(qI)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[derive(<reflective>)] \u2014 fields accessed via macro/reflection",containerName:r}),i.some(yp)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[allow(dead_code)]",containerName:r}),n&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"inside #[cfg(test)] mod",containerName:r})}function rc(e){let t=e.parent;if(!t)return[];let n=t.children,i=-1;for(let o=0;o<n.length;o+=1)if(n[o].startIndex===e.startIndex&&n[o].type===e.type){i=o;break}if(i<=0)return[];let r=[];for(let o=i-1;o>=0;o-=1){let s=n[o];if(s.type==="attribute_item"||s.type==="inner_attribute_item")r.push(s.text);else{if(s.type==="line_comment"||s.type==="block_comment")continue;break}}return r}var BI=[{re:/#\[\s*tauri::command\b/,reason:"#[tauri::command]"},{re:/#\[\s*command\b/,reason:"#[command]"},{re:/#\[\s*test\b/,reason:"#[test]"},{re:/#\[\s*bench\b/,reason:"#[bench]"},{re:/#\[\s*tokio::test\b/,reason:"#[tokio::test]"},{re:/#\[\s*async_std::test\b/,reason:"#[async_std::test]"},{re:/#\[\s*wasm_bindgen\b/,reason:"#[wasm_bindgen]"},{re:/#\[\s*no_mangle\b/,reason:"#[no_mangle]"},{re:/#\[\s*napi\b/,reason:"#[napi]"},{re:/#\[\s*pyfunction\b/,reason:"#[pyfunction]"},{re:/#\[\s*pymethod\b/,reason:"#[pymethod]"},{re:/#\[\s*pyo3\b/,reason:"#[pyo3]"},{re:/#\[\s*cfg\s*\(\s*test\s*\)/,reason:"#[cfg(test)]"},{re:/#\[\s*doc\s*\(\s*hidden\s*\)/,reason:"#[doc(hidden)]"}];function HI(e){return BI.find(({re:t})=>t.test(e))?.reason??null}var VI=[/\bSerialize\b/,/\bDeserialize\b/,/\bFromRow\b/,/\bsqlx::FromRow\b/,/\bDeriveEntityModel\b/,/\bIntoSchema\b/,/\bToSchema\b/,/\bDeriveValueType\b/,/\bError\b/,/\bthiserror::Error\b/];function qI(e){return/#\[\s*derive\s*\(/.test(e)?VI.some(t=>t.test(e)):!1}function yp(e){return/#\[\s*allow\s*\(\s*dead_code\s*\)/.test(e)}function UI(e){return e.type==="const_item"||e.type==="type_item"||e.type==="static_item"||e.type==="associated_type"}function WI(e){let t=JI(e);if(t.size===0)return[];let n=[];for(let i of e.descendantsOfType("mod_item")){let r=i.childForFieldName("name")?.text;r&&t.has(r)&&n.push({startLine:i.startPosition.row,endLine:i.endPosition.row,reason:'serde `with = "..."` module \u2014 body invoked via reflection',containerName:r})}return n}function zI(e){for(let t=0;t<Math.min(e.namedChildCount,12);t+=1){let n=e.namedChild(t);if(!n||n.type!=="line_comment"&&n.type!=="block_comment")break;if(/@generated\b/.test(n.text)||/This file is .*generated\b/i.test(n.text)||/Code generated by/i.test(n.text)||/Generated by:\s*https?:\/\/openapi-generator/i.test(n.text)||/openapi-generator/i.test(n.text)&&/Generated by/i.test(n.text))return!0}return!1}var GI=/^#!?\[\s*serde\s*\(/,mp=/\bwith\s*=\s*"([^"]+)"/g;function JI(e){let t=new Set;for(let n of e.descendantsOfType("attribute_item")){if(!GI.test(n.text))continue;mp.lastIndex=0;let i;for(;(i=mp.exec(n.text))!==null;){let r=i[1],o=r.split("::").pop()??r;o&&t.add(o)}}return t}function bp(e){let t=new Map,n=i=>{let r=t.get(i);if(r)return r;let o=pp(e,i);return r={ranges:o.map(s=>({startLine:s.startLine,endLine:s.endLine})),containers:new Set(o.map(s=>s.containerName).filter(s=>!!s))},t.set(i,r),r};return(i,r,o,s)=>{let a=n(i);for(let c of a.ranges)if(r>=c.startLine&&r<=c.endLine)return!0;if(s&&a.containers.has(s))return!0;for(let c of Io(o))if(a.containers.has(c))return!0;return!1}}function oc(e,t={}){ma(e,{groups:t.semanticProvider===!0?["whole-project","semantic-provider"]:["whole-project"]})}function Sp(e,t,n={}){ma(e,{groups:n.definitions===!0?["source-file","definition-catalog"]:["source-file"],file:t.replace(/\\/g,"/")})}function Cp(e,t){return t.isIgnoredPath(e.relativePath)?xt("ignored-file"):Ut(e.symbol)?xt("module-like-symbol"):xp(e.symbol)?!e.isFunctionLike&&e.enclosingSymbol&&xp(e.enclosingSymbol)?xt("nested-non-callable-value"):!t.includeTests&&!sc(e.relativePath)?xt("test-file"):!t.includeTests&&t.isExcludedRegion(e.relativePath,e.startLine,e.symbol,e.parentTypeName)?xt("excluded-file-region"):Ro(e.symbol)?xt("rust-trait-impl-member"):di(e.symbol)?xt("rust-test-module"):!t.includeMembers&&!KI(e)?xt("member"):e.endLine-e.startLine+1<t.minLoc?xt("below-min-loc"):{accepted:!0}:xt("non-value-symbol")}function sc(e){return X(e)!=="test"}function xt(e){return{accepted:!1,rejectionReason:e}}function xp(e){return ue(e)||e.endsWith("().")||e.endsWith(".")}function KI(e){return le(e.symbol)||Io(e.symbol).length===0}function ts(e,t){return G(e)-G(t)||e.relativePath.localeCompare(t.relativePath)}function qe(e,t){return typeof t!="number"||t<=0||e.length<=t?e:e.slice(0,t)}function Di(e){let t=new Set,n=[];for(let i of e){let r=`${i.symbol}|${i.file}`;t.has(r)||(t.add(r),n.push(i))}return n}function vp(){return new Map}function Rp(e,t,n){let i=new Map;for(let r of Sm(e,n))e.isIgnored(r.relative_path)||t.has(r.relative_path)||is(i,r.symbol_id,r.relative_path,r.ref_count,"scip-mention");return i}function kp(e,t,n){let i=new Set;for(let r of xm(e,t))e.isIgnored(r.relative_path)||n.has(r.relative_path)||i.add(r.symbol_id);return i}function ac(e,t){let n=e.get(t);if(!n)return!1;for(let i of n.values())if(i.occurrences>0)return!0;return!1}function ns(e,t,n){let i=e.get(t);if(!i)return!1;for(let[r,o]of i)if(r!==n&&o.occurrences>0)return!0;return!1}function wp(e){return e?.occurrences??0}function is(e,t,n,i,r="source-fallback"){if(i<=0)return;let o=Lp(e,t,n);o.occurrences+=i,o.sources.add(r)}function Ip(e,t,n,i,r){if(i<=0)return;let o=Lp(e,t,n);o.occurrences=Math.max(i,o.occurrences),o.sources.add(r)}function Lp(e,t,n){let i=e.get(t);i||(i=new Map,e.set(t,i));let r=i.get(n);return r||(r={occurrences:0,sources:new Set},i.set(n,r)),r}var QI=3e3,XI=1e3;function At(e,t={}){let{scope:n,minLoc:i=1,includeTests:r=!1,skipBarrels:o=!1,includeMembers:s=!1,deadCodeOnly:a=!1,scanLimit:c,semantic:l=!0}=t,u=0,d=T("dead.candidates",()=>{let x=qe(YI(e,{scope:n,minLoc:i,includeTests:r,includeMembers:s}),c);return u=x.length,x},()=>({definitions:u})),m=o?new Set(gm(e)):new Set,p=0,f=a?vp():T("dead.mention-reference-counts",()=>{let x=Rp(e,m,d.map(b=>b.symbolId));return p=x.size,x},()=>({definitions:d.length,symbolsWithReferences:p})),g=0,y=a?T("dead.mentioned-symbol-ids",()=>{let x=kp(e,d.map(b=>b.symbolId),m);return g=x.size,x},()=>({definitions:d.length,referencedSymbols:g})):new Set,S=a?d.filter(x=>!y.has(x.symbolId)):d.filter(x=>!ns(f,x.symbolId,x.relativePath));a?T("dead.source-fallback.dead-code-only",()=>iL(e,S,f,m),()=>({definitions:S.length})):T("dead.source-fallback.ast",()=>nL(e,S,f,m),()=>({definitions:S.length}));let R=a?S.filter(x=>!ac(f,x.symbolId)):S.filter(x=>!ns(f,x.symbolId,x.relativePath));T("dead.caller-map-supplement",()=>cL(e,R,f,{includeTests:r,inactiveBarrelPaths:m,includeSemantic:!a&&l}),()=>({definitions:R.length,semantic:!a&&l}));let k=a?S.filter(x=>!ac(f,x.symbolId)):d;return tL(e,ZI(k,f))}function YI(e,t){let n=bp(e),i=[];for(let r of ir(e,t.scope))Cp(r,{minLoc:t.minLoc,includeTests:t.includeTests,includeMembers:t.includeMembers,isIgnoredPath:s=>e.isIgnored(s),isExcludedRegion:n}).accepted&&i.push(r);return i}function ZI(e,t){return e.map(n=>eL(n,t)).filter(n=>n.cross_file_refs===0).sort((n,i)=>i.loc-n.loc||n.relative_path.localeCompare(i.relative_path)||n.start_line-i.start_line)}function eL(e,t){let n=t.get(e.symbolId)??new Map,i=wp(n.get(e.relativePath)),r=0;for(let[o,s]of n)o!==e.relativePath&&(r+=s.occurrences);return{relative_path:e.relativePath,start_line:e.startLine,end_line:e.endLine,loc:e.endLine-e.startLine+1,symbol:e.symbol,same_file_refs:i,cross_file_refs:r}}function tL(e,t){let n=[],i=0,r=0,o=0;for(let s of t){if(e.isIgnored(s.relative_path)||Oe(e,s.relative_path)||fe(e,s.symbol,s.relative_path))continue;let a=s.same_file_refs===0?"dead-code":"file-internal";a==="dead-code"?i++:r++,o+=s.loc,n.push({relativePath:s.relative_path,startLine:s.start_line,endLine:s.end_line,loc:s.loc,symbol:s.symbol,shortName:v(s.symbol),sameFileRefs:s.same_file_refs,kind:a})}return{symbols:n,counts:{total:n.length,deadCode:i,fileInternal:r,loc:o},totalCount:n.length,deadCodeCount:i,fileInternalCount:r,totalLoc:o}}function nL(e,t,n,i){if(t.length===0)return;let r=new A(e),o=new Set(t.map(c=>c.symbolId)),s=new Set(t.map(c=>c.leaf).filter(Boolean)),a=new Set(r.sourceFiles());for(let c of B(e))a.add(c);r.scanSourceReferences({paths:a,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:s,skipPath:c=>i.has(c)},c=>{o.has(c.target.symbolId)&&(sL(e,c)||is(n,c.target.symbolId,c.sourceFile,aL(c),"source-fallback"))})}function iL(e,t,n,i){if(t.length===0)return;let r=new A(e),o=rL(t),s=new Set(r.sourceFiles());for(let u of B(e))s.add(u);let a=new Set(o.keys()),c=new Map,l=u=>{let d=c.get(u);return d||(d=Zo(e,u),c.set(u,d)),d};r.scanSourceReferences({paths:s,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:a,skipPath:u=>i.has(u),resolveTargets:({sourceFile:u,name:d,kind:m})=>{let p=o.get(d);return p?oL(u,d,p,()=>l(u),{permissive:m!=="cross-language-dispatch"}):[]},afterPath:u=>{c.delete(u),Sp(e,u)}},u=>{let d=u.kind==="identifier"&&u.sourceFile===u.target.relativePath?Math.max(0,u.occurrences-1):u.occurrences;u.kind==="identifier"&&Dp(e,{sourceFile:u.sourceFile,name:u.name,target:u.target,occurrences:d})||is(n,u.target.symbolId,u.sourceFile,d,"source-fallback")})}function rL(e){let t=new Map;for(let n of e){if(!n.leaf)continue;let i=t.get(n.leaf)??[];i.push(n),t.set(n.leaf,i)}return t}function oL(e,t,n,i,r){let o=n.filter(l=>l.relativePath===e);if(o.length>0)return o;if(!r.permissive&&n.length===1)return[...n];let s=i(),a=s.get(t);if(a)for(let l of a){let u=n.filter(d=>Qt(l,d.relativePath));if(u.length>0)return u}let c=new Set;for(let l of s.values())for(let u of l)c.add(u);for(let l of c){let u=n.filter(d=>Qt(l,d.relativePath));if(u.length>0&&u.length===n.length)return u}return r.permissive?[...n]:[]}function sL(e,t){return t.kind==="cross-language-dispatch"&&t.target.relativePath===t.sourceFile?!0:t.kind==="identifier"&&Dp(e,t)}function aL(e){return e.kind==="identifier"&&e.target.relativePath===e.sourceFile?Math.max(0,e.occurrences-1):e.occurrences}function Dp(e,t){return t.occurrences>1?!1:Ie(e,t.sourceFile).some(n=>n.used||n.sourcePath!==t.target.relativePath?!1:n.importedName===t.name||n.localName===t.name)}function cL(e,t,n,i){let r=i.includeSemantic!==!1,o=r&&t.length>=QI&&B(e).length>=XI,s=(u,d)=>{d===u.relativePath||e.isIgnored(d)||i.inactiveBarrelPaths.has(d)||!i.includeTests&&!sc(d)||Ip(n,u.symbolId,d,1,"caller-map")};if(o?T("dead.caller-map.mention-chunks",()=>lL(e,t,s),()=>({definitions:t.length})):T("dead.caller-map.per-symbol",()=>{for(let u of t){let d=tt(e,u,{semantic:r});if(d.length!==0)for(let m of d)s(u,m.file)}},()=>({definitions:t.length,semantic:r})),!o)return;let a=0,c=T("dead.caller-map.semantic-candidates",()=>{let u=t.filter(d=>!ns(n,d.symbolId,d.relativePath));return a=u.length,u},()=>({definitions:t.length,semanticCandidates:a}));if(c.length===0)return;let l=et(e,c);for(let u of c){let d=l.get(u.symbolId);if(d)for(let m of d)s(u,m)}}function lL(e,t,n){let i=new Map(t.map(r=>[r.symbolId,r]));for(let r of wi(e,[...i.keys()])){let o=i.get(r.symbol_id);o&&n(o,r.relative_path)}}function cc(e,t={}){let{limit:n=30,scope:i}=t,r=i?`AND def_d.relative_path LIKE '%${i}%'`:"",s=e.all(`SELECT
|
|
370
|
+
ORDER BY d1.relative_path`,...t,...t,...t)}function WL(e,t){let n=new A(e);return t.flatMap(i=>n.definitionsForFile(i).filter(r=>he(r.symbol)).map(r=>({relative_path:i,symbol:r.symbol})))}function GL(e){let t=new Set;return e.filter(n=>{let i=`${n.relative_path}|${n.symbol}`;return t.has(i)?!1:(t.add(i),!0)})}function KL(e){return{consumer:e.relative_path,symbol:e.symbol,shortName:v(e.symbol)}}var jr=new WeakMap,xf=pe({kind:"definition-exclusions",serialize:e=>JSON.stringify(e),deserialize:JL});function vf(e,t){let n=H(t);if(!(n==="rust"||n==="typescript"||n==="tsx"||n==="javascript"))return[];let r=M(e,t);if(!r)return[];let o=re(e,t,r),s=xf.read(e,t,o);if(s)return s;let a=n==="rust"?iD(e,t):ZL(e,t);return xf.write(e,t,o,a),a}function JL(e){try{let t=JSON.parse(e);return!Array.isArray(t)||!t.every(XL)?null:t}catch{return null}}function XL(e){if(!e||typeof e!="object")return!1;let t=e;return typeof t.startLine!="number"||!Number.isFinite(t.startLine)||typeof t.endLine!="number"||!Number.isFinite(t.endLine)||typeof t.reason!="string"?!1:t.containerName===void 0||typeof t.containerName=="string"}var Rf=new Set(["describe","it","test","fdescribe","fit","xdescribe","xit","beforeEach","afterEach","beforeAll","afterAll","before","after","suite","bench","benchmark"]),QL=/\b(?:describe|it|test|fdescribe|fit|xdescribe|xit|beforeEach|afterEach|beforeAll|afterAll|before|after|suite|bench|benchmark)\s*\(/,YL=/\b(?:export\s+)?(?:async\s+)?function\s+use[A-Z][A-Za-z0-9_$]*\b|\b(?:const|let|var)\s+use[A-Z][A-Za-z0-9_$]*\s*(?::[^=;]+)?=\s*(?:async\s*)?(?:function\b|(?:<[^=;{]+>\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)\s*=>)/;function ZL(e,t){let n=M(e,t);if(!n||!eD(n))return[];let i=Pe(e,t);if(!i)return[];let r=jr.get(i);if(r)return r;let o=!1,s=i.rootNode;for(let c of s.namedChildren){if(c.type!=="expression_statement")continue;let l=c.namedChild(0);if(!l||l.type!=="call_expression")continue;let d=l.namedChild(0);if(!d)continue;let u=d.type==="member_expression"?d.namedChild(d.namedChildCount-1)?.text:d.text;if(u&&Rf.has(u)){o=!0;break}}let a=[];o&&a.push({startLine:0,endLine:s.endPosition.row,reason:"TS/JS test file (describe/it/test at top level)"});for(let c of s.namedChildren){let l=null,d=null;if(c.type==="function_declaration")l=c.namedChild(0)?.text??null,d=c;else if(c.type==="export_statement"){let u=c.namedChild(0);u?.type==="function_declaration"&&(l=u.namedChild(0)?.text??null,d=u)}else if(c.type==="lexical_declaration"){let u=c.namedChild(0);if(u?.type==="variable_declarator"){let m=u.namedChild(0)?.text,p=u.namedChild(1);m&&(p?.type==="arrow_function"||p?.type==="function_expression")&&(l=m,d=u)}}l&&/^use[A-Z]/.test(l)&&d&&a.push({startLine:d.startPosition.row,endLine:d.endPosition.row,reason:"React custom hook (use*)"})}return a.push(...kf(i,new Set(["function_declaration","method_definition","class_declaration","interface_declaration","type_alias_declaration","enum_declaration","variable_declarator","export_statement"]),new Set(["comment"]))),jr.set(i,a),a}function eD(e){if(e.includes("scip-query"))return!0;let t=!1;for(let n of Rf)if(e.includes(n)){t=!0;break}return t&&QL.test(e)?!0:e.includes("use")&&YL.test(e)}var tD=/scip-query[\s:-]*ignore[\s:-]*(?:dead(?:-code)?|stale)?/i;function nD(e){return tD.test(e)}function kf(e,t,n){let i=[],r=o=>{if(t.has(o.type)&&o.parent){let a=o.parent.children,c=-1;for(let l=0;l<a.length;l+=1)if(a[l].startIndex===o.startIndex&&a[l].type===o.type){c=l;break}if(c>0)for(let l=c-1;l>=0;l-=1){let d=a[l];if(n.has(d.type)){if(nD(d.text)){i.push({startLine:o.startPosition.row,endLine:o.endPosition.row,reason:"scip-query suppression comment"});break}continue}if(!(d.type==="attribute_item"||d.type==="inner_attribute_item"))break}}for(let s of o.namedChildren)r(s)};return r(e.rootNode),i}function iD(e,t){let n=Pe(e,t);if(!n)return[];let i=jr.get(n);if(i)return i;let r=[],o=rD(n);return o?(jr.set(n,o),o):(wf(n.rootNode,r,!1,!1),r.push(...kf(n,new Set(["function_item","function_signature_item","struct_item","enum_item","union_item","impl_item","mod_item","static_item","const_item"]),new Set(["line_comment","block_comment"]))),r.push(...mD(n.rootNode)),jr.set(n,r),r)}function rD(e){return pD(e.rootNode)?[{startLine:0,endLine:e.rootNode.endPosition.row,reason:"generated file (@generated header)"}]:null}function wf(e,t,n,i){let r=n,o=i;e.type==="trait_item"&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait declaration body (dynamic dispatch)"}),e.type==="impl_item"&&e.childForFieldName("trait")&&(o=!0,t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait impl block (dynamic dispatch)"})),e.type==="function_item"||e.type==="function_signature_item"?oD(e,t,n,i):i&&dD(e)?t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"trait impl associated item (dynamic dispatch)"}):e.type==="struct_item"||e.type==="enum_item"||e.type==="union_item"?sD(e,t,n):e.type==="mod_item"&&Hc(e).some(s=>/#\[\s*cfg\s*\(\s*test\s*\)/.test(s))&&(r=!0);for(let s of e.namedChildren)wf(s,t,r,o)}function oD(e,t,n,i){let r=Hc(e),o=null;i?o="trait impl method (dynamic dispatch)":n&&(o="inside #[cfg(test)] mod");for(let s of r){let a=cD(s);if(a){o=a;break}if(Pf(s)){o="#[allow(dead_code)]";break}}o&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:o})}function sD(e,t,n){let i=Hc(e),r=e.namedChildren.find(o=>o.type==="type_identifier")?.text;i.some(uD)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[derive(<reflective>)] \u2014 fields accessed via macro/reflection",containerName:r}),i.some(Pf)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[allow(dead_code)]",containerName:r}),n&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"inside #[cfg(test)] mod",containerName:r})}function Hc(e){let t=e.parent;if(!t)return[];let n=t.children,i=-1;for(let o=0;o<n.length;o+=1)if(n[o].startIndex===e.startIndex&&n[o].type===e.type){i=o;break}if(i<=0)return[];let r=[];for(let o=i-1;o>=0;o-=1){let s=n[o];if(s.type==="attribute_item"||s.type==="inner_attribute_item")r.push(s.text);else{if(s.type==="line_comment"||s.type==="block_comment")continue;break}}return r}var aD=[{re:/#\[\s*tauri::command\b/,reason:"#[tauri::command]"},{re:/#\[\s*command\b/,reason:"#[command]"},{re:/#\[\s*test\b/,reason:"#[test]"},{re:/#\[\s*bench\b/,reason:"#[bench]"},{re:/#\[\s*tokio::test\b/,reason:"#[tokio::test]"},{re:/#\[\s*async_std::test\b/,reason:"#[async_std::test]"},{re:/#\[\s*wasm_bindgen\b/,reason:"#[wasm_bindgen]"},{re:/#\[\s*no_mangle\b/,reason:"#[no_mangle]"},{re:/#\[\s*napi\b/,reason:"#[napi]"},{re:/#\[\s*pyfunction\b/,reason:"#[pyfunction]"},{re:/#\[\s*pymethod\b/,reason:"#[pymethod]"},{re:/#\[\s*pyo3\b/,reason:"#[pyo3]"},{re:/#\[\s*cfg\s*\(\s*test\s*\)/,reason:"#[cfg(test)]"},{re:/#\[\s*doc\s*\(\s*hidden\s*\)/,reason:"#[doc(hidden)]"}];function cD(e){return aD.find(({re:t})=>t.test(e))?.reason??null}var lD=[/\bSerialize\b/,/\bDeserialize\b/,/\bFromRow\b/,/\bsqlx::FromRow\b/,/\bDeriveEntityModel\b/,/\bIntoSchema\b/,/\bToSchema\b/,/\bDeriveValueType\b/,/\bError\b/,/\bthiserror::Error\b/];function uD(e){return/#\[\s*derive\s*\(/.test(e)?lD.some(t=>t.test(e)):!1}function Pf(e){return/#\[\s*allow\s*\(\s*dead_code\s*\)/.test(e)}function dD(e){return e.type==="const_item"||e.type==="type_item"||e.type==="static_item"||e.type==="associated_type"}function mD(e){let t=gD(e);if(t.size===0)return[];let n=[];for(let i of e.descendantsOfType("mod_item")){let r=i.childForFieldName("name")?.text;r&&t.has(r)&&n.push({startLine:i.startPosition.row,endLine:i.endPosition.row,reason:'serde `with = "..."` module \u2014 body invoked via reflection',containerName:r})}return n}function pD(e){for(let t=0;t<Math.min(e.namedChildCount,12);t+=1){let n=e.namedChild(t);if(!n||n.type!=="line_comment"&&n.type!=="block_comment")break;if(/@generated\b/.test(n.text)||/This file is .*generated\b/i.test(n.text)||/Code generated by/i.test(n.text)||/Generated by:\s*https?:\/\/openapi-generator/i.test(n.text)||/openapi-generator/i.test(n.text)&&/Generated by/i.test(n.text))return!0}return!1}var fD=/^#!?\[\s*serde\s*\(/,Cf=/\bwith\s*=\s*"([^"]+)"/g;function gD(e){let t=new Set;for(let n of e.descendantsOfType("attribute_item")){if(!fD.test(n.text))continue;Cf.lastIndex=0;let i;for(;(i=Cf.exec(n.text))!==null;){let r=i[1],o=r.split("::").pop()??r;o&&t.add(o)}}return t}function If(e){let t=new Map,n=i=>{let r=t.get(i);if(r)return r;let o=vf(e,i);return r={ranges:o.map(s=>({startLine:s.startLine,endLine:s.endLine})),containers:new Set(o.map(s=>s.containerName).filter(s=>!!s))},t.set(i,r),r};return(i,r,o,s)=>{let a=n(i);for(let c of a.ranges)if(r>=c.startLine&&r<=c.endLine)return!0;if(s&&a.containers.has(s))return!0;for(let c of rs(o))if(a.containers.has(c))return!0;return!1}}function Vc(e,t={}){$a(e,{groups:t.semanticProvider===!0?["whole-project","semantic-provider"]:["whole-project"]})}function Lf(e,t,n={}){$a(e,{groups:n.definitions===!0?["source-file","definition-catalog"]:["source-file"],file:t.replace(/\\/g,"/")})}function Df(e,t){return t.isIgnoredPath(e.relativePath)?Et("ignored-file"):gn(e.symbol)?Et("module-like-symbol"):Cs(e.symbol)?!e.isFunctionLike&&e.enclosingSymbol&&Cs(e.enclosingSymbol)?Et("nested-non-callable-value"):!t.includeTests&&!Or(e.relativePath)?Et("test-file"):!t.includeTests&&t.isExcludedRegion(e.relativePath,e.startLine,e.symbol,e.parentTypeName)?Et("excluded-file-region"):ts(e.symbol)?Et("rust-trait-impl-member"):Ii(e.symbol)?Et("rust-test-module"):!t.includeMembers&&!hD(e)?Et("member"):e.endLine-e.startLine+1<t.minLoc?Et("below-min-loc"):{accepted:!0}:Et("non-value-symbol")}function Or(e){return Z(e)!=="test"}function Et(e){return{accepted:!1,rejectionReason:e}}function Cs(e){return de(e)||e.endsWith("().")||e.endsWith(".")}function hD(e){return he(e.symbol)||rs(e.symbol).length===0}function vs(e,t){return J(e)-J(t)||e.relativePath.localeCompare(t.relativePath)}function qe(e,t){return typeof t!="number"||t<=0||e.length<=t?e:e.slice(0,t)}function Oi(e){let t=new Set,n=[];for(let i of e){let r=`${i.symbol}|${i.file}`;t.has(r)||(t.add(r),n.push(i))}return n}function Ef(){return new Map}function Nf(e,t,n){let i=new Map;for(let r of Rp(e,n))e.isIgnored(r.relative_path)||t.has(r.relative_path)||ks(i,r.symbol_id,r.relative_path,r.ref_count,"scip-mention");return i}function Ff(e,t,n,i={}){let r=new Set;if(i.conservative||n.size===0){for(let o of wp(e,t))r.add(o.symbol_id);return r}for(let o of kp(e,t))e.isIgnored(o.relative_path)||n.has(o.relative_path)||r.add(o.symbol_id);return r}function qc(e,t){let n=e.get(t);if(!n)return!1;for(let i of n.values())if(i.occurrences>0)return!0;return!1}function Rs(e,t,n){let i=e.get(t);if(!i)return!1;for(let[r,o]of i)if(r!==n&&o.occurrences>0)return!0;return!1}function Tf(e){return e?.occurrences??0}function ks(e,t,n,i,r="source-fallback"){if(i<=0)return;let o=Af(e,t,n);o.occurrences+=i,o.sources.add(r)}function _f(e,t,n,i,r){if(i<=0)return;let o=Af(e,t,n);o.occurrences=Math.max(i,o.occurrences),o.sources.add(r)}function Af(e,t,n){let i=e.get(t);i||(i=new Map,e.set(t,i));let r=i.get(n);return r||(r={occurrences:0,sources:new Set},i.set(n,r)),r}var yD=3e3,bD=1e3;function Qt(e,t={}){let{scope:n,minLoc:i=1,includeTests:r=!1,skipBarrels:o=!1,includeMembers:s=!1,deadCodeOnly:a=!1,scanLimit:c,semantic:l=!0}=t,d=0,u=D("dead.candidates",()=>{let y=qe(SD(e,{scope:n,minLoc:i,includeTests:r,includeMembers:s}),c);return d=y.length,y},()=>({definitions:d})),m=0,p=o?D("dead.inactive-barrels",()=>{let y=new Set(Sp(e));return m=y.size,y},()=>({paths:m})):new Set,f=0,g=a?Ef():D("dead.mention-reference-counts",()=>{let y=Nf(e,p,u.map(w=>w.symbolId));return f=y.size,y},()=>({definitions:u.length,symbolsWithReferences:f})),b=0,x=a?D("dead.mentioned-symbol-ids",()=>{let y=Ff(e,u.map(w=>w.symbolId),p,{conservative:p.size===0});return b=y.size,y},()=>({definitions:u.length,referencedSymbols:b})):new Set,S=a?u.filter(y=>!x.has(y.symbolId)):u.filter(y=>!Rs(g,y.symbolId,y.relativePath));a?D("dead.source-fallback.dead-code-only",()=>kD(e,S,g,{includeTests:r,inactiveBarrelPaths:p}),()=>({definitions:S.length,includeTests:r})):D("dead.source-fallback.ast",()=>RD(e,S,g,{includeTests:r,inactiveBarrelPaths:p}),()=>({definitions:S.length,includeTests:r}));let R=a?S.filter(y=>!qc(g,y.symbolId)):S.filter(y=>!Rs(g,y.symbolId,y.relativePath));D("dead.caller-map-supplement",()=>DD(e,R,g,{includeTests:r,inactiveBarrelPaths:p,includeSemantic:!a&&l}),()=>({definitions:R.length,semantic:!a&&l}));let C=a?S.filter(y=>!qc(g,y.symbolId)):u;return vD(e,xD(C,g))}function SD(e,t){let n=If(e),i=[];for(let r of Cr(e,{scope:t.scope,symbolMatches:Cs,sqlPrefilter:"function-like"}))Df(r,{minLoc:t.minLoc,includeTests:t.includeTests,includeMembers:t.includeMembers,isIgnoredPath:s=>e.isIgnored(s),isExcludedRegion:n}).accepted&&i.push(r);return i}function xD(e,t){return e.map(n=>CD(n,t)).filter(n=>n.cross_file_refs===0).sort((n,i)=>i.loc-n.loc||n.relative_path.localeCompare(i.relative_path)||n.start_line-i.start_line)}function CD(e,t){let n=t.get(e.symbolId)??new Map,i=Tf(n.get(e.relativePath)),r=0;for(let[o,s]of n)o!==e.relativePath&&(r+=s.occurrences);return{relative_path:e.relativePath,start_line:e.startLine,end_line:e.endLine,loc:e.endLine-e.startLine+1,symbol:e.symbol,same_file_refs:i,cross_file_refs:r}}function vD(e,t){let n=[],i=0,r=0,o=0;for(let s of t){if(e.isIgnored(s.relative_path)||Oe(e,s.relative_path)||be(e,s.symbol,s.relative_path))continue;let a=s.same_file_refs===0?"dead-code":"file-internal";a==="dead-code"?i++:r++,o+=s.loc,n.push({relativePath:s.relative_path,startLine:s.start_line,endLine:s.end_line,loc:s.loc,symbol:s.symbol,shortName:v(s.symbol),sameFileRefs:s.same_file_refs,kind:a})}return{symbols:n,counts:{total:n.length,deadCode:i,fileInternal:r,loc:o},totalCount:n.length,deadCodeCount:i,fileInternalCount:r,totalLoc:o}}function RD(e,t,n,i){if(t.length===0)return;let r=new A(e),o=new Set(t.map(c=>c.symbolId)),s=new Set(t.map(c=>c.leaf).filter(Boolean)),a=new Set(r.sourceFiles());for(let c of O(e))a.add(c);r.scanSourceReferences({paths:a,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:s,skipPath:c=>i.inactiveBarrelPaths.has(c)||!i.includeTests&&!Or(c)},c=>{o.has(c.target.symbolId)&&(ID(e,c)||ks(n,c.target.symbolId,c.sourceFile,LD(c),"source-fallback"))})}function kD(e,t,n,i){if(t.length===0)return;let r=new A(e),o=wD(t),s=new Set(r.sourceFiles());for(let d of O(e))s.add(d);let a=new Set(o.keys()),c=new Map,l=d=>{let u=c.get(d);return u||(u=bs(e,d),c.set(d,u)),u};r.scanSourceReferences({paths:s,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:a,skipPath:d=>i.inactiveBarrelPaths.has(d)||!i.includeTests&&!Or(d),resolveTargets:({sourceFile:d,name:u,kind:m})=>{let p=o.get(u);return p?PD(d,u,p,()=>l(d),{permissive:m!=="cross-language-dispatch"}):[]},afterPath:d=>{c.delete(d),Lf(e,d)}},d=>{let u=d.kind==="identifier"&&d.sourceFile===d.target.relativePath?Math.max(0,d.occurrences-1):d.occurrences;d.kind==="identifier"&&Mf(e,{sourceFile:d.sourceFile,name:d.name,target:d.target,occurrences:u})||ks(n,d.target.symbolId,d.sourceFile,u,"source-fallback")})}function wD(e){let t=new Map;for(let n of e){if(!n.leaf)continue;let i=t.get(n.leaf)??[];i.push(n),t.set(n.leaf,i)}return t}function PD(e,t,n,i,r){let o=n.filter(l=>l.relativePath===e);if(o.length>0)return o;if(!r.permissive&&n.length===1)return[...n];let s=i(),a=s.get(t);if(a)for(let l of a){let d=n.filter(u=>Dt(l,u.relativePath));if(d.length>0)return d}let c=new Set;for(let l of s.values())for(let d of l)c.add(d);for(let l of c){let d=n.filter(u=>Dt(l,u.relativePath));if(d.length>0&&d.length===n.length)return d}return r.permissive?[...n]:[]}function ID(e,t){return t.kind==="cross-language-dispatch"&&t.target.relativePath===t.sourceFile?!0:t.kind==="identifier"&&Mf(e,t)}function LD(e){return e.kind==="identifier"&&e.target.relativePath===e.sourceFile?Math.max(0,e.occurrences-1):e.occurrences}function Mf(e,t){return t.occurrences>1?!1:oe(e,t.sourceFile).some(n=>n.used||n.sourcePath!==t.target.relativePath?!1:n.importedName===t.name||n.localName===t.name)}function DD(e,t,n,i){let r=i.includeSemantic!==!1,o=r&&t.length>=yD&&O(e).length>=bD,s=(d,u)=>{u===d.relativePath||e.isIgnored(u)||i.inactiveBarrelPaths.has(u)||!i.includeTests&&!Or(u)||_f(n,d.symbolId,u,1,"caller-map")};if(o?D("dead.caller-map.mention-chunks",()=>ED(e,t,s),()=>({definitions:t.length})):D("dead.caller-map.per-symbol",()=>{for(let d of t){let u=at(e,d,{semantic:r});if(u.length!==0)for(let m of u)s(d,m.file)}},()=>({definitions:t.length,semantic:r})),!o)return;let a=0,c=D("dead.caller-map.semantic-candidates",()=>{let d=t.filter(u=>!Rs(n,u.symbolId,u.relativePath));return a=d.length,d},()=>({definitions:t.length,semanticCandidates:a}));if(c.length===0)return;let l=st(e,c);for(let d of c){let u=l.get(d.symbolId);if(u)for(let m of u)s(d,m)}}function ED(e,t,n){let i=new Map(t.map(r=>[r.symbolId,r]));for(let r of Mi(e,[...i.keys()])){let o=i.get(r.symbol_id);o&&n(o,r.relative_path)}}function Uc(e,t={}){let{limit:n=30,scope:i}=t,r=i?`AND def_d.relative_path LIKE '%${i}%'`:"",s=e.all(`SELECT
|
|
351
371
|
gs.symbol,
|
|
352
372
|
COUNT(*) AS ref_count,
|
|
353
373
|
COUNT(DISTINCT ref_d.id) AS file_count,
|
|
@@ -370,14 +390,14 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
370
390
|
${r}
|
|
371
391
|
GROUP BY gs.id
|
|
372
392
|
ORDER BY ref_count DESC
|
|
373
|
-
LIMIT ?`,n).filter(a=>!e.isIgnored(a.defined_in)).map(a=>({symbol:a.symbol,shortName:v(a.symbol),refCount:a.ref_count,fileCount:a.file_count,definedIn:a.defined_in}));return s.length>0?s:
|
|
393
|
+
LIMIT ?`,n).filter(a=>!e.isIgnored(a.defined_in)).map(a=>({symbol:a.symbol,shortName:v(a.symbol),refCount:a.ref_count,fileCount:a.file_count,definedIn:a.defined_in}));return s.length>0?s:ND(e,i,n)}function ND(e,t,n){return Lt(e,{scope:t}).filter(i=>!e.isIgnored(i.relativePath)).map(i=>FD(e,i)).filter(i=>i.refCount>0).sort((i,r)=>r.refCount-i.refCount||r.fileCount-i.fileCount).slice(0,n)}function FD(e,t){let n=at(e,t,{limit:500});return{symbol:t.symbol,shortName:v(t.symbol),refCount:n.length,fileCount:new Set(n.map(i=>i.file)).size,definedIn:t.relativePath}}function zc(e,t,n={}){return jf(e,t,n)?.map(i=>({symbol:i.symbol,shortName:i.shortName,fromFile:i.fromFile}))??[]}function Wc(e,t){let n=q(e,t),i=TD(e,t);if(i.length>0&&!AD(n))return i;let r=_D(e,t,n);return Kc(t)&&r.length>0?r:MD([...i,...r])}function Gc(e,t,n={}){return jf(e,t,n)?.filter(i=>!i.used).map(i=>({symbol:i.symbol,shortName:i.shortName,importedIn:i.importer}))??[]}function TD(e,t){return e.all(`SELECT DISTINCT gs.symbol, d.relative_path AS importer
|
|
374
394
|
FROM mentions m
|
|
375
395
|
JOIN chunks c ON m.chunk_id = c.id
|
|
376
396
|
JOIN documents d ON c.document_id = d.id
|
|
377
397
|
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
378
398
|
WHERE gs.symbol LIKE ?
|
|
379
399
|
AND m.role = 2
|
|
380
|
-
ORDER BY d.relative_path`,`%${t}%`).filter(i=>!e.isIgnored(i.importer)).map(i=>({symbol:i.symbol,shortName:v(i.symbol),fromFile:i.importer}))}function
|
|
400
|
+
ORDER BY d.relative_path`,`%${t}%`).filter(i=>!e.isIgnored(i.importer)).map(i=>({symbol:i.symbol,shortName:v(i.symbol),fromFile:i.importer}))}function _D(e,t,n=q(e,t)){let i=n?.relativePath??null,r=n?$(n.symbol):t.replace(/\(\)$/,""),o=n?gn(n.symbol):!1,s=new Set;for(let c of O(e,{includeIgnored:!1}))for(let l of oe(e,c))$D(l,c,{targetFile:i,targetLeaf:r,targetIsModule:o,targetPattern:t})&&s.add(c);let a=Kc(t)?t.trim():null;return[...s].sort().map(c=>({symbol:a??n?.symbol??r,shortName:a??(n?v(n.symbol):r),fromFile:c}))}function AD(e){return!!(e&&(e.symbol.startsWith("scip-clojure ")||H(e.relativePath)==="clojure"))}function MD(e){let t=new Set,n=[];for(let i of e){let r=`${i.symbol}|${i.fromFile}`;t.has(r)||(t.add(r),n.push(i))}return n.sort((i,r)=>i.fromFile.localeCompare(r.fromFile)||i.shortName.localeCompare(r.shortName))}function $D(e,t,n){return!e.sourcePath||n.targetFile&&$f(e.sourcePath)!==$f(n.targetFile)?!1:e.kind==="side-effect"||n.targetFile&&VD(t)||e.kind==="namespace"&&jD(e,n.targetPattern)||n.targetIsModule||e.kind==="named"&&e.importedName===n.targetLeaf?!0:e.kind==="namespace"&&e.usedMembers.includes(n.targetLeaf)}function jD(e,t){let n=t.trim().replace(/\(\)$/,"");return Kc(n)?e.importedName===n||e.localName===n:!1}function Kc(e){let t=e.trim().replace(/\(\)$/,"");return t.includes(".")&&!t.includes("/")&&!t.includes(":")}function jf(e,t,n={}){let i=Ve(e,t);return i?OD(e,i,n)??(n.semantic===!1?null:BD(e,i))??HD(e,i):null}function OD(e,t,n){let r=e.all(`SELECT DISTINCT
|
|
381
401
|
gs.symbol,
|
|
382
402
|
def_d.relative_path AS from_file,
|
|
383
403
|
imp_d.relative_path AS importer,
|
|
@@ -403,11 +423,11 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
403
423
|
LEFT JOIN documents def_d ON sym_def.document_id = def_d.id
|
|
404
424
|
WHERE imp_d.relative_path = ?
|
|
405
425
|
AND m.role = 2
|
|
406
|
-
ORDER BY def_d.relative_path, gs.symbol`,t).filter(o=>!e.isIgnored(o.importer));if(r.length>0){let o=n.semantic===!1?[]:
|
|
426
|
+
ORDER BY def_d.relative_path, gs.symbol`,t).filter(o=>!e.isIgnored(o.importer));if(r.length>0){let o=n.semantic===!1?[]:Er(e,t);return r.map(s=>({symbol:s.symbol,shortName:v(s.symbol),fromFile:s.from_file??"(external)",importer:s.importer,used:s.used!==0||o.some(a=>a.isUsed&&a.sourcePath===s.from_file)}))}return null}function BD(e,t){let n=Er(e,t);return n.length>0?n.map(i=>{let r=Of(i.importedName,i.localName,i.kind);return{symbol:r,shortName:r,fromFile:i.sourcePath??"(external)",importer:t,used:i.kind==="side-effect"?!0:i.isUsed}}):null}function HD(e,t){return oe(e,t).map(n=>{let i=Of(n.importedName,n.localName,n.kind),r=n.kind==="side-effect"?!0:n.used;return{symbol:i,shortName:i,fromFile:n.sourcePath??"(external)",importer:t,used:r}})}function Of(e,t,n){return n==="namespace"&&e==="*"&&t?`* as ${t}`:n==="default"&&t?`default as ${t}`:n==="side-effect"?"(side effect import)":t&&t!==e?`${e} as ${t}`:e}function $f(e){return e.replace(/\\/g,"/")}function VD(e){return/\.(?:c|h|cc|cpp|cxx|hpp|hh|hxx)$/i.test(e)}function Jc(e,t){let n=Fi(e,t),i=ns(e,n,{sort:!0});if(i.length===0)return[];let r=i.map(a=>({symbol:a.symbol,shortName:a.shortName,startLine:a.startLine,endLine:a.endLine,signature:a.signature,children:[]})),o=new Map;for(let a of r)o.set(a.symbol,a);let s=[];for(let a=0;a<i.length;a++){let c=i[a],l=r[a];if(c.enclosingSymbol&&o.has(c.enclosingSymbol)){o.get(c.enclosingSymbol).children.push(l);continue}let d=null,u=1/0;for(let m of r)if(m!==l&&m.startLine<=l.startLine&&m.endLine>=l.endLine){if(m.startLine===l.startLine&&m.endLine===l.endLine&&!qm(m.symbol,l.symbol))continue;let f=m.endLine-m.startLine;f<u&&(u=f,d=m)}d?d.children.push(l):s.push(l)}return s}function Xc(e,t){let n=q(e,t);if(!n)return[];let r=new A(e).definitionsForFile(n.relativePath).filter(o=>o.symbol!==n.symbol).filter(o=>Vm(n.symbol,o.symbol)).sort((o,s)=>o.startLine-s.startLine||o.endLine-s.endLine).map(o=>({symbol:o.symbol,shortName:v(o.symbol),startLine:o.startLine,endLine:o.endLine,kind:se(o.symbol)??"unknown"}));return H(n.relativePath)!=="clojure"?r:UD(r,qD(e,n))}function qD(e,t){let n=$(t.symbol);if(!n)return[];let i=v(t.symbol);return(X(e,t.relativePath)?.clojureMembers??[]).filter(r=>r.ownerName===n).map(r=>({symbol:`${t.symbol}${r.memberName}().`,shortName:`${i}:${r.memberName}()`,startLine:r.startLine,endLine:r.endLine,kind:r.memberKind}))}function UD(e,t){let n=new Map;for(let i of[...e,...t])n.set(`${i.shortName}:${i.startLine}:${i.endLine}`,i);return[...n.values()].sort((i,r)=>i.startLine-r.startLine||i.endLine-r.endLine)}function Qc(e,t){let n=q(e,t);if(!n)return[];let i=e.get(`SELECT COUNT(DISTINCT c.document_id) AS file_count
|
|
407
427
|
FROM mentions m
|
|
408
428
|
JOIN chunks c ON m.chunk_id = c.id
|
|
409
429
|
WHERE m.symbol_id = ?
|
|
410
|
-
AND m.role != 1`,n.symbolId);return[{name:v(n.symbol),count:i?.file_count??0}]}function
|
|
430
|
+
AND m.role != 1`,n.symbolId);return[{name:v(n.symbol),count:i?.file_count??0}]}function Yc(e,t){let n=Ve(e,t);if(!n)return[];let r=e.all(`SELECT d.relative_path, COUNT(DISTINCT gs.id) AS symbol_count
|
|
411
431
|
FROM mentions m
|
|
412
432
|
JOIN chunks c ON m.chunk_id = c.id
|
|
413
433
|
JOIN documents d ON c.document_id = d.id
|
|
@@ -424,7 +444,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
424
444
|
AND m.role != 1
|
|
425
445
|
AND def_d.id != d.id
|
|
426
446
|
GROUP BY d.id
|
|
427
|
-
ORDER BY symbol_count DESC`,n).filter(a=>!e.isIgnored(a.relative_path)).map(a=>({name:a.relative_path,count:a.symbol_count}));if(r.length>0)return r;let s=
|
|
447
|
+
ORDER BY symbol_count DESC`,n).filter(a=>!e.isIgnored(a.relative_path)).map(a=>({name:a.relative_path,count:a.symbol_count}));if(r.length>0)return r;let s=ye(e).get(n);return!s||s.size===0?[]:[{name:n,count:s.size}]}function Zc(e,t={}){return zD(e,t).map(n=>({name:v(n.symbol),count:n.file_count}))}function zD(e,t){let{limit:n=30,scope:i}=t,r=i?`AND def_d.relative_path LIKE '%${i}%'`:"";return e.all(`SELECT gs.symbol, COUNT(DISTINCT c.document_id) AS file_count
|
|
428
448
|
FROM mentions m
|
|
429
449
|
JOIN chunks c ON m.chunk_id = c.id
|
|
430
450
|
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
@@ -443,7 +463,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
443
463
|
GROUP BY gs.id
|
|
444
464
|
HAVING file_count > 1
|
|
445
465
|
ORDER BY file_count DESC
|
|
446
|
-
LIMIT ?`,n)}function
|
|
466
|
+
LIMIT ?`,n)}function el(e,t={}){let{limit:n=30,scope:i}=t,r=i?`AND d.relative_path LIKE '%${i}%'`:"";return e.all(`SELECT d.relative_path, COUNT(DISTINCT gs.id) AS symbol_count
|
|
447
467
|
FROM mentions m
|
|
448
468
|
JOIN chunks c ON m.chunk_id = c.id
|
|
449
469
|
JOIN documents d ON c.document_id = d.id
|
|
@@ -463,7 +483,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
463
483
|
${r}
|
|
464
484
|
GROUP BY d.id
|
|
465
485
|
ORDER BY symbol_count DESC
|
|
466
|
-
LIMIT ?`,n).filter(s=>!e.isIgnored(s.relative_path)).map(s=>({name:s.relative_path,count:s.symbol_count}))}function
|
|
486
|
+
LIMIT ?`,n).filter(s=>!e.isIgnored(s.relative_path)).map(s=>({name:s.relative_path,count:s.symbol_count}))}function tl(e,t,n){let i=Ve(e,t)??t,r=Ve(e,n)??n,o=e.get(`SELECT COUNT(DISTINCT gs.id) AS shared
|
|
467
487
|
FROM global_symbols gs
|
|
468
488
|
WHERE (
|
|
469
489
|
-- Defined in file1, referenced in file2
|
|
@@ -495,7 +515,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
495
515
|
JOIN documents d ON c.document_id = d.id
|
|
496
516
|
WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path = ?
|
|
497
517
|
)
|
|
498
|
-
)`,i,r,r,i);return{...
|
|
518
|
+
)`,i,r,r,i);return{...Bf(i,r,o?.shared??0)}}function nl(e,t={}){let{limit:n=20,scope:i}=t,r=i?`AND d1.relative_path LIKE '%${i}%' AND d2.relative_path LIKE '%${i}%'`:"";return e.all(`SELECT
|
|
499
519
|
def_d.relative_path AS file1,
|
|
500
520
|
ref_d.relative_path AS file2,
|
|
501
521
|
COUNT(DISTINCT gs.id) AS shared
|
|
@@ -517,7 +537,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
517
537
|
${r}
|
|
518
538
|
GROUP BY def_d.id, ref_d.id
|
|
519
539
|
ORDER BY shared DESC
|
|
520
|
-
LIMIT ?`,n).filter(s=>!e.isIgnored(s.file1)&&!e.isIgnored(s.file2)).map(s=>
|
|
540
|
+
LIMIT ?`,n).filter(s=>!e.isIgnored(s.file1)&&!e.isIgnored(s.file2)).map(s=>Bf(s.file1,s.file2,s.shared))}function Bf(e,t,n){return{file1:e,file2:t,sharedSymbols:n,actionTier:"signal",couplingKind:"shared-symbol-coupling",evidenceReasons:[`${n} symbol(s) are defined in one file and referenced by the other`],recommendation:"Review whether the shared symbol surface is an intentional boundary or hidden coordination pressure before moving code."}}function Un(e,t={}){let{scope:n,maxDepth:i=10}=t,r=ye(e,n),o=[],s=new Set,a=new Set,c=[];function l(u,m){if(m>i)return;if(a.has(u)){let f=c.indexOf(u);if(f!==-1){let g=c.slice(f).concat(u),b=g.indexOf(g.reduce((R,C)=>R<C?R:C)),x=[...g.slice(b,-1),...g.slice(0,b),g[b]],S=x.join(" -> ");d.has(S)||(d.add(S),o.push({path:x,kind:WD(x)}))}return}if(s.has(u))return;s.add(u),a.add(u),c.push(u);let p=r.get(u);if(p)for(let f of p)l(f,m+1);c.pop(),a.delete(u)}let d=new Set;for(let u of r.keys())s.has(u)||l(u,0);return o.sort((u,m)=>u.kind!==m.kind?u.kind==="real"?-1:1:u.path.length-m.path.length),o}function WD(e){for(let i of e){let r=Z(i);if(r==="test"||r==="barrel"||r==="entry")return"module-hierarchy"}if(e.length!==3)return"real";let[t,n]=e;return!t||!n?"real":as(t)||as(n)||Hf(t,n)||Hf(n,t)||Vf(t,n)||Vf(n,t)||Z(t)==="entry"||Z(n)==="entry"?"module-hierarchy":"real"}function Hf(e,t){if(!/\.rs$/.test(e)||!/\.rs$/.test(t))return!1;let n=t.replace(/\.rs$/,"/");return e.startsWith(n)?!e.slice(n.length).includes("/"):!1}function Vf(e,t){if(!/\.rs$/.test(e)||!/\.rs$/.test(t))return!1;let n=e.replace(/\.rs$/,""),i=t.replace(/\.rs$/,"");if(n===i+"_tests"||n===i+"/tests")return!0;let r=e.split("/"),o=t.split("/");if(r.length===o.length&&r.includes("tests")&&o.includes("src")){let s=r[r.length-1],a=o[o.length-1];if(s&&s===a)return!0}return!1}function il(e,t={}){let{limit:n=20,scope:i,minFanIn:r=2,minFanOut:o=2,scanLimit:s}=t,a=new A(e);return qe(a.productionCallableDefinitions({scope:i,requireCallableSymbol:!0,includeSuppressed:!0,sortByLocDesc:typeof s=="number"&&s>0}),s).map(d=>GD(e,d,t.semantic!==!1)).filter(d=>d.fanIn>=r&&d.fanOut>=o).sort((d,u)=>u.score-d.score||u.fanIn-d.fanIn).slice(0,n)}function GD(e,t,n){let i=new Set(at(e,t,{limit:500,semantic:n}).map(s=>s.file)).size,r=new Set(Je(e,t,{limit:500,semantic:n}).filter(s=>s.file!==t.relativePath).map(s=>`${s.symbol}|${s.file}`)).size,o=i*r;return{symbol:t.symbol,shortName:v(t.symbol),fanIn:i,fanOut:r,score:o,definedIn:t.relativePath,actionTier:"signal",riskKind:"coordination-hotspot",evidenceReasons:[`${i} incoming file(s) reference this symbol`,`${r} distinct cross-file callee symbol(s) are reached from it`,`centrality score is ${o} (fan-in * fan-out)`],recommendation:"Review ownership, API stability, and caller groups before changing this central symbol; do not refactor solely from graph centrality."}}function zn(e,t={}){let{scope:n,minLoc:i=3,scanLimit:r}=t,o=new A(e),s=t.semantic!==!1,a=0,c=D("isolated.candidates",()=>{let y=qe(o.productionCallableDefinitions({scope:n,minLoc:i,excludeEntrySurfaces:!0,excludeRustTraitImplMembers:!0,includeSuppressed:!0,requireFunctionLikeSymbol:!0,sortByLocDesc:typeof r=="number"&&r>0}),r);return a=y.length,y},()=>({definitions:a})),l=0,d=D("isolated.strict-callees",()=>{let y=o.symbolsWithNonSelfCallees(c,{additive:!1,semantic:!1});return l=y.size,y},()=>({definitions:c.length,symbols:l})),u=c.filter(y=>!d.has(y.symbolId)),m=0,p=D("isolated.scip-callers",()=>{let y=o.crossFileCallerMap(u,{semantic:!1});return m=y.size,y},()=>({definitions:u.length,symbols:m})),f=new Set(p.keys());for(let y of o.frameworkReferencedSymbolIds(u))f.add(y);let g=u.filter(y=>!f.has(y.symbolId));if(s&&g.length>0){for(let y of st(e,g).keys())f.add(y);for(let y of o.symbolsWithNonSelfCallees(g,{additive:!1,semantic:!0}))d.add(y);g=g.filter(y=>!f.has(y.symbolId)).filter(y=>!d.has(y.symbolId))}let b=0,x=D("isolated.source-fallback-callers",()=>{let y=o.sourceFallbackCallerFiles(g,{skipPath:w=>Z(w)==="test"});return b=y.size,y},()=>({definitions:g.length,symbols:b}));for(let y of x.keys())f.add(y);let S=g.filter(y=>!f.has(y.symbolId)),R=0,C=D("isolated.additive-callees",()=>{let y=o.symbolsWithNonSelfCallees(S,{additive:!0,semantic:s});return R=y.size,y},()=>({definitions:S.length,symbols:R}));for(let y of C)d.add(y);return S.filter(y=>!d.has(y.symbolId)).sort((y,w)=>J(w)-J(y)||y.relativePath.localeCompare(w.relativePath)||y.startLine-w.startLine).map(y=>({symbol:y.symbol,shortName:v(y.symbol),relativePath:y.relativePath,startLine:y.startLine,endLine:y.endLine,loc:J(y)}))}import{SymbolInformation_Kind as Le}from"@c4312/scip";var qf=500;function KD(e){let t=parseInt(e,10);if(!isNaN(t))return t;let n=e.toLowerCase(),i=df.get(n);if(i!==void 0)return i;for(let[r,o]of Ss)if(o.toLowerCase().includes(n))return r;return null}function rl(e,t,n={}){let{scope:i,limit:r=100}=n,o=KD(t);return o===null?[]:JD(e,i).map(a=>({row:a,resolvedKind:zf(a)})).filter(a=>a.resolvedKind===o).slice(0,r).map(({row:a,resolvedKind:c})=>({symbol:a.symbol,shortName:v(a.symbol),kind:c,kindName:_c(c),relativePath:a.relative_path,startLine:a.start_line,endLine:a.end_line}))}function ol(e,t={}){let n=XD(e,t.scope);for(let i of QD(e,t.scope)){let r=zf(i);r===null||r===0||n.set(r,(n.get(r)??0)+1)}return[...n.entries()].sort((i,r)=>r[1]-i[1]||i[0]-r[0]).map(([i,r])=>({kind:i,kindName:_c(i),count:r}))}function JD(e,t){return Lt(e,{scope:t}).map(YD)}function XD(e,t){let n=new Map;for(let i of Uf(O(e,{scope:t,includeIgnored:!1}))){let r=i.map(()=>"?").join(", "),o=e.all(`SELECT gs.kind AS kind, COUNT(*) AS count
|
|
521
541
|
FROM defn_enclosing_ranges der
|
|
522
542
|
JOIN global_symbols gs ON der.symbol_id = gs.id
|
|
523
543
|
JOIN documents d ON der.document_id = d.id
|
|
@@ -525,7 +545,7 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
525
545
|
AND gs.kind != 0
|
|
526
546
|
AND gs.symbol NOT LIKE '%#'
|
|
527
547
|
AND d.relative_path IN (${r})
|
|
528
|
-
GROUP BY gs.kind`,...i);for(let s of o)n.set(s.kind,(n.get(s.kind)??0)+s.count)}return n}function
|
|
548
|
+
GROUP BY gs.kind`,...i);for(let s of o)n.set(s.kind,(n.get(s.kind)??0)+s.count)}return n}function QD(e,t){let n=[];for(let i of Uf(O(e,{scope:t,includeIgnored:!1}))){let r=i.map(()=>"?").join(", ");n.push(...e.all(`SELECT gs.symbol,
|
|
529
549
|
gs.kind,
|
|
530
550
|
gs.documentation,
|
|
531
551
|
gs.enclosing_symbol,
|
|
@@ -538,11 +558,11 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
538
558
|
WHERE (gs.kind IS NULL OR gs.kind = 0 OR gs.symbol LIKE '%#')
|
|
539
559
|
${e.symbolNoiseFor("gs")}
|
|
540
560
|
AND d.relative_path IN (${r})
|
|
541
|
-
ORDER BY d.relative_path, der.start_line, der.end_line, gs.symbol`,...i))}return n}function
|
|
542
|
-
WHERE id = ? LIMIT 1`,n.symbolId);if(!i)return[];let r=[{symbol:i.symbol,shortName:v(i.symbol),depth:0}],o=i.enclosing_symbol,s=1,a=new Set([i.symbol]);for(;o&&!a.has(o)&&s<20;){a.add(o);let d=e.get("SELECT symbol, enclosing_symbol FROM global_symbols WHERE symbol = ?",o);if(!d)break;r.push({symbol:d.symbol,shortName:v(d.symbol),depth:s}),o=d.enclosing_symbol,s++}if(r.length>1)return r;let c=we(i.symbol);if("kind"in c)return r;let l=c.descriptors;if(l.length<=1)return r;let u=[r[0]];for(let d=l.length-2,m=1;d>=0;d--,m++){let f=l.slice(0,d+1).map(g=>g.suffix==="method"?`${g.name}()`:g.name.replace(/\.(ts|tsx|js|jsx|mjs|cjs|py|pyi|rs|java|scala|kt|kts|rb|go|cs|vb|dart|php|c|cc|cpp|cxx|h|hpp)$/,"")).join(":");u.push({symbol:f,shortName:f,depth:m})}return u}function Ir(e,t,n={}){let i=V(e,t);if(!i)return null;let r=n.semantic!==!1,o=tt(e,i,{limit:50,semantic:r}),s=Di(Ge(e,i,{limit:50,additive:!0,callableOnly:!0,semantic:r}));return{symbol:i.symbol,shortName:v(i.symbol),callers:o.map(a=>({symbol:a.symbol,shortName:v(a.symbol),file:a.file})),callees:s.map(a=>({symbol:a.symbol,shortName:v(a.symbol),file:a.file}))}}function nt(e,t){let n=new Set;for(let i of e)t.has(i)&&n.add(i);return n}function Le(e,t){let n=new Set;for(let i of e)t.has(i)||n.add(i);return n}function tn(e,t){if(e.size===0&&t.size===0)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);let i=e.size+t.size-n;return i===0?0:n/i}function Op(e,t){if(e.size===0)return 0;let n=0;for(let i of e)t.has(i)&&(n+=1);return n/e.size}function Lc(e,t){if(t<=0)return new Map;let n=new Map;for(let[i,r]of e)r>0&&n.set(i,Math.log(t/r));return n}function Pi(e){let t=[...e.values()].sort((i,r)=>i-r);if(t.length===0)return 0;let n=Math.floor(t.length/2);return t.length%2===0?(t[n-1]+t[n])/2:t[n]}function Ni(e,t){let n=0;for(let i of e){let r=t.get(i)??0;n+=r*r}return Math.sqrt(n)}function jp(e,t,n,i={}){let r=0,o=0,s=0,a=i.medianIdf??Pi(n),c=[],l=[];for(let m of e){let p=n.get(m)??0;o+=p*p,t.has(m)&&(r+=p*p,p>=a?c.push(m):l.push(m))}if(c.length===0&&l.length===0)return{similarity:0,significantShared:[],trivialShared:[]};for(let m of t){let p=n.get(m)??0;s+=p*p}let u=Math.sqrt(o)*Math.sqrt(s),d=u>0?r/u:0;return c.sort((m,p)=>(n.get(p)??0)-(n.get(m)??0)),{similarity:d,significantShared:c,trivialShared:l}}function Bp(e,t,n,i){let r=0,o=i.medianIdf??Pi(n),s=[],a=[];for(let u of e){if(!t.has(u))continue;let d=n.get(u)??0;r+=d*d,d>=o?s.push(u):a.push(u)}if(s.length===0&&a.length===0)return{similarity:0,significantShared:[],trivialShared:[]};let c=i.magnitudeA*i.magnitudeB,l=c>0?r/c:0;return s.sort((u,d)=>(n.get(d)??0)-(n.get(u)??0)),{similarity:l,significantShared:s,trivialShared:a}}function Dr(e,t,n={}){let{minSimilarity:i=.4,limit:r=20}=n,o=jL(e,t,{semantic:n.semantic!==!1});if(!o)return[];if(!ue(o.symbol))return[];if(o.callees.size===0)return Hp(e,t,{minSimilarity:i,limit:r,scanLimit:n.scanLimit,candidateMode:n.sourceCandidateMode??"full"});let s=TL(e,o,i,{scanLimit:n.scanLimit,semantic:n.semantic!==!1});return s.length>0?s.slice(0,r):Hp(e,t,{minSimilarity:i,limit:r,scanLimit:n.scanLimit,candidateMode:n.sourceCandidateMode??"full"})}function TL(e,t,n,i){let r=Pr(e,{minCallees:3,scanLimit:i.scanLimit,semantic:i.semantic}),o=UL(t,r),s=FL(t,r),a=Pi(s),c=Ni(t.callees,s),l=[];for(let u of o){if(u.callees.size<3)continue;let d=Ni(u.callees,s),m=Up(t,u,s,{minSimilarity:n,requireSignificantShared:1,requireSharedCount:0,medianIdf:a,magnitudeA:c,magnitudeB:d});m&&l.push(m)}return l.sort((u,d)=>d.similarity-u.similarity),l}function FL(e,t){let n=new Map(t.docFreq);for(let i of e.callees)n.set(i,(n.get(i)??0)+1);return Lc(n,t.corpus.length+1)}function Up(e,t,n,i){let r=AL(e,t,n,i);if(!$L(r,i))return null;let{similarity:o,significantShared:s,trivialShared:a}=r,c=s.length>0?s:a,l=zp(c,"callees");return{symbolA:e.symbol,shortNameA:v(e.symbol),fileA:e.file,symbolB:t.symbol,shortNameB:v(t.symbol),fileB:t.file,similarity:o,similarityBasis:"callees",sharedCallees:c.map(v),uniqueToA:[...Le(e.callees,t.callees)].map(v),uniqueToB:[...Le(t.callees,e.callees)].map(v),...l}}function _L(e,t,n,i){let r=i.magnitudeA??Ni(e.callees,n),o=i.magnitudeB??Ni(t.callees,n),s=0,a=0,c=0,l=i.medianIdf??Pi(n);for(let m of e.callees){if(!t.callees.has(m))continue;let p=n.get(m)??0;s+=p*p,c+=1,p>=l&&(a+=1)}if(c===0)return!1;let u=r*o;return(u>0?s/u:0)<i.minSimilarity?!1:a>=i.requireSignificantShared||c>=i.requireSharedCount}function AL(e,t,n,i){return i.magnitudeA===void 0||i.magnitudeB===void 0?jp(e.callees,t.callees,n,{medianIdf:i.medianIdf}):Bp(e.callees,t.callees,n,{medianIdf:i.medianIdf,magnitudeA:i.magnitudeA,magnitudeB:i.magnitudeB})}function $L(e,t){if(e.similarity<t.minSimilarity)return!1;let n=e.significantShared.length+e.trivialShared.length;return e.significantShared.length>=t.requireSignificantShared||n>=t.requireSharedCount}function En(e,t={}){let{minSimilarity:n=.5,limit:i=20,scope:r,minCallees:o=4,crossFileOnly:s=!1,scanLimit:a}=t,c=t.semantic!==!1,l=se(),u=0,d=0,m=0,p=0,f=0,g=0,y=0;return T("similar.all",()=>{let S=Pr(e,{minCallees:o,scope:r,scanLimit:a,semantic:c}),R=S.corpus;u=R.length;let k=t.focusFiles,x=[],b=0;return T("similar.all.pair-scan",()=>{for(let C=0;C<R.length;C+=1){let D=R[C],w=k?.has(D.file)??!1,j=S.weightedMagnitudes[C],J=new Set;for(let Re of D.callees){let ie=S.candidateIndexesByCallee.get(Re);if(ie)for(let _e of ie)_e<=C||k&&!w&&!k.has(R[_e].file)||J.add(_e)}l&&(m+=J.size,J.size>0&&(d+=1));for(let Re of J){let ie=R[Re];if(s&&D.file===ie.file){l&&(f+=1);continue}if(Wp(D,ie)){l&&(g+=1);continue}l&&(p+=1);let _e=Up(D,ie,S.idfWeights,{minSimilarity:n,requireSignificantShared:2,requireSharedCount:4,medianIdf:S.medianIdf,magnitudeA:j,magnitudeB:S.weightedMagnitudes[Re]});_e&&(ML(x,_e,i,b),l&&(y+=1),b+=1)}}},()=>({corpusSize:u,candidateSets:d,candidatePairs:m,comparedPairs:p,crossFileSkips:f,signatureSkips:g,insertedResults:y,topResults:x.length})),T("similar.all.sort-project",()=>(x.sort((C,D)=>D.result.similarity-C.result.similarity||C.order-D.order),x.map(C=>C.result)),()=>({topResults:x.length}))},()=>({minSimilarity:n,limit:i,scope:r,minCallees:o,crossFileOnly:s,scanLimit:a,semantic:c,corpusSize:u,candidateSets:d,candidatePairs:m,comparedPairs:p,crossFileSkips:f,signatureSkips:g,insertedResults:y}))}function Ec(e,t={}){let{minSimilarity:n=.5,scope:i,minCallees:r=4,crossFileOnly:o=!1,scanLimit:s}=t,a=t.semantic!==!1,c=se(),l=0,u=0,d=0,m=0,p=0,f=0,g=0;return T("similar.all-count",()=>{let y=Pr(e,{minCallees:r,scope:i,scanLimit:s,semantic:a}),S=y.corpus;l=S.length;let R=t.focusFiles;return T("similar.all-count.pair-scan",()=>{for(let k=0;k<S.length;k+=1){let x=S[k],b=R?.has(x.file)??!1,C=y.weightedMagnitudes[k],D=new Set;for(let w of x.callees){let j=y.candidateIndexesByCallee.get(w);if(j)for(let J of j)J<=k||R&&!b&&!R.has(S[J].file)||D.add(J)}c&&(d+=D.size,D.size>0&&(u+=1));for(let w of D){let j=S[w];if(o&&x.file===j.file){c&&(p+=1);continue}if(Wp(x,j)){c&&(f+=1);continue}c&&(m+=1),_L(x,j,y.idfWeights,{minSimilarity:n,requireSignificantShared:2,requireSharedCount:4,medianIdf:y.medianIdf,magnitudeA:C,magnitudeB:y.weightedMagnitudes[w]})&&(g+=1)}}},()=>({corpusSize:l,candidateSets:u,candidatePairs:d,comparedPairs:m,crossFileSkips:p,signatureSkips:f,insertedResults:g})),g},()=>({minSimilarity:n,scope:i,minCallees:r,crossFileOnly:o,scanLimit:s,semantic:a,corpusSize:l,candidateSets:u,candidatePairs:d,comparedPairs:m,crossFileSkips:p,signatureSkips:f,insertedResults:g}))}function Wp(e,t){if(e.paramCount<0||t.paramCount<0)return!1;let n=Math.abs(e.paramCount-t.paramCount),i=Math.max(2,Math.ceil(Math.max(e.paramCount,t.paramCount)*.5));return n>i}function ML(e,t,n,i){if(n<=0)return;if(e.length<n){e.push({result:t,order:i});return}let r=0;for(let s=1;s<e.length;s+=1){let a=e[s],c=e[r];(a.result.similarity<c.result.similarity||a.result.similarity===c.result.similarity&&a.order>c.order)&&(r=s)}let o=e[r];t.similarity<=o.result.similarity||(e[r]={result:t,order:i})}var OL=["ScipDatabase#all","ScipDatabase#get","ScipDatabase#prepare","ScipDatabase#pathExclusionsFor","ScipDatabase#isIgnored","ScipDatabase#symbolNoiseFor","PerDbValue#get","PerDbValue#has",":storage:db:ScipDatabase:all",":storage:db:ScipDatabase:get",":storage:db:ScipDatabase:prepare",":storage:db:ScipDatabase:pathExclusionsFor",":storage:db:ScipDatabase:isIgnored",":storage:db:ScipDatabase:symbolNoiseFor",":storage:per-db-cache:PerDbValue:get",":storage:per-db-cache:PerDbValue:has"];function jL(e,t,n){let i=V(e,t);if(!i||!ue(i.symbol))return null;let r=new A(e),o=Ge(e,i,{semantic:n.semantic});return{symbol:i.symbol,file:i.relativePath,callees:rs(o.map(s=>s.symbol)),paramCount:r.callableSignature(i)?.paramCount??-1}}var BL=re("callee-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]}),HL=re("callee-fingerprint-index",{clearGroups:["whole-project","definition-catalog"]});function VL(e,t){let{minCallees:n,scope:i,excludeSymbol:r,scanLimit:o}=t,s=t.semantic!==!1,a=BL.get(e,()=>new Map),c=`${n}|${i??""}|${o??""}|${s}`,l=!0,u=0,d=0;return T("similar.callee-fingerprints.resolve",()=>{let m=a.get(c);if(l=m!==void 0,m||(m=WL(e,{minCallees:n,scope:i,scanLimit:o,semantic:s}),a.set(c,m)),u=m.length,r===void 0)return m;let p=m.filter(f=>f.symbol!==r);return d=m.length-p.length,p},()=>({minCallees:n,scope:i,scanLimit:o,semantic:s,cacheHit:l,corpusSize:u,excludeSymbol:r!==void 0,excludedSymbols:d}))}function Pr(e,t){let{minCallees:n,scope:i,scanLimit:r}=t,o=t.semantic!==!1,s=HL.get(e,()=>new Map),a=`${n}|${i??""}|${r??""}|${o}`,c=!0,l=0,u=0,d=0;return T("similar.callee-index.resolve",()=>{let m=s.get(a);return c=m!==void 0,m||(m=qL(VL(e,{minCallees:n,scope:i,scanLimit:r,semantic:o})),s.set(a,m)),l=m.corpus.length,u=m.docFreq.size,d=m.candidateIndexesByCallee.size,m},()=>({minCallees:n,scope:i,scanLimit:r,semantic:o,cacheHit:c,corpusSize:l,indexedCallees:u,candidateBuckets:d}))}function qL(e){let t=se(),n=0,i=T("similar.callee-index.doc-frequency",()=>{let m=new Map;for(let p of e)for(let f of p.callees)m.set(f,(m.get(f)??0)+1);return n=m.size,m},()=>({corpusSize:e.length,uniqueCallees:n})),r=Math.max(8,Math.ceil(Math.sqrt(e.length))),o=T("similar.callee-index.idf-weights",()=>Lc(i,e.length),()=>({corpusSize:e.length,uniqueCallees:i.size})),s=T("similar.callee-index.weighted-magnitudes",()=>e.map(m=>Ni(m.callees,o)),()=>({corpusSize:e.length})),a=0,c=0,l=0,u=T("similar.callee-index.candidate-buckets",()=>{let m=new Map;for(let p=0;p<e.length;p+=1){let f=e[p];for(let g of f.callees){if((i.get(g)??0)>r){t&&(c+=1);continue}let y=m.get(g);y||(y=[],m.set(g,y)),y.push(p),t&&(a+=1)}}return t&&(l=m.size),m},()=>({corpusSize:e.length,buckets:l,candidateRefs:a,ubiquitousSkips:c,ubiquityThreshold:r})),d=T("similar.callee-index.median-idf",()=>Pi(o),()=>({uniqueCallees:o.size}));return{corpus:e,candidateIndexesByCallee:u,docFreq:i,idfWeights:o,weightedMagnitudes:s,medianIdf:d,ubiquityThreshold:r}}function UL(e,t){let n=new Map;for(let i of e.callees)for(let r of t.candidateIndexesByCallee.get(i)??[]){let o=t.corpus[r];o.symbol!==e.symbol&&n.set(o.symbol,o)}return n.size>0?[...n.values()]:t.corpus.filter(i=>i.symbol!==e.symbol)}function WL(e,t){let{minCallees:n,scope:i,scanLimit:r,semantic:o}=t,s=se(),a=new A(e),c=0,l=T("similar.callee-fingerprints.candidates",()=>{let f=qe(a.productionCallableDefinitions({scope:i,minLoc:5,sortByLocDesc:typeof r=="number"&&r>0}),r);return c=f.length,f},()=>({scope:i,scanLimit:r,candidateCount:c})),u=0,d=T("similar.callee-fingerprints.callee-map",()=>{let f=a.calleeMap(l,{semantic:o});if(s)for(let g of f.values())u+=g.length;return f},()=>({candidateCount:c,semantic:o,calleeEdges:u})),m=0,p=0;return T("similar.callee-fingerprints.shape",()=>{let f=l.map(g=>({symbol:g.symbol,file:g.relativePath,callees:rs((d.get(g.symbolId)??[]).map(y=>y.symbol)),paramCount:a.callableSignature(g)?.paramCount??-1})).filter(g=>g.callees.size>=n);return m=f.length,s&&(p=f.reduce((g,y)=>g+y.callees.size,0)),f},()=>({candidateCount:c,fingerprintCount:m,retainedCalleeCount:p,minCallees:n}))}function rs(e){return new Set([...e].filter(t=>!zL(t)))}function zL(e){return OL.some(t=>e.includes(t))}function Hp(e,t,n){let i=QL(e,t);if(!i||i.tokens.size<3)return[];let r=n.minSimilarity>=.5?n.minSimilarity:.3,o=[],s=n.candidateMode??"full",a=0,c=0,l=0,u=0;return T("similar.source-shape",()=>{let d=s==="target-pruned"?rD(e,i,{minSimilarity:r,scanLimit:n.scanLimit}):iD(i,tD(e,{scanLimit:n.scanLimit}));a=d.length;for(let m of d){if(m.symbol===i.symbol||m.tokens.size<3)continue;c+=1;let p=nt(i.tokens,m.tokens);if(p.size<2){l+=1;continue}let f=new Set([...i.tokens,...m.tokens]),g=f.size>0?p.size/f.size:0;if(g<r){u+=1;continue}o.push({symbolA:i.symbol,shortNameA:v(i.symbol),fileA:i.file,symbolB:m.symbol,shortNameB:v(m.symbol),fileB:m.file,similarity:g,similarityBasis:"source-tokens",sharedCallees:[...p].sort(),uniqueToA:[...Le(i.tokens,m.tokens)].sort(),uniqueToB:[...Le(m.tokens,i.tokens)].sort(),...zp([...p],"source-tokens")})}return o.sort((m,p)=>p.similarity-m.similarity||m.shortNameB.localeCompare(p.shortNameB)),o.slice(0,n.limit)},()=>({symbol:i.symbol,file:i.file,targetTokens:i.tokens.size,candidateMode:s,candidates:a,comparedPairs:c,sharedSkips:l,similaritySkips:u,results:o.length}))}function zp(e,t){let n=e.flatMap(Pc),i=e.flatMap(y=>Vp(y,t)),r=Dc(n,Gp),o=Dc(n,Jp),s=Dc(i,Nc),a=[...new Set(i.filter(qp))],c=e.filter(y=>{let S=Vp(y,t);return S.some(R=>Nc.has(R))&&S.some(qp)}).length,l=[];r.length>0&&l.push(`access/query scaffolding: ${r.slice(0,5).join(", ")}`),o.length>0&&l.push(`framework/generic scaffolding: ${o.slice(0,5).join(", ")}`),s.length>0&&l.push(`domain behavior verbs: ${s.slice(0,5).join(", ")}`),s.length>0&&a.length>0&&l.push(`domain-specific terms: ${a.slice(0,5).join(", ")}`);let u=t==="source-tokens"&&n.length>0&&n.every(y=>Kp.has(y));u&&l.push("shared source tokens are generic scaffolding");let d=s.length>0&&a.length>0,m=r.length+o.length>0,p=t==="callees"&&d&&e.length>=4&&a.length>=4&&c>=2,f=p?"domain-behavior":d?m?"mixed":"domain-behavior":r.length>0?"access-query-scaffolding":o.length>0||u?"framework-scaffolding":"structural-overlap";f==="structural-overlap"&&e.length>0&&l.push(`shared ${t} overlap has no recognized domain or scaffolding category`);let g=f==="domain-behavior"&&(e.length>=3||p)?"direct":"signal";return{evidenceClass:f,actionTier:g,evidenceClassReasons:l,recommendation:GL(f,g)}}function GL(e,t){return t==="direct"?"Shared domain behavior looks concrete; review for an extract/reuse opportunity.":e==="mixed"?"Shared evidence mixes domain behavior with scaffolding; review semantics before extracting anything.":e==="access-query-scaffolding"?"Shared evidence is mostly access/query scaffolding; compare product semantics before reusing code.":e==="structural-overlap"?"Shared structure has no domain or scaffolding classification; inspect names and behavior before reusing code.":"Shared evidence is mostly framework or generic scaffolding; treat as a contextual signal."}function Dc(e,t){return[...new Set(e.filter(n=>t.has(n)))]}function Pc(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>1)}function Vp(e,t){if(t==="source-tokens")return Pc(e);let n=M(e);return Pc(n.length>0?n:JL(e))}function JL(e){return e.replace(/[()`]/g," ").replace(/\.[a-z][a-z0-9]+(?=\s|$)/gi," ").split(/[:/\\\s]+/).map(i=>i.trim()).filter(i=>/[A-Za-z]/.test(i)).at(-1)?.replace(/\.$/,"")??e}function qp(e){return e.length>3&&!Nc.has(e)&&!Gp.has(e)&&!Jp.has(e)&&!Kp.has(e)&&!KL.has(e)}var Nc=new Set(["archive","assign","book","cancel","create","delete","ensure","export","import","notify","persist","publish","restore","schedule","send","set","submit","sync","update","upload","validate","write"]),Gp=new Set(["access","auth","authorize","cache","context","db","find","get","guard","list","permission","permissions","prisma","query","request","response","role","route","session","sql","where"]),Jp=new Set(["bytes","computed","crypto","describe","effect","expect","fetch","filter","hex","hook","json","map","mounted","on","promise","random","react","reduce","ref","render","state","test","token","trim","uuid","vue","watch"]),Kp=new Set(["bytes","crypto","data","false","get","hex","id","key","map","name","num","random","result","secret","set","string","to","token","true","type","value"]),KL=new Set(["best","backend","conflict","database","effect","effects","error","errors","frontend","found","helpers","javascript","module","modules","scip","shared","source","typescript","utils","with","workflow","workflows"]);function QL(e,t){let n=V(e,t);if(!n||!ue(n.symbol))return null;let i=XL(e,n);return i?{symbol:n.symbol,file:n.relativePath,tokens:i}:null}function XL(e,t){let n=M(t.symbol),i=lD(e,t.relativePath,t.startLine,t.endLine,n),r=Zp(i,n);return r.size>0?r:null}var YL=re("source-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]}),ZL=re("source-fingerprint-index",{clearGroups:["whole-project","definition-catalog"]});function Qp(e){return`${e.scanLimit??""}`}function eD(e,t={}){let n=YL.get(e,()=>new Map),i=Qp(t),r=n.get(i);return r||(r=cD(e,t),n.set(i,r)),r}function tD(e,t={}){let n=ZL.get(e,()=>new Map),i=Qp(t),r=n.get(i);return r||(r=nD(eD(e,t)),n.set(i,r)),r}function nD(e){let t=new Map;for(let r of e)for(let o of r.tokens)t.set(o,(t.get(o)??0)+1);let n=Math.max(8,Math.ceil(Math.sqrt(e.length))),i=new Map;for(let r of e)for(let o of r.tokens){if((t.get(o)??0)>n)continue;let s=i.get(o);s||(s=[],i.set(o,s)),s.push(r)}return{corpus:e,candidateByToken:i,docFreq:t,ubiquityThreshold:n}}function iD(e,t){let n=new Map;for(let i of e.tokens)for(let r of t.candidateByToken.get(i)??[])r.symbol!==e.symbol&&n.set(r.symbol,r);return n.size>0?[...n.values()]:t.corpus.filter(i=>i.symbol!==e.symbol)}function rD(e,t,n){let i=se(),r=new A(e),o=oD(t.tokens.size,n.minSimilarity),s=0,a=0,c=0,l=T("similar.source-shape.target-files",()=>{let f=[...t.tokens],g=[];for(let y of B(e,{includeIgnored:!1})){s+=1;let S=F(e,y);S&&(a+=1,sD(S,f,o)&&g.push(y))}return c=g.length,g},()=>({symbol:t.symbol,targetTokens:t.tokens.size,requiredSharedTokens:o,scannedFiles:s,readableFiles:a,candidateFiles:c})),u=0,d=T("similar.source-shape.target-definitions",()=>{let f=qe(r.productionCallableDefinitions({files:l,sortByLocDesc:typeof n.scanLimit=="number"&&n.scanLimit>0}),n.scanLimit);return u=f.length,f},()=>({symbol:t.symbol,candidateFiles:c,scanLimit:n.scanLimit,definitionCount:u})),m=0;return T("similar.source-shape.target-fingerprints",()=>{let f=Xp(e,d);return i&&(m=f.length),f},()=>({symbol:t.symbol,definitionCount:u,fingerprintCount:m})).filter(f=>f.symbol!==t.symbol)}function oD(e,t){return Math.max(2,Math.ceil(e*t))}function sD(e,t,n){if(t.length<n)return!1;let i=e.toLowerCase(),r=0;for(let o of t)if(aD(i,o)&&(r+=1,r>=n))return!0;return!1}function aD(e,t){return t==="num"?/\b\d+\b/.test(e):e.includes(t)}function cD(e,t={}){let n=new A(e),{scanLimit:i}=t,r=qe(n.productionCallableDefinitions({sortByLocDesc:typeof i=="number"&&i>0}),i);return Xp(e,r)}function Xp(e,t){let n=new Map;for(let r of t){let o=n.get(r.relativePath)??[];o.push(r),n.set(r.relativePath,o)}let i=new Map;for(let[r,o]of n){let s=F(e,r);if(!s)continue;let a=Z(e,r,s),c=dD(e,r,a),l=!1,u=null;for(let d of o){let m=uD(d),p=c.get(m),f=p?new Set(p.tokens):null;f||(u??=Ke(e,r),f=Zp(Yp(u,d.startLine,d.endLine,d.leaf),d.leaf),c.set(m,{key:m,symbol:d.symbol,startLine:d.startLine,endLine:d.endLine,leaf:d.leaf,tokens:[...f].sort()}),l=!0),f.size>0&&i.set(d.symbol,{symbol:d.symbol,file:d.relativePath,tokens:f})}l&&mD(e,r,a,c)}return t.map(r=>i.get(r.symbol)).filter(r=>!!r)}function lD(e,t,n,i,r){let o=Ke(e,t);return o.length===0?"":Yp(o,n,i,r)}function Yp(e,t,n,i){if(n>=t&&n-t<=12)return e.slice(t,n+1).join(`
|
|
543
|
-
`);let r=[new RegExp(`\\bdef\\s+${
|
|
561
|
+
ORDER BY d.relative_path, der.start_line, der.end_line, gs.symbol`,...i))}return n}function Uf(e){let t=[];for(let n=0;n<e.length;n+=qf)t.push(e.slice(n,n+qf));return t}function YD(e){return{symbol:e.symbol,kind:e.kind,documentation:e.documentation,enclosing_symbol:e.enclosingSymbol,relative_path:e.relativePath,start_line:e.startLine,end_line:e.endLine}}function zf(e){return e.kind!==null&&e.kind!==0?ZD(e.kind,e.symbol,e.documentation):eE(e.symbol,e.documentation,e.enclosing_symbol)}function ZD(e,t,n){let i=(n??"").toLowerCase();if(se(t)==="type"){if(i.includes("type "))return Le.TypeAlias;if(i.includes("interface "))return Le.Interface;if(i.includes("struct "))return Le.Struct;if(i.includes("trait "))return Le.Trait;if(i.includes("class "))return Le.Class}return e}function eE(e,t,n){let i=Ie(e);if("kind"in i)return null;let r=i.descriptors,o=r[r.length-2]??null,s=se(e),a=(t??"").toLowerCase();return s==="type"?a.includes("type ")?Le.TypeAlias:a.includes("interface ")?Le.Interface:a.includes("struct ")?Le.Struct:a.includes("trait ")?Le.Trait:a.includes("class ")?Le.Class:Le.Class:s==="method"?o?.suffix==="type"?Le.Method:Le.Function:s==="namespace"?Le.Module:s!=="term"?null:a.includes("async def ")||a.includes("def ")?Le.Function:(n?se(n):o?.suffix??null)==="type"?Le.Field:Le.Variable}function sl(e,t={}){let{limit:n=10,scope:i,minDepth:r=3}=t,o=ye(e,i),s=new Map,a=[],c=new Map,l=new Map,d=new Set,u=[],m=0;for(let y of o.keys()){if(c.has(y))continue;let w=[],L=(o.get(y)??new Set).values();for(c.set(y,m),l.set(y,m),m+=1,u.push(y),d.add(y),w.push({node:y,iter:L,pendingChild:null});w.length>0;){let k=w[w.length-1];if(k.pendingChild!==null){let Y=k.pendingChild;k.pendingChild=null,l.set(k.node,Math.min(l.get(k.node),l.get(Y)))}let T=k.iter.next();if(T.done){if(l.get(k.node)===c.get(k.node)){let Y=[];for(;;){let ee=u.pop();if(d.delete(ee),Y.push(ee),s.set(ee,a.length),ee===k.node)break}a.push(Y)}w.pop();continue}let U=T.value;if(c.has(U))d.has(U)&&l.set(k.node,Math.min(l.get(k.node),c.get(U)));else{c.set(U,m),l.set(U,m),m+=1,u.push(U),d.add(U);let Y=(o.get(U)??new Set).values();k.pendingChild=U,w.push({node:U,iter:Y,pendingChild:null})}}}let p=new Map,f=new Array(a.length);for(let y=0;y<a.length;y++)f[y]=a[y].length,p.set(y,new Set);for(let[y,w]of o){let L=s.get(y);for(let k of w){let T=s.get(k);T!==L&&p.get(L).add(T)}}let g=new Array(a.length),b=new Array(a.length);for(let y=0;y<a.length;y++){let w=[],L=0;for(let k of p.get(y)){let T=b[k];T>L&&(L=T,w=g[k])}g[y]=[y,...w],b[y]=f[y]+L}function x(y){return g[y]}let S=a.map(y=>[...y].sort()),R=new Set,C=[];for(let y=0;y<a.length;y++){let w=x(y),L=[];for(let T of w)L.push(...S[T]);if(L.length<r)continue;let k=L.join(" ");R.has(k)||(R.add(k),C.push(tE(L)))}return C.sort((y,w)=>w.depth-y.depth),nE(C).slice(0,n)}function tE(e){return{chain:e,depth:e.length,actionTier:"signal",chainKind:"transitive-dependency-depth",evidenceReasons:[`${e.length} file(s) form the representative transitive dependency path`,"cycles are condensed before longest-path calculation"],recommendation:"Review whether the chain crosses ownership or layer boundaries; shorten it only when the dependency direction is accidental."}}function nE(e){let t=[];for(let n of e)t.some(i=>iE(n.chain,i.chain))||t.push(n);return t}function iE(e,t){if(e.length>=t.length)return!1;let n=t.length-e.length;for(let i=0;i<e.length;i++)if(e[i]!==t[n+i])return!1;return!0}function al(e,t){let n=q(e,t);if(!n)return[];let i=e.get(`SELECT symbol, enclosing_symbol FROM global_symbols
|
|
562
|
+
WHERE id = ? LIMIT 1`,n.symbolId);if(!i)return[];let r=[{symbol:i.symbol,shortName:v(i.symbol),depth:0}],o=i.enclosing_symbol,s=1,a=new Set([i.symbol]);for(;o&&!a.has(o)&&s<20;){a.add(o);let u=e.get("SELECT symbol, enclosing_symbol FROM global_symbols WHERE symbol = ?",o);if(!u)break;r.push({symbol:u.symbol,shortName:v(u.symbol),depth:s}),o=u.enclosing_symbol,s++}if(r.length>1)return r;let c=Ie(i.symbol);if("kind"in c)return r;let l=c.descriptors;if(l.length<=1)return r;let d=[r[0]];for(let u=l.length-2,m=1;u>=0;u--,m++){let f=l.slice(0,u+1).map(g=>g.suffix==="method"?`${g.name}()`:g.name.replace(/\.(ts|tsx|js|jsx|mjs|cjs|py|pyi|rs|java|scala|kt|kts|rb|go|cs|vb|dart|php|c|cc|cpp|cxx|h|hpp)$/,"")).join(":");d.push({symbol:f,shortName:f,depth:m})}return d}function Br(e,t,n={}){let i=q(e,t);if(!i)return null;let r=n.semantic!==!1,o=at(e,i,{limit:50,semantic:r}),s=Oi(Je(e,i,{limit:50,additive:!0,callableOnly:!0,semantic:r}));return{symbol:i.symbol,shortName:v(i.symbol),callers:o.map(a=>({symbol:a.symbol,shortName:v(a.symbol),file:a.file})),callees:s.map(a=>({symbol:a.symbol,shortName:v(a.symbol),file:a.file}))}}function ct(e,t){let n=new Set;for(let i of e)t.has(i)&&n.add(i);return n}function De(e,t){let n=new Set;for(let i of e)t.has(i)||n.add(i);return n}function bn(e,t){if(e.size===0&&t.size===0)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);let i=e.size+t.size-n;return i===0?0:n/i}function Wf(e,t){if(e.size===0)return 0;let n=0;for(let i of e)t.has(i)&&(n+=1);return n/e.size}function cl(e,t){if(t<=0)return new Map;let n=new Map;for(let[i,r]of e)r>0&&n.set(i,Math.log(t/r));return n}function Bi(e){let t=[...e.values()].sort((i,r)=>i-r);if(t.length===0)return 0;let n=Math.floor(t.length/2);return t.length%2===0?(t[n-1]+t[n])/2:t[n]}function Hi(e,t){let n=0;for(let i of e){let r=t.get(i)??0;n+=r*r}return Math.sqrt(n)}function Gf(e,t,n,i={}){let r=0,o=0,s=0,a=i.medianIdf??Bi(n),c=[],l=[];for(let m of e){let p=n.get(m)??0;o+=p*p,t.has(m)&&(r+=p*p,p>=a?c.push(m):l.push(m))}if(c.length===0&&l.length===0)return{similarity:0,significantShared:[],trivialShared:[]};for(let m of t){let p=n.get(m)??0;s+=p*p}let d=Math.sqrt(o)*Math.sqrt(s),u=d>0?r/d:0;return c.sort((m,p)=>(n.get(p)??0)-(n.get(m)??0)),{similarity:u,significantShared:c,trivialShared:l}}function Kf(e,t,n,i){let r=0,o=i.medianIdf??Bi(n),s=[],a=[];for(let d of e){if(!t.has(d))continue;let u=n.get(d)??0;r+=u*u,u>=o?s.push(d):a.push(d)}if(s.length===0&&a.length===0)return{similarity:0,significantShared:[],trivialShared:[]};let c=i.magnitudeA*i.magnitudeB,l=c>0?r/c:0;return s.sort((d,u)=>(n.get(u)??0)-(n.get(d)??0)),{similarity:l,significantShared:s,trivialShared:a}}function Vr(e,t,n={}){let{minSimilarity:i=.4,limit:r=20}=n,o=dE(e,t,{semantic:n.semantic!==!1});if(!o)return[];if(!de(o.symbol))return[];if(o.callees.size===0)return Jf(e,t,{minSimilarity:i,limit:r,scanLimit:n.scanLimit,candidateMode:n.sourceCandidateMode??"full"});let s=rE(e,o,i,{scanLimit:n.scanLimit,semantic:n.semantic!==!1});return s.length>0?s.slice(0,r):Jf(e,t,{minSimilarity:i,limit:r,scanLimit:n.scanLimit,candidateMode:n.sourceCandidateMode??"full"})}function rE(e,t,n,i){let r=Vi(e).calleeIndex({minCallees:3,scanLimit:i.scanLimit,semantic:i.semantic}),o=hE(t,r),s=oE(t,r),a=Bi(s),c=Hi(t.callees,s),l=[];for(let d of o){if(d.callees.size<3)continue;let u=Hi(d.callees,s),m=Zf(t,d,s,{minSimilarity:n,requireSignificantShared:1,requireSharedCount:0,medianIdf:a,magnitudeA:c,magnitudeB:u});m&&l.push(m)}return l.sort((d,u)=>u.similarity-d.similarity),l}function oE(e,t){let n=new Map(t.docFreq);for(let i of e.callees)n.set(i,(n.get(i)??0)+1);return cl(n,t.corpus.length+1)}function Zf(e,t,n,i){let r=aE(e,t,n,i);if(!cE(r,i))return null;let{similarity:o,significantShared:s,trivialShared:a}=r,c=s.length>0?s:a,l=ig(c,"callees");return{symbolA:e.symbol,shortNameA:v(e.symbol),fileA:e.file,symbolB:t.symbol,shortNameB:v(t.symbol),fileB:t.file,similarity:o,similarityBasis:"callees",sharedCallees:c.map(v),uniqueToA:[...De(e.callees,t.callees)].map(v),uniqueToB:[...De(t.callees,e.callees)].map(v),...l}}function sE(e,t,n,i){let r=i.magnitudeA??Hi(e.callees,n),o=i.magnitudeB??Hi(t.callees,n),s=0,a=0,c=0,l=i.medianIdf??Bi(n);for(let m of e.callees){if(!t.callees.has(m))continue;let p=n.get(m)??0;s+=p*p,c+=1,p>=l&&(a+=1)}if(c===0)return!1;let d=r*o;return(d>0?s/d:0)<i.minSimilarity?!1:a>=i.requireSignificantShared||c>=i.requireSharedCount}function aE(e,t,n,i){return i.magnitudeA===void 0||i.magnitudeB===void 0?Gf(e.callees,t.callees,n,{medianIdf:i.medianIdf}):Kf(e.callees,t.callees,n,{medianIdf:i.medianIdf,magnitudeA:i.magnitudeA,magnitudeB:i.magnitudeB})}function cE(e,t){if(e.similarity<t.minSimilarity)return!1;let n=e.significantShared.length+e.trivialShared.length;return e.significantShared.length>=t.requireSignificantShared||n>=t.requireSharedCount}function Wn(e,t={}){let{minSimilarity:n=.5,limit:i=20,scope:r,minCallees:o=4,crossFileOnly:s=!1,scanLimit:a}=t,c=t.semantic!==!1,l=me(),d=0,u=0,m=0,p=0,f=0,g=0,b=0;return D("similar.all",()=>{let S=Vi(e).calleeIndex({minCallees:o,scope:r,scanLimit:a,semantic:c}),R=S.corpus;d=R.length;let C=t.focusFiles,y=[],w=0;return D("similar.all.pair-scan",()=>{for(let L=0;L<R.length;L+=1){let k=R[L],T=C?.has(k.file)??!1,U=S.weightedMagnitudes[L],Y=new Set;for(let ee of k.callees){let we=S.candidateIndexesByCallee.get(ee);if(we)for(let te of we)te<=L||C&&!T&&!C.has(R[te].file)||Y.add(te)}l&&(m+=Y.size,Y.size>0&&(u+=1));for(let ee of Y){let we=R[ee];if(s&&k.file===we.file){l&&(f+=1);continue}if(eg(k,we)){l&&(g+=1);continue}l&&(p+=1);let te=Zf(k,we,S.idfWeights,{minSimilarity:n,requireSignificantShared:2,requireSharedCount:4,medianIdf:S.medianIdf,magnitudeA:U,magnitudeB:S.weightedMagnitudes[ee]});te&&(lE(y,te,i,w),l&&(b+=1),w+=1)}}},()=>({corpusSize:d,candidateSets:u,candidatePairs:m,comparedPairs:p,crossFileSkips:f,signatureSkips:g,insertedResults:b,topResults:y.length})),D("similar.all.sort-project",()=>(y.sort((L,k)=>k.result.similarity-L.result.similarity||L.order-k.order),y.map(L=>L.result)),()=>({topResults:y.length}))},()=>({minSimilarity:n,limit:i,scope:r,minCallees:o,crossFileOnly:s,scanLimit:a,semantic:c,corpusSize:d,candidateSets:u,candidatePairs:m,comparedPairs:p,crossFileSkips:f,signatureSkips:g,insertedResults:b}))}function ml(e,t={}){let{minSimilarity:n=.5,scope:i,minCallees:r=4,crossFileOnly:o=!1,scanLimit:s}=t,a=t.semantic!==!1,c=me(),l=0,d=0,u=0,m=0,p=0,f=0,g=0;return D("similar.all-count",()=>{let x=Vi(e).calleeIndex({minCallees:r,scope:i,scanLimit:s,semantic:a}),S=x.corpus;l=S.length;let R=t.focusFiles;return D("similar.all-count.pair-scan",()=>{for(let C=0;C<S.length;C+=1){let y=S[C],w=R?.has(y.file)??!1,L=x.weightedMagnitudes[C],k=new Set;for(let T of y.callees){let U=x.candidateIndexesByCallee.get(T);if(U)for(let Y of U)Y<=C||R&&!w&&!R.has(S[Y].file)||k.add(Y)}c&&(u+=k.size,k.size>0&&(d+=1));for(let T of k){let U=S[T];if(o&&y.file===U.file){c&&(p+=1);continue}if(eg(y,U)){c&&(f+=1);continue}c&&(m+=1),sE(y,U,x.idfWeights,{minSimilarity:n,requireSignificantShared:2,requireSharedCount:4,medianIdf:x.medianIdf,magnitudeA:L,magnitudeB:x.weightedMagnitudes[T]})&&(g+=1)}}},()=>({corpusSize:l,candidateSets:d,candidatePairs:u,comparedPairs:m,crossFileSkips:p,signatureSkips:f,insertedResults:g})),g},()=>({minSimilarity:n,scope:i,minCallees:r,crossFileOnly:o,scanLimit:s,semantic:a,corpusSize:l,candidateSets:d,candidatePairs:u,comparedPairs:m,crossFileSkips:p,signatureSkips:f,insertedResults:g}))}function eg(e,t){if(e.paramCount<0||t.paramCount<0)return!1;let n=Math.abs(e.paramCount-t.paramCount),i=Math.max(2,Math.ceil(Math.max(e.paramCount,t.paramCount)*.5));return n>i}var tg=pe({kind:"source-fingerprints",serialize:$E,deserialize:ME});function lE(e,t,n,i){if(n<=0)return;if(e.length<n){e.push({result:t,order:i});return}let r=0;for(let s=1;s<e.length;s+=1){let a=e[s],c=e[r];(a.result.similarity<c.result.similarity||a.result.similarity===c.result.similarity&&a.order>c.order)&&(r=s)}let o=e[r];t.similarity<=o.result.similarity||(e[r]={result:t,order:i})}var uE=["ScipDatabase#all","ScipDatabase#get","ScipDatabase#prepare","ScipDatabase#pathExclusionsFor","ScipDatabase#isIgnored","ScipDatabase#symbolNoiseFor","PerDbValue#get","PerDbValue#has",":storage:db:ScipDatabase:all",":storage:db:ScipDatabase:get",":storage:db:ScipDatabase:prepare",":storage:db:ScipDatabase:pathExclusionsFor",":storage:db:ScipDatabase:isIgnored",":storage:db:ScipDatabase:symbolNoiseFor",":storage:per-db-cache:PerDbValue:get",":storage:per-db-cache:PerDbValue:has"];function dE(e,t,n){let i=q(e,t);if(!i||!de(i.symbol))return null;let r=new A(e),o=Je(e,i,{semantic:n.semantic});return{symbol:i.symbol,file:i.relativePath,callees:ws(o.map(s=>s.symbol)),paramCount:r.callableSignature(i)?.paramCount??-1}}var mE=ie("callee-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]}),pE=ie("callee-fingerprint-index",{clearGroups:["whole-project","definition-catalog"]});function ng(e,t){let{minCallees:n,scope:i,excludeSymbol:r,scanLimit:o}=t,s=t.semantic!==!1,a=mE.get(e,()=>new Map),c=`${n}|${i??""}|${o??""}|${s}`,l=!0,d=0,u=0;return D("similar.callee-fingerprints.resolve",()=>{let m=a.get(c);if(l=m!==void 0,m||(m=yE(e,{minCallees:n,scope:i,scanLimit:o,semantic:s}),a.set(c,m)),d=m.length,r===void 0)return m;let p=m.filter(f=>f.symbol!==r);return u=m.length-p.length,p},()=>({minCallees:n,scope:i,scanLimit:o,semantic:s,cacheHit:l,corpusSize:d,excludeSymbol:r!==void 0,excludedSymbols:u}))}function fE(e,t){let{minCallees:n,scope:i,scanLimit:r}=t,o=t.semantic!==!1,s=pE.get(e,()=>new Map),a=`${n}|${i??""}|${r??""}|${o}`,c=!0,l=0,d=0,u=0;return D("similar.callee-index.resolve",()=>{let m=s.get(a);return c=m!==void 0,m||(m=gE(ng(e,{minCallees:n,scope:i,scanLimit:r,semantic:o})),s.set(a,m)),l=m.corpus.length,d=m.docFreq.size,u=m.candidateIndexesByCallee.size,m},()=>({minCallees:n,scope:i,scanLimit:r,semantic:o,cacheHit:c,corpusSize:l,indexedCallees:d,candidateBuckets:u}))}function Vi(e){return{calleeCorpus:t=>ng(e,t),calleeIndex:t=>fE(e,t),sourceCorpus:(t={})=>cg(e,t),sourceIndex:(t={})=>Yf(e,t),sourceCandidates:(t,n)=>(n.candidateMode??"full")==="target-pruned"?LE(e,t,{minSimilarity:n.minSimilarity,scanLimit:n.scanLimit}):IE(t,Yf(e,{scanLimit:n.scanLimit}))}}function gE(e){let t=me(),n=0,i=D("similar.callee-index.doc-frequency",()=>{let m=new Map;for(let p of e)for(let f of p.callees)m.set(f,(m.get(f)??0)+1);return n=m.size,m},()=>({corpusSize:e.length,uniqueCallees:n})),r=Math.max(8,Math.ceil(Math.sqrt(e.length))),o=D("similar.callee-index.idf-weights",()=>cl(i,e.length),()=>({corpusSize:e.length,uniqueCallees:i.size})),s=D("similar.callee-index.weighted-magnitudes",()=>e.map(m=>Hi(m.callees,o)),()=>({corpusSize:e.length})),a=0,c=0,l=0,d=D("similar.callee-index.candidate-buckets",()=>{let m=new Map;for(let p=0;p<e.length;p+=1){let f=e[p];for(let g of f.callees){if((i.get(g)??0)>r){t&&(c+=1);continue}let b=m.get(g);b||(b=[],m.set(g,b)),b.push(p),t&&(a+=1)}}return t&&(l=m.size),m},()=>({corpusSize:e.length,buckets:l,candidateRefs:a,ubiquitousSkips:c,ubiquityThreshold:r})),u=D("similar.callee-index.median-idf",()=>Bi(o),()=>({uniqueCallees:o.size}));return{corpus:e,candidateIndexesByCallee:d,docFreq:i,idfWeights:o,weightedMagnitudes:s,medianIdf:u,ubiquityThreshold:r}}function hE(e,t){let n=new Map;for(let i of e.callees)for(let r of t.candidateIndexesByCallee.get(i)??[]){let o=t.corpus[r];o.symbol!==e.symbol&&n.set(o.symbol,o)}return n.size>0?[...n.values()]:t.corpus.filter(i=>i.symbol!==e.symbol)}function yE(e,t){let{minCallees:n,scope:i,scanLimit:r,semantic:o}=t,s=me(),a=new A(e),c=0,l=D("similar.callee-fingerprints.candidates",()=>{let f=qe(a.productionCallableDefinitions({scope:i,minLoc:5,sortByLocDesc:typeof r=="number"&&r>0}),r);return c=f.length,f},()=>({scope:i,scanLimit:r,candidateCount:c})),d=0,u=D("similar.callee-fingerprints.callee-map",()=>{let f=a.calleeMap(l,{semantic:o});if(s)for(let g of f.values())d+=g.length;return f},()=>({candidateCount:c,semantic:o,calleeEdges:d})),m=0,p=0;return D("similar.callee-fingerprints.shape",()=>{let f=l.map(g=>({symbol:g.symbol,file:g.relativePath,callees:ws((u.get(g.symbolId)??[]).map(b=>b.symbol)),paramCount:a.callableSignature(g)?.paramCount??-1})).filter(g=>g.callees.size>=n);return m=f.length,s&&(p=f.reduce((g,b)=>g+b.callees.size,0)),f},()=>({candidateCount:c,fingerprintCount:m,retainedCalleeCount:p,minCallees:n}))}function ws(e){return new Set([...e].filter(t=>!bE(t)))}function bE(e){return uE.some(t=>e.includes(t))}function Jf(e,t,n){let i=vE(e,t);if(!i||i.tokens.size<3)return[];let r=n.minSimilarity>=.5?n.minSimilarity:.3,o=[],s=n.candidateMode??"full",a=0,c=0,l=0,d=0;return D("similar.source-shape",()=>{let m=Vi(e).sourceCandidates(i,{minSimilarity:r,scanLimit:n.scanLimit,candidateMode:s});a=m.length;for(let p of m){if(p.symbol===i.symbol||p.tokens.size<3)continue;c+=1;let f=ct(i.tokens,p.tokens);if(f.size<2){l+=1;continue}let g=new Set([...i.tokens,...p.tokens]),b=g.size>0?f.size/g.size:0;if(b<r){d+=1;continue}o.push({symbolA:i.symbol,shortNameA:v(i.symbol),fileA:i.file,symbolB:p.symbol,shortNameB:v(p.symbol),fileB:p.file,similarity:b,similarityBasis:"source-tokens",sharedCallees:[...f].sort(),uniqueToA:[...De(i.tokens,p.tokens)].sort(),uniqueToB:[...De(p.tokens,i.tokens)].sort(),...ig([...f],"source-tokens")})}return o.sort((p,f)=>f.similarity-p.similarity||p.shortNameB.localeCompare(f.shortNameB)),o.slice(0,n.limit)},()=>({symbol:i.symbol,file:i.file,targetTokens:i.tokens.size,candidateMode:s,candidates:a,comparedPairs:c,sharedSkips:l,similaritySkips:d,results:o.length}))}function ig(e,t){let n=e.flatMap(ul),i=e.flatMap(b=>Xf(b,t)),r=ll(n,rg),o=ll(n,og),s=ll(i,dl),a=[...new Set(i.filter(Qf))],c=e.filter(b=>{let x=Xf(b,t);return x.some(S=>dl.has(S))&&x.some(Qf)}).length,l=[];r.length>0&&l.push(`access/query scaffolding: ${r.slice(0,5).join(", ")}`),o.length>0&&l.push(`framework/generic scaffolding: ${o.slice(0,5).join(", ")}`),s.length>0&&l.push(`domain behavior verbs: ${s.slice(0,5).join(", ")}`),s.length>0&&a.length>0&&l.push(`domain-specific terms: ${a.slice(0,5).join(", ")}`);let d=t==="source-tokens"&&n.length>0&&n.every(b=>sg.has(b));d&&l.push("shared source tokens are generic scaffolding");let u=s.length>0&&a.length>0,m=r.length+o.length>0,p=t==="callees"&&u&&e.length>=4&&a.length>=4&&c>=2,f=p?"domain-behavior":u?m?"mixed":"domain-behavior":r.length>0?"access-query-scaffolding":o.length>0||d?"framework-scaffolding":"structural-overlap";f==="structural-overlap"&&e.length>0&&l.push(`shared ${t} overlap has no recognized domain or scaffolding category`);let g=f==="domain-behavior"&&(e.length>=3||p)?"direct":"signal";return{evidenceClass:f,actionTier:g,evidenceClassReasons:l,recommendation:SE(f,g)}}function SE(e,t){return t==="direct"?"Shared domain behavior looks concrete; review for an extract/reuse opportunity.":e==="mixed"?"Shared evidence mixes domain behavior with scaffolding; review semantics before extracting anything.":e==="access-query-scaffolding"?"Shared evidence is mostly access/query scaffolding; compare product semantics before reusing code.":e==="structural-overlap"?"Shared structure has no domain or scaffolding classification; inspect names and behavior before reusing code.":"Shared evidence is mostly framework or generic scaffolding; treat as a contextual signal."}function ll(e,t){return[...new Set(e.filter(n=>t.has(n)))]}function ul(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>1)}function Xf(e,t){if(t==="source-tokens")return ul(e);let n=$(e);return ul(n.length>0?n:xE(e))}function xE(e){return e.replace(/[()`]/g," ").replace(/\.[a-z][a-z0-9]+(?=\s|$)/gi," ").split(/[:/\\\s]+/).map(i=>i.trim()).filter(i=>/[A-Za-z]/.test(i)).at(-1)?.replace(/\.$/,"")??e}function Qf(e){return e.length>3&&!dl.has(e)&&!rg.has(e)&&!og.has(e)&&!sg.has(e)&&!CE.has(e)}var dl=new Set(["archive","assign","book","cancel","create","delete","ensure","export","import","notify","persist","publish","restore","schedule","send","set","submit","sync","update","upload","validate","write"]),rg=new Set(["access","auth","authorize","cache","context","db","find","get","guard","list","permission","permissions","prisma","query","request","response","role","route","session","sql","where"]),og=new Set(["bytes","computed","crypto","describe","effect","expect","fetch","filter","hex","hook","json","map","mounted","on","promise","random","react","reduce","ref","render","state","test","token","trim","uuid","vue","watch"]),sg=new Set(["bytes","crypto","data","false","get","hex","id","key","map","name","num","random","result","secret","set","string","to","token","true","type","value"]),CE=new Set(["best","backend","conflict","database","effect","effects","error","errors","frontend","found","helpers","javascript","module","modules","scip","shared","source","typescript","utils","with","workflow","workflows"]);function vE(e,t){let n=q(e,t);if(!n||!de(n.symbol))return null;let i=RE(e,n);return i?{symbol:n.symbol,file:n.relativePath,tokens:i}:null}function RE(e,t){let n=$(t.symbol),i=TE(e,t.relativePath,t.startLine,t.endLine,n),r=dg(i,n);return r.size>0?r:null}var kE=ie("source-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]}),wE=ie("source-fingerprint-index",{clearGroups:["whole-project","definition-catalog"]});function ag(e){return`${e.scanLimit??""}`}function cg(e,t={}){let n=kE.get(e,()=>new Map),i=ag(t),r=n.get(i);return r||(r=FE(e,t),n.set(i,r)),r}function Yf(e,t={}){let n=wE.get(e,()=>new Map),i=ag(t),r=n.get(i);return r||(r=PE(cg(e,t)),n.set(i,r)),r}function PE(e){let t=new Map;for(let r of e)for(let o of r.tokens)t.set(o,(t.get(o)??0)+1);let n=Math.max(8,Math.ceil(Math.sqrt(e.length))),i=new Map;for(let r of e)for(let o of r.tokens){if((t.get(o)??0)>n)continue;let s=i.get(o);s||(s=[],i.set(o,s)),s.push(r)}return{corpus:e,candidateByToken:i,docFreq:t,ubiquityThreshold:n}}function IE(e,t){let n=new Map;for(let i of e.tokens)for(let r of t.candidateByToken.get(i)??[])r.symbol!==e.symbol&&n.set(r.symbol,r);return n.size>0?[...n.values()]:t.corpus.filter(i=>i.symbol!==e.symbol)}function LE(e,t,n){let i=me(),r=new A(e),o=DE(t.tokens.size,n.minSimilarity),s=0,a=0,c=0,l=D("similar.source-shape.target-files",()=>{let f=[...t.tokens],g=[];for(let b of O(e,{includeIgnored:!1})){s+=1;let x=M(e,b);x&&(a+=1,EE(x,f,o)&&g.push(b))}return c=g.length,g},()=>({symbol:t.symbol,targetTokens:t.tokens.size,requiredSharedTokens:o,scannedFiles:s,readableFiles:a,candidateFiles:c})),d=0,u=D("similar.source-shape.target-definitions",()=>{let f=qe(r.productionCallableDefinitions({files:l,sortByLocDesc:typeof n.scanLimit=="number"&&n.scanLimit>0}),n.scanLimit);return d=f.length,f},()=>({symbol:t.symbol,candidateFiles:c,scanLimit:n.scanLimit,definitionCount:d})),m=0;return D("similar.source-shape.target-fingerprints",()=>{let f=lg(e,u);return i&&(m=f.length),f},()=>({symbol:t.symbol,definitionCount:d,fingerprintCount:m})).filter(f=>f.symbol!==t.symbol)}function DE(e,t){return Math.max(2,Math.ceil(e*t))}function EE(e,t,n){if(t.length<n)return!1;let i=e.toLowerCase(),r=0;for(let o of t)if(NE(i,o)&&(r+=1,r>=n))return!0;return!1}function NE(e,t){return t==="num"?/\b\d+\b/.test(e):e.includes(t)}function FE(e,t={}){let n=new A(e),{scanLimit:i}=t,r=qe(n.productionCallableDefinitions({sortByLocDesc:typeof i=="number"&&i>0}),i);return lg(e,r)}function lg(e,t){let n=new Map;for(let r of t){let o=n.get(r.relativePath)??[];o.push(r),n.set(r.relativePath,o)}let i=new Map;for(let[r,o]of n){let s=M(e,r);if(!s)continue;let a=re(e,r,s),c=AE(e,r,a),l=!1,d=null;for(let u of o){let m=_E(u),p=c.get(m),f=p?new Set(p.tokens):null;f||(d??=Ye(e,r),f=dg(ug(d,u.startLine,u.endLine,u.leaf),u.leaf),c.set(m,{key:m,symbol:u.symbol,startLine:u.startLine,endLine:u.endLine,leaf:u.leaf,tokens:[...f].sort()}),l=!0),f.size>0&&i.set(u.symbol,{symbol:u.symbol,file:u.relativePath,tokens:f})}l&&jE(e,r,a,c)}return t.map(r=>i.get(r.symbol)).filter(r=>!!r)}function TE(e,t,n,i,r){let o=Ye(e,t);return o.length===0?"":ug(o,n,i,r)}function ug(e,t,n,i){if(n>=t&&n-t<=12)return e.slice(t,n+1).join(`
|
|
563
|
+
`);let r=[new RegExp(`\\bdef\\s+${Hr(i)}\\b`),new RegExp(`\\bfun\\s+${Hr(i)}\\b`),new RegExp(`\\bfn\\s+${Hr(i)}\\b`),new RegExp(`\\bfunction\\s+${Hr(i)}\\b`),new RegExp(`\\b${Hr(i)}\\s*\\(`)],o=e.findIndex(s=>r.some(a=>a.test(s)));if(o>=0){let s=o;for(let a=o+1;a<e.length&&a<=o+8;a++){let c=e[a]??"";if(a>o&&BE(c)||(s=a,c.trim()===""&&a>o+1))break}return e.slice(o,s+1).join(`
|
|
544
564
|
`)}return e.slice(t,Math.min(e.length,t+8)).join(`
|
|
545
|
-
`)}function uD(e){return`${e.symbol}\0${e.startLine}\0${e.endLine}\0${e.leaf}`}function dD(e,t,n){let i=ae(e,"source-fingerprints",t,n);if(!i)return new Map;try{let r=JSON.parse(i);if(!Array.isArray(r.entries))return new Map;let o=new Map;for(let s of r.entries){if(!s||typeof s.key!="string"||typeof s.symbol!="string"||typeof s.startLine!="number"||typeof s.endLine!="number"||typeof s.leaf!="string"||!Array.isArray(s.tokens)||!s.tokens.every(a=>typeof a=="string"))return new Map;o.set(s.key,s)}return o}catch{return new Map}}function mD(e,t,n,i){let r={entries:[...i.values()].sort((o,s)=>o.key.localeCompare(s.key))};ce(e,"source-fingerprints",t,n,JSON.stringify(r))}function Zp(e,t){if(!e)return new Set;let n=new Set(["public","private","protected","final","static","class","def","fun","fn","function","return","string","bool","boolean","void","unit","self","this","new","const","let","var","end","pub"]),i=pD(t),o=e.replace(/["'`]/g," ").replace(/\b\d+\b/g," NUM ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[^A-Za-z0-9_]+/g," ").replace(/_/g," ").toLowerCase().split(/\s+/).map(s=>s.trim()).filter(s=>s.length>1).filter(s=>!n.has(s)).filter(s=>!i.has(s));return new Set(o)}function pD(e){return new Set(e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9_]+|_/).map(t=>t.toLowerCase()).filter(t=>t.length>1))}function fD(e){return/^\s*(?:def|fun|fn|function|class|trait|module|object|enum|interface|public|private|protected)\b/.test(e)}function Lr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ct(e){let t=[];if(e.filePattern){let n=e.profiles.find(i=>i.file.includes(e.filePattern));if(!n)return[];for(let i of e.profiles){if(i.file===n.file||e.focusFiles&&!e.focusFiles.has(n.file)&&!e.focusFiles.has(i.file))continue;let r=e.compare(n,i);r&&t.push(r)}}else{if(e.focusFiles?.size===0)return[];let n=e.focusFiles?e.profiles.map((r,o)=>e.focusFiles.has(r.file)?o:-1).filter(r=>r>=0):[],i=typeof e.overrunFactor=="number"&&Number.isFinite(e.limit)?e.limit*e.overrunFactor:Number.POSITIVE_INFINITY;for(let r=0;r<e.profiles.length;r+=1){let o=e.profiles[r];if(e.focusFiles&&!e.focusFiles.has(o.file))for(let s of n){if(s<=r)continue;let a=e.compare(o,e.profiles[s]);a&&t.push(a)}else for(let s=r+1;s<e.profiles.length;s+=1){let a=e.compare(o,e.profiles[s]);a&&t.push(a)}if(t.length>i)break}}return t.sort(e.sort??((n,i)=>i.similarity-n.similarity)),t.slice(0,e.limit)}function Tc(e,t={}){let{minSimilarity:n=.5,limit:i=20,scope:r,filePattern:o}=t,s=t.minDeps??(o?1:3),{profiles:a,distinctiveDeps:c}=gD(e,{scope:r,minDeps:s});return Ct({profiles:a,limit:i,filePattern:o,overrunFactor:5,compare:(l,u)=>yD(l,u,n,c)})}function gD(e,t){let{scope:n,minDeps:i}=t,r=pe(e,n),{universalDeps:o,distinctiveDeps:s}=hD(r),a=[];for(let[c,l]of r)l.size>=i&&a.push({file:c,deps:new Set([...l].filter(u=>!o.has(u)))});return{profiles:a,distinctiveDeps:s}}function hD(e){let t=new Set,n=new Set,i=e.size;if(i===0)return{universalDeps:t,distinctiveDeps:n};let r=new Map;for(let s of e.values())for(let a of s)r.set(a,(r.get(a)??0)+1);let o=Math.max(3,Math.ceil(i*.03));for(let[s,a]of r)a>=5&&a/i>.3?t.add(s):a<=o&&n.add(s);return{universalDeps:t,distinctiveDeps:n}}function yD(e,t,n,i){let r=new Set;for(let l of e.deps)t.deps.has(l)&&r.add(l);if(r.size<3||e.deps.size<4||t.deps.size<4)return null;let o=0;for(let l of r)i.has(l)&&o++;if(o<2)return null;let s=tn(e.deps,t.deps);if(s<n)return null;let a=[];for(let l of e.deps)t.deps.has(l)||a.push(l);let c=[];for(let l of t.deps)e.deps.has(l)||c.push(l);return{fileA:e.file,fileB:t.file,similarity:s,sharedDeps:[...r],uniqueToA:a,uniqueToB:c}}function os(e){let t=[],n=[],i=[];for(let l of e.primitiveGroups)l.values.length!==0&&ef(l.bucket,n,i).push(`${l.reasonPrefix}: ${l.values.join(", ")}`);for(let l of e.nameGroups)bD(l.names,l.label,e.genericWords,e.stripPrefixes??[],t,ef(l.fallbackBucket,n,i));let r=t.length>0,o=n.length>0,s=i.length>0,a=r?o||s?"mixed":"domain-behavior":s?"shared-abstraction":"generic-workflow-scaffolding";return{actionTier:a==="domain-behavior"||a==="mixed"?"signal":"support",evidenceClass:a,reasons:[...t,...i,...n].slice(0,6),recommendation:e.recommendation(a)}}function ss(e,t){if(e.size===0||t.size===0)return 0;let i=nt(e,t).size/Math.min(e.size,t.size);return Math.max(tn(e,t),i)}function W(e,t){return[...e].filter(n=>n.startsWith(t)).map(n=>n.slice(t.length)).sort()}function Ne(e){return[...e].sort()}function bD(e,t,n,i,r,o){let s=[],a=[];for(let c of e)SD(c,i).filter(u=>!n.has(u)).length>0?s.push(c):a.push(c);s.length&&r.push(`${t} has domain term(s): ${s.slice(0,6).join(", ")}`),a.length&&o.push(`${t} is generic workflow: ${a.slice(0,6).join(", ")}`)}function SD(e,t){let n=e.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z0-9])([A-Z])/g,"$1 $2");for(let i of t)n=n.replace(i,"");return n.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function ef(e,t,n){return e==="generic"?t:n}function Tn(e,t={}){let{minSimilarity:n=.62,minTokens:i=8,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=ui(e,{scope:o,minJsxTokens:i,scanLimit:s}).filter(u=>u.kind==="component").map(u=>({file:u.file,component:u.name,tokens:u.jsxTokens,profile:u}));return Ct({profiles:l,limit:r,filePattern:a,focusFiles:c,compare:(u,d)=>xD(u,d,n),sort:(u,d)=>d.similarity-u.similarity||u.fileA.localeCompare(d.fileA)||u.componentA.localeCompare(d.componentA)||u.fileB.localeCompare(d.fileB)||u.componentB.localeCompare(d.componentB)})}function xD(e,t,n){let i=nt(e.tokens,t.tokens);if(i.size<6||!CD(i))return null;let r=tn(e.tokens,t.tokens);return r<n?null:{fileA:e.file,componentA:e.component,fileB:t.file,componentB:t.component,similarity:r,sharedTokens:Ne(i),sharedComponents:W(i,"component:"),sharedNativeTags:W(i,"native:"),sharedProps:W(i,"prop:"),sharedEvents:W(i,"event:"),sharedBindings:W(i,"binding:"),uniqueToA:Ne(Le(e.tokens,t.tokens)).slice(0,25),uniqueToB:Ne(Le(t.tokens,e.tokens)).slice(0,25),locA:e.profile.loc,locB:t.profile.loc}}function CD(e){let t=0,n=0;for(let i of e)i.startsWith("component:")&&(t+=1),(i.startsWith("prop:")||i.startsWith("event:")||i.startsWith("native:")||i.startsWith("jsx:"))&&(n+=1);return t>=1||n>=4}function Fn(e,t={}){let{minSimilarity:n=.45,minSharedBehaviors:i=6,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=ui(e,{scope:o,minBehaviorTokens:Math.max(3,i),scanLimit:s}).map(u=>({file:u.file,component:u.name,tokens:u.behaviorTokens,profile:u}));return Ct({profiles:l,limit:r,filePattern:a,focusFiles:c,compare:(u,d)=>vD(u,d,n,i),sort:(u,d)=>d.similarity-u.similarity||u.fileA.localeCompare(d.fileA)||u.componentA.localeCompare(d.componentA)||u.fileB.localeCompare(d.fileB)||u.componentB.localeCompare(d.componentB)})}function vD(e,t,n,i){let r=nt(e.tokens,t.tokens);if(r.size<i||!wD(r))return null;let o=ss(e.tokens,t.tokens);if(o<n)return null;let s=W(r,"hook:"),a=W(r,"react-hook:"),c=W(r,"effect:"),l=W(r,"state:"),u=W(r,"request:"),d=W(r,"handler:"),m=W(r,"handler-verb:"),p=RD({sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:u,sharedHandlers:d,sharedHandlerVerbs:m});return{fileA:e.file,componentA:e.component,fileB:t.file,componentB:t.component,similarity:o,sharedTokens:Ne(r),sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:u,sharedHandlers:d,sharedHandlerVerbs:m,evidenceClass:p.evidenceClass,actionTier:p.actionTier,evidenceClassReasons:p.reasons,recommendation:p.recommendation,uniqueToA:Ne(Le(e.tokens,t.tokens)).slice(0,25),uniqueToB:Ne(Le(t.tokens,e.tokens)).slice(0,25),reason:ID({sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:u,sharedHandlers:d,sharedHandlerVerbs:m}),locA:e.profile.loc,locB:t.profile.loc}}function RD(e){return os({genericWords:LD,stripPrefixes:DD,primitiveGroups:[{values:e.sharedReactHooks,reasonPrefix:"shared React primitives",bucket:"generic"},{values:e.sharedEffects,reasonPrefix:"shared lifecycle primitive",bucket:"generic"}],nameGroups:[{names:e.sharedHooks,label:"shared hook",fallbackBucket:"shared-abstraction"},{names:e.sharedRequests,label:"shared request",fallbackBucket:"generic"},{names:e.sharedState,label:"shared state",fallbackBucket:"generic"},{names:e.sharedHandlers,label:"shared handler",fallbackBucket:"generic"},{names:e.sharedHandlerVerbs,label:"shared action verb",fallbackBucket:"generic"}],recommendation:kD})}function kD(e){switch(e){case"domain-behavior":return"Review for a shared hook, controller, or feature module around the named domain behavior.";case"mixed":return"Separate generic React mechanics from domain-specific behavior before extracting a shared hook.";case"shared-abstraction":return"Review the existing shared hook usage first; extract only if duplicated behavior remains outside it.";case"generic-workflow-scaffolding":return"Treat as support evidence for a repeated workflow shape, not direct hook-extraction evidence."}}function wD(e){let t=0,n=0,i=0,r=0,o=0,s=0,a=0;for(let u of e)u.startsWith("hook:")?t+=1:u.startsWith("react-hook:")?n+=1:u.startsWith("effect:")?i+=1:u.startsWith("request:")?r+=1:u.startsWith("handler:")||u.startsWith("handler-verb:")?o+=1:u.startsWith("state:")?s+=1:u.startsWith("state-hook:")&&(a+=1);let c=s+a,l=t+n+i+r+o+c;return r>=1&&l>=4||t>=1&&(r>=1||s>=1||o>=2)&&l>=5||s>=1&&o>=2&&(i>=1||n>=2)&&l>=5}function ID(e){let t=[];return e.sharedHooks.length&&t.push(`shared hooks: ${e.sharedHooks.join(", ")}`),e.sharedReactHooks.length&&t.push(`shared React hooks: ${e.sharedReactHooks.join(", ")}`),e.sharedEffects.length&&t.push(`shared effects: ${e.sharedEffects.join(", ")}`),e.sharedState.length&&t.push(`shared state: ${e.sharedState.join(", ")}`),e.sharedRequests.length&&t.push(`shared requests: ${e.sharedRequests.join(", ")}`),e.sharedHandlers.length&&t.push(`shared handlers: ${e.sharedHandlers.slice(0,6).join(", ")}`),e.sharedHandlerVerbs.length&&t.push(`shared action verbs: ${e.sharedHandlerVerbs.slice(0,6).join(", ")}`),t.join("; ")||"shared React behavior profile"}var LD=new Set(["add","apply","async","callback","cancel","change","clear","close","create","data","delete","draft","edit","effect","error","fetch","filter","form","handle","has","is","item","items","load","loader","loading","memo","name","open","reducer","refresh","ref","remove","request","reset","resource","row","rows","save","saving","search","select","selected","state","store","submit","toggle","update","use","value"]),DD=[/^use(?=[A-Z])/,/^handle(?=[A-Z])/,/^is(?=[A-Z])/,/^has(?=[A-Z])/];function Nr(e,t={}){let{minComponentLines:n=300,minFileLines:i=800,minJsxTokens:r=80,minBehaviorTokens:o=40,limit:s=20,scope:a,scanLimit:c,filePattern:l}=t;return ui(e,{scope:a,scanLimit:c}).filter(d=>d.kind==="component").filter(d=>!l||d.file.includes(l)||d.name.includes(l)).map(d=>PD(d,{minComponentLines:n,minFileLines:i,minJsxTokens:r,minBehaviorTokens:o})).filter(d=>d!==null).sort((d,m)=>m.componentLines-d.componentLines||m.fileLines-d.fileLines||d.file.localeCompare(m.file)).slice(0,s)}function PD(e,t){let n=[];e.loc>=t.minComponentLines&&n.push(`${e.loc} component line(s)`);let i=Math.max(80,Math.floor(t.minComponentLines/2));if(e.fileLines>=t.minFileLines&&e.loc>=i&&n.push(`${e.fileLines} file line(s)`),e.jsxTokens.size>=t.minJsxTokens&&n.push(`${e.jsxTokens.size} JSX structure token(s)`),e.behaviorTokens.size>=t.minBehaviorTokens&&n.push(`${e.behaviorTokens.size} behavior token(s)`),n.length===0)return null;let r=ND(e),o=ED(e,t,r),s=TD(e),a=FD(r,o,s);return{file:e.file,component:e.name,componentLines:e.loc,fileLines:e.fileLines,jsxTokens:e.jsxTokens.size,behaviorTokens:e.behaviorTokens.size,dominantPressure:r,pressureKinds:o,contextKind:s,recommendationKind:a,recommendation:_D(a,s),reasons:n,loc:e.loc}}function ND(e){let t=[{axis:"component",value:e.loc},{axis:"file",value:e.fileLines},{axis:"jsx-structure",value:e.jsxTokens.size*3},{axis:"hook-behavior",value:e.behaviorTokens.size*4}];return t.sort((n,i)=>i.value-n.value),t[0]?.axis??"component"}function ED(e,t,n){let i=[];e.loc>=t.minComponentLines&&i.push("component");let r=Math.max(80,Math.floor(t.minComponentLines/2));return e.fileLines>=t.minFileLines&&e.loc>=r&&i.push("file"),e.jsxTokens.size>=t.minJsxTokens&&i.push("jsx-structure"),e.behaviorTokens.size>=t.minBehaviorTokens&&i.push("hook-behavior"),[...new Set(i.length>0?i:[n])]}function TD(e){let t=e.file.split(/[\\/]+/).filter(Boolean),n=t.slice(0,-1).map(l=>l.toLowerCase()),i=(t.at(-1)??e.name).replace(/\.[^.]+$/,""),r=`${i} ${e.name}`.split(/[^A-Za-z0-9]+/).filter(Boolean).map(l=>l.toLowerCase()),o=n.findIndex(l=>$D.has(l)),s=o>=0&&n.slice(o+1).some(l=>AD.has(l)),a=tf(i)||tf(e.name);return/(?:Page|Route|Screen|View)$/.test(i)||/(?:Page|Route|Screen|View)$/.test(e.name)||r.some(l=>MD.has(l))||o>=0&&!s&&!a?"route-page":"component"}function tf(e){let t=e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(n=>n.toLowerCase());return t.at(-1)&&nf.has(t.at(-1))?!0:[...nf].some(n=>e.endsWith(OD(n)))}function FD(e,t,n){return e==="hook-behavior"?"behavior-extraction":n==="route-page"?"route-page-decomposition":t.includes("hook-behavior")?"behavior-extraction":t.includes("jsx-structure")?"jsx-decomposition":t.includes("file")?"file-decomposition":e==="jsx-structure"?"jsx-decomposition":e==="file"&&!t.includes("component")?"file-decomposition":"component-decomposition"}function _D(e,t){switch(e){case"behavior-extraction":return"Extract independent state, effects, requests, or handlers into hooks, controllers, or feature modules.";case"route-page-decomposition":return"Split route/page orchestration from reusable panels and feature controllers.";case"jsx-decomposition":return t==="route-page"?"Split page JSX into named layout sections before extracting behavior.":"Split repeated JSX sections into named presentational components.";case"file-decomposition":return"Review file-level decomposition; split colocated panels or helpers before changing behavior.";case"component-decomposition":return"Review component boundaries around props, state ownership, and independently changing UI sections."}}var AD=new Set(["component","components","panel","panels","partial","partials"]),nf=new Set(["banner","button","card","dialog","drawer","filter","form","grid","header","item","list","menu","modal","nav","panel","picker","rail","row","section","selector","shell","sidebar","table","toolbar"]),$D=new Set(["landing","page","pages","route","routes","screen","screens","view","views"]),MD=new Set(["landing","page","route","screen","view"]);function OD(e){return e.charAt(0).toUpperCase()+e.slice(1)}function _n(e,t={}){let{minSimilarity:n=.62,minTokens:i=8,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=jD(e,{scope:o,minTokens:i,scanLimit:s});return Ct({profiles:l,limit:r,filePattern:a,focusFiles:c,compare:(u,d)=>HD(u,d,n),sort:(u,d)=>d.similarity-u.similarity||u.fileA.localeCompare(d.fileA)||u.fileB.localeCompare(d.fileB)})}function jD(e,t){return li(e,{scope:t.scope,minTemplateTokens:t.minTokens,scanLimit:t.scanLimit}).map(n=>({file:n.file,tokens:n.templateTokens,loc:BD(n)}))}function BD(e){return e.totalLines}function HD(e,t,n){let i=nt(e.tokens,t.tokens);if(i.size<6||!VD(i))return null;let r=tn(e.tokens,t.tokens);return r<n?null:{fileA:e.file,fileB:t.file,similarity:r,sharedTokens:Ne(i),sharedComponents:W(i,"component:"),sharedProps:W(i,"prop:"),sharedEvents:W(i,"event:"),sharedDirectives:W(i,"directive:"),sharedSlots:W(i,"slot:"),sharedIdentifiers:W(i,"id:"),uniqueToA:Ne(Le(e.tokens,t.tokens)).slice(0,25),uniqueToB:Ne(Le(t.tokens,e.tokens)).slice(0,25),locA:e.loc,locB:t.loc}}function VD(e){let t=0,n=0;for(let i of e)i.startsWith("component:")&&(t+=1),(i.startsWith("prop:")||i.startsWith("event:")||i.startsWith("directive:")||i.startsWith("slot:"))&&(n+=1);return t>=1||n>=3}function An(e,t={}){let{minSimilarity:n=.45,minSharedBehaviors:i=6,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=li(e,{scope:o,minBehaviorTokens:Math.max(3,i),scanLimit:s}).map(u=>({file:u.file,tokens:u.behaviorTokens,profile:u}));return Ct({profiles:l,limit:r,filePattern:a,focusFiles:c,compare:(u,d)=>qD(u,d,n,i),sort:(u,d)=>d.similarity-u.similarity||u.fileA.localeCompare(d.fileA)||u.fileB.localeCompare(d.fileB)})}function qD(e,t,n,i){let r=nt(e.tokens,t.tokens);if(r.size<i||!zD(r))return null;let o=ss(e.tokens,t.tokens);if(o<n)return null;let s=W(r,"composable:"),a=W(r,"store:"),c=W(r,"reactivity:"),l=W(r,"lifecycle:"),u=W(r,"request:"),d=W(r,"function:"),m=W(r,"function-verb:"),p=W(r,"template-binding:"),f=W(r,"template-event:"),g=UD({sharedComposables:s,sharedStores:a,sharedReactivity:c,sharedLifecycle:l,sharedRequests:u,sharedFunctions:d,sharedFunctionVerbs:m,sharedBindings:p,sharedTemplateEvents:f});return{fileA:e.file,fileB:t.file,similarity:o,sharedTokens:Ne(r),sharedComposables:s,sharedStores:a,sharedReactivity:c,sharedLifecycle:l,sharedRequests:u,sharedFunctions:d,sharedFunctionVerbs:m,sharedBindings:p,sharedTemplateEvents:f,evidenceClass:g.evidenceClass,actionTier:g.actionTier,evidenceClassReasons:g.reasons,recommendation:g.recommendation,uniqueToA:Ne(Le(e.tokens,t.tokens)).slice(0,25),uniqueToB:Ne(Le(t.tokens,e.tokens)).slice(0,25),reason:GD({sharedComposables:s,sharedStores:a,sharedRequests:u,sharedLifecycle:l,sharedFunctions:d,sharedFunctionVerbs:m,sharedBindings:p}),locA:e.profile.totalLines,locB:t.profile.totalLines}}function UD(e){return os({genericWords:JD,primitiveGroups:[{values:e.sharedReactivity,reasonPrefix:"shared reactivity primitive",bucket:"generic"},{values:e.sharedLifecycle,reasonPrefix:"shared lifecycle primitive",bucket:"generic"}],nameGroups:[{names:e.sharedComposables,label:"shared composable",fallbackBucket:"shared-abstraction"},{names:e.sharedStores,label:"shared store",fallbackBucket:"shared-abstraction"},{names:e.sharedRequests,label:"shared request",fallbackBucket:"generic"},{names:e.sharedFunctions,label:"shared function",fallbackBucket:"generic"},{names:e.sharedFunctionVerbs,label:"shared action verb",fallbackBucket:"generic"},{names:e.sharedBindings,label:"shared binding",fallbackBucket:"generic"},{names:e.sharedTemplateEvents,label:"shared template event",fallbackBucket:"generic"}],recommendation:WD})}function WD(e){switch(e){case"domain-behavior":return"Review for a shared composable, store, or feature module around the named domain behavior.";case"mixed":return"Separate generic Vue mechanics from domain-specific behavior before extracting a composable.";case"shared-abstraction":return"Review the existing composable/store usage first; extract only if duplicated behavior remains outside it.";case"generic-workflow-scaffolding":return"Treat as support evidence for a repeated workflow shape, not direct composable-extraction evidence."}}function zD(e){let t=0,n=0,i=0,r=0,o=0,s=0,a=0;for(let u of e)u.startsWith("composable:")?t+=1:u.startsWith("store:")?n+=1:u.startsWith("request:")?i+=1:u.startsWith("lifecycle:")?r+=1:u.startsWith("function:")?o+=1:u.startsWith("reactivity:")?s+=1:(u.startsWith("function-verb:")||u.startsWith("template-binding:")||u.startsWith("template-event:"))&&(a+=1);let c=t+n,l=c+i+r+o+a;return i>=1&&l>=4||r>=1&&o>=2&&l>=4||c>=2&&(i>=1||o>=2)&&l>=5||o>=2&&s>=1&&l>=4}function GD(e){let t=[];return e.sharedComposables.length&&t.push(`shared composables: ${e.sharedComposables.join(", ")}`),e.sharedStores.length&&t.push(`shared stores: ${e.sharedStores.join(", ")}`),e.sharedRequests.length&&t.push(`shared request helpers: ${e.sharedRequests.join(", ")}`),e.sharedLifecycle.length&&t.push(`shared lifecycle: ${e.sharedLifecycle.join(", ")}`),e.sharedFunctions.length&&t.push(`shared functions: ${e.sharedFunctions.slice(0,6).join(", ")}`),e.sharedFunctionVerbs.length&&t.push(`shared action verbs: ${e.sharedFunctionVerbs.slice(0,6).join(", ")}`),e.sharedBindings.length&&t.push(`shared template bindings: ${e.sharedBindings.slice(0,6).join(", ")}`),t.join("; ")||"shared Vue behavior profile"}var JD=new Set(["add","apply","cancel","change","clear","close","composable","create","data","delete","draft","edit","error","fetch","filter","form","item","items","load","loading","name","open","reactive","ref","refresh","remove","request","reset","resource","row","rows","save","saving","search","select","selected","store","submit","toggle","update","use","value","watch"]);function Er(e,t={}){let{minTotalLines:n=800,minTemplateLines:i=300,minScriptLines:r=300,minStyleLines:o=500,limit:s=20,scope:a,scanLimit:c,filePattern:l}=t;return li(e,{scope:a,scanLimit:c}).filter(d=>!l||d.file.includes(l)).map(d=>KD(d,{minTotalLines:n,minTemplateLines:i,minScriptLines:r,minStyleLines:o})).filter(d=>d!==null).sort((d,m)=>m.totalLines-d.totalLines||d.file.localeCompare(m.file)).slice(0,s)}function KD(e,t){let n=[];if(e.totalLines>=t.minTotalLines&&n.push(`${e.totalLines} total component line(s)`),e.templateLines>=t.minTemplateLines&&n.push(`${e.templateLines} template line(s)`),e.scriptLines>=t.minScriptLines&&n.push(`${e.scriptLines} script line(s)`),e.styleLines>=t.minStyleLines&&n.push(`${e.styleLines} style line(s)`),n.length===0)return null;let i=QD(e),r=XD(e,t,i),o=YD(e.file),s=ZD(i,o);return{file:e.file,totalLines:e.totalLines,sfcLines:e.sfcLines,templateLines:e.templateLines,scriptLines:e.scriptLines,styleLines:e.styleLines,externalScriptLines:e.externalScriptLines,externalScriptPaths:e.externalScriptPaths,customBlockLines:e.customBlockLines,dominantPressure:i,pressureKinds:r,contextKind:o,recommendationKind:s,recommendation:eP(s,o),reasons:n,loc:e.totalLines}}function QD(e){let t=[{axis:"template",lines:e.templateLines},{axis:"script",lines:e.scriptLines-e.externalScriptLines},{axis:"style",lines:e.styleLines},{axis:"external-script",lines:e.externalScriptLines},{axis:"custom-block",lines:e.customBlockLines}];return t.sort((n,i)=>i.lines-n.lines),t[0]?.lines?t[0].axis:"total"}function XD(e,t,n){let i=[];return e.totalLines>=t.minTotalLines&&(i.push("total"),n!=="total"&&i.push(n)),e.templateLines>=t.minTemplateLines&&i.push("template"),e.scriptLines>=t.minScriptLines&&i.push("script"),e.styleLines>=t.minStyleLines&&i.push("style"),(e.externalScriptLines>=t.minScriptLines||n==="external-script")&&i.push("external-script"),e.customBlockLines>0&&n==="custom-block"&&i.push("custom-block"),[...new Set(i.length>0?i:[n])]}function YD(e){return e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).some(i=>tP.has(i))||/(?:view|page|route)\.vue$/i.test(e)||/(?:^|\/)(views|pages|routes)\//i.test(e)?"route-page":"component"}function ZD(e,t){return e==="style"?"style-decomposition":e==="template"?"template-decomposition":e==="external-script"?"external-script-boundary":e==="custom-block"?"custom-block-review":t==="route-page"?"route-page-decomposition":e==="script"?"script-behavior-extraction":"total-size-review"}function eP(e,t){switch(e){case"template-decomposition":return t==="route-page"?"Split route template sections into named panels before extracting script behavior.":"Split repeated template sections into named presentational components.";case"script-behavior-extraction":return"Extract independent script behavior into composables, controllers, or feature modules.";case"style-decomposition":return"Review UI/style decomposition; move repeated styling to component or style primitives, not composables.";case"external-script-boundary":return"Review the external script boundary and split controller/composable modules by workflow.";case"custom-block-review":return"Review custom block ownership before splitting template or script code.";case"route-page-decomposition":return"Split route/page orchestration from reusable panels and feature controllers.";case"total-size-review":return"Review the largest block first, then split by the dominant reason to change."}}var tP=new Set(["landing","page","pages","route","routes","view","views"]);function Fc(e,t={}){let{minSimilarity:n=.5,limit:i=15,scope:r,minChainLength:o=3,maxChainLength:s=8}=t,a=pe(e,r),c=lP(a,o,s);if(c.length===0)return[];let l=nP(c);return l.length<2?[]:cP(oP(l,n,i),i)}function nP(e){let t=iP(e),n=[];for(let i of e){let r=i.filter(o=>!t.has(o));r.length>=2&&n.push({original:i,filtered:r})}return n}function iP(e){let{nodeFreq:t,tailFreq:n}=rP(e),i=e.length*.9,r=e.length*.8,o=new Set;for(let[a,c]of t)c>i&&o.add(a);for(let[a,c]of n)c>r&&o.add(a);let s=["index.ts","index.js","cli.ts","main.ts","health.ts","health.js"];for(let a of t.keys()){let c=a.split("/").pop()??"";s.includes(c)&&o.add(a)}return o}function rP(e){let t=new Map,n=new Map;for(let i of e){let r=new Set;for(let o of i)r.has(o)||(t.set(o,(t.get(o)??0)+1),r.add(o));for(let o=Math.max(0,i.length-2);o<i.length;o++)n.set(i[o],(n.get(i[o])??0)+1)}return{nodeFreq:t,tailFreq:n}}function oP(e,t,n){let i=[];for(let r=0;r<e.length;r++){for(let o=r+1;o<e.length;o++){let s=sP(e[r],e[o],t);s&&i.push(s)}if(i.length>n*10)break}return i.sort((r,o)=>Math.abs(o.similarity-r.similarity)>.01?o.similarity-r.similarity:r.divergencePoints.length-o.divergencePoints.length),i}function sP(e,t,n){if(!aP(e.filtered,t.filtered))return null;let{distance:i,ops:r}=uP(e.filtered,t.filtered),o=Math.max(e.filtered.length,t.filtered.length);if(o===0)return null;let s=1-i/o;if(s<n||i===0)return null;let a=r.filter(l=>l.type==="substitute").map(l=>({index:l.indexA,nodeA:e.filtered[l.indexA],nodeB:t.filtered[l.indexB]}));return a.length===0||r.filter(l=>l.type==="match").length<2?null:{chainA:e.original,chainB:t.original,similarity:s,editDistance:i,divergencePoints:a,commonPrefix:dP(e.original,t.original),commonSuffix:mP(e.original,t.original)}}function aP(e,t){let n=new Set(e);return t.some(i=>n.has(i))}function cP(e,t){let n=[];for(let i of e)if(n.some(o=>rf(i.chainA,o.chainA)&&rf(i.chainB,o.chainB))||n.push(i),n.length>=t)break;return n}function lP(e,t,n){let i=[];for(let o of e.keys()){if(i.length>=500)break;of(e,o,[o],new Set([o]),t,n,i,500)}return i}function of(e,t,n,i,r,o,s,a){if(s.length>=a)return;if(n.length>=o){n.length>=r&&s.push([...n]);return}let c=e.get(t);if(!c||c.size===0){n.length>=r&&s.push([...n]);return}let l=!1;for(let u of c)if(!i.has(u)&&(i.add(u),n.push(u),of(e,u,n,i,r,o,s,a),n.pop(),i.delete(u),l=!0,s.length>=a))return;!l&&n.length>=r&&s.push([...n])}function uP(e,t){let n=e.length,i=t.length,r=Array.from({length:n+1},()=>Array(i+1).fill(0));for(let c=0;c<=n;c++)r[c][0]=c;for(let c=0;c<=i;c++)r[0][c]=c;for(let c=1;c<=n;c++)for(let l=1;l<=i;l++)e[c-1]===t[l-1]?r[c][l]=r[c-1][l-1]:r[c][l]=1+Math.min(r[c-1][l],r[c][l-1],r[c-1][l-1]);let o=[],s=n,a=i;for(;s>0||a>0;)s>0&&a>0&&e[s-1]===t[a-1]?(o.unshift({type:"match",indexA:s-1,indexB:a-1}),s--,a--):s>0&&a>0&&r[s][a]===r[s-1][a-1]+1?(o.unshift({type:"substitute",indexA:s-1,indexB:a-1}),s--,a--):a>0&&r[s][a]===r[s][a-1]+1?(o.unshift({type:"insert",indexA:s,indexB:a-1}),a--):(o.unshift({type:"delete",indexA:s-1,indexB:a}),s--);return{distance:r[n][i],ops:o}}function dP(e,t){let n=[];for(let i=0;i<Math.min(e.length,t.length)&&e[i]===t[i];i++)n.push(e[i]);return n}function mP(e,t){let n=[],i=e.length-1,r=t.length-1;for(;i>=0&&r>=0&&e[i]===t[r];)n.unshift(e[i]),i--,r--;return n}function rf(e,t){if(e.length>t.length)return!1;let n=t.join("\u2192"),i=e.join("\u2192");return n.includes(i)}function it(e){let t=e.orderCandidates?[...e.candidates()].sort(e.orderCandidates):e.candidates(),n=qe(t,e.scanLimit),i=e.prepare?.(n)??void 0,r=[];for(let o of n){let s=e.evaluate(o,i);s&&r.push(s)}return e.orderResults&&r.sort(e.orderResults),typeof e.limit=="number"?r.slice(0,e.limit):r}function $n(e,t={}){let{scope:n,minLoc:i=10,minCallees:r=6,limit:o=20,scanLimit:s}=t,a=new A(e);return it({candidates:()=>a.productionCallableDefinitions({scope:n,minLoc:i,excludeTypesFiles:!0,requireFunctionLikeSymbol:!0,sortByLocDesc:!0}),scanLimit:s,prepare:c=>a.calleeMap(c,{semantic:t.semantic!==!1}),evaluate:(c,l)=>pP(c,l.get(c.symbolId)??[],r),orderResults:(c,l)=>l.clusters.length-c.clusters.length||l.loc-c.loc,limit:o})}function pP(e,t,n){let i=new Set(t.map(l=>l.symbol));if(i.size<n)return null;let r=bP(i,t),o=SP(i,r);if(o.length<2)return null;let s=xP(o,r);if(s.length===0)return null;let a=v(e.symbol),c=fP(a,i.size,o.length,s);return{symbol:e.symbol,shortName:a,relativePath:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:G(e),totalCallees:i.size,extractionKind:c.extractionKind,actionTier:"signal",evidenceReasons:c.evidenceReasons,recommendation:c.recommendation,clusters:s}}function fP(e,t,n,i){let r=Math.max(...i.map(c=>c.callees.length)),o=Math.max(...i.map(c=>c.isolation)),s=[`${t} distinct callees across ${n} co-occurrence cluster(s)`,`${i.length} extractable cluster(s) passed size and isolation thresholds`,`largest extractable cluster has ${r} callees at ${Math.round(o*100)}% isolation`],a=gP(e,t,n);return a!==null?{extractionKind:"workflow-orchestration",evidenceReasons:[...s,a],recommendation:"Review the isolated helper group as a possible private or feature-local helper, but keep the orchestration sequence together when it preserves the workflow."}:r>=6?{extractionKind:"broad-helper-cluster",evidenceReasons:[...s,"one isolated helper group is broad enough to deserve a named review"],recommendation:"Review whether the broad helper cluster has a stable concept name before extracting it; avoid creating a bag-of-helpers abstraction."}:{extractionKind:"cohesive-helper-cluster",evidenceReasons:s,recommendation:"Review the isolated callee group as a possible same-file or feature-local helper; extract only if the new name preserves the current behavior."}}function gP(e,t,n){if(t>=10)return`callee breadth suggests orchestration: ${t} callees`;if(n>=4)return`multiple disconnected callee groups suggest orchestration: ${n} groups`;let i=hP(e);return yP.has(i)?`caller verb suggests orchestration: ${i}`:null}function hP(e){return e.split(":").pop()?.replace(/\(\)$/,"").replace(/[^A-Za-z0-9_]/g,"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_\s-]+/).filter(Boolean)[0]?.toLowerCase()??""}var yP=new Set(["apply","build","check","collect","create","diff","execute","find","handle","load","prepare","process","render","resolve","run","select","sync","update","validate","verify","write"]);function bP(e,t){let n=new Map;for(let r of e)n.set(r,new Set);let i=new Map;for(let r of t){let o=i.get(r.chunkId);o||(o=new Set,i.set(r.chunkId,o)),o.add(r.symbol)}for(let r of i.values()){let o=[...r];for(let s=0;s<o.length;s++)for(let a=s+1;a<o.length;a++)n.get(o[s]).add(o[a]),n.get(o[a]).add(o[s])}return n}function SP(e,t){let n=new Set,i=[];for(let r of e){if(n.has(r))continue;let o=new Set,s=[r];for(;s.length>0;){let a=s.pop();if(!n.has(a)){n.add(a),o.add(a);for(let c of t.get(a)??[])n.has(c)||s.push(c)}}i.push(o)}return i}function xP(e,t){return e.filter(n=>n.size>=3).map(n=>CP(n,e,t)).filter(n=>n.isolation>.5).sort((n,i)=>i.isolation-n.isolation)}function CP(e,t,n){let i=new Set;for(let a of t)if(a!==e)for(let c of a)i.add(c);let r=0;for(let a of e)for(let c of n.get(a)??[])i.has(c)&&r++;let o=e.size*i.size,s=o>0?1-r/o:1;return{callees:[...e].map(v),isolation:s}}import{posix as Ei}from"path";var vP=U("definition-consumer-file-usage",{clearGroups:["whole-project","source-file"]});function nn(e,t,n){return e.callerFileMap(t,{semantic:n.semantic,sourceFallback:n.sourceFallback})}function as(e,t,n){let i=[],r=0,o=0,s=M(t.symbol);for(let a of n)DP(e,a,t.relativePath,s)?r++:_c(e,a,s)?o++:i.push(a);return{realConsumers:i,barrelConsumers:r,importOnlyConsumers:o}}function _c(e,t,n){if(!n)return!1;let i=K(t);if(!i)return!1;let r=vP.get(e,t,()=>RP(e,t,i));return r.importedLeaves.has(n)&&!r.usedLeaves.has(n)}function RP(e,t,n){let i=F(e,t);if(!i)return wP();let r=Z(e,t,i),o=ae(e,"consumer-file-usage",t,r);if(o){let a=LP(o);if(a)return a}let s=kP(e,t,n);return ce(e,"consumer-file-usage",t,r,IP(s)),s}function kP(e,t,n){let i=new Set,r=new Set,o=ke(e,t);if(!o)return{importedLeaves:i,usedLeaves:r};let s=n==="rust"?new Set(["use_declaration"]):n==="python"?new Set(["import_statement","import_from_statement"]):new Set(["import_statement"]),a=(c,l)=>{let u=l||s.has(c.type);(c.type==="identifier"||c.type==="type_identifier"||c.type==="property_identifier"||c.type==="field_identifier")&&(u?i.add(c.text):r.add(c.text));for(let d of c.children)a(d,u)};return a(o.rootNode,!1),{importedLeaves:i,usedLeaves:r}}function wP(){return{importedLeaves:new Set,usedLeaves:new Set}}function IP(e){return JSON.stringify({importedLeaves:[...e.importedLeaves],usedLeaves:[...e.usedLeaves]})}function LP(e){try{let t=JSON.parse(e);return!Array.isArray(t.importedLeaves)||!Array.isArray(t.usedLeaves)?null:{importedLeaves:new Set(t.importedLeaves.filter(n=>typeof n=="string")),usedLeaves:new Set(t.usedLeaves.filter(n=>typeof n=="string"))}}catch{return null}}function DP(e,t,n,i){if(!i)return!1;let r=Ke(e,t);if(r.length===0)return!1;let o=cr(e,t);if(o.length===0)return!1;let s=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`\\b${s}\\b`),c=0;for(let l=0;l<r.length;l++){if(!a.test(r[l]??""))continue;if(c++,!o.find(d=>d.startLine<=l&&l<=d.endLine))return!1}return c>0}var PP=20,NP=1,EP=new Map([["app","app"],["apps","app"],["component","component"],["components","component"],["composable","composable"],["composables","composable"],["contract","contract"],["contracts","contract"],["domain","domain"],["domains","domain"],["feature","feature"],["features","feature"],["hook","hook"],["hooks","hook"],["lib","library"],["module","module"],["modules","module"],["package","package"],["packages","package"],["page","page"],["pages","page"],["route","route"],["routes","route"],["screen","screen"],["screens","screen"],["service","service"],["services","service"],["shared","shared"],["src","source-root"],["store","state"],["stores","state"],["test","test"],["tests","test"],["util","utility"],["utils","utility"],["view","view"],["views","view"]]),TP=new Set(["components","contracts","hooks","lib","services","shared","stores","utils"]),FP=new Set(["access","api","auth","config","db","effect","errors","hooks","lib","middleware","permissions","routes","schemas","servicetasks","services","startup","store","stores","test-utils","repository","repositories","tests","types","ui","utils","workflow","workflows"]);function Oc(e,t={}){let n=Mc(t.limit,PP),i=Mc(t.minConsumers,NP),r=new A(e),o=r.fileDependencyGraph(t.scope),s=ZP(B(e,{includeIgnored:!1})),a=nN(e.config.locality?.architecturalBoundarySegments,t.architecturalBoundarySegments);return(t.target?_P(e,r,t.target):AP(e,t.scope,t.scanLimit)).map(u=>$P(r,o,u,t,s,a)).filter(u=>u.consumerFiles.length>=i||t.target).sort(YP).slice(0,n)}function _P(e,t,n){let i=jP(e,n);if(i)return[uf(i)];let r=V(e,n);if(!r)return[];let o=t.definitionsForFile(r.relativePath).find(s=>s.symbolId===r.symbolId);return o?[BP(o)]:[{unit:{kind:"symbol",file:r.relativePath,shortName:v(r.symbol),symbol:r.symbol,startLine:r.startLine,endLine:r.endLine}}]}function AP(e,t,n){let i=B(e,{scope:t,includeIgnored:!1}),r=Mc(n,i.length);return i.slice(0,r).map(o=>uf(o))}function $P(e,t,n,i,r,o){let s=n.definition?MP(e,n.definition,i.semantic):OP(t,n.unit.file),a=n.definition?s.length>0?"exact":"none":s.length>0?"file-level":"none",c=n.unit.file,l=dt(Ei.dirname(c)),u=VP(s),d=HP(l),m=Hc([...sf(l),...u?sf(u):[]]),p=qP(n.unit,l,u,s),f=UP(p,n.unit,l,u,s,r,o),g=KP(n.unit,a,u,s,l,f.whyNoSuggestedHome),y=QP(n.unit,l,u,s,f.suggestedHome,f.whyNoSuggestedHome);return{actionTier:"signal",sourceUnit:n.unit,candidatePath:c,currentDirectory:l,directoryAncestry:d,consumerFiles:s,consumerCoverage:a,nearestCommonOwner:u,boundaryMarkers:m,recommendedTier:p,suggestedHome:f.suggestedHome,destinationConfidence:f.confidence,whyNoSuggestedHome:f.whyNoSuggestedHome,counterevidence:g,reasons:y,recommendation:XP(p,f.suggestedHome,a)}}function MP(e,t,n){let i=nn(e,[t],{semantic:n!==!1,sourceFallback:!0});return gf(i.get(t.symbolId)??[])}function OP(e,t){let n=[];for(let[i,r]of e.entries())i!==t&&r.has(t)&&n.push(i);return gf(n)}function jP(e,t){let n=Bc(t),i=B(e,{includeIgnored:!1}),r=i.find(s=>s===n);if(r)return r;let o=i.find(s=>s.endsWith(`/${n}`));return o||(i.find(s=>s.includes(n))??null)}function BP(e){return{definition:e,unit:{kind:"symbol",file:e.relativePath,shortName:v(e.symbol),symbol:e.symbol,startLine:e.startLine,endLine:e.endLine}}}function uf(e){return{unit:{kind:"file",file:e,shortName:Ei.basename(e)}}}function HP(e){if(e===".")return[{path:".",depth:0,markers:[]}];let t=[],n=e.split("/").filter(Boolean);for(let i=0;i<n.length;i+=1){let r=n.slice(0,i+1).join("/");t.push({path:r,depth:i,markers:jc(r)})}return t}function sf(e){return e==="."?[]:df(e).map(({marker:t,prefix:n})=>`${t}: ${n}`)}function jc(e){return Hc(df(e).map(({marker:t})=>t))}function df(e){let t=e.split("/").filter(Boolean),n=[];for(let i=0;i<t.length;i+=1){let r=EP.get(t[i]);r&&n.push({marker:r,prefix:t.slice(0,i+1).join("/")})}return n}function VP(e){if(e.length===0)return null;let t=e.map(i=>dt(Ei.dirname(i))),n=t[0].split("/").filter(Boolean);for(let i of t.slice(1)){let r=i.split("/").filter(Boolean),o=[],s=Math.min(n.length,r.length);for(let a=0;a<s&&n[a]===r[a];a+=1)o.push(n[a]);n=o}return n.length===0?".":n.join("/")}function qP(e,t,n,i){return n?e.kind==="symbol"&&i.length===1?i[0]===e.file?"same-file":"sibling-folder":n==="."||n==="src"?"repository-level-review":cf(n,"package")?"package-level-shared":cf(n,"app")?"app-level-shared":lf(n,["feature","domain","module"])||lf(t,["feature","domain","module"])?"feature-local-shared":"sibling-folder":"no-exact-consumers"}function UP(e,t,n,i,r,o,s){let a=WP(e,i);if(a)return rn(a);let c=eN(t.file),l=zP(e,n,c,r,s);if(l)return l;let u=i;if(dt(n)===dt(u))return rn(`${n} is already the nearest common owner for its consumers.`);let d=GP(u,n,c,s);return d||JP(u,n,c,o,s)}function WP(e,t){return t?e==="no-exact-consumers"||e==="repository-level-review"?"The inferred owner is too broad or unsupported for an exact destination.":null:"No consumer owner could be inferred from the current index."}function zP(e,t,n,i,r){if(e==="same-file"){let o=i[0]??null;return o?Ac(o):rn("No same-file consumer path was available.")}if(e==="sibling-folder"&&i.length===1){let o=dt(Ei.dirname(i[0])),s=ff(t,n,o,r);return s?rn(s):Ac(o)}return null}function GP(e,t,n,i){return rN(e)?mf(e,t,n,i,`Nearest shared owner ${e} is outside source root ${n}.`):null}function JP(e,t,n,i,r){if(e===".")return rn("The nearest common owner is the repository root.");let o=`${e}/shared`,s=mf(o,t,n,r,`Proposed home ${o} is outside source root ${n}.`);return s.confidence==="withheld"||i.has(o)?s:rn(`${o} does not exist in the indexed project.`)}function mf(e,t,n,i,r){if(!pf(e,n))return rn(r);let o=ff(t,n,e,i);return o?rn(o):Ac(e)}function Ac(e){return{suggestedHome:e,confidence:"exact",whyNoSuggestedHome:null}}function rn(e){return{suggestedHome:null,confidence:"withheld",whyNoSuggestedHome:e}}function KP(e,t,n,i,r,o){let s=["Report-only signal; review ownership before moving files."];return t==="none"&&s.push("No consumers were found in the current index."),t==="file-level"&&s.push("File-level import evidence can hide which exported unit is actually used."),(n==="."||n==="src")&&s.push("Nearest common owner is broad, so this is not enough evidence for automatic placement."),i.length===1&&s.push("Only one consumer was found; inlining or same-folder placement may be better than shared extraction."),e.kind==="file"&&s.push("File targets describe module locality, not symbol-level usage."),n&&r.startsWith(`${n}/`)&&s.push("Candidate already lives under the nearest common owner."),o&&s.push(`No exact suggested home: ${o}`),s}function QP(e,t,n,i,r,o){let s=[];return s.push(`${e.shortName} currently lives in ${t}.`),n?s.push(`${i.length} consumer file(s) share ${n} as their nearest common owner.`):s.push("No consumer owner could be inferred from the current index."),r?s.push(`Suggested home is ${r}.`):o&&s.push(`No exact suggested home: ${o}`),s}function XP(e,t,n){return e==="no-exact-consumers"?"Review references before moving; no consumers were found.":e==="repository-level-review"?"Keep this as a broad locality signal; the inferred owner is too general for automatic relocation.":t?`Review whether ${n==="exact"?"symbol usage":"module import"} supports moving or extracting toward ${t}.`:"Review ownership manually before changing structure."}function YP(e,t){return af(t)-af(e)||e.candidatePath.localeCompare(t.candidatePath)}function af(e){let t=e.consumerFiles.length*10;return e.consumerCoverage==="exact"&&(t+=5),e.suggestedHome&&(t+=3),e.recommendedTier==="repository-level-review"&&(t-=8),e.recommendedTier==="no-exact-consumers"&&(t-=12),t}function ZP(e){let t=new Set(["."]);for(let n of e){let i=dt(Ei.dirname(n));for(;!t.has(i)&&(t.add(i),i!==".");)i=dt(Ei.dirname(i))}return t}function eN(e){let t=$c(e),n=t.indexOf("src");return n>=0?t.slice(0,n+1).join("/"):t.length<=1?".":t[0]}function pf(e,t){let n=dt(e),i=dt(t);return i==="."||n===i||n.startsWith(`${i}/`)}function tN(e,t,n){let i=$c(e),r=$c(t);return(pf(e,t)?i.slice(r.length):i).some(s=>n.has(s.toLowerCase()))}function ff(e,t,n,i){return dt(e)===dt(n)||!tN(e,t,i)?null:`${e} is a named architectural boundary; an exact move to ${n} needs human design.`}function nN(...e){let t=new Set(FP);for(let n of e)for(let i of n??[]){let r=iN(i);r&&t.add(r)}return t}function iN(e){let t=e.trim().toLowerCase();return t===""?null:t}function cf(e,t){return jc(e).includes(t)}function lf(e,t){let n=jc(e);return t.some(i=>n.includes(i))}function rN(e){let t=e.split("/").filter(Boolean),n=t[t.length-1];return n?TP.has(n):!1}function Bc(e){return e.replaceAll("\\","/").replace(/^\.\//,"")}function dt(e){let t=Bc(e);return t===""?".":t}function $c(e){let t=Bc(e);return t==="."?[]:t.split("/").filter(Boolean)}function Mc(e,t){return!Number.isFinite(e)||e===void 0||e<1?t:Math.floor(e)}function gf(e){return Hc([...e]).sort((t,n)=>t.localeCompare(n))}function Hc(e){return[...new Set(e)]}function Tr(e,t,n={}){let{maxDepth:i=5,scope:r}=n,o=V(e,t);if(!o)return[];let s=[],a=new Set([o.symbolId]),c=new Set,l=[o];for(let u=1;u<=i&&l.length!==0;u++){let d=[];for(let m of l)for(let p of oN(e,m,r)){let f=`${p.file}|${p.shortName}`;if(p.symbolId!==null){if(a.has(p.symbolId))continue;a.add(p.symbolId)}else if(c.has(f))continue;c.add(f),s.push({symbol:p.symbol,shortName:p.shortName,file:p.file,depth:u}),p.symbolId!==null&&p.symbolMatch&&d.push(p.symbolMatch)}l=d}return s.sort((u,d)=>u.depth-d.depth||u.file.localeCompare(d.file)),s}function oN(e,t,n){let i=tt(e,t,{limit:500}).filter(l=>!e.isIgnored(l.file)).filter(l=>!n||l.file.includes(n)),r=new Set(i.map(l=>l.file)),o=[];for(let l of sN(e,t,n)){if(r.has(l))continue;let u=Q(e,l),d=u.length>0?Qe(u,u[0].startLine):null;o.push({symbol:d?.symbol??l,file:l})}let s=[...i,...o],a=[],c=new Set;for(let l of s){let u=gi(e,l.symbol);if(!u){let m=`${l.file}|${l.symbol}`;if(c.has(m))continue;c.add(m),a.push({symbolId:null,symbol:l.symbol,shortName:v(l.symbol),file:l.file,symbolMatch:null});continue}if(u.symbolId===t.symbolId||e.isIgnored(u.relativePath)||!aN(u.symbol))continue;let d=`${u.symbolId}|${u.relativePath}`;c.has(d)||(c.add(d),a.push({symbolId:u.symbolId,symbol:u.symbol,shortName:v(u.symbol),file:u.relativePath,symbolMatch:u}))}return a}function sN(e,t,n){let i=n?"AND consumer_d.relative_path LIKE ?":"",r=[t.symbolId,t.documentId];return n&&r.push(`%${n}%`),new Set(e.all(`SELECT DISTINCT consumer_d.relative_path
|
|
565
|
+
`)}function _E(e){return`${e.symbol}\0${e.startLine}\0${e.endLine}\0${e.leaf}`}function AE(e,t,n){return tg.read(e,t,n)??new Map}function ME(e){try{let t=JSON.parse(e);if(!Array.isArray(t.entries))return null;let n=new Map;for(let i of t.entries){if(!i||typeof i.key!="string"||typeof i.symbol!="string"||typeof i.startLine!="number"||typeof i.endLine!="number"||typeof i.leaf!="string"||!Array.isArray(i.tokens)||!i.tokens.every(r=>typeof r=="string"))return null;n.set(i.key,i)}return n}catch{return null}}function $E(e){let t={entries:[...e.values()].sort((n,i)=>n.key.localeCompare(i.key))};return JSON.stringify(t)}function jE(e,t,n,i){tg.write(e,t,n,new Map(i))}function dg(e,t){if(!e)return new Set;let n=new Set(["public","private","protected","final","static","class","def","fun","fn","function","return","string","bool","boolean","void","unit","self","this","new","const","let","var","end","pub"]),i=OE(t),o=e.replace(/["'`]/g," ").replace(/\b\d+\b/g," NUM ").replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[^A-Za-z0-9_]+/g," ").replace(/_/g," ").toLowerCase().split(/\s+/).map(s=>s.trim()).filter(s=>s.length>1).filter(s=>!n.has(s)).filter(s=>!i.has(s));return new Set(o)}function OE(e){return new Set(e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9_]+|_/).map(t=>t.toLowerCase()).filter(t=>t.length>1))}function BE(e){return/^\s*(?:def|fun|fn|function|class|trait|module|object|enum|interface|public|private|protected)\b/.test(e)}function Hr(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Nt(e,t){let n=new Map;return e.forEach((i,r)=>{let o=new Set;for(let s of t(i)){if(o.has(s))continue;o.add(s);let a=n.get(s);a?a.push(r):n.set(s,[r])}}),{candidatesFor:(i,r)=>{let o=new Set;for(let s of t(i)){let a=n.get(s);if(a)for(let c of a)c!==r&&o.add(c)}return[...o].sort((s,a)=>s-a)}}}function Ft(e){let t=mg(e.profile?.name),n=()=>{let i=[];t=mg(e.profile?.name,e);let r=(s,a)=>{let c=e.profiles[s],l=e.profiles[a];t.candidatePairs+=1,t.comparedPairs+=1;let d=e.compare(c,l);d&&i.push(d)};if(e.filePattern){let s=e.profiles.findIndex(a=>a.file.includes(e.filePattern));if(s>=0){let a=e.profiles[s];for(let c of HE(e,s)){let l=e.profiles[c];e.focusFiles&&!e.focusFiles.has(a.file)&&!e.focusFiles.has(l.file)||r(s,c)}}}else if(e.focusFiles?.size!==0){let s=typeof e.overrunFactor=="number"&&Number.isFinite(e.limit)?e.limit*e.overrunFactor:Number.POSITIVE_INFINITY;for(let a=0;a<e.profiles.length;a+=1){let c=e.profiles[a],l=e.focusFiles?.has(c.file)??!1;for(let d of VE(e,a))e.focusFiles&&!l&&!e.focusFiles.has(e.profiles[d].file)||r(a,d);if(i.length>s){t.overrunApplied=!0;break}}}i.sort(e.sort??((s,a)=>a.similarity-s.similarity)),t.matchedResults=i.length;let o=i.slice(0,e.limit);return t.emittedResults=o.length,e.onProfile?.({...t}),o};return e.profile?D(`pairwise-profile:${e.profile.name}`,n,()=>({...qE(e.profile?.metadata),...t})):n()}function HE(e,t){if(e.candidateIndex)return pg(e,t,-1);let n=[];for(let i=0;i<e.profiles.length;i+=1)i!==t&&n.push(i);return n}function VE(e,t){if(e.candidateIndex)return pg(e,t,t);let n=[];for(let i=t+1;i<e.profiles.length;i+=1)n.push(i);return n}function pg(e,t,n){let i=e.profiles[t],r=new Set;for(let o of e.candidateIndex?.candidatesFor(i,t,e.profiles)??[])o<=n||o!==t&&(o<0||o>=e.profiles.length||r.add(o));return[...r].sort((o,s)=>o-s)}function mg(e,t){return{pipeline:e,profileCount:t?.profiles.length??0,focusedProfileCount:t?.focusFiles?t.profiles.filter(n=>t.focusFiles.has(n.file)).length:0,candidatePairs:0,comparedPairs:0,matchedResults:0,emittedResults:0,candidateIndexApplied:t?.candidateIndex!==void 0,focusApplied:t?.focusFiles!==void 0,filePatternApplied:t?.filePattern!==void 0,overrunApplied:!1}}function qE(e){return typeof e=="function"?e():e??{}}function pl(e,t={}){let{minSimilarity:n=.5,limit:i=20,scope:r,filePattern:o}=t,s=t.minDeps??(o?1:3),{profiles:a,distinctiveDeps:c}=UE(e,{scope:r,minDeps:s}),l=Nt(a,d=>d.deps);return Ft({profiles:a,limit:i,filePattern:o,overrunFactor:5,candidateIndex:l,profile:{name:"similar-files"},compare:(d,u)=>WE(d,u,n,c)})}function UE(e,t){let{scope:n,minDeps:i}=t,r=ye(e,n),{universalDeps:o,distinctiveDeps:s}=zE(r),a=[];for(let[c,l]of r)l.size>=i&&a.push({file:c,deps:new Set([...l].filter(d=>!o.has(d)))});return{profiles:a,distinctiveDeps:s}}function zE(e){let t=new Set,n=new Set,i=e.size;if(i===0)return{universalDeps:t,distinctiveDeps:n};let r=new Map;for(let s of e.values())for(let a of s)r.set(a,(r.get(a)??0)+1);let o=Math.max(3,Math.ceil(i*.03));for(let[s,a]of r)a>=5&&a/i>.3?t.add(s):a<=o&&n.add(s);return{universalDeps:t,distinctiveDeps:n}}function WE(e,t,n,i){let r=new Set;for(let l of e.deps)t.deps.has(l)&&r.add(l);if(r.size<3||e.deps.size<4||t.deps.size<4)return null;let o=0;for(let l of r)i.has(l)&&o++;if(o<2)return null;let s=bn(e.deps,t.deps);if(s<n)return null;let a=[];for(let l of e.deps)t.deps.has(l)||a.push(l);let c=[];for(let l of t.deps)e.deps.has(l)||c.push(l);return{fileA:e.file,fileB:t.file,similarity:s,sharedDeps:[...r],uniqueToA:a,uniqueToB:c}}function Ps(e){let t=[],n=[],i=[];for(let l of e.primitiveGroups)l.values.length!==0&&fg(l.bucket,n,i).push(`${l.reasonPrefix}: ${l.values.join(", ")}`);for(let l of e.nameGroups)GE(l.names,l.label,e.genericWords,e.stripPrefixes??[],t,fg(l.fallbackBucket,n,i));let r=t.length>0,o=n.length>0,s=i.length>0,a=r?o||s?"mixed":"domain-behavior":s?"shared-abstraction":"generic-workflow-scaffolding";return{actionTier:a==="domain-behavior"||a==="mixed"?"signal":"support",evidenceClass:a,reasons:[...t,...i,...n].slice(0,6),recommendation:e.recommendation(a)}}function Is(e,t){if(e.size===0||t.size===0)return 0;let i=ct(e,t).size/Math.min(e.size,t.size);return Math.max(bn(e,t),i)}function G(e,t){return[...e].filter(n=>n.startsWith(t)).map(n=>n.slice(t.length)).sort()}function Te(e){return[...e].sort()}function GE(e,t,n,i,r,o){let s=[],a=[];for(let c of e)KE(c,i).filter(d=>!n.has(d)).length>0?s.push(c):a.push(c);s.length&&r.push(`${t} has domain term(s): ${s.slice(0,6).join(", ")}`),a.length&&o.push(`${t} is generic workflow: ${a.slice(0,6).join(", ")}`)}function KE(e,t){let n=e.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z0-9])([A-Z])/g,"$1 $2");for(let i of t)n=n.replace(i,"");return n.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function fg(e,t,n){return e==="generic"?t:n}function Gn(e,t={}){let{minSimilarity:n=.62,minTokens:i=8,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=tt(e).reactProfiles({scope:o,minJsxTokens:i,scanLimit:s}).filter(u=>u.kind==="component").map(u=>({file:u.file,component:u.name,tokens:u.jsxTokens,profile:u})),d=Nt(l,u=>u.tokens);return Ft({profiles:l,limit:r,filePattern:a,focusFiles:c,candidateIndex:d,profile:{name:"react-component-duplicates"},compare:(u,m)=>JE(u,m,n),sort:(u,m)=>m.similarity-u.similarity||u.fileA.localeCompare(m.fileA)||u.componentA.localeCompare(m.componentA)||u.fileB.localeCompare(m.fileB)||u.componentB.localeCompare(m.componentB)})}function JE(e,t,n){let i=ct(e.tokens,t.tokens);if(i.size<6||!XE(i))return null;let r=bn(e.tokens,t.tokens);return r<n?null:{fileA:e.file,componentA:e.component,fileB:t.file,componentB:t.component,similarity:r,sharedTokens:Te(i),sharedComponents:G(i,"component:"),sharedNativeTags:G(i,"native:"),sharedProps:G(i,"prop:"),sharedEvents:G(i,"event:"),sharedBindings:G(i,"binding:"),uniqueToA:Te(De(e.tokens,t.tokens)).slice(0,25),uniqueToB:Te(De(t.tokens,e.tokens)).slice(0,25),locA:e.profile.loc,locB:t.profile.loc}}function XE(e){let t=0,n=0;for(let i of e)i.startsWith("component:")&&(t+=1),(i.startsWith("prop:")||i.startsWith("event:")||i.startsWith("native:")||i.startsWith("jsx:"))&&(n+=1);return t>=1||n>=4}function Kn(e,t={}){let{minSimilarity:n=.45,minSharedBehaviors:i=6,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=tt(e).reactProfiles({scope:o,minBehaviorTokens:Math.max(3,i),scanLimit:s}).map(u=>({file:u.file,component:u.name,tokens:u.behaviorTokens,profile:u})),d=Nt(l,u=>u.tokens);return Ft({profiles:l,limit:r,filePattern:a,focusFiles:c,candidateIndex:d,profile:{name:"react-hook-candidates"},compare:(u,m)=>QE(u,m,n,i),sort:(u,m)=>m.similarity-u.similarity||u.fileA.localeCompare(m.fileA)||u.componentA.localeCompare(m.componentA)||u.fileB.localeCompare(m.fileB)||u.componentB.localeCompare(m.componentB)})}function QE(e,t,n,i){let r=ct(e.tokens,t.tokens);if(r.size<i||!eN(r))return null;let o=Is(e.tokens,t.tokens);if(o<n)return null;let s=G(r,"hook:"),a=G(r,"react-hook:"),c=G(r,"effect:"),l=G(r,"state:"),d=G(r,"request:"),u=G(r,"handler:"),m=G(r,"handler-verb:"),p=YE({sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:d,sharedHandlers:u,sharedHandlerVerbs:m});return{fileA:e.file,componentA:e.component,fileB:t.file,componentB:t.component,similarity:o,sharedTokens:Te(r),sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:d,sharedHandlers:u,sharedHandlerVerbs:m,evidenceClass:p.evidenceClass,actionTier:p.actionTier,evidenceClassReasons:p.reasons,recommendation:p.recommendation,uniqueToA:Te(De(e.tokens,t.tokens)).slice(0,25),uniqueToB:Te(De(t.tokens,e.tokens)).slice(0,25),reason:tN({sharedHooks:s,sharedReactHooks:a,sharedEffects:c,sharedState:l,sharedRequests:d,sharedHandlers:u,sharedHandlerVerbs:m}),locA:e.profile.loc,locB:t.profile.loc}}function YE(e){return Ps({genericWords:nN,stripPrefixes:iN,primitiveGroups:[{values:e.sharedReactHooks,reasonPrefix:"shared React primitives",bucket:"generic"},{values:e.sharedEffects,reasonPrefix:"shared lifecycle primitive",bucket:"generic"}],nameGroups:[{names:e.sharedHooks,label:"shared hook",fallbackBucket:"shared-abstraction"},{names:e.sharedRequests,label:"shared request",fallbackBucket:"generic"},{names:e.sharedState,label:"shared state",fallbackBucket:"generic"},{names:e.sharedHandlers,label:"shared handler",fallbackBucket:"generic"},{names:e.sharedHandlerVerbs,label:"shared action verb",fallbackBucket:"generic"}],recommendation:ZE})}function ZE(e){switch(e){case"domain-behavior":return"Review for a shared hook, controller, or feature module around the named domain behavior.";case"mixed":return"Separate generic React mechanics from domain-specific behavior before extracting a shared hook.";case"shared-abstraction":return"Review the existing shared hook usage first; extract only if duplicated behavior remains outside it.";case"generic-workflow-scaffolding":return"Treat as support evidence for a repeated workflow shape, not direct hook-extraction evidence."}}function eN(e){let t=0,n=0,i=0,r=0,o=0,s=0,a=0;for(let d of e)d.startsWith("hook:")?t+=1:d.startsWith("react-hook:")?n+=1:d.startsWith("effect:")?i+=1:d.startsWith("request:")?r+=1:d.startsWith("handler:")||d.startsWith("handler-verb:")?o+=1:d.startsWith("state:")?s+=1:d.startsWith("state-hook:")&&(a+=1);let c=s+a,l=t+n+i+r+o+c;return r>=1&&l>=4||t>=1&&(r>=1||s>=1||o>=2)&&l>=5||s>=1&&o>=2&&(i>=1||n>=2)&&l>=5}function tN(e){let t=[];return e.sharedHooks.length&&t.push(`shared hooks: ${e.sharedHooks.join(", ")}`),e.sharedReactHooks.length&&t.push(`shared React hooks: ${e.sharedReactHooks.join(", ")}`),e.sharedEffects.length&&t.push(`shared effects: ${e.sharedEffects.join(", ")}`),e.sharedState.length&&t.push(`shared state: ${e.sharedState.join(", ")}`),e.sharedRequests.length&&t.push(`shared requests: ${e.sharedRequests.join(", ")}`),e.sharedHandlers.length&&t.push(`shared handlers: ${e.sharedHandlers.slice(0,6).join(", ")}`),e.sharedHandlerVerbs.length&&t.push(`shared action verbs: ${e.sharedHandlerVerbs.slice(0,6).join(", ")}`),t.join("; ")||"shared React behavior profile"}var nN=new Set(["add","apply","async","callback","cancel","change","clear","close","create","data","delete","draft","edit","effect","error","fetch","filter","form","handle","has","is","item","items","load","loader","loading","memo","name","open","reducer","refresh","ref","remove","request","reset","resource","row","rows","save","saving","search","select","selected","state","store","submit","toggle","update","use","value"]),iN=[/^use(?=[A-Z])/,/^handle(?=[A-Z])/,/^is(?=[A-Z])/,/^has(?=[A-Z])/];function qr(e,t={}){let{minComponentLines:n=300,minFileLines:i=800,minJsxTokens:r=80,minBehaviorTokens:o=40,limit:s=20,scope:a,scanLimit:c,filePattern:l}=t;return tt(e).reactProfiles({scope:a,scanLimit:c}).filter(u=>u.kind==="component").filter(u=>!l||u.file.includes(l)||u.name.includes(l)).map(u=>rN(u,{minComponentLines:n,minFileLines:i,minJsxTokens:r,minBehaviorTokens:o})).filter(u=>u!==null).sort((u,m)=>m.componentLines-u.componentLines||m.fileLines-u.fileLines||u.file.localeCompare(m.file)).slice(0,s)}function rN(e,t){let n=[];e.loc>=t.minComponentLines&&n.push(`${e.loc} component line(s)`);let i=Math.max(80,Math.floor(t.minComponentLines/2));if(e.fileLines>=t.minFileLines&&e.loc>=i&&n.push(`${e.fileLines} file line(s)`),e.jsxTokens.size>=t.minJsxTokens&&n.push(`${e.jsxTokens.size} JSX structure token(s)`),e.behaviorTokens.size>=t.minBehaviorTokens&&n.push(`${e.behaviorTokens.size} behavior token(s)`),n.length===0)return null;let r=oN(e),o=sN(e,t,r),s=aN(e),a=cN(r,o,s);return{file:e.file,component:e.name,componentLines:e.loc,fileLines:e.fileLines,jsxTokens:e.jsxTokens.size,behaviorTokens:e.behaviorTokens.size,dominantPressure:r,pressureKinds:o,contextKind:s,recommendationKind:a,recommendation:lN(a,s),reasons:n,loc:e.loc}}function oN(e){let t=[{axis:"component",value:e.loc},{axis:"file",value:e.fileLines},{axis:"jsx-structure",value:e.jsxTokens.size*3},{axis:"hook-behavior",value:e.behaviorTokens.size*4}];return t.sort((n,i)=>i.value-n.value),t[0]?.axis??"component"}function sN(e,t,n){let i=[];e.loc>=t.minComponentLines&&i.push("component");let r=Math.max(80,Math.floor(t.minComponentLines/2));return e.fileLines>=t.minFileLines&&e.loc>=r&&i.push("file"),e.jsxTokens.size>=t.minJsxTokens&&i.push("jsx-structure"),e.behaviorTokens.size>=t.minBehaviorTokens&&i.push("hook-behavior"),[...new Set(i.length>0?i:[n])]}function aN(e){let t=e.file.split(/[\\/]+/).filter(Boolean),n=t.slice(0,-1).map(l=>l.toLowerCase()),i=(t.at(-1)??e.name).replace(/\.[^.]+$/,""),r=`${i} ${e.name}`.split(/[^A-Za-z0-9]+/).filter(Boolean).map(l=>l.toLowerCase()),o=n.findIndex(l=>dN.has(l)),s=o>=0&&n.slice(o+1).some(l=>uN.has(l)),a=gg(i)||gg(e.name);return/(?:Page|Route|Screen|View)$/.test(i)||/(?:Page|Route|Screen|View)$/.test(e.name)||r.some(l=>mN.has(l))||o>=0&&!s&&!a?"route-page":"component"}function gg(e){let t=e.split(/[^A-Za-z0-9]+/).filter(Boolean).map(n=>n.toLowerCase());return t.at(-1)&&hg.has(t.at(-1))?!0:[...hg].some(n=>e.endsWith(pN(n)))}function cN(e,t,n){return e==="hook-behavior"?"behavior-extraction":n==="route-page"?"route-page-decomposition":t.includes("hook-behavior")?"behavior-extraction":t.includes("jsx-structure")?"jsx-decomposition":t.includes("file")?"file-decomposition":e==="jsx-structure"?"jsx-decomposition":e==="file"&&!t.includes("component")?"file-decomposition":"component-decomposition"}function lN(e,t){switch(e){case"behavior-extraction":return"Extract independent state, effects, requests, or handlers into hooks, controllers, or feature modules.";case"route-page-decomposition":return"Split route/page orchestration from reusable panels and feature controllers.";case"jsx-decomposition":return t==="route-page"?"Split page JSX into named layout sections before extracting behavior.":"Split repeated JSX sections into named presentational components.";case"file-decomposition":return"Review file-level decomposition; split colocated panels or helpers before changing behavior.";case"component-decomposition":return"Review component boundaries around props, state ownership, and independently changing UI sections."}}var uN=new Set(["component","components","panel","panels","partial","partials"]),hg=new Set(["banner","button","card","dialog","drawer","filter","form","grid","header","item","list","menu","modal","nav","panel","picker","rail","row","section","selector","shell","sidebar","table","toolbar"]),dN=new Set(["landing","page","pages","route","routes","screen","screens","view","views"]),mN=new Set(["landing","page","route","screen","view"]);function pN(e){return e.charAt(0).toUpperCase()+e.slice(1)}function Jn(e,t={}){let{minSimilarity:n=.62,minTokens:i=8,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=fN(e,{scope:o,minTokens:i,scanLimit:s}),d=Nt(l,u=>u.tokens);return Ft({profiles:l,limit:r,filePattern:a,focusFiles:c,candidateIndex:d,profile:{name:"vue-component-duplicates"},compare:(u,m)=>hN(u,m,n),sort:(u,m)=>m.similarity-u.similarity||u.fileA.localeCompare(m.fileA)||u.fileB.localeCompare(m.fileB)})}function fN(e,t){return tt(e).vueProfiles({scope:t.scope,minTemplateTokens:t.minTokens,scanLimit:t.scanLimit}).map(n=>({file:n.file,tokens:n.templateTokens,loc:gN(n)}))}function gN(e){return e.totalLines}function hN(e,t,n){let i=ct(e.tokens,t.tokens);if(i.size<6||!yN(i))return null;let r=bn(e.tokens,t.tokens);return r<n?null:{fileA:e.file,fileB:t.file,similarity:r,sharedTokens:Te(i),sharedComponents:G(i,"component:"),sharedProps:G(i,"prop:"),sharedEvents:G(i,"event:"),sharedDirectives:G(i,"directive:"),sharedSlots:G(i,"slot:"),sharedIdentifiers:G(i,"id:"),uniqueToA:Te(De(e.tokens,t.tokens)).slice(0,25),uniqueToB:Te(De(t.tokens,e.tokens)).slice(0,25),locA:e.loc,locB:t.loc}}function yN(e){let t=0,n=0;for(let i of e)i.startsWith("component:")&&(t+=1),(i.startsWith("prop:")||i.startsWith("event:")||i.startsWith("directive:")||i.startsWith("slot:"))&&(n+=1);return t>=1||n>=3}function Xn(e,t={}){let{minSimilarity:n=.45,minSharedBehaviors:i=6,limit:r=20,scope:o,scanLimit:s,filePattern:a,focusFiles:c}=t,l=tt(e).vueProfiles({scope:o,minBehaviorTokens:Math.max(3,i),scanLimit:s}).map(u=>({file:u.file,tokens:u.behaviorTokens,profile:u})),d=Nt(l,u=>u.tokens);return Ft({profiles:l,limit:r,filePattern:a,focusFiles:c,candidateIndex:d,profile:{name:"vue-composable-candidates"},compare:(u,m)=>bN(u,m,n,i),sort:(u,m)=>m.similarity-u.similarity||u.fileA.localeCompare(m.fileA)||u.fileB.localeCompare(m.fileB)})}function bN(e,t,n,i){let r=ct(e.tokens,t.tokens);if(r.size<i||!CN(r))return null;let o=Is(e.tokens,t.tokens);if(o<n)return null;let s=G(r,"composable:"),a=G(r,"store:"),c=G(r,"reactivity:"),l=G(r,"lifecycle:"),d=G(r,"request:"),u=G(r,"function:"),m=G(r,"function-verb:"),p=G(r,"template-binding:"),f=G(r,"template-event:"),g=SN({sharedComposables:s,sharedStores:a,sharedReactivity:c,sharedLifecycle:l,sharedRequests:d,sharedFunctions:u,sharedFunctionVerbs:m,sharedBindings:p,sharedTemplateEvents:f});return{fileA:e.file,fileB:t.file,similarity:o,sharedTokens:Te(r),sharedComposables:s,sharedStores:a,sharedReactivity:c,sharedLifecycle:l,sharedRequests:d,sharedFunctions:u,sharedFunctionVerbs:m,sharedBindings:p,sharedTemplateEvents:f,evidenceClass:g.evidenceClass,actionTier:g.actionTier,evidenceClassReasons:g.reasons,recommendation:g.recommendation,uniqueToA:Te(De(e.tokens,t.tokens)).slice(0,25),uniqueToB:Te(De(t.tokens,e.tokens)).slice(0,25),reason:vN({sharedComposables:s,sharedStores:a,sharedRequests:d,sharedLifecycle:l,sharedFunctions:u,sharedFunctionVerbs:m,sharedBindings:p}),locA:e.profile.totalLines,locB:t.profile.totalLines}}function SN(e){return Ps({genericWords:RN,primitiveGroups:[{values:e.sharedReactivity,reasonPrefix:"shared reactivity primitive",bucket:"generic"},{values:e.sharedLifecycle,reasonPrefix:"shared lifecycle primitive",bucket:"generic"}],nameGroups:[{names:e.sharedComposables,label:"shared composable",fallbackBucket:"shared-abstraction"},{names:e.sharedStores,label:"shared store",fallbackBucket:"shared-abstraction"},{names:e.sharedRequests,label:"shared request",fallbackBucket:"generic"},{names:e.sharedFunctions,label:"shared function",fallbackBucket:"generic"},{names:e.sharedFunctionVerbs,label:"shared action verb",fallbackBucket:"generic"},{names:e.sharedBindings,label:"shared binding",fallbackBucket:"generic"},{names:e.sharedTemplateEvents,label:"shared template event",fallbackBucket:"generic"}],recommendation:xN})}function xN(e){switch(e){case"domain-behavior":return"Review for a shared composable, store, or feature module around the named domain behavior.";case"mixed":return"Separate generic Vue mechanics from domain-specific behavior before extracting a composable.";case"shared-abstraction":return"Review the existing composable/store usage first; extract only if duplicated behavior remains outside it.";case"generic-workflow-scaffolding":return"Treat as support evidence for a repeated workflow shape, not direct composable-extraction evidence."}}function CN(e){let t=0,n=0,i=0,r=0,o=0,s=0,a=0;for(let d of e)d.startsWith("composable:")?t+=1:d.startsWith("store:")?n+=1:d.startsWith("request:")?i+=1:d.startsWith("lifecycle:")?r+=1:d.startsWith("function:")?o+=1:d.startsWith("reactivity:")?s+=1:(d.startsWith("function-verb:")||d.startsWith("template-binding:")||d.startsWith("template-event:"))&&(a+=1);let c=t+n,l=c+i+r+o+a;return i>=1&&l>=4||r>=1&&o>=2&&l>=4||c>=2&&(i>=1||o>=2)&&l>=5||o>=2&&s>=1&&l>=4}function vN(e){let t=[];return e.sharedComposables.length&&t.push(`shared composables: ${e.sharedComposables.join(", ")}`),e.sharedStores.length&&t.push(`shared stores: ${e.sharedStores.join(", ")}`),e.sharedRequests.length&&t.push(`shared request helpers: ${e.sharedRequests.join(", ")}`),e.sharedLifecycle.length&&t.push(`shared lifecycle: ${e.sharedLifecycle.join(", ")}`),e.sharedFunctions.length&&t.push(`shared functions: ${e.sharedFunctions.slice(0,6).join(", ")}`),e.sharedFunctionVerbs.length&&t.push(`shared action verbs: ${e.sharedFunctionVerbs.slice(0,6).join(", ")}`),e.sharedBindings.length&&t.push(`shared template bindings: ${e.sharedBindings.slice(0,6).join(", ")}`),t.join("; ")||"shared Vue behavior profile"}var RN=new Set(["add","apply","cancel","change","clear","close","composable","create","data","delete","draft","edit","error","fetch","filter","form","item","items","load","loading","name","open","reactive","ref","refresh","remove","request","reset","resource","row","rows","save","saving","search","select","selected","store","submit","toggle","update","use","value","watch"]);function Ur(e,t={}){let{minTotalLines:n=800,minTemplateLines:i=300,minScriptLines:r=300,minStyleLines:o=500,limit:s=20,scope:a,scanLimit:c,filePattern:l}=t;return tt(e).vueProfiles({scope:a,scanLimit:c}).filter(u=>!l||u.file.includes(l)).map(u=>kN(u,{minTotalLines:n,minTemplateLines:i,minScriptLines:r,minStyleLines:o})).filter(u=>u!==null).sort((u,m)=>m.totalLines-u.totalLines||u.file.localeCompare(m.file)).slice(0,s)}function kN(e,t){let n=[];if(e.totalLines>=t.minTotalLines&&n.push(`${e.totalLines} total component line(s)`),e.templateLines>=t.minTemplateLines&&n.push(`${e.templateLines} template line(s)`),e.scriptLines>=t.minScriptLines&&n.push(`${e.scriptLines} script line(s)`),e.styleLines>=t.minStyleLines&&n.push(`${e.styleLines} style line(s)`),n.length===0)return null;let i=wN(e),r=PN(e,t,i),o=IN(e.file),s=LN(i,o);return{file:e.file,totalLines:e.totalLines,sfcLines:e.sfcLines,templateLines:e.templateLines,scriptLines:e.scriptLines,styleLines:e.styleLines,externalScriptLines:e.externalScriptLines,externalScriptPaths:e.externalScriptPaths,customBlockLines:e.customBlockLines,dominantPressure:i,pressureKinds:r,contextKind:o,recommendationKind:s,recommendation:DN(s,o),reasons:n,loc:e.totalLines}}function wN(e){let t=[{axis:"template",lines:e.templateLines},{axis:"script",lines:e.scriptLines-e.externalScriptLines},{axis:"style",lines:e.styleLines},{axis:"external-script",lines:e.externalScriptLines},{axis:"custom-block",lines:e.customBlockLines}];return t.sort((n,i)=>i.lines-n.lines),t[0]?.lines?t[0].axis:"total"}function PN(e,t,n){let i=[];return e.totalLines>=t.minTotalLines&&(i.push("total"),n!=="total"&&i.push(n)),e.templateLines>=t.minTemplateLines&&i.push("template"),e.scriptLines>=t.minScriptLines&&i.push("script"),e.styleLines>=t.minStyleLines&&i.push("style"),(e.externalScriptLines>=t.minScriptLines||n==="external-script")&&i.push("external-script"),e.customBlockLines>0&&n==="custom-block"&&i.push("custom-block"),[...new Set(i.length>0?i:[n])]}function IN(e){return e.toLowerCase().split(/[^a-z0-9]+/).filter(Boolean).some(i=>EN.has(i))||/(?:view|page|route)\.vue$/i.test(e)||/(?:^|\/)(views|pages|routes)\//i.test(e)?"route-page":"component"}function LN(e,t){return e==="style"?"style-decomposition":e==="template"?"template-decomposition":e==="external-script"?"external-script-boundary":e==="custom-block"?"custom-block-review":t==="route-page"?"route-page-decomposition":e==="script"?"script-behavior-extraction":"total-size-review"}function DN(e,t){switch(e){case"template-decomposition":return t==="route-page"?"Split route template sections into named panels before extracting script behavior.":"Split repeated template sections into named presentational components.";case"script-behavior-extraction":return"Extract independent script behavior into composables, controllers, or feature modules.";case"style-decomposition":return"Review UI/style decomposition; move repeated styling to component or style primitives, not composables.";case"external-script-boundary":return"Review the external script boundary and split controller/composable modules by workflow.";case"custom-block-review":return"Review custom block ownership before splitting template or script code.";case"route-page-decomposition":return"Split route/page orchestration from reusable panels and feature controllers.";case"total-size-review":return"Review the largest block first, then split by the dominant reason to change."}}var EN=new Set(["landing","page","pages","route","routes","view","views"]);function fl(e,t={}){let{minSimilarity:n=.5,limit:i=15,scope:r,minChainLength:o=3,maxChainLength:s=8}=t,a=ye(e,r),c=jN(a,o,s);if(c.length===0)return[];let l=NN(c);return l.length<2?[]:$N(_N(l,n,i),i)}function NN(e){let t=FN(e),n=[];for(let i of e){let r=i.filter(o=>!t.has(o));r.length>=2&&n.push({original:i,filtered:r})}return n}function FN(e){let{nodeFreq:t,tailFreq:n}=TN(e),i=e.length*.9,r=e.length*.8,o=new Set;for(let[a,c]of t)c>i&&o.add(a);for(let[a,c]of n)c>r&&o.add(a);let s=["index.ts","index.js","cli.ts","main.ts","health.ts","health.js"];for(let a of t.keys()){let c=a.split("/").pop()??"";s.includes(c)&&o.add(a)}return o}function TN(e){let t=new Map,n=new Map;for(let i of e){let r=new Set;for(let o of i)r.has(o)||(t.set(o,(t.get(o)??0)+1),r.add(o));for(let o=Math.max(0,i.length-2);o<i.length;o++)n.set(i[o],(n.get(i[o])??0)+1)}return{nodeFreq:t,tailFreq:n}}function _N(e,t,n){let i=[];for(let r=0;r<e.length;r++){for(let o=r+1;o<e.length;o++){let s=AN(e[r],e[o],t);s&&i.push(s)}if(i.length>n*10)break}return i.sort((r,o)=>Math.abs(o.similarity-r.similarity)>.01?o.similarity-r.similarity:r.divergencePoints.length-o.divergencePoints.length),i}function AN(e,t,n){if(!MN(e.filtered,t.filtered))return null;let{distance:i,ops:r}=ON(e.filtered,t.filtered),o=Math.max(e.filtered.length,t.filtered.length);if(o===0)return null;let s=1-i/o;if(s<n||i===0)return null;let a=r.filter(l=>l.type==="substitute").map(l=>({index:l.indexA,nodeA:e.filtered[l.indexA],nodeB:t.filtered[l.indexB]}));return a.length===0||r.filter(l=>l.type==="match").length<2?null:{chainA:e.original,chainB:t.original,similarity:s,editDistance:i,divergencePoints:a,commonPrefix:BN(e.original,t.original),commonSuffix:HN(e.original,t.original)}}function MN(e,t){let n=new Set(e);return t.some(i=>n.has(i))}function $N(e,t){let n=[];for(let i of e)if(n.some(o=>yg(i.chainA,o.chainA)&&yg(i.chainB,o.chainB))||n.push(i),n.length>=t)break;return n}function jN(e,t,n){let i=[];for(let o of e.keys()){if(i.length>=500)break;bg(e,o,[o],new Set([o]),t,n,i,500)}return i}function bg(e,t,n,i,r,o,s,a){if(s.length>=a)return;if(n.length>=o){n.length>=r&&s.push([...n]);return}let c=e.get(t);if(!c||c.size===0){n.length>=r&&s.push([...n]);return}let l=!1;for(let d of c)if(!i.has(d)&&(i.add(d),n.push(d),bg(e,d,n,i,r,o,s,a),n.pop(),i.delete(d),l=!0,s.length>=a))return;!l&&n.length>=r&&s.push([...n])}function ON(e,t){let n=e.length,i=t.length,r=Array.from({length:n+1},()=>Array(i+1).fill(0));for(let c=0;c<=n;c++)r[c][0]=c;for(let c=0;c<=i;c++)r[0][c]=c;for(let c=1;c<=n;c++)for(let l=1;l<=i;l++)e[c-1]===t[l-1]?r[c][l]=r[c-1][l-1]:r[c][l]=1+Math.min(r[c-1][l],r[c][l-1],r[c-1][l-1]);let o=[],s=n,a=i;for(;s>0||a>0;)s>0&&a>0&&e[s-1]===t[a-1]?(o.unshift({type:"match",indexA:s-1,indexB:a-1}),s--,a--):s>0&&a>0&&r[s][a]===r[s-1][a-1]+1?(o.unshift({type:"substitute",indexA:s-1,indexB:a-1}),s--,a--):a>0&&r[s][a]===r[s][a-1]+1?(o.unshift({type:"insert",indexA:s,indexB:a-1}),a--):(o.unshift({type:"delete",indexA:s-1,indexB:a}),s--);return{distance:r[n][i],ops:o}}function BN(e,t){let n=[];for(let i=0;i<Math.min(e.length,t.length)&&e[i]===t[i];i++)n.push(e[i]);return n}function HN(e,t){let n=[],i=e.length-1,r=t.length-1;for(;i>=0&&r>=0&&e[i]===t[r];)n.unshift(e[i]),i--,r--;return n}function yg(e,t){if(e.length>t.length)return!1;let n=t.join("\u2192"),i=e.join("\u2192");return n.includes(i)}function lt(e){let t=VN(e.profile?.name),n=()=>{let i=e.candidates(),r=e.filterCandidate?i.filter(e.filterCandidate):i,o=e.orderCandidates?[...r].sort(e.orderCandidates):r,s=qe(o,e.scanLimit);t={pipeline:e.profile?.name,loadedCandidates:i.length,filteredCandidates:r.length,scannedCandidates:s.length,evaluatedCandidates:0,matchedResults:0,emittedResults:0,scanLimitApplied:s.length<r.length,resultLimitApplied:!1};let a=e.prepare?.(s)??void 0,c=[];for(let d of s){t.evaluatedCandidates+=1;let u=e.evaluate(d,a);u&&c.push(u)}t.matchedResults=c.length,e.orderResults&&c.sort(e.orderResults);let l=typeof e.limit=="number"?c.slice(0,e.limit):c;return t.emittedResults=l.length,t.resultLimitApplied=l.length<c.length,e.onProfile?.({...t}),l};return e.profile?D(`candidate-pipeline:${e.profile.name}`,n,()=>({...qN(e.profile?.metadata),...t})):n()}function VN(e){return{pipeline:e,loadedCandidates:0,filteredCandidates:0,scannedCandidates:0,evaluatedCandidates:0,matchedResults:0,emittedResults:0,scanLimitApplied:!1,resultLimitApplied:!1}}function qN(e){return typeof e=="function"?e():e??{}}function Qn(e,t={}){let{scope:n,minLoc:i=10,minCallees:r=6,limit:o=20,scanLimit:s}=t,a=new A(e);return lt({candidates:()=>a.productionCallableDefinitions({scope:n,minLoc:i,excludeTypesFiles:!0,requireFunctionLikeSymbol:!0,sortByLocDesc:!0}),scanLimit:s,profile:{name:"extract-candidates"},prepare:c=>a.calleeMap(c,{semantic:t.semantic!==!1}),evaluate:(c,l)=>UN(c,l.get(c.symbolId)??[],r),orderResults:(c,l)=>l.clusters.length-c.clusters.length||l.loc-c.loc,limit:o})}function UN(e,t,n){let i=new Set(t.map(l=>l.symbol));if(i.size<n)return null;let r=JN(i,t),o=XN(i,r);if(o.length<2)return null;let s=QN(o,r);if(s.length===0)return null;let a=v(e.symbol),c=zN(a,i.size,o.length,s);return{symbol:e.symbol,shortName:a,relativePath:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:J(e),totalCallees:i.size,extractionKind:c.extractionKind,actionTier:"signal",evidenceReasons:c.evidenceReasons,recommendation:c.recommendation,clusters:s}}function zN(e,t,n,i){let r=Math.max(...i.map(c=>c.callees.length)),o=Math.max(...i.map(c=>c.isolation)),s=[`${t} distinct callees across ${n} co-occurrence cluster(s)`,`${i.length} extractable cluster(s) passed size and isolation thresholds`,`largest extractable cluster has ${r} callees at ${Math.round(o*100)}% isolation`],a=WN(e,t,n);return a!==null?{extractionKind:"workflow-orchestration",evidenceReasons:[...s,a],recommendation:"Review the isolated helper group as a possible private or feature-local helper, but keep the orchestration sequence together when it preserves the workflow."}:r>=6?{extractionKind:"broad-helper-cluster",evidenceReasons:[...s,"one isolated helper group is broad enough to deserve a named review"],recommendation:"Review whether the broad helper cluster has a stable concept name before extracting it; avoid creating a bag-of-helpers abstraction."}:{extractionKind:"cohesive-helper-cluster",evidenceReasons:s,recommendation:"Review the isolated callee group as a possible same-file or feature-local helper; extract only if the new name preserves the current behavior."}}function WN(e,t,n){if(t>=10)return`callee breadth suggests orchestration: ${t} callees`;if(n>=4)return`multiple disconnected callee groups suggest orchestration: ${n} groups`;let i=GN(e);return KN.has(i)?`caller verb suggests orchestration: ${i}`:null}function GN(e){return e.split(":").pop()?.replace(/\(\)$/,"").replace(/[^A-Za-z0-9_]/g,"").replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[_\s-]+/).filter(Boolean)[0]?.toLowerCase()??""}var KN=new Set(["apply","build","check","collect","create","diff","execute","find","handle","load","prepare","process","render","resolve","run","select","sync","update","validate","verify","write"]);function JN(e,t){let n=new Map;for(let r of e)n.set(r,new Set);let i=new Map;for(let r of t){let o=i.get(r.chunkId);o||(o=new Set,i.set(r.chunkId,o)),o.add(r.symbol)}for(let r of i.values()){let o=[...r];for(let s=0;s<o.length;s++)for(let a=s+1;a<o.length;a++)n.get(o[s]).add(o[a]),n.get(o[a]).add(o[s])}return n}function XN(e,t){let n=new Set,i=[];for(let r of e){if(n.has(r))continue;let o=new Set,s=[r];for(;s.length>0;){let a=s.pop();if(!n.has(a)){n.add(a),o.add(a);for(let c of t.get(a)??[])n.has(c)||s.push(c)}}i.push(o)}return i}function QN(e,t){return e.filter(n=>n.size>=3).map(n=>YN(n,e,t)).filter(n=>n.isolation>.5).sort((n,i)=>i.isolation-n.isolation)}function YN(e,t,n){let i=new Set;for(let a of t)if(a!==e)for(let c of a)i.add(c);let r=0;for(let a of e)for(let c of n.get(a)??[])i.has(c)&&r++;let o=e.size*i.size,s=o>0?1-r/o:1;return{callees:[...e].map(v),isolation:s}}import{posix as qi}from"path";var ZN=W("definition-consumer-file-usage",{clearGroups:["whole-project","source-file"]}),Sg=pe({kind:"consumer-file-usage",serialize:oF,deserialize:sF});function Yn(e,t){return{forDefinitions(n,i){return eF(e,t,n,i)}}}function Yt(e){let t=new Map;for(let[n,i]of e)t.set(n,new Set(i.files.map(r=>r.file)));return t}function Ls(e,t,n){return Cg(e,t,n).partition}function eF(e,t,n,i){let r=xg(n.length);return D("consumer-evidence.product",()=>{let o=tF(e,t,n,i),s=new Map;r={...r,...o.counters};for(let a of n){let c=o.sources.get(a.symbolId)??new Map,l=Cg(e,a,[...c.keys()],c);r.realFiles+=l.partition.realConsumers.length,r.reexportOnlyFiles+=l.partition.barrelConsumers,r.importOnlyFiles+=l.partition.importOnlyConsumers,s.set(a.symbolId,{definition:a,files:l.files,...l.partition})}return s},()=>({...r}))}function xg(e){return{definitions:e,indexedFiles:0,semanticFiles:0,fallbackFiles:0,totalFiles:0,realFiles:0,reexportOnlyFiles:0,importOnlyFiles:0}}function tF(e,t,n,i){let r=xg(n.length),o=new Map;return gl(o,r,"indexed",t.crossFileCallerMap(n,{semantic:!1})),i.semantic&&gl(o,r,"semantic",st(e,n)),i.sourceFallback!==!1&&gl(o,r,"source-fallback",t.sourceFallbackCallerFiles(n)),r.totalFiles=[...o.values()].reduce((s,a)=>s+a.size,0),{sources:o,counters:r}}function gl(e,t,n,i){let r=0;for(let[o,s]of i){let a=e.get(o);a||(a=new Map,e.set(o,a));for(let c of s){r++;let l=a.get(c)??new Set;l.add(n),a.set(c,l)}}n==="indexed"?t.indexedFiles+=r:n==="semantic"?t.semanticFiles+=r:t.fallbackFiles+=r}function Cg(e,t,n,i=new Map){let r=[],o=0,s=0,a=$(t.symbol),c=[];for(let l of n){let d;aF(e,l,t.relativePath,a)?(o++,d="reexport-only"):hl(e,l,a)?(s++,d="import-only"):(r.push(l),d="real"),c.push({file:l,sources:[...i.get(l)??[]],classification:d})}return{partition:{realConsumers:r,barrelConsumers:o,importOnlyConsumers:s},files:c}}function hl(e,t,n){if(!n)return!1;let i=H(t);if(!i)return!1;let r=ZN.get(e,t,()=>nF(e,t,i));return r.importedLeaves.has(n)&&!r.usedLeaves.has(n)}function nF(e,t,n){let i=gt(e).forFile(t,{text:!0,ast:!0}),r=i.text;if(!r)return rF();let o=re(e,t,r),s=Sg.read(e,t,o);if(s)return s;let a=iF(i.ast,n);return Sg.write(e,t,o,a),a}function iF(e,t){let n=new Set,i=new Set;if(!e)return{importedLeaves:n,usedLeaves:i};let r=t==="rust"?new Set(["use_declaration"]):t==="python"?new Set(["import_statement","import_from_statement"]):new Set(["import_statement"]),o=(s,a)=>{let c=a||r.has(s.type);(s.type==="identifier"||s.type==="type_identifier"||s.type==="property_identifier"||s.type==="field_identifier")&&(c?n.add(s.text):i.add(s.text));for(let l of s.children)o(l,c)};return o(e.rootNode,!1),{importedLeaves:n,usedLeaves:i}}function rF(){return{importedLeaves:new Set,usedLeaves:new Set}}function oF(e){return JSON.stringify({importedLeaves:[...e.importedLeaves],usedLeaves:[...e.usedLeaves]})}function sF(e){try{let t=JSON.parse(e);return!Array.isArray(t.importedLeaves)||!Array.isArray(t.usedLeaves)?null:{importedLeaves:new Set(t.importedLeaves.filter(n=>typeof n=="string")),usedLeaves:new Set(t.usedLeaves.filter(n=>typeof n=="string"))}}catch{return null}}function aF(e,t,n,i){if(!i)return!1;let r=gt(e).forFile(t,{lines:!0,reexports:!0}),o=r.lines??[];if(o.length===0)return!1;let s=r.reexports??[];if(s.length===0)return!1;let a=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`\\b${a}\\b`),l=0;for(let d=0;d<o.length;d++){if(!c.test(o[d]??""))continue;if(l++,!s.find(m=>m.startLine<=d&&d<=m.endLine))return!1}return l>0}var cF=20,lF=1,uF=new Map([["app","app"],["apps","app"],["component","component"],["components","component"],["composable","composable"],["composables","composable"],["contract","contract"],["contracts","contract"],["domain","domain"],["domains","domain"],["feature","feature"],["features","feature"],["hook","hook"],["hooks","hook"],["lib","library"],["module","module"],["modules","module"],["package","package"],["packages","package"],["page","page"],["pages","page"],["route","route"],["routes","route"],["screen","screen"],["screens","screen"],["service","service"],["services","service"],["shared","shared"],["src","source-root"],["store","state"],["stores","state"],["test","test"],["tests","test"],["util","utility"],["utils","utility"],["view","view"],["views","view"]]),dF=new Set(["components","contracts","hooks","lib","services","shared","stores","utils"]),mF=new Set(["access","api","auth","config","db","effect","errors","hooks","lib","middleware","permissions","routes","schemas","servicetasks","services","startup","store","stores","test-utils","repository","repositories","tests","types","ui","utils","workflow","workflows"]);function xl(e,t={}){let n=Sl(t.limit,cF),i=Sl(t.minConsumers,lF),r=new A(e),o=r.fileDependencyGraph(t.scope),s=FF(O(e,{includeIgnored:!1})),a=AF(e.config.locality?.architecturalBoundarySegments,t.architecturalBoundarySegments);return(t.target?pF(e,r,t.target):fF(e,t.scope,t.scanLimit)).map(d=>gF(e,r,o,d,t,s,a)).filter(d=>d.consumerFiles.length>=i||t.target).sort(NF).slice(0,n)}function pF(e,t,n){let i=bF(e,n);if(i)return[Pg(i)];let r=q(e,n);if(!r)return[];let o=t.definitionsForFile(r.relativePath).find(s=>s.symbolId===r.symbolId);return o?[SF(o)]:[{unit:{kind:"symbol",file:r.relativePath,shortName:v(r.symbol),symbol:r.symbol,startLine:r.startLine,endLine:r.endLine}}]}function fF(e,t,n){let i=O(e,{scope:t,includeIgnored:!1}),r=Sl(n,i.length);return i.slice(0,r).map(o=>Pg(o))}function gF(e,t,n,i,r,o,s){let a=i.definition?hF(e,t,i.definition,r.semantic):yF(n,i.unit.file),c=i.definition?a.length>0?"exact":"none":a.length>0?"file-level":"none",l=i.unit.file,d=yt(qi.dirname(l)),u=CF(a),m=xF(d),p=Rl([...vg(d),...u?vg(u):[]]),f=vF(i.unit,d,u,a),g=RF(f,i.unit,d,u,a,o,s),b=LF(i.unit,c,u,a,d,g.whyNoSuggestedHome),x=DF(i.unit,d,u,a,g.suggestedHome,g.whyNoSuggestedHome);return{actionTier:"signal",sourceUnit:i.unit,candidatePath:l,currentDirectory:d,directoryAncestry:m,consumerFiles:a,consumerCoverage:c,nearestCommonOwner:u,boundaryMarkers:p,recommendedTier:f,suggestedHome:g.suggestedHome,destinationConfidence:g.confidence,whyNoSuggestedHome:g.whyNoSuggestedHome,counterevidence:b,reasons:x,recommendation:EF(f,g.suggestedHome,c)}}function hF(e,t,n,i){let r=Yt(Yn(e,t).forDefinitions([n],{semantic:i!==!1,sourceFallback:!0}));return Ng(r.get(n.symbolId)??[])}function yF(e,t){let n=[];for(let[i,r]of e.entries())i!==t&&r.has(t)&&n.push(i);return Ng(n)}function bF(e,t){let n=vl(t),i=O(e,{includeIgnored:!1}),r=i.find(s=>s===n);if(r)return r;let o=i.find(s=>s.endsWith(`/${n}`));return o||(i.find(s=>s.includes(n))??null)}function SF(e){return{definition:e,unit:{kind:"symbol",file:e.relativePath,shortName:v(e.symbol),symbol:e.symbol,startLine:e.startLine,endLine:e.endLine}}}function Pg(e){return{unit:{kind:"file",file:e,shortName:qi.basename(e)}}}function xF(e){if(e===".")return[{path:".",depth:0,markers:[]}];let t=[],n=e.split("/").filter(Boolean);for(let i=0;i<n.length;i+=1){let r=n.slice(0,i+1).join("/");t.push({path:r,depth:i,markers:Cl(r)})}return t}function vg(e){return e==="."?[]:Ig(e).map(({marker:t,prefix:n})=>`${t}: ${n}`)}function Cl(e){return Rl(Ig(e).map(({marker:t})=>t))}function Ig(e){let t=e.split("/").filter(Boolean),n=[];for(let i=0;i<t.length;i+=1){let r=uF.get(t[i]);r&&n.push({marker:r,prefix:t.slice(0,i+1).join("/")})}return n}function CF(e){if(e.length===0)return null;let t=e.map(i=>yt(qi.dirname(i))),n=t[0].split("/").filter(Boolean);for(let i of t.slice(1)){let r=i.split("/").filter(Boolean),o=[],s=Math.min(n.length,r.length);for(let a=0;a<s&&n[a]===r[a];a+=1)o.push(n[a]);n=o}return n.length===0?".":n.join("/")}function vF(e,t,n,i){return n?e.kind==="symbol"&&i.length===1?i[0]===e.file?"same-file":"sibling-folder":n==="."||n==="src"?"repository-level-review":kg(n,"package")?"package-level-shared":kg(n,"app")?"app-level-shared":wg(n,["feature","domain","module"])||wg(t,["feature","domain","module"])?"feature-local-shared":"sibling-folder":"no-exact-consumers"}function RF(e,t,n,i,r,o,s){let a=kF(e,i);if(a)return Sn(a);let c=TF(t.file),l=wF(e,n,c,r,s);if(l)return l;let d=i;if(yt(n)===yt(d))return Sn(`${n} is already the nearest common owner for its consumers.`);let u=PF(d,n,c,s);return u||IF(d,n,c,o,s)}function kF(e,t){return t?e==="no-exact-consumers"||e==="repository-level-review"?"The inferred owner is too broad or unsupported for an exact destination.":null:"No consumer owner could be inferred from the current index."}function wF(e,t,n,i,r){if(e==="same-file"){let o=i[0]??null;return o?yl(o):Sn("No same-file consumer path was available.")}if(e==="sibling-folder"&&i.length===1){let o=yt(qi.dirname(i[0])),s=Eg(t,n,o,r);return s?Sn(s):yl(o)}return null}function PF(e,t,n,i){return $F(e)?Lg(e,t,n,i,`Nearest shared owner ${e} is outside source root ${n}.`):null}function IF(e,t,n,i,r){if(e===".")return Sn("The nearest common owner is the repository root.");let o=`${e}/shared`,s=Lg(o,t,n,r,`Proposed home ${o} is outside source root ${n}.`);return s.confidence==="withheld"||i.has(o)?s:Sn(`${o} does not exist in the indexed project.`)}function Lg(e,t,n,i,r){if(!Dg(e,n))return Sn(r);let o=Eg(t,n,e,i);return o?Sn(o):yl(e)}function yl(e){return{suggestedHome:e,confidence:"exact",whyNoSuggestedHome:null}}function Sn(e){return{suggestedHome:null,confidence:"withheld",whyNoSuggestedHome:e}}function LF(e,t,n,i,r,o){let s=["Report-only signal; review ownership before moving files."];return t==="none"&&s.push("No consumers were found in the current index."),t==="file-level"&&s.push("File-level import evidence can hide which exported unit is actually used."),(n==="."||n==="src")&&s.push("Nearest common owner is broad, so this is not enough evidence for automatic placement."),i.length===1&&s.push("Only one consumer was found; inlining or same-folder placement may be better than shared extraction."),e.kind==="file"&&s.push("File targets describe module locality, not symbol-level usage."),n&&r.startsWith(`${n}/`)&&s.push("Candidate already lives under the nearest common owner."),o&&s.push(`No exact suggested home: ${o}`),s}function DF(e,t,n,i,r,o){let s=[];return s.push(`${e.shortName} currently lives in ${t}.`),n?s.push(`${i.length} consumer file(s) share ${n} as their nearest common owner.`):s.push("No consumer owner could be inferred from the current index."),r?s.push(`Suggested home is ${r}.`):o&&s.push(`No exact suggested home: ${o}`),s}function EF(e,t,n){return e==="no-exact-consumers"?"Review references before moving; no consumers were found.":e==="repository-level-review"?"Keep this as a broad locality signal; the inferred owner is too general for automatic relocation.":t?`Review whether ${n==="exact"?"symbol usage":"module import"} supports moving or extracting toward ${t}.`:"Review ownership manually before changing structure."}function NF(e,t){return Rg(t)-Rg(e)||e.candidatePath.localeCompare(t.candidatePath)}function Rg(e){let t=e.consumerFiles.length*10;return e.consumerCoverage==="exact"&&(t+=5),e.suggestedHome&&(t+=3),e.recommendedTier==="repository-level-review"&&(t-=8),e.recommendedTier==="no-exact-consumers"&&(t-=12),t}function FF(e){let t=new Set(["."]);for(let n of e){let i=yt(qi.dirname(n));for(;!t.has(i)&&(t.add(i),i!==".");)i=yt(qi.dirname(i))}return t}function TF(e){let t=bl(e),n=t.indexOf("src");return n>=0?t.slice(0,n+1).join("/"):t.length<=1?".":t[0]}function Dg(e,t){let n=yt(e),i=yt(t);return i==="."||n===i||n.startsWith(`${i}/`)}function _F(e,t,n){let i=bl(e),r=bl(t);return(Dg(e,t)?i.slice(r.length):i).some(s=>n.has(s.toLowerCase()))}function Eg(e,t,n,i){return yt(e)===yt(n)||!_F(e,t,i)?null:`${e} is a named architectural boundary; an exact move to ${n} needs human design.`}function AF(...e){let t=new Set(mF);for(let n of e)for(let i of n??[]){let r=MF(i);r&&t.add(r)}return t}function MF(e){let t=e.trim().toLowerCase();return t===""?null:t}function kg(e,t){return Cl(e).includes(t)}function wg(e,t){let n=Cl(e);return t.some(i=>n.includes(i))}function $F(e){let t=e.split("/").filter(Boolean),n=t[t.length-1];return n?dF.has(n):!1}function vl(e){return e.replaceAll("\\","/").replace(/^\.\//,"")}function yt(e){let t=vl(e);return t===""?".":t}function bl(e){let t=vl(e);return t==="."?[]:t.split("/").filter(Boolean)}function Sl(e,t){return!Number.isFinite(e)||e===void 0||e<1?t:Math.floor(e)}function Ng(e){return Rl([...e]).sort((t,n)=>t.localeCompare(n))}function Rl(e){return[...new Set(e)]}function zr(e,t,n={}){let{maxDepth:i=5,scope:r}=n,o=q(e,t);if(!o)return[];let s=[],a=new Set([o.symbolId]),c=new Set,l=[o];for(let d=1;d<=i&&l.length!==0;d++){let u=[];for(let m of l)for(let p of jF(e,m,r)){let f=`${p.file}|${p.shortName}`;if(p.symbolId!==null){if(a.has(p.symbolId))continue;a.add(p.symbolId)}else if(c.has(f))continue;c.add(f),s.push({symbol:p.symbol,shortName:p.shortName,file:p.file,depth:d}),p.symbolId!==null&&p.symbolMatch&&u.push(p.symbolMatch)}l=u}return s.sort((d,u)=>d.depth-u.depth||d.file.localeCompare(u.file)),s}function jF(e,t,n){let i=at(e,t,{limit:500}).filter(l=>!e.isIgnored(l.file)).filter(l=>!n||l.file.includes(n)),r=new Set(i.map(l=>l.file)),o=[];for(let l of OF(e,t,n)){if(r.has(l))continue;let d=Q(e,l),u=d.length>0?ot(d,d[0].startLine):null;o.push({symbol:u?.symbol??l,file:l})}let s=[...i,...o],a=[],c=new Set;for(let l of s){let d=Ni(e,l.symbol);if(!d){let m=`${l.file}|${l.symbol}`;if(c.has(m))continue;c.add(m),a.push({symbolId:null,symbol:l.symbol,shortName:v(l.symbol),file:l.file,symbolMatch:null});continue}if(d.symbolId===t.symbolId||e.isIgnored(d.relativePath)||!BF(d))continue;let u=`${d.symbolId}|${d.relativePath}`;c.has(u)||(c.add(u),a.push({symbolId:d.symbolId,symbol:d.symbol,shortName:v(d.symbol),file:d.relativePath,symbolMatch:d}))}return a}function OF(e,t,n){let i=n?"AND consumer_d.relative_path LIKE ?":"",r=[t.symbolId,t.documentId];return n&&r.push(`%${n}%`),new Set(e.all(`SELECT DISTINCT consumer_d.relative_path
|
|
546
566
|
FROM mentions m
|
|
547
567
|
JOIN chunks c ON m.chunk_id = c.id
|
|
548
568
|
JOIN documents consumer_d ON consumer_d.id = c.document_id
|
|
@@ -550,50 +570,50 @@ ${m}`,l+=1+m.length,u+=sr(m),i+=m.length+1}let d=MR(c);d&&n.push({...d,start:a,e
|
|
|
550
570
|
AND m.role != 1
|
|
551
571
|
AND c.document_id != ?
|
|
552
572
|
${e.pathExclusionsFor("consumer_d")}
|
|
553
|
-
${i}`,...r).map(o=>o.relative_path).filter(o=>!e.isIgnored(o)))}function
|
|
573
|
+
${i}`,...r).map(o=>o.relative_path).filter(o=>!e.isIgnored(o)))}function BF(e){if(e.symbol.startsWith("scip-clojure ")||H(e.relativePath)==="clojure")return!0;let t=se(e.symbol);return t==="method"||t==="type"||e.symbol.endsWith("().")}function Wr(e,t,n={}){let i=Ve(e,t);if(!i)return null;let r=HF(e,i);if(!r||e.isIgnored(r.relative_path))return null;let o=[],s=0,a=VF(e,r.relative_path),c=n.semantic===!1?new Map:st(e,a);for(let l of a){let d=qF(e,r,l,c.get(l.symbolId)??new Set);s+=d,o.push({symbol:l.symbol,shortName:v(l.symbol),startLine:l.startLine,endLine:l.endLine,externalConsumers:d,riskLevel:UF(d)})}return{file:r.relative_path,symbols:o,totalExternalConsumers:s}}function HF(e,t){return e.get(`SELECT id, relative_path FROM documents
|
|
554
574
|
WHERE relative_path = ?
|
|
555
575
|
${e.pathExclusionsFor("documents")}
|
|
556
|
-
LIMIT 1`,t)??null}function
|
|
576
|
+
LIMIT 1`,t)??null}function VF(e,t){return new A(e).definitionsForFile(t).sort((n,i)=>n.startLine-i.startLine||n.endLine-i.endLine)}function qF(e,t,n,i){let r=e.all(`SELECT DISTINCT consumer_d.relative_path
|
|
557
577
|
FROM mentions m
|
|
558
578
|
JOIN chunks c ON m.chunk_id = c.id
|
|
559
579
|
JOIN documents consumer_d ON consumer_d.id = c.document_id
|
|
560
580
|
WHERE m.symbol_id = ?
|
|
561
581
|
AND m.role != 1
|
|
562
|
-
AND c.document_id != ?`,n.symbolId,t.id);return new Set([...r.map(o=>o.relative_path),...[...i].filter(o=>o!==t.relative_path)]).size}function
|
|
582
|
+
AND c.document_id != ?`,n.symbolId,t.id);return new Set([...r.map(o=>o.relative_path),...[...i].filter(o=>o!==t.relative_path)]).size}function UF(e){return e>10?"high":e>0?"medium":"low"}function Ds(e,t={}){let{scope:n,minLoc:i=1,maxDepth:r=5,scanLimit:o}=t,s=new A(e),a=zF(e,n,i,o),c=new kl;for(let g of a)c.add(g);let l=[],d=[];a.length>0&&l.push(Fg(e,0,a,c));let u=a.map(g=>g.definition).filter(g=>g!==null),m=new Set(a.map(g=>g.symbol));for(let g=1;g<=r&&u.length>0;g++){let b=s.calleeMap(u,{semantic:!1}),x=new Set;for(let R of u)for(let C of b.get(R.symbolId)??[])m.has(C.symbol)||x.add(C.symbol);let S=[];for(let R of x){m.add(R);let C=Tg(e,R);if(!C||e.isIgnored(C.relativePath)||Oe(e,C.relativePath)||be(e,C.symbol,C.relativePath)||s.fileKind(C.relativePath)==="test"||s.hasSuppressionComment(C))continue;let y=GF(e,C,c);y.removable?S.push(WF(C,"cascade")):y.blockingFiles.length>0&&d.push({shortName:v(C.symbol),file:C.relativePath,blockingFiles:y.blockingFiles.slice(0,3)})}if(S.length===0)break;for(let R of S)c.add(R);l.push(Fg(e,g,S,c)),u=S.map(R=>R.definition).filter(R=>R!==null)}let p=l.reduce((g,b)=>g+b.loc,0),f=l.reduce((g,b)=>g+b.entries.length,0);return{batches:l,totalSymbols:f,totalLoc:p,blocked:d}}function zF(e,t,n,i){let r=Qt(e,{scope:t,minLoc:n,skipBarrels:!0,deadCodeOnly:!0,scanLimit:i,semantic:!1}),o=[];for(let s of r.symbols)s.kind==="dead-code"&&(Oe(e,s.relativePath)||be(e,s.symbol,s.relativePath)||o.push({symbol:s.symbol,shortName:s.shortName,file:s.relativePath,startLine:s.startLine,endLine:s.endLine,loc:s.loc,evidence:"graph-fact",definition:Tg(e,s.symbol)}));return o}function WF(e,t){return{symbol:e.symbol,shortName:v(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:e.endLine-e.startLine+1,evidence:t,definition:e}}function Tg(e,t){let n=e.get(`SELECT d.relative_path
|
|
563
583
|
FROM global_symbols gs
|
|
564
584
|
JOIN defn_enclosing_ranges der ON der.symbol_id = gs.id
|
|
565
585
|
JOIN documents d ON d.id = der.document_id
|
|
566
586
|
WHERE gs.symbol = ?
|
|
567
|
-
LIMIT 1`,t);return n?Q(e,n.relative_path).find(i=>i.symbol===t)??null:null}function
|
|
568
|
-
`).map(i=>i.trim()).filter(i=>i!==""))}catch{return null}})}var
|
|
587
|
+
LIMIT 1`,t);return n?Q(e,n.relative_path).find(i=>i.symbol===t)??null:null}function GF(e,t,n){let i=Vn(e,t);if(i.length===0)return{removable:!1,blockingFiles:[]};let r=new Set;for(let o of i)o.file===t.relativePath&&o.line>=t.startLine&&o.line<=t.endLine||n.contains(o.file,o.line)||r.add(o.file);return{removable:r.size===0,blockingFiles:[...r]}}function Fg(e,t,n,i){let r=[...n].sort((a,c)=>a.file.localeCompare(c.file)||a.startLine-c.startLine),o=new Set(r.map(a=>a.file)),s=[];for(let a of o){let c=Q(e,a);c.length>0&&c.every(l=>i.contains(a,l.startLine))&&s.push(a)}return{depth:t,entries:r.map(({definition:a,...c})=>c),loc:r.reduce((a,c)=>a+c.loc,0),filesEmptied:s.sort()}}var kl=class{ranges=new Map;add(t){let n=this.ranges.get(t.file)??[];n.push({start:t.startLine,end:t.endLine}),this.ranges.set(t.file,n)}contains(t,n){let i=this.ranges.get(t);return i?i.some(r=>n>=r.start&&n<=r.end):!1}};import{createHash as kA}from"crypto";import{existsSync as xh}from"fs";import{execFileSync as KF}from"child_process";var Es=2e3,Ns=50,JF=64,XF=8,QF=3,YF=2160*60*60,ZF=/\b(?:fix(?:es|ed)?|bug|regression|hotfix)\b/i,eT=3,tT=/#\d+|\b[A-Z][A-Z0-9]+-\d+\b/g,nT=/^([a-z][a-z0-9-]+)(?:\([^)]+\))?!?:/i;function wl(e){let t=ie(e,{clearGroups:["whole-project"]});return(n,i)=>{let r=Pl(n.config.projectRoot);if(!r)return null;let o=t.has(n)?t.get(n,()=>({head:"",value:null})):null;return o&&o.head===r?o.value:(t.invalidate(n),t.get(n,()=>({head:r,value:i(n.config.projectRoot,r)})).value)}}function $g(e){let t=ie(e,{clearGroups:["whole-project"]});return(n,i,r)=>{let o=Pl(n.config.projectRoot);if(!o)return null;let s=t.has(n)?t.get(n,()=>({head:"",values:new Map})):null;(!s||s.head!==o)&&t.invalidate(n);let a=t.get(n,()=>({head:o,values:new Map}));if(a.values.has(i))return a.values.get(i)??null;let c=r(n.config.projectRoot,o);return a.values.set(i,c),c}}var iT=wl("git-commit-history");function Xe(e){return{capability:t=>rT(e,t),commitHistory:()=>Gr(e),fileChurn:()=>aT(e),changeAmplification:()=>cT(e),trackedFiles:()=>uT(e),fileAddRecords:()=>mT(e),coChangePairs:(t={})=>bT(e,t),coChangePairsForFiles:(t,n={})=>Og(e,t,n),directionalCoChangePairsForFiles:(t,n={})=>ST(e,t,n)}}function Gr(e){return iT(e,oT)}function rT(e,t){let n=Pl(e.config.projectRoot);return n?{slot:t,available:!0,head:n}:{slot:t,available:!1,head:null,reason:"git history is unavailable for this project"}}function Pl(e){try{return xn(e,["rev-parse","HEAD"]).trim()||null}catch{return null}}function xn(e,t){return KF("git",["-C",e,...t],{encoding:"utf-8",maxBuffer:64*1024*1024,stdio:["ignore","pipe","ignore"]})}function oT(e,t){let n;try{n=xn(e,["log","--no-merges","--name-only","-n",String(Es),"--pretty=format:%x01%H%x00%ct%x00%s"])}catch{return null}return{head:t,...Dl(n,Ns)}}function sT(e){return ZF.test(e.subject)}function aT(e){let t=Gr(e);if(!t)return null;let n=new Map;for(let i of t.commits){let r=sT(i);for(let o of i.files){let s=n.get(o)??{changes:0,fixChanges:0,lastChangedAt:0};s.changes+=1,r&&(s.fixChanges+=1),i.timestamp>s.lastChangedAt&&(s.lastChangedAt=i.timestamp),n.set(o,s)}}return n}function cT(e){let t=Gr(e);if(!t||t.commits.length===0)return null;let n=t.commits.map(i=>i.files.length).filter(i=>i>0).sort((i,r)=>i-r);return n.length===0?null:{medianFilesPerCommit:_g(n,.5),p90FilesPerCommit:_g(n,.9),commitsAnalyzed:n.length}}function _g(e,t){let n=Math.min(e.length-1,Math.floor(e.length*t));return e[n]}var lT=wl("git-tracked-files");function uT(e){return lT(e,t=>{try{let n=xn(t,["ls-files"]);return new Set(n.split(`
|
|
588
|
+
`).map(i=>i.trim()).filter(i=>i!==""))}catch{return null}})}var dT=wl("git-file-adds"),Ag="__git__/file-adds",Mg=pe({kind:"git-file-adds",serialize:fT,deserialize:gT});function mT(e){return dT(e,(t,n)=>pT(e,t,n))}function pT(e,t,n){let i=Mg.read(e,Ag,n);if(i)return i;let r=hT(t);return r&&Mg.write(e,Ag,n,r),r}function fT(e){return JSON.stringify([...e.entries()])}function gT(e){if(!e)return null;try{let t=JSON.parse(e);if(!Array.isArray(t))return null;let n=new Map;for(let i of t){if(!Array.isArray(i)||i.length!==2||typeof i[0]!="string")return null;let r=i[1];if(!r||typeof r.commitsAgo!="number"||!Number.isFinite(r.commitsAgo)||typeof r.addedAt!="number"||!Number.isFinite(r.addedAt))return null;n.set(i[0],{commitsAgo:r.commitsAgo,addedAt:r.addedAt})}return n}catch{return null}}function hT(e){let t;try{t=xn(e,["log","--no-merges","--diff-filter=A","--name-only","-n",String(Es),"--pretty=format:%x01%H%x00%ct%x00%s"])}catch{return null}let n=new Map,i=-1;for(let r of t.split("")){if(r.trim()==="")continue;i+=1;let o=r.indexOf(`
|
|
569
589
|
`),s=o>=0?r.slice(0,o):r,[,a]=s.split("\0"),c=Number(a)||0;if(!(o<0))for(let l of r.slice(o+1).split(`
|
|
570
|
-
`)){let
|
|
571
|
-
`).map(
|
|
572
|
-
`).map(n=>n.trim()).filter(n=>n!=="").map(n=>{let[i,r]=n.split("\0");return{hash:i??"",timestamp:Number(r)||0}}).filter(n=>n.hash!=="")}function
|
|
573
|
-
`),s=o>=0?r.slice(0,o):r,[a,c,l]=s.split("\0");if(!a||!c)continue;let
|
|
574
|
-
`).map(
|
|
575
|
-
`)).map(o=>o.trim()).filter(o=>o.length>0))]}function
|
|
576
|
-
`).join(""),s=
|
|
590
|
+
`)){let d=l.trim();d!==""&&n.set(d,{commitsAgo:i,addedAt:c})}}return n}var jg=$g("git-co-change-pairs"),yT=$g("git-directional-co-change-pairs");function bT(e,t){let n=`all\0${Il(t)}`,i=jg(e,n,()=>{let r=Gr(e);return r?Ll(r,t):null});return i&&[...i]}function Og(e,t,n){if(t.size===0)return[];let i=`files\0${Bg(t)}\0${Il(n)}`,r=jg(e,i,()=>{let o=Gr(e);return o?Ll(o,n,t):null});return r&&[...r]}function ST(e,t,n){if(t.size===0)return[];let i=n.maxFilesPerCommit??Ns;if(t.size>JF)return Og(e,t,n);let r=`directional\0${Bg(t)}\0${Il({...n,maxFilesPerCommit:i})}`,o=yT(e,r,(s,a)=>{let c=xT(s,a,t,i);return c?Ll(c,n,t):null});return o&&[...o]}function Il(e){let t=e.minTogether??4,n=e.minConfidence??.6,i=e.maxFilesPerCommit??Ns;return`${t}\0${n}\0${i}`}function Bg(e){return[...e].sort().join("\0")}function Ll(e,t,n){let{minTogether:i=4,minConfidence:r=.6,maxFilesPerCommit:o=Ns}=t,s=new Map,a=new Map,c=e.newestAnalyzedAt??0;for(let u of e.commits){let m=[...new Set(u.files)].sort();if(m.length>o)continue;e.newestAnalyzedAt===void 0&&u.timestamp>c&&(c=u.timestamp);let p=RT(m),f=n===void 0||m.some(g=>n.has(g));for(let g of m)s.set(g,(s.get(g)??0)+1);if(f)for(let g=0;g<m.length;g++)for(let b=g+1;b<m.length;b++){if(n&&!n.has(m[g])&&!n.has(m[b]))continue;let x=`${m[g]}\0${m[b]}`,S=a.get(x)??{together:0,focusedTogether:0,broadTogether:0,lastTogetherAt:0,timestamps:[],subjects:[]};S.together+=1,p?S.broadTogether+=1:S.focusedTogether+=1,u.timestamp>S.lastTogetherAt&&(S.lastTogetherAt=u.timestamp),S.timestamps.push(u.timestamp),S.subjects.push(u.subject),a.set(x,S)}}let l=[],d=c-YF;for(let[u,m]of a){let p=m.together;if(p<i)continue;let[f,g]=u.split("\0"),b=s.get(f)??p,x=s.get(g)??p,S=Math.max(p/b,p/x);if(S<r)continue;let R=m.broadTogether/p,C=m.timestamps.filter(y=>y>=d).length;l.push({fileA:f,fileB:g,together:p,confidence:S,changesA:b,changesB:x,focusedTogether:m.focusedTogether,broadTogether:m.broadTogether,broadCommitRatio:R,lastTogetherAt:m.lastTogetherAt,recentTogether:C,commitScope:wT(m.broadTogether,p),recency:C>0?"recent":"stale",subjectContext:PT(m.subjects)})}return l.sort((u,m)=>m.together-u.together||m.confidence-u.confidence||u.fileA.localeCompare(m.fileA)),l}function xT(e,t,n,i){let r;try{r=CT(e)}catch{return null}if(r.length===0)return{head:t,commits:[],skippedBulkCommits:0,newestAnalyzedAt:0};let o;try{o=xn(e,["log","--no-merges","--format=%H","-n",String(Es),"--",...[...n].sort()])}catch{return null}let s=new Set(r.map(u=>u.hash)),a=o.split(`
|
|
591
|
+
`).map(u=>u.trim()).filter(u=>u!==""&&s.has(u)),c=vT(e,r,i);if(a.length===0)return{head:t,commits:[],skippedBulkCommits:0,newestAnalyzedAt:c};let l;try{l=xn(e,["show","--no-walk=unsorted","--name-only","--pretty=format:%x01%H%x00%ct%x00%s",...a])}catch{return null}let d=Dl(l,i);return{head:t,...d,newestAnalyzedAt:c}}function CT(e){return xn(e,["log","--no-merges","--format=%H%x00%ct","-n",String(Es)]).split(`
|
|
592
|
+
`).map(n=>n.trim()).filter(n=>n!=="").map(n=>{let[i,r]=n.split("\0");return{hash:i??"",timestamp:Number(r)||0}}).filter(n=>n.hash!=="")}function vT(e,t,n){for(let r=0;r<t.length;r+=20){let o=t.slice(r,r+20),s;try{s=xn(e,["show","--no-walk=unsorted","--name-only","--pretty=format:%x01%H%x00%ct%x00%s",...o.map(c=>c.hash)])}catch{return t[0]?.timestamp??0}let a=Dl(s,n);if(a.commits.length>0)return a.commits[0].timestamp}return 0}function Dl(e,t){let n=[],i=0;for(let r of e.split("")){if(r.trim()==="")continue;let o=r.indexOf(`
|
|
593
|
+
`),s=o>=0?r.slice(0,o):r,[a,c,l]=s.split("\0");if(!a||!c)continue;let d=o>=0?r.slice(o+1).split(`
|
|
594
|
+
`).map(u=>u.trim()).filter(u=>u!==""):[];if(d.length>t){i+=1;continue}n.push({hash:a,timestamp:Number(c)||0,subject:l??"",files:d})}return{commits:n,skippedBulkCommits:i}}function RT(e){return e.length>=XF?!0:kT(e).size>=QF}function kT(e){let t=new Set;for(let n of e){let i=n.indexOf("/");t.add(i>=0?n.slice(0,i):".")}return t}function wT(e,t){return e===0?"focused":e/t>=.5?"broad-sweep":"mixed"}function PT(e){let t=new Set,n=[],i=[];for(let r of e){!i.includes(r)&&i.length<eT&&i.push(r);for(let o of IT(r))t.add(o);for(let o of r.match(tT)??[])n.includes(o)||n.push(o)}return{subjectLabels:[...t].sort(),issueRefs:n,sampleSubjects:i,externalIssueLabelStatus:"unavailable"}}function IT(e){let t=new Set,n=nT.exec(e)?.[1]?.toLowerCase();return n&&t.add(LT(n)),/\b(?:feat|feature)\b/i.test(e)&&t.add("feature"),/\b(?:fix(?:es|ed)?|bug|regression|hotfix)\b/i.test(e)&&t.add("fix"),/\b(?:docs?|documentation|guide|readme)\b/i.test(e)&&t.add("docs"),/\brefactor(?:ing|ed)?\b/i.test(e)&&t.add("refactor"),/\btests?\b/i.test(e)&&t.add("test"),/\b(?:release|version|v\d+\.\d+)\b/i.test(e)&&t.add("release"),/\bchore\b/i.test(e)&&t.add("chore"),/\bbuild\b/i.test(e)&&t.add("build"),/\bci\b/i.test(e)&&t.add("ci"),/\bperf(?:ormance)?\b/i.test(e)&&t.add("perf"),[...t]}function LT(e){return e==="feat"?"feature":e}import{existsSync as DT}from"fs";import{join as ET}from"path";function Nl(e){return El.test(e)}var El=/(?:^|\/)(?:package-lock\.json|pnpm-lock\.yaml|yarn\.lock|Cargo\.lock|CHANGELOG(?:\.[a-z]+)?|.*\.map)$|(?:^|\/)(?:dist|build|out|node_modules|docs\/plans)\//i;function Zn(e,t,n={}){let{minTogether:i=4,minConfidence:r=.6,limit:o=30,maxFilesPerCommit:s=20}=n,a=Xe(e),c=a.commitHistory(),l=t!==void 0,d=a.coChangePairs({minTogether:l?Math.min(i,2):i,minConfidence:l?0:r,maxFilesPerCommit:s});if(!c||!d)return{available:!1,commitsAnalyzed:0,findings:[]};let u=ye(e),m=Ug(e),p=_l(e,u,m),f=n.includeLinked===!0||l,g=[];for(let b of d){if(El.test(b.fileA)||El.test(b.fileB)||!Hg(e,b.fileA)||!Hg(e,b.fileB)||l&&!b.fileA.includes(t)&&!b.fileB.includes(t)||!l&&(Z(b.fileA)==="test"||Z(b.fileB)==="test"||NT(b.fileA,b.fileB)))continue;let x=p(b.fileA,b.fileB);if(!f&&x)continue;let S=Fl(b.fileA,b.fileB),R=Tl(b,S,x);if(g.push({...b,structurallyLinked:x,partnerClass:S.partnerClass,partnerClassReasons:S.reasons,...R?{declaredCouplingSuggestion:R}:{}}),g.length>=o)break}return{available:!0,commitsAnalyzed:c.commits.length,findings:g}}function Hg(e,t){return DT(ET(e.config.projectRoot,t))}function Fl(e,t){let n=Vg(e),i=Vg(t),r=[],o=c=>{r.includes(c)||r.push(c)},s=(c,l)=>n.tags.has(c)&&i.tags.has(l)||n.tags.has(l)&&i.tags.has(c);if(s("doc","code"))return o("one side is documentation and the other is executable source"),{partnerClass:"doc-code",reasons:r};if(n.tags.has("test")||i.tags.has("test"))return o("one side is classified as a test file"),{partnerClass:"test-code",reasons:r};if(s("schema","script"))return o("schema or contract file changes with a script or generated-code path"),{partnerClass:"schema-script",reasons:r};if(s("model","view"))return o("model or state path changes with a view or component path"),{partnerClass:"model-view",reasons:r};if(s("config","code"))return o("configuration file changes with executable source"),{partnerClass:"config-code",reasons:r};let a=VT(n.tokens,i.tokens).filter(c=>!BT.has(c));return qg(e,t)||a.length>=2?(o(qg(e,t)?"both files live in the same directory":`files share feature tokens: ${a.slice(0,4).join(", ")}`),{partnerClass:"same-feature",reasons:r}):(o("no specific relationship pattern matched"),{partnerClass:"unknown",reasons:r})}function Tl(e,t,n){if(n||e.together<4||e.confidence<.75||e.commitScope==="broad-sweep"||e.recency==="stale"||!OT.has(t.partnerClass))return;let i=[e.fileA,e.fileB].sort();return{name:`co-change ${t.partnerClass}: ${qT(i)}`,files:i,reason:`${t.partnerClass} pair changed together ${e.together}x with ${Math.round(e.confidence*100)}% confidence; declare it if future edits should require both sides.`}}function _l(e,t=ye(e),n=Ug(e)){return(i,r)=>FT(t,n,i,r)}function NT(e,t){let n=e.lastIndexOf("/"),i=t.lastIndexOf("/");if(e.slice(0,n)!==t.slice(0,i))return!1;let r=e.slice(n+1).split(".")[0],o=t.slice(i+1).split(".")[0];return r!==""&&r===o}function Ug(e){return(e.config.declaredCouplings??[]).filter(t=>Array.isArray(t.files)&&t.files.length>=2).map(t=>new Set(t.files))}function FT(e,t,n,i){return e.get(n)?.has(i)===!0||e.get(i)?.has(n)===!0?!0:t.some(r=>r.has(n)&&r.has(i))}var TT=/(?:^|\/)(?:readme|docs?|guides?|adr|architecture|design)(?:\/|$)|\.(?:md|mdx|rst|adoc|txt)$/i,_T=/(?:^|\/)(?:\.[a-z0-9-]+rc|config|configs|settings|\.github)(?:\/|$)|(?:^|\/)(?:package\.json|tsconfig(?:\.[^.]+)?\.json|vite\.config\.[cm]?[jt]s|rollup\.config\.[cm]?[jt]s|eslint\.config\.[cm]?[jt]s)$|\.(?:json|ya?ml|toml|ini|env)$/i,AT=/(?:^|\/)(?:schemas?|contracts?|migrations?|models?|types?)(?:\/|$)|(?:^|\/)[^/]*(?:schema|contract|migration|model|types?)[^/]*|(?:\.schema)?\.(?:graphql|gql|proto|prisma)$/i,MT=/(?:^|\/)(?:scripts?|bin|tools?|tasks?|generators?|codegen|migrations?|seeds?)(?:\/|$)|(?:^|\/)[^/]*(?:generate|codegen|migrate|seed|script)[^/]*\.[cm]?[jt]s$/i,$T=/(?:^|\/)(?:models?|entities|domain|state|stores?|reducers?)(?:\/|$)|(?:^|\/)[^/]*(?:model|entity|state|store|reducer|viewmodel)[^/]*\.[^.]+$/i,jT=/(?:^|\/)(?:views?|pages?|components?|screens?|routes?|templates?)(?:\/|$)|(?:^|\/)[^/]*(?:view|page|component|screen|template)[^/]*\.[^.]+$|\.(?:vue|svelte|tsx|jsx)$/i,OT=new Set(["doc-code","config-code","schema-script","model-view","test-code"]),BT=new Set(["src","lib","app","test","tests","spec","index","main","utils","util","types","type","config","docs","doc"]);function Vg(e){let t=e.replace(/\\/g,"/"),n=new Set;return TT.test(t)&&n.add("doc"),_T.test(t)&&n.add("config"),AT.test(t)&&n.add("schema"),MT.test(t)&&n.add("script"),$T.test(t)&&n.add("model"),jT.test(t)&&n.add("view"),Z(t)==="test"&&n.add("test"),!n.has("doc")&&!n.has("config")&&n.add("code"),{tags:n,tokens:HT(t)}}function qg(e,t){let n=e.lastIndexOf("/"),i=t.lastIndexOf("/"),r=n>=0?e.slice(0,n):"",o=i>=0?t.slice(0,i):"";return r!==""&&r===o}function HT(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).map(t=>t.toLowerCase()).filter(t=>t.length>=2)}function VT(e,t){let n=new Set(t);return[...new Set(e.filter(i=>n.has(i)))].sort()}function qT(e){return e.map(t=>t.split("/").pop()?.replace(/\.[^.]+$/,"")||t).join(" + ")}import{execFileSync as bt}from"child_process";import{existsSync as UT,readFileSync as zT}from"fs";import{basename as zg}from"path";function Fs(e){let t=new Map;for(let n of e){let i=t.get(n.file);i||(i=[],t.set(n.file,i)),i.push(n)}return t}var Al="Unable to compute git diff.";function Ui(e,t={}){let n=t.plan??Tt(e,t);return n.note?WT(n.note,n.changedFileLines):n.changedFiles.length===0?GT(n.changedFileLines):_s(n.changedFiles,[Ts(e,n.changedFiles,n.changedFiles,n.changedRanges)])}function Tt(e,t={}){let{base:n="HEAD"}=t;try{let i=KT(e.config.projectRoot,n),r=n0(e,i),o=i0(e,JT(e.config.projectRoot,n));return{changedFileLines:i,changedFiles:r,changedRanges:o,renamedFiles:YT(e.config.projectRoot,n,r),note:i.length===0?"No changed files found.":void 0}}catch{return{changedFileLines:[],changedFiles:[],changedRanges:[],renamedFiles:[],note:Al}}}function Ts(e,t,n,i=[]){let r=new A(e),o=new Set(n),s=Fs(i),a=[],c=new Map,l=t.flatMap(f=>r.definitionsForFile(f)).filter(d0).filter(f=>o0(f,s)).sort((f,g)=>f.relativePath.localeCompare(g.relativePath)||f.startLine-g.startLine),d=l.map(f=>f.symbolId),u=c0(e,d),m=l0(e,d,n),p=st(e,l.filter(f=>u.get(f.symbolId)===0));for(let f of l)a0(e,f,o,a,c,p.get(f.symbolId)??new Set,u.get(f.symbolId)??0,m.get(f.symbolId)??new Set);return{changedSymbols:a,consumerEntries:[...c.entries()].map(([f,g])=>({file:f,symbols:[...g].sort()}))}}function _s(e,t){let n=new Map,i=t.flatMap(o=>o.changedSymbols);for(let o of t)for(let s of o.consumerEntries){let a=n.get(s.file);a||(a=new Set,n.set(s.file,a));for(let c of s.symbols)a.add(c)}let r=u0(n);return{changedFiles:[...e],changedSymbols:i,affectedConsumers:r,summary:{totalChangedFiles:e.length,totalChangedSymbols:i.length,totalAffectedFiles:r.length}}}function WT(e,t=[]){return{changedFiles:t,changedSymbols:[],affectedConsumers:[],summary:{totalChangedFiles:t.length,totalChangedSymbols:0,totalAffectedFiles:0,note:e}}}function GT(e){return{changedFiles:e,changedSymbols:[],affectedConsumers:[],summary:{totalChangedFiles:e.length,totalChangedSymbols:0,totalAffectedFiles:0,note:"Changed files are not present in the current SCIP index."}}}function KT(e,t){let n=bt("git",["diff","--name-only",t],{encoding:"utf-8",cwd:e,timeout:1e4}),i=bt("git",["diff","--name-only","--cached",t],{encoding:"utf-8",cwd:e,timeout:1e4}),r=bt("git",["ls-files","--others","--exclude-standard"],{encoding:"utf-8",cwd:e,timeout:1e4});return[...new Set([n,i,r].flatMap(o=>o.split(`
|
|
595
|
+
`)).map(o=>o.trim()).filter(o=>o.length>0))]}function JT(e,t){let n=bt("git",["diff","--unified=0",t],{encoding:"utf-8",cwd:e,timeout:1e4}),i=bt("git",["diff","--unified=0","--cached",t],{encoding:"utf-8",cwd:e,timeout:1e4});return Qg([...Kg(n),...Kg(i)])}function Ml(e,t,n){try{return bt("git",["show",`${t}:./${n}`],{encoding:"utf-8",cwd:e,timeout:1e4,stdio:["ignore","pipe","ignore"]})}catch{return null}}function Kr(e,t,n=[]){let i=XT(e,t,n);return r=>(i.has(r)||i.set(r,Ml(e,t,r)),i.get(r)??null)}function Jr(e,t=e.changedFiles){let n=new Map(e.renamedFiles.map(i=>[i.to,i.from]));return[...new Set(t.map(i=>n.get(i)??i))]}function XT(e,t,n){let i=[...new Set(n)],r=new Map;if(i.length===0)return r;try{let o=i.map(a=>`${t}:./${a}
|
|
596
|
+
`).join(""),s=bt("git",["cat-file","--batch"],{cwd:e,input:o,maxBuffer:256*1024*1024,timeout:1e4,stdio:["pipe","pipe","ignore"]});return QT(s,i)}catch{for(let o of i)r.set(o,Ml(e,t,o));return r}}function QT(e,t){let n=new Map,i=0;for(let r of t){let o=e.indexOf(10,i);if(o<0)throw new Error("git cat-file batch output ended before object header");let s=e.subarray(i,o).toString("utf-8");if(i=o+1,s.endsWith(" missing")){n.set(r,null);continue}let a=/^[0-9a-f]+ ([^ ]+) (\d+)$/.exec(s);if(!a)throw new Error(`unexpected git cat-file batch header: ${s}`);let[,c,l]=a,d=Number(l);if(!Number.isFinite(d)||d<0)throw new Error(`unexpected git cat-file batch size: ${s}`);if(i+d>e.length)throw new Error("git cat-file batch output ended before blob payload");let u=e.subarray(i,i+d);n.set(r,c==="blob"?u.toString("utf-8"):null),i+=d,e[i]===10&&(i+=1)}return n}function YT(e,t,n){if(n.length===0)return[];let i=new Map,r=new Set;for(let s of e0(e,t))n.includes(s.to)&&(i.set(s.to,s),r.add(s.from));let o=ZT(e,t);if(o.length===0)return[...i.values()].sort((s,a)=>s.to.localeCompare(a.to));for(let s of n){if(i.has(s)||!UT(`${e}/${s}`))continue;let a=o.filter(d=>!r.has(d)).filter(d=>zg(d)===zg(s));if(a.length===0)continue;let c=zT(`${e}/${s}`,"utf-8"),l=a.map(d=>({from:d,to:s,similarity:t0(Ml(e,t,d)??"",c)})).sort((d,u)=>u.similarity-d.similarity)[0];l&&l.similarity>=.45&&(i.set(s,l),r.add(l.from))}return[...i.values()].sort((s,a)=>s.to.localeCompare(a.to))}function ZT(e,t){let n=bt("git",["diff","--name-only","--diff-filter=D",t],{encoding:"utf-8",cwd:e,timeout:1e4}),i=bt("git",["diff","--name-only","--diff-filter=D","--cached",t],{encoding:"utf-8",cwd:e,timeout:1e4});return[...new Set([...Gg(n),...Gg(i)])]}function e0(e,t){let n=bt("git",["diff","--name-status","--find-renames",t],{encoding:"utf-8",cwd:e,timeout:1e4}),i=bt("git",["diff","--name-status","--find-renames","--cached",t],{encoding:"utf-8",cwd:e,timeout:1e4});return[...n.split(`
|
|
577
597
|
`),...i.split(`
|
|
578
|
-
`)].map(r=>r.trim()).filter(r=>r.startsWith("R")).map(r=>r.split(" ")).filter(r=>r.length>=3).map(([r,o,s])=>({from:o,to:s,similarity:Number(r.slice(1))/100}))}function
|
|
579
|
-
`).map(t=>t.trim()).filter(t=>t.length>0)}function
|
|
580
|
-
ORDER BY id`).map(i=>i.relative_path),n=new Map(t.map(i=>[i,i]));return i=>{let r=i.replace(/\\/g,"/"),o=n.get(r);return o||(t.find(s=>s.endsWith(r))??null)}}function
|
|
581
|
-
`)){if(i.startsWith("+++ ")){n=
|
|
598
|
+
`)].map(r=>r.trim()).filter(r=>r.startsWith("R")).map(r=>r.split(" ")).filter(r=>r.length>=3).map(([r,o,s])=>({from:o,to:s,similarity:Number(r.slice(1))/100}))}function t0(e,t){let n=new Set(Wg(e)),i=new Set(Wg(t));if(n.size===0&&i.size===0)return 1;if(n.size===0||i.size===0)return 0;let r=0;for(let o of n)i.has(o)&&(r+=1);return 2*r/(n.size+i.size)}function Wg(e){return e.match(/[A-Za-z_$][\w$]*|[{}()[\].,]/g)??[]}function Gg(e){return e.split(`
|
|
599
|
+
`).map(t=>t.trim()).filter(t=>t.length>0)}function n0(e,t){let n=Xg(e),i=[];for(let r of t){let o=n(r);o&&!e.isIgnored(o)&&i.push(o)}return i}function i0(e,t){let n=Xg(e),i=[];for(let r of t){let o=n(r.file);o&&!e.isIgnored(o)&&i.push({...r,file:o})}return Qg(i)}function Xg(e){let t=e.all(`SELECT relative_path FROM documents
|
|
600
|
+
ORDER BY id`).map(i=>i.relative_path),n=new Map(t.map(i=>[i,i]));return i=>{let r=i.replace(/\\/g,"/"),o=n.get(r);return o||(t.find(s=>s.endsWith(r))??null)}}function Kg(e){let t=[],n=null;for(let i of e.split(`
|
|
601
|
+
`)){if(i.startsWith("+++ ")){n=r0(i.slice(4).trim());continue}if(!n||!i.startsWith("@@ "))continue;let r=/@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/.exec(i);if(!r)continue;let o=Math.max(0,Number(r[1])-1),s=r[2]===void 0?1:Number(r[2]);t.push({file:n,startLine:o,endLine:Math.max(o,o+Math.max(s,1)-1)})}return t}function r0(e){return e==="/dev/null"?null:e.startsWith("a/")||e.startsWith("b/")?e.slice(2):e}function Qg(e){let t=new Set,n=[];for(let i of e){let r=`${i.file}:${i.startLine}:${i.endLine}`;t.has(r)||(t.add(r),n.push(i))}return n}function o0(e,t){let n=t.get(e.relativePath);return!n||n.length===0?!0:n.some(i=>s0(e.startLine,e.endLine,i.startLine,i.endLine))}function s0(e,t,n,i){return e<=i&&n<=t}function a0(e,t,n,i,r,o,s,a){let c=Math.max(s,o.size);if(!m0(t,c))return;let l=v(t.symbol);i.push({symbol:t.symbol,shortName:l,file:t.relativePath,startLine:t.startLine,endLine:t.endLine,fanIn:c});for(let d of a)Jg(e,n,r,d,l);for(let d of o)Jg(e,n,r,d,l)}function c0(e,t){if(t.length===0)return new Map;let n=e.all(`SELECT m.symbol_id, COUNT(DISTINCT c.document_id) AS fan_in
|
|
582
602
|
FROM mentions m
|
|
583
603
|
JOIN chunks c ON m.chunk_id = c.id
|
|
584
604
|
WHERE m.symbol_id IN (${t.map(()=>"?").join(",")})
|
|
585
605
|
AND m.role != 1
|
|
586
|
-
GROUP BY m.symbol_id`,...t);return new Map(n.map(i=>[i.symbol_id,i.fan_in]))}function
|
|
606
|
+
GROUP BY m.symbol_id`,...t);return new Map(n.map(i=>[i.symbol_id,i.fan_in]))}function l0(e,t,n){if(t.length===0||n.length===0)return new Map;let i=e.all(`SELECT DISTINCT m.symbol_id, ref_d.relative_path
|
|
587
607
|
FROM mentions m
|
|
588
608
|
JOIN chunks c ON m.chunk_id = c.id
|
|
589
609
|
JOIN documents ref_d ON c.document_id = ref_d.id
|
|
590
610
|
WHERE m.symbol_id IN (${t.map(()=>"?").join(",")})
|
|
591
611
|
AND m.role != 1
|
|
592
612
|
AND ref_d.relative_path NOT IN (${n.map(()=>"?").join(",")})
|
|
593
|
-
${e.pathExclusionsFor("ref_d")}`,...t,...n),r=new Map;for(let o of i){let s=r.get(o.symbol_id);s||(s=new Set,r.set(o.symbol_id,s)),s.add(o.relative_path)}return r}function
|
|
594
|
-
`).trim();return o.length<=2e3?o:`${o.slice(0,2e3).trimEnd()}...`}function
|
|
595
|
-
`).toLowerCase(),n=[],i=
|
|
596
|
-
${n}`.toLowerCase(),r=On(i,["historical note","historical record","history note","retrospective","postmortem","post-mortem","archived","archive","previously","legacy","recorded","record of","snapshot","as of","migration note","decision record"]);if(r.length>0)return{docIntent:"historical-note",reasons:[`historical-note terms: ${r.join(", ")}`]};let o=On(i,["current","standard","standards","must","should","policy","guide","guidance","workflow","contract","invariant","source of truth"]);return o.length>0?{docIntent:"current-guidance",reasons:[`current-guidance terms: ${o.join(", ")}`]}:{docIntent:"unknown",reasons:["no current-guidance or historical-note markers found"]}}function il(e,t){return{actionTier:KE(e,t.docIntent),docIntent:t.docIntent,docIntentReasons:t.reasons}}function KE(e,t){return t==="historical-note"?"support":e==="co-change"?"signal":"direct"}function QE(e){let t=sn(e);if(!t)return null;let n=Wc(e)??new Set,i=new Map,r=new Map,o=new Set;for(let s of t.commits){let a=[...new Set(s.files)],c=a.filter(u=>$r.test(u)),l=a.filter(u=>!$r.test(u));for(let u of a){o.add(u);let d=i.get(u)??[];d.push(s.timestamp),i.set(u,d)}for(let u of c){let d=r.get(u);d||(d=new Map,r.set(u,d));for(let m of l)d.set(m,(d.get(m)??0)+1)}}return{changeTimes:i,coupling:r,docFiles:[...n].filter(s=>$r.test(s)),everSeenInHistory:o,historyCommitCount:t.commits.length,tracked:n,trackedBySuffix:qf(n)}}function Hf(e,t){if(t.size===0)return[];let n=se(),i=0,r=0,o=0,s=0,a=0,c=0;return T("doc-reference.docs-citing-files",()=>{let l=Wc(e)??new Set;i=l.size;let u=qf(l),d=XE(t,u),m=[];for(let p of l){if(!Vf(e,p))continue;n&&(r+=1);let f;try{f=rl(Mr(e.config.projectRoot,p),"utf-8")}catch{n&&(o+=1);continue}if(!tT(f,d)){n&&(s+=1);continue}let g=Uf(e,p,f);if(!g)continue;n&&(a+=1);let y=YE(g.candidates,t,d,l,u);if(y.size===0)continue;let S=[...new Set([...y.values()].flatMap(b=>[...b]))],R=eT(g.contextsByCandidate,S),k=[...y].map(([b,C])=>({file:b,contexts:bs([...C].flatMap(D=>R.get(D)??[])).slice(0,3)})).filter(b=>b.contexts.length>0),x=[...y.keys()];if(x.length>0){n&&(c+=1);let b=x.sort();m.push({doc:p,cited:b,citations:k,citedClaims:bs(k.flatMap(C=>C.contexts)).slice(0,3)})}}return m},()=>({targets:t.size,trackedFiles:i,livingDocs:r,unreadableDocs:o,candidateMisses:s,evidenceDocs:a,citedDocs:c}))}function Vf(e,t){return $r.test(t)&&!WE(t)&&Bf(Mr(e.config.projectRoot,t))}function qf(e){let t=new Map;for(let n of e){let i=n.split("/");for(let r of[2,3]){if(i.length<r)continue;let o=i.slice(-r).join("/"),s=t.get(o)??[];s.push(n),t.set(o,s)}}return t}function XE(e,t){let n=new Set(e);for(let i of e){let r=i.split("/");for(let o of[2,3]){if(r.length<o)continue;let s=r.slice(-o).join("/"),a=t.get(s);a?.length===1&&a[0]===i&&n.add(s)}}return n}function YE(e,t,n,i,r){let o=new Map;for(let s of e){if(!n.has(s))continue;let a;if(i.has(s))a=s;else{let l=r.get(s);l?.length===1&&(a=l[0])}if(!a||!t.has(a))continue;let c=o.get(a)??new Set;c.add(s),o.set(a,c)}return o}function ZE(e,t,n,i,r){let o=new Set,s=new Set,a=Uf(e,t);if(!a)return{resolved:o,broken:[],citations:[]};let c=a.candidates,l=a.contextsByCandidate,u=new Map,d=(m,p)=>{let f=l.get(p);if(!f||f.length===0)return;let g=u.get(m)??[];g.push(...f),u.set(m,bs(g).slice(0,3))};for(let m of c){if(n.has(m)){o.add(m),d(m,m);continue}let p=i.get(m);if(p&&p.length===1){o.add(p[0]),d(p[0],m);continue}p&&p.length>1||r.has(m)&&s.add(m)}return{resolved:o,broken:[...s],citations:[...u].map(([m,p])=>({file:m,contexts:p}))}}function eT(e,t){let n=new Map;for(let i of t){let r=e.get(i);r&&r.length>0&&n.set(i,[...r])}return n}function Uf(e,t,n){let i=n;if(i===void 0)try{i=rl(Mr(e.config.projectRoot,t),"utf-8")}catch{return null}let r=Z(e,t,i),o=ae(e,"doc-path-evidence",t,r);if(o!==null){let a=rT(o);if(a)return a}let s=nT(i);return ce(e,"doc-path-evidence",t,r,iT(s)),s}function tT(e,t){for(let n of t)if(e.includes(n))return!0;return!1}function nT(e){let t=e.split(/\r?\n/),n=new Set,i=new Map;for(let r=0;r<t.length;r+=1){let o=t[r]??"";for(let s of o.matchAll(GE)){let a=s[0].replace(/^\.?\//,"");n.add(a);let c=ys(t,r);if(c.length===0)continue;let l=i.get(a)??[];l.push(c),i.set(a,bs(l).slice(0,3))}}return{candidates:[...n],contextsByCandidate:i}}function iT(e){let t={candidates:e.candidates,contextsByCandidate:[...e.contextsByCandidate.entries()]};return JSON.stringify(t)}function rT(e){try{let t=JSON.parse(e);if(!pn(t))return null;let n=Me(t.candidates),i=oT(t.contextsByCandidate);return!n||!i?null:{candidates:n,contextsByCandidate:new Map(i)}}catch{return null}}function oT(e){if(!Array.isArray(e))return null;let t=[];for(let n of e){if(!Array.isArray(n)||n.length!==2||typeof n[0]!="string")return null;let i=Me(n[1]);if(!i)return null;t.push([n[0],i])}return t}function bs(e){let t=[];for(let n of new Set(e))t.some(i=>sT(i,n))||t.push(n);return t}function sT(e,t){if(e===t)return!0;let n=e.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0),i=t.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0),r=Math.min(n.length,i.length);if(r===0)return!1;if(r<3)return e.includes(t)||t.includes(e);let o=new Set(i),s=n.filter(a=>o.has(a)).length;return s>=3&&s/r>=.6}import{existsSync as y0,readFileSync as b0,writeFileSync as S0}from"fs";import{isAbsolute as x0,join as C0}from"path";var be={dead:{minLoc:3,skipBarrels:!0,deadCodeOnly:!0,semantic:!1},isolated:{minLoc:3,semantic:!1},similar:{minSimilarity:.6,limit:50,minCallees:4,semantic:!1},extract:{minLoc:15,minCallees:5,limit:50,semantic:!1},wrappers:{maxLoc:15,limit:50,semantic:!1},passthroughs:{maxLoc:15,limit:50,semantic:!1},stale:{minLoc:3,limit:50,semantic:!1},drift:{semantic:!1}};import Or from"path";function jn(e){let n=e.replace(/\\/g,"/").split("/").filter(Boolean);return n.length<=1?"(root)":n.length>=3&&["src","lib","app","server","client"].includes(n[0])?`${n[0]}/${n[1]}`:n[0]}function sl(e,t){if(e===t)return"ok";let n=Ss(e),i=Ss(t);return n&&i?aT(n,i)?"ok":"violation":cT(e,t)}function Wf(e,t){let n=Ss(jn(e)),i=Ss(jn(t));return!!n&&!!i}function Ss(e){return/^src\/([^/]+)$/.exec(e)?.[1]??null}function aT(e,t){return t==="domain"?!0:e==="domain"?!1:{analysis:new Set(["domain","source","storage","symbols"]),core:new Set(["analysis","domain","resolution","source","storage","symbols"]),"language-parsers":new Set(["domain","resolution","source","storage"]),queries:new Set(["analysis","core","domain","language-parsers","resolution","semantic","source","storage","symbols"]),reindex:new Set(["domain","language-parsers","resolution","runtime","semantic","source","storage","symbols"]),resolution:new Set(["domain","source","storage","symbols"]),runtime:new Set(["domain","queries","reindex","resolution","semantic","source","storage","symbols"]),semantic:new Set(["domain","resolution","storage","symbols"]),source:new Set(["domain","storage"]),storage:new Set(["domain","source"]),symbols:new Set(["analysis","domain","language-parsers","resolution","semantic","source","storage"])}[e]?.has(t)??!1}function cT(e,t){if(t==="shared")return"ok";let n={app:new Set(["core","shared","ui"]),core:new Set(["shared"]),infra:new Set(["core","shared"]),ui:new Set(["core","shared"])};return n[e]?n[e].has(t)?"ok":"violation":null}function Bn(e,t){let{scope:n,minDeviation:i=5}=t??{},r=t?.semantic!==!1,o=t?.includePatternDeviations!==!1,a=new A(e).fileDependencyGraph(n);return pT([...lT(e,a,{scope:n,semantic:r}),...dT(a),...o?mT(a,i):[]])}function lT(e,t,n){let i=hT(e,n.scope),r=[],o=new Set;for(let[a,c]of t){if($t(a))continue;let l=i.get(a)??new Set;for(let u of c)$t(u)||l.has(u)||uT(e,a,u,n)||(r.push({file:a,dep:u}),o.add(a))}o.size>0&&ST(e,i,{paths:[...o]});let s=[];for(let{file:a,dep:c}of r)(i.get(a)??new Set).has(c)||s.push({file:a,kind:"unused-import",description:`Depends on ${c} but references none of its symbols`,dep:c,actionTier:"direct",evidenceReasons:[`dependency edge exists from ${a} to ${c}`,"no semantic, source, type-only, side-effect, or Vue-template usage survived the conservative skip gates"],recommendation:"Remove the unused import or dependency edge after running the project checks."});return s}function uT(e,t,n,i){return RT(e,t,n)||kT(e,t,n)||CT(n)||IT(e,t,n)||wT(n)?!0:i.semantic&&vT(e,t,n)}function dT(e){let t=[],n=xT(e);for(let[i,r]of e){if($t(i))continue;let o=jn(i);for(let s of r){if($t(s))continue;let a=jn(s);if(o===a)continue;let c=sl(o,a),l=c?"explicit":"inferred";if((c??n.get(`${o}->${a}`))==="violation"){let d=l==="explicit"?"direct":"signal";t.push({file:i,kind:"layer-violation",description:`Imports from ${a}/ (${s}) \u2014 may cross architectural boundary`,dep:s,detail:`${o}/ should not depend on ${a}/`,actionTier:d,policyBasis:l,evidenceReasons:[`dependency edge exists from ${i} to ${s}`,l==="explicit"?`explicit layer policy rejects ${o}/ -> ${a}/`:`rare cross-layer edge ${o}/ -> ${a}/ is inferred as a violation`],recommendation:l==="explicit"?"Move the dependency behind an allowed layer boundary or document a policy change.":"Review whether this is a real boundary break or an intentional exception before moving code."})}}}return t}function mT(e,t){let n=[];for(let[i,r]of fT(e)){let o=r.filter(a=>!$t(a));if(o.length<t)continue;let s=gT(e,o);for(let a of o)for(let c of e.get(a)??[])$t(c)||(s.get(c)??0)===1&&Or.dirname(c)!==i&&Or.dirname(c)!==Or.dirname(i)&&(Wf(a,c)||n.push({file:a,kind:"pattern-deviation",description:`Only file in ${i}/ that depends on ${c}`,dep:c,actionTier:"signal",evidenceReasons:[`${o.length} sibling file(s) in ${i}/ were compared`,`${a} is the only non-skipped sibling depending on ${c}`],recommendation:"Review sibling ownership before changing this import; unique dependency shape can be intentional specialization."}))}return n}function pT(e){return{results:e,unusedImports:e.filter(t=>t.kind==="unused-import").length,layerViolations:e.filter(t=>t.kind==="layer-violation").length,patternDeviations:e.filter(t=>t.kind==="pattern-deviation").length}}function fT(e){let t=new Map;for(let n of e.keys()){let i=Or.dirname(n),r=t.get(i);r||(r=[],t.set(i,r)),r.push(n)}return t}function gT(e,t){let n=new Map;for(let i of t)for(let r of e.get(i)??[])$t(r)||n.set(r,(n.get(r)??0)+1);return n}function hT(e,t){let n=new Map;return yT(e,n,t),n}function yT(e,t,n){for(let i of bT(e,n))zf(e,t,i.from_file,i.to_file)}function bT(e,t){let n=t?`AND d1.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT d1.relative_path AS from_file, d2.relative_path AS to_file
|
|
613
|
+
${e.pathExclusionsFor("ref_d")}`,...t,...n),r=new Map;for(let o of i){let s=r.get(o.symbol_id);s||(s=new Set,r.set(o.symbol_id,s)),s.add(o.relative_path)}return r}function Jg(e,t,n,i,r){if(e.isIgnored(i)||t.has(i))return;let o=n.get(i);o||(o=new Set,n.set(i,o)),o.add(r)}function u0(e){return[...e.entries()].map(([t,n])=>({file:t,consumedSymbols:n.size})).sort((t,n)=>n.consumedSymbols-t.consumedSymbols)}function d0(e){return!(gn(e.symbol)||e.parentTypeName!==null&&!he(e.symbol))}function m0(e,t){return he(e.symbol)||e.isTypeLike?!0:e.parentTypeName===null&&t>0}function Yg(e){let[t,n]=As(e,":"),i=t||"unknown",r=(o={})=>{let s=o.actionTier??p0(i);return{sourceAnalyzer:i,actionTier:s,rootCauseKey:o.rootCauseKey??(n||e),label:o.label??`${i} finding`,relatedFiles:o.relatedFiles??[],why:o.why??[],remediation:o.remediation??f0(s,i),file:o.file}};if(!n)return r({rootCauseKey:e,why:["Baseline identity did not include analyzer payload."]});if(["dead","isolated","extract","wrapper","passthrough","stale"].includes(i)){let[o,s]=As(n,":");return r({file:o,relatedFiles:o?[o]:[],rootCauseKey:s?`${o}:${s}`:n,label:`${i} finding`,why:s?[`Baseline subject: ${s}.`]:[]})}if(i==="cycle"){let o=n.split(">").filter(Boolean);return r({relatedFiles:o,rootCauseKey:n,label:"cycle finding",why:o.length>0?[`Cycle path: ${o.join(" > ")}.`]:[]})}if(i==="similar"){let o=n.split("|").filter(Boolean);return r({relatedFiles:[],rootCauseKey:n,label:"similarity finding",why:o.length>0?[`Similar symbols: ${o.join(" | ")}.`]:[]})}if(i==="drift"){let[o,s]=As(n,":"),[a,c]=As(s,":");return r({actionTier:o==="unused-import"?"direct":"signal",file:a,relatedFiles:[...new Set([a,c].filter(Boolean))],rootCauseKey:n,label:`${o||"drift"} finding`,why:[...o?[`Drift kind: ${o}.`]:[],...c?[`Related dependency: ${c}.`]:[]]})}return r({why:["Baseline analyzer prefix is not recognized by this diff-gate version."]})}function p0(e){switch(e){case"dead":case"isolated":case"cycle":case"passthrough":return"direct";case"similar":case"extract":case"wrapper":case"stale":return"signal";default:return"signal"}}function f0(e,t){return e==="direct"?`Fix the new ${t} baseline finding, or knowingly accept it via health --write-baseline.`:`Review the new ${t} baseline signal; fix it if it reflects real debt, or knowingly accept it via health --write-baseline.`}function As(e,t){let n=e.indexOf(t);return n<0?[e,""]:[e.slice(0,n),e.slice(n+t.length)]}import{existsSync as x0,readFileSync as th}from"fs";function js(e,t){let n=g0(e,t)??h0(e,t)??y0(e,t)??b0(e,t);return S0(e,n,t)}function g0(e,t){let n=-1,i=null;for(let r=0;r<=t;r+=1){let o=$l(e[r]??"");o&&(i===null?(i=o,n=r):o===i&&(i=null,n=-1))}if(i===null||n<0)return null;for(let r=t+1;r<e.length;r+=1)if($l(e[r]??"")===i)return{start:n,end:r+1};return{start:n,end:e.length}}function $l(e){let t=e.match(/^\s*(```+|~~~+)/);return t?t[1].startsWith("`")?"`":"~":null}function h0(e,t){if(!Ms(e[t]??""))return null;let n=t;for(;n>0&&Ms(e[n-1]??"");)n-=1;let i=t+1;for(;i<e.length&&Ms(e[i]??"");)i+=1;return{start:n,end:i}}function Ms(e){let t=e.trim();return t.startsWith("|")&&t.endsWith("|")&&t.includes("|")}function y0(e,t){let n=t;for(;n>=0;){let o=e[n]??"";if($s(o)!==null)break;if(jl(o)!==null)return null;n-=1}if(n<0)return null;let i=$s(e[n]??"");if(i===null)return null;let r=n+1;for(;r<e.length;){let o=e[r]??"",s=$s(o);if(s!==null){if(s<=i)break;r+=1;continue}if(jl(o)!==null)break;r+=1}return{start:n,end:r}}function $s(e){let t=e.match(/^(\s*)(?:[-*+]\s+|\d+[.)]\s+)/);return t?t[1].length:null}function b0(e,t){let n=e[t]??"";if(eh(n)||n.trim().length===0)return{start:t,end:t+1};let i=t;for(;i>0&&Zg(e[i-1]??"");)i-=1;let r=t+1;for(;r<e.length&&Zg(e[r]??"");)r+=1;return{start:i,end:r}}function Zg(e){return jl(e)===null}function jl(e){return e.trim().length===0?"blank":eh(e)?"heading":$l(e)?"fence":Ms(e)?"table":$s(e)!==null?"list":null}function eh(e){return/^#{1,6}\s+/.test(e.trim())}function S0(e,t,n){let{start:i,end:r}=t;if(r-i>40){let s=Math.floor(20);i=Math.max(i,n-s),r=Math.min(r,i+40),i=Math.max(t.start,r-40)}let o=e.slice(i,r).join(`
|
|
614
|
+
`).trim();return o.length<=2e3?o:`${o.slice(0,2e3).trimEnd()}...`}function ei(e,t){return t.filter(n=>e.includes(n))}var zi={classifyCitation:C0,citationContexts:v0,citationKindLabel:k0,citationRemediation:w0,referenceTargets:P0};function C0(e){let t=e.join(`
|
|
615
|
+
`).toLowerCase(),n=[],i=ei(t,[".scipquery","declaredcouplings","suppression","suppressions","config","configuration","json"]);if(i.length>0)return n.push(`configuration/example terms near citation: ${i.join(", ")}`),{citationKind:"configuration-example",actionTier:"support",reasons:n};let r=ei(t,["accepted","intentional","intentionally","retained","historical"]);if(r.length>0)return n.push(`intentional-record terms near citation: ${r.join(", ")}`),{citationKind:"intentional-record",actionTier:"support",reasons:n};let o=ei(t,["command","cli","usage","example","run","workflow"]);return o.length>0?(n.push(`guide/reference terms near citation: ${o.join(", ")}`),{citationKind:"guide-reference",actionTier:"signal",reasons:n}):(n.push(e.length>0?"citation appears in prose without config or guide markers":"citation context unavailable"),{citationKind:"behavioral-claim",actionTier:"direct",reasons:n})}function v0(e,t,n){let i;try{i=th(`${e.config.projectRoot}/${t}`,"utf-8").split(/\r?\n/)}catch{return[]}let r=n.flatMap(R0),o=[];for(let s=0;s<i.length;s+=1){let a=i[s]??"";r.some(c=>a.includes(c))&&o.push(js(i,s))}return o}function R0(e){let t=e.split("/");return[e,`./${e}`,t.slice(-3).join("/"),t.slice(-2).join("/")].filter((n,i,r)=>n.length>0&&r.indexOf(n)===i)}function k0(e){switch(e){case"behavioral-claim":return"a behavioral doc claim";case"configuration-example":return"a configuration example";case"guide-reference":return"a guide reference";case"intentional-record":return"an intentional record"}}function w0(e,t){switch(e){case"behavioral-claim":return`Re-read ${t} and update the behavioral claim or citation.`;case"configuration-example":return`Verify the configuration example in ${t} still points at the intended file; update only if the example target changed.`;case"guide-reference":return`Verify the guide reference in ${t} still sends readers to the right implementation or command surface.`;case"intentional-record":return`Verify the intentional citation in ${t} is still meant to name this file.`}}function P0(e,t,n){let i=Fs(n),r=new Set;for(let o of t)I0(e,o,i.get(o)??[])&&r.add(o);return r}function I0(e,t,n){if(n.length===0)return!1;if(!L0.test(t))return!0;let i=`${e.config.projectRoot}/${t}`;if(!x0(i))return!0;let r=th(i,"utf-8").split(/\r?\n/),o=D0(r);for(let s of n)for(let a=s.startLine;a<=s.endLine;a+=1)if((r[a]??"").trim()!==""&&!o.has(a))return!0;return!1}var L0=/\.(?:[cm]?[jt]sx?)$/i;function D0(e){let t=new Set,n=!1;for(let i=0;i<e.length;i+=1){let r=e[i].trim();!n&&E0(r)&&(n=!0),n&&(t.add(i),r.endsWith(";")&&(n=!1))}return t}function E0(e){return/^import(?:\s|$)/.test(e)||/^export(?:\s+type)?\s+(?:\*|\{)/.test(e)}import{existsSync as ih,readFileSync as Bl}from"fs";import{join as Qr}from"path";var nh=pe({kind:"doc-path-evidence",serialize:q0,deserialize:U0}),Xr=/\.(?:md|mdx|rst|txt)$/i;function N0(e){return/(?:^|\/)(?:docs\/plans|plans|adrs?|rfcs?|decisions|changelogs?|archive|reports?)\//i.test(e)||/(?:^|\/)CHANGELOG\.(?:md|mdx|rst|txt)$/i.test(e)}var F0=3,T0=/[A-Za-z0-9_@-]+(?:\/[A-Za-z0-9_.@-]+)+\.[A-Za-z0-9]{1,6}\b/g;function Hl(e,t={}){let{doc:n,limit:i=20,minCoupling:r=F0}=t,o=M0(e);if(!o)return{available:!1,commitsAnalyzed:0,docsScanned:0,findings:[]};let s=[];for(let a of o.docFiles){if(n!==void 0&&!a.includes(n)||n===void 0&&!oh(e,a)||n!==void 0&&!ih(Qr(e.config.projectRoot,a)))continue;let c=Math.max(0,...o.changeTimes.get(a)??[]),l=_0(e,a),d=new Map,{resolved:u,broken:m,citations:p}=O0(e,a,o.tracked,o.trackedBySuffix,o.everSeenInHistory),f=new Map(p.map(b=>[b.file,b.contexts]));for(let b of u){if(b===a||Xr.test(b))continue;let x=(o.changeTimes.get(b)??[]).filter(S=>S>c).length;x!==0&&d.set(b,{file:b,evidence:"reference",coChanges:0,changesSinceDocUpdate:x,...Ol("reference",l),citationContexts:f.get(b)})}for(let[b,x]of o.coupling.get(a)??[]){if(x<r||!o.tracked.has(b))continue;let S=(o.changeTimes.get(b)??[]).filter(C=>C>c).length;if(S===0)continue;let R=d.get(b);R?(R.evidence="both",R.coChanges=x,Object.assign(R,Ol("both",l))):d.set(b,{file:b,evidence:"co-change",coChanges:x,changesSinceDocUpdate:S,...Ol("co-change",l)})}if(d.size===0&&m.length===0)continue;let g=[...d.values()].sort((b,x)=>x.changesSinceDocUpdate-b.changesSinceDocUpdate);s.push({doc:a,docLastChangedAt:c,staleness:g.reduce((b,x)=>b+x.changesSinceDocUpdate,0)+m.length*10,subjects:g.slice(0,8),brokenReferences:m})}return s.sort((a,c)=>c.staleness-a.staleness),{available:!0,commitsAnalyzed:o.historyCommitCount,docsScanned:o.docFiles.length,findings:s.slice(0,i)}}function _0(e,t){let n;try{n=Bl(Qr(e.config.projectRoot,t),"utf8").slice(0,6e3)}catch{return{docIntent:"unknown",reasons:["doc text unavailable"]}}let i=`${t}
|
|
616
|
+
${n}`.toLowerCase(),r=ei(i,["historical note","historical record","history note","retrospective","postmortem","post-mortem","archived","archive","previously","legacy","recorded","record of","snapshot","as of","migration note","decision record"]);if(r.length>0)return{docIntent:"historical-note",reasons:[`historical-note terms: ${r.join(", ")}`]};let o=ei(i,["current","standard","standards","must","should","policy","guide","guidance","workflow","contract","invariant","source of truth"]);return o.length>0?{docIntent:"current-guidance",reasons:[`current-guidance terms: ${o.join(", ")}`]}:{docIntent:"unknown",reasons:["no current-guidance or historical-note markers found"]}}function Ol(e,t){return{actionTier:A0(e,t.docIntent),docIntent:t.docIntent,docIntentReasons:t.reasons}}function A0(e,t){return t==="historical-note"?"support":e==="co-change"?"signal":"direct"}function M0(e){let t=Xe(e),n=t.commitHistory();if(!n)return null;let i=t.trackedFiles()??new Set,r=new Map,o=new Map,s=new Set;for(let a of n.commits){let c=[...new Set(a.files)],l=c.filter(u=>Xr.test(u)),d=c.filter(u=>!Xr.test(u));for(let u of c){s.add(u);let m=r.get(u)??[];m.push(a.timestamp),r.set(u,m)}for(let u of l){let m=o.get(u);m||(m=new Map,o.set(u,m));for(let p of d)m.set(p,(m.get(p)??0)+1)}}return{changeTimes:r,coupling:o,docFiles:[...i].filter(a=>Xr.test(a)),everSeenInHistory:s,historyCommitCount:n.commits.length,tracked:i,trackedBySuffix:sh(i)}}function rh(e,t){if(t.size===0)return[];let n=me(),i=0,r=0,o=0,s=0,a=0,c=0;return D("doc-reference.docs-citing-files",()=>{let l=Xe(e).trackedFiles()??new Set;i=l.size;let d=sh(l),u=$0(t,d),m=[];for(let p of l){if(!oh(e,p))continue;n&&(r+=1);let f;try{f=Bl(Qr(e.config.projectRoot,p),"utf-8")}catch{n&&(o+=1);continue}if(!H0(f,u)){n&&(s+=1);continue}let g=ah(e,p,f);if(!g)continue;n&&(a+=1);let b=j0(g.candidates,t,u,l,d);if(b.size===0)continue;let x=[...new Set([...b.values()].flatMap(y=>[...y]))],S=B0(g.contextsByCandidate,x),R=[...b].map(([y,w])=>({file:y,contexts:Os([...w].flatMap(L=>S.get(L)??[])).slice(0,3)})).filter(y=>y.contexts.length>0),C=[...b.keys()];if(C.length>0){n&&(c+=1);let y=C.sort();m.push({doc:p,cited:y,citations:R,citedClaims:Os(R.flatMap(w=>w.contexts)).slice(0,3)})}}return m},()=>({targets:t.size,trackedFiles:i,livingDocs:r,unreadableDocs:o,candidateMisses:s,evidenceDocs:a,citedDocs:c}))}function oh(e,t){return Xr.test(t)&&!N0(t)&&ih(Qr(e.config.projectRoot,t))}function sh(e){let t=new Map;for(let n of e){let i=n.split("/");for(let r of[2,3]){if(i.length<r)continue;let o=i.slice(-r).join("/"),s=t.get(o)??[];s.push(n),t.set(o,s)}}return t}function $0(e,t){let n=new Set(e);for(let i of e){let r=i.split("/");for(let o of[2,3]){if(r.length<o)continue;let s=r.slice(-o).join("/"),a=t.get(s);a?.length===1&&a[0]===i&&n.add(s)}}return n}function j0(e,t,n,i,r){let o=new Map;for(let s of e){if(!n.has(s))continue;let a;if(i.has(s))a=s;else{let l=r.get(s);l?.length===1&&(a=l[0])}if(!a||!t.has(a))continue;let c=o.get(a)??new Set;c.add(s),o.set(a,c)}return o}function O0(e,t,n,i,r){let o=new Set,s=new Set,a=ah(e,t);if(!a)return{resolved:o,broken:[],citations:[]};let c=a.candidates,l=a.contextsByCandidate,d=new Map,u=(m,p)=>{let f=l.get(p);if(!f||f.length===0)return;let g=d.get(m)??[];g.push(...f),d.set(m,Os(g).slice(0,3))};for(let m of c){if(n.has(m)){o.add(m),u(m,m);continue}let p=i.get(m);if(p&&p.length===1){o.add(p[0]),u(p[0],m);continue}p&&p.length>1||r.has(m)&&s.add(m)}return{resolved:o,broken:[...s],citations:[...d].map(([m,p])=>({file:m,contexts:p}))}}function B0(e,t){let n=new Map;for(let i of t){let r=e.get(i);r&&r.length>0&&n.set(i,[...r])}return n}function ah(e,t,n){let i=n;if(i===void 0)try{i=Bl(Qr(e.config.projectRoot,t),"utf-8")}catch{return null}let r=re(e,t,i),o=nh.read(e,t,r);if(o)return o;let s=V0(i);return nh.write(e,t,r,s),s}function H0(e,t){for(let n of t)if(e.includes(n))return!0;return!1}function V0(e){let t=e.split(/\r?\n/),n=new Set,i=new Map;for(let r=0;r<t.length;r+=1){let o=t[r]??"";for(let s of o.matchAll(T0)){let a=s[0].replace(/^\.?\//,"");n.add(a);let c=js(t,r);if(c.length===0)continue;let l=i.get(a)??[];l.push(c),i.set(a,Os(l).slice(0,3))}}return{candidates:[...n],contextsByCandidate:i}}function q0(e){let t={candidates:e.candidates,contextsByCandidate:[...e.contextsByCandidate.entries()]};return JSON.stringify(t)}function U0(e){try{let t=JSON.parse(e);if(!kt(t))return null;let n=je(t.candidates),i=z0(t.contextsByCandidate);return!n||!i?null:{candidates:n,contextsByCandidate:new Map(i)}}catch{return null}}function z0(e){if(!Array.isArray(e))return null;let t=[];for(let n of e){if(!Array.isArray(n)||n.length!==2||typeof n[0]!="string")return null;let i=je(n[1]);if(!i)return null;t.push([n[0],i])}return t}function Os(e){let t=[];for(let n of new Set(e))t.some(i=>W0(i,n))||t.push(n);return t}function W0(e,t){if(e===t)return!0;let n=e.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0),i=t.split(/\r?\n/).map(a=>a.trim()).filter(a=>a.length>0),r=Math.min(n.length,i.length);if(r===0)return!1;if(r<3)return e.includes(t)||t.includes(e);let o=new Set(i),s=n.filter(a=>o.has(a)).length;return s>=3&&s/r>=.6}import{existsSync as nA,readFileSync as iA,writeFileSync as rA}from"fs";import{isAbsolute as oA,join as sA}from"path";var Ce={dead:{minLoc:3,skipBarrels:!0,deadCodeOnly:!0,semantic:!1},isolated:{minLoc:3,semantic:!1},similar:{minSimilarity:.6,limit:50,minCallees:4,semantic:!1},extract:{minLoc:15,minCallees:5,limit:50,semantic:!1},wrappers:{maxLoc:15,limit:50,semantic:!1},passthroughs:{maxLoc:15,limit:50,semantic:!1},stale:{minLoc:3,limit:50,semantic:!1},drift:{semantic:!1}};import Yr from"path";function ti(e){let n=e.replace(/\\/g,"/").split("/").filter(Boolean);return n.length<=1?"(root)":n.length>=3&&["src","lib","app","server","client"].includes(n[0])?`${n[0]}/${n[1]}`:n[0]}function Vl(e,t){if(e===t)return"ok";let n=Bs(e),i=Bs(t);return n&&i?G0(n,i)?"ok":"violation":K0(e,t)}function ch(e,t){let n=Bs(ti(e)),i=Bs(ti(t));return!!n&&!!i}function Bs(e){return/^src\/([^/]+)$/.exec(e)?.[1]??null}function G0(e,t){return t==="instrumentation"||t==="domain"?!0:e==="domain"?!1:{analysis:new Set(["domain","source","storage","symbols"]),core:new Set(["analysis","domain","resolution","source","storage","symbols"]),"language-parsers":new Set(["domain","resolution","source","storage"]),queries:new Set(["analysis","core","domain","language-parsers","resolution","semantic","source","storage","symbols"]),reindex:new Set(["domain","language-parsers","resolution","runtime","semantic","source","storage","symbols"]),resolution:new Set(["domain","source","storage","symbols"]),runtime:new Set(["domain","queries","reindex","resolution","semantic","source","storage","symbols"]),semantic:new Set(["domain","resolution","storage","symbols"]),source:new Set(["domain","storage"]),storage:new Set(["domain","source"]),symbols:new Set(["analysis","domain","language-parsers","resolution","semantic","source","storage"])}[e]?.has(t)??!1}function K0(e,t){if(t==="shared")return"ok";let n={app:new Set(["core","shared","ui"]),core:new Set(["shared"]),infra:new Set(["core","shared"]),ui:new Set(["core","shared"])};return n[e]?n[e].has(t)?"ok":"violation":null}function ni(e,t){let{scope:n,minDeviation:i=5}=t??{},r=t?.semantic!==!1,o=t?.includePatternDeviations!==!1,a=new A(e).fileDependencyGraph(n);return Z0([...J0(e,a,{scope:n,semantic:r}),...Q0(a),...o?Y0(a,i):[]])}function J0(e,t,n){let i=n_(e,n.scope),r=[],o=new Set;for(let[a,c]of t){if(Zt(a))continue;let l=i.get(a)??new Set;for(let d of c)Zt(d)||l.has(d)||X0(e,a,d,n)||(r.push({file:a,dep:d}),o.add(a))}o.size>0&&o_(e,i,{paths:[...o]});let s=[];for(let{file:a,dep:c}of r)(i.get(a)??new Set).has(c)||s.push({file:a,kind:"unused-import",description:`Depends on ${c} but references none of its symbols`,dep:c,actionTier:"direct",evidenceReasons:[`dependency edge exists from ${a} to ${c}`,"no semantic, source, type-only, side-effect, or Vue-template usage survived the conservative skip gates"],recommendation:"Remove the unused import or dependency edge after running the project checks."});return s}function X0(e,t,n,i){return l_(e,t,n)||u_(e,t,n)||a_(n)||m_(e,t,n)||d_(n)?!0:i.semantic&&c_(e,t,n)}function Q0(e){let t=[],n=s_(e);for(let[i,r]of e){if(Zt(i))continue;let o=ti(i);for(let s of r){if(Zt(s))continue;let a=ti(s);if(o===a)continue;let c=Vl(o,a),l=c?"explicit":"inferred";if((c??n.get(`${o}->${a}`))==="violation"){let u=l==="explicit"?"direct":"signal";t.push({file:i,kind:"layer-violation",description:`Imports from ${a}/ (${s}) \u2014 may cross architectural boundary`,dep:s,detail:`${o}/ should not depend on ${a}/`,actionTier:u,policyBasis:l,evidenceReasons:[`dependency edge exists from ${i} to ${s}`,l==="explicit"?`explicit layer policy rejects ${o}/ -> ${a}/`:`rare cross-layer edge ${o}/ -> ${a}/ is inferred as a violation`],recommendation:l==="explicit"?"Move the dependency behind an allowed layer boundary or document a policy change.":"Review whether this is a real boundary break or an intentional exception before moving code."})}}}return t}function Y0(e,t){let n=[];for(let[i,r]of e_(e)){let o=r.filter(a=>!Zt(a));if(o.length<t)continue;let s=t_(e,o);for(let a of o)for(let c of e.get(a)??[])Zt(c)||(s.get(c)??0)===1&&Yr.dirname(c)!==i&&Yr.dirname(c)!==Yr.dirname(i)&&(ch(a,c)||n.push({file:a,kind:"pattern-deviation",description:`Only file in ${i}/ that depends on ${c}`,dep:c,actionTier:"signal",evidenceReasons:[`${o.length} sibling file(s) in ${i}/ were compared`,`${a} is the only non-skipped sibling depending on ${c}`],recommendation:"Review sibling ownership before changing this import; unique dependency shape can be intentional specialization."}))}return n}function Z0(e){return{results:e,unusedImports:e.filter(t=>t.kind==="unused-import").length,layerViolations:e.filter(t=>t.kind==="layer-violation").length,patternDeviations:e.filter(t=>t.kind==="pattern-deviation").length}}function e_(e){let t=new Map;for(let n of e.keys()){let i=Yr.dirname(n),r=t.get(i);r||(r=[],t.set(i,r)),r.push(n)}return t}function t_(e,t){let n=new Map;for(let i of t)for(let r of e.get(i)??[])Zt(r)||n.set(r,(n.get(r)??0)+1);return n}function n_(e,t){let n=new Map;return i_(e,n,t),n}function i_(e,t,n){for(let i of r_(e,n))lh(e,t,i.from_file,i.to_file)}function r_(e,t){let n=t?`AND d1.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT d1.relative_path AS from_file, d2.relative_path AS to_file
|
|
597
617
|
FROM mentions m
|
|
598
618
|
JOIN chunks c ON m.chunk_id = c.id
|
|
599
619
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -609,31 +629,33 @@ ${n}`.toLowerCase(),r=On(i,["historical note","historical record","history note"
|
|
|
609
629
|
WHERE d1.id != d2.id
|
|
610
630
|
AND m.role != 1
|
|
611
631
|
${e.pathExclusionsFor("d1","d2")}
|
|
612
|
-
${n}`)}function
|
|
613
|
-
`);return
|
|
614
|
-
`),o=Math.max(0,n-2),s=Math.min(r.length-1,n+2);for(let a=o;a<=s;a++){let l=(r[a]??"").replace(/^\s*\/\/.*$/g,"");if(/\b(?:export\s+)?(?:abstract\s+)?class\s+\w/.test(l))return"class";if(/\b(?:export\s+)?interface\s+\w/.test(l))return"interface";if(/\b(?:export\s+)?type\s+\w/.test(l))return"type";if(/\b(?:export\s+)?(?:const\s+)?enum\s+\w/.test(l))return"enum"}return"other"}function
|
|
615
|
-
`);for(let a=0;a<s.length;a++)if(!(a>=t.startLine&&a<=t.endLine)&&o.test(s[a]??""))return!0;return!1}function
|
|
632
|
+
${n}`)}function o_(e,t,n={}){new A(e).scanSourceReferences({paths:n.paths??O(e,{includeIgnored:!1}),includeRustAttributeNames:!0,identifierResolution:"permissive"},r=>{r.target.relativePath!==r.sourceFile&&(e.isIgnored(r.target.relativePath)||lh(e,t,r.sourceFile,r.target.relativePath))})}function lh(e,t,n,i){if(e.isIgnored(n)||e.isIgnored(i))return;let r=t.get(n);r||(r=new Set,t.set(n,r)),r.add(i)}function s_(e){let t=new Map;for(let[i,r]of e){if(Zt(i))continue;let o=ti(i);for(let s of r){if(Zt(s))continue;let a=ti(s);if(o===a||Vl(o,a))continue;let c=`${o}->${a}`;t.set(c,(t.get(c)??0)+1)}}let n=new Map;for(let[i,r]of t)n.set(i,r<=2?"violation":"ok");return n}function a_(e){return e.includes("types")||e.endsWith(".d.ts")}function c_(e,t,n){let i=Er(e,t).filter(r=>r.sourcePath===n);return i.length>0&&i.some(r=>r.isUsed)}function l_(e,t,n){let i=oe(e,t).filter(r=>r.sourcePath===n);return i.length>0&&i.some(r=>r.used)}function u_(e,t,n){let i=oe(e,t).filter(r=>r.sourcePath===n);return i.length>0&&i.every(r=>r.isTypeOnly===!0)}function d_(e){return e.endsWith(".vue")}function m_(e,t,n){let i=oe(e,t).filter(r=>r.sourcePath===n);return i.length===0?!1:i.every(r=>r.kind==="side-effect"||r.kind==="namespace"&&r.usedMembers.length===0&&!r.used)}function Zt(e){let t=Z(e);return!!(t==="entry"||t==="barrel"||t==="test"||t==="worker"||p_(Yr.basename(e)))}function p_(e){return!!(e==="index.ts"||e==="index.js"||e==="cli.ts"||e==="main.ts"||e==="main.rs"||e.includes("worker.")||e.includes("postinstall.")||e==="health.ts"||e==="health.js")}import{basename as uh,extname as dh}from"path";function Hs(e,t,n,i,r,o){let s=new Set;g_(e,t,n,i)&&s.add(r);for(let a of o)a.value&&f_(s,a.label,a.value);return[...s].slice(0,6)}function f_(e,t,n){let i=h_(n);t.endsWith("name")&&y_(i)&&e.add(`${t} has type-guard boundary shape`);for(let r of i){let o=b_.get(r);o&&e.add(`${t} has ${o} term: ${r}`)}}function g_(e,t,n,i){if(n<=0)return!1;let r=Ye(e,t);if(r.length===0)return!1;for(let o=n-1;o>=0&&o>=n-5;o-=1){let s=(r[o]??"").trim();if(s!==""){if(mr(s)===i)return!0;if(!s.startsWith("//")&&!s.startsWith("*")&&!s.startsWith("/*")&&!s.startsWith("@")&&!s.startsWith("#"))return!1}}return!1}function h_(e){return e.replace(/([A-Z])([A-Z][a-z])/g,"$1 $2").replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(Boolean)}function y_(e){return e.some(t=>S_.has(t))&&e.some(t=>x_.has(t))}var b_=new Map([["access","access policy"],["accessible","access policy"],["adapter","adapter"],["adapters","adapter"],["allow","access policy"],["allowed","access policy"],["animation","animation calculation"],["api","api surface"],["apply","settings/application"],["audit","side-effect boundary"],["auth","authorization"],["authorize","authorization"],["audio","audio side-effect"],["can","access policy"],["capabilities","capability boundary"],["capability","capability boundary"],["boundary","boundary"],["begin","lifecycle"],["bridge","bridge"],["bridges","bridge"],["cache","state cache"],["chase","gameplay action"],["command","command boundary"],["context","context policy"],["cooldown","temporal state"],["cooldowns","temporal state"],["controller","controller"],["controllers","controller"],["diagnostic","diagnostics"],["diagnostics","diagnostics"],["effect","side-effect boundary"],["effects","side-effect boundary"],["energy","gameplay calculation"],["expired","temporal state"],["facade","facade"],["facades","facade"],["fire","gameplay action"],["gateway","gateway"],["gateways","gateway"],["guard","guard"],["guards","guard"],["haptic","haptic side-effect"],["haptics","haptic side-effect"],["head","sequence boundary"],["history","state history"],["input","input boundary"],["jump","gameplay action"],["keyboard","input boundary"],["log","side-effect boundary"],["logger","side-effect boundary"],["lock","coordination boundary"],["middleware","middleware"],["multiplier","gameplay calculation"],["mute","audio side-effect"],["normalize","normalization"],["normalise","normalization"],["normalizer","normalization"],["oscillate","animation calculation"],["oscillation","animation calculation"],["overlap","collision predicate"],["performance","diagnostics"],["permission","access policy"],["permissions","access policy"],["policy","policy"],["pool","state pool"],["pooled","state pool"],["pools","state pool"],["predict","prediction"],["presenter","presenter"],["presenters","presenter"],["projectile","gameplay entity"],["provider","provider boundary"],["providers","provider boundary"],["public","public surface"],["quality","settings/application"],["rate","calculation"],["register","registry"],["registry","registry"],["relay","relay"],["relays","relay"],["reseed","state lifecycle"],["reset","state lifecycle"],["respond","response boundary"],["response","response boundary"],["resolve","resolution"],["resolver","resolution"],["route","route boundary"],["routes","route boundary"],["run","lifecycle"],["sample","diagnostics"],["score","gameplay calculation"],["scope","scope policy"],["scroll","position state"],["scrolled","position state"],["seed","state lifecycle"],["seeded","state lifecycle"],["segment","segment boundary"],["segments","segment boundary"],["setting","settings/application"],["settings","settings/application"],["spawn","gameplay lifecycle"],["spawning","gameplay lifecycle"],["speed","gameplay calculation"],["surface","public surface"],["tail","sequence boundary"],["tick","temporal state"],["transaction","transaction"],["transactional","transaction"],["transform","transformation"],["transformer","transformation"],["translate","translation"],["translator","translation"],["try","fallible action"],["validate","validation"],["validation","validation"],["validator","validation"],["visual","diagnostics"],["window","settings/application"],["socket","transport boundary"],["websocket","transport boundary"]]),S_=new Set(["can","has","is","should"]),x_=new Set(["access","api","auth","collision","expired","input","keyboard","overlap","permission","permissions","policy","projectile","response","route","routes","scope"]);function ii(e,t){let{scope:n,maxLoc:i=15,limit:r=30,scanLimit:o}=t??{},s=new A(e);return lt({candidates:()=>E_(e,s,n,i),orderCandidates:vs,scanLimit:o,profile:{name:"passthrough-candidates"},prepare:a=>s.calleeMap(a,{semantic:t?.semantic!==!1}),evaluate:(a,c)=>C_(e,a,c.get(a.symbolId)??[]),orderResults:(a,c)=>a.loc-c.loc||a.file.localeCompare(c.file),limit:r})}function C_(e,t,n){let i=D_(n);if(i.size!==1||!Ua(e,t.relativePath,t.startLine,t.endLine))return null;let[,r]=[...i.entries()][0],o=v_(e,t,r),s=k_(e,t),a=o.length>0||s.length>0?"signal":"direct";return{symbol:t.symbol,shortName:v(t.symbol),file:t.relativePath,startLine:t.startLine,endLine:t.endLine,loc:J(t),forwardsTo:r.symbol,forwardsToShort:v(r.symbol),forwardsToFile:r.file,actionTier:a,boundaryEvidence:o,publicFacadeEvidence:s,recommendation:R_(a,o,s)}}function v_(e,t,n){return Hs(e,t.relativePath,t.startLine,"passthrough","explicit ignore-passthrough comment",[{label:"passthrough name",value:v(t.symbol)},{label:"callee name",value:v(n.symbol)},{label:"passthrough module",value:uh(t.relativePath,dh(t.relativePath))},{label:"callee module",value:uh(n.file,dh(n.file))}])}function R_(e,t,n){if(e==="signal"){if(n.length>0)return`Review the public API before inlining; public-facade evidence: ${n.slice(0,2).join("; ")}.`;let i=t.filter(I_);return i.length>0?`Review the public API before inlining; public-surface evidence: ${i.slice(0,2).join("; ")}.`:`Review the boundary before inlining; boundary evidence: ${t.slice(0,2).join("; ")}.`}return"Inline or remove this passthrough unless an external API or runtime registration depends on the forwarding name."}function k_(e,t){return w_(e,t)?_i(e,t.relativePath)?["exported passthrough is declared on the package public surface"]:be(e,t.symbol,t.relativePath)?["exported passthrough matches configured or framework public entry surface"]:[]:[]}function w_(e,t){let n=Ye(e,t.relativePath);if(n.length===0)return!1;let i=n.slice(Math.max(0,t.startLine-2),t.startLine+1).join(`
|
|
633
|
+
`);return N_.test(i)?!0:P_(n,$(t.symbol))}function P_(e,t){if(!t)return!1;let n=new RegExp(`^\\s*export\\s*\\{[^}\\n]*\\b${L_(t)}\\b`);return e.some(i=>n.test(i))}function I_(e){return e.includes("public surface")}function L_(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function D_(e){let t=e.some(i=>de(i.symbol))?e.filter(i=>de(i.symbol)):e,n=new Map;for(let i of t)n.has(i.symbol)||n.set(i.symbol,i);return n}function E_(e,t,n,i){return t.productionCallableDefinitions({scope:n,minLoc:3,maxLoc:i,requireFunctionLikeSymbol:!0,excludeRustTraitImplMembers:!0}).filter(r=>!Ln(e,r))}var N_=/^\s*export\s+(?:default\s+)?(?:(?:async\s+)?function\b|(?:const|let|var)\b)/m;function ri(e,t){let{scope:n,minLoc:i=3,maxLoc:r=80,limit:o=30,includeLowConfidence:s=!1,scanLimit:a}=t??{},c=t?.semantic!==!1,l=new A(e),d=l.scopedDefinitions(n),u=q_(l,n),m={high:0,medium:1,low:2};return lt({candidates:()=>F_(e,l,d,{minLoc:i,maxLoc:r}),orderCandidates:(p,f)=>J(f)-J(p)||p.relativePath.localeCompare(f.relativePath),scanLimit:a,profile:{name:"stale-abstractions"},prepare:p=>{let f=__(p),g=T_(e,l,p,f,{semantic:c}),b=p.filter(x=>{let S=Vs(e,x,g,f);return S.realConsumers.length<=1&&!S.transitivelyReachable&&mh(x,S.realConsumers.length,u)});return{consumerFileMap:g,singletonBackedClassIds:$_(e,l,d,b,{semantic:c}),candidateIndex:f}},evaluate:(p,f)=>{if(f.singletonBackedClassIds.has(p.symbolId))return null;let g=Vs(e,p,f.consumerFileMap,f.candidateIndex);if(g.transitivelyReachable||g.realConsumers.length>1||g.realConsumers.length===0&&g.barrelConsumers>0||!mh(g.definition,g.realConsumers.length,u))return null;let b=A_(e,g);return!s&&b.confidence==="low"?null:b},orderResults:(p,f)=>m[p.confidence]-m[f.confidence]||f.loc-p.loc||p.file.localeCompare(f.file)||p.startLine-f.startLine,limit:o})}function F_(e,t,n,i){return n.filter(r=>r.isTypeLike&&J(r)>=i.minLoc).filter(r=>J(r)<=i.maxLoc).filter(r=>!e.isIgnored(r.relativePath)).filter(r=>Z(r.relativePath)!=="test").filter(r=>!be(e,r.symbol,r.relativePath)).filter(r=>!U_(r.symbol)).filter(r=>!t.hasSuppressionComment(r))}function ql(e,t,n,i){return Yt(Yn(e,t).forDefinitions(n,{semantic:i.semantic,sourceFallback:i.sourceFallback}))}function T_(e,t,n,i,r){let o=ql(e,t,n,{semantic:!1,sourceFallback:!1}),s=n.filter(l=>{let d=Vs(e,l,o,i);return d.realConsumers.length<=1&&!(d.realConsumers.length>0&&Ul(l.relativePath))}),a=r.semantic&&s.length>0?qn(o,ql(e,t,s,{semantic:!0,sourceFallback:!1})):o,c=s.filter(l=>Vs(e,l,a,i).realConsumers.length<=1);return qn(a,ql(e,t,c,{semantic:!1,sourceFallback:!0}))}function __(e){let t=new Map;for(let n of e){let i=t.get(n.relativePath);i||(i=new Map,t.set(n.relativePath,i));let r=$(n.symbol);r&&i.set(r,n)}return t}function Vs(e,t,n,i){let o=[...n.get(t.symbolId)??new Set].filter(d=>d!==t.relativePath&&!e.isIgnored(d)),{realConsumers:s,barrelConsumers:a,importOnlyConsumers:c}=Ls(e,t,o),l=z_(e,t,n,i);return{definition:t,realConsumers:s,barrelConsumers:a+c,transitivelyReachable:l}}function A_(e,t){let n=fh(e,t.definition.relativePath,t.definition.startLine),i=Ul(t.definition.relativePath)?!0:W_(e,t.definition),{confidence:r,reason:o}=G_(t.realConsumers.length,n,i),s=M_(t.realConsumers.length,n,i);return{symbol:t.definition.symbol,shortName:v(t.definition.symbol),file:t.definition.relativePath,startLine:t.definition.startLine,endLine:t.definition.endLine,loc:J(t.definition),consumers:t.realConsumers.length,barrelConsumers:t.barrelConsumers,kind:n,definerUsesType:i,confidence:r,reason:o,actionTier:s.actionTier,stalenessKind:s.stalenessKind,recommendation:s.recommendation}}function M_(e,t,n){return e===0?{actionTier:"direct",stalenessKind:"unused-abstraction",recommendation:"Delete the abstraction or wire the missing consumer after checking public/package surfaces."}:t==="class"?{actionTier:"signal",stalenessKind:"one-to-one-class-encapsulation",recommendation:"Treat as weak signal: a one-consumer class may be intentional encapsulation, so inline only after reviewing ownership and state boundaries."}:n?{actionTier:"signal",stalenessKind:"single-consumer-abstraction",recommendation:"Review whether this single-consumer abstraction earns its name or should be folded into the owning feature."}:{actionTier:"signal",stalenessKind:"misplaced-single-consumer-type",recommendation:"Review moving or co-locating the type with its only real consumer; keep it here only if this file owns the public contract."}}function $_(e,t,n,i,r){let o=O_(e,j_(n),i),s=o.map(l=>l.singleton);if(o.length===0)return new Set;let a=Yt(Yn(e,t).forDefinitions(s,{semantic:r.semantic,sourceFallback:!0})),c=new Set;for(let{singleton:l,classId:d}of o)H_(e,l,a)&&c.add(d);return c}function j_(e){let t=new Map;for(let n of e){let i=$(n.symbol);i&&t.set(ph(n.relativePath,i),n)}return t}function O_(e,t,n){let i=[];for(let r of n){let o=B_(e,t,r);o&&i.push({singleton:o,classId:r.symbolId})}return i}function B_(e,t,n){if(fh(e,n.relativePath,n.startLine)!=="class")return null;let i=$(n.symbol);if(!i)return null;let r=V_(e,n.relativePath,i);return r?t.get(ph(n.relativePath,r))??null:null}function H_(e,t,n){let i=$(t.symbol),r=n.get(t.symbolId);return!i||!r?!1:[...r].some(o=>o!==t.relativePath&&!e.isIgnored(o)&&!hl(e,o,i))}function ph(e,t){return`${e}\0${t}`}function V_(e,t,n){let i=M(e,t);if(!i)return null;let r=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\bexport\\s+const\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*new\\s+${r}\\s*\\(`);return i.match(o)?.[1]??null}function q_(e,t){return new Set(e.scopedDefinitions(t).filter(n=>n.isFunctionLike).map(n=>n.relativePath))}function U_(e){let t=Ie(e);if("kind"in t)return!1;let n=t.descriptors;if(n.length<2)return!1;let i=n[n.length-1],r=n[n.length-2];return i?.suffix==="type"&&r?.suffix==="type"}function Ul(e){let n=(e.split("/").pop()??"").replace(/\.[^.]+$/,"");return!!(n==="types"||n.endsWith("-types")||n==="models"||n==="schema"||n==="common"||n==="protocol"||n==="proto"||n==="dto"||n==="mod"||n==="contracts"||/(^|\/)types(\/|\.)/.test(e)||/(^|\/)models?(\/|\.)/.test(e)||/(^|\/)proto(?:col)?(\/|\.)/.test(e)||/(^|\/)schema(\/|\.)/.test(e)||/(^|\/)contracts?(\/|\.)/.test(e))}function mh(e,t,n){return!(Ul(e.relativePath)&&t>0||t===0&&n.has(e.relativePath))}function z_(e,t,n,i){let r=Wa(e,t.relativePath),o=$(t.symbol);if(!o)return!1;let s=r.get(o);if(!s||s.size===0)return!1;let a=i.get(t.relativePath);if(!a)return!1;for(let c of s){let l=a.get(c);if(!l)continue;let d=n.get(l.symbolId);if(d){for(let u of d)if(u!==t.relativePath&&!e.isIgnored(u))return!0}}return!1}function fh(e,t,n){let i=M(e,t);if(!i)return"other";let r=i.split(`
|
|
634
|
+
`),o=Math.max(0,n-2),s=Math.min(r.length-1,n+2);for(let a=o;a<=s;a++){let l=(r[a]??"").replace(/^\s*\/\/.*$/g,"");if(/\b(?:export\s+)?(?:abstract\s+)?class\s+\w/.test(l))return"class";if(/\b(?:export\s+)?interface\s+\w/.test(l))return"interface";if(/\b(?:export\s+)?type\s+\w/.test(l))return"type";if(/\b(?:export\s+)?(?:const\s+)?enum\s+\w/.test(l))return"enum"}return"other"}function W_(e,t){let n=M(e,t.relativePath);if(!n)return!1;let i=$(t.symbol);if(!i)return!1;let r=i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\b${r}\\b`),s=n.split(`
|
|
635
|
+
`);for(let a=0;a<s.length;a++)if(!(a>=t.startLine&&a<=t.endLine)&&o.test(s[a]??""))return!0;return!1}function G_(e,t,n){return e===0?{confidence:"high",reason:"unused \u2014 no consumers and defining file has no real usage"}:e===1&&t==="class"?{confidence:"low",reason:"1 consumer + class kind \u2014 likely 1:1 encapsulation, not over-abstraction"}:e===1&&!n?{confidence:"high",reason:"1 consumer + defining file never uses it \u2014 type belongs with its consumer"}:{confidence:"medium",reason:"1 consumer \u2014 single-use abstraction"}}import{basename as Wi,extname as qs}from"path";function oi(e,t){let{scope:n,maxLoc:i=15,limit:r=30,scanLimit:o}=t??{},s=new A(e),a=Z_(s.fileDependencyGraph(n));return lt({candidates:()=>X_(e,s,n,i),orderCandidates:vs,scanLimit:o,profile:{name:"wrapper-candidates"},prepare:c=>({callerFileMap:K_(e,s,c,{semantic:t?.semantic!==!1}),reverseFanIn:a}),evaluate:(c,l)=>J_(e,s,c,l),orderResults:(c,l)=>l.callerFanIn-c.callerFanIn||l.loc-c.loc,limit:r})}function K_(e,t,n,i){let r=Yn(e,t),o=Yt(r.forDefinitions(n,{semantic:!1,sourceFallback:!1})),s=[];i.semantic&&D("wrapper.semantic-candidates",()=>{s=n.filter(m=>zl(e,t,m,o).length<=1)},()=>({symbols:n.length,semanticCandidates:s.length}));let a=s.length===0?new Map:Yt(r.forDefinitions(s,{semantic:!0,sourceFallback:!1})),c=a.size===0?o:qn(o,a),l=new Map(n.map(m=>[m.symbolId,m])),d=new Map;for(let m of n){let p=zl(e,t,m,c);if(p.length>1||(d.set(m.symbolId,m),p.length!==1))continue;let f=p[0],g=gh(e,m.symbolId,f);if(!g)continue;let b=hh(t,e,f,m.symbol,g);b?.isFunctionLike&&l.has(b.symbolId)&&d.set(b.symbolId,l.get(b.symbolId))}let u=[...d.values()];return u.length===0?c:qn(c,Yt(r.forDefinitions(u,{semantic:!1,sourceFallback:!0})))}function J_(e,t,n,i){let r=zl(e,t,n,i.callerFileMap);if(r.length!==1)return null;let o=r[0],s=gh(e,n.symbolId,o);if(!s)return null;let a=hh(t,e,o,n.symbol,s);if(a&&Ii(a.symbol))return null;let{fanIn:c,source:l}=Q_(i.callerFileMap,i.reverseFanIn,o,a);if(l==="function"?c<=3:c<=5)return null;let d=tA(e,n,o,a);return{symbol:n.symbol,shortName:v(n.symbol),file:n.relativePath,startLine:n.startLine,endLine:n.endLine,loc:J(n),singleCaller:a?.symbol??"",singleCallerShort:a?.isFunctionLike?v(a.symbol):Wi(o),callerFanIn:c,actionTier:d.length>0?"signal":"direct",boundaryEvidence:d}}function X_(e,t,n,i){return t.productionCallableDefinitions({scope:n,minLoc:2,maxLoc:i,requireFunctionLikeSymbol:!0,excludeRootedSymbols:!0}).filter(r=>!Ln(e,r))}function zl(e,t,n,i){let r=Wi(n.relativePath,qs(n.relativePath)),o=[...i.get(n.symbolId)??[]].filter(s=>s!==n.relativePath).filter(s=>Wi(s,qs(s))!==r).filter(s=>{let a=t.fileKind(s);return a!=="barrel"&&a!=="entry"&&a!=="test"});return Ls(e,n,o).realConsumers}function gh(e,t,n){return e.get(`SELECT c.start_line, c.end_line
|
|
616
636
|
FROM mentions m
|
|
617
637
|
JOIN chunks c ON m.chunk_id = c.id
|
|
618
638
|
JOIN documents d ON c.document_id = d.id
|
|
619
639
|
WHERE m.symbol_id = ? AND m.role != 1 AND d.relative_path = ?
|
|
620
|
-
LIMIT 1`,t,n)}function
|
|
621
|
-
`),{path:i,findingCount:n.length}}function
|
|
640
|
+
LIMIT 1`,t,n)}function hh(e,t,n,i,r){let o=e.definitionsForFile(n),s=Y_(t,n,i,r.start_line,r.end_line);return ot(o,s)}function Q_(e,t,n,i){if(i?.isFunctionLike){let r=[...e.get(i.symbolId)??[]].filter(o=>o!==i.relativePath);if(r.length>0)return{fanIn:r.length,source:"function"}}return{fanIn:eA(t,n),source:"file"}}function Y_(e,t,n,i,r){let o=$(n);if(!o)return i;let s=Kt(e,t).get(o);if(!s||s.length===0)return i;for(let a of s)if(a>=i&&a<=r)return a;return i}function Z_(e){let t=new Map;for(let[n,i]of e){t.has(n)||t.set(n,t.get(n)??0);for(let r of i)t.set(r,(t.get(r)??0)+1)}return t}function eA(e,t){let n=e.get(t)??0;if(n>0)return n;let i=Wi(t,qs(t)),r=0;for(let[o,s]of e)o!==t&&Wi(o,qs(o))===i&&s>r&&(r=s);return r}function tA(e,t,n,i){return Hs(e,t.relativePath,t.startLine,"wrapper","explicit ignore-wrapper comment",[{label:"wrapper name",value:v(t.symbol)},{label:"caller name",value:i?.symbol?v(i.symbol):Wi(n)},{label:"wrapper path",value:t.relativePath},{label:"caller path",value:n}])}var aA=25e3,cA=2500,lA=2500;function uA(e){let t=We(e);return t.symbols>=aA||t.documents>=cA?lA:void 0}var dA=".scipquery-baseline.json";function Us(e,t){return t&&oA(t)?t:sA(e.config.projectRoot,t??dA)}function Wl(e,t={}){let{scope:n}=t,i=uA(e),r=[],o=Qt(e,{scope:n,...Ce.dead,scanLimit:i});for(let s of o.symbols)Oe(e,s.relativePath)||be(e,s.symbol,s.relativePath)||s.kind==="dead-code"&&r.push(`dead:${s.relativePath}:${s.shortName}`);for(let s of zn(e,{scope:n,...Ce.isolated,scanLimit:i}))Oe(e,s.relativePath)||be(e,s.symbol,s.relativePath)||r.push(`isolated:${s.relativePath}:${s.shortName}`);for(let s of Un(e,{scope:n}))s.kind==="real"&&r.push(`cycle:${mA(s.path)}`);for(let s of Wn(e,{scope:n,...Ce.similar,scanLimit:i}))r.push(`similar:${[s.symbolA,s.symbolB].sort().join("|")}`);for(let s of Qn(e,{scope:n,...Ce.extract,scanLimit:i}))r.push(`extract:${s.relativePath}:${s.shortName}`);for(let s of oi(e,{scope:n,...Ce.wrappers,scanLimit:i}))r.push(`wrapper:${s.file}:${s.shortName}`);for(let s of ii(e,{scope:n,...Ce.passthroughs,scanLimit:i}))r.push(`passthrough:${s.file}:${s.shortName}`);for(let s of ri(e,{scope:n,...Ce.stale,scanLimit:i}))r.push(`stale:${s.file}:${s.shortName}`);for(let s of ni(e,{scope:n,...Ce.drift,includePatternDeviations:!1}).results)r.push(`drift:${s.kind}:${s.file}:${s.dep}`);return[...new Set(r)].sort()}function mA(e){if(e.length===0)return"";let t=0;for(let n=1;n<e.length;n++)e[n]<e[t]&&(t=n);return[...e.slice(t),...e.slice(0,t)].join(">")}function Gl(e,t={}){let n=Wl(e,{scope:t.scope}),i=Us(e,t.path);return rA(i,JSON.stringify({version:1,findings:n},null,2)+`
|
|
641
|
+
`),{path:i,findingCount:n.length}}function Zr(e,t={}){let n=Us(e,t.path);if(!nA(n))throw new Error(`No baseline found at ${n}. Create one with: scip-query health --write-baseline`);let i=JSON.parse(iA(n,"utf-8")),r=new Set(i.findings??[]),o=Wl(e,{scope:t.scope}),s=new Set(o);return{baselinePath:n,baselineCount:r.size,current:o,newFindings:o.filter(a=>!r.has(a)),fixedFindings:[...r].filter(a=>!s.has(a))}}var pA=5;function eo(e,t={}){let{base:n="HEAD",minContainment:i=.7,minCallees:r=3,minSiteCoverage:o=.4,maxHelpers:s=Number.POSITIVE_INFINITY,limit:a=20,scanLimit:c}=t,l=t.semantic!==!1,d=t.diffPlan??Tt(e,{base:n}),u={available:d.note!==Al,base:n,changedFiles:d.changedFiles,helpersChecked:0,skipped:[],findings:[]};if(!u.available||d.changedFiles.length===0)return u;let m=new A(e),p=new Set(d.changedFiles),f=new Map(d.renamedFiles.map(L=>[L.to,L.from])),g=t.baseContentAt??Kr(e.config.projectRoot,n,Jr(d)),b=SA(m,p,f,g);if(b.length===0)return u;let x=b.slice(0,s);b.length>s&&(u.note=`helper scoring capped at ${s} of ${b.length} new symbols`);let S=m.calleeMap(x,{semantic:l}),R=x.map(L=>({def:L,callees:ws((S.get(L.symbolId)??[]).map(k=>k.symbol))})),C=Vi(e),y,w=()=>(y??=C.calleeIndex({minCallees:Math.min(3,r),scanLimit:c,semantic:l}),y);for(let{def:L,callees:k}of R){let T=v(L.symbol);if(k.size<r){u.skipped.push({helperShortName:T,helperFile:L.relativePath,reason:`fewer than ${r} meaningful callees \u2014 too small to score`});continue}let U=w(),Y=bA(k,U);if(Y===0){u.skipped.push({helperShortName:T,helperFile:L.relativePath,reason:"helper callee pattern is all project-wide infrastructure \u2014 too generic to score"});continue}let ee=xA(e,L.symbolId);if(ee.length===0){u.skipped.push({helperShortName:T,helperFile:L.relativePath,reason:"no references yet \u2014 covered by the new-dead check"});continue}u.helpersChecked+=1;let we=fA({candidateIndex:U,changed:p,helperCallees:k,helperFile:L.relativePath,helperSymbol:L.symbol,minContainment:i,minSiteCoverage:o,migratedFiles:ee});we.length!==0&&(we.sort((te,rn)=>yh(rn.migrationScope)-yh(te.migrationScope)||rn.containment-te.containment||rn.siteCoverage-te.siteCoverage||te.file.localeCompare(rn.file)),u.findings.push({helperSymbol:L.symbol,helperShortName:T,helperFile:L.relativePath,helperShape:"specific-callee-cluster",helperCalleeCount:k.size,specificHelperCalleeCount:Y,migratedFiles:ee.sort(),leftovers:we.slice(0,pA)}))}return u.findings.sort((L,k)=>(k.leftovers[0]?.containment??0)-(L.leftovers[0]?.containment??0)||L.helperFile.localeCompare(k.helperFile)),u.findings=u.findings.slice(0,a),u}function fA(e){let t=[],n=gA(e.helperSymbol,e.helperFile,e.migratedFiles),i=new Set;for(let r of e.helperCallees)for(let o of e.candidateIndex.candidateIndexesByCallee.get(r)??[])i.add(o);for(let r of i){let o=e.candidateIndex.corpus[r];if(o.symbol===e.helperSymbol||e.changed.has(o.file)||o.callees.has(e.helperSymbol))continue;let s=Wf(e.helperCallees,o.callees);if(s<e.minContainment)continue;let a=[...e.helperCallees].filter(d=>o.callees.has(d)),c=o.callees.size===0?0:a.length/o.callees.size;if(c<e.minSiteCoverage||!a.some(d=>(e.candidateIndex.docFreq.get(d)??0)<=e.candidateIndex.ubiquityThreshold))continue;let l=hA(n,o.symbol,o.file);t.push({symbol:o.symbol,shortName:v(o.symbol),file:o.file,...l,containment:s,siteCoverage:c,uniqueSiteCalleeCount:Math.max(0,o.callees.size-a.length),sharedCallees:a.map(v).sort()})}return t}function yh(e){return e==="same-scope"?2:e==="unknown"?1:0}function gA(e,t,n){let i=new Set([...Kl(t),...Jl($(e))]);for(let r of n)for(let o of Kl(r))i.add(o);return i}function hA(e,t,n){let i=new Set([...Kl(n),...Jl($(t))]);if(e.size===0||i.size===0)return{migrationScope:"unknown",migrationScopeReasons:["insufficient path/name tokens to infer migration scope"]};let r=[...i].filter(o=>e.has(o)).sort();return r.length>0?{migrationScope:"same-scope",migrationScopeReasons:[`shares migration-scope token(s): ${r.slice(0,5).join(", ")}`]}:{migrationScope:"possible-subtype",migrationScopeReasons:["no path/name tokens shared with the helper or already migrated files"]}}var yA=new Set(["app","apps","common","component","components","helper","helpers","index","lib","package","packages","page","pages","route","routes","service","services","shared","spec","src","test","tests","util","utils"]);function Kl(e){return Jl(e.replace(/\.[^.]+$/,""))}function Jl(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>1&&!yA.has(t))}function bA(e,t){let n=0;for(let i of e)(t.docFreq.get(i)??0)<=t.ubiquityThreshold&&(n+=1);return n}function SA(e,t,n,i){return e.productionCallableDefinitions({files:[...t],requireFunctionLikeSymbol:!0}).filter(r=>{if(!t.has(r.relativePath))return!1;let o=n.get(r.relativePath)??r.relativePath,s=i(o);return s===null||!new RegExp(`\\b${CA(r.leaf)}\\b`).test(s)})}function xA(e,t){return e.all(`SELECT DISTINCT ref_d.relative_path
|
|
622
642
|
FROM mentions m
|
|
623
643
|
JOIN chunks c ON m.chunk_id = c.id
|
|
624
644
|
JOIN documents ref_d ON c.document_id = ref_d.id
|
|
625
645
|
WHERE m.symbol_id = ?
|
|
626
646
|
AND m.role != 1
|
|
627
|
-
${e.pathExclusionsFor("ref_d")}`,t).map(i=>i.relative_path)}function $0(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Hr(e,t={}){let{scope:n,limit:i=30,scanLimit:r}=t,o=new A(e);return it({candidates:()=>o.productionCallableDefinitions({scope:n,files:t.files,minLoc:2,excludeRootedSymbols:!0,requireFunctionLikeSymbol:!0}).filter(s=>M0(s.relativePath)),scanLimit:r,evaluate:s=>{let a=ye(e,s.relativePath)?.callables.find(u=>u.startLine===s.startLine&&u.endLine===s.endLine);if(!a||a.params.length===0||a.params.some(u=>!u.simple)||a.paramsEndLine>=a.endLine)return null;let c=_t(e,s.relativePath),l=[];for(let u=a.params.length-1;u>=0;u--){let d=a.params[u];if(d.name===""||d.name.startsWith("_")||O0(c.get(d.name),a.paramsEndLine,a.endLine))break;l.unshift(d.name)}return l.length===0?null:{symbol:s.symbol,shortName:v(s.symbol),file:s.relativePath,startLine:s.startLine,endLine:s.endLine,paramCount:a.paramCount,unusedTrailing:l}},orderResults:(s,a)=>a.unusedTrailing.length-s.unusedTrailing.length||s.file.localeCompare(a.file)||s.startLine-a.startLine,limit:i})}function M0(e){let t=K(e);return t==="typescript"||t==="tsx"||t==="javascript"}function O0(e,t,n){return e?e.some(i=>i>t&&i<=n):!1}var ws=["echo","incomplete-migration","co-change-partner","doc-reference","unused-params","new-dead","baseline"];function Vr(e,t={}){let n=t.base??"HEAD",{minTogether:i=6,minConfidence:r=.6,maxEchoChecks:o=Number.POSITIVE_INFINITY,maxHelpers:s=Number.POSITIVE_INFINITY,minSimilarity:a=.8,includeBaseline:c=!1,scanLimit:l}=t,u=t.semantic!==!1,d=new Set(t.skip??[]),m=vt(e,{base:n}),p=Ti(e,{base:n,plan:m}),f=p.changedFiles,g=new Set(f),y=new Set(m.changedFileLines),S=new Set([...g,...y]),R=_r(e.config.projectRoot,n,Ar(m,f)),k=uF(e.config.projectRoot,n,m,R),x={base:n,changedFiles:f,changedSymbols:p.changedSymbols.length,checksRun:[],skipped:[],suppressed:[],findings:[],rootCauseGroups:[],note:p.summary.note};if(f.length===0)return x;let b=(C,D)=>{if(d.has(C)){x.skipped.push({check:C,reason:"skipped via --skip"});return}let w=x.findings.length,j=x.skipped.length,J=x.checksRun.length;T(`diff-gate.check.${C}`,D,()=>({check:C,changedFiles:f.length,changedSymbols:p.changedSymbols.length,findingsAdded:x.findings.length-w,skippedAdded:x.skipped.length-j,checksRunAdded:x.checksRun.length-J}))};return b("echo",()=>W0(e,p.changedSymbols,g,k,o,a,l,u,x)),b("incomplete-migration",()=>eF(e,n,m,s,l,u,R,x)),b("co-change-partner",()=>tF(e,S,i,r,x)),b("doc-reference",()=>sF(e,g,y,m.changedRanges,x)),b("unused-params",()=>aF(e,f,x)),b("new-dead",()=>cF(e,p.changedSymbols,k,x)),c&&b("baseline",()=>pF(e,x)),q0(x,e.config.suppressions??[]),x.rootCauseGroups=B0(x.findings),x}function B0(e){let t=new Map;for(let n of e){let i=n.groupKey??`${n.check}:${n.id}`,r=t.get(i);r||(r={groupKey:i,check:n.check,severity:n.severity,actionTier:n.actionTier,sourceAnalyzer:n.sourceAnalyzer,rootCauseKey:n.rootCauseKey,count:0,findingIds:[],files:new Set,relatedFiles:new Set,message:n.message,remediation:n.remediation},t.set(i,r)),r.count+=1,r.findingIds.push(n.id),r.severity=H0(r.severity,n.severity),r.actionTier=V0(r.actionTier,n.actionTier),n.file&&r.files.add(n.file);for(let o of n.relatedFiles??[])r.relatedFiles.add(o)}return[...t.values()].map(n=>({...n,files:[...n.files].sort(),relatedFiles:[...n.relatedFiles].sort()})).sort((n,i)=>i.count-n.count||ks(i.severity)-ks(n.severity)||n.groupKey.localeCompare(i.groupKey))}function H0(e,t){return ks(t)>ks(e)?t:e}function ks(e){return e==="error"?2:e==="warning"?1:0}function V0(e,t){return e?t&&tg(t)>tg(e)?t:e:t}function tg(e){return e==="direct"?2:e==="signal"?1:0}function q0(e,t){if(t.length===0||e.findings.length===0)return;let n=[];for(let i of e.findings){let r=t.find(o=>U0(o,i));r?e.suppressed.push({finding:i,suppression:r}):n.push(i)}e.findings=n}function U0(e,t){return!e.reason||e.reason.trim()===""||e.expiresAt&&Date.parse(e.expiresAt)<=Date.now()||e.id&&e.id!==t.id||e.check&&e.check!==t.check||e.file&&e.file!==t.file?!1:!!(e.id||e.check)}function Ai(e,t){e.findings.push({...t,suppressionHint:`scip-query: ignore ${t.check} ${t.id} -- <reason>`})}function W0(e,t,n,i,r,o,s,a,c){c.checksRun.push("echo");for(let l of t.slice(0,r)){if(!le(l.symbol)||i(l))continue;let u=Dr(e,l.symbol,{minSimilarity:o,limit:5,scanLimit:s,semantic:a,sourceCandidateMode:"target-pruned"}),d=[];for(let g of u){let y=g.fileA===l.file?g.fileB:g.fileA,S=g.fileA===l.file?g.shortNameB:g.shortNameA,R=g.fileA===l.file?g.symbolB:g.symbolA;n.has(y)||d.push({otherFile:y,otherShort:S,otherSymbol:R,similarity:g.similarity,similarityBasis:g.similarityBasis??"callees",sharedEvidence:g.sharedCallees})}if(d.length===0)continue;let m=d[0],p=Un("echo",l.symbol,l.file,...d.map(g=>`${g.otherSymbol}|${g.otherFile}`).sort()),f=z0(l,d);Ai(c,{id:p,groupKey:p,actionTier:f,check:"echo",severity:"warning",evidence:"heuristic",confidence:m.similarity,file:l.file,symbol:l.symbol,relatedFiles:[...new Set(d.map(g=>g.otherFile))].sort(),message:X0(l,d),why:Y0(l,d),remediation:Z0(f,l.shortName,m.otherShort)})}t.length>r&&c.skipped.push({check:"echo",reason:`echo check capped at ${r} of ${t.length} changed symbols`})}function z0(e,t){return t.some(i=>G0(e.symbol,i))?"direct":"signal"}function G0(e,t){if(t.similarityBasis!=="source-tokens"||t.similarity<.98||t.sharedEvidence.length>8)return!1;let n=M(e),i=M(t.otherSymbol);return!n||!i?!1:n===i?!0:Q0(t.sharedEvidence)?!1:J0(n,i)}function J0(e,t){let n=ng(e),i=ng(t);if(n.length===0||i.length===0)return!1;let r=new Set(i),o=n.filter(s=>r.has(s)).length;return o>=2&&o/Math.min(n.length,i.length)>=.5}function ng(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).map(t=>t.toLowerCase()).filter(t=>t.length>=2)}var K0=new Set(["bytes","crypto","hex","num","random","secret","to","token"]);function Q0(e){return e.length>=3&&e.every(t=>K0.has(t.toLowerCase()))}function X0(e,t){let n=t[0],i=Math.round(n.similarity*100);return t.length===1?`${e.shortName} (${e.file}) is ${i}% similar to established ${n.otherShort} (${n.otherFile})`:`${e.shortName} (${e.file}) resembles ${t.length} established symbol(s); strongest is ${i}% similar to ${n.otherShort} (${n.otherFile})`}function Y0(e,t){let n=[`${e.shortName} was changed in this diff.`];for(let i of t.slice(0,3))n.push(`${i.otherShort} is outside this diff and scored ${Math.round(i.similarity*100)}% similar by ${i.similarityBasis} evidence.`),n.push(`Shared evidence: ${i.sharedEvidence.slice(0,5).join(", ")||"(none listed)"}.`);return t.length>3&&n.push(`${t.length-3} additional similar match(es) grouped into this finding.`),n}function Z0(e,t,n){return e==="direct"?`Extract or reuse the shared behavior with ${n}, or keep the duplicate with a suppression reason.`:`Review whether ${t} is intentionally parallel to the established implementation(s); extract shared behavior only if the product semantics match.`}function eF(e,t,n,i,r,o,s,a){let c=Br(e,{base:t,maxHelpers:i,diffPlan:n,scanLimit:r,semantic:o,baseContentAt:s});if(!c.available){a.skipped.push({check:"incomplete-migration",reason:"no git history"});return}a.checksRun.push("incomplete-migration"),c.note&&a.skipped.push({check:"incomplete-migration",reason:c.note});for(let l of c.findings){let u=l.leftovers.map(y=>`${y.shortName} (${y.file}, ${Math.round(y.containment*100)}% helper / ${Math.round(y.siteCoverage*100)}% site, ${y.migrationScope})`).join(", "),d=l.leftovers.map(y=>`${y.shortName}: ${y.migrationScope} (${y.migrationScopeReasons[0]})`).join("; "),m=[...l.migratedFiles,...l.leftovers.map(y=>y.file)],p=l.leftovers.length===0?void 0:Math.max(...l.leftovers.map(y=>Math.min(y.containment,y.siteCoverage))),f=l.leftovers.some(y=>y.migrationScope==="possible-subtype"),g=Un("incomplete-migration",l.helperSymbol,l.helperFile,m.join("|"));Ai(a,{id:g,check:"incomplete-migration",severity:"warning",evidence:"heuristic",confidence:p,file:l.helperFile,symbol:l.helperSymbol,relatedFiles:m,message:`new helper ${l.helperShortName} (${l.helperFile}) is wired into ${l.migratedFiles.length} file(s), but ${l.leftovers.length} similar un-migrated site(s) remain: ${u}`,why:[`${l.helperShortName} is new in this diff and already referenced by ${l.migratedFiles.join(", ")}.`,`Helper shape: ${l.helperShape}; ${l.specificHelperCalleeCount}/${l.helperCalleeCount} helper callees are specific enough to score.`,`Unchanged site(s) still contain the helper's callee pattern: ${u}.`,`Migration scope hints: ${d}.`],remediation:f?`Migrate same-scope sites to ${l.helperShortName}; review possible subtype/variant sites before applying the helper.`:`Migrate the remaining sites to ${l.helperShortName}, or confirm they are intentionally different.`})}}function tF(e,t,n,i,r){let o=kf(e,t,{minTogether:n,minConfidence:0,maxFilesPerCommit:20});if(!o){r.skipped.push({check:"co-change-partner",reason:"no git history"});return}r.checksRun.push("co-change-partner");let s=new Set,a;for(let c of o){let l=t.has(c.fileA),u=t.has(c.fileB);if(l===u)continue;let d=l?c.fileA:c.fileB,m=l?c.fileB:c.fileA,p=l?c.changesA:c.changesB,f=p>0?c.together/p:0;if(f<i||Kc(m)||Kc(d)||!ig(`${e.config.projectRoot}/${m}`))continue;let g=`${d}|${m}`;if(s.has(g))continue;s.add(g);let y=Un("co-change-partner",d,m,String(c.together)),S=Qc(d,m),R=Xc({fileA:d,fileB:m,together:c.together,confidence:f,commitScope:c.commitScope,recency:c.recency,subjectContext:c.subjectContext},S,(a??=Yc(e))(d,m)),k=[d,m].sort().join("|");r.findings.push({id:y,check:"co-change-partner",severity:"warning",evidence:"change-graph",actionTier:"signal",groupKey:`co-change-partner:${k}`,confidence:f,file:d,relatedFiles:[m],sourceAnalyzer:"co-change",rootCauseKey:k,partnerClass:S.partnerClass,partnerClassReasons:S.reasons,commitScope:c.commitScope,recency:c.recency,focusedTogether:c.focusedTogether,broadTogether:c.broadTogether,broadCommitRatio:c.broadCommitRatio,lastTogetherAt:c.lastTogetherAt,recentTogether:c.recentTogether,subjectContext:c.subjectContext,...R?{declaredCouplingSuggestion:R}:{},message:`${d} changed, but ${m} did not \u2014 they change together ${c.together}x (${Math.round(f*100)}% of the time)`,why:[`${d} is in this diff and ${m} is not.`,`Git history shows ${c.together} co-change(s), which is ${Math.round(f*100)}% of changes to the edited side.`,`History context: ${nF(c)}.`,`Subject context: ${iF(c.subjectContext)}.`,...rF(c),`Partner class: ${S.partnerClass} (${S.reasons.join("; ")}).`],remediation:R?`Update ${m} alongside this change, declare the coupling "${R.name}", or confirm the coupling no longer holds.`:`Update ${m} alongside this change, or confirm the coupling no longer holds.`})}}function nF(e){return`${e.commitScope}/${e.recency}; ${e.focusedTogether} focused, ${e.broadTogether} broad-sweep (${Math.round(e.broadCommitRatio*100)}% broad), ${e.recentTogether} recent, last ${oF(e.lastTogetherAt)}`}function iF(e){let t=e.subjectLabels.length>0?e.subjectLabels.slice(0,5).join(", "):"none inferred",n=e.issueRefs.length>0?e.issueRefs.slice(0,5).join(", "):"none",i=e.sampleSubjects.length>0?e.sampleSubjects.slice(0,3).map(r=>`"${r}"`).join("; "):"none";return`labels ${t}; refs ${n}; samples ${i}; external issue/PR labels ${e.externalIssueLabelStatus}`}function rF(e){let t=[];return e.commitScope==="broad-sweep"&&t.push("Broad-sweep history is weaker than focused co-edits; confirm this is a real coordination contract."),e.recency==="stale"&&t.push("The pair has no co-change in the recent history window; confirm the coupling still holds."),t}function oF(e){return e<=0?"unknown":new Date(e*1e3).toISOString().slice(0,10)}function sF(e,t,n,i,r){r.checksRun.push("doc-reference");let o=Fi.referenceTargets(e,t,i);if(o.size!==0)for(let s of Hf(e,o)){if(n.has(s.doc))continue;let a=s.citedClaims.length>0?s.citedClaims:Fi.citationContexts(e,s.doc,s.cited),c=Fi.classifyCitation(a),l=Un("doc-reference",s.doc,s.cited.join("|"));Ai(r,{id:l,check:"doc-reference",severity:"warning",evidence:"change-graph",actionTier:c.actionTier,confidence:1,file:s.doc,relatedFiles:s.cited,citationKind:c.citationKind,citationKindReasons:c.reasons,citedClaims:a,message:`${s.doc} cites ${s.cited.join(", ")} as ${Fi.citationKindLabel(c.citationKind)} \u2014 changed in this diff, doc untouched`,why:[`${s.cited.join(", ")} changed in this diff.`,`${s.doc} cites the changed file(s) but was not updated in the same diff.`,...c.reasons.map(u=>`Citation kind evidence: ${u}`)],remediation:Fi.citationRemediation(c.citationKind,s.doc)})}}function aF(e,t,n){n.checksRun.push("unused-params");for(let i of Hr(e,{files:t,limit:50})){let r=Un("unused-params",i.symbol,i.file,i.unusedTrailing.join("|"));Ai(n,{id:r,check:"unused-params",severity:"warning",evidence:"heuristic",confidence:.85,file:i.file,startLine:i.startLine,endLine:i.endLine,symbol:i.symbol,message:`${i.shortName} (${i.file}) has trailing unused parameter(s): ${i.unusedTrailing.join(", ")}`,why:[`${i.shortName} is in a changed file.`,`The trailing parameter(s) ${i.unusedTrailing.join(", ")} are not referenced in the function body.`],remediation:"Drop the unused trailing parameters and their call-site arguments."})}}function cF(e,t,n,i){i.checksRun.push("new-dead");let r=new A(e);for(let o of t){if(n(o)||o.fanIn>0||r.fileKind(o.file)==="test"||Oe(e,o.file)||fe(e,o.symbol,o.file)||lF(o.symbol))continue;let s=Un("new-dead",o.symbol,o.file);Ai(i,{id:s,check:"new-dead",severity:"warning",evidence:"graph-fact",confidence:.9,file:o.file,symbol:o.symbol,message:`${o.shortName} (${o.file}) was changed but has zero indexed consumers`,why:[`${o.shortName} is a changed production symbol.`,"The index reports zero consumers for this symbol.","The symbol is not in a detected entry surface or configured live root."],remediation:"Wire it up, or remove it before it becomes permanent dead code."})}}function lF(e){if(ee(e)!=="type")return!1;let t=M(e);return t.startsWith("_Assert")||t.startsWith("Assert")}function uF(e,t,n,i){let r=new Map(n.renamedFiles.map(s=>[s.to,s.from])),o=i??_r(e,t,Ar(n));return s=>{let a=r.get(s.file)??s.file,c=M(s.symbol);if(!c)return!1;let l=o(a);return l!==null&&dF(l,c)}}function dF(e,t){return new RegExp(`\\b${mF(t)}\\b`).test(e)}function mF(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pF(e,t){if(!ig(Rs(e))){t.skipped.push({check:"baseline",reason:"no .scipquery-baseline.json \u2014 run health --write-baseline to enable"});return}t.checksRun.push("baseline");let n=jr(e);for(let i of n.newFindings){let r=$f(i),o=Un("baseline",i);Ai(t,{id:o,groupKey:`baseline:${r.sourceAnalyzer}:${r.rootCauseKey}`,check:"baseline",severity:"error",evidence:"baseline",actionTier:r.actionTier,confidence:1,file:r.file,relatedFiles:r.relatedFiles.length>0?r.relatedFiles:void 0,sourceAnalyzer:r.sourceAnalyzer,rootCauseKey:r.rootCauseKey,message:`new ${r.label} vs committed baseline: ${i}`,why:["A committed health baseline exists.","The current health result contains a finding not present in that baseline.",`Underlying analyzer: ${r.sourceAnalyzer}.`,`Inherited action tier: ${r.actionTier}.`,`Root cause key: ${r.rootCauseKey}.`,...r.why],remediation:r.remediation})}}function Un(e,...t){return`SQ${j0("sha256").update([e,...t].join("\0")).digest("hex").slice(0,12).toUpperCase()}`}var fF=.7,rg=.62,og=.45;function pl(e,t={}){let{windowCommits:n=100,limit:i=30,scope:r,scanLimit:o}=t,s=vf(e);if(!s)return{available:!1,windowCommits:n,findings:[]};if(i<=0)return{available:!0,windowCommits:n,findings:[]};let a=CF(s,n);if(a.size===0)return{available:!0,windowCommits:n,findings:[]};let l=gF(e,{limit:i,minSimilarity:t.minSimilarity,scanLimit:o,scope:r,semantic:t.semantic,focusFiles:Number.isFinite(i)?void 0:a}).map(d=>vF(d,s,n)).filter(d=>d!==null);l.sort((d,m)=>(d.kind===m.kind?0:d.kind==="echo"?-1:1)||m.similarity-d.similarity||d.echoFile.localeCompare(m.echoFile)||d.echoSymbol.localeCompare(m.echoSymbol)||d.domain.localeCompare(m.domain));let u=l.slice(0,i).map(RF);return{available:!0,windowCommits:n,findings:u,rootCauseGroups:kF(u)}}function gF(e,t){let n=IF(t.limit),i=[...hF(e,{scope:t.scope,minSimilarity:t.minSimilarity??fF,limit:n,scanLimit:t.scanLimit,semantic:t.semantic,focusFiles:t.focusFiles})],r=xo(e,{scope:t.scope});return r.react&&i.push(...yF(e,{scope:t.scope,minSimilarity:t.minSimilarity??rg,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles}),...bF(e,{scope:t.scope,minSimilarity:t.minSimilarity??og,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles})),r.vue&&i.push(...SF(e,{scope:t.scope,minSimilarity:t.minSimilarity??rg,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles}),...xF(e,{scope:t.scope,minSimilarity:t.minSimilarity??og,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles})),i}function hF(e,t){return En(e,{scope:t.scope,minSimilarity:t.minSimilarity,limit:t.limit,crossFileOnly:!0,scanLimit:t.scanLimit,semantic:t.semantic,focusFiles:t.focusFiles}).map(n=>({domain:"callable",basis:n.similarityBasis??"callees",symbolA:n.shortNameA,fileA:n.fileA,symbolB:n.shortNameB,fileB:n.fileB,similarity:n.similarity,sharedEvidence:n.sharedCallees,sharedCallees:n.sharedCallees}))}function yF(e,t){return Ls(e,t,{query:Tn,domain:"react-component",basis:"jsx-structure",symbolA:n=>n.componentA,symbolB:n=>n.componentB,evidenceBuckets:n=>[["component",n.sharedComponents],["tag",n.sharedNativeTags],["prop",n.sharedProps],["event",n.sharedEvents],["binding",n.sharedBindings]]})}function Ls(e,t,n){return n.query(e,t).filter(i=>i.fileA!==i.fileB).map(i=>({domain:n.domain,basis:n.basis,symbolA:n.symbolA(i),fileA:i.fileA,symbolB:n.symbolB(i),fileB:i.fileB,similarity:i.similarity,sharedEvidence:LF(...n.evidenceBuckets(i)),sharedCallees:[]}))}function bF(e,t){return Ls(e,t,{query:Fn,domain:"react-hook",basis:"react-behavior",symbolA:n=>n.componentA,symbolB:n=>n.componentB,evidenceBuckets:n=>[["hook",n.sharedHooks],["react-hook",n.sharedReactHooks],["effect",n.sharedEffects],["state",n.sharedState],["request",n.sharedRequests],["handler",n.sharedHandlers],["action",n.sharedHandlerVerbs]]})}function SF(e,t){return Ls(e,t,{query:_n,domain:"vue-component",basis:"vue-template",symbolA:n=>Is(n.fileA),symbolB:n=>Is(n.fileB),evidenceBuckets:n=>[["component",n.sharedComponents],["prop",n.sharedProps],["event",n.sharedEvents],["directive",n.sharedDirectives],["slot",n.sharedSlots],["identifier",n.sharedIdentifiers]]})}function xF(e,t){return Ls(e,t,{query:An,domain:"vue-composable",basis:"vue-behavior",symbolA:n=>Is(n.fileA),symbolB:n=>Is(n.fileB),evidenceBuckets:n=>[["composable",n.sharedComposables],["store",n.sharedStores],["reactivity",n.sharedReactivity],["lifecycle",n.sharedLifecycle],["request",n.sharedRequests],["function",n.sharedFunctions],["action",n.sharedFunctionVerbs],["binding",n.sharedBindings],["template-event",n.sharedTemplateEvents]]})}function CF(e,t){let n=new Set;for(let[i,r]of e)r.commitsAgo<=t&&n.add(i);return n}function vF(e,t,n){let i=t.get(e.fileA)?.commitsAgo??null,r=t.get(e.fileB)?.commitsAgo??null,o=i!==null&&i<=n,s=r!==null&&r<=n;if(!o&&!s)return null;if(o&&s){let a=(i??0)<=(r??0);return{kind:"twin",domain:e.domain,basis:e.basis,echoSymbol:a?e.symbolA:e.symbolB,echoFile:a?e.fileA:e.fileB,echoAgeCommits:(a?i:r)??0,establishedSymbol:a?e.symbolB:e.symbolA,establishedFile:a?e.fileB:e.fileA,establishedAgeCommits:a?r:i,similarity:e.similarity,sharedEvidence:e.sharedEvidence,sharedCallees:e.sharedCallees}}return{kind:"echo",domain:e.domain,basis:e.basis,echoSymbol:o?e.symbolA:e.symbolB,echoFile:o?e.fileA:e.fileB,echoAgeCommits:(o?i:r)??0,establishedSymbol:o?e.symbolB:e.symbolA,establishedFile:o?e.fileB:e.fileA,establishedAgeCommits:o?r:i,similarity:e.similarity,sharedEvidence:e.sharedEvidence,sharedCallees:e.sharedCallees}}function RF(e){let t=sg(e);return{...e,rootCauseKey:t,groupKey:`recent-duplicate:${t}`}}function sg(e){if(e.kind==="echo")return["echo",e.domain,e.basis,e.establishedSymbol].join(":");let t=e.sharedEvidence.slice().sort().join("|"),n=[e.echoSymbol,e.establishedSymbol].sort().join("|");return["twin",e.domain,e.basis,t||n].join(":")}function kF(e){let t=new Map;for(let[n,i]of e.entries()){let r=i.rootCauseKey??sg(i),o=i.groupKey??`recent-duplicate:${r}`,s=t.get(o);s||(s={groupKey:o,rootCauseKey:r,kind:i.kind,domain:i.domain,basis:i.basis,count:0,maxSimilarity:i.similarity,findingIndexes:[],echoFiles:new Set,establishedFile:i.kind==="echo"?i.establishedFile:void 0,establishedSymbol:i.kind==="echo"?i.establishedSymbol:void 0,relatedFiles:new Set,sharedEvidence:new Set,recommendation:wF(i)},t.set(o,s)),s.count+=1,s.maxSimilarity=Math.max(s.maxSimilarity,i.similarity),s.findingIndexes.push(n),s.echoFiles.add(i.echoFile),s.relatedFiles.add(i.echoFile),s.relatedFiles.add(i.establishedFile);for(let a of i.sharedEvidence)s.sharedEvidence.add(a)}return[...t.values()].map(n=>({...n,echoFiles:[...n.echoFiles].sort(),relatedFiles:[...n.relatedFiles].sort(),sharedEvidence:[...n.sharedEvidence].sort().slice(0,16)})).sort((n,i)=>i.count-n.count||i.maxSimilarity-n.maxSimilarity||n.groupKey.localeCompare(i.groupKey))}function wF(e){return e.kind==="echo"?"Review the established side once, then migrate or delete every echo in this group.":"Pick one owner for the new twins and consolidate the group before the copies diverge."}function IF(e){return Number.isFinite(e)?e*5:Number.POSITIVE_INFINITY}function LF(...e){let t=[],n=new Set;for(let[i,r]of e)for(let o of r){let s=`${i}:${o}`;n.has(s)||(n.add(s),t.push(s))}return t}function Is(e){return(e.split("/").pop()??e).replace(/\.[^.]+$/,"")}var DF=re("suppression-inventory",{clearGroups:["whole-project"]});function Ds(e){return DF.get(e,()=>PF(e))}function PF(e){let t={dead:0,stale:0,wrapper:0,passthrough:0,drift:0,extract:0,similar:0,uncategorized:0},n=new Map,i=0;for(let r of $e(e)){let o=F(e,r);if(!(!o||!o.includes("scip-query")))for(let s of o.split(/\r?\n/)){let a=Zi(s);if(a===null)continue;i+=1,n.set(r,(n.get(r)??0)+1);let c=NF(a);t[c]+=1}}return{total:i,byCategory:t,byFile:n}}function NF(e){if(!e)return"uncategorized";let t=e.toLowerCase();return t==="dead-code"?"dead":t}import{readFileSync as EF}from"fs";import{join as TF}from"path";function qr(e,t,n={}){let i=V(e,t);if(!i)return null;let r=new A(e),o=MF(_F(e,i.relativePath,i.startLine,i.endLine),FF(e,i.relativePath)),s=i.endLine-i.startLine+1,c=r.calleeMap([i],{additive:!0,semantic:n.semantic}).get(i.symbolId)??[],l=new Set(c.map(u=>u.symbol));return{symbol:i.symbol,shortName:v(i.symbol),relativePath:i.relativePath,startLine:i.startLine,endLine:i.endLine,loc:s,branches:o,cyclomaticEstimate:o+1,calleeCount:l.size,fanIn:AF(e,i.symbolId),fanOut:$F(c,i.relativePath)}}function FF(e,t){return e.get("SELECT language FROM documents WHERE relative_path = ?",t)?.language??"unknown"}function _F(e,t,n,i){try{return EF(TF(e.config.projectRoot,t),"utf-8").split(`
|
|
647
|
+
${e.pathExclusionsFor("ref_d")}`,t).map(i=>i.relative_path)}function CA(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function to(e,t={}){let{scope:n,limit:i=30,scanLimit:r}=t,o=new A(e);return lt({candidates:()=>o.productionCallableDefinitions({scope:n,files:t.files,minLoc:2,excludeRootedSymbols:!0,requireFunctionLikeSymbol:!0}),filterCandidate:s=>vA(s.relativePath),scanLimit:r,profile:{name:"unused-params"},evaluate:s=>{let a=X(e,s.relativePath)?.callables.find(d=>d.startLine===s.startLine&&d.endLine===s.endLine);if(!a||a.params.length===0||a.params.some(d=>!d.simple)||a.paramsEndLine>=a.endLine)return null;let c=Kt(e,s.relativePath),l=[];for(let d=a.params.length-1;d>=0;d--){let u=a.params[d];if(u.name===""||u.name.startsWith("_")||RA(c.get(u.name),a.paramsEndLine,a.endLine))break;l.unshift(u.name)}return l.length===0?null:{symbol:s.symbol,shortName:v(s.symbol),file:s.relativePath,startLine:s.startLine,endLine:s.endLine,paramCount:a.paramCount,unusedTrailing:l}},orderResults:(s,a)=>a.unusedTrailing.length-s.unusedTrailing.length||s.file.localeCompare(a.file)||s.startLine-a.startLine,limit:i})}function vA(e){let t=H(e);return t==="typescript"||t==="tsx"||t==="javascript"}function RA(e,t,n){return e?e.some(i=>i>t&&i<=n):!1}var Ws=["echo","incomplete-migration","co-change-partner","doc-reference","unused-params","new-dead","baseline"];function no(e,t={}){let n=t.base??"HEAD",{minTogether:i=6,minConfidence:r=.6,maxEchoChecks:o=Number.POSITIVE_INFINITY,maxHelpers:s=Number.POSITIVE_INFINITY,minSimilarity:a=.8,includeBaseline:c=!1,scanLimit:l}=t,d=t.semantic!==!1,u=new Set(t.skip??[]),m=Tt(e,{base:n}),p=Ui(e,{base:n,plan:m}),f=p.changedFiles,g=new Set(f),b=new Set(m.changedFileLines),x=new Set([...g,...b]),S=Kr(e.config.projectRoot,n,Jr(m,f)),R=JA(e.config.projectRoot,n,m,S),C={base:n,changedFiles:f,changedSymbols:p.changedSymbols.length,checksRun:[],skipped:[],suppressed:[],findings:[],rootCauseGroups:[],note:p.summary.note};if(f.length===0)return C;let y=(w,L)=>{if(u.has(w)){C.skipped.push({check:w,reason:"skipped via --skip"});return}let k=C.findings.length,T=C.skipped.length,U=C.checksRun.length;D(`diff-gate.check.${w}`,L,()=>({check:w,changedFiles:f.length,changedSymbols:p.changedSymbols.length,findingsAdded:C.findings.length-k,skippedAdded:C.skipped.length-T,checksRunAdded:C.checksRun.length-U}))};return y("echo",()=>EA(e,p.changedSymbols,g,R,o,a,l,d,C)),y("incomplete-migration",()=>OA(e,n,m,s,l,d,S,C)),y("co-change-partner",()=>BA(e,x,i,r,C)),y("doc-reference",()=>zA(e,g,b,m.changedRanges,C)),y("unused-params",()=>WA(e,f,C)),y("new-dead",()=>GA(e,p.changedSymbols,R,C)),c&&y("baseline",()=>YA(e,C)),LA(C,e.config.suppressions??[]),C.rootCauseGroups=wA(C.findings),C}function wA(e){let t=new Map;for(let n of e){let i=n.groupKey??`${n.check}:${n.id}`,r=t.get(i);r||(r={groupKey:i,check:n.check,severity:n.severity,actionTier:n.actionTier,sourceAnalyzer:n.sourceAnalyzer,rootCauseKey:n.rootCauseKey,count:0,findingIds:[],files:new Set,relatedFiles:new Set,message:n.message,remediation:n.remediation},t.set(i,r)),r.count+=1,r.findingIds.push(n.id),r.severity=PA(r.severity,n.severity),r.actionTier=IA(r.actionTier,n.actionTier),n.file&&r.files.add(n.file);for(let o of n.relatedFiles??[])r.relatedFiles.add(o)}return[...t.values()].map(n=>({...n,files:[...n.files].sort(),relatedFiles:[...n.relatedFiles].sort()})).sort((n,i)=>i.count-n.count||zs(i.severity)-zs(n.severity)||n.groupKey.localeCompare(i.groupKey))}function PA(e,t){return zs(t)>zs(e)?t:e}function zs(e){return e==="error"?2:e==="warning"?1:0}function IA(e,t){return e?t&&bh(t)>bh(e)?t:e:t}function bh(e){return e==="direct"?2:e==="signal"?1:0}function LA(e,t){if(t.length===0||e.findings.length===0)return;let n=[];for(let i of e.findings){let r=t.find(o=>DA(o,i));r?e.suppressed.push({finding:i,suppression:r}):n.push(i)}e.findings=n}function DA(e,t){return!e.reason||e.reason.trim()===""||e.expiresAt&&Date.parse(e.expiresAt)<=Date.now()||e.id&&e.id!==t.id||e.check&&e.check!==t.check||e.file&&e.file!==t.file?!1:!!(e.id||e.check)}function Gi(e,t){e.findings.push({...t,suppressionHint:`scip-query: ignore ${t.check} ${t.id} -- <reason>`})}function EA(e,t,n,i,r,o,s,a,c){c.checksRun.push("echo");for(let l of t.slice(0,r)){if(!he(l.symbol)||i(l))continue;let d=Vr(e,l.symbol,{minSimilarity:o,limit:5,scanLimit:s,semantic:a,sourceCandidateMode:"target-pruned"}),u=[];for(let g of d){let b=g.fileA===l.file?g.fileB:g.fileA,x=g.fileA===l.file?g.shortNameB:g.shortNameA,S=g.fileA===l.file?g.symbolB:g.symbolA;n.has(b)||u.push({otherFile:b,otherShort:x,otherSymbol:S,similarity:g.similarity,similarityBasis:g.similarityBasis??"callees",sharedEvidence:g.sharedCallees})}if(u.length===0)continue;let m=u[0],p=si("echo",l.symbol,l.file,...u.map(g=>`${g.otherSymbol}|${g.otherFile}`).sort()),f=NA(l,u);Gi(c,{id:p,groupKey:p,actionTier:f,check:"echo",severity:"warning",evidence:"heuristic",confidence:m.similarity,file:l.file,symbol:l.symbol,relatedFiles:[...new Set(u.map(g=>g.otherFile))].sort(),message:MA(l,u),why:$A(l,u),remediation:jA(f,l.shortName,m.otherShort)})}t.length>r&&c.skipped.push({check:"echo",reason:`echo check capped at ${r} of ${t.length} changed symbols`})}function NA(e,t){return t.some(i=>FA(e.symbol,i))?"direct":"signal"}function FA(e,t){if(t.similarityBasis!=="source-tokens"||t.similarity<.98||t.sharedEvidence.length>8)return!1;let n=$(e),i=$(t.otherSymbol);return!n||!i?!1:n===i?!0:AA(t.sharedEvidence)?!1:TA(n,i)}function TA(e,t){let n=Sh(e),i=Sh(t);if(n.length===0||i.length===0)return!1;let r=new Set(i),o=n.filter(s=>r.has(s)).length;return o>=2&&o/Math.min(n.length,i.length)>=.5}function Sh(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").split(/[^A-Za-z0-9]+/).map(t=>t.toLowerCase()).filter(t=>t.length>=2)}var _A=new Set(["bytes","crypto","hex","num","random","secret","to","token"]);function AA(e){return e.length>=3&&e.every(t=>_A.has(t.toLowerCase()))}function MA(e,t){let n=t[0],i=Math.round(n.similarity*100);return t.length===1?`${e.shortName} (${e.file}) is ${i}% similar to established ${n.otherShort} (${n.otherFile})`:`${e.shortName} (${e.file}) resembles ${t.length} established symbol(s); strongest is ${i}% similar to ${n.otherShort} (${n.otherFile})`}function $A(e,t){let n=[`${e.shortName} was changed in this diff.`];for(let i of t.slice(0,3))n.push(`${i.otherShort} is outside this diff and scored ${Math.round(i.similarity*100)}% similar by ${i.similarityBasis} evidence.`),n.push(`Shared evidence: ${i.sharedEvidence.slice(0,5).join(", ")||"(none listed)"}.`);return t.length>3&&n.push(`${t.length-3} additional similar match(es) grouped into this finding.`),n}function jA(e,t,n){return e==="direct"?`Extract or reuse the shared behavior with ${n}, or keep the duplicate with a suppression reason.`:`Review whether ${t} is intentionally parallel to the established implementation(s); extract shared behavior only if the product semantics match.`}function OA(e,t,n,i,r,o,s,a){let c=eo(e,{base:t,maxHelpers:i,diffPlan:n,scanLimit:r,semantic:o,baseContentAt:s});if(!c.available){a.skipped.push({check:"incomplete-migration",reason:"no git history"});return}a.checksRun.push("incomplete-migration"),c.note&&a.skipped.push({check:"incomplete-migration",reason:c.note});for(let l of c.findings){let d=l.leftovers.map(b=>`${b.shortName} (${b.file}, ${Math.round(b.containment*100)}% helper / ${Math.round(b.siteCoverage*100)}% site, ${b.migrationScope})`).join(", "),u=l.leftovers.map(b=>`${b.shortName}: ${b.migrationScope} (${b.migrationScopeReasons[0]})`).join("; "),m=[...l.migratedFiles,...l.leftovers.map(b=>b.file)],p=l.leftovers.length===0?void 0:Math.max(...l.leftovers.map(b=>Math.min(b.containment,b.siteCoverage))),f=l.leftovers.some(b=>b.migrationScope==="possible-subtype"),g=si("incomplete-migration",l.helperSymbol,l.helperFile,m.join("|"));Gi(a,{id:g,check:"incomplete-migration",severity:"warning",evidence:"heuristic",confidence:p,file:l.helperFile,symbol:l.helperSymbol,relatedFiles:m,message:`new helper ${l.helperShortName} (${l.helperFile}) is wired into ${l.migratedFiles.length} file(s), but ${l.leftovers.length} similar un-migrated site(s) remain: ${d}`,why:[`${l.helperShortName} is new in this diff and already referenced by ${l.migratedFiles.join(", ")}.`,`Helper shape: ${l.helperShape}; ${l.specificHelperCalleeCount}/${l.helperCalleeCount} helper callees are specific enough to score.`,`Unchanged site(s) still contain the helper's callee pattern: ${d}.`,`Migration scope hints: ${u}.`],remediation:f?`Migrate same-scope sites to ${l.helperShortName}; review possible subtype/variant sites before applying the helper.`:`Migrate the remaining sites to ${l.helperShortName}, or confirm they are intentionally different.`})}}function BA(e,t,n,i,r){let o=Xe(e).directionalCoChangePairsForFiles(t,{minTogether:n,minConfidence:0,maxFilesPerCommit:20});if(!o){r.skipped.push({check:"co-change-partner",reason:"no git history"});return}r.checksRun.push("co-change-partner");let s=new Set,a;for(let c of o){let l=t.has(c.fileA),d=t.has(c.fileB);if(l===d)continue;let u=l?c.fileA:c.fileB,m=l?c.fileB:c.fileA,p=l?c.changesA:c.changesB,f=p>0?c.together/p:0;if(f<i||Nl(m)||Nl(u)||!xh(`${e.config.projectRoot}/${m}`))continue;let g=`${u}|${m}`;if(s.has(g))continue;s.add(g);let b=si("co-change-partner",u,m,String(c.together)),x=Fl(u,m),S=Tl({fileA:u,fileB:m,together:c.together,confidence:f,commitScope:c.commitScope,recency:c.recency,subjectContext:c.subjectContext},x,(a??=_l(e))(u,m)),R=[u,m].sort().join("|");r.findings.push({id:b,check:"co-change-partner",severity:"warning",evidence:"change-graph",actionTier:"signal",groupKey:`co-change-partner:${R}`,confidence:f,file:u,relatedFiles:[m],sourceAnalyzer:"co-change",rootCauseKey:R,partnerClass:x.partnerClass,partnerClassReasons:x.reasons,commitScope:c.commitScope,recency:c.recency,focusedTogether:c.focusedTogether,broadTogether:c.broadTogether,broadCommitRatio:c.broadCommitRatio,lastTogetherAt:c.lastTogetherAt,recentTogether:c.recentTogether,subjectContext:c.subjectContext,...S?{declaredCouplingSuggestion:S}:{},message:`${u} changed, but ${m} did not \u2014 they change together ${c.together}x (${Math.round(f*100)}% of the time)`,why:[`${u} is in this diff and ${m} is not.`,`Git history shows ${c.together} co-change(s), which is ${Math.round(f*100)}% of changes to the edited side.`,`History context: ${HA(c)}.`,`Subject context: ${VA(c.subjectContext)}.`,...qA(c),`Partner class: ${x.partnerClass} (${x.reasons.join("; ")}).`],remediation:S?`Update ${m} alongside this change, declare the coupling "${S.name}", or confirm the coupling no longer holds.`:`Update ${m} alongside this change, or confirm the coupling no longer holds.`})}}function HA(e){return`${e.commitScope}/${e.recency}; ${e.focusedTogether} focused, ${e.broadTogether} broad-sweep (${Math.round(e.broadCommitRatio*100)}% broad), ${e.recentTogether} recent, last ${UA(e.lastTogetherAt)}`}function VA(e){let t=e.subjectLabels.length>0?e.subjectLabels.slice(0,5).join(", "):"none inferred",n=e.issueRefs.length>0?e.issueRefs.slice(0,5).join(", "):"none",i=e.sampleSubjects.length>0?e.sampleSubjects.slice(0,3).map(r=>`"${r}"`).join("; "):"none";return`labels ${t}; refs ${n}; samples ${i}; external issue/PR labels ${e.externalIssueLabelStatus}`}function qA(e){let t=[];return e.commitScope==="broad-sweep"&&t.push("Broad-sweep history is weaker than focused co-edits; confirm this is a real coordination contract."),e.recency==="stale"&&t.push("The pair has no co-change in the recent history window; confirm the coupling still holds."),t}function UA(e){return e<=0?"unknown":new Date(e*1e3).toISOString().slice(0,10)}function zA(e,t,n,i,r){r.checksRun.push("doc-reference");let o=zi.referenceTargets(e,t,i);if(o.size!==0)for(let s of rh(e,o)){if(n.has(s.doc))continue;let a=s.citedClaims.length>0?s.citedClaims:zi.citationContexts(e,s.doc,s.cited),c=zi.classifyCitation(a),l=si("doc-reference",s.doc,s.cited.join("|"));Gi(r,{id:l,check:"doc-reference",severity:"warning",evidence:"change-graph",actionTier:c.actionTier,confidence:1,file:s.doc,relatedFiles:s.cited,citationKind:c.citationKind,citationKindReasons:c.reasons,citedClaims:a,message:`${s.doc} cites ${s.cited.join(", ")} as ${zi.citationKindLabel(c.citationKind)} \u2014 changed in this diff, doc untouched`,why:[`${s.cited.join(", ")} changed in this diff.`,`${s.doc} cites the changed file(s) but was not updated in the same diff.`,...c.reasons.map(d=>`Citation kind evidence: ${d}`)],remediation:zi.citationRemediation(c.citationKind,s.doc)})}}function WA(e,t,n){n.checksRun.push("unused-params");for(let i of to(e,{files:t,limit:50})){let r=si("unused-params",i.symbol,i.file,i.unusedTrailing.join("|"));Gi(n,{id:r,check:"unused-params",severity:"warning",evidence:"heuristic",confidence:.85,file:i.file,startLine:i.startLine,endLine:i.endLine,symbol:i.symbol,message:`${i.shortName} (${i.file}) has trailing unused parameter(s): ${i.unusedTrailing.join(", ")}`,why:[`${i.shortName} is in a changed file.`,`The trailing parameter(s) ${i.unusedTrailing.join(", ")} are not referenced in the function body.`],remediation:"Drop the unused trailing parameters and their call-site arguments."})}}function GA(e,t,n,i){i.checksRun.push("new-dead");let r=new A(e);for(let o of t){if(n(o)||o.fanIn>0||r.fileKind(o.file)==="test"||Oe(e,o.file)||be(e,o.symbol,o.file)||KA(o.symbol))continue;let s=si("new-dead",o.symbol,o.file);Gi(i,{id:s,check:"new-dead",severity:"warning",evidence:"graph-fact",confidence:.9,file:o.file,symbol:o.symbol,message:`${o.shortName} (${o.file}) was changed but has zero indexed consumers`,why:[`${o.shortName} is a changed production symbol.`,"The index reports zero consumers for this symbol.","The symbol is not in a detected entry surface or configured live root."],remediation:"Wire it up, or remove it before it becomes permanent dead code."})}}function KA(e){if(se(e)!=="type")return!1;let t=$(e);return t.startsWith("_Assert")||t.startsWith("Assert")}function JA(e,t,n,i){let r=new Map(n.renamedFiles.map(s=>[s.to,s.from])),o=i??Kr(e,t,Jr(n));return s=>{let a=r.get(s.file)??s.file,c=$(s.symbol);if(!c)return!1;let l=o(a);return l!==null&&XA(l,c)}}function XA(e,t){return new RegExp(`\\b${QA(t)}\\b`).test(e)}function QA(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function YA(e,t){if(!xh(Us(e))){t.skipped.push({check:"baseline",reason:"no .scipquery-baseline.json \u2014 run health --write-baseline to enable"});return}t.checksRun.push("baseline");let n=Zr(e);for(let i of n.newFindings){let r=Yg(i),o=si("baseline",i);Gi(t,{id:o,groupKey:`baseline:${r.sourceAnalyzer}:${r.rootCauseKey}`,check:"baseline",severity:"error",evidence:"baseline",actionTier:r.actionTier,confidence:1,file:r.file,relatedFiles:r.relatedFiles.length>0?r.relatedFiles:void 0,sourceAnalyzer:r.sourceAnalyzer,rootCauseKey:r.rootCauseKey,message:`new ${r.label} vs committed baseline: ${i}`,why:["A committed health baseline exists.","The current health result contains a finding not present in that baseline.",`Underlying analyzer: ${r.sourceAnalyzer}.`,`Inherited action tier: ${r.actionTier}.`,`Root cause key: ${r.rootCauseKey}.`,...r.why],remediation:r.remediation})}}function si(e,...t){return`SQ${kA("sha256").update([e,...t].join("\0")).digest("hex").slice(0,12).toUpperCase()}`}var ZA=.7,Ch=.62,vh=.45;function Xl(e,t={}){let{windowCommits:n=100,limit:i=30,scope:r,scanLimit:o}=t,s=Xe(e).fileAddRecords();if(!s)return{available:!1,windowCommits:n,findings:[]};if(i<=0)return{available:!0,windowCommits:n,findings:[]};let a=sM(s,n);if(a.size===0)return{available:!0,windowCommits:n,findings:[]};let l=eM(e,{limit:i,minSimilarity:t.minSimilarity,scanLimit:o,scope:r,semantic:t.semantic,focusFiles:Number.isFinite(i)?void 0:a}).map(u=>aM(u,s,n)).filter(u=>u!==null);l.sort((u,m)=>(u.kind===m.kind?0:u.kind==="echo"?-1:1)||m.similarity-u.similarity||u.echoFile.localeCompare(m.echoFile)||u.echoSymbol.localeCompare(m.echoSymbol)||u.domain.localeCompare(m.domain));let d=l.slice(0,i).map(cM);return{available:!0,windowCommits:n,findings:d,rootCauseGroups:lM(d)}}function eM(e,t){let n=dM(t.limit),i=[...tM(e,{scope:t.scope,minSimilarity:t.minSimilarity??ZA,limit:n,scanLimit:t.scanLimit,semantic:t.semantic,focusFiles:t.focusFiles})],r=$o(e,{scope:t.scope});return r.react&&i.push(...nM(e,{scope:t.scope,minSimilarity:t.minSimilarity??Ch,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles}),...iM(e,{scope:t.scope,minSimilarity:t.minSimilarity??vh,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles})),r.vue&&i.push(...rM(e,{scope:t.scope,minSimilarity:t.minSimilarity??Ch,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles}),...oM(e,{scope:t.scope,minSimilarity:t.minSimilarity??vh,limit:n,scanLimit:t.scanLimit,focusFiles:t.focusFiles})),i}function tM(e,t){return Wn(e,{scope:t.scope,minSimilarity:t.minSimilarity,limit:t.limit,crossFileOnly:!0,scanLimit:t.scanLimit,semantic:t.semantic,focusFiles:t.focusFiles}).map(n=>({domain:"callable",basis:n.similarityBasis??"callees",symbolA:n.shortNameA,fileA:n.fileA,symbolB:n.shortNameB,fileB:n.fileB,similarity:n.similarity,sharedEvidence:n.sharedCallees,sharedCallees:n.sharedCallees}))}function nM(e,t){return Ks(e,t,{query:Gn,domain:"react-component",basis:"jsx-structure",symbolA:n=>n.componentA,symbolB:n=>n.componentB,evidenceBuckets:n=>[["component",n.sharedComponents],["tag",n.sharedNativeTags],["prop",n.sharedProps],["event",n.sharedEvents],["binding",n.sharedBindings]]})}function Ks(e,t,n){return n.query(e,t).filter(i=>i.fileA!==i.fileB).map(i=>({domain:n.domain,basis:n.basis,symbolA:n.symbolA(i),fileA:i.fileA,symbolB:n.symbolB(i),fileB:i.fileB,similarity:i.similarity,sharedEvidence:mM(...n.evidenceBuckets(i)),sharedCallees:[]}))}function iM(e,t){return Ks(e,t,{query:Kn,domain:"react-hook",basis:"react-behavior",symbolA:n=>n.componentA,symbolB:n=>n.componentB,evidenceBuckets:n=>[["hook",n.sharedHooks],["react-hook",n.sharedReactHooks],["effect",n.sharedEffects],["state",n.sharedState],["request",n.sharedRequests],["handler",n.sharedHandlers],["action",n.sharedHandlerVerbs]]})}function rM(e,t){return Ks(e,t,{query:Jn,domain:"vue-component",basis:"vue-template",symbolA:n=>Gs(n.fileA),symbolB:n=>Gs(n.fileB),evidenceBuckets:n=>[["component",n.sharedComponents],["prop",n.sharedProps],["event",n.sharedEvents],["directive",n.sharedDirectives],["slot",n.sharedSlots],["identifier",n.sharedIdentifiers]]})}function oM(e,t){return Ks(e,t,{query:Xn,domain:"vue-composable",basis:"vue-behavior",symbolA:n=>Gs(n.fileA),symbolB:n=>Gs(n.fileB),evidenceBuckets:n=>[["composable",n.sharedComposables],["store",n.sharedStores],["reactivity",n.sharedReactivity],["lifecycle",n.sharedLifecycle],["request",n.sharedRequests],["function",n.sharedFunctions],["action",n.sharedFunctionVerbs],["binding",n.sharedBindings],["template-event",n.sharedTemplateEvents]]})}function sM(e,t){let n=new Set;for(let[i,r]of e)r.commitsAgo<=t&&n.add(i);return n}function aM(e,t,n){let i=t.get(e.fileA)?.commitsAgo??null,r=t.get(e.fileB)?.commitsAgo??null,o=i!==null&&i<=n,s=r!==null&&r<=n;if(!o&&!s)return null;if(o&&s){let a=(i??0)<=(r??0);return{kind:"twin",domain:e.domain,basis:e.basis,echoSymbol:a?e.symbolA:e.symbolB,echoFile:a?e.fileA:e.fileB,echoAgeCommits:(a?i:r)??0,establishedSymbol:a?e.symbolB:e.symbolA,establishedFile:a?e.fileB:e.fileA,establishedAgeCommits:a?r:i,similarity:e.similarity,sharedEvidence:e.sharedEvidence,sharedCallees:e.sharedCallees}}return{kind:"echo",domain:e.domain,basis:e.basis,echoSymbol:o?e.symbolA:e.symbolB,echoFile:o?e.fileA:e.fileB,echoAgeCommits:(o?i:r)??0,establishedSymbol:o?e.symbolB:e.symbolA,establishedFile:o?e.fileB:e.fileA,establishedAgeCommits:o?r:i,similarity:e.similarity,sharedEvidence:e.sharedEvidence,sharedCallees:e.sharedCallees}}function cM(e){let t=Rh(e);return{...e,rootCauseKey:t,groupKey:`recent-duplicate:${t}`}}function Rh(e){if(e.kind==="echo")return["echo",e.domain,e.basis,e.establishedSymbol].join(":");let t=e.sharedEvidence.slice().sort().join("|"),n=[e.echoSymbol,e.establishedSymbol].sort().join("|");return["twin",e.domain,e.basis,t||n].join(":")}function lM(e){let t=new Map;for(let[n,i]of e.entries()){let r=i.rootCauseKey??Rh(i),o=i.groupKey??`recent-duplicate:${r}`,s=t.get(o);s||(s={groupKey:o,rootCauseKey:r,kind:i.kind,domain:i.domain,basis:i.basis,count:0,maxSimilarity:i.similarity,findingIndexes:[],echoFiles:new Set,establishedFile:i.kind==="echo"?i.establishedFile:void 0,establishedSymbol:i.kind==="echo"?i.establishedSymbol:void 0,relatedFiles:new Set,sharedEvidence:new Set,recommendation:uM(i)},t.set(o,s)),s.count+=1,s.maxSimilarity=Math.max(s.maxSimilarity,i.similarity),s.findingIndexes.push(n),s.echoFiles.add(i.echoFile),s.relatedFiles.add(i.echoFile),s.relatedFiles.add(i.establishedFile);for(let a of i.sharedEvidence)s.sharedEvidence.add(a)}return[...t.values()].map(n=>({...n,echoFiles:[...n.echoFiles].sort(),relatedFiles:[...n.relatedFiles].sort(),sharedEvidence:[...n.sharedEvidence].sort().slice(0,16)})).sort((n,i)=>i.count-n.count||i.maxSimilarity-n.maxSimilarity||n.groupKey.localeCompare(i.groupKey))}function uM(e){return e.kind==="echo"?"Review the established side once, then migrate or delete every echo in this group.":"Pick one owner for the new twins and consolidate the group before the copies diverge."}function dM(e){return Number.isFinite(e)?e*5:Number.POSITIVE_INFINITY}function mM(...e){let t=[],n=new Set;for(let[i,r]of e)for(let o of r){let s=`${i}:${o}`;n.has(s)||(n.add(s),t.push(s))}return t}function Gs(e){return(e.split("/").pop()??e).replace(/\.[^.]+$/,"")}var pM=ie("suppression-inventory",{clearGroups:["whole-project"]});function Js(e){return pM.get(e,()=>fM(e))}function fM(e){let t={dead:0,stale:0,wrapper:0,passthrough:0,drift:0,extract:0,similar:0,uncategorized:0},n=new Map,i=0;for(let r of et(e)){let o=M(e,r);if(!(!o||!o.includes("scip-query")))for(let s of o.split(/\r?\n/)){let a=mr(s);if(a===null)continue;i+=1,n.set(r,(n.get(r)??0)+1);let c=gM(a);t[c]+=1}}return{total:i,byCategory:t,byFile:n}}function gM(e){if(!e)return"uncategorized";let t=e.toLowerCase();return t==="dead-code"?"dead":t}import{readFileSync as hM}from"fs";import{join as yM}from"path";function io(e,t,n={}){let i=q(e,t);if(!i)return null;let r=new A(e),o=vM(SM(e,i.relativePath,i.startLine,i.endLine),bM(e,i.relativePath)),s=i.endLine-i.startLine+1,c=r.calleeMap([i],{additive:!0,semantic:n.semantic}).get(i.symbolId)??[],l=new Set(c.map(d=>d.symbol));return{symbol:i.symbol,shortName:v(i.symbol),relativePath:i.relativePath,startLine:i.startLine,endLine:i.endLine,loc:s,branches:o,cyclomaticEstimate:o+1,calleeCount:l.size,fanIn:xM(e,i.symbolId),fanOut:CM(c,i.relativePath)}}function bM(e,t){return e.get("SELECT language FROM documents WHERE relative_path = ?",t)?.language??"unknown"}function SM(e,t,n,i){try{return hM(yM(e.config.projectRoot,t),"utf-8").split(`
|
|
628
648
|
`).slice(n,i+1).join(`
|
|
629
|
-
`)}catch{return""}}function
|
|
649
|
+
`)}catch{return""}}function xM(e,t){return e.get(`SELECT COUNT(DISTINCT c.document_id) AS c
|
|
630
650
|
FROM mentions m
|
|
631
651
|
JOIN chunks c ON m.chunk_id = c.id
|
|
632
|
-
WHERE m.symbol_id = ? AND m.role != 1`,t)?.c??0}function $F(e,t){return new Set(e.filter(n=>n.file!==t).map(n=>n.symbol)).size}function MF(e,t){let n=Cn(e),i=0,r=[/\bif\b/g,/\belse\s+if\b/g,/\belse\b/g,/\bfor\b/g,/\bwhile\b/g,/\bswitch\b/g,/\bcase\b/g,/\bcatch\b/g,/\?\s*[^?]/g,/&&/g,/\|\|/g];for(let o of r){let s=n.match(o);s&&(i+=s.length)}if(t==="python"){let o=[/\belif\b/g,/\bexcept\b/g,/\bfinally\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="rust"){let o=[/\bmatch\b/g,/=>/g,/\bloop\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="ruby"){let o=[/\belsif\b/g,/\bunless\b/g,/\brescue\b/g,/\bwhen\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="go"){let o=[/\bselect\b/g,/\bdefer\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}return i}function Ur(e,t,n={}){let i=V(e,t);if(!i)return null;let r=[{file:i.relativePath,line:i.startLine}],o=en(e,i,{semantic:n.semantic}).map(c=>({file:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol??"(top-level)",enclosingShort:c.enclosingSymbol?v(c.enclosingSymbol):"(top-level)"})),{producers:s,consumers:a}=OF(e,i,o,{semantic:n.semantic!==!1});return{symbol:i.symbol,shortName:v(i.symbol),relativePath:i.relativePath,definitionSites:r.filter(c=>!e.isIgnored(c.file)),usageSites:o,producers:s.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:v(c.symbol),file:c.file})),consumers:a.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:c.symbol===c.file?"(top-level)":v(c.symbol),file:c.file}))}}function OF(e,t,n,i){let r=Di(Ge(e,t,{limit:30,semantic:i.semantic}).map(a=>({symbol:a.symbol,file:a.file}))),o=Di(tt(e,t,{limit:30,semantic:i.semantic})),s=o.length>0?o:Di(n.map(a=>({symbol:a.enclosingSymbol==="(top-level)"?a.file:a.enclosingSymbol,file:a.file})));return{producers:r,consumers:s}}function $i(e,t,n={}){let{direction:i="backward",maxDepth:r=3}=n,o=V(e,t);return o?i==="backward"?jF(e,o,r,{semantic:n.semantic!==!1}):BF(e,o,{semantic:n.semantic!==!1}):null}function jF(e,t,n,i){let r=[],o=new Set([t.symbol]),s=[t];for(let a=1;a<=n&&s.length!==0;a++){let c=[];for(let l of s){let u=Ge(e,l,{semantic:i.semantic});for(let d of u){if(o.has(d.symbol))continue;o.add(d.symbol),r.push({symbol:d.symbol,shortName:v(d.symbol),file:d.file,relationship:a===1?"referenced within definition (callee)":`depth ${a} callee`});let m=gi(e,d.symbol);m&&!e.isIgnored(m.relativePath)&&c.push(m)}}s=c}return{symbol:t.symbol,shortName:v(t.symbol),direction:"backward",connectedSymbols:r}}function BF(e,t,n){let i=new Set,r=[],o=new A(e);for(let s of en(e,t,{semantic:n.semantic})){if(r.length>=30)break;let a=s.enclosingSymbol??Qe(o.definitionsForFile(s.file),s.line)?.symbol??null;if(!a||a===t.symbol)continue;let c=gi(e,a);!c||e.isIgnored(c.relativePath)||i.has(c.symbol)||(i.add(c.symbol),r.push({symbol:c.symbol,shortName:v(c.symbol),file:c.relativePath,relationship:`references target at ${s.file}:${s.line+1}`}))}return r.sort((s,a)=>s.file.localeCompare(a.file)),{symbol:t.symbol,shortName:v(t.symbol),direction:"forward",connectedSymbols:r}}function fl(e,t,n={}){let i=n.impactDepth??3,r=n.sliceDepth??3,o=n.semantic,s=!VF(t),a=s?xr(e,t,{semantic:o}):{definitions:[],referencedBy:[]},c=s?Ir(e,t,{semantic:o}):null,l=s?qr(e,t,{semantic:o}):null,u=s?Ur(e,t,{semantic:o}):null,d=s?$i(e,t,{direction:"backward",maxDepth:r,semantic:o}):null,m=s?$i(e,t,{direction:"forward",maxDepth:r,semantic:o}):null,p=s?Tr(e,t,{maxDepth:i,scope:n.scope}):[],f=Fr(e,t,{semantic:o}),g=Cr(e,t),y=vr(e,t),S=Rr(e,t),R=kr(e,t),k={symbol:a.definitions.length>0||a.referencedBy.length>0||c!==null||l!==null||u!==null||d!==null||m!==null||p.length>0,file:f!==null||g.length>0||y.length>0,module:S.files.length>0||S.symbols.length>0||R.length>0},x=[];!k.symbol&&!k.file&&!k.module&&x.push("No symbol, file, or module matched target.");let b=f?.file??a.definitions[0]?.relativePath??null;return{target:t,matched:k,history:HF(e,b),trace:a,callGraph:c,complexity:l,dataflow:u,backwardSlice:d,forwardSlice:m,affected:p,changeSurface:f,deps:g,rdeps:y,system:S,surface:R,warnings:x}}function HF(e,t){let n={available:!1,file:t,churn:null,coChangePartners:[],suppressionsInFile:0};if(!t)return n;let i=us(e);if(!i)return n;let r=Mn(e,t,{limit:5});return{available:!0,file:t,churn:i.get(t)??{changes:0,fixChanges:0,lastChangedAt:0},coChangePartners:r.findings.map(o=>({file:o.fileA===t?o.fileB:o.fileA,together:o.together,confidence:o.confidence,subjectContext:o.subjectContext})),suppressionsInFile:Ds(e).byFile.get(t)??0}}function VF(e){return e.includes("/")||e.includes("\\")||/\.[A-Za-z0-9]+(?::\d+(?:-\d+)?)?$/.test(e)}function Wr(e,t){let{scope:n,minLoc:i=10,limit:r=30,scanLimit:o}=t??{},s=new A(e);return it({candidates:()=>s.productionCallableDefinitions({scope:n,minLoc:i,requireCallableSymbol:!0,includeSuppressed:!0,sortByLocDesc:typeof o=="number"&&o>0}),scanLimit:o,prepare:a=>({callerMap:s.crossFileCallerMap(a,{semantic:t?.semantic!==!1}),calleeMap:s.calleeMap(a,{semantic:t?.semantic!==!1})}),evaluate:(a,c)=>qF(a,c,i),orderResults:(a,c)=>c.score-a.score||c.loc-a.loc,limit:r})}function qF(e,t,n){let i=e.endLine-e.startLine+1;if(i<n)return null;let r=t.callerMap.get(e.symbolId)?.size??0,o=t.calleeMap.get(e.symbolId)??[],s=new Set,a=new Set;for(let u of o){let d=`${u.symbol}|${u.file}`;s.add(d),u.file!==e.relativePath&&a.add(d)}let c=a.size,l=s.size;return{symbol:e.symbol,shortName:v(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:i,fanIn:r,fanOut:c,calleeCount:l,score:Math.round(i/50*(r/5)*Math.max(c/5,1)*100)/100}}function Mt(e){return e.scoreCount??e.count}function lg(e){let t=GF(e),{breakdown:n,pressure:i}=JF(e),r=cg(n,"risk"),o=cg(n,"hygiene");return{score:Math.min(r,o),riskScore:r,hygieneScore:o,scoreBreakdown:n,overview:{documents:e.statsResult.documents,symbols:e.statsResult.symbols,indexSizeBytes:e.statsResult.indexSizeBytes},findings:{deadSymbols:e.dead.count,deadLoc:e.dead.loc,isolatedSymbols:e.isolated.count,isolatedLoc:e.isolated.loc,cycles:e.realCycleCount,similarPairs:e.similarCount,reactComponentDuplicatePairs:e.reactComponentDuplicates.count,reactHookCandidatePairs:e.reactHookCandidates.count,reactHookCandidateScoreCount:Mt(e.reactHookCandidates),reactLargeComponentPressureFiles:e.reactLargeComponentPressure.count,vueComponentDuplicatePairs:e.vueComponentDuplicates.count,vueComposableCandidatePairs:e.vueComposableCandidates.count,vueComposableCandidateScoreCount:Mt(e.vueComposableCandidates),vueLargeViewPressureFiles:e.vueLargeViewPressure.count,extractionCandidates:e.extractCount,wrappers:e.wrappers.count,wrapperScoreCount:Mt(e.wrappers),passthroughs:e.passthroughs.count,staleTypes:e.stale.count,driftedFiles:e.drift.count,complexityHotspotCount:e.complexity.extremeCount,hiddenCouplingPairs:e.gitEvidence?.hiddenCoupling.pairCount??null,hiddenCouplingScoreCount:e.gitEvidence?.hiddenCoupling.scoreCount??null},axes:UF(e),validation:zF(e),suppressions:e.suppressions,actions:t,pressure:i,topComplexity:e.complexity.top,warnings:e.warnings.length>0?e.warnings:void 0}}function UF(e){return{deletable:{loc:e.dead.loc+e.isolated.loc,symbols:e.dead.count+e.isolated.count},cycles:{count:e.realCycleCount},changeAmplification:e.gitEvidence?.amplification??null,hiddenCoupling:e.gitEvidence?.hiddenCoupling??null,churnWeightedComplexity:WF(e),evidenceQuality:{graphFindings:e.dead.count+e.isolated.count+e.realCycleCount,heuristicFindings:e.similarCount+e.reactComponentDuplicates.count+e.reactHookCandidates.count+e.reactLargeComponentPressure.count+e.vueComponentDuplicates.count+e.vueComposableCandidates.count+e.vueLargeViewPressure.count+e.extractCount+e.wrappers.count+e.passthroughs.count+e.stale.count+e.drift.count,userSuppressed:e.suppressions?.total??0}}}function WF(e){let t=e.gitEvidence?.fileStats;return t?e.complexity.top.map(n=>{let i=n.file?t[n.file]?.changes??0:0;return{...n,changes:i,weighted:Rt(n.score*Math.log2(1+i))}}).sort((n,i)=>i.weighted-n.weighted):null}function zF(e){let t=e.gitEvidence?.fileStats;if(!t)return null;let n={dead:e.dead.files??[],isolated:e.isolated.files??[],wrappers:e.wrappers.files??[],passthroughs:e.passthroughs.files??[],stale:e.stale.files??[],reactComponents:e.reactComponentDuplicates.files??[],reactHooks:e.reactHookCandidates.files??[],reactLargeComponents:e.reactLargeComponentPressure.files??[],vueComponents:e.vueComponentDuplicates.files??[],vueComposables:e.vueComposableCandidates.files??[],vueLargeViews:e.vueLargeViewPressure.files??[]},i=new Set(Object.values(n).flat()),r=0,o=0,s=0;for(let[u,d]of Object.entries(t))i.has(u)?r+=d.fixChanges:(o+=d.fixChanges,s+=1);let a=i.size>0?Rt(r/i.size):0,c=s>0?Rt(o/s):0,l={};for(let[u,d]of Object.entries(n)){let m=new Set(d);if(m.size===0)continue;let p=0;for(let g of m)p+=t[g]?.fixChanges??0;let f=Rt(p/m.size);l[u]={flaggedFiles:m.size,fixDensity:f,lift:c>0?Rt(f/c):null}}return{flaggedFiles:i.size,flaggedFixDensity:a,baselineFixDensity:c,ratio:i.size>0&&c>0?Rt(a/c):null,byCategory:l}}function Rt(e){return Math.round(e*100)/100}function ug(e){return Number.isInteger(e)?String(e):e.toFixed(2).replace(/0+$/,"").replace(/\.$/,"")}function Ps(e,t="existing shared infrastructure discount"){let n=Mt(e);return Math.abs(n-e.count)<.01?"":` (${ug(n)} score-weighted after ${t})`}function zr(e,t){let n=Mt(e),i=`${e.count} ${t}`;return Math.abs(n-e.count)<.01?i:`${i} (${ug(n)} score-weighted)`}function GF(e){let t=[];if(e.dead.count>0&&t.push({category:"Dead code",evidence:"graph-fact",description:`${e.dead.count} symbols with zero references anywhere \u2014 safe to delete`,effort:"low",impact:"high",count:e.dead.count,locRecoverable:e.dead.loc}),e.isolated.count>0&&t.push({category:"Isolated symbols",evidence:"graph-fact",description:`${e.isolated.count} symbols completely disconnected from the codebase graph`,effort:"low",impact:"medium",count:e.isolated.count,locRecoverable:e.isolated.loc}),e.realCycleCount>0&&t.push({category:"Circular dependencies",evidence:"graph-fact",description:`${e.realCycleCount} cycle(s) \u2014 break with dependency inversion or module restructuring`,effort:"medium",impact:"high",count:e.realCycleCount,locRecoverable:0}),e.similarCount>0&&t.push({category:"Similar functions",evidence:"heuristic",description:`${e.similarCount} pairs with real logic overlap (beyond shared imports) \u2014 consolidation candidates`,effort:"medium",impact:"medium",count:e.similarCount,locRecoverable:0}),e.reactComponentDuplicates.count>0&&t.push({category:"Duplicated React components",evidence:"heuristic",description:`${e.reactComponentDuplicates.count} React component pair(s) share JSX structure \u2014 extract or reuse the shared UI concept`,effort:"medium",impact:"medium",count:e.reactComponentDuplicates.count,locRecoverable:e.reactComponentDuplicates.loc}),e.reactHookCandidates.count>0&&t.push({category:"Duplicated React hook behavior",evidence:"heuristic",description:`${e.reactHookCandidates.count} React component pair(s) share state/effect/request behavior${Ps(e.reactHookCandidates)} \u2014 extract or reuse a hook`,effort:"medium",impact:"medium",count:e.reactHookCandidates.count,locRecoverable:e.reactHookCandidates.loc}),e.reactLargeComponentPressure.count>0&&t.push({category:"Large React components",evidence:"heuristic",description:`${e.reactLargeComponentPressure.count} React component(s) concentrate JSX/behavior pressure \u2014 split by reason to change`,effort:"medium",impact:"medium",count:e.reactLargeComponentPressure.count,locRecoverable:0}),e.vueComponentDuplicates.count>0&&t.push({category:"Duplicated Vue components",evidence:"heuristic",description:`${e.vueComponentDuplicates.count} Vue component pair(s) share template structure \u2014 extract or reuse the shared UI concept`,effort:"medium",impact:"medium",count:e.vueComponentDuplicates.count,locRecoverable:e.vueComponentDuplicates.loc}),e.vueComposableCandidates.count>0&&t.push({category:"Duplicated Vue behavior",evidence:"heuristic",description:`${e.vueComposableCandidates.count} Vue component pair(s) share state/effect/request behavior${Ps(e.vueComposableCandidates)} \u2014 extract or reuse a composable`,effort:"medium",impact:"medium",count:e.vueComposableCandidates.count,locRecoverable:e.vueComposableCandidates.loc}),e.vueLargeViewPressure.count>0&&t.push({category:"Large Vue views",evidence:"heuristic",description:`${e.vueLargeViewPressure.count} Vue file(s) concentrate template/script/style pressure \u2014 split by reason to change`,effort:"medium",impact:"medium",count:e.vueLargeViewPressure.count,locRecoverable:0}),e.extractCount>0&&t.push({category:"Extraction candidates",evidence:"heuristic",description:`${e.extractCount} large functions with isolated callee clusters \u2014 review same-file or feature-local extraction seams`,effort:"medium",impact:"medium",count:e.extractCount,locRecoverable:0}),e.wrappers.count>0&&t.push({category:"Wrapper functions",evidence:"heuristic",description:`${e.wrappers.count} single-consumer symbols${Ps(e.wrappers,"boundary-evidence discount")} \u2014 inline direct wrappers or review boundary signals`,effort:"low",impact:"low",count:e.wrappers.count,locRecoverable:e.wrappers.loc}),e.passthroughs.count>0&&t.push({category:"Passthrough functions",evidence:"heuristic",description:`${e.passthroughs.count} functions that just forward to one callee \u2014 unnecessary indirection`,effort:"low",impact:"low",count:e.passthroughs.count,locRecoverable:e.passthroughs.loc}),e.stale.count>0){let r=[];e.stale.unused>0&&r.push(`${e.stale.unused} unused`),e.stale.singleUse>0&&r.push(`${e.stale.singleUse} single-consumer (not in types file)`),t.push({category:"Stale abstractions",evidence:"heuristic",description:`${r.join(", ")} \u2014 remove unused abstractions; review single-consumer ownership before moving or inlining`,effort:"low",impact:"medium",count:e.stale.count,locRecoverable:e.stale.loc})}if(e.drift.count>0){let r=[];e.drift.unusedImports>0&&r.push(`${e.drift.unusedImports} unused imports`),e.drift.layerViolations>0&&r.push(`${e.drift.layerViolations} layer violations`),t.push({category:"Structural drift",evidence:"heuristic",description:`${r.join(", ")} \u2014 remove direct drift; review signal drift against layer ownership`,effort:e.drift.layerViolations>0?"medium":"low",impact:e.drift.layerViolations>0?"medium":"low",count:e.drift.count,locRecoverable:0})}if(e.gitEvidence&&e.gitEvidence.hiddenCoupling.pairCount>0){let r=e.gitEvidence.hiddenCoupling.top[0];t.push({category:"Hidden coupling",evidence:"change-graph",description:`${e.gitEvidence.hiddenCoupling.pairCount} file pair(s) co-change without a structural link`+Ps({count:e.gitEvidence.hiddenCoupling.pairCount,scoreCount:e.gitEvidence.hiddenCoupling.scoreCount},"broad/stale-history discount")+(r?` (e.g. ${r.fileA} \u2194 ${r.fileB})`:"")+" \u2014 name the shared concept or enforce the sync",effort:"medium",impact:"high",count:e.gitEvidence.hiddenCoupling.pairCount,locRecoverable:0})}let n={high:3,medium:2,low:1},i={low:3,medium:2,high:1};return t.sort((r,o)=>{let s=n[r.impact]*i[r.effort];return n[o.impact]*i[o.effort]-s}),t}var ag={"dead-code":"risk",isolated:"risk",cycles:"risk",complexity:"risk","hidden-coupling":"risk","cycles-pressure":"risk","complexity-pressure":"risk","hidden-coupling-pressure":"risk",similar:"hygiene","react-component-duplicates":"hygiene","react-hook-candidates":"hygiene","react-large-component-pressure":"hygiene","vue-component-duplicates":"hygiene","vue-composable-candidates":"hygiene","vue-large-view-pressure":"hygiene",extract:"hygiene",wrappers:"hygiene",passthroughs:"hygiene","stale-abstractions":"hygiene",drift:"hygiene","similar-pressure":"hygiene","react-component-duplicates-pressure":"hygiene","react-hook-candidates-pressure":"hygiene","react-large-component-pressure-pressure":"hygiene","vue-component-duplicates-pressure":"hygiene","vue-composable-candidates-pressure":"hygiene","vue-large-view-pressure-pressure":"hygiene","extract-pressure":"hygiene","wrappers-pressure":"hygiene","passthroughs-pressure":"hygiene","stale-abstractions-pressure":"hygiene","drift-pressure":"hygiene"};function cg(e,t){let n=e.filter(i=>i.kind===t).reduce((i,r)=>i+r.points,0);return Math.max(0,Math.min(100,100-n))}function JF(e){let t=Math.max(e.statsResult.documents,1),n=Math.max(e.statsResult.symbols,1),i=[],r=[],o=(b,C,D)=>{C>0&&i.push({axis:b,points:C,detail:D,kind:ag[b]??"hygiene"})},s=(b,C,D,w,j,J,Re)=>{let ie=Math.max(w,1);if(D<=ie)return;let _e=D/ie,Ht=Math.min(j,Math.ceil(Math.log2(_e)*J));if(Ht<=0)return;let uS=ag[b]??"hygiene";r.push({axis:b,category:C,kind:uS,count:D,threshold:Rt(ie),ratio:Rt(_e),extraPenalty:Ht}),o(b,Ht,`${D} ${Re} exceed pressure threshold ${Rt(ie)} (${Rt(_e)}x)`)},a=e.dead.count/n;o("dead-code",Math.min(20,Math.round(a*200)),`${e.dead.count} dead symbols (${e.dead.loc} LOC deletable)`);let c=e.isolated.count/n;o("isolated",Math.min(10,Math.round(c*200)),`${e.isolated.count} isolated symbols (${e.isolated.loc} LOC deletable)`),o("cycles",Math.min(15,e.realCycleCount*5),`${e.realCycleCount} real dependency cycle(s)`);let l=e.similarCount/n*1e3;o("similar",Math.min(10,Math.round(l)),`${e.similarCount} similar function pair(s)`);let u=e.reactComponentDuplicates.count/t*1e3;o("react-component-duplicates",Math.min(10,Math.round(u)),`${e.reactComponentDuplicates.count} duplicated React component pair(s)`);let d=Mt(e.reactHookCandidates),m=d/t*1e3;o("react-hook-candidates",Math.min(10,Math.round(m)),zr(e.reactHookCandidates,"duplicated React behavior pair(s)"));let p=e.reactLargeComponentPressure.count/t*1e3;o("react-large-component-pressure",Math.min(5,Math.round(p/2)),`${e.reactLargeComponentPressure.count} large React component pressure file(s)`);let f=e.vueComponentDuplicates.count/t*1e3;o("vue-component-duplicates",Math.min(10,Math.round(f)),`${e.vueComponentDuplicates.count} duplicated Vue component pair(s)`);let g=Mt(e.vueComposableCandidates),y=g/t*1e3;o("vue-composable-candidates",Math.min(10,Math.round(y)),zr(e.vueComposableCandidates,"duplicated Vue behavior pair(s)"));let S=e.vueLargeViewPressure.count/t*1e3;o("vue-large-view-pressure",Math.min(5,Math.round(S/2)),`${e.vueLargeViewPressure.count} large Vue view pressure file(s)`);let R=Mt(e.wrappers);o("wrappers",Math.min(3,R),zr(e.wrappers,"wrapper candidate(s)"));let k=Mt(e.passthroughs);o("passthroughs",Math.min(3,k),zr(e.passthroughs,"passthrough candidate(s)")),o("stale-abstractions",Math.min(8,e.stale.unused),`${e.stale.unused} unused stale abstraction(s); ${e.stale.singleUse} single-consumer signal(s)`);let x=e.drift.direct/t;if(o("drift",Math.min(5,Math.round(x*50)),`${e.drift.direct} direct drift finding(s); ${e.drift.signal} signal drift finding(s)`),o("complexity",Math.min(5,e.complexity.extremeCount*2),`${e.complexity.extremeCount} extreme complexity hotspot(s)`),e.gitEvidence){let b=e.gitEvidence.hiddenCoupling.scoreCount;o("hidden-coupling",Math.min(5,Math.ceil(b/10)),zr({count:e.gitEvidence.hiddenCoupling.pairCount,scoreCount:b},"co-changing pair(s) without a structural link"))}if(s("cycles-pressure","Circular dependencies",e.realCycleCount,3,10,3,"cycle(s)"),s("complexity-pressure","Extreme complexity",e.complexity.extremeCount,3,5,2,"extreme complexity hotspot(s)"),e.gitEvidence){let b=e.gitEvidence.hiddenCoupling.scoreCount;s("hidden-coupling-pressure","Hidden coupling",b,50,10,4,"score-weighted co-changing pair(s)")}return s("similar-pressure","Similar functions",e.similarCount,Math.max(50,n*.01),8,4,"similar function pair(s)"),s("react-component-duplicates-pressure","Duplicated React components",e.reactComponentDuplicates.count,Math.max(10,t*.01),8,4,"duplicated React component pair(s)"),s("react-hook-candidates-pressure","Duplicated React hook behavior",d,Math.max(10,t*.01),8,4,"duplicated React behavior pair(s)"),s("react-large-component-pressure-pressure","Large React components",e.reactLargeComponentPressure.count,Math.max(10,t*.01),4,2,"large React component pressure file(s)"),s("vue-component-duplicates-pressure","Duplicated Vue components",e.vueComponentDuplicates.count,Math.max(10,t*.01),8,4,"duplicated Vue component pair(s)"),s("vue-composable-candidates-pressure","Duplicated Vue behavior",g,Math.max(10,t*.01),8,4,"duplicated Vue behavior pair(s)"),s("vue-large-view-pressure-pressure","Large Vue views",e.vueLargeViewPressure.count,Math.max(10,t*.01),4,2,"large Vue view pressure file(s)"),s("extract-pressure","Extraction candidates",e.extractCount,Math.max(50,n*.01),4,2,"extraction candidate(s)"),s("wrappers-pressure","Wrapper functions",R,50,4,2,"wrapper candidate(s)"),s("passthroughs-pressure","Passthrough functions",k,50,4,2,"passthrough candidate(s)"),s("stale-abstractions-pressure","Single-consumer stale abstraction signals",e.stale.singleUse,Math.max(50,n*.02),4,2,"single-consumer stale abstraction signal(s)"),s("drift-pressure","Structural drift signals",e.drift.signal,Math.max(10,t*.1),4,2,"signal drift finding(s)"),{breakdown:i,pressure:r}}import{getHeapStatistics as KF}from"v8";var QF=64*1024*1024;function gl(){let e=globalThis.gc;if(!e)return;let t=KF();t.heap_size_limit-t.used_heap_size<QF||e()}var XF=50,YF=75e3,ZF=5e3,dg=2500,mg=50,e_=10,Mi=["overview","dead","isolated","cycles","similar","react-component-duplicates","react-hook-candidates","react-large-component-pressure","vue-component-duplicates","vue-composable-candidates","vue-large-view-pressure","extract-candidates","wrapper-candidates","passthrough-candidates","stale-abstractions","drift","complexity-hotspots","git-evidence","suppressions"],t_={overview:(e,t,n,i)=>({phase:"overview",statsResult:i,warnings:n.warnings}),dead:(e,t,n)=>({phase:"dead",dead:r_(e,t,n)}),isolated:(e,t,n)=>({phase:"isolated",isolated:o_(e,t,n)}),cycles:(e,t,n)=>({phase:"cycles",realCycleCount:s_(e,t,n)}),similar:(e,t,n)=>({phase:"similar",similarCount:a_(e,t,n)}),"react-component-duplicates":(e,t,n)=>({phase:"react-component-duplicates",reactComponentDuplicates:l_(e,t,n)}),"react-hook-candidates":(e,t,n)=>({phase:"react-hook-candidates",reactHookCandidates:u_(e,t,n)}),"react-large-component-pressure":(e,t,n)=>({phase:"react-large-component-pressure",reactLargeComponentPressure:d_(e,t,n)}),"vue-component-duplicates":(e,t,n)=>({phase:"vue-component-duplicates",vueComponentDuplicates:m_(e,t,n)}),"vue-composable-candidates":(e,t,n)=>({phase:"vue-composable-candidates",vueComposableCandidates:p_(e,t,n)}),"vue-large-view-pressure":(e,t,n)=>({phase:"vue-large-view-pressure",vueLargeViewPressure:f_(e,t,n)}),"extract-candidates":(e,t,n)=>({phase:"extract-candidates",extractCount:c_(e,t,n)}),"wrapper-candidates":(e,t,n)=>({phase:"wrapper-candidates",wrappers:g_(e,t,n)}),"passthrough-candidates":(e,t,n)=>({phase:"passthrough-candidates",passthroughs:h_(e,t,n)}),"stale-abstractions":(e,t,n)=>({phase:"stale-abstractions",stale:y_(e,t,n)}),drift:(e,t,n)=>({phase:"drift",drift:x_(e,t,n)}),"complexity-hotspots":(e,t,n)=>({phase:"complexity-hotspots",complexity:C_(e,t,n)}),"git-evidence":(e,t,n)=>({phase:"git-evidence",gitEvidence:b_(e,n)}),suppressions:(e,t,n)=>({phase:"suppressions",suppressions:S_(e,n)})};function Gr(e,t,n={}){return hl(e,[t],n)[0]}function hl(e,t,n={}){return n_(e,n.full!==!1,(i,r)=>{let o={...r,releaseCachesBetweenPhases:!1};return t.map(s=>t_[s](e,n.scope,o,i))})}function n_(e,t,n){let i=Ue(e),r=v_(i,t);try{return n(i,r)}finally{oc(e,{semanticProvider:!0}),gl()}}function yl(e){return lg(i_(e))}function i_(e){let t=De(e,"overview");return{statsResult:t.statsResult,warnings:t.warnings,dead:De(e,"dead").dead,isolated:De(e,"isolated").isolated,realCycleCount:De(e,"cycles").realCycleCount,similarCount:De(e,"similar").similarCount,reactComponentDuplicates:De(e,"react-component-duplicates").reactComponentDuplicates,reactHookCandidates:De(e,"react-hook-candidates").reactHookCandidates,reactLargeComponentPressure:De(e,"react-large-component-pressure").reactLargeComponentPressure,vueComponentDuplicates:De(e,"vue-component-duplicates").vueComponentDuplicates,vueComposableCandidates:De(e,"vue-composable-candidates").vueComposableCandidates,vueLargeViewPressure:De(e,"vue-large-view-pressure").vueLargeViewPressure,extractCount:De(e,"extract-candidates").extractCount,wrappers:De(e,"wrapper-candidates").wrappers,passthroughs:De(e,"passthrough-candidates").passthroughs,stale:De(e,"stale-abstractions").stale,drift:De(e,"drift").drift,complexity:De(e,"complexity-hotspots").complexity,gitEvidence:pg(e,"git-evidence")?.gitEvidence??null,suppressions:pg(e,"suppressions")?.suppressions??null}}function pg(e,t){return e.find(n=>n.phase===t)}function De(e,t){let n=e.find(i=>i.phase===t);if(!n)throw new Error(`Missing health phase result: ${t}`);return n}function r_(e,t,n){return Se(e,n,"dead",()=>{let i=At(e,{scope:t,...be.dead,scanLimit:n.candidateScanLimit});return Ns(w_(e,i.symbols))})}function o_(e,t,n){return Se(e,n,"isolated",()=>{let i=Nn(e,{scope:t,...be.isolated,scanLimit:n.candidateScanLimit});return Ns(I_(e,i))})}function s_(e,t,n){return Se(e,n,"cycles",()=>Pn(e,{scope:t}).filter(r=>r.kind==="real").length)}function a_(e,t,n){return Se(e,n,"similar",()=>Ec(e,{scope:t,...be.similar,scanLimit:n.candidateScanLimit}))}function c_(e,t,n){return Se(e,n,"extract-candidates",()=>$n(e,{scope:t,...be.extract,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit}).length)}function l_(e,t,n){return Se(e,n,"react-component-duplicates",()=>{let i=Tn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return bl(i)})}function u_(e,t,n){return Se(e,n,"react-hook-candidates",()=>{let i=Fn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return hg(i,D_)})}function d_(e,t,n){return Se(e,n,"react-large-component-pressure",()=>{let i=Nr(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return L_(i)})}function m_(e,t,n){return Se(e,n,"vue-component-duplicates",()=>{let i=_n(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return bl(i)})}function p_(e,t,n){return Se(e,n,"vue-composable-candidates",()=>{let i=An(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return hg(i,P_)})}function f_(e,t,n){return Se(e,n,"vue-large-view-pressure",()=>{let i=Er(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Ns(i)})}function g_(e,t,n){return Se(e,n,"wrapper-candidates",()=>{let i=qn(e,{scope:t,...be.wrappers,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return gg(i,N_)})}function h_(e,t,n){return Se(e,n,"passthrough-candidates",()=>{let i=Hn(e,{scope:t,...be.passthroughs,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return gg(i,E_)})}function y_(e,t,n){return Se(e,n,"stale-abstractions",()=>{let i=Vn(e,{scope:t,...be.stale,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit}),r=i.filter(o=>o.consumers===0).length;return{count:i.length,loc:i.reduce((o,s)=>o+s.loc,0),files:[...new Set(i.map(o=>o.file))],unused:r,singleUse:i.length-r}})}function b_(e,t){return Se(e,t,"git-evidence",()=>{let n=us(e);if(!n)return null;let i=Mn(e,void 0,{limit:t.candidateResultLimit}),r={};for(let[o,s]of n)r[o]={changes:s.changes,fixChanges:s.fixChanges};return{amplification:Cf(e),hiddenCoupling:{pairCount:i.findings.length,scoreCount:Sl(i.findings.reduce((o,s)=>o+fg(s),0)),top:i.findings.slice(0,5).map(o=>({fileA:o.fileA,fileB:o.fileB,together:o.together,confidence:o.confidence,focusedTogether:o.focusedTogether,broadTogether:o.broadTogether,broadCommitRatio:o.broadCommitRatio,lastTogetherAt:o.lastTogetherAt,recentTogether:o.recentTogether,commitScope:o.commitScope,recency:o.recency,scoreWeight:fg(o),subjectContext:o.subjectContext}))},fileStats:r}})}function S_(e,t){return Se(e,t,"suppressions",()=>{let n=Ds(e);return{total:n.total,byCategory:{...n.byCategory}}})}function x_(e,t,n){return Se(e,n,"drift",()=>{let i=Bn(e,{scope:t,...be.drift,includePatternDeviations:!1}),r=i.results.filter(a=>a.kind!=="pattern-deviation"),o=r.filter(a=>a.actionTier==="direct").length,s=r.length-o;return{count:r.length,unusedImports:i.unusedImports,layerViolations:i.layerViolations,direct:o,signal:s}})}function C_(e,t,n){return Se(e,n,"complexity-hotspots",()=>{let i=Wr(e,{scope:t,minLoc:10,limit:n.complexityResultLimit,scanLimit:n.candidateScanLimit,semantic:!1});return{top:i.slice(0,5).map(r=>({symbol:r.shortName,score:r.score,file:r.file})),extremeCount:i.filter(r=>r.score>XF).length}})}function v_(e,t){let n=e.symbols>=YF||e.documents>=ZF,i=t?Number.POSITIVE_INFINITY:mg,r=t?Number.POSITIVE_INFINITY:e_;return!n||t?{candidateScanLimit:void 0,candidateResultLimit:i,complexityResultLimit:r,releaseCachesBetweenPhases:!0,warnings:t&&n?["Large index detected; running health without candidate scan or result caps because full mode is enabled."]:[]}:{candidateScanLimit:dg,candidateResultLimit:i,complexityResultLimit:r,releaseCachesBetweenPhases:!0,warnings:[`Large index detected; candidate-style health checks scanned their highest-priority ${dg} symbols and reported their top ${mg} findings. Enable full mode for unbounded candidate counts.`]}}function R_(e,t){t.releaseCachesBetweenPhases&&(oc(e),gl())}function Se(e,t,n,i){k_(n);try{return i()}finally{R_(e,t)}}function k_(e){process.env.SCIP_QUERY_HEALTH_TRACE==="1"&&console.error(`[health] ${e}`)}function w_(e,t){return t.filter(n=>!Oe(e,n.relativePath)&&!fe(e,n.symbol,n.relativePath)&&n.kind==="dead-code")}function I_(e,t){return t.filter(n=>!Oe(e,n.relativePath)&&!fe(e,n.symbol,n.relativePath))}function Ns(e){let t=new Set;for(let n of e){let i=n.relativePath??n.file;i&&t.add(i)}return{count:e.length,loc:e.reduce((n,i)=>n+i.loc,0),files:[...t]}}function gg(e,t){return{...Ns(e),scoreCount:Sl(e.reduce((i,r)=>i+t(r),0))}}function L_(e){let t=new Map;for(let n of e)t.set(n.file,Math.max(t.get(n.file)??0,n.loc));return{count:t.size,loc:[...t.values()].reduce((n,i)=>n+i,0),files:[...t.keys()]}}function bl(e){let t=new Map;for(let n of e)t.set(n.fileA,Math.max(t.get(n.fileA)??0,n.locA)),t.set(n.fileB,Math.max(t.get(n.fileB)??0,n.locB));return{count:e.length,loc:[...t.values()].reduce((n,i)=>n+i,0),files:[...t.keys()]}}function hg(e,t){return{...bl(e),scoreCount:Sl(e.reduce((i,r)=>i+t(r),0))}}function D_(e){let t=e.sharedHooks.length>0,n=yg({namedState:e.sharedState,requests:e.sharedRequests,lifecycle:e.sharedEffects,functions:e.sharedHandlers});return t&&n<=2?0:t?.5:bg(e.sharedState,e.sharedHandlers,e.sharedHandlerVerbs)?.25:n>=2?1:.5}function P_(e){let t=e.sharedComposables.length+e.sharedStores.length>0,n=yg({namedState:e.sharedBindings,requests:e.sharedRequests,lifecycle:e.sharedLifecycle,functions:e.sharedFunctions});return t&&n<=2?0:t?.5:bg(e.sharedBindings,e.sharedFunctions,e.sharedFunctionVerbs)?.25:n>=2?1:.5}function yg(e){return e.requests.length*2+e.lifecycle.length+e.namedState.filter(t=>!xg.has(Sg(t))).length+Math.min(e.functions.length,3)}function bg(e,t,n){let i=[...e,...t,...n].map(Sg);return i.length>0&&i.every(r=>xg.has(r))}function Sg(e){return e.replace(/^handle/,"").replace(/^is/,"").replace(/^has/,"").toLowerCase()}function N_(e){return e.actionTier==="signal"?.25:1}function E_(e){return e.actionTier==="signal"?.25:1}function fg(e){return e.commitScope==="broad-sweep"?e.recency==="recent"?.25:0:e.commitScope==="mixed"?e.recency==="recent"?.5:.25:e.recency==="recent"?1:.5}function Sl(e){return Math.round(e*100)/100}var xg=new Set(["add","apply","cancel","change","clear","close","create","delete","draft","edit","error","filter","form","load","loading","name","open","refresh","remove","reset","save","saving","search","select","selected","submit","toggle","update","value"]);function xl(e,t,n,i={}){let r=V(e,t),o=V(e,n);if(!r||!o)return null;let s=new Set(Ge(e,r,{semantic:i.semantic}).map(y=>y.symbol)),a=new Set(Ge(e,o,{semantic:i.semantic}).map(y=>y.symbol)),c=[];for(let y of s)a.has(y)&&c.push(y);let l=[];for(let y of s)a.has(y)||l.push(y);let u=[];for(let y of a)s.has(y)||u.push(y);let d=new Set([...s,...a]),m=d.size>0?c.length/d.size:0,p;d.size===0?p="Neither function calls other tracked symbols. There is no callee-pattern evidence for consolidation; inspect the source bodies directly.":c.length===0?p="These functions do not share any callees. They are not a callee-based consolidation candidate.":l.length===0&&u.length===0?p="These functions have identical tracked callee sets. They are a strong structural match, but identical callees do not prove interchangeable semantics; inspect signatures, control flow, and return values before consolidating.":l.length===0?p="A's tracked callees are a subset of B's. B may subsume part of A's structure, but verify signatures, guards, and non-call logic before replacing A with B.":u.length===0?p="B's tracked callees are a subset of A's. A may subsume part of B's structure, but verify signatures, guards, and non-call logic before replacing B with A.":l.length<=2&&u.length<=2?p=`Create a shared function with the ${c.length} common callees. Pass the ${l.length+u.length} divergent callees as parameters or strategy callbacks.`:p=`Extract the ${c.length} shared callees into a common helper. Each function calls the helper plus its own unique logic (${l.length} callees in A, ${u.length} in B).`;let f=r.endLine-r.startLine+1,g=o.endLine-o.startLine+1;return{symbolA:{symbol:r.symbol,shortName:v(r.symbol),file:r.relativePath,loc:f},symbolB:{symbol:o.symbol,shortName:v(o.symbol),file:o.relativePath,loc:g},similarity:m,sharedCallees:c.map(v),uniqueToA:l.map(v),uniqueToB:u.map(v),consolidationStrategy:p}}import{readFileSync as Cg}from"fs";import{extname as T_,join as vg}from"path";function Cl(e,t,n={}){let{context:i=0}=n,r=F_(t);if(r)return A_(e,r.filePath,r.startLine,r.endLine,i);let o=V(e,t);return o?__(e,o,i):null}function F_(e){let t=e.match(/^(.+\.\w+):(\d+)-(\d+)$/);return t?{filePath:t[1],startLine:parseInt(t[2],10),endLine:parseInt(t[3],10)}:null}function __(e,t,n){let i=e.get("SELECT language FROM documents WHERE relative_path = ?",t.relativePath),r=vg(e.config.projectRoot,t.relativePath),o;try{o=Cg(r,"utf-8")}catch{return null}let s=o.split(`
|
|
652
|
+
WHERE m.symbol_id = ? AND m.role != 1`,t)?.c??0}function CM(e,t){return new Set(e.filter(n=>n.file!==t).map(n=>n.symbol)).size}function vM(e,t){let n=Tn(e),i=0,r=[/\bif\b/g,/\belse\s+if\b/g,/\belse\b/g,/\bfor\b/g,/\bwhile\b/g,/\bswitch\b/g,/\bcase\b/g,/\bcatch\b/g,/\?\s*[^?]/g,/&&/g,/\|\|/g];for(let o of r){let s=n.match(o);s&&(i+=s.length)}if(t==="python"){let o=[/\belif\b/g,/\bexcept\b/g,/\bfinally\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="rust"){let o=[/\bmatch\b/g,/=>/g,/\bloop\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="ruby"){let o=[/\belsif\b/g,/\bunless\b/g,/\brescue\b/g,/\bwhen\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}else if(t==="go"){let o=[/\bselect\b/g,/\bdefer\b/g];for(let s of o){let a=n.match(s);a&&(i+=a.length)}}return i}function ro(e,t,n={}){let i=q(e,t);if(!i)return null;let r=[{file:i.relativePath,line:i.startLine}],o=yn(e,i,{semantic:n.semantic}).map(c=>({file:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol??"(top-level)",enclosingShort:c.enclosingSymbol?v(c.enclosingSymbol):"(top-level)"})),{producers:s,consumers:a}=RM(e,i,o,{semantic:n.semantic!==!1});return{symbol:i.symbol,shortName:v(i.symbol),relativePath:i.relativePath,definitionSites:r.filter(c=>!e.isIgnored(c.file)),usageSites:o,producers:s.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:v(c.symbol),file:c.file})),consumers:a.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:c.symbol===c.file?"(top-level)":v(c.symbol),file:c.file}))}}function RM(e,t,n,i){let r=Oi(Je(e,t,{limit:30,semantic:i.semantic}).map(a=>({symbol:a.symbol,file:a.file}))),o=Oi(at(e,t,{limit:30,semantic:i.semantic})),s=o.length>0?o:Oi(n.map(a=>({symbol:a.enclosingSymbol==="(top-level)"?a.file:a.enclosingSymbol,file:a.file})));return{producers:r,consumers:s}}function Ki(e,t,n={}){let{direction:i="backward",maxDepth:r=3}=n,o=q(e,t);return o?i==="backward"?kM(e,o,r,{semantic:n.semantic!==!1}):wM(e,o,{semantic:n.semantic!==!1}):null}function kM(e,t,n,i){let r=[],o=new Set([t.symbol]),s=[t];for(let a=1;a<=n&&s.length!==0;a++){let c=[];for(let l of s){let d=Je(e,l,{semantic:i.semantic});for(let u of d){if(o.has(u.symbol))continue;o.add(u.symbol),r.push({symbol:u.symbol,shortName:v(u.symbol),file:u.file,relationship:a===1?"referenced within definition (callee)":`depth ${a} callee`});let m=Ni(e,u.symbol);m&&!e.isIgnored(m.relativePath)&&c.push(m)}}s=c}return{symbol:t.symbol,shortName:v(t.symbol),direction:"backward",connectedSymbols:r}}function wM(e,t,n){let i=new Set,r=[],o=new A(e);for(let s of yn(e,t,{semantic:n.semantic})){if(r.length>=30)break;let a=s.enclosingSymbol??ot(o.definitionsForFile(s.file),s.line)?.symbol??null;if(!a||a===t.symbol)continue;let c=Ni(e,a);!c||e.isIgnored(c.relativePath)||i.has(c.symbol)||(i.add(c.symbol),r.push({symbol:c.symbol,shortName:v(c.symbol),file:c.relativePath,relationship:`references target at ${s.file}:${s.line+1}`}))}return r.sort((s,a)=>s.file.localeCompare(a.file)),{symbol:t.symbol,shortName:v(t.symbol),direction:"forward",connectedSymbols:r}}function Ql(e,t,n={}){let i=n.impactDepth??3,r=n.sliceDepth??3,o=n.semantic,s=!IM(t),a=s?Tr(e,t,{semantic:o}):{definitions:[],referencedBy:[]},c=s?Br(e,t,{semantic:o}):null,l=s?io(e,t,{semantic:o}):null,d=s?ro(e,t,{semantic:o}):null,u=s?Ki(e,t,{direction:"backward",maxDepth:r,semantic:o}):null,m=s?Ki(e,t,{direction:"forward",maxDepth:r,semantic:o}):null,p=s?zr(e,t,{maxDepth:i,scope:n.scope}):[],f=Wr(e,t,{semantic:o}),g=_r(e,t),b=Ar(e,t),x=Mr(e,t),S=$r(e,t),R={symbol:a.definitions.length>0||a.referencedBy.length>0||c!==null||l!==null||d!==null||u!==null||m!==null||p.length>0,file:f!==null||g.length>0||b.length>0,module:x.files.length>0||x.symbols.length>0||S.length>0},C=[];!R.symbol&&!R.file&&!R.module&&C.push("No symbol, file, or module matched target.");let y=f?.file??a.definitions[0]?.relativePath??null;return{target:t,matched:R,history:PM(e,y),trace:a,callGraph:c,complexity:l,dataflow:d,backwardSlice:u,forwardSlice:m,affected:p,changeSurface:f,deps:g,rdeps:b,system:x,surface:S,warnings:C}}function PM(e,t){let n={available:!1,file:t,churn:null,coChangePartners:[],suppressionsInFile:0};if(!t)return n;let i=Xe(e).fileChurn();if(!i)return n;let r=Zn(e,t,{limit:5});return{available:!0,file:t,churn:i.get(t)??{changes:0,fixChanges:0,lastChangedAt:0},coChangePartners:r.findings.map(o=>({file:o.fileA===t?o.fileB:o.fileA,together:o.together,confidence:o.confidence,subjectContext:o.subjectContext})),suppressionsInFile:Js(e).byFile.get(t)??0}}function IM(e){return e.includes("/")||e.includes("\\")||/\.[A-Za-z0-9]+(?::\d+(?:-\d+)?)?$/.test(e)}function oo(e,t){let{scope:n,minLoc:i=10,limit:r=30,scanLimit:o}=t??{},s=new A(e);return lt({candidates:()=>s.productionCallableDefinitions({scope:n,minLoc:i,requireFunctionLikeSymbol:!0,includeSuppressed:!0,sortByLocDesc:typeof o=="number"&&o>0}),scanLimit:o,profile:{name:"complexity-hotspots"},prepare:a=>{let c=DM(e,a);return{callerMap:s.crossFileCallerMap(a,{semantic:t?.semantic!==!1}),calleeMap:s.calleeMap(a,{semantic:t?.semantic!==!1}),languageByFile:c,clojureCallableIds:EM(e,a,c)}},evaluate:(a,c)=>LM(a,c,i),orderResults:(a,c)=>c.score-a.score||c.loc-a.loc,limit:r})}function LM(e,t,n){if(t.languageByFile.get(e.relativePath)==="clojure"&&!t.clojureCallableIds.has(e.symbolId))return null;let i=e.endLine-e.startLine+1;if(i<n)return null;let r=t.callerMap.get(e.symbolId)?.size??0,o=t.calleeMap.get(e.symbolId)??[],s=new Set,a=new Set;for(let d of o){let u=`${d.symbol}|${d.file}`;s.add(u),d.file!==e.relativePath&&a.add(u)}let c=a.size,l=s.size;return{symbol:e.symbol,shortName:v(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:i,fanIn:r,fanOut:c,calleeCount:l,score:Math.round(i/50*(r/5)*Math.max(c/5,1)*100)/100}}function DM(e,t){let n=[...new Set(t.map(o=>o.relativePath))];if(n.length===0)return new Map;let i=n.map(()=>"?").join(", "),r=e.all(`SELECT relative_path, language
|
|
653
|
+
FROM documents
|
|
654
|
+
WHERE relative_path IN (${i})`,...n);return new Map(r.map(o=>[o.relative_path,o.language?.toLowerCase()??null]))}function EM(e,t,n){let i=new Set,r=new Map;for(let o of t){if(n.get(o.relativePath)!=="clojure")continue;let s=r.get(o.relativePath);s||(s=new Set((X(e,o.relativePath)?.callables??[]).map(a=>`${a.name}:${a.startLine}`)),r.set(o.relativePath,s)),s.has(`${o.leaf}:${o.startLine}`)&&i.add(o.symbolId)}return i}function en(e){return e.scoreCount??e.count}function Ph(e){let t=_M(e),{breakdown:n,pressure:i}=AM(e),r=wh(n,"risk"),o=wh(n,"hygiene");return{score:Math.min(r,o),riskScore:r,hygieneScore:o,scoreBreakdown:n,overview:{documents:e.statsResult.documents,symbols:e.statsResult.symbols,indexSizeBytes:e.statsResult.indexSizeBytes},findings:{deadSymbols:e.dead.count,deadLoc:e.dead.loc,isolatedSymbols:e.isolated.count,isolatedLoc:e.isolated.loc,cycles:e.realCycleCount,similarPairs:e.similarCount,reactComponentDuplicatePairs:e.reactComponentDuplicates.count,reactHookCandidatePairs:e.reactHookCandidates.count,reactHookCandidateScoreCount:en(e.reactHookCandidates),reactLargeComponentPressureFiles:e.reactLargeComponentPressure.count,vueComponentDuplicatePairs:e.vueComponentDuplicates.count,vueComposableCandidatePairs:e.vueComposableCandidates.count,vueComposableCandidateScoreCount:en(e.vueComposableCandidates),vueLargeViewPressureFiles:e.vueLargeViewPressure.count,extractionCandidates:e.extractCount,wrappers:e.wrappers.count,wrapperScoreCount:en(e.wrappers),passthroughs:e.passthroughs.count,staleTypes:e.stale.count,driftedFiles:e.drift.count,complexityHotspotCount:e.complexity.extremeCount,hiddenCouplingPairs:e.gitEvidence?.hiddenCoupling.pairCount??null,hiddenCouplingScoreCount:e.gitEvidence?.hiddenCoupling.scoreCount??null},axes:NM(e),validation:TM(e),suppressions:e.suppressions,actions:t,pressure:i,topComplexity:e.complexity.top,warnings:e.warnings.length>0?e.warnings:void 0}}function NM(e){return{deletable:{loc:e.dead.loc+e.isolated.loc,symbols:e.dead.count+e.isolated.count},cycles:{count:e.realCycleCount},changeAmplification:e.gitEvidence?.amplification??null,hiddenCoupling:e.gitEvidence?.hiddenCoupling??null,churnWeightedComplexity:FM(e),evidenceQuality:{graphFindings:e.dead.count+e.isolated.count+e.realCycleCount,heuristicFindings:e.similarCount+e.reactComponentDuplicates.count+e.reactHookCandidates.count+e.reactLargeComponentPressure.count+e.vueComponentDuplicates.count+e.vueComposableCandidates.count+e.vueLargeViewPressure.count+e.extractCount+e.wrappers.count+e.passthroughs.count+e.stale.count+e.drift.count,userSuppressed:e.suppressions?.total??0}}}function FM(e){let t=e.gitEvidence?.fileStats;return t?e.complexity.top.map(n=>{let i=n.file?t[n.file]?.changes??0:0;return{...n,changes:i,weighted:_t(n.score*Math.log2(1+i))}}).sort((n,i)=>i.weighted-n.weighted):null}function TM(e){let t=e.gitEvidence?.fileStats;if(!t)return null;let n={dead:e.dead.files??[],isolated:e.isolated.files??[],wrappers:e.wrappers.files??[],passthroughs:e.passthroughs.files??[],stale:e.stale.files??[],reactComponents:e.reactComponentDuplicates.files??[],reactHooks:e.reactHookCandidates.files??[],reactLargeComponents:e.reactLargeComponentPressure.files??[],vueComponents:e.vueComponentDuplicates.files??[],vueComposables:e.vueComposableCandidates.files??[],vueLargeViews:e.vueLargeViewPressure.files??[]},i=new Set(Object.values(n).flat()),r=0,o=0,s=0;for(let[d,u]of Object.entries(t))i.has(d)?r+=u.fixChanges:(o+=u.fixChanges,s+=1);let a=i.size>0?_t(r/i.size):0,c=s>0?_t(o/s):0,l={};for(let[d,u]of Object.entries(n)){let m=new Set(u);if(m.size===0)continue;let p=0;for(let g of m)p+=t[g]?.fixChanges??0;let f=_t(p/m.size);l[d]={flaggedFiles:m.size,fixDensity:f,lift:c>0?_t(f/c):null}}return{flaggedFiles:i.size,flaggedFixDensity:a,baselineFixDensity:c,ratio:i.size>0&&c>0?_t(a/c):null,byCategory:l}}function _t(e){return Math.round(e*100)/100}function Ih(e){return Number.isInteger(e)?String(e):e.toFixed(2).replace(/0+$/,"").replace(/\.$/,"")}function Xs(e,t="existing shared infrastructure discount"){let n=en(e);return Math.abs(n-e.count)<.01?"":` (${Ih(n)} score-weighted after ${t})`}function so(e,t){let n=en(e),i=`${e.count} ${t}`;return Math.abs(n-e.count)<.01?i:`${i} (${Ih(n)} score-weighted)`}function _M(e){let t=[];if(e.dead.count>0&&t.push({category:"Dead code",evidence:"graph-fact",description:`${e.dead.count} symbols with zero references anywhere \u2014 safe to delete`,effort:"low",impact:"high",count:e.dead.count,locRecoverable:e.dead.loc}),e.isolated.count>0&&t.push({category:"Isolated symbols",evidence:"graph-fact",description:`${e.isolated.count} symbols completely disconnected from the codebase graph`,effort:"low",impact:"medium",count:e.isolated.count,locRecoverable:e.isolated.loc}),e.realCycleCount>0&&t.push({category:"Circular dependencies",evidence:"graph-fact",description:`${e.realCycleCount} cycle(s) \u2014 break with dependency inversion or module restructuring`,effort:"medium",impact:"high",count:e.realCycleCount,locRecoverable:0}),e.similarCount>0&&t.push({category:"Similar functions",evidence:"heuristic",description:`${e.similarCount} pairs with real logic overlap (beyond shared imports) \u2014 consolidation candidates`,effort:"medium",impact:"medium",count:e.similarCount,locRecoverable:0}),e.reactComponentDuplicates.count>0&&t.push({category:"Duplicated React components",evidence:"heuristic",description:`${e.reactComponentDuplicates.count} React component pair(s) share JSX structure \u2014 extract or reuse the shared UI concept`,effort:"medium",impact:"medium",count:e.reactComponentDuplicates.count,locRecoverable:e.reactComponentDuplicates.loc}),e.reactHookCandidates.count>0&&t.push({category:"Duplicated React hook behavior",evidence:"heuristic",description:`${e.reactHookCandidates.count} React component pair(s) share state/effect/request behavior${Xs(e.reactHookCandidates)} \u2014 extract or reuse a hook`,effort:"medium",impact:"medium",count:e.reactHookCandidates.count,locRecoverable:e.reactHookCandidates.loc}),e.reactLargeComponentPressure.count>0&&t.push({category:"Large React components",evidence:"heuristic",description:`${e.reactLargeComponentPressure.count} React component(s) concentrate JSX/behavior pressure \u2014 split by reason to change`,effort:"medium",impact:"medium",count:e.reactLargeComponentPressure.count,locRecoverable:0}),e.vueComponentDuplicates.count>0&&t.push({category:"Duplicated Vue components",evidence:"heuristic",description:`${e.vueComponentDuplicates.count} Vue component pair(s) share template structure \u2014 extract or reuse the shared UI concept`,effort:"medium",impact:"medium",count:e.vueComponentDuplicates.count,locRecoverable:e.vueComponentDuplicates.loc}),e.vueComposableCandidates.count>0&&t.push({category:"Duplicated Vue behavior",evidence:"heuristic",description:`${e.vueComposableCandidates.count} Vue component pair(s) share state/effect/request behavior${Xs(e.vueComposableCandidates)} \u2014 extract or reuse a composable`,effort:"medium",impact:"medium",count:e.vueComposableCandidates.count,locRecoverable:e.vueComposableCandidates.loc}),e.vueLargeViewPressure.count>0&&t.push({category:"Large Vue views",evidence:"heuristic",description:`${e.vueLargeViewPressure.count} Vue file(s) concentrate template/script/style pressure \u2014 split by reason to change`,effort:"medium",impact:"medium",count:e.vueLargeViewPressure.count,locRecoverable:0}),e.extractCount>0&&t.push({category:"Extraction candidates",evidence:"heuristic",description:`${e.extractCount} large functions with isolated callee clusters \u2014 review same-file or feature-local extraction seams`,effort:"medium",impact:"medium",count:e.extractCount,locRecoverable:0}),e.wrappers.count>0&&t.push({category:"Wrapper functions",evidence:"heuristic",description:`${e.wrappers.count} single-consumer symbols${Xs(e.wrappers,"boundary-evidence discount")} \u2014 inline direct wrappers or review boundary signals`,effort:"low",impact:"low",count:e.wrappers.count,locRecoverable:e.wrappers.loc}),e.passthroughs.count>0&&t.push({category:"Passthrough functions",evidence:"heuristic",description:`${e.passthroughs.count} functions that just forward to one callee \u2014 unnecessary indirection`,effort:"low",impact:"low",count:e.passthroughs.count,locRecoverable:e.passthroughs.loc}),e.stale.count>0){let r=[];e.stale.unused>0&&r.push(`${e.stale.unused} unused`),e.stale.singleUse>0&&r.push(`${e.stale.singleUse} single-consumer (not in types file)`),t.push({category:"Stale abstractions",evidence:"heuristic",description:`${r.join(", ")} \u2014 remove unused abstractions; review single-consumer ownership before moving or inlining`,effort:"low",impact:"medium",count:e.stale.count,locRecoverable:e.stale.loc})}if(e.drift.count>0){let r=[];e.drift.unusedImports>0&&r.push(`${e.drift.unusedImports} unused imports`),e.drift.layerViolations>0&&r.push(`${e.drift.layerViolations} layer violations`),t.push({category:"Structural drift",evidence:"heuristic",description:`${r.join(", ")} \u2014 remove direct drift; review signal drift against layer ownership`,effort:e.drift.layerViolations>0?"medium":"low",impact:e.drift.layerViolations>0?"medium":"low",count:e.drift.count,locRecoverable:0})}if(e.gitEvidence&&e.gitEvidence.hiddenCoupling.pairCount>0){let r=e.gitEvidence.hiddenCoupling.top[0];t.push({category:"Hidden coupling",evidence:"change-graph",description:`${e.gitEvidence.hiddenCoupling.pairCount} file pair(s) co-change without a structural link`+Xs({count:e.gitEvidence.hiddenCoupling.pairCount,scoreCount:e.gitEvidence.hiddenCoupling.scoreCount},"broad/stale-history discount")+(r?` (e.g. ${r.fileA} \u2194 ${r.fileB})`:"")+" \u2014 name the shared concept or enforce the sync",effort:"medium",impact:"high",count:e.gitEvidence.hiddenCoupling.pairCount,locRecoverable:0})}let n={high:3,medium:2,low:1},i={low:3,medium:2,high:1};return t.sort((r,o)=>{let s=n[r.impact]*i[r.effort];return n[o.impact]*i[o.effort]-s}),t}var kh={"dead-code":"risk",isolated:"risk",cycles:"risk",complexity:"risk","hidden-coupling":"risk","cycles-pressure":"risk","complexity-pressure":"risk","hidden-coupling-pressure":"risk",similar:"hygiene","react-component-duplicates":"hygiene","react-hook-candidates":"hygiene","react-large-component-pressure":"hygiene","vue-component-duplicates":"hygiene","vue-composable-candidates":"hygiene","vue-large-view-pressure":"hygiene",extract:"hygiene",wrappers:"hygiene",passthroughs:"hygiene","stale-abstractions":"hygiene",drift:"hygiene","similar-pressure":"hygiene","react-component-duplicates-pressure":"hygiene","react-hook-candidates-pressure":"hygiene","react-large-component-pressure-pressure":"hygiene","vue-component-duplicates-pressure":"hygiene","vue-composable-candidates-pressure":"hygiene","vue-large-view-pressure-pressure":"hygiene","extract-pressure":"hygiene","wrappers-pressure":"hygiene","passthroughs-pressure":"hygiene","stale-abstractions-pressure":"hygiene","drift-pressure":"hygiene"};function wh(e,t){let n=e.filter(i=>i.kind===t).reduce((i,r)=>i+r.points,0);return Math.max(0,Math.min(100,100-n))}function AM(e){let t=Math.max(e.statsResult.documents,1),n=Math.max(e.statsResult.symbols,1),i=[],r=[],o=(y,w,L)=>{w>0&&i.push({axis:y,points:w,detail:L,kind:kh[y]??"hygiene"})},s=(y,w,L,k,T,U,Y)=>{let ee=Math.max(k,1);if(L<=ee)return;let we=L/ee,te=Math.min(T,Math.ceil(Math.log2(we)*U));if(te<=0)return;let rn=kh[y]??"hygiene";r.push({axis:y,category:w,kind:rn,count:L,threshold:_t(ee),ratio:_t(we),extraPenalty:te}),o(y,te,`${L} ${Y} exceed pressure threshold ${_t(ee)} (${_t(we)}x)`)},a=e.dead.count/n;o("dead-code",Math.min(20,Math.round(a*200)),`${e.dead.count} dead symbols (${e.dead.loc} LOC deletable)`);let c=e.isolated.count/n;o("isolated",Math.min(10,Math.round(c*200)),`${e.isolated.count} isolated symbols (${e.isolated.loc} LOC deletable)`),o("cycles",Math.min(15,e.realCycleCount*5),`${e.realCycleCount} real dependency cycle(s)`);let l=e.similarCount/n*1e3;o("similar",Math.min(10,Math.round(l)),`${e.similarCount} similar function pair(s)`);let d=e.reactComponentDuplicates.count/t*1e3;o("react-component-duplicates",Math.min(10,Math.round(d)),`${e.reactComponentDuplicates.count} duplicated React component pair(s)`);let u=en(e.reactHookCandidates),m=u/t*1e3;o("react-hook-candidates",Math.min(10,Math.round(m)),so(e.reactHookCandidates,"duplicated React behavior pair(s)"));let p=e.reactLargeComponentPressure.count/t*1e3;o("react-large-component-pressure",Math.min(5,Math.round(p/2)),`${e.reactLargeComponentPressure.count} large React component pressure file(s)`);let f=e.vueComponentDuplicates.count/t*1e3;o("vue-component-duplicates",Math.min(10,Math.round(f)),`${e.vueComponentDuplicates.count} duplicated Vue component pair(s)`);let g=en(e.vueComposableCandidates),b=g/t*1e3;o("vue-composable-candidates",Math.min(10,Math.round(b)),so(e.vueComposableCandidates,"duplicated Vue behavior pair(s)"));let x=e.vueLargeViewPressure.count/t*1e3;o("vue-large-view-pressure",Math.min(5,Math.round(x/2)),`${e.vueLargeViewPressure.count} large Vue view pressure file(s)`);let S=en(e.wrappers);o("wrappers",Math.min(3,S),so(e.wrappers,"wrapper candidate(s)"));let R=en(e.passthroughs);o("passthroughs",Math.min(3,R),so(e.passthroughs,"passthrough candidate(s)")),o("stale-abstractions",Math.min(8,e.stale.unused),`${e.stale.unused} unused stale abstraction(s); ${e.stale.singleUse} single-consumer signal(s)`);let C=e.drift.direct/t;if(o("drift",Math.min(5,Math.round(C*50)),`${e.drift.direct} direct drift finding(s); ${e.drift.signal} signal drift finding(s)`),o("complexity",Math.min(5,e.complexity.extremeCount*2),`${e.complexity.extremeCount} extreme complexity hotspot(s)`),e.gitEvidence){let y=e.gitEvidence.hiddenCoupling.scoreCount;o("hidden-coupling",Math.min(5,Math.ceil(y/10)),so({count:e.gitEvidence.hiddenCoupling.pairCount,scoreCount:y},"co-changing pair(s) without a structural link"))}if(s("cycles-pressure","Circular dependencies",e.realCycleCount,3,10,3,"cycle(s)"),s("complexity-pressure","Extreme complexity",e.complexity.extremeCount,3,5,2,"extreme complexity hotspot(s)"),e.gitEvidence){let y=e.gitEvidence.hiddenCoupling.scoreCount;s("hidden-coupling-pressure","Hidden coupling",y,50,10,4,"score-weighted co-changing pair(s)")}return s("similar-pressure","Similar functions",e.similarCount,Math.max(50,n*.01),8,4,"similar function pair(s)"),s("react-component-duplicates-pressure","Duplicated React components",e.reactComponentDuplicates.count,Math.max(10,t*.01),8,4,"duplicated React component pair(s)"),s("react-hook-candidates-pressure","Duplicated React hook behavior",u,Math.max(10,t*.01),8,4,"duplicated React behavior pair(s)"),s("react-large-component-pressure-pressure","Large React components",e.reactLargeComponentPressure.count,Math.max(10,t*.01),4,2,"large React component pressure file(s)"),s("vue-component-duplicates-pressure","Duplicated Vue components",e.vueComponentDuplicates.count,Math.max(10,t*.01),8,4,"duplicated Vue component pair(s)"),s("vue-composable-candidates-pressure","Duplicated Vue behavior",g,Math.max(10,t*.01),8,4,"duplicated Vue behavior pair(s)"),s("vue-large-view-pressure-pressure","Large Vue views",e.vueLargeViewPressure.count,Math.max(10,t*.01),4,2,"large Vue view pressure file(s)"),s("extract-pressure","Extraction candidates",e.extractCount,Math.max(50,n*.01),4,2,"extraction candidate(s)"),s("wrappers-pressure","Wrapper functions",S,50,4,2,"wrapper candidate(s)"),s("passthroughs-pressure","Passthrough functions",R,50,4,2,"passthrough candidate(s)"),s("stale-abstractions-pressure","Single-consumer stale abstraction signals",e.stale.singleUse,Math.max(50,n*.02),4,2,"single-consumer stale abstraction signal(s)"),s("drift-pressure","Structural drift signals",e.drift.signal,Math.max(10,t*.1),4,2,"signal drift finding(s)"),{breakdown:i,pressure:r}}import{getHeapStatistics as MM}from"v8";var $M=64*1024*1024;function Yl(){let e=globalThis.gc;if(!e)return;let t=MM();t.heap_size_limit-t.used_heap_size<$M||e()}var jM=50,OM=25e3,BM=2500,Lh=2500,Dh=50,HM=10,Ji=["overview","dead","isolated","cycles","similar","react-component-duplicates","react-hook-candidates","react-large-component-pressure","vue-component-duplicates","vue-composable-candidates","vue-large-view-pressure","extract-candidates","wrapper-candidates","passthrough-candidates","stale-abstractions","drift","complexity-hotspots","git-evidence","suppressions"],VM={overview:(e,t,n,i)=>({phase:"overview",statsResult:i,warnings:n.warnings}),dead:(e,t,n)=>({phase:"dead",dead:zM(e,t,n)}),isolated:(e,t,n)=>({phase:"isolated",isolated:WM(e,t,n)}),cycles:(e,t,n)=>({phase:"cycles",realCycleCount:GM(e,t,n)}),similar:(e,t,n)=>({phase:"similar",similarCount:KM(e,t,n)}),"react-component-duplicates":(e,t,n)=>({phase:"react-component-duplicates",reactComponentDuplicates:XM(e,t,n)}),"react-hook-candidates":(e,t,n)=>({phase:"react-hook-candidates",reactHookCandidates:QM(e,t,n)}),"react-large-component-pressure":(e,t,n)=>({phase:"react-large-component-pressure",reactLargeComponentPressure:YM(e,t,n)}),"vue-component-duplicates":(e,t,n)=>({phase:"vue-component-duplicates",vueComponentDuplicates:ZM(e,t,n)}),"vue-composable-candidates":(e,t,n)=>({phase:"vue-composable-candidates",vueComposableCandidates:e$(e,t,n)}),"vue-large-view-pressure":(e,t,n)=>({phase:"vue-large-view-pressure",vueLargeViewPressure:t$(e,t,n)}),"extract-candidates":(e,t,n)=>({phase:"extract-candidates",extractCount:JM(e,t,n)}),"wrapper-candidates":(e,t,n)=>({phase:"wrapper-candidates",wrappers:n$(e,t,n)}),"passthrough-candidates":(e,t,n)=>({phase:"passthrough-candidates",passthroughs:i$(e,t,n)}),"stale-abstractions":(e,t,n)=>({phase:"stale-abstractions",stale:r$(e,t,n)}),drift:(e,t,n)=>({phase:"drift",drift:a$(e,t,n)}),"complexity-hotspots":(e,t,n)=>({phase:"complexity-hotspots",complexity:c$(e,t,n)}),"git-evidence":(e,t,n)=>({phase:"git-evidence",gitEvidence:o$(e,n)}),suppressions:(e,t,n)=>({phase:"suppressions",suppressions:s$(e,n)})};function ao(e,t,n={}){return Zl(e,[t],n)[0]}function Zl(e,t,n={}){return qM(e,n.full!==!1,(i,r)=>{let o={...r,releaseCachesBetweenPhases:!1};return t.map(s=>VM[s](e,n.scope,o,i))})}function qM(e,t,n){let i=We(e),r=l$(i,t);try{return n(i,r)}finally{Vc(e,{semanticProvider:!0}),Yl()}}function eu(e){return Ph(UM(e))}function UM(e){let t=Ee(e,"overview");return{statsResult:t.statsResult,warnings:t.warnings,dead:Ee(e,"dead").dead,isolated:Ee(e,"isolated").isolated,realCycleCount:Ee(e,"cycles").realCycleCount,similarCount:Ee(e,"similar").similarCount,reactComponentDuplicates:Ee(e,"react-component-duplicates").reactComponentDuplicates,reactHookCandidates:Ee(e,"react-hook-candidates").reactHookCandidates,reactLargeComponentPressure:Ee(e,"react-large-component-pressure").reactLargeComponentPressure,vueComponentDuplicates:Ee(e,"vue-component-duplicates").vueComponentDuplicates,vueComposableCandidates:Ee(e,"vue-composable-candidates").vueComposableCandidates,vueLargeViewPressure:Ee(e,"vue-large-view-pressure").vueLargeViewPressure,extractCount:Ee(e,"extract-candidates").extractCount,wrappers:Ee(e,"wrapper-candidates").wrappers,passthroughs:Ee(e,"passthrough-candidates").passthroughs,stale:Ee(e,"stale-abstractions").stale,drift:Ee(e,"drift").drift,complexity:Ee(e,"complexity-hotspots").complexity,gitEvidence:Eh(e,"git-evidence")?.gitEvidence??null,suppressions:Eh(e,"suppressions")?.suppressions??null}}function Eh(e,t){return e.find(n=>n.phase===t)}function Ee(e,t){let n=e.find(i=>i.phase===t);if(!n)throw new Error(`Missing health phase result: ${t}`);return n}function zM(e,t,n){return ve(e,n,"dead",()=>{let i=Qt(e,{scope:t,...Ce.dead,scanLimit:n.candidateScanLimit});return Qs(m$(e,i.symbols))})}function WM(e,t,n){return ve(e,n,"isolated",()=>{let i=zn(e,{scope:t,...Ce.isolated,scanLimit:n.candidateScanLimit});return Qs(p$(e,i))})}function GM(e,t,n){return ve(e,n,"cycles",()=>Un(e,{scope:t}).filter(r=>r.kind==="real").length)}function KM(e,t,n){let i=ve(e,n,"similar",()=>ml(e,{scope:t,...Ce.similar,scanLimit:n.candidateScanLimit}));return Math.min(i,n.candidateResultLimit)}function JM(e,t,n){return ve(e,n,"extract-candidates",()=>Qn(e,{scope:t,...Ce.extract,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit}).length)}function XM(e,t,n){return ve(e,n,"react-component-duplicates",()=>{let i=Gn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return tu(i)})}function QM(e,t,n){return ve(e,n,"react-hook-candidates",()=>{let i=Kn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Th(i,g$)})}function YM(e,t,n){return ve(e,n,"react-large-component-pressure",()=>{let i=qr(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return f$(i)})}function ZM(e,t,n){return ve(e,n,"vue-component-duplicates",()=>{let i=Jn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return tu(i)})}function e$(e,t,n){return ve(e,n,"vue-composable-candidates",()=>{let i=Xn(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Th(i,h$)})}function t$(e,t,n){return ve(e,n,"vue-large-view-pressure",()=>{let i=Ur(e,{scope:t,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Qs(i)})}function n$(e,t,n){return ve(e,n,"wrapper-candidates",()=>{let i=oi(e,{scope:t,...Ce.wrappers,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Fh(i,y$)})}function i$(e,t,n){return ve(e,n,"passthrough-candidates",()=>{let i=ii(e,{scope:t,...Ce.passthroughs,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit});return Fh(i,b$)})}function r$(e,t,n){return ve(e,n,"stale-abstractions",()=>{let i=ri(e,{scope:t,...Ce.stale,limit:n.candidateResultLimit,scanLimit:n.candidateScanLimit}),r=i.filter(o=>o.consumers===0).length;return{count:i.length,loc:i.reduce((o,s)=>o+s.loc,0),files:[...new Set(i.map(o=>o.file))],unused:r,singleUse:i.length-r}})}function o$(e,t){return ve(e,t,"git-evidence",()=>{let n=Xe(e),i=n.fileChurn();if(!i)return null;let r=Zn(e,void 0,{limit:t.candidateResultLimit}),o={};for(let[s,a]of i)o[s]={changes:a.changes,fixChanges:a.fixChanges};return{amplification:n.changeAmplification(),hiddenCoupling:{pairCount:r.findings.length,scoreCount:nu(r.findings.reduce((s,a)=>s+Nh(a),0)),top:r.findings.slice(0,5).map(s=>({fileA:s.fileA,fileB:s.fileB,together:s.together,confidence:s.confidence,focusedTogether:s.focusedTogether,broadTogether:s.broadTogether,broadCommitRatio:s.broadCommitRatio,lastTogetherAt:s.lastTogetherAt,recentTogether:s.recentTogether,commitScope:s.commitScope,recency:s.recency,scoreWeight:Nh(s),subjectContext:s.subjectContext}))},fileStats:o}})}function s$(e,t){return ve(e,t,"suppressions",()=>{let n=Js(e);return{total:n.total,byCategory:{...n.byCategory}}})}function a$(e,t,n){return ve(e,n,"drift",()=>{let i=ni(e,{scope:t,...Ce.drift,includePatternDeviations:!1}),r=i.results.filter(a=>a.kind!=="pattern-deviation"),o=r.filter(a=>a.actionTier==="direct").length,s=r.length-o;return{count:r.length,unusedImports:i.unusedImports,layerViolations:i.layerViolations,direct:o,signal:s}})}function c$(e,t,n){return ve(e,n,"complexity-hotspots",()=>{let i=oo(e,{scope:t,minLoc:10,limit:n.complexityResultLimit,scanLimit:n.candidateScanLimit,semantic:!1});return{top:i.slice(0,5).map(r=>({symbol:r.shortName,score:r.score,file:r.file})),extremeCount:i.filter(r=>r.score>jM).length}})}function l$(e,t){let n=e.symbols>=OM||e.documents>=BM,i=t?Number.POSITIVE_INFINITY:Dh,r=t?Number.POSITIVE_INFINITY:HM;return!n||t?{candidateScanLimit:void 0,candidateResultLimit:i,complexityResultLimit:r,releaseCachesBetweenPhases:!0,warnings:t&&n?["Large index detected; running health without candidate scan or result caps because full mode is enabled."]:[]}:{candidateScanLimit:Lh,candidateResultLimit:i,complexityResultLimit:r,releaseCachesBetweenPhases:!0,warnings:[`Large index detected; candidate-style health checks scanned their highest-priority ${Lh} symbols and reported their top ${Dh} findings. Enable full mode for unbounded candidate counts.`]}}function u$(e,t){t.releaseCachesBetweenPhases&&(Vc(e),Yl())}function ve(e,t,n,i){d$(n);try{return i()}finally{u$(e,t)}}function d$(e){process.env.SCIP_QUERY_HEALTH_TRACE==="1"&&console.error(`[health] ${e}`)}function m$(e,t){return t.filter(n=>!Oe(e,n.relativePath)&&!be(e,n.symbol,n.relativePath)&&n.kind==="dead-code")}function p$(e,t){return t.filter(n=>!Oe(e,n.relativePath)&&!be(e,n.symbol,n.relativePath))}function Qs(e){let t=new Set;for(let n of e){let i=n.relativePath??n.file;i&&t.add(i)}return{count:e.length,loc:e.reduce((n,i)=>n+i.loc,0),files:[...t]}}function Fh(e,t){return{...Qs(e),scoreCount:nu(e.reduce((i,r)=>i+t(r),0))}}function f$(e){let t=new Map;for(let n of e)t.set(n.file,Math.max(t.get(n.file)??0,n.loc));return{count:t.size,loc:[...t.values()].reduce((n,i)=>n+i,0),files:[...t.keys()]}}function tu(e){let t=new Map;for(let n of e)t.set(n.fileA,Math.max(t.get(n.fileA)??0,n.locA)),t.set(n.fileB,Math.max(t.get(n.fileB)??0,n.locB));return{count:e.length,loc:[...t.values()].reduce((n,i)=>n+i,0),files:[...t.keys()]}}function Th(e,t){return{...tu(e),scoreCount:nu(e.reduce((i,r)=>i+t(r),0))}}function g$(e){let t=e.sharedHooks.length>0,n=_h({namedState:e.sharedState,requests:e.sharedRequests,lifecycle:e.sharedEffects,functions:e.sharedHandlers});return t&&n<=2?0:t?.5:Ah(e.sharedState,e.sharedHandlers,e.sharedHandlerVerbs)?.25:n>=2?1:.5}function h$(e){let t=e.sharedComposables.length+e.sharedStores.length>0,n=_h({namedState:e.sharedBindings,requests:e.sharedRequests,lifecycle:e.sharedLifecycle,functions:e.sharedFunctions});return t&&n<=2?0:t?.5:Ah(e.sharedBindings,e.sharedFunctions,e.sharedFunctionVerbs)?.25:n>=2?1:.5}function _h(e){return e.requests.length*2+e.lifecycle.length+e.namedState.filter(t=>!$h.has(Mh(t))).length+Math.min(e.functions.length,3)}function Ah(e,t,n){let i=[...e,...t,...n].map(Mh);return i.length>0&&i.every(r=>$h.has(r))}function Mh(e){return e.replace(/^handle/,"").replace(/^is/,"").replace(/^has/,"").toLowerCase()}function y$(e){return e.actionTier==="signal"?.25:1}function b$(e){return e.actionTier==="signal"?.25:1}function Nh(e){return e.commitScope==="broad-sweep"?e.recency==="recent"?.25:0:e.commitScope==="mixed"?e.recency==="recent"?.5:.25:e.recency==="recent"?1:.5}function nu(e){return Math.round(e*100)/100}var $h=new Set(["add","apply","cancel","change","clear","close","create","delete","draft","edit","error","filter","form","load","loading","name","open","refresh","remove","reset","save","saving","search","select","selected","submit","toggle","update","value"]);function iu(e,t,n,i={}){let r=q(e,t),o=q(e,n);if(!r||!o)return null;let s=Je(e,r,{semantic:i.semantic}),a=Je(e,o,{semantic:i.semantic}),c=s.filter(y=>!jh(e,y)),l=a.filter(y=>!jh(e,y)),d=c.length!==s.length||l.length!==a.length,u=new Set(c.map(y=>y.symbol)),m=new Set(l.map(y=>y.symbol)),p=[];for(let y of u)m.has(y)&&p.push(y);let f=[];for(let y of u)m.has(y)||f.push(y);let g=[];for(let y of m)u.has(y)||g.push(y);let b=new Set([...u,...m]),x=b.size>0?p.length/b.size:0,S;b.size===0?S="Neither function calls other tracked symbols. There is no callee-pattern evidence for consolidation; inspect the source bodies directly.":p.length===0?S="These functions do not share any callees. They are not a callee-based consolidation candidate.":f.length===0&&g.length===0?S="These functions have identical tracked callee sets. They are a strong structural match, but identical callees do not prove interchangeable semantics; inspect signatures, control flow, and return values before consolidating.":f.length===0?S="A's tracked callees are a subset of B's. B may subsume part of A's structure, but verify signatures, guards, and non-call logic before replacing A with B.":g.length===0?S="B's tracked callees are a subset of A's. A may subsume part of B's structure, but verify signatures, guards, and non-call logic before replacing B with A.":f.length<=2&&g.length<=2?S=`Create a shared function with the ${p.length} common callees. Pass the ${f.length+g.length} divergent callees as parameters or strategy callbacks.`:S=`Extract the ${p.length} shared callees into a common helper. Each function calls the helper plus its own unique logic (${f.length} callees in A, ${g.length} in B).`,d&&(S=`Ignored Clojure macro scaffolding while comparing tracked callees. ${S}`);let R=r.endLine-r.startLine+1,C=o.endLine-o.startLine+1;return{symbolA:{symbol:r.symbol,shortName:v(r.symbol),file:r.relativePath,loc:R},symbolB:{symbol:o.symbol,shortName:v(o.symbol),file:o.relativePath,loc:C},similarity:x,sharedCallees:p.map(v),uniqueToA:f.map(v),uniqueToB:g.map(v),consolidationStrategy:S}}function jh(e,t){return Q(e,t.file).some(n=>n.symbol===t.symbol&&Ln(e,n))}import{readFileSync as Oh}from"fs";import{extname as S$,join as Bh}from"path";function ru(e,t,n={}){let{context:i=0}=n,r=x$(t);if(r)return v$(e,r.filePath,r.startLine,r.endLine,i);let o=q(e,t);return o?C$(e,o,i):null}function x$(e){let t=e.match(/^(.+\.\w+):(\d+)-(\d+)$/);return t?{filePath:t[1],startLine:parseInt(t[2],10),endLine:parseInt(t[3],10)}:null}function C$(e,t,n){let i=e.get("SELECT language FROM documents WHERE relative_path = ?",t.relativePath),r=Bh(e.config.projectRoot,t.relativePath),o;try{o=Oh(r,"utf-8")}catch{return null}let s=o.split(`
|
|
633
655
|
`),a=Math.max(0,t.startLine-n),c=Math.min(s.length-1,t.endLine+n),l=s.slice(a,c+1).join(`
|
|
634
|
-
`);return{symbol:t.symbol,shortName:v(t.symbol),relativePath:t.relativePath,startLine:a,endLine:c,language:i?.language??
|
|
635
|
-
`),
|
|
636
|
-
`);return{symbol:`${s.relative_path}:${n}-${i}`,shortName:`${s.relative_path}:${n}-${i}`,relativePath:s.relative_path,startLine:
|
|
656
|
+
`);return{symbol:t.symbol,shortName:v(t.symbol),relativePath:t.relativePath,startLine:a,endLine:c,language:i?.language??Hh(t.relativePath),source:l}}function v$(e,t,n,i,r){let o=Ve(e,t);if(!o)return null;let s=e.get("SELECT relative_path, language FROM documents WHERE relative_path = ?",o);if(!s)return null;let a=Bh(e.config.projectRoot,s.relative_path),c;try{c=Oh(a,"utf-8")}catch{return null}let l=c.split(`
|
|
657
|
+
`),d=Math.max(0,n-1-r),u=Math.min(l.length-1,i-1+r),m=l.slice(d,u+1).join(`
|
|
658
|
+
`);return{symbol:`${s.relative_path}:${n}-${i}`,shortName:`${s.relative_path}:${n}-${i}`,relativePath:s.relative_path,startLine:d,endLine:u,language:s.language??Hh(s.relative_path),source:m}}function Hh(e){switch(S$(e).toLowerCase()){case".ts":case".tsx":case".mts":case".cts":return"typescript";case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".py":case".pyi":return"python";case".rs":return"rust";case".go":return"go";case".java":return"java";case".kt":case".kts":return"kotlin";case".scala":return"scala";case".rb":return"ruby";case".php":return"php";case".cs":return"csharp";case".vb":return"vb";case".dart":return"dart";case".c":case".h":return"c";case".cc":case".cpp":case".cxx":case".hpp":case".hh":case".hxx":return"cpp";case".vue":return"vue";default:return null}}function ou(e,t={}){let{scope:n,limit:i}=t,r=new A(e),o=E$([...R$(e,n),...P$(e,r,n)]);return N$(o),i?o.slice(0,i):o}function R$(e,t){let n=[];for(let i of k$(e,t)){if(e.isIgnored(i.barrel_path)||e.isIgnored(i.original_path)||vc(e,i.barrel_path)||M(e,i.barrel_path)&&es(e,i.barrel_path).length===0)continue;let r=w$(e,i),o=r?.barrel_consumers??0,s=r?.direct_consumers??0;o!==0||s!==0||n.push({barrelFile:i.barrel_path,symbol:i.symbol,shortName:v(i.symbol),originalFile:i.original_path,barrelConsumers:o,directConsumers:s,...qh(e,i.barrel_path)})}return n}function k$(e,t){let n=t?`AND barrel_d.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT
|
|
637
659
|
barrel_d.id AS barrel_doc_id,
|
|
638
660
|
barrel_d.relative_path AS barrel_path,
|
|
639
661
|
gs.id AS symbol_id,
|
|
@@ -663,7 +685,7 @@ ${n}`.toLowerCase(),r=On(i,["historical note","historical record","history note"
|
|
|
663
685
|
-- Only function-level symbols (ending with ().), not module-level
|
|
664
686
|
AND gs.symbol LIKE '%().'
|
|
665
687
|
${n}
|
|
666
|
-
ORDER BY barrel_d.relative_path, gs.symbol`)}function
|
|
688
|
+
ORDER BY barrel_d.relative_path, gs.symbol`)}function w$(e,t){return e.get(`SELECT
|
|
667
689
|
SUM(CASE WHEN uses_barrel = 1 THEN 1 ELSE 0 END) AS barrel_consumers,
|
|
668
690
|
SUM(CASE WHEN uses_barrel = 0 THEN 1 ELSE 0 END) AS direct_consumers
|
|
669
691
|
FROM (
|
|
@@ -692,7 +714,7 @@ ${n}`.toLowerCase(),r=On(i,["historical note","historical record","history note"
|
|
|
692
714
|
AND consumer_d.id != ?
|
|
693
715
|
${e.pathExclusionsFor("consumer_d")}
|
|
694
716
|
GROUP BY consumer_d.id
|
|
695
|
-
)`,t.barrel_doc_id,t.symbol_id,t.barrel_doc_id,t.original_doc_id)}function
|
|
717
|
+
)`,t.barrel_doc_id,t.symbol_id,t.barrel_doc_id,t.original_doc_id)}function P$(e,t,n){let i=[];for(let r of I$(e,n))Uh(e,r,r)>0||i.push(...L$(e,t,r));return i}function I$(e,t){return O(e,{scope:t,includeIgnored:!1}).filter(n=>es(e,n).length>0||xr(e,n).length>0)}function L$(e,t,n){let i=es(e,n).filter(o=>o.sourcePath&&!e.isIgnored(o.sourcePath)).flatMap(o=>Vh(e,t,n,o.sourcePath)),r=xr(e,n).filter(o=>o.sourcePath&&!e.isIgnored(o.sourcePath)).flatMap(o=>Vh(e,t,n,o.sourcePath));return[...i,...r]}function Vh(e,t,n,i){let r=D$(t,i);return r?[{barrelFile:n,symbol:r.symbol,shortName:v(r.symbol),originalFile:i,barrelConsumers:0,directConsumers:Uh(e,i,n),...qh(e,n)}]:[]}function qh(e,t){return _i(e,t)?{actionTier:"signal",surfaceEvidence:["barrel file is declared on the package public surface"],recommendation:"Review the package API before removing this re-export; local consumers are zero, but external consumers may import through the public barrel."}:{actionTier:"direct",surfaceEvidence:[],recommendation:"Remove this unused re-export when the barrel is not part of an external API surface."}}function Uh(e,t,n){let i=new Set;for(let r of O(e,{includeIgnored:!1}))if(r!==n)for(let o of oe(e,r))o.sourcePath===t&&i.add(r);return i.size}function D$(e,t){let n=e.definitionsForFile(t);return n.find(i=>se(i.symbol)==="method")??n[0]??null}function E$(e){let t=new Set,n=[];for(let i of e){let r=`${i.barrelFile}|${i.symbol}|${i.originalFile}`;t.has(r)||(t.add(r),n.push(i))}return n}function N$(e){e.sort((t,n)=>n.directConsumers-t.directConsumers||t.barrelFile.localeCompare(n.barrelFile)||t.shortName.localeCompare(n.shortName))}function cu(e,t={}){let{samples:n=50,scope:i,maxDisagreements:r=5}=t,o=new A(e),s=F$(o.productionCallableDefinitions({scope:i,minLoc:2,requireFunctionLikeSymbol:!0}),n),a=T$(e,s);if(s.length===0||!a)return{available:!1,sampleSize:s.length,oracleCoverage:0,scores:[],topDisagreements:[]};let c={references:zh(),callees:zh()},l=[],d=0,u=a==="semantic"?ys(e,s):new Map,m=a==="source"?M$(e,o,s):null;for(let p of s){let f=Ys(p,a==="semantic"?$i(e,p).map(S=>S.file):[...m?.referencesBySymbolId.get(p.symbolId)??[]]),g=Ys(p,a==="semantic"?(u.get(p.symbolId)??[]).map(S=>S.file):[...m?.calleesBySymbolId.get(p.symbolId)??[]]);if(f.size===0&&g.size===0)continue;d+=1;let b=Ys(p,Vn(e,p).map(S=>S.file)),x=Ys(p,(o.calleeMap([p],{semantic:!1}).get(p.symbolId)??[]).map(S=>S.file));Wh(c.references,p,"references",b,f,l),Wh(c.callees,p,"callees",x,g,l)}return l.sort((p,f)=>f.cheapOnly.length+f.oracleOnly.length-(p.cheapOnly.length+p.oracleOnly.length)),{available:!0,sampleSize:s.length,oracleCoverage:s.length>0?au(d/s.length):0,oracleKind:a,scores:["references","callees"].map(p=>A$(p,c[p],a)),topDisagreements:l.slice(0,r)}}function zh(){return{comparedSymbols:0,agreed:0,cheapTotal:0,oracleTotal:0}}function F$(e,t){let n=[...e].sort((o,s)=>o.symbolId-s.symbolId);if(n.length<=t)return n;let i=n.length/t,r=[];for(let o=0;o<t;o++)r.push(n[Math.floor(o*i)]);return r}function T$(e,t){let n=t[0];if(!n)return null;if(su(e,n))return"source";try{if(Xt(e).capability("semantic-references",n.relativePath).available)return"semantic"}catch{}return t.some(i=>su(e,i))?"source":null}function Ys(e,t){let n=new Set;for(let i of t)i!==e.relativePath&&n.add(i);return n}function Wh(e,t,n,i,r,o){if(i.size===0&&r.size===0)return;e.comparedSymbols+=1,e.cheapTotal+=i.size,e.oracleTotal+=r.size;let s=[],a=[];for(let c of i)r.has(c)?e.agreed+=1:s.push(c);for(let c of r)i.has(c)||a.push(c);(s.length>0||a.length>0)&&o.push({symbol:v(t.symbol),question:n,cheapOnly:s,oracleOnly:a})}var _$={references:!0,callees:!1};function A$(e,t,n){let i=t.oracleTotal>0?t.agreed/t.oracleTotal:1,r=t.cheapTotal-t.agreed,o=n==="semantic"?_$[e]:!1;return{question:e,comparedSymbols:t.comparedSymbols,precision:o&&t.cheapTotal>0?au(t.agreed/t.cheapTotal):null,recall:au(i),unverified:r}}function su(e,t){return H(t.relativePath)==="clojure"&&X(e,t.relativePath)!==null}function M$(e,t,n){let i=new Map,r=new Map,o=n.filter(c=>su(e,c)),s=new Map;for(let c of o){let l=s.get(c.leaf)??[];l.push(c),s.set(c.leaf,l)}for(let c of t.sourceFiles()){if(H(c)!=="clojure")continue;let l=X(e,c);if(l)for(let d of l.fileIdentifiers)for(let u of s.get(d)??[])Gh(i,u.symbolId,c)}let a=new Map;for(let c of t.scopedDefinitions()){if(H(c.relativePath)!=="clojure")continue;let l=a.get(c.leaf)??[];l.push(c),a.set(c.leaf,l)}for(let c of o){let l=X(e,c.relativePath);if(l){for(let d of l.callSites)if(!(d.line<c.startLine||d.line>c.endLine))for(let u of a.get(d.calleeLeaf)??[])Gh(r,c.symbolId,u.relativePath)}}return{referencesBySymbolId:i,calleesBySymbolId:r}}function Gh(e,t,n){let i=e.get(t);if(i){i.add(n);return}e.set(t,new Set([n]))}function au(e){return Math.round(e*1e3)/1e3}function lu(e,t={}){let{scope:n,minLoc:i=1,limit:r,scanLimit:o}=t,s=t.semantic!==!1,a=j$(e,$$(e,{scope:n,minLoc:i,scanLimit:o}),{semantic:s}),c=B$(a);return r?c.slice(0,r):c}function $$(e,t){let n=Lt(e,{scope:t.scope}).filter(i=>i.isFunctionLike&&!e.isIgnored(i.relativePath)).filter(i=>J(i)>=t.minLoc);return typeof t.scanLimit=="number"&&t.scanLimit>0&&n.sort((i,r)=>J(r)-J(i)||i.relativePath.localeCompare(r.relativePath)),qe(n,t.scanLimit)}function j$(e,t,n){let i=new Map;for(let r of t){let o=H$(e,r,n);if(!o)continue;let s=i.get(o)??[];s.push(O$(r)),i.set(o,s)}return i}function O$(e){return{symbol:e.symbol,shortName:v(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:J(e)}}function B$(e){let t=[];for(let[n,i]of e)i.length>=2&&t.push({signature:n,functions:i});return t.sort((n,i)=>{let r=i.functions.length-n.functions.length;if(r!==0)return r;let o=n.functions.reduce((a,c)=>a+c.loc,0);return i.functions.reduce((a,c)=>a+c.loc,0)-o}),t}function H$(e,t,n){if(n.semantic){let o=nf(e,t);if(o)return o}let i=V$(t.documentation),r=i?z$(i):null;return r||W$(q$(e,t.relativePath,t.startLine,t.endLine,t.leaf),t.leaf)}function V$(e){return Mn($n(e))}function q$(e,t,n,i,r){let o=M(e,t);if(!o)return null;let s=o.split(/\r?\n/),a=K$(s,n,i,r);for(let c of a){let l=Math.min(s.length-1,Math.max(c,c+4)),d="";for(let u=c;u<=l;u+=1){let m=s[u]?.trim();if(m&&(d=d?`${d} ${m}`:m,U$(d)))return d}if(d&&d.includes("("))return d}return null}function U$(e){let t=e.replace(/\s+/g," ").trim();return!t.includes("(")||br(t)>0?!1:/[;{]$/.test(t)||/\)\s*(?::\s*[^={]+)?\s*(?:=>|=|throws\b|where\b|$)/i.test(t)||/\)\s*As\s+.+$/i.test(t)}function z$(e){if(!e||!e.trim())return null;let t=e.replace(/^```\w*\s*/,"").replace(/\s*```$/,"").replace(/^\(method\)\s*/,"").replace(/^\(property\)\s*/,"").replace(/^\(function\)\s*/,"").replace(/^\(class\)\s*/,"").replace(/^\(interface\)\s*/,"").replace(/^\(enum\)\s*/,"").replace(/^\(type alias\)\s*/,"").replace(/^\(const\)\s*/,"").replace(/^\(var\)\s*/,"").trim(),n=t.indexOf("(");return n===-1||(t=t.slice(n),t=t.replace(/\s+/g,"").toLowerCase(),t.length<3)?null:t}function W$(e,t){if(!e||!e.trim())return null;let n=e.replace(/\s+/g," ").trim(),i=n.indexOf("(");if(i===-1)return null;let r=n.slice(0,i),s=new RegExp(`\\b${Kh(t)}\\b`,"i").exec(r);s&&typeof s.index=="number"&&(r=r.slice(0,s.index)),r=r.replace(/\b(public|private|protected|internal|final|static|abstract|sealed|virtual|override|async|suspend|inline|constexpr|consteval|constinit|const|pub|fn|function|def|sub|friend|shared|readonly|new|open|partial|export)\b/gi," ").replace(/\s+/g," ").trim();let a=G$(n.slice(i)).replace(/\)\s*=\s*[\s\S]*$/,")").replace(/\s+throws\s+[^={]+$/i,"").replace(/\s+where\s+.+$/i,"").replace(/\s+/g," ").trim();if(!a.startsWith("("))return null;let c=`${r?`${r} `:""}${a}`.replace(/\s+/g,"").toLowerCase();return c.length>=3?c:null}function G$(e){let t=0,n=0,i=0,r=0,o=null,s=!1;for(let a=0;a<e.length;a+=1){let c=e[a];if(o){if(s){s=!1;continue}if(c==="\\"){s=!0;continue}c===o&&(o=null);continue}if(c==='"'||c==="'"||c==="`"){o=c;continue}if(c==="(")t+=1;else if(c===")")t=Math.max(0,t-1);else if(c==="[")i+=1;else if(c==="]")i=Math.max(0,i-1);else if(c==="<")r+=1;else if(c===">")r=Math.max(0,r-1);else if(c==="{"){if(t===0&&i===0&&r===0)return e.slice(0,a);n+=1}else if(c==="}")n=Math.max(0,n-1);else if(c==="="&&e[a+1]===">"&&t===0&&n===0&&i===0&&r===0)return e.slice(0,a)}return e}function K$(e,t,n,i){let r=Kh(i),o=new RegExp(`\\b${r}\\b\\s*\\(`,"i"),s=new RegExp(`\\bdef\\s+${r}\\b`,"i"),a=[],c=new Set,l=Math.max(0,Math.min(t,e.length-1)),d=Math.max(l,Math.min(e.length-1,Math.max(n,t+4)));for(let u=l;u<=d;u+=1){let m=e[u]??"";(o.test(m)||s.test(m))&&!c.has(u)&&(c.add(u),a.push(u))}for(let u=0;u<e.length;u+=1){let m=e[u]??"";(o.test(m)||s.test(m))&&!c.has(u)&&(c.add(u),a.push(u))}return a}function Kh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}import{existsSync as ny}from"fs";import{join as mj}from"path";import J$ from"better-sqlite3";var X$=["node_modules",".git","dist","build","out","coverage","target",".next",".nuxt",".cache",".turbo",".nbb",".cpcache",".shadow-cljs",".scipquery-cache","__pycache__",".venv","venv"],Xi=class{db;config;pathFilter;statementCache=new Map;constructor(t,n){this.config=t,this.pathFilter=n??null,this.db=new J$(t.dbPath,{readonly:!0}),this.db.pragma("busy_timeout = 5000"),this.db.pragma("query_only = ON"),this.db.pragma("temp_store = MEMORY"),this.db.pragma("cache_size = -64000"),this.db.pragma("mmap_size = 268435456")}isIgnored(t){return this.pathFilter?.isIgnored(t)??!1}get localSymbolPredicate(){return`(
|
|
696
718
|
EXISTS (
|
|
697
719
|
SELECT 1
|
|
698
720
|
FROM defn_enclosing_ranges local_der
|
|
@@ -709,8 +731,8 @@ ${n}`.toLowerCase(),r=On(i,["historical note","historical record","history note"
|
|
|
709
731
|
AND local_m.role = 1
|
|
710
732
|
${this.pathExclusionsFor("local_d").trimStart()}
|
|
711
733
|
)
|
|
712
|
-
)`}get pathExclusions(){return this.pathExclusionsFor("d")}get symbolNoise(){return this.symbolNoiseFor("gs")}pathExclusionsFor(...t){return t.flatMap(n=>
|
|
713
|
-
`)}symbolNoiseFor(t){return`AND ${t}.symbol NOT LIKE '%().(%' AND ${t}.symbol NOT LIKE '%typeLiteral%'`}all(t,...n){return this.statement(t).all(...n)}get(t,...n){return this.statement(t).get(...n)}close(){this.statementCache.clear(),this.db.close()}statement(t){let n=this.statementCache.get(t);return n||(n=this.db.prepare(t),this.statementCache.set(t,n)),n}};import
|
|
734
|
+
)`}get pathExclusions(){return this.pathExclusionsFor("d")}get symbolNoise(){return this.symbolNoiseFor("gs")}pathExclusionsFor(...t){return t.flatMap(n=>X$.flatMap(i=>[`AND ${n}.relative_path NOT LIKE '${i}/%'`,`AND ${n}.relative_path NOT LIKE '%/${i}/%'`])).join(`
|
|
735
|
+
`)}symbolNoiseFor(t){return`AND ${t}.symbol NOT LIKE '%().(%' AND ${t}.symbol NOT LIKE '%typeLiteral%'`}all(t,...n){return this.statement(t).all(...n)}get(t,...n){return this.statement(t).get(...n)}close(){this.statementCache.clear(),this.db.close()}statement(t){let n=this.statementCache.get(t);return n||(n=this.db.prepare(t),this.statementCache.set(t,n)),n}};import Q$ from"ignore";import{readFileSync as Y$,existsSync as uu}from"fs";import{dirname as du,isAbsolute as Jh,join as mu,relative as Z$,resolve as ej}from"path";function Cn(e){let t=Q$(),n=!1,i=tj(e);for(let r of i)try{let o=Y$(r,"utf-8");t.add(o),n=!0}catch{}return n||t.add(nj),{isIgnored:r=>Xh(t,e,r),filter:r=>r.filter(o=>!Xh(t,e,o))}}function tj(e){let t=[],n=mu(e,".gitignore");uu(n)&&t.push(n);let i=du(e),r=0;for(;i!==du(i)&&r<5;){let o=mu(i,".gitignore");if(uu(o)&&t.push(o),uu(mu(i,".git")))break;i=du(i),r++}return t}var nj=`
|
|
714
736
|
# Dependencies
|
|
715
737
|
node_modules/
|
|
716
738
|
vendor/
|
|
@@ -767,30 +789,31 @@ Thumbs.db
|
|
|
767
789
|
|
|
768
790
|
# Type definitions (often noise in queries)
|
|
769
791
|
*.d.ts
|
|
770
|
-
`;function
|
|
771
|
-
`),n}function
|
|
772
|
-
`),{path:n,suppressionCount:r.suppressions?.length??0}}function
|
|
773
|
-
`)}
|
|
774
|
-
|
|
792
|
+
`;function Xh(e,t,n){let i=ij(t,n);if(!i)return!1;try{return e.ignores(i)}catch{return!1}}function ij(e,t){if(!t||t===".")return null;if(!Jh(t)&&!t.startsWith(".."))return t.replaceAll("\\","/");let n=Jh(t)?t:ej(e,t),i=Z$(e,n).replaceAll("\\","/");return!i||i==="."||i.startsWith("..")?null:i}import{readFileSync as rj,writeFileSync as Zh,existsSync as Qi,mkdirSync as oj}from"fs";import{isAbsolute as Qh,join as At,relative as Yh,resolve as Zs}from"path";import{createHash as sj}from"crypto";import{homedir as aj}from"os";var co=".scipquery.json",cj={enabled:!1,debounceMs:3e4,cooldownMs:6e4,gitPollMs:2e3,autoRefresh:!0,ignore:[]},lj=["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php","clojure"];function Ue(e){let t=At(e,co);if(!Qi(t))return{};try{let n=rj(t,"utf-8");return JSON.parse(n)}catch(n){let i=n instanceof Error?n.message:String(n);throw n instanceof SyntaxError?new Error(`invalid ${co} at ${t}: ${i}`,{cause:n}):new Error(`unable to read ${co} at ${t}: ${i}`,{cause:n})}}function Yi(e,t={}){let n=[],i=new Set(lj);for(let[a,c]of(e.languages??[]).entries())i.has(c)||n.push({level:"error",path:`languages[${a}]`,message:`Unsupported language: ${c}`});e.indexerConcurrency!==void 0&&(!Number.isInteger(e.indexerConcurrency)||e.indexerConcurrency<=0)&&n.push({level:"error",path:"indexerConcurrency",message:"Must be a positive integer."}),e.watch?.debounceMs!==void 0&&e.watch.debounceMs<=0&&n.push({level:"error",path:"watch.debounceMs",message:"Must be greater than 0."}),e.watch?.cooldownMs!==void 0&&e.watch.cooldownMs<=0&&n.push({level:"error",path:"watch.cooldownMs",message:"Must be greater than 0."}),e.watch?.gitPollMs!==void 0&&e.watch.gitPollMs<=0&&n.push({level:"error",path:"watch.gitPollMs",message:"Must be greater than 0."}),e.watch?.autoRefresh!==void 0&&typeof e.watch.autoRefresh!="boolean"&&n.push({level:"error",path:"watch.autoRefresh",message:"Must be a boolean."});let r=e.indexer?.typescript;if(r?.projectMode!==void 0&&r.projectMode!=="single"&&r.projectMode!=="workspace"&&n.push({level:"error",path:"indexer.typescript.projectMode",message:'Must be "single" or "workspace".'}),r?.projects!==void 0)if(!Array.isArray(r.projects))n.push({level:"error",path:"indexer.typescript.projects",message:"Must be an array."});else for(let[a,c]of r.projects.entries()){let l=`indexer.typescript.projects[${a}]`;if(typeof c!="string"||c.trim()==="")n.push({level:"error",path:l,message:"Project path must be a non-empty string."});else if(t.projectRoot){let d=Zs(t.projectRoot,c),u=Yh(t.projectRoot,d);u.startsWith("..")||Qh(u)?n.push({level:"error",path:l,message:"Project path must stay inside the project root."}):Qi(d)||n.push({level:"warning",path:l,message:`TypeScript project path does not exist: ${c}`})}}r?.projectMode==="workspace"&&r.pnpmWorkspaces===!0&&n.push({level:"warning",path:"indexer.typescript.pnpmWorkspaces",message:'Ignored when projectMode is "workspace"; explicit TypeScript projects are indexed directly.'});let o=e.indexer?.clojure;if(o?.configPath!==void 0){let a="indexer.clojure.configPath";if(typeof o.configPath!="string"||o.configPath.trim()==="")n.push({level:"error",path:a,message:"Config path must be a non-empty string."});else if(t.projectRoot){let c=Zs(t.projectRoot,o.configPath),l=Yh(t.projectRoot,c);l.startsWith("..")||Qh(l)?n.push({level:"error",path:a,message:"Config path must stay inside the project root."}):Qi(c)||n.push({level:"warning",path:a,message:`Clojure indexer config path does not exist: ${o.configPath}`})}}if(e.locality!==void 0)if(!dj(e.locality))n.push({level:"error",path:"locality",message:"Must be an object."});else{let a=e.locality.architecturalBoundarySegments;if(a!==void 0)if(!Array.isArray(a))n.push({level:"error",path:"locality.architecturalBoundarySegments",message:"Must be an array."});else for(let[c,l]of a.entries()){let d=`locality.architecturalBoundarySegments[${c}]`;typeof l!="string"||l.trim()===""?n.push({level:"error",path:d,message:"Boundary segment must be a non-empty string."}):(l.includes("/")||l.includes("\\"))&&n.push({level:"error",path:d,message:"Boundary segment must be a single folder name, not a path."})}}if(e.declaredCouplings!==void 0&&!Array.isArray(e.declaredCouplings))n.push({level:"error",path:"declaredCouplings",message:"Must be an array."});else for(let[a,c]of(e.declaredCouplings??[]).entries()){let l=`declaredCouplings[${a}]`;if((!c.name||c.name.trim()==="")&&n.push({level:"error",path:`${l}.name`,message:"Declared coupling name is required."}),!Array.isArray(c.files)||c.files.length<2)n.push({level:"error",path:`${l}.files`,message:"Declared coupling needs at least two files."});else for(let[d,u]of c.files.entries())!u||u.trim()===""?n.push({level:"error",path:`${l}.files[${d}]`,message:"Declared coupling file path is required."}):t.projectRoot&&!Qi(At(t.projectRoot,u))&&n.push({level:"warning",path:`${l}.files[${d}]`,message:`Declared coupling file does not exist: ${u}`});c.reason!==void 0&&c.reason.trim()===""&&n.push({level:"error",path:`${l}.reason`,message:"Declared coupling reason cannot be blank."})}let s=t.now??new Date;for(let[a,c]of(e.suppressions??[]).entries()){let l=`suppressions[${a}]`;if((!c.reason||c.reason.trim()==="")&&n.push({level:"error",path:`${l}.reason`,message:"Suppression reason is required."}),!c.id&&!c.check&&n.push({level:"error",path:l,message:"Suppression must include id or check."}),c.file!==void 0&&(c.file.trim()===""?n.push({level:"error",path:`${l}.file`,message:"Suppression file path cannot be blank."}):t.projectRoot&&!Qi(At(t.projectRoot,c.file))&&n.push({level:"warning",path:`${l}.file`,message:`Suppression file does not exist: ${c.file}`})),c.expiresAt){let d=Date.parse(c.expiresAt);Number.isNaN(d)?n.push({level:"error",path:`${l}.expiresAt`,message:"Must be an ISO date string."}):d<=s.getTime()&&n.push({level:"warning",path:`${l}.expiresAt`,message:"Suppression has expired."})}}return n}function Zi(e){return{...cj,...e.watch}}function uj(e,t){let n=process.env.SCIP_QUERY_CACHE_DIR;if(n)return pu(n);if(t?.dbPath)return pu(Zs(e,t.dbPath));let r=process.env.XDG_CACHE_HOME||At(aj(),".cache"),o=sj("sha256").update(Zs(e)).digest("hex").slice(0,12),s=At(r,"scip-query","projects",o);return pu(s)}function Mt(e,t){let n=uj(e,t);return{cacheDir:n,dbPath:At(n,"index.db"),indexPath:At(n,"index.scip"),metaPath:At(n,"meta.json")}}function ey(e,t){let n=At(e,co);return Qi(n)||Zh(n,JSON.stringify({languages:t,watch:{enabled:!1,debounceMs:3e4,cooldownMs:6e4,gitPollMs:2e3,autoRefresh:!0}},null,2)+`
|
|
793
|
+
`),n}function ty(e,t){let n=At(e,co),i=Ue(e),r={...i,suppressions:[...i.suppressions??[],t]},o=Yi(r,{projectRoot:e}).filter(s=>s.level==="error");if(o.length>0){let s=o.map(a=>`${a.path}: ${a.message}`).join("; ");throw new Error(`invalid suppression: ${s}`)}return Zh(n,JSON.stringify(r,null,2)+`
|
|
794
|
+
`),{path:n,suppressionCount:r.suppressions?.length??0}}function pu(e){return oj(e,{recursive:!0}),e}function dj(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ne(){return process.env.SCIP_QUERY_PROJECT_ROOT??process.cwd()}function ai(e=Ne()){let t=Ue(e),n=Mt(e,t),i=process.env.SCIP_QUERY_INDEX_DB??(ny(n.dbPath)?n.dbPath:mj(e,"index.db"));return{projectRoot:e,config:t,paths:n,dbPath:i}}function er(e){return ai(e).dbPath}function pj(){let{projectRoot:e,config:t,paths:n,dbPath:i}=ai();ny(i)||(console.error("error: No index.db found. Run: scip-query reindex"),process.exit(1));let r={dbPath:i,indexPath:process.env.SCIP_QUERY_INDEX_SCIP??n.indexPath,projectRoot:e,entryRoots:t.entryRoots,semantic:t.semantic,suppressions:t.suppressions,declaredCouplings:t.declaredCouplings,locality:t.locality},o=Cn(e);return new Xi(r,o)}function ut(e){let t=pj();try{return e(t)}finally{t.close()}}function fu(e,t){return t.concat([e])}function ci(e){return e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(0)} KB`:e<1024*1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:`${(e/(1024*1024*1024)).toFixed(1)} GB`}function iy(e){switch(e.state){case"idle":return"Watching (idle)";case"waiting":{let t=Math.round((e.reindexAt-Date.now())/1e3);return`${e.changedFiles} file(s) changed, reindexing in ${t}s...`}case"indexing":return`Reindexing... (${Math.round((Date.now()-e.startedAt)/1e3)}s)`;case"cooldown":return`Cooldown (${Math.round((e.until-Date.now())/1e3)}s)${e.dirty?" \u2014 changes pending":""}`;default:return fj(e)}}function fj(e){throw new Error(`Unhandled watcher status: ${JSON.stringify(e)}`)}import{spawn as gj,spawnSync as oee}from"child_process";function ry(e,t){let n=[];for(let i=0;i<e.length;i+=t)n.push(e.slice(i,i+t));return n}function ea(e){return new Promise((t,n)=>{let i=e.maxBuffer??10485760,r=gj(process.execPath,[...process.execArgv,e.cliPath,e.command,...e.args??[]],{cwd:process.cwd(),env:e.env??process.env,stdio:["ignore","pipe","pipe"]}),o=[],s=[],a=0,c=0,l=!1,d=u=>{l||(l=!0,r.kill(),n(u))};r.stdout.on("data",u=>{if(a+=u.length,a>i){d(new Error(`${e.label} exceeded stdout buffer limit (${i} bytes).`));return}o.push(u)}),r.stderr.on("data",u=>{if(c+=u.length,c>i){d(new Error(`${e.label} exceeded stderr buffer limit (${i} bytes).`));return}s.push(u)}),r.on("error",d),r.on("close",u=>{if(l)return;l=!0;let m=Buffer.concat(s).toString("utf8").trim();if(u!==0){n(new Error(`${e.label} failed${m?`:
|
|
795
|
+
${m}`:""}`));return}try{t(JSON.parse(Buffer.concat(o).toString("utf8")))}catch(p){n(new Error(`${e.label} returned invalid JSON: ${p instanceof Error?p.message:p}`))}})})}async function gu(e,t,n){let i=new Array(e.length),r=0;async function o(){for(;r<e.length;){let s=r++;i[s]=await n(e[s])}}return await Promise.all(Array.from({length:Math.min(t,e.length)},()=>o())),i}function oy(e,t){let n=new Set,i=[];for(let r of e){if(n.has(r))continue;let o=t.find(a=>a.has(r));if(!o){n.add(r),i.push([r]);continue}let s=e.filter(a=>o.has(a));s.forEach(a=>n.add(a)),i.push(s)}return i}function Qe(e){return e+1}function _e(e,t){return`${Qe(e)}-${Qe(t)}`}function Fe(e,t,n){return`${e}:${_e(t,n)}`}function ta(e,t=180){let n=e.replace(/\s+/g," ").trim();return n.length>t?`${n.slice(0,t-3)}...`:n}var N={empty(e){console.log(e)},list(e,t){for(let n of e)console.log(t(n))},groupedByFile(e,t,n=i=>i.relativePath){let i="";for(let r of e){let o=n(r);o!==i&&(i&&console.log(""),console.log(o),i=o),console.log(t(r))}},sectionedReport(e){let t=!0;for(let n of e)if(!(n.skipIfEmpty&&n.rows.length===0)){t||console.log(""),t=!1,n.title!==void 0&&console.log(`\u2550\u2550\u2550 ${n.title} \u2550\u2550\u2550`),n.explanation!==void 0&&console.log(n.explanation);for(let i of n.rows)console.log(i)}},table(e,t,n){console.log(` ${e.join(" ")}`);let i=n??e.map(r=>r.length);console.log(` ${i.map(r=>"\u2500".repeat(r)).join(" ")}`);for(let r of t)console.log(r)}};var bj=hj(import.meta.url),{version:na}=Lj(),lo="__health-phase",ia="__diff-impact-batch",Sj=10,xj=4,Cj=8,vj=25e3,Rj=2500,sy=2500,kj=4,wj=12,ay=new Set(["react-component-duplicates","react-hook-candidates","react-large-component-pressure"]),cy=new Set(["vue-component-duplicates","vue-composable-candidates","vue-large-view-pressure"]),Pj=new Set([...cy,"suppressions"]),Ij=new Set(["similar","extract-candidates"]);function Lj(){for(let e of["../package.json","../../package.json"])try{return bj(e)}catch{}return{version:"0.0.0"}}function tr(e){console.log(`Heuristic ${e}: review before acting; these are candidates, not exact compiler facts.
|
|
796
|
+
`)}function Dj(e){let t=We(e);return t.symbols>=vj||t.documents>=Rj}function ra(e,t,n,i={}){return Dj(e)?n?(i.quiet||console.error(`Large index detected; ${t} is running the unbounded semantic pass because --full was supplied.`),{semantic:!0}):(i.quiet||console.error(`Large index detected; ${t} will scan the highest-priority ${sy} candidates with semantic enrichment disabled. Run "scip-query ${t} --full" for the unbounded semantic pass.`),{scanLimit:sy,semantic:!1}):{semantic:!0}}async function oa(e){let{applicability:t,overview:n}=ut(a=>({applicability:Ej(a,e),overview:ao(a,"overview",e)})),i=new Map;i.set("overview",n);let r=Ji.filter(a=>a==="overview"?!1:Nj(a,t)?!0:(i.set(a,Tj(a)),!1)),o=Fj(r);return(await gu(o,Mj(o.length),a=>_j(a,e))).flat().forEach(a=>i.set(a.phase,a)),eu(Ji.map(a=>i.get(a)))}function Ej(e,t){return $o(e,{scope:t.scope})}function Nj(e,t){return ay.has(e)?t.react:cy.has(e)?t.vue:!0}function Fj(e){return oy(e,[ay,Pj,Ij])}function Tj(e){switch(e){case"react-component-duplicates":return{phase:e,reactComponentDuplicates:{count:0,loc:0,files:[]}};case"react-hook-candidates":return{phase:e,reactHookCandidates:{count:0,loc:0,files:[]}};case"react-large-component-pressure":return{phase:e,reactLargeComponentPressure:{count:0,loc:0,files:[]}};case"vue-component-duplicates":return{phase:e,vueComponentDuplicates:{count:0,loc:0,files:[]}};case"vue-composable-candidates":return{phase:e,vueComposableCandidates:{count:0,loc:0,files:[]}};case"vue-large-view-pressure":return{phase:e,vueLargeViewPressure:{count:0,loc:0,files:[]}};default:throw new Error(`Health phase "${e}" cannot be synthesized.`)}}function _j(e,t){if(e.length===1)return Aj(e[0],t).then(o=>[o]);let n=e.join(","),i=process.argv[1]??yu(import.meta.url),r=[n];return t.scope&&r.push("--scope",t.scope),t.full&&r.push("--full"),ea({cliPath:i,command:lo,args:r,label:`Health phases "${n}"`})}function Aj(e,t){let n=process.argv[1]??yu(import.meta.url),i=[e];return t.scope&&i.push("--scope",t.scope),t.full&&i.push("--full"),ea({cliPath:n,command:lo,args:i,label:`Health phase "${e}"`})}var Mj=dy({envKey:"SCIP_QUERY_HEALTH_CONCURRENCY",defaultMinimum:kj,defaultMaximum:wj});function ly(e,t){if(t){console.log(JSON.stringify(e,null,2));return}if(console.log(`
|
|
775
797
|
Codebase Health Score: ${e.score}/100`),console.log(` Risk: ${e.riskScore}/100 (validated predictors: graph facts + change graph)`),console.log(` Hygiene: ${e.hygieneScore}/100 (tidiness candidates)
|
|
776
|
-
`),console.log(` ${e.overview.documents} files | ${e.overview.symbols} symbols | ${
|
|
777
|
-
`),e.warnings&&e.warnings.length>0){console.log(" Warnings:");for(let i of e.warnings)console.log(` ${i}`);console.log("")}console.log(" Findings:");let n=e.findings;if(n.deadSymbols>0&&console.log(` Dead code: ${n.deadSymbols} symbols (${n.deadLoc} LOC)`),n.isolatedSymbols>0&&console.log(` Isolated symbols: ${n.isolatedSymbols} (${n.isolatedLoc} LOC)`),n.cycles>0&&console.log(` Circular deps: ${n.cycles}`),n.similarPairs>0&&console.log(` Similar pairs: ${n.similarPairs}`),n.reactComponentDuplicatePairs>0&&console.log(` React components: ${n.reactComponentDuplicatePairs} duplicate pair(s)`),n.reactHookCandidatePairs>0&&console.log(` React hook reuse: ${
|
|
798
|
+
`),console.log(` ${e.overview.documents} files | ${e.overview.symbols} symbols | ${ci(e.overview.indexSizeBytes)}
|
|
799
|
+
`),e.warnings&&e.warnings.length>0){console.log(" Warnings:");for(let i of e.warnings)console.log(` ${i}`);console.log("")}console.log(" Findings:");let n=e.findings;if(n.deadSymbols>0&&console.log(` Dead code: ${n.deadSymbols} symbols (${n.deadLoc} LOC)`),n.isolatedSymbols>0&&console.log(` Isolated symbols: ${n.isolatedSymbols} (${n.isolatedLoc} LOC)`),n.cycles>0&&console.log(` Circular deps: ${n.cycles}`),n.similarPairs>0&&console.log(` Similar pairs: ${n.similarPairs}`),n.reactComponentDuplicatePairs>0&&console.log(` React components: ${n.reactComponentDuplicatePairs} duplicate pair(s)`),n.reactHookCandidatePairs>0&&console.log(` React hook reuse: ${hu(n.reactHookCandidatePairs,n.reactHookCandidateScoreCount)} candidate pair(s)`),n.reactLargeComponentPressureFiles>0&&console.log(` React large comps: ${n.reactLargeComponentPressureFiles} component(s)`),n.vueComponentDuplicatePairs>0&&console.log(` Vue components: ${n.vueComponentDuplicatePairs} duplicate pair(s)`),n.vueComposableCandidatePairs>0&&console.log(` Vue composables: ${hu(n.vueComposableCandidatePairs,n.vueComposableCandidateScoreCount)} candidate pair(s)`),n.vueLargeViewPressureFiles>0&&console.log(` Vue large views: ${n.vueLargeViewPressureFiles} file(s)`),n.extractionCandidates>0&&console.log(` Extract candidates: ${n.extractionCandidates}`),n.wrappers>0&&console.log(` Wrapper functions: ${hu(n.wrappers,n.wrapperScoreCount)}`),n.passthroughs>0&&console.log(` Passthroughs: ${n.passthroughs}`),n.staleTypes>0&&console.log(` Stale abstractions: ${n.staleTypes}`),n.driftedFiles>0&&console.log(` Pattern drift: ${n.driftedFiles} files`),n.complexityHotspotCount>0&&console.log(` Complexity hotspots: ${n.complexityHotspotCount}`),e.actions.length>0){console.log(`
|
|
778
800
|
Prioritized Actions (highest impact + lowest effort first):`);for(let i=0;i<e.actions.length;i++){let r=e.actions[i],o=r.locRecoverable>0?` (~${r.locRecoverable} LOC recoverable)`:"";console.log(` ${i+1}. [${r.effort} effort / ${r.impact} impact] ${r.description}${o}`)}}if(e.topComplexity.length>0){console.log(`
|
|
779
|
-
Top Complexity Hotspots:`);for(let i of e.topComplexity)console.log(` ${i.score.toFixed(1).padStart(6)} ${i.symbol}`)}if(
|
|
801
|
+
Top Complexity Hotspots:`);for(let i of e.topComplexity)console.log(` ${i.score.toFixed(1).padStart(6)} ${i.symbol}`)}if(Oj(e),jj(e),e.scoreBreakdown.length>0){console.log(`
|
|
780
802
|
Score Breakdown (100 minus the following):`);for(let i of e.scoreBreakdown)console.log(` -${String(i.points).padStart(2)} ${i.axis}: ${i.detail}`)}e.actions.length===0&&console.log(`
|
|
781
|
-
No issues found. Codebase is clean.`)}function
|
|
782
|
-
Maintenance Pressure:`);for(let t of e.pressure)console.log(` ${t.category}: ${t.count} / ${t.threshold} threshold (${t.ratio}x, -${t.extraPenalty} ${t.kind})`)}}function
|
|
783
|
-
Axes:`),console.log(` Deletable: ${t.deletable.loc} LOC across ${t.deletable.symbols} symbols`),t.changeAmplification){let i=t.changeAmplification;console.log(` Change amplification: ${i.medianFilesPerCommit} files/commit median, ${i.p90FilesPerCommit} p90 (${i.commitsAnalyzed} commits)`)}if(t.hiddenCoupling&&t.hiddenCoupling.pairCount>0){console.log(` Hidden coupling: ${t.hiddenCoupling.pairCount} co-changing pair(s) without a dependency edge`);for(let i of t.hiddenCoupling.top.slice(0,3))console.log(` ${i.fileA} <-> ${i.fileB} (${i.together}x together, ${Math.round(i.confidence*100)}%)`)}if(t.churnWeightedComplexity&&t.churnWeightedComplexity.length>0){let i=t.churnWeightedComplexity[0];i.weighted>0&&console.log(` Churn x complexity: hottest is ${i.symbol} (${i.changes} changes, weighted ${i.weighted})`)}let n=t.evidenceQuality;if(console.log(` Evidence quality: ${n.graphFindings} graph-fact finding(s), ${n.heuristicFindings} heuristic finding(s), ${n.userSuppressed} user-suppressed`),e.validation&&e.validation.flaggedFiles>0){let i=e.validation,r=i.ratio===null?"n/a":`${i.ratio}x`;console.log(` Validation: flagged files fix-density ${i.flaggedFixDensity} vs baseline ${i.baselineFixDensity} (${r})`)}}async function
|
|
784
|
-
Affected consumer files:`),N.list(e.affectedConsumers,t=>` ${t.file} (${t.consumedSymbols} symbol(s))`))}var
|
|
785
|
-
`),console.log("Or download manually:")):
|
|
803
|
+
No issues found. Codebase is clean.`)}function hu(e,t){return Math.abs(e-t)<.01?String(e):`${e} (${$j(t)} score-weighted)`}function $j(e){return Number.isInteger(e)?String(e):e.toFixed(2).replace(/0+$/,"").replace(/\.$/,"")}function jj(e){if(e.pressure.length!==0){console.log(`
|
|
804
|
+
Maintenance Pressure:`);for(let t of e.pressure)console.log(` ${t.category}: ${t.count} / ${t.threshold} threshold (${t.ratio}x, -${t.extraPenalty} ${t.kind})`)}}function Oj(e){let t=e.axes;if(console.log(`
|
|
805
|
+
Axes:`),console.log(` Deletable: ${t.deletable.loc} LOC across ${t.deletable.symbols} symbols`),t.changeAmplification){let i=t.changeAmplification;console.log(` Change amplification: ${i.medianFilesPerCommit} files/commit median, ${i.p90FilesPerCommit} p90 (${i.commitsAnalyzed} commits)`)}if(t.hiddenCoupling&&t.hiddenCoupling.pairCount>0){console.log(` Hidden coupling: ${t.hiddenCoupling.pairCount} co-changing pair(s) without a dependency edge`);for(let i of t.hiddenCoupling.top.slice(0,3))console.log(` ${i.fileA} <-> ${i.fileB} (${i.together}x together, ${Math.round(i.confidence*100)}%)`)}if(t.churnWeightedComplexity&&t.churnWeightedComplexity.length>0){let i=t.churnWeightedComplexity[0];i.weighted>0&&console.log(` Churn x complexity: hottest is ${i.symbol} (${i.changes} changes, weighted ${i.weighted})`)}let n=t.evidenceQuality;if(console.log(` Evidence quality: ${n.graphFindings} graph-fact finding(s), ${n.heuristicFindings} heuristic finding(s), ${n.userSuppressed} user-suppressed`),e.validation&&e.validation.flaggedFiles>0){let i=e.validation,r=i.ratio===null?"n/a":`${i.ratio}x`;console.log(` Validation: flagged files fix-density ${i.flaggedFixDensity} vs baseline ${i.baselineFixDensity} (${r})`)}}async function uy(e){let t=ut(r=>{let o=Tt(r,{base:e.base});return o.note?{kind:"complete",result:Ui(r,{base:e.base})}:o.changedFiles.length===0?{kind:"complete",result:Ui(r,{base:e.base})}:{kind:"batched",plan:o}});if(t.kind==="complete")return t.result;let n=ry(t.plan.changedFiles,Sj),i=await gu(n,Bj(n.length),r=>qj(r,e));return _s(t.plan.changedFiles,i)}var Bj=dy({envKey:"SCIP_QUERY_DIFF_IMPACT_CONCURRENCY",defaultMinimum:xj,defaultMaximum:Cj});function dy(e){return(t,n=process.env,i=yj)=>Hj(t,n,i,e)}function Hj(e,t,n,i){let r=t[i.envKey],o=Vj(n,i),s=r?parseInt(r,10):o;return!Number.isFinite(s)||s<1?Math.min(o,e):Math.min(s,e)}function Vj(e,t){let n=e(),i=Number.isFinite(n)?Math.max(t.defaultMinimum,n-1):0;return Math.min(t.defaultMaximum,Math.max(t.defaultMinimum,i))}function qj(e,t){let n=process.argv[1]??yu(import.meta.url),i=[];return t.base&&i.push("--base",t.base),ea({cliPath:n,command:ia,args:i,env:{...process.env,SCIP_QUERY_DIFF_IMPACT_FILES:JSON.stringify(e)},label:"Diff-impact batch"})}function my(e){console.log(`Changed files: ${e.summary.totalChangedFiles}`),console.log(`Changed symbols: ${e.summary.totalChangedSymbols}`),console.log(`Affected consumer files: ${e.summary.totalAffectedFiles}`),e.summary.note&&console.log(`Note: ${e.summary.note}`),console.log(""),e.changedSymbols.length>0&&(console.log("Changed symbols:"),N.list(e.changedSymbols,t=>` ${t.file} ${t.shortName} (fan-in: ${t.fanIn})`)),e.affectedConsumers.length>0&&(console.log(`
|
|
806
|
+
Affected consumer files:`),N.list(e.affectedConsumers,t=>` ${t.file} (${t.consumedSymbols} symbol(s))`))}var uo=fu,I=(e=>parseInt(e,10)),mo=(e=>{let t=parseInt(e,10);if(!Number.isFinite(t)||t<1)throw new Error(`Expected a positive integer, got ${e}`);return t}),xt=parseFloat,sa=parseInt;function h(e,t,n,...i){return i.length>0?{flags:e,description:t,parser:n,defaultValue:i[0]}:{flags:e,description:t,parser:n}}function bu(){return h("--json","Output as JSON for programmatic consumption")}function j(e=[]){return e.some(t=>t.flags==="--json")?e:[...e,bu()]}function E(e,t=[]){return{category:e,examples:t}}import{execFileSync as HH}from"child_process";import{existsSync as Co,mkdirSync as VH,readFileSync as qH,writeFileSync as Vb}from"fs";import{homedir as UH}from"os";import{dirname as zH,join as ar}from"path";import{execFileSync as E1}from"child_process";import{closeSync as N1,copyFileSync as F1,existsSync as ya,mkdirSync as Ou,mkdtempSync as T1,openSync as _1,readFileSync as ba,renameSync as go,rmSync as ho,writeFileSync as gb}from"fs";import{basename as ha,dirname as Ct,extname as A1,join as jt}from"path";import{execFileSync as py}from"child_process";import{existsSync as gy,readFileSync as Gj}from"fs";import{platform as po,arch as hy}from"os";import{dirname as fy,join as aa}from"path";import{fileURLToPath as Kj}from"url";import{execFileSync as Uj}from"child_process";import{platform as zj}from"os";var Wj=zj()==="win32";function $t(e){let t=Wj?"where":"which";try{return Uj(t,[e],{stdio:"pipe"}),!0}catch{return!1}}var yy="v0.8.1",Su="https://github.com/scip-code/scip",Jj={win32:{x64:aa("vendor","scip","win32-x64","scip.exe"),arm64:aa("vendor","scip","win32-arm64","scip.exe")}};function Xj(){let e=fy(Kj(import.meta.url));for(;;){let t=aa(e,"package.json");if(gy(t))try{if(JSON.parse(Gj(t,"utf-8")).name==="scip-query")return e}catch{}let n=fy(e);if(n===e)return null;e=n}}function by(){let e=Jj[po()]?.[hy()];if(!e)return null;let t=Xj();if(!t)return null;let n=aa(t,e);return gy(n)?n:null}function ca(){return $t("scip")?"scip":by()}function fo(){return ca()!==null}function Qj(){let e=po(),t=hy(),n,i,r;switch(e){case"darwin":n="darwin",r="tar.gz";break;case"linux":n="linux",r="tar.gz";break;default:return null}switch(t){case"arm64":i="arm64";break;case"x64":i="amd64";break;default:return null}let o=`scip-${n}-${i}.${r}`;return{url:`${Su}/releases/download/${yy}/${o}`,filename:o}}function xu(){let e=Qj();console.log("\nThe `scip` CLI is required but not found on PATH.\n"),po()==="darwin"?(console.log("Install via Homebrew:"),console.log(` brew install sourcegraph/scip/scip
|
|
807
|
+
`),console.log("Or download manually:")):po()==="win32"?(console.log("Windows installs should include a managed scip.exe in the scip-query package."),console.log("Reinstall scip-query, or build the managed binary from source with:"),console.log(` npm run build:scip-windows
|
|
786
808
|
`),console.log("Upstream release page:")):console.log("Download from:"),console.log(e?` ${e.url}
|
|
787
|
-
`:` ${
|
|
788
|
-
`),console.log("After installing, ensure `scip` is on your PATH and run `scip-query reindex`.")}function
|
|
789
|
-
VALUES (?, ?, NULL, ?)`),c=r.transaction(
|
|
790
|
-
`).filter(i=>i&&t.has(
|
|
791
|
-
`)){if(!i)continue;let r=
|
|
792
|
-
`)
|
|
793
|
-
`)
|
|
809
|
+
`:` ${Su}/releases/tag/${yy}
|
|
810
|
+
`),console.log("After installing, ensure `scip` is on your PATH and run `scip-query reindex`.")}function Sy(e){let t=by();if(t)return e(`Using bundled scip CLI at ${t}`),!0;if(po()==="darwin"&&$t("brew")){e("Installing scip CLI via Homebrew...");try{if(py("brew",["install","sourcegraph/scip/scip"],{stdio:"inherit",timeout:3e5,env:process.env}),$t("scip"))return e("Successfully installed scip CLI via Homebrew"),!0}catch(n){let i=n instanceof Error?n.message:String(n);e(`Homebrew install failed: ${i}`)}}if($t("go")){e("Installing scip CLI via go install...");try{if(py("go",["install","github.com/sourcegraph/scip/cmd/scip@latest"],{stdio:"inherit",timeout:3e5,env:process.env}),$t("scip"))return e("Successfully installed scip CLI via go install"),!0}catch(n){let i=n instanceof Error?n.message:String(n);e(`go install failed: ${i}`)}}return e("Could not auto-install scip CLI."),e(`Install manually from: ${Su}/releases`),!1}import Yj from"better-sqlite3";import{execFileSync as Zj}from"child_process";import{existsSync as eO,readdirSync as tO,readFileSync as nO}from"fs";import{extname as la,join as xy}from"path";function nr(e={}){return{id:"auxiliary-documents",facts:["auxiliary-document"],run:t=>ua({projectRoot:t.projectRoot,dbPath:t.dbPath,extensions:e.extensions,onStatus:t.onStatus})}}function ua(e){let t=new Set((e.extensions??Wd).map(o=>o.toLowerCase()));if(t.size===0)return{scanned:0,inserted:0,existing:0};if(!eO(e.dbPath))throw new Error(`SCIP SQLite database not found at ${e.dbPath}`);let n=Cn(e.projectRoot),i=iO(e.projectRoot,t).filter(o=>!n.isIgnored(o)),r=new Yj(e.dbPath);try{let o=oO(r,i),s=r.prepare(`INSERT OR IGNORE INTO documents (language, relative_path, position_encoding, text)
|
|
811
|
+
VALUES (?, ?, NULL, ?)`),c=r.transaction(d=>{let u=0;for(let m of d){if(o.has(m))continue;let p=nO(xy(e.projectRoot,m),"utf-8"),f=s.run(sO(m),m,p);u+=Number(f.changes)}return u})(i),l={scanned:i.length,inserted:c,existing:i.length-c};return e.onStatus?.(`Augmented SQLite documents with ${c} auxiliary source file${c===1?"":"s"} (${l.existing} already present).`),l}finally{r.close()}}function iO(e,t){let n=rO(e,t);if(n)return n;let i=[],r=o=>{let s=o?xy(e,o):e,a;try{a=tO(s,{withFileTypes:!0})}catch{return}for(let c of a){if(Mo.has(c.name))continue;let l=o?`${o}/${c.name}`:c.name;if(c.isDirectory()){r(l);continue}t.has(la(c.name).toLowerCase())&&i.push(l)}};return r(""),i.sort()}function rO(e,t){try{return Zj("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}).split(`
|
|
812
|
+
`).filter(i=>i&&t.has(la(i).toLowerCase())).sort()}catch{return null}}function oO(e,t){let n=new Set,i=500;for(let r=0;r<t.length;r+=i){let o=t.slice(r,r+i),s=e.prepare(`SELECT relative_path FROM documents WHERE relative_path IN (${o.map(()=>"?").join(",")})`).all(...o);for(let a of s)n.add(a.relative_path)}return n}function sO(e){return la(e).toLowerCase()===".vue"?"vue":la(e).replace(/^\./,"").toLowerCase()||"source"}import{execFileSync as aO}from"child_process";import{existsSync as cO,readdirSync as vy}from"fs";import{extname as Ry,join as ky}from"path";var lO=new Set([".git",".hg",".svn",".idea",".vscode","node_modules","vendor","dist","build","target","bin","obj",".dart_tool",".gradle",".next",".venv","venv","__pycache__"]),uO=[{language:"typescript",files:["tsconfig.json","tsconfig.base.json"],extensions:[".ts",".tsx",".mts",".cts"]},{language:"rust",files:["Cargo.toml"],extensions:[".rs"]},{language:"go",files:["go.mod"],extensions:[".go"]},{language:"java",files:["pom.xml","build.gradle","build.gradle.kts"],extensions:[".java"]},{language:"kotlin",files:["build.gradle.kts"],extensions:[".kt",".kts"]},{language:"scala",files:["build.sbt"],extensions:[".scala"]},{language:"clojure",files:["deps.edn","project.clj","bb.edn","shadow-cljs.edn"],extensions:[".clj",".cljs",".cljc"]},{language:"python",files:["pyproject.toml","setup.py","setup.cfg","Pipfile"],extensions:[".py",".pyi"]},{language:"ruby",files:["Gemfile"],extensions:[".rb"]},{language:"cpp",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"]},{language:"c",files:["compile_commands.json","CMakeLists.txt","Makefile"],extensions:[".c",".h"]},{language:"csharp",globs:["*.csproj","*.sln"],extensions:[".cs"]},{language:"vb",globs:["*.vbproj"],extensions:[".vb"]},{language:"dart",files:["pubspec.yaml"],extensions:[".dart"]},{language:"php",files:["composer.json"],extensions:[".php"]},{language:"javascript",files:["package.json"],extensions:[".js",".jsx",".mjs",".cjs"]}];function tn(e){let t=[],n=dO(e),i=gO(e);for(let r of uO){if(mO(e,r.files)){t.push(r.language);continue}if(pO(n,r.globs)){t.push(r.language);continue}yO(i,r.extensions)&&t.push(r.language)}return t.includes("typescript")&&Cy(t,"javascript"),t.includes("cpp")&&!i.has(".c")&&Cy(t,"c"),t}function dO(e){try{return vy(e)}catch{return[]}}function mO(e,t){return t?.length?t.some(n=>cO(ky(e,n))):!1}function pO(e,t){return t?.length?e.some(n=>t.some(i=>fO(n,i))):!1}function fO(e,t){if(t==="*")return!0;if(!t.includes("*"))return e===t;let[n,i]=t.split("*");return e.startsWith(n??"")&&e.endsWith(i??"")}function gO(e){let t=hO(e);if(t)return t;let n=new Set,i=[e];for(;i.length>0;){let r=i.pop();if(!r)continue;let o;try{o=vy(r,{withFileTypes:!0})}catch{continue}for(let s of o){if(s.name.startsWith(".")&&!s.name.endsWith("proj")&&!s.name.endsWith("sln")&&s.isDirectory())continue;let a=ky(r,s.name);if(s.isDirectory()){lO.has(s.name)||i.push(a);continue}let c=Ry(s.name).toLowerCase();c&&n.add(c)}}return n}function hO(e){try{let t=aO("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}),n=new Set;for(let i of t.split(`
|
|
813
|
+
`)){if(!i)continue;let r=Ry(i).toLowerCase();r&&n.add(r)}return n}catch{return null}}function yO(e,t){return t?.length?t.some(n=>e.has(n)):!1}function Cy(e,t){let n=e.indexOf(t);n!==-1&&e.splice(n,1)}import{existsSync as wy,readdirSync as bO}from"fs";import{isAbsolute as SO,join as Cu,resolve as xO}from"path";var CO={typescript:{language:"typescript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,pnpmWorkspaces:t,indexerBinary:n,projectPath:i})=>{let r=i?["index","--output",e,"--no-progress-bar",i]:["index","--infer-tsconfig","--output",e,"--no-progress-bar"];return t&&!i&&r.splice(1,0,"--pnpm-workspaces"),{binary:n,args:r}},markerFiles:["tsconfig.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},javascript:{language:"javascript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,indexerBinary:t})=>({binary:t,args:["index","--infer-tsconfig","--output",e,"--no-progress-bar"]}),markerFiles:["package.json"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","@sourcegraph/scip-typescript"]}],installUrl:"https://github.com/sourcegraph/scip-typescript",bundledNpmPackage:"@sourcegraph/scip-typescript"},java:{language:"java",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["pom.xml","build.gradle"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},scala:{language:"scala",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.sbt"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},kotlin:{language:"kotlin",indexerBinary:"scip-java",checkCommand:"scip-java --version",indexArgs:({outputPath:e})=>({binary:"scip-java",args:["index","--output",e]}),markerFiles:["build.gradle.kts"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-java/releases"},rust:{language:"rust",indexerBinary:"rust-analyzer",checkCommand:"rust-analyzer --version",indexArgs:({outputPath:e})=>({binary:"rust-analyzer",args:["scip",".","--output",e]}),markerFiles:["Cargo.toml"],installMethods:[{label:"rustup",prerequisite:"rustup",binary:"rustup",args:["component","add","rust-analyzer"]}],installUrl:"https://github.com/rust-lang/rust-analyzer"},python:{language:"python",indexerBinary:"scip-python-plus",binaryAliases:["scip-python"],checkCommand:"scip-python-plus --version",indexArgs:({outputPath:e,indexerBinary:t})=>({binary:t,args:["index","--output",e,"--project-name","project"]}),markerFiles:["pyproject.toml","setup.py"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","scip-python-plus"]}],installUrl:"https://github.com/PlunderStruck/scip-python",bundledNpmPackage:"scip-python-plus"},clojure:{language:"clojure",indexerBinary:"scip-clojure",projectLocalBinaries:["node_modules/.bin/scip-clojure"],checkCommand:"scip-clojure -h",indexArgs:({projectRoot:e,outputPath:t,indexerBinary:n,configPath:i})=>{let r=["-root",e,"-output",t];return i&&r.push("-config",SO(i)?i:xO(e,i)),{binary:n,args:r}},markerFiles:["deps.edn","project.clj","bb.edn","shadow-cljs.edn"],installMethods:[{label:"npm",prerequisite:"npm",binary:"npm",args:["install","-g","scip-clojure"]}],installUrl:"https://github.com/PlunderStruck/scip-clojure"},ruby:{language:"ruby",indexerBinary:"scip-ruby",checkCommand:"scip-ruby --version",indexArgs:({indexerBinary:e})=>({binary:e,args:["--dir","."]}),defaultOutputPath:"index.scip",markerFiles:["Gemfile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-ruby/releases"},go:{language:"go",indexerBinary:"scip-go",checkCommand:"scip-go --version",indexArgs:({outputPath:e})=>({binary:"scip-go",args:["--output",e]}),markerFiles:["go.mod"],installMethods:[{label:"go install",prerequisite:"go",binary:"go",args:["install","github.com/sourcegraph/scip-go@latest"]}],installUrl:"https://github.com/sourcegraph/scip-go"},cpp:{language:"cpp",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},c:{language:"c",indexerBinary:"scip-clang",checkCommand:"scip-clang --version",indexArgs:({outputPath:e})=>({binary:"scip-clang",args:["--compdb-path","compile_commands.json","--index-output-path",e]}),markerFiles:["CMakeLists.txt","Makefile"],installMethods:[],installUrl:"https://github.com/sourcegraph/scip-clang/releases"},csharp:{language:"csharp",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:t})=>({binary:"scip-dotnet",args:["index",Py(e,[".sln",".csproj"])??e,"--output",t,"--working-directory",e]}),markerFiles:["*.csproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},vb:{language:"vb",indexerBinary:"scip-dotnet",checkCommand:"scip-dotnet --version",indexArgs:({projectRoot:e,outputPath:t})=>({binary:"scip-dotnet",args:["index",Py(e,[".sln",".vbproj"])??e,"--output",t,"--working-directory",e]}),markerFiles:["*.vbproj","*.sln"],installMethods:[{label:"dotnet",prerequisite:"dotnet",binary:"dotnet",args:["tool","install","--global","scip-dotnet"]}],installUrl:"https://github.com/sourcegraph/scip-dotnet/releases"},dart:{language:"dart",indexerBinary:"scip-dart",checkCommand:"scip-dart --version",indexArgs:({indexerBinary:e,outputPath:t})=>({binary:e,args:["--output",t]}),markerFiles:["pubspec.yaml"],installMethods:[{label:"dart pub",prerequisite:"dart",binary:"dart",args:["pub","global","activate","scip_dart"]}],installUrl:"https://github.com/Workiva/scip-dart/releases"},php:{language:"php",indexerBinary:"scip-php",projectLocalBinaries:["vendor/davidrjenni/scip-php/bin/scip-php","vendor/bin/scip-php"],checkCommand:"scip-php --version",indexArgs:({projectRoot:e,indexerBinary:t})=>{let n=Cu(e,"vendor","bin","scip-php"),i=Cu(e,"vendor","davidrjenni","scip-php","bin","scip-php");return{binary:"php",args:["-d","error_reporting=E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED",wy(i)?i:wy(n)?n:t]}},defaultOutputPath:"index.scip",markerFiles:["composer.json"],installMethods:[],installUrl:"https://github.com/davidrjenni/scip-php/releases"}};function li(e){return CO[e]}function Py(e,t){let n;try{n=bO(e)}catch{return null}for(let i of t)for(let r of n)if(r.endsWith(i))return Cu(e,r);return null}import{readFileSync as vO,writeFileSync as RO}from"fs";import{create as vu}from"@bufbuild/protobuf";import{deserializeSCIP as kO,serializeSCIP as wO,DocumentSchema as PO,IndexSchema as IO,SymbolInformationSchema as LO}from"@c4312/scip";function DO(e){if(e.length===0)throw new Error("Cannot merge zero SCIP indexes");if(e.length===1)return e[0];let t=EO(e),n=NO(e.flatMap(r=>r.documents??[])),i=Iy(e.flatMap(r=>r.externalSymbols??[]));return vu(IO,{metadata:t,documents:n,externalSymbols:i})}function Ru(e,t){if(e.length===0)throw new Error("Cannot merge zero SCIP files");let n=e.map(r=>kO(vO(r))),i=DO(n);return RO(t,Buffer.from(wO(i))),{documentCount:i.documents.length,externalSymbolCount:i.externalSymbols.length,inputCount:e.length}}function EO(e){let t=e[0]?.metadata;if(!t)return;let n=t.projectRoot;for(let i of e.slice(1)){let r=i.metadata?.projectRoot;if(n&&r&&r!==n)throw new Error(`Cannot merge SCIP indexes with different project roots: ${n} vs ${r}`)}return t}function NO(e){let t=new Map;for(let n of e){let i=t.get(n.relativePath);if(!i){t.set(n.relativePath,n);continue}t.set(n.relativePath,vu(PO,{language:i.language||n.language,relativePath:i.relativePath||n.relativePath,occurrences:FO([...i.occurrences,...n.occurrences]),symbols:Iy([...i.symbols,...n.symbols]),text:_O(i.text,n.text),positionEncoding:i.positionEncoding||n.positionEncoding}))}return[...t.values()]}function FO(e){let t=new Set,n=[];for(let i of e){let r=JSON.stringify(i);t.has(r)||(t.add(r),n.push(i))}return n}function Iy(e){let t=new Map;for(let n of e){let i=t.get(n.symbol);if(!i){t.set(n.symbol,n);continue}t.set(n.symbol,vu(LO,{symbol:i.symbol,documentation:AO([...i.documentation,...n.documentation]),relationships:TO([...i.relationships,...n.relationships]),kind:i.kind||n.kind,displayName:i.displayName||n.displayName,enclosingSymbol:i.enclosingSymbol||n.enclosingSymbol,signatureDocumentation:i.signatureDocumentation??n.signatureDocumentation}))}return[...t.values()]}function TO(e){let t=new Set,n=[];for(let i of e){let r=[i.symbol,i.isReference?"1":"0",i.isImplementation?"1":"0",i.isTypeDefinition?"1":"0",i.isDefinition?"1":"0"].join("|");t.has(r)||(t.add(r),n.push(i))}return n}function _O(e,t){return e?t?e.length>=t.length?e:t:e:t}function AO(e){return[...new Set(e)]}import{readFileSync as MO,writeFileSync as $O}from"fs";function ir(e,t){let n=Date.now(),i=e.run(t);return{stageId:e.id,facts:e.facts,durationMs:Date.now()-n,result:i}}function Dy(e){let t=e.readFingerprint(),n=jO(e.cachePath,t);if(n)return e.onCacheHit?.(n.result),n.result;let i=e.compute();return OO(e.cachePath,e.readFingerprint(),i),i}function jO(e,t){try{let n=JSON.parse(MO(e,"utf-8"));return Ly(n.fingerprint)===Ly(t)?{result:n.result}:null}catch{return null}}function OO(e,t,n){$O(e,`${JSON.stringify({updatedAt:new Date().toISOString(),fingerprint:t,result:n},null,2)}
|
|
814
|
+
`)}function Ly(e){return JSON.stringify(e)}import{execFileSync as BO}from"child_process";import{createHash as HO}from"crypto";import{readdirSync as VO,readFileSync as qO}from"fs";import{join as Ny}from"path";function Ey(e){return(zO(e)??WO(e)).filter(t=>t&&!Fy(t)).sort()}function ui(e,t={}){return(t.language?Ey(e).filter(i=>UO(i,t.language,t.markerFiles)):Ey(e)).map(i=>{let r=Ny(e,i);try{let o=qO(r);return{path:i,size:o.byteLength,hash:HO("sha256").update(o).digest("hex")}}catch{return{path:i,size:-1,hash:"unreadable"}}})}function UO(e,t,n){let i=e.split("/").at(-1)??e;if(n?.includes(e)||n?.includes(i)||KO.has(i))return!0;let r=e.includes(".")?`.${e.split(".").at(-1).toLowerCase()}`:"";return(JO[t]??[]).includes(r)}function zO(e){try{return BO("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
|
|
815
|
+
`).filter(Boolean)}catch{return null}}function WO(e){let t=[],n=[""];for(;n.length>0;){let i=n.pop(),r=i?Ny(e,i):e,o;try{o=VO(r,{withFileTypes:!0})}catch{continue}for(let s of o){let a=i?`${i}/${s.name}`:s.name;if(s.isDirectory()){Fy(a)||n.push(a);continue}t.push(a)}}return t}function Fy(e){let t=e.split("/");return e==="meta.json"||t.some(n=>GO.has(n))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var GO=new Set([".git","node_modules",".scipquery-cache",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]),KO=new Set(["package.json","package-lock.json","pnpm-lock.yaml","yarn.lock","bun.lockb","tsconfig.json","tsconfig.base.json","pyproject.toml","setup.py","setup.cfg","Cargo.toml","Cargo.lock","go.mod","go.sum","pom.xml","build.gradle","build.gradle.kts","build.sbt","compile_commands.json","CMakeLists.txt","Makefile","Gemfile","Gemfile.lock","composer.json","composer.lock","pubspec.yaml","pubspec.lock","deps.edn","project.clj","bb.edn","shadow-cljs.edn"]),JO={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".mjs",".cjs"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cc",".cpp",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"],clojure:[".clj",".cljs",".cljc"]};import{readFileSync as XO,writeFileSync as QO}from"fs";import{create as Ty}from"@bufbuild/protobuf";import{deserializeSCIP as YO,DocumentSchema as ZO,IndexSchema as eB,serializeSCIP as tB,SymbolRole as nB}from"@c4312/scip";function _y(e){let t;try{t=YO(XO(e))}catch{return{removedDefinitionOccurrences:0,touchedDocuments:0}}let n=iB(t);return n.removedDefinitionOccurrences>0&&QO(e,Buffer.from(tB(n.index))),{removedDefinitionOccurrences:n.removedDefinitionOccurrences,touchedDocuments:n.touchedDocuments}}function iB(e){let t=new Set;for(let o of e.documents)for(let s of o.symbols)s.symbol&&t.add(s.symbol);for(let o of e.externalSymbols)o.symbol&&t.add(o.symbol);let n=0,i=0,r=[];for(let o of e.documents){let s=o.occurrences.filter(a=>(a.symbolRoles&nB.Definition)===0||t.has(a.symbol)?!0:(n+=1,!1));if(s.length===o.occurrences.length){r.push(o);continue}i+=1,r.push(Ty(ZO,{language:o.language,relativePath:o.relativePath,occurrences:s,symbols:o.symbols,text:o.text,positionEncoding:o.positionEncoding}))}return{index:n===0?e:Ty(eB,{metadata:e.metadata,documents:r,externalSymbols:e.externalSymbols}),removedDefinitionOccurrences:n,touchedDocuments:i}}import{existsSync as rB,readFileSync as oB,readdirSync as sB,statSync as aB}from"fs";import Re from"path";var cB=new Set([".cache",".git",".next",".nuxt",".turbo",".nx","build","coverage","dist","node_modules","tmp","vendor"]);function Ay(e,t=[]){let n=Re.resolve(e),i=lB(n),r=t.flatMap(c=>uB(n,c)),o=mB([...i,...r]),s=pB(n,o)?[n,...o]:o,a=s.length>0?s:[n];return[...new Set(a.map(c=>gB(n,c)))].sort((c,l)=>c.localeCompare(l))}function lB(e){let t=[],n=[e];for(;n.length>0;){let i=n.pop(),r;try{r=sB(i,{withFileTypes:!0})}catch{continue}for(let o of r){let s=Re.join(i,o.name);if(o.isDirectory()){!cB.has(o.name)&&!o.name.startsWith(".")&&n.push(s);continue}o.isFile()&&dB(s)&&t.push(Re.dirname(s))}}return t}function uB(e,t){let n=t.trim();if(!n)return[];let i=Re.resolve(e,n);if(!yB(e,i))return[];try{let r=aB(i);if(r.isDirectory())return[i];if(r.isFile()&&My(Re.basename(i)))return[Re.dirname(i)]}catch{return[]}return[]}function dB(e){if(!My(Re.basename(e)))return!1;let t=$y(e);return t?Re.basename(e)==="tsconfig.json"||"include"in t||"files"in t||"references"in t:!1}function My(e){return e.startsWith("tsconfig")&&e.endsWith(".json")}function mB(e){let t=[...new Set(e.map(n=>Re.resolve(n)))].sort((n,i)=>n.localeCompare(i));return t.length<=1?t:t.filter(n=>!t.some(i=>i!==n&&hB(n,i)))}function pB(e,t){if(t.length===0||t.some(i=>Re.resolve(i)===e))return!1;let n=Re.join(e,"tsconfig.json");return rB(n)&&fB(n)}function fB(e){let n=$y(e)?.include;return Array.isArray(n)?n.some(i=>typeof i=="string"&&i.trim()!==""&&!i.startsWith("!")&&(i.includes("/")||i.includes("**")||!Re.extname(i))):!1}function $y(e){try{let t=JSON.parse(oB(e,"utf-8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}function gB(e,t){let n=Re.relative(e,t);return n?n.split(Re.sep).join("/"):"."}function hB(e,t){let n=Re.relative(e,t);return!!n&&!n.startsWith("..")&&!Re.isAbsolute(n)}function yB(e,t){let n=Re.relative(e,t);return!n.startsWith("..")&&!Re.isAbsolute(n)}import{execFile as bB}from"child_process";import{existsSync as da,renameSync as wu,rmSync as Pu}from"fs";import{cpus as SB}from"os";import{join as jy}from"path";function xB(e,t,n){if(!e.defaultOutputPath)return;let i=jy(t,e.defaultOutputPath);n!==i&&da(i)&&wu(i,n)}function CB(e,t,n){if(!e.defaultOutputPath)return null;let i=jy(t,e.defaultOutputPath);if(i===n)return null;let r=`${n}.default-output-backup`;return Pu(r,{force:!0}),da(i)?(wu(i,r),{defaultOutputPath:i,backupPath:r}):{defaultOutputPath:i,backupPath:null}}function vB(e){e&&(Pu(e.defaultOutputPath,{force:!0}),e.backupPath&&da(e.backupPath)&&wu(e.backupPath,e.defaultOutputPath))}function RB(e,t){if(e<=1)return 1;let n=Number(process.env.SCIP_QUERY_INDEXER_CONCURRENCY??0),i=Number.isFinite(t)&&t&&t>0?t:Number.isFinite(n)&&n>0?n:Math.min(8,Math.max(1,SB().length));return Math.max(1,Math.min(e,Math.floor(i)))}async function Oy(e,t,n,i){let r=e.filter(l=>l.config.defaultOutputPath),o=e.filter(l=>!l.config.defaultOutputPath),s=[],a=RB(o.length,i),c=await wB(o,a,l=>ku(l,t,n));if(a>1){let l=new Map;for(let d of c.filter(u=>u.skipped)){let u=o.find(m=>m.id===d.id);u&&(n(`Retrying ${u.label} indexer serially after parallel failure...`),l.set(u.id,await ku(u,t,n)))}s.push(...c.map(d=>l.get(d.id)??d))}else s.push(...c);for(let l of r)s.push(await ku(l,t,n));return s.sort((l,d)=>e.findIndex(u=>u.id===l.id)-e.findIndex(u=>u.id===d.id))}async function ku(e,t,n){n(`Indexing ${e.label} with ${e.resolvedBinary}...`),Pu(e.scipPath,{force:!0});let i=CB(e.config,t,e.scipPath);try{await kB(e.binary,e.args,{cwd:t,env:e.env,maxBuffer:50*1024*1024}),xB(e.config,t,e.scipPath)}catch(r){let o=r instanceof Error?r.message:String(r),s=`${e.resolvedBinary} indexer failed: ${o.split(`
|
|
816
|
+
`)[0]}`,a=e.label===e.language?s:`${e.label}: ${s}`;return n(`Skipping ${e.label}: ${s}`),{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,skipped:{language:e.language,reason:a}}}finally{vB(i)}if(!da(e.scipPath)){let r=`${e.resolvedBinary} indexer completed but did not produce ${e.scipPath}`,o=e.label===e.language?r:`${e.label}: ${r}`;return n(`Skipping ${e.label}: ${r}`),{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,skipped:{language:e.language,reason:o}}}return{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath}}function kB(e,t,n){return new Promise((i,r)=>{bB(e,[...t],n,o=>{o?r(o):i()})})}async function wB(e,t,n){if(e.length===0)return[];let i=new Array(e.length),r=0,o=Math.max(1,Math.min(e.length,t)),s=Array.from({length:o},async()=>{for(;r<e.length;){let a=r++;i[a]=await n(e[a])}});return await Promise.all(s),i}import{execFileSync as Lu}from"child_process";import{existsSync as Iu,readFileSync as PB}from"fs";import{createRequire as IB}from"module";import{platform as LB}from"os";import{dirname as By,join as ma}from"path";var DB=IB(import.meta.url);function Du(e){return[e.indexerBinary,...e.binaryAliases??[]]}function pa(e){let t=Du(e);return t.length===1?t[0]:t.join(" or ")}function rr(e){for(let t of Du(e))if($t(t))return t;return NB(e)}function Hy(e){return rr(e)!==null||EB(e)}function EB(e){return Vy(e)!==null}function NB(e){let t=Vy(e);if(!t)return null;let i=JSON.parse(PB(t,"utf8")).bin;if(!i)return null;if(typeof i=="string")return ma(By(t),i);for(let r of Du(e)){let o=i[r];if(o)return ma(By(t),o)}return null}function Vy(e){if(!e.bundledNpmPackage)return null;try{return DB.resolve(`${e.bundledNpmPackage}/package.json`)}catch{return null}}function Eu(e,t){for(let n of e.projectLocalBinaries??[]){let i=ma(t,n);if(Iu(i))return i}return null}function FB(e,t){return Eu(e,t)??rr(e)}function qy(e,t=process.env,n=e.indexerBinary){if(e.indexerBinary!=="scip-dotnet"||Nu(n,t))return t;let i=Uy(n,t);return i?{...t,DOTNET_ROOT:i}:t}function fa(e,t){let n=pa(e),i=t?FB(e,t):rr(e);if(!i)return{language:e.language,binaryLabel:n,installed:!1,runnable:!1,resolvedBinary:null,installUrl:e.installUrl};if(e.indexerBinary!=="scip-dotnet")return{language:e.language,binaryLabel:n,installed:!0,runnable:!0,resolvedBinary:i};let r=TB(i);return{language:e.language,binaryLabel:n,installed:!0,runnable:r.runnable,resolvedBinary:i,installUrl:e.installUrl,note:r.note}}function ga(e,t){let n=e.installMethods,i=pa(e);if(!n?.length)return t(`No auto-install method available for ${i}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1;for(let r of n)if($t(r.prerequisite)){t(`Installing ${i} via ${r.label}...`);try{Lu(r.binary,r.args,{stdio:"inherit",timeout:3e5,env:process.env});let o=rr(e);if(o){let s=o===e.indexerBinary?"":` (using ${o})`;return t(`Successfully installed ${i} via ${r.label}${s}`),!0}t(`${r.label} command completed but ${i} was not found on PATH`)}catch(o){let s=o instanceof Error?o.message:String(o);t(`${r.label} install failed: ${s}`)}}return t(`Could not auto-install ${i}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1}function TB(e){if(Nu(e,process.env))return{runnable:!0};let t=Uy(e,process.env);if(t)return{runnable:!0,note:`using .NET 9 runtime from ${t}`};let n=zy(process.env);return{runnable:!1,note:n.length>0?`.NET 9 runtime still unavailable after checking ${n.join(", ")}`:"binary is present, but scip-dotnet still needs a .NET 9 runtime"}}function Uy(e,t){for(let n of zy(t))if(Nu(e,{...t,DOTNET_ROOT:n}))return n;return null}function zy(e){let t=[],n=e.DOTNET_ROOT;if(n&&Iu(n)&&t.push(n),LB()==="darwin"&&$t("brew"))try{let i=Lu("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:e}).toString().trim(),r=ma(i,"libexec");Iu(r)&&!t.includes(r)&&t.push(r)}catch{}return t}function Nu(e,t){try{return Lu(e,["--version"],{stdio:"pipe",env:t}),!0}catch{return!1}}import p1 from"better-sqlite3";import{existsSync as f1}from"fs";import{dirname as g1,join as h1,resolve as y1}from"path";import{readFileSync as _B,rmSync as AB,statSync as MB,mkdtempSync as $B}from"fs";import{cpus as jB,tmpdir as OB}from"os";import{join as Fu}from"path";import{Worker as BB}from"worker_threads";function Wy(e){return e.length>=8&&Ky(e.length)>1}function Gy(e){let t=Ky(e.vueFiles.length),n=VB(e.vueFiles),i=UB(n,t),r=new URL("./augment-vue-worker.js",import.meta.url),o=$B(Fu(OB(),"scip-query-vue-workers-")),s=new SharedArrayBuffer(4),a=new Int32Array(s),c=HB(),l=Date.now();try{for(let u=0;u<i.length;u++)new BB(r,{workerData:{projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,tasks:i[u],resultPath:Fu(o,`${u}.json`),sharedBuffer:s}});for(;Atomics.load(a,0)<i.length;){if(Date.now()-l>c)throw new Error(`Vue reference workers timed out after ${(c/1e3).toFixed(0)}s`);Atomics.wait(a,0,Atomics.load(a,0),100)}let d=i.map((u,m)=>{let p=JSON.parse(_B(Fu(o,`${m}.json`),"utf-8"));if(!p.ok)throw new Error(`Vue reference worker failed: ${p.error}`);return p.result});return{occurrences:d.flatMap(u=>u.occurrences),skippedReferences:d.reduce((u,m)=>u+m.skippedReferences,0)}}finally{AB(o,{recursive:!0,force:!0})}}function Ky(e){let t=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKERS??0),n=Number.isFinite(t)&&t>0?t:Math.min(8,Math.max(1,jB().length-1));return Math.max(1,Math.min(e,n))}function HB(){let e=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKER_TIMEOUT_MS??0);return Number.isFinite(e)&&e>0?e:3e5}function VB(e){let t=qB(),n=[];for(let i of e){let r=Jy(i),o=Math.max(1,Math.ceil(r/t));for(let s=0;s<o;s++)n.push({fileName:i,startOffset:Math.floor(r*s/o),endOffset:s===o-1?Number.POSITIVE_INFINITY:Math.floor(r*(s+1)/o),countFileSkip:s===0})}return n}function qB(){return Number.POSITIVE_INFINITY}function UB(e,t){let n=Array.from({length:t},()=>({tasks:[],weight:0})),i=e.map(r=>({task:r,weight:zB(r)})).sort((r,o)=>o.weight-r.weight);for(let r of i){let o=n.reduce((s,a)=>a.weight<s.weight?a:s);o.tasks.push(r.task),o.weight+=r.weight}return n.map(r=>r.tasks).filter(r=>r.length>0)}function zB(e){return Number.isFinite(e.endOffset)?Math.max(1,e.endOffset-e.startOffset):Math.max(1,Jy(e.fileName)-e.startOffset)}function Jy(e){try{return MB(e).size}catch{return 1}}import{createRequire as WB}from"module";import{existsSync as GB,readFileSync as _u}from"fs";import{dirname as Xy,extname as KB,join as Qy,relative as JB,resolve as XB}from"path";import{pathToFileURL as QB}from"url";function YB(e){e.transaction(()=>{e.prepare(`
|
|
794
817
|
DELETE FROM mentions
|
|
795
818
|
WHERE chunk_id IN (
|
|
796
819
|
SELECT c.id
|
|
@@ -805,12 +828,12 @@ Affected consumer files:`),N.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
805
828
|
FROM documents
|
|
806
829
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
807
830
|
)
|
|
808
|
-
`).run()})()}function
|
|
831
|
+
`).run()})()}function Yy(e,t){return e.prepare(`
|
|
809
832
|
SELECT relative_path AS relativePath
|
|
810
833
|
FROM documents
|
|
811
834
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
812
835
|
ORDER BY relative_path
|
|
813
|
-
`).all().map(i=>
|
|
836
|
+
`).all().map(i=>XB(t,i.relativePath))}function Zy(e,t){let{vueCore:n,ts:i,volarTs:r}=ZB(e),{parsed:o,vueOptions:s}=e1(n,i,t),a=Xy(t),c=n.createVueLanguagePlugin(i,o.options,s,p=>p),l=t1(n,i,c),d=n1(a,o),{languageServiceHost:u}=r.createLanguageServiceHost(i,i.sys,l,p=>p,d),m=i.createLanguageService(u);return{ts:i,language:l,languageService:m,fileNames:o.fileNames,configDir:a}}function ZB(e){let t=WB(QB(Qy(e,"package.json")).href);return{vueCore:Tu(t,"@vue/language-core",e),ts:Tu(t,"typescript",e),volarTs:Tu(t,"@volar/typescript",e)}}function e1(e,t,n){let i=t.readConfigFile(n,t.sys.readFile);if(i.error||!i.config)throw new Error(`Failed to read ${n}`);let o=e.createParsedCommandLine(t,t.sys,n).vueOptions;return typeof e.createGlobalTypesWriter=="function"&&(o.globalTypesPath=e.createGlobalTypesWriter(o,t.sys.writeFile)),{parsed:t.parseJsonConfigFileContent(i.config,t.sys,Xy(n),void 0,n,void 0,e.getAllExtensions(o).map(s=>({extension:s.slice(1),isMixedContent:!0,scriptKind:t.ScriptKind.Deferred}))),vueOptions:o}}function t1(e,t,n){let i={},r=e.createLanguage([n],new Map,o=>{if(!GB(o))return;let s=_u(o,"utf-8");i.current?.scripts.set(o,t.ScriptSnapshot.fromString(s),n.getLanguageId(o)??c1(o))});return i.current=r,r}function n1(e,t){return{getCurrentDirectory:()=>e,getCompilationSettings:()=>t.options,getScriptFileNames:()=>t.fileNames,getProjectReferences:()=>t.projectReferences,getProjectVersion:()=>"0"}}function Tu(e,t,n){try{return e(t)}catch(i){throw(typeof i=="object"&&i!==null&&"code"in i?i.code:null)==="MODULE_NOT_FOUND"?new Error(`Vue augmentation requires ${t} to be installed in ${n}. Install Vue/Volar dependencies for that project, then rerun augment-vue.`,{cause:i}):i}}function eb(e,t,n){let i=i1(e);return r=>{let o=di(t,r.fileName),s=n.get(r.fileName);if(!s)return null;let a=n.positionAt(s,r.textSpan.start),c=i.get(o);if(!c)return null;let l=c.containingByLine.get(a.line);return l!==void 0?l:r1(c.starts,a.line,2)}}function i1(e){let t=e.prepare(`
|
|
814
837
|
SELECT
|
|
815
838
|
d.relative_path AS relativePath,
|
|
816
839
|
der.start_line AS startLine,
|
|
@@ -819,23 +842,22 @@ Affected consumer files:`),N.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
819
842
|
FROM defn_enclosing_ranges der
|
|
820
843
|
JOIN documents d ON d.id = der.document_id
|
|
821
844
|
ORDER BY d.relative_path, (der.end_line - der.start_line) DESC
|
|
822
|
-
`).all(),n=new Map;for(let i of t){let r=n.get(i.relativePath);r||(r={containingByLine:new Map,starts:[]},n.set(i.relativePath,r)),r.starts.push({line:i.startLine,symbolId:i.symbolId});for(let o=i.startLine;o<=i.endLine;o++)r.containingByLine.set(o,i.symbolId)}for(let i of n.values())i.starts.sort((r,o)=>r.line-o.line);return n}function
|
|
845
|
+
`).all(),n=new Map;for(let i of t){let r=n.get(i.relativePath);r||(r={containingByLine:new Map,starts:[]},n.set(i.relativePath,r)),r.starts.push({line:i.startLine,symbolId:i.symbolId});for(let o=i.startLine;o<=i.endLine;o++)r.containingByLine.set(o,i.symbolId)}for(let i of n.values())i.starts.sort((r,o)=>r.line-o.line);return n}function r1(e,t,n){let i=0,r=e.length-1;for(;i<=r;){let s=Math.floor((i+r)/2);e[s].line<t?i=s+1:r=s-1}let o=null;for(let s of[r,i]){let a=e[s];if(!a)continue;let c=Math.abs(a.line-t);c>n||(!o||c<o.distance)&&(o={distance:c,symbolId:a.symbolId})}return o?.symbolId??null}function tb(e,t,n){let i=d1(t),r=e.prepare("SELECT id FROM global_symbols WHERE symbol = ?"),o=e.prepare(`
|
|
823
846
|
INSERT OR IGNORE INTO global_symbols (symbol, display_name, kind, documentation)
|
|
824
847
|
VALUES (?, ?, ?, ?)
|
|
825
|
-
`),s=0,a=new Map;return e.transaction(()=>{for(let l of n){let
|
|
848
|
+
`),s=0,a=new Map;return e.transaction(()=>{for(let l of n){let d=di(t,l),u=ub(i.name,i.version,d);o.run(u,"default",7,`Vue component|${d}`);let m=m1(r,i,t,l);m&&(s++,a.set(l,m))}})(),{get(l){return a.get(l)??null},syntheticSymbols:s}}function nb(e,t,n,i,r){return e.transaction(()=>(YB(e),o1(e,t,n,i),s1(e,r)))()}function o1(e,t,n,i){let r=e.prepare("SELECT id FROM documents WHERE relative_path = ?"),o=e.prepare(`
|
|
826
849
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
827
850
|
VALUES (?, ?, ?, ?, X'00')
|
|
828
851
|
`),s=e.prepare(`
|
|
829
852
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
830
853
|
VALUES (?, ?, 1)
|
|
831
|
-
`);for(let a of n){let c=i.get(a);if(!c)continue;let l=
|
|
854
|
+
`);for(let a of n){let c=i.get(a);if(!c)continue;let l=di(t,a),d=r.get(l);if(!d)continue;let u=o.run(d.id,-1,0,0);s.run(Number(u.lastInsertRowid),c)}}function ib(e,t,n,i,r){if(e.fileName.endsWith(".vue")){let o=i.language.scripts.get(e.fileName),s=o?.generated?.languagePlugin.typescript?.getServiceScript(o.generated.root)?.code;if(o&&s){let a=i.language.maps.get(s,o);if(Au(a,e.textSpan.start)!==null)return n.get(e.fileName)}return e.fileName.startsWith(r)?n.get(e.fileName):null}return t(e)}function rb(e){let t=new Set,n=[];for(let i of e){let r=ob(i);t.has(r)||(t.add(r),n.push(i))}return n}function ob(e){return[e.sourceFile,e.sourceLine,e.sourceStartChar,e.sourceEndChar,e.symbolId].join(":")}function s1(e,t){let n=u1(e,[...new Set(t.map(c=>c.sourceFile))]),i=e.prepare(`
|
|
832
855
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
833
856
|
VALUES (?, ?, ?, ?, X'00')
|
|
834
857
|
`),r=e.prepare(`
|
|
835
858
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
836
859
|
VALUES (?, ?, 0)
|
|
837
|
-
`),o=new Set,s=0,a=0;for(let c of t){let l
|
|
838
|
-
`)}function Vh(e,t,n){let i=e.prepare(`
|
|
860
|
+
`),o=new Set,s=0,a=0;for(let c of t){let l=ob(c);if(o.has(l))continue;o.add(l);let d=n.get(c.sourceFile);if(!d)continue;let u=i.run(d,a++,c.sourceLine,c.sourceLine),m=r.run(Number(u.lastInsertRowid),c.symbolId);s+=Number(m.changes)}return s}function*sb(e){let t=/\b[A-Za-z_$][A-Za-z0-9_$]*\b/g,n=new Set(["script","setup","template","style","lang","scoped","true","false","null","undefined","const","let","var","import","from","export","return","if","else","for","while","function","class","type","interface","as","await","async"]),i;for(;i=t.exec(e);){let r=i[0];n.has(r)||(yield{text:r,start:i.index,end:i.index+r.length})}}function ab(e,t){for(let[n]of e.toGeneratedLocation(t,i=>!!i.navigation))return n;return null}function Au(e,t){let n=e;for(let[i]of n.toSourceLocation(t,r=>!!r.navigation))return i;return null}function a1(e,t){let n=0,i=e.lineStarts.length-1;for(;n<=i;){let o=Math.floor((n+i)/2);e.lineStarts[o]<=t?n=o+1:i=o-1}let r=Math.max(0,i);return{line:r,character:t-e.lineStarts[r]}}function cb(e,t){return di(e,t).startsWith("node_modules/")}function di(e,t){return JB(e,t).replaceAll("\\","/")}function c1(e){switch(KB(e)){case".vue":return"vue";case".tsx":return"typescriptreact";case".ts":case".mts":case".cts":return"typescript";case".jsx":return"javascriptreact";case".js":case".mjs":case".cjs":return"javascript";case".json":return"json";default:return"typescript"}}function lb(){let e=new Map;return{get(t){if(e.has(t))return e.get(t)??null;try{let n=_u(t,"utf-8"),i={text:n,lineStarts:l1(n)};return e.set(t,i),i}catch{return e.set(t,null),null}},positionAt:a1}}function l1(e){let t=[0];for(let n=0;n<e.length;n++)e.charCodeAt(n)===10&&t.push(n+1);return t}function u1(e,t){let n=new Map,i=500;for(let r=0;r<t.length;r+=i){let o=t.slice(r,r+i),s=e.prepare(`SELECT id, relative_path AS relativePath FROM documents WHERE relative_path IN (${o.map(()=>"?").join(",")})`).all(...o);for(let a of s)n.set(a.relativePath,a.id)}return n}function d1(e){try{let t=JSON.parse(_u(Qy(e,"package.json"),"utf-8"));return{name:t.name??"workspace",version:t.version??"0.0.0"}}catch{return{name:"workspace",version:"0.0.0"}}}function m1(e,t,n,i){let r=di(n,i),o=ub(t.name,t.version,r);return e.get(o)?.id??null}function ub(e,t,n){let i=n.split("/").map(r=>`\`${r.replaceAll("`","")}\``).join("/");return`scip-vue npm ${e} ${t} ${i}/default.`}function db(e){return{id:"vue-resolved-references",facts:["synthetic-symbol","source-mapped-occurrence","definition-mention","replacement-chunk","fingerprint-cache"],run:t=>b1({projectRoot:t.projectRoot,dbPath:t.dbPath,tsconfig:e.tsconfig,onStatus:t.onStatus})}}function Mu(e){return ir(nr(),{projectRoot:e.projectRoot,dbPath:e.dbPath}),ir(db({tsconfig:e.tsconfig}),{projectRoot:e.projectRoot,dbPath:e.dbPath,onStatus:e.onStatus}).result}function b1(e){let t=y1(e.projectRoot,e.tsconfig);if(!f1(t))throw new Error(`Vue tsconfig not found at ${t}`);let n=new p1(e.dbPath);try{let i=Yy(n,e.projectRoot),r=h1(g1(e.dbPath),"augment-vue-meta.json");return Dy({cachePath:r,readFingerprint:()=>C1(n,e.projectRoot,e.tsconfig),compute:()=>S1({db:n,projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,configPath:t,vueFiles:i,onStatus:e.onStatus}),onCacheHit:o=>e.onStatus?.(`Vue references unchanged; reused ${o.resolvedReferences} cached resolved references.`)})}finally{n.close()}}function S1(e){let t=tb(e.db,e.projectRoot,e.vueFiles),n=x1(e,t),i=rb(n.occurrences),r=nb(e.db,e.projectRoot,e.vueFiles,t,i),o={vueFiles:e.vueFiles.length,resolvedReferences:i.length,insertedMentions:r,skippedReferences:n.skippedReferences,syntheticSymbols:t.syntheticSymbols};return e.onStatus?.(`Resolved ${o.resolvedReferences} Vue references with Volar; inserted ${o.insertedMentions} mentions.`),o}function x1(e,t){if(Wy(e.vueFiles))return Gy({projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,vueFiles:e.vueFiles});let n=v1({db:e.db,projectRoot:e.projectRoot,configPath:e.configPath,vueSymbolLookup:t});return R1({...n,vueFiles:n.context.fileNames.filter(i=>i.endsWith(".vue"))})}function C1(e,t,n){let i=e.prepare(`
|
|
839
861
|
SELECT
|
|
840
862
|
(SELECT COUNT(*) FROM documents) AS documents,
|
|
841
863
|
(SELECT COUNT(*) FROM global_symbols) AS symbols,
|
|
@@ -844,40 +866,40 @@ Affected consumer files:`),N.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
844
866
|
(SELECT COUNT(*) FROM defn_enclosing_ranges) AS ranges,
|
|
845
867
|
(SELECT MAX(id) FROM chunks) AS maxChunkId,
|
|
846
868
|
(SELECT MAX(id) FROM global_symbols) AS maxSymbolId
|
|
847
|
-
`).get();return{version:2,tsconfig:n,files:
|
|
848
|
-
Install from: https://github.com/sourcegraph/scip/releases`);if(t("scip CLI not found on PATH. Attempting auto-install..."),!
|
|
849
|
-
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function
|
|
869
|
+
`).get();return{version:2,tsconfig:n,files:ui(t),db:i}}function v1(e){let t=lb();return{projectRoot:e.projectRoot,context:Zy(e.projectRoot,e.configPath),symbolLookup:eb(e.db,e.projectRoot,t),vueSymbolLookup:e.vueSymbolLookup,sourceReader:t}}function R1(e){let t=[],n=0,i=e.tasks??e.vueFiles.map(r=>({fileName:r,startOffset:0,endOffset:Number.POSITIVE_INFINITY,countFileSkip:!0}));for(let r of i){let o=k1(e,r);t.push(...o.occurrences),n+=o.skippedReferences}return{occurrences:t,skippedReferences:n}}function k1(e,t){let n=e.context.language.scripts.get(t.fileName),i=n?.generated?.languagePlugin.typescript?.getServiceScript(n.generated.root)?.code;if(!n||!i)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let r=e.sourceReader.get(t.fileName);if(!r)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let o=e.context.language.maps.get(i,n),s=di(e.projectRoot,t.fileName),a=[...sb(r.text)],c={tokens:a.filter(l=>l.start>=t.startOffset&&l.start<t.endOffset),tokenByStart:new Map(a.map(l=>[l.start,l])),tokenTextCounts:I1(a),processedStarts:new Set};return w1({...e,fileName:t.fileName,sourceInfo:r,sourceFile:s,map:o,tokenContext:c})}function w1(e){let t=[],n=0;for(let i of e.tokenContext.tokens){if(e.tokenContext.processedStarts.has(i.start))continue;let r=ab(e.map,i.start);if(r===null)continue;let s=(e.context.languageService.getDefinitionAtPosition(e.fileName,r+1)??[]).find(c=>!cb(e.projectRoot,c.fileName));if(!s){n++;continue}let a=ib(s,e.symbolLookup,e.vueSymbolLookup,e.context,e.projectRoot);if(a===null){n++;continue}mb(t,e.sourceReader,e.sourceInfo,e.sourceFile,i,a),e.tokenContext.processedStarts.add(i.start),P1(t,e,i,r,a)}return{occurrences:t,skippedReferences:n}}function P1(e,t,n,i,r){if(!((t.tokenContext.tokenTextCounts.get(n.text)??0)<=1))for(let o of L1(t.context.languageService,t.fileName,i+1,t.map,n,t.tokenContext.tokenByStart)){if(t.tokenContext.processedStarts.has(o))continue;let s=t.tokenContext.tokenByStart.get(o);s&&(mb(e,t.sourceReader,t.sourceInfo,t.sourceFile,s,r),t.tokenContext.processedStarts.add(o))}}function mb(e,t,n,i,r,o){let s=t.positionAt(n,r.start);e.push({sourceFile:i,sourceLine:s.line,sourceStartChar:s.character,sourceEndChar:s.character+r.text.length,symbolId:o})}function I1(e){let t=new Map;for(let n of e)t.set(n.text,(t.get(n.text)??0)+1);return t}function L1(e,t,n,i,r,o){let s=e.getDocumentHighlights?.(t,n,[t])??[],a=[];for(let c of s)if(c.fileName===t)for(let l of c.highlightSpans){let d=D1(i,l.textSpan.start,o,r.text);d!==null&&a.push(d)}return a}function D1(e,t,n,i){let r=n.get(t);if(r?.text===i)return r.start;let o=Au(e,t);if(o===null)return null;let s=n.get(o);return s?.text===i?s.start:null}async function vn(e){let{projectRoot:t,maxHeapMb:n=8192,onStatus:i=console.log,skipAutoInstall:r=!1}=e,o=M1(e),s=Date.now();Ou(Ct(o.outputScip),{recursive:!0}),Ou(Ct(o.outputDb),{recursive:!0});let a=e.languages??tn(t);if(a.length===0)throw new Error("No supported languages detected in this project. Looked for: tsconfig.json, Cargo.toml, go.mod, pyproject.toml, etc.");i(`Detected languages: ${a.join(", ")}`);let c=oH(t,a,{pnpmWorkspaces:e.pnpmWorkspaces,typescriptProjectMode:e.typescriptProjectMode,typescriptProjects:e.typescriptProjects,clojureConfigPath:e.clojureConfigPath}),l=await Q1(jt(Ct(o.outputDb),"index.lock"),{projectRoot:t,trigger:e.trigger,onStatus:i}),d=null;try{let u=$1({opts:e,paths:o,languages:a,fingerprint:c,start:s,onStatus:i});if(u)return u;U1(r,i);let m=j1(o);return d=m.runDir,await O1({opts:e,languages:a,projectRoot:t,paths:o,tempPaths:m,fingerprint:c,start:s,maxHeapMb:n,skipAutoInstall:r,onStatus:i})}catch(u){throw kb(o.metaPath,Hu({trigger:e.trigger,result:"failed",start:s,error:u instanceof Error?u.message:String(u)})),u}finally{d&&ho(d,{recursive:!0,force:!0}),l()}}function M1(e){let t=e.outputScip??jt(e.projectRoot,"index.scip"),n=e.outputDb??jt(e.projectRoot,"index.db");return{outputScip:t,outputDb:n,metaPath:jt(Ct(n),"meta.json")}}function $1(e){if(e.opts.skipIfUnchanged===!1||!ya(e.paths.outputScip)||!ya(e.paths.outputDb)||!sH(e.paths.metaPath,e.fingerprint))return null;ir(nr(),{projectRoot:e.opts.projectRoot,dbPath:e.paths.outputDb,onStatus:e.onStatus});let t=Date.now()-e.start,n=Hu({trigger:e.opts.trigger,result:"reused",start:e.start,languages:e.languages,skipped:[]});return kb(e.paths.metaPath,n),e.onStatus(`Index unchanged; reused existing SQLite index in ${(t/1e3).toFixed(1)}s`),{languages:e.languages,indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:t,reused:!0,skipped:[],lastRefresh:n}}function j1(e){let t=T1(jt(Ct(e.outputDb),"reindex-"));return{runDir:t,tempOutputScip:jt(t,ha(e.outputScip)),tempOutputDb:jt(t,ha(e.outputDb)),tempMetaPath:jt(t,ha(e.metaPath))}}async function O1(e){let t={...process.env,NODE_OPTIONS:`--max-old-space-size=${e.maxHeapMb}`},{indexedOutputs:n,skippedLanguages:i,reusedLanguages:r}=await B1(e,t);r.length>0&&e.onStatus(`Reused ${r.length} cached language shard(s): ${r.join(", ")}`);let o=H1(e,t,n,i),s=o.durationMs;return e.onStatus(`Done in ${(s/1e3).toFixed(1)}s`),{languages:n.map(a=>a.language),indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:s,reused:!1,skipped:i,lastRefresh:o}}async function B1(e,t){let n=V1(e),i=new Set(n.map(l=>l.language));for(let l of i)e.onStatus(`Reusing cached ${l} SCIP shard (language inputs unchanged).`);let{preparedRuns:r,skippedLanguages:o}=z1({languages:e.languages.filter(l=>!i.has(l)),tempOutputScip:e.tempPaths.tempOutputScip,projectRoot:e.projectRoot,env:t,skipAutoInstall:e.skipAutoInstall,pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects,clojureConfigPath:e.opts.clojureConfigPath,onStatus:e.onStatus}),s=await Oy(r,e.projectRoot,e.onStatus,e.opts.indexerConcurrency),{indexedOutputs:a}=G1(s,o),c=[...n,...a];return K1(c,o,e.languages,e.opts.allowPartial,e.onStatus),{indexedOutputs:c,skippedLanguages:o,reusedLanguages:[...i]}}function H1(e,t,n,i){q1(e.paths.outputDb,n),J1(n,e.tempPaths.tempOutputScip,e.onStatus),X1(e.tempPaths.tempOutputScip,e.tempPaths.tempOutputDb,t,e.onStatus),ir(nr(),{projectRoot:e.projectRoot,dbPath:e.tempPaths.tempOutputDb,onStatus:e.onStatus});let r=Hu({trigger:e.opts.trigger,result:"rebuilt",start:e.start,languages:n.map(o=>o.language),skipped:[...i]});return Rb(e.tempPaths.tempMetaPath,{version:3,status:i.length===0?"complete":"partial",updatedAt:new Date().toISOString(),fingerprint:e.fingerprint,languageFingerprints:bb(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects,clojureConfigPath:e.opts.clojureConfigPath}),requestedLanguages:e.languages,indexedLanguages:n.map(o=>o.language),skipped:[...i],lastRefresh:r}),rH({tempOutputScip:e.tempPaths.tempOutputScip,tempOutputDb:e.tempPaths.tempOutputDb,tempMetaPath:e.tempPaths.tempMetaPath,outputScip:e.paths.outputScip,outputDb:e.paths.outputDb,metaPath:e.paths.metaPath}),r}function V1(e){let t;try{t=JSON.parse(ba(e.paths.metaPath,"utf-8"))}catch{return[]}if(t.version!==3||!t.languageFingerprints)return[];let n=[],i=bb(e.projectRoot,e.languages,{pnpmWorkspaces:e.opts.pnpmWorkspaces,typescriptProjectMode:e.opts.typescriptProjectMode,typescriptProjects:e.opts.typescriptProjects,clojureConfigPath:e.opts.clojureConfigPath});for(let r of e.languages){let o=vb(e.paths.outputDb,r);ya(o)&&or(t.languageFingerprints[r])===or(i[r])&&n.push({language:r,scipPath:o})}return n}function q1(e,t){for(let n of t){let i=vb(e,n.language);Ou(Ct(i),{recursive:!0}),n.scipPath!==i&&F1(n.scipPath,i)}}function U1(e,t){if(!ca()){if(e)throw new Error(`The scip CLI is required but not found on PATH.
|
|
870
|
+
Install from: https://github.com/sourcegraph/scip/releases`);if(t("scip CLI not found on PATH. Attempting auto-install..."),!Sy(t))throw new Error(`The scip CLI is required but could not be installed.
|
|
871
|
+
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function z1(e){let t=[],n=[],i=e.languages.map((r,o)=>({language:r,scipPath:e.languages.length>1?yb(e.tempOutputScip,r,o):e.tempOutputScip}));for(let{language:r,scipPath:o}of i){let s=W1({...e,language:r,scipPath:o});for(let a of s)"skipped"in a?hb(n,a.skipped):t.push(a.prepared)}return{preparedRuns:t,skippedLanguages:n}}function W1(e){if(e.language!=="typescript"||e.typescriptProjectMode!=="workspace")return[$u({...e,id:e.language,label:e.language,outputScipPath:e.scipPath})];let t=Ay(e.projectRoot,e.typescriptProjects);return t.length===0?[$u({...e,id:e.language,label:e.language,outputScipPath:e.scipPath})]:(e.onStatus(`Indexing TypeScript workspace as ${t.length} project shard(s).`),t.map((n,i)=>$u({...e,id:`typescript:${n}`,label:`typescript (${n})`,scipPath:yb(e.tempOutputScip,"typescript-project",i),outputScipPath:e.scipPath,pnpmWorkspaces:!1,projectPath:n})))}function $u(e){let t=li(e.language),n=pa(t),i=Eu(t,e.projectRoot);if(!i&&!Hy(t)){if(e.skipAutoInstall){let a=`${n} not found on PATH (auto-install disabled). ${t.installUrl??""}`.trim();return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}if(e.onStatus(`${n} not found. Attempting auto-install...`),!ga(t,e.onStatus)){let a=`${n} could not be auto-installed. ${t.installUrl?`Install manually from ${t.installUrl}`:`Install ${n} and put it on PATH.`}`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}}let r=i??rr(t);if(!r){let a=`${n} was not found after installation checks.`;return e.onStatus(`Skipping ${e.language}: ${a}`),{skipped:{language:e.language,reason:a}}}let{binary:o,args:s}=t.indexArgs({projectRoot:e.projectRoot,outputPath:e.scipPath,pnpmWorkspaces:e.pnpmWorkspaces,indexerBinary:r,projectPath:e.projectPath,configPath:e.language==="clojure"?e.clojureConfigPath:void 0});return{prepared:{id:e.id,language:e.language,label:e.label,scipPath:e.scipPath,outputScipPath:e.outputScipPath,config:t,resolvedBinary:r,binary:o,args:s,env:qy(t,e.env,r)}}}function G1(e,t){let n=new Map;for(let r of e)if(r.skipped)hb(t,r.skipped);else{let o=`${r.language}\0${r.outputScipPath}`,s=n.get(o)??{language:r.language,outputScipPath:r.outputScipPath,scipPaths:[]};s.scipPaths.push(r.scipPath),n.set(o,s)}let i=[];for(let r of n.values())if(r.scipPaths.length>1)Ru(r.scipPaths,r.outputScipPath),i.push({language:r.language,scipPath:r.outputScipPath});else{let o=r.scipPaths[0];o!==r.outputScipPath&&go(o,r.outputScipPath),i.push({language:r.language,scipPath:r.outputScipPath})}return{indexedOutputs:i}}function hb(e,t){let n=e.find(i=>i.language===t.language);if(!n){e.push(t);return}n.reason.includes(t.reason)||(n.reason=`${n.reason}; ${t.reason}`)}function K1(e,t,n,i,r){if(e.length===0){let o=t.map(s=>` - ${s.language}: ${s.reason}`).join(`
|
|
850
872
|
`);throw new Error(`No language indexers ran successfully. Install at least one indexer for the languages in this project.
|
|
851
873
|
`+o)}if(t.length!==0&&(r(`Indexed ${e.length} language output(s); skipped or incomplete: ${t.map(o=>o.language).join(", ")}.`),!i))throw new Error(`Failed to index all required languages; preserving the previous index. Pass --allow-partial to intentionally write an incomplete index.
|
|
852
874
|
`+t.map(o=>` - ${o.language}: ${o.reason}`).join(`
|
|
853
|
-
`))}function
|
|
854
|
-
`),()=>{try{
|
|
855
|
-
`),
|
|
856
|
-
`).map(o=>o.slice(3).trim()).filter(o=>o!==""));return[...new Set(t.batches.flatMap(o=>o.entries.map(s=>s.file)))].filter(o=>i.has(o)).sort()}function
|
|
857
|
-
`),r=(n.rust===!0?
|
|
858
|
-
`),o=new Set;for(let s of t){let a=
|
|
859
|
-
`)}function
|
|
875
|
+
`))}function J1(e,t,n){e.length>1?(n(`Merging ${e.length} language indexes...`),Ru(e.map(i=>i.scipPath),t)):e[0].scipPath!==t&&go(e[0].scipPath,t)}function X1(e,t,n,i){if(i("Converting to SQLite..."),!ya(e))throw new Error(`SCIP index not found at ${e} after indexing`);try{let r=_y(e);r.removedDefinitionOccurrences>0&&i(`Sanitized ${r.removedDefinitionOccurrences} invalid definition occurrences across ${r.touchedDocuments} documents before SQLite conversion.`);let o=ca();if(!o)throw new Error("scip CLI is not available");E1(o,["expt-convert","--output",t,e],{env:n,stdio:"pipe",maxBuffer:50*1024*1024})}catch(r){let o=r instanceof Error?r.message:String(r);throw new Error(`Failed to convert SCIP index to SQLite: ${o}`,{cause:r})}}function yb(e,t,n){let i=A1(e)||".scip",r=ha(e,i);return jt(Ct(e),`${r}.${n+1}.${t}${i}`)}async function Q1(e,t){for(let n=0;n<2;n++){let i=Y1(e,t);if(i)return i;let r=Z1(e);if(r&&eH(t.trigger,r)){t.onStatus(`Manual reindex preempting watcher refresh started at ${r.startedAt}.`),await nH(r.pid),ho(e,{force:!0});continue}if(r&&!Bu(r.pid)){ho(e,{force:!0});continue}throw new Error(`Another scip-query reindex is already running for ${Ct(e)}.`)}throw new Error(`Could not acquire scip-query reindex lock for ${Ct(e)}.`)}function Y1(e,t){let n;try{n=_1(e,"wx")}catch(r){if((typeof r=="object"&&r&&"code"in r?r.code:void 0)==="EEXIST")return null;throw r}let i={version:1,pid:process.pid,projectRoot:t.projectRoot,startedAt:new Date().toISOString(),trigger:t.trigger};return gb(n,JSON.stringify(i)+`
|
|
876
|
+
`),()=>{try{N1(n)}finally{ho(e,{force:!0})}}}function Z1(e){try{let t=JSON.parse(ba(e,"utf-8"));return typeof t.pid!="number"||!Number.isInteger(t.pid)||t.pid<=0?null:{version:1,pid:t.pid,projectRoot:typeof t.projectRoot=="string"?t.projectRoot:Ct(e),startedAt:typeof t.startedAt=="string"?t.startedAt:"unknown",trigger:t.trigger}}catch{return null}}function eH(e,t){return e?.kind==="manual-cli"&&tH(t?.trigger)}function tH(e){return e?.kind==="watch-source"||e?.kind==="watch-git-head"||e?.kind==="watch-git-index"||e?.kind==="watch-git-state"}async function nH(e){pb(e,"SIGTERM"),!await fb(e,2e3)&&(pb(e,"SIGKILL"),await fb(e,1e3))}function pb(e,t){try{process.kill(-e,t)}catch{try{process.kill(e,t)}catch{}}}async function fb(e,t){let n=Date.now()+t;for(;Date.now()<n;){if(!Bu(e))return!0;await iH(50)}return!Bu(e)}function Bu(e){try{return process.kill(e,0),!0}catch{return!1}}function iH(e){return new Promise(t=>setTimeout(t,e))}function rH(e){ju(e.tempOutputScip,e.outputScip),ju(e.tempOutputDb,e.outputDb),ju(e.tempMetaPath,e.metaPath)}function ju(e,t){ho(`${t}.tmp-replace`,{force:!0}),go(e,`${t}.tmp-replace`),go(`${t}.tmp-replace`,t)}function oH(e,t,n){return{version:2,languages:[...t].sort(),pnpmWorkspaces:Cb(n),typescriptProjectMode:n.typescriptProjectMode??"single",typescriptProjects:Sb(n.typescriptProjects),clojureConfigPath:xb(n.clojureConfigPath),files:ui(e)}}function bb(e,t,n){return Object.fromEntries(t.map(i=>{let r=li(i).markerFiles,o=i==="typescript"?{typescriptProjectMode:n.typescriptProjectMode??"single",typescriptProjects:Sb(n.typescriptProjects)}:{typescriptProjectMode:"single",typescriptProjects:[]},s=i==="clojure"?xb(n.clojureConfigPath):void 0;return[i,{version:2,languages:[i],pnpmWorkspaces:i==="typescript"&&Cb(n),...o,clojureConfigPath:s,files:ui(e,{language:i,markerFiles:r})}]}))}function Sb(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function xb(e){return e?.trim()||void 0}function Cb(e){return e.typescriptProjectMode!=="workspace"&&e.pnpmWorkspaces===!0}function vb(e,t){return jt(Ct(e),"language-indexes",`${t}.scip`)}function sH(e,t){try{let n=JSON.parse(ba(e,"utf-8"));return(n.version===2||n.version===3)&&n.status==="complete"&&or(n.fingerprint)===or(t)&&or([...n.indexedLanguages??[]].sort())===or(t.languages)}catch{return!1}}function Rb(e,t){let n=`${e}.tmp-${process.pid}-${Date.now()}`;gb(n,`${JSON.stringify(t,null,2)}
|
|
877
|
+
`),go(n,e)}function kb(e,t){try{let n=JSON.parse(ba(e,"utf-8"));if(n.version!==2&&n.version!==3)return;Rb(e,{...n,lastRefresh:t})}catch{}}function Hu(e){return{trigger:e.trigger??{kind:"unknown"},result:e.result,startedAt:new Date(e.start).toISOString(),completedAt:new Date().toISOString(),durationMs:Date.now()-e.start,indexedLanguages:e.languages?[...e.languages]:void 0,skipped:e.skipped?[...e.skipped]:void 0,error:e.error}}function or(e){return JSON.stringify(e)}import{existsSync as wb,readFileSync as aH}from"fs";function Rn(e,t,n){let i=new Date().toISOString();if(!wb(n.dbPath))return{state:"missing",checkedAt:i,metaPath:n.metaPath,reason:"No SQLite index database exists.",remedy:"Run: scip-query reindex"};if(!wb(n.metaPath))return{state:"unknown",checkedAt:i,metaPath:n.metaPath,reason:"No reindex metadata file exists next to the SQLite index.",remedy:"Run: scip-query reindex"};try{let r=JSON.parse(aH(n.metaPath,"utf-8")),o=t.languages??tn(e),s=cH(e,o,t),a=Array.isArray(r.indexedLanguages)?[...r.indexedLanguages].sort():[],c=(r.version===2||r.version===3)&&r.status==="complete"&&JSON.stringify(r.fingerprint)===JSON.stringify(s)&&JSON.stringify(a)===JSON.stringify(s.languages);return{state:c?"fresh":"stale",checkedAt:i,metaPath:n.metaPath,updatedAt:r.updatedAt,lastRefresh:r.lastRefresh,reason:c?"Index metadata fingerprint matches current source files.":"Index metadata fingerprint differs from current source files.",remedy:c?void 0:"Run: scip-query reindex"}}catch(r){return{state:"unknown",checkedAt:i,metaPath:n.metaPath,reason:`Could not read reindex metadata: ${r instanceof Error?r.message:String(r)}`,remedy:"Run: scip-query reindex"}}}function cH(e,t,n){return{version:2,languages:[...t].sort(),pnpmWorkspaces:n.indexer?.typescript?.projectMode!=="workspace"&&n.indexer?.typescript?.pnpmWorkspaces===!0,typescriptProjectMode:n.indexer?.typescript?.projectMode??"single",typescriptProjects:lH(n.indexer?.typescript?.projects),clojureConfigPath:uH(n.indexer?.clojure?.configPath),files:ui(e)}}function lH(e){return[...new Set((e??[]).map(t=>t.trim()).filter(Boolean))].sort((t,n)=>t.localeCompare(n))}function uH(e){return e?.trim()||void 0}import{execFileSync as FH}from"child_process";import{createRequire as dH}from"module";var mH=dH(import.meta.url);function Pb(e,t=[]){let n=pH(),i=Dc(e,t),r=i[0];return n?i.length===0?{available:!1,dependencyAvailable:n,reason:"no tsconfig found"}:{available:!0,dependencyAvailable:n,tsconfigPath:r,tsconfigPaths:i}:{available:!1,dependencyAvailable:n,tsconfigPath:r,tsconfigPaths:i,reason:"ts-morph is not installed"}}function pH(){try{return mH.resolve("ts-morph"),!0}catch{return!1}}import{execFileSync as sr,spawnSync as Db}from"child_process";import{existsSync as vt,mkdtempSync as Eb,readFileSync as fH,readdirSync as gH,rmSync as Nb,symlinkSync as hH,writeFileSync as yH}from"fs";import{tmpdir as Fb}from"os";import{join as ze}from"path";var bH=3e5,SH=12;function qu(e,t,n={}){let i=Uu(e);if(i.length===0)return{checkers:[],uncoveredFiles:[],baselineErrors:0,dirtyOverlap:[],batches:[]};let r=xH(t,i),o=n.timeoutMs??bH,s=wH(e,t),a=Eb(ze(Fb(),"scip-cleanup-verify-")),c=[],l=new Set;try{sr("git",["-C",e,"worktree","add","--detach","--force",a,"HEAD"],{stdio:"ignore"}),PH(e,a);for(let d of i)for(let u of Lb(d,a,o).errorKeys)l.add(u);for(let d of t.batches){_b(a,d);let u=[];for(let m of i){let p=Lb(m,a,o);u.push(...p.rawErrors.filter(f=>!l.has(Tb(f))))}if(u.length===0)c.push({depth:d.depth,status:"verified"});else{c.push({depth:d.depth,status:"failed",errors:u.slice(0,SH)});break}}}finally{try{sr("git",["-C",e,"worktree","remove","--force",a],{stdio:"ignore"})}catch{Nb(a,{recursive:!0,force:!0})}}return{checkers:i.map(d=>d.label),uncoveredFiles:r,baselineErrors:l.size,dirtyOverlap:s,batches:c}}function xH(e,t){let n=new Set(t.flatMap(r=>r.coversExtensions));return[...new Set(e.batches.flatMap(r=>r.entries.map(o=>o.file)))].filter(r=>{let o=r.slice(r.lastIndexOf("."));return!n.has(o)}).sort()}function Tb(e){return e.replace(/\(\d+,\d+\)|:\d+(?::\d+)?/g,"").trim()}var Ib=[".ts",".tsx",".mts",".cts",".js",".jsx",".vue"],Vu=[".clj",".cljs",".cljc"],CH=["deps.edn","project.clj","bb.edn","shadow-cljs.edn"];function Uu(e){let t=[];if(vt(ze(e,"tsconfig.json"))){let n=ze(e,"node_modules",".bin","tsc");t.push(vt(n)?{label:"tsc --noEmit",binary:n,args:["--noEmit"],coversExtensions:Ib}:{label:"npx tsc --noEmit",binary:"npx",args:["tsc","--noEmit"],coversExtensions:Ib})}if(vt(ze(e,"go.mod"))&&t.push({label:"go build ./...",binary:"go",args:["build","./..."],coversExtensions:[".go"]}),["pyproject.toml","setup.py","requirements.txt"].some(n=>vt(ze(e,n)))){let n=vH();n&&t.push(n)}if(CH.some(n=>vt(ze(e,n)))){let n=RH(e);n&&t.push(n)}for(let n of kH(e))t.push({label:`cargo check --quiet --manifest-path ${n}`,binary:"cargo",args:["check","--quiet","--manifest-path",n],coversExtensions:[".rs"],env:{...process.env,CARGO_TARGET_DIR:ze(e,n,"..","target")}});return t}function vH(){return Sa("ruff")?{label:"ruff check --select E9,F821,F822",binary:"ruff",args:["check","--quiet","--select","E9,F821,F822","."],coversExtensions:[".py"]}:Sa("python3")?{label:"python3 -m compileall (syntax only)",binary:"python3",args:["-m","compileall","-q","."],coversExtensions:[".py"]}:null}function RH(e){let t=ze(e,"node_modules",".bin","clj-kondo");return vt(t)?{label:"clj-kondo --lint .",binary:t,args:["--lint","."],coversExtensions:Vu}:Sa("clj-kondo")?{label:"clj-kondo --lint .",binary:"clj-kondo",args:["--lint","."],coversExtensions:Vu}:Sa("npx")?{label:"npx clj-kondo --lint .",binary:"npx",args:["--yes","clj-kondo","--lint","."],coversExtensions:Vu}:null}function Sa(e){try{return Db(e,["--version"],{stdio:"ignore",timeout:1e4}).status===0}catch{return!1}}function kH(e){let t=[];if(vt(ze(e,"Cargo.toml")))return t.push("Cargo.toml"),t;let n;try{n=gH(e)}catch{return t}for(let i of n)i==="node_modules"||i.startsWith(".")||vt(ze(e,i,"Cargo.toml"))&&t.push(`${i}/Cargo.toml`);return t}function wH(e,t){let n;try{n=sr("git",["-C",e,"status","--porcelain"],{encoding:"utf-8"})}catch{return[]}let i=new Set(n.split(`
|
|
878
|
+
`).map(o=>o.slice(3).trim()).filter(o=>o!==""));return[...new Set(t.batches.flatMap(o=>o.entries.map(s=>s.file)))].filter(o=>i.has(o)).sort()}function PH(e,t){for(let n of["node_modules"]){let i=ze(e,n),r=ze(t,n);if(vt(i)&&!vt(r))try{hH(i,r,"junction")}catch{}}}function _b(e,t){let n=new Map;for(let i of t.entries){let r=n.get(i.file)??[];r.push({start:i.startLine,end:i.endLine}),n.set(i.file,r)}for(let[i,r]of n){let o=ze(e,i);vt(o)&&yH(o,IH(fH(o,"utf-8"),r,{rust:i.endsWith(".rs")}))}}function zu(e,t){for(let n of t)_b(e,n)}function Ab(e,t){let n=Eb(ze(Fb(),"scip-cleanup-patch-"));try{return sr("git",["-C",e,"worktree","add","--detach","--force",n,"HEAD"],{stdio:"ignore"}),zu(n,t),sr("git",["-C",n,"diff","--binary"],{encoding:"utf-8",maxBuffer:32*1024*1024})}finally{try{sr("git",["-C",e,"worktree","remove","--force",n],{stdio:"ignore"})}catch{Nb(n,{recursive:!0,force:!0})}}}function Wu(e,t={}){if(t.all)return[...e.batches];if(t.batch!==void 0){let n=e.batches.find(i=>i.depth===t.batch);return n?[n]:[]}return[...e.batches]}function Gu(e,t,n={}){let i=[];e.checkers.length===0&&i.push("No project checker was detected, so no deletion patch is compiler-verified."),e.uncoveredFiles.length>0&&i.push(`No detected checker covers: ${e.uncoveredFiles.join(", ")}.`),!n.allowDirty&&e.dirtyOverlap.length>0&&i.push(`Plan files are dirty in the working tree: ${e.dirtyOverlap.join(", ")}.`);let r=new Set(e.batches.filter(o=>o.status==="verified").map(o=>o.depth));for(let o of t)r.has(o.depth)||i.push(`Batch ${o.depth} is not compiler-verified.`);return i}function IH(e,t,n={}){let i=e.split(`
|
|
879
|
+
`),r=(n.rust===!0?LH(e):Tn(e)).split(`
|
|
880
|
+
`),o=new Set;for(let s of t){let a=DH(i,s.start),c=NH(r,a,Math.min(s.end,i.length-1));for(let l=a;l<=c&&l<i.length;l++)o.add(l)}return i.filter((s,a)=>!o.has(a)).join(`
|
|
881
|
+
`)}function LH(e){return e.replace(/\/\/.*$/gm,t=>t.replace(/[^\r\n]/g," ")).replace(/\/\*[\s\S]*?\*\//g,t=>t.replace(/[^\r\n]/g," ")).replace(/"(?:\\.|[^"\\\r\n])*"/g,t=>t.replace(/[^\r\n]/g," "))}function DH(e,t){let n=t;for(;n>0;){let i=(e[n-1]??"").trim();if(/^(?:\/\/\/|\/\/!|#\[|#!\[|\/\*\*|\*|\*\/|@\w)/.test(i))n-=1;else break}return n}var EH=200;function NH(e,t,n){let i=0;for(let r=t;r<e.length;r++){for(let o of e[r]??"")o==="("||o==="["||o==="{"?i+=1:(o===")"||o==="]"||o==="}")&&(i-=1);if(r>=n&&i<=0)return r;if(r-n>EH)break}return n}function Lb(e,t,n){let i=Db(e.binary,e.args,{cwd:t,encoding:"utf-8",timeout:n,env:e.env??process.env,maxBuffer:33554432});if(i.status===0)return{ok:!0,rawErrors:[],errorKeys:new Set};let o=`${i.stdout??""}
|
|
860
882
|
${i.stderr??""}`.split(`
|
|
861
|
-
`).map(s=>s.trim()).filter(s=>/\berror\b/i.test(s));return i.error&&o.length===0&&o.push(String(i.error)),{ok:!1,rawErrors:o,errorKeys:new Set(o.map(
|
|
862
|
-
`)}function
|
|
863
|
-
`);
|
|
864
|
-
`);
|
|
883
|
+
`).map(s=>s.trim()).filter(s=>/\berror\b/i.test(s));return i.error&&o.length===0&&o.push(String(i.error)),{ok:!1,rawErrors:o,errorKeys:new Set(o.map(Tb))}}var Mb={typescript:[".ts",".tsx",".mts",".cts"],javascript:[".js",".jsx",".vue"],java:[".java"],scala:[".scala"],kotlin:[".kt",".kts"],rust:[".rs"],python:[".py",".pyi"],ruby:[".rb"],go:[".go"],cpp:[".cpp",".cc",".cxx",".hpp",".hh",".hxx"],c:[".c",".h"],csharp:[".cs"],vb:[".vb"],dart:[".dart"],php:[".php"],clojure:[".clj",".cljs",".cljc"]},TH={typescript:{status:"available",reason:"AST/source fallback covers TypeScript imports, references, and source-backed evidence."},javascript:{status:"available",reason:"AST/source fallback covers JavaScript, JSX, and Vue script evidence."},java:{status:"available",reason:"AST-dispatched source fallback covers Java imports."},scala:{status:"available",reason:"AST-dispatched source fallback covers Scala imports."},kotlin:{status:"available",reason:"AST-dispatched source fallback covers Kotlin imports."},rust:{status:"available",reason:"AST/source fallback covers Rust imports and exports."},python:{status:"available",reason:"AST/source fallback covers Python imports."},ruby:{status:"available",reason:"AST/source fallback covers Ruby imports."},go:{status:"unavailable",reason:"No Go source-fallback adapter is registered; Go relies on SCIP graph facts."},cpp:{status:"available",reason:"AST/source fallback covers C++ includes."},c:{status:"available",reason:"AST/source fallback covers C includes."},csharp:{status:"available",reason:"AST-dispatched source fallback covers C# imports."},vb:{status:"available",reason:"AST-dispatched source fallback covers Visual Basic imports."},dart:{status:"partial",reason:"Dart source fallback is regex-only for imports and exports."},php:{status:"available",reason:"AST/source fallback covers PHP imports."},clojure:{status:"available",reason:"Source fallback covers Clojure namespace imports plus callable, callsite, and protocol/record member evidence for .clj, .cljs, and .cljc files."}};function Ot(e,t){let n=t.languages??tn(e),i=n.map(s=>{let a=fa(li(s),e);return{...a,language:s,resolvedBinary:a.resolvedBinary??void 0}}),r=n.includes("typescript")?{language:"typescript",...Pb(e,t.semantic?.typescript?.tsconfigs)}:void 0,o=Uu(e).map(s=>({label:s.label,coversExtensions:s.coversExtensions}));return{languages:n,indexers:i,semantic:r,checkers:o,gitAvailable:$H(e)}}function mi(e,t={}){let n=e.indexers.filter(s=>s.runnable).length,i=e.languages.length===0||n===0&&!t.hasIndexedGraph?"unavailable":n===e.indexers.length&&e.indexers.length>0?"available":"partial",r=i!=="unavailable",o=e.semantic?e.semantic.available?"available":"partial":"unavailable";return{languages:e.languages,matrix:e.languages.map(s=>_H(e,s,{hasIndexedGraph:t.hasIndexedGraph===!0})),capabilities:[{id:"indexing",label:"SCIP indexing",status:i,evidence:"graph-fact",reason:i==="available"?"All detected/configured language indexers are runnable.":t.hasIndexedGraph?`An indexed graph is present; ${n}/${e.indexers.length} detected/configured language indexers are runnable for refresh.`:`${n}/${e.indexers.length} detected/configured language indexers are runnable.`},{id:"semantic-typescript",label:"TypeScript semantic provider",status:o,evidence:"semantic",reason:e.semantic?e.semantic.available?"ts-morph can load the configured TypeScript project.":e.semantic.reason??"TypeScript semantic checks will fall back to SCIP/source evidence.":"TypeScript is not detected/configured for this project."},{id:"heuristic-detectors",label:"Heuristic cleanup detectors",status:r?"available":"unavailable",evidence:"heuristic",reason:r?"Similarity, migration, wrapper, stale-abstraction, and doc-drift detectors can run over the index.":"Heuristic detectors need an indexed code graph."},{id:"cleanup-verification",label:"Compiler cleanup verification",status:e.checkers.length>0?"available":"unavailable",evidence:"compiler",reason:e.checkers.length>0?e.checkers.map(s=>s.label).join(", "):"No project checker was detected for cleanup-plan --verify."},{id:"diff-gate",label:"Git diff gate",status:e.gitAvailable&&r?"available":"unavailable",evidence:"git",reason:e.gitAvailable?"Git diff data is available for changed-file gates.":"Git is unavailable or the project root is not a git worktree."}]}}function _H(e,t,n){let i=e.indexers.find(l=>l.language===t),r=i?.runnable?"available":n.hasIndexedGraph?"partial":"unavailable",o=r!=="unavailable",s=TH[t],a=t==="typescript"?AH(e):{id:"semantic",label:"Semantic provider",status:"unavailable",evidence:"semantic",reason:`No semantic provider is registered for ${t}; commands use graph and source evidence instead.`},c=MH(e,t);return{language:t,indexing:{id:"indexing",label:"SCIP indexing",status:r,evidence:"graph-fact",reason:r==="available"?`${i?.binaryLabel??t} is runnable${i?.resolvedBinary?` at ${i.resolvedBinary}`:""}.`:r==="partial"?`An indexed ${t} graph is present, but ${i?.binaryLabel??t} is not currently runnable for refresh.`:i?.note??`${t} indexing is not runnable in this project.`},sourceFacts:{id:"source-facts",label:"Source fallback",status:o?s.status:"unavailable",evidence:"heuristic",reason:o?s.reason:"Source fallback needs indexed documents before it can attach evidence."},semantic:a,detectors:{id:"detectors",label:"Cleanup detectors",status:o?"available":"unavailable",evidence:"heuristic",reason:o?"Graph-backed cleanup detectors can analyze this language; source and semantic precision depends on the rows above.":"Cleanup detectors need an indexed graph for this language."},cleanupVerification:{id:"cleanup-verification",label:"Cleanup verification",status:c.length>0?"available":"unavailable",evidence:"compiler",reason:c.length>0?c.map(l=>l.label).join(", "):`No detected checker covers ${Mb[t].join(", ")} files.`}}}function AH(e){return e.semantic?{id:"semantic",label:"Semantic provider",status:e.semantic.available?"available":"partial",evidence:"semantic",reason:e.semantic.available?"ts-morph can load the configured TypeScript project.":e.semantic.reason??"TypeScript semantic checks fall back to SCIP/source evidence."}:{id:"semantic",label:"Semantic provider",status:"unavailable",evidence:"semantic",reason:"TypeScript is not detected/configured for this project."}}function MH(e,t){let n=new Set(Mb[t]);return e.checkers.filter(i=>i.coversExtensions.some(r=>n.has(r)))}function $H(e){try{return FH("git",["rev-parse","--is-inside-work-tree"],{cwd:e,stdio:"ignore",timeout:1e4}),!0}catch{return!1}}import{chmodSync as jH,existsSync as xa,readFileSync as Ca,writeFileSync as Ob}from"fs";import{join as bo}from"path";var yo="<!-- scip-query:agent-setup:begin -->",Ku="<!-- scip-query:agent-setup:end -->",$b="# scip-query:agent-setup";function So(){if(process.stdin.isTTY)return"";try{return Ca(0,"utf-8")}catch{return""}}function va(e){if(!e.trim())return!1;try{return JSON.parse(e).stop_hook_active===!0}catch{return!1}}function xo(e){let t=e.rootCauseGroups?.length??e.findings.length,n=[`scip-query diff-gate found ${e.findings.length} issue(s) in ${t} root-cause group(s) in this diff \u2014 fix or knowingly accept them before finishing:`],i=e.rootCauseGroups?.filter(r=>r.count>1)??[];for(let r of i)n.push(`- group [${r.check}] ${r.count} finding(s): ${r.message}`),n.push(` -> ${r.remediation}`);for(let r of e.findings)n.push(`- [${r.check}] ${r.message}`),n.push(` -> ${r.remediation}`);return n.join(`
|
|
884
|
+
`)}function Ra(e,t={}){let n={written:[],unchanged:[],skipped:[]};return OH(e,n),t.gitHook&&BH(e,n),n}function OH(e,t){let n=[yo,"## scip-query","","This repo is indexed by scip-query (compiler-resolved code intelligence).","","- Unsure how to explore, plan, verify, or clean up here: invoke the `scip-query` skill \u2014 it routes to the right specialist skill.","- For non-trivial implementation requests: plan first (`concrete-plan` skill, anchored by `scip-query plan-context <target>`), then implement.","- After the change, run the check matching what you did: extracted a helper -> `scip-query incomplete-migration`; new helper -> `scip-query recent-duplicates`; new params -> `scip-query unused-params`; new wrapper -> `scip-query wrapper-candidates`; schema/config change -> `scip-query co-change <file>`; deleted code -> `scip-query cleanup-plan --verify`.","- Before declaring the work done: `scip-query reindex && scip-query diff-gate` \u2014 fix findings or state why each is accepted.",Ku].join(`
|
|
885
|
+
`);jb(e,"AGENTS.md",n,t);let i=xa(bo(e,"CLAUDE.md"))?Ca(bo(e,"CLAUDE.md"),"utf-8"):"";if(i.includes("@AGENTS.md")&&!i.includes(yo)){t.unchanged.push("CLAUDE.md");return}let r=[yo,"@AGENTS.md",Ku].join(`
|
|
886
|
+
`);jb(e,"CLAUDE.md",r,t)}function jb(e,t,n,i){let r=bo(e,t),o=xa(r)?Ca(r,"utf-8"):"",s;if(o.includes(yo)){let a=new RegExp(`${yo}[\\s\\S]*?${Ku}`);s=o.replace(a,n)}else s=o.length>0?`${o.replace(/\n*$/,`
|
|
865
887
|
|
|
866
888
|
`)}${n}
|
|
867
889
|
`:`${n}
|
|
868
|
-
`;s===o?i.unchanged.push(t):(
|
|
869
|
-
`);if(
|
|
870
|
-
`),e.result[i?"updated":"installed"].push(e.label)}function
|
|
871
|
-
`),e.result.removed.push(e.label)}function
|
|
890
|
+
`;s===o?i.unchanged.push(t):(Ob(r,s),i.written.push(t))}function BH(e,t){let n=bo(e,".git","hooks");if(!xa(n)){t.skipped.push({target:".git/hooks/pre-commit",reason:"no .git/hooks directory (not a git repository?)"});return}let i=bo(n,"pre-commit"),r=["#!/bin/sh",$b,"scip-query diff-gate || {",' echo "scip-query diff-gate failed \u2014 fix findings or commit with --no-verify to knowingly accept." >&2'," exit 1","}",""].join(`
|
|
891
|
+
`);if(xa(i)){let o=Ca(i,"utf-8");if(o.includes($b)){if(o===r){t.unchanged.push(".git/hooks/pre-commit");return}}else{t.skipped.push({target:".git/hooks/pre-commit",reason:"a pre-commit hook already exists \u2014 add `scip-query diff-gate` to it manually"});return}}Ob(i,r),jH(i,493),t.written.push(".git/hooks/pre-commit")}var qb="SCIP_QUERY_SKIP_HOOK_INSTALL",Ju="SCIP_QUERY_STOP_HOOK_MODE",WH="scip-query hook-",GH="scip-query diff-gate --hook";function ka(e,t={}){let n=Ub(),i=t.env??process.env;return JH(i)?(n.skipped.push({target:"project agent hooks",reason:`${qb}=1`}),n):(Bb({provider:"codex",rootDir:ar(e,".codex"),configPath:ar(e,".codex","hooks.json"),label:".codex/hooks.json",createRoot:!0,result:n}),Bb({provider:"claude",rootDir:ar(e,".claude"),configPath:ar(e,".claude","settings.json"),label:".claude/settings.json",createRoot:!0,result:n}),t.removeLegacyUserHooks!==!1&&KH({homeDir:t.homeDir,result:n}),n)}function KH(e={}){let t=e.result??Ub(),n=e.homeDir??UH();return Hb({configPath:ar(n,".codex","hooks.json"),label:"Codex/hooks.json",result:t}),Hb({configPath:ar(n,".claude","settings.json"),label:"Claude/settings.json",result:t}),t}function Ub(){return{installed:[],updated:[],unchanged:[],removed:[],skipped:[]}}function JH(e=process.env){let t=e[qb];return t==="1"||t?.toLowerCase()==="true"||t?.toLowerCase()==="yes"}function XH(e=process.env){let t=e[Ju]?.toLowerCase();return t==="block"||t==="blocking"||t==="1"||t==="true"||t==="yes"?"block":t==="feedback"||t==="continue"?"feedback":"warn"}function Bb(e){if(!e.createRoot&&!Co(e.rootDir))return;let t=zb(e.configPath,e.label,e.result);if(!t)return;let n=QH(t,e.provider);if(JSON.stringify(n)===JSON.stringify(t)){e.result.unchanged.push(e.label);return}let i=Co(e.configPath);VH(zH(e.configPath),{recursive:!0}),Vb(e.configPath,`${JSON.stringify(n,null,2)}
|
|
892
|
+
`),e.result[i?"updated":"installed"].push(e.label)}function Hb(e){if(!Co(e.configPath))return;let t=zb(e.configPath,e.label,e.result);if(!t)return;let n=t.hooks&&typeof t.hooks=="object"&&!Array.isArray(t.hooks)?t.hooks:{},i={...n},r=!1;for(let s of["SessionStart","UserPromptSubmit","Stop"]){let a=Array.isArray(n[s])?n[s]:[],c=Wb(a);(c.length!==a.length||JSON.stringify(c)!==JSON.stringify(a))&&(r=!0,c.length>0?i[s]=c:delete i[s])}if(!r)return;let o={...t};Object.keys(i).length>0?o.hooks=i:delete o.hooks,Vb(e.configPath,`${JSON.stringify(o,null,2)}
|
|
893
|
+
`),e.result.removed.push(e.label)}function zb(e,t,n){if(!Co(e))return{};try{let i=JSON.parse(qH(e,"utf-8"));if(!i||typeof i!="object"||Array.isArray(i)){n.skipped.push({target:t,reason:"existing hook config is not a JSON object"});return}return i}catch(i){n.skipped.push({target:t,reason:`could not parse existing hook config: ${i instanceof Error?i.message:String(i)}`});return}}function QH(e,t){let n=e.hooks&&typeof e.hooks=="object"&&!Array.isArray(e.hooks)?e.hooks:{},i={...e,hooks:{...n}};for(let r of["SessionStart","UserPromptSubmit","Stop"]){let o=Array.isArray(n[r])?n[r]:[];i.hooks[r]=[...Wb(o),ZH(t,r)]}return i}function Wb(e){return e.map(t=>({...t,hooks:Array.isArray(t.hooks)?t.hooks.filter(n=>!YH(n)):[]})).filter(t=>t.hooks.length>0)}function YH(e){if(!e||typeof e!="object")return!1;let t=e.command;return typeof t=="string"&&(t.startsWith(WH)||t===GH)}function ZH(e,t){return t==="SessionStart"?{matcher:"startup|resume|clear|compact",hooks:[{type:"command",command:"scip-query hook-context",timeout:60,statusMessage:"Refreshing scip-query context"}]}:t==="UserPromptSubmit"?{hooks:[{type:"command",command:"scip-query hook-context",timeout:60,statusMessage:"Checking scip-query freshness"}]}:{hooks:[{type:"command",command:"scip-query hook-stop",timeout:30,statusMessage:"Running scip-query diff gate"}]}}async function Gb(){let e=await nV(So());e&&console.log(JSON.stringify(e))}function Kb(){let e=So();if(va(e))return;let t=Jb(e),n=Xb(t);!n||!Co(n.paths.dbPath)||cV(n,i=>{let r=no(i,{minTogether:6,skip:[]});r.findings.length!==0&&console.log(JSON.stringify(eV(r,XH())))})}function eV(e,t="warn"){let n=xo(e),i=tV(e);return t==="block"?{decision:"block",reason:n}:t==="feedback"?{hookSpecificOutput:{hookEventName:"Stop",additionalContext:`${i}
|
|
872
894
|
|
|
873
895
|
This is non-error Stop hook feedback. Fix true findings, or explain why a finding is intentionally accepted before finishing.`}}:{systemMessage:`${i}
|
|
874
896
|
|
|
875
|
-
Stop hook allowed this turn to finish. Review these findings when relevant. Set ${
|
|
876
|
-
`);if(s.trim())return{hookSpecificOutput:{hookEventName:n,additionalContext:s}}}async function
|
|
877
|
-
`)}function
|
|
878
|
-
`)}function
|
|
879
|
-
`,t),t}catch(i){return{...t,status:"failed",error:i instanceof Error?i.message:String(i)}}}function
|
|
880
|
-
`)}`}function BB(e){return e.health.issuesNeedAttention.length===0?["No prioritized health actions were reported."]:e.health.issuesNeedAttention.map(t=>`- ${t.category}: ${t.description} (${t.count}; impact ${t.impact}, effort ${t.effort}, evidence ${t.evidence}; confirmation ${t.confirmationStatus}; safe to start ${t.safeForAgentToStart?"yes":"no"}). ${t.recommendedNextStep}`)}function HB(e){let t=[...e.smokeTests.filter(n=>n.status!=="pass").map(n=>`- ${n.status.toUpperCase()} \`${n.command}\`: ${n.evidence}`),...e.indexerRemediation.filter(n=>!n.after.runnable).map(n=>`- BLOCKED ${n.language}: ${n.recovery??`Install ${n.binaryLabel}.`}`)];return t.length>0?t:["No blocked or unavailable setup checks were reported."]}function VB(e){return e.indexerRemediation.length===0?["All detected indexers were already runnable."]:e.indexerRemediation.map(t=>{let n=t.after.runnable?"READY":"BLOCKED",i=t.attempted?"install attempted":"no automatic install attempted";return`- ${n} ${t.language}: ${t.binaryLabel} (${i})`})}function qB(e){return e.health.score===null?`unavailable (${e.health.unavailableReason??"not checked"})`:`${e.health.score} (risk ${e.health.riskScore}, hygiene ${e.health.hygieneScore})`}function UB(e){return e.healthDossier?.jsonPath.replace(`${e.projectRoot}/`,"")??"docs/scip-query/health-dossier.json"}function Ey(e,t,n){if(AB(OB(e),{recursive:!0}),(_B(e)?$B(e,"utf-8"):null)===t){n.unchanged.push(e);return}MB(e,t),n.written.push(e)}async function My(e={}){let t=[],{projectRoot:n,config:i,paths:r,dbPath:o}=Hi(),s=eo();te(t,{id:"scip-cli",label:"scip CLI",status:s?"ok":"warn",message:s?"scip CLI is available.":"scip CLI is not available; reindex may attempt install."});let a=ea({quiet:!0});te(t,{id:"skills",label:"Agent skills",status:a.skipped.length>0?"warn":"ok",message:`${a.installed.length} installed, ${a.alreadyLinked.length} already linked, ${a.skipped.length} skipped.`,details:a.skipped.map(w=>`Skipped ${w}`)});let c=ji(i,{projectRoot:n}),l=c.filter(w=>w.level==="error");te(t,{id:"config",label:"Project config",status:l.length>0?"failed":c.length>0?"warn":"ok",message:c.length===0?"Config OK.":`${c.length} diagnostic(s), ${l.length} error(s).`,details:c.map(w=>`${w.level.toUpperCase()} ${w.path}: ${w.message}`)});let u=Bi(i);te(t,{id:"watch-refresh",label:"Watch refresh policy",status:u.autoRefresh===!1?"skipped":"ok",message:u.autoRefresh===!1?"Project hooks report freshness but do not auto-refresh stale indexes.":`Project hooks auto-refresh stale indexes; live watch defaults are ${u.debounceMs}ms debounce, ${u.cooldownMs}ms cooldown, and ${u.gitPollMs}ms Git polling.`});let d=Dt(n,i);te(t,{id:"readiness",label:"Indexer readiness",status:d.languages.length===0?"failed":d.indexers.some(w=>!w.runnable)?"warn":"ok",message:d.languages.length===0?"No supported project languages detected.":`Detected languages: ${d.languages.join(", ")}`,details:d.indexers.map(w=>`${w.runnable?"OK":w.installed?"WARN":"MISSING"} ${w.language}: ${w.binaryLabel}${w.note?` - ${w.note}`:""}`)});let m=e1(n,d,t),p=Dt(n,i),f=null;if(p.languages.length===0||l.length>0)te(t,{id:"reindex",label:"Index refresh",status:"skipped",message:p.languages.length===0?"Skipped because no supported languages were detected.":"Skipped because config validation has errors."});else{let w=[];try{f=await ln({projectRoot:n,languages:p.languages,outputScip:r.indexPath,outputDb:r.dbPath,pnpmWorkspaces:i.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:i.indexer?.typescript?.projectMode,typescriptProjects:i.indexer?.typescript?.projects,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:i.indexerConcurrency,trigger:{kind:"setup",detail:"scip-query setup"},onStatus:j=>w.push(j)}),te(t,{id:"reindex",label:"Index refresh",status:f.skipped.length>0?"warn":"ok",message:`${f.reused?"Reused":"Indexed"} ${f.languages.join(", ")} in ${(f.durationMs/1e3).toFixed(1)}s.`,details:[...w,...f.skipped.map(j=>`Skipped ${j.language}: ${j.reason}`)]})}catch(j){te(t,{id:"reindex",label:"Index refresh",status:"failed",message:na(j),details:w})}}let g=Dt(n,i),y=Qn(g),S=Kn(n,i,r);te(t,{id:"capabilities",label:"Capability matrix",status:o1(y),message:s1(y)});let R=await n1(r.dbPath,t),k=null;try{k=Zs(n),te(t,{id:"project-hooks",label:"Project agent hooks",status:k.skipped.length>0?"warn":"ok",message:`${k.installed.length} installed, ${k.updated.length} updated, ${k.unchanged.length} already configured, ${k.removed.length} legacy user hook config(s) cleaned up, ${k.skipped.length} skipped.`,details:[...k.removed.map(w=>`Removed legacy user-level ${w}`),...k.skipped.map(w=>`Skipped ${w.target}: ${w.reason}`)]})}catch(w){te(t,{id:"project-hooks",label:"Project agent hooks",status:"failed",message:na(w)})}let x=null;try{x=Ys(n,{gitHook:e.gitHook}),te(t,{id:"agent-guidance",label:"Project agent guidance",status:x.skipped.length>0?"warn":"ok",message:`${x.written.length} written, ${x.unchanged.length} already wired, ${x.skipped.length} skipped.`,details:x.skipped.map(w=>`Skipped ${w.target}: ${w.reason}`)})}catch(w){te(t,{id:"agent-guidance",label:"Project agent guidance",status:"failed",message:na(w)})}let b=zB({reindexResult:f,readiness:g,capabilities:y,freshness:S,health:R,hooksResult:k,agentResult:x,steps:t});te(t,{id:"smoke-tests",label:"Setup smoke tests",status:GB(b),message:JB(b),details:b.map(w=>`${w.command}: ${w.status} - ${w.evidence}`)});let C={projectRoot:n,dbPath:o,configuredDbPath:r.dbPath,scipCliInstalled:s,languages:g.languages,steps:t,skills:a,initialReadiness:d,indexerRemediation:m,readiness:g,capabilities:y,freshness:S,reindex:f,health:R,smokeTests:b,healthDossier:null,hooks:k,setupAgent:x,filesWritten:x?.written??[],verdict:$y(t,g)},D=Ty(C);return C.healthDossier=D,C.filesWritten=[...C.filesWritten,...D.written],te(t,{id:"health-dossier",label:"Health dossier",status:D.status==="failed"?"failed":"ok",message:D.status==="failed"?D.error:`${D.written.length} written, ${D.unchanged.length} unchanged.`,details:[D.markdownPath,D.jsonPath]}),C.verdict=$y(t,g),C}function Oy(e){if(console.log("scip-query setup"),console.log(`Project: ${e.projectRoot}`),console.log(`Verdict: ${e.verdict}`),console.log(`Health score: ${a1(e.health)}`),console.log(""),e.health.issuesNeedAttention.length===0)console.log("Items that need attention: none reported by the health pass.");else{console.log("Items that need attention:");for(let t of e.health.issuesNeedAttention)console.log(` - ${t.category}: ${t.description} (${t.count}; impact ${t.impact}, effort ${t.effort})`)}if(e.health.unavailableReason&&console.log(`Health pass: ${e.health.unavailableReason}`),e.health.warnings.length>0){console.log("Health warnings:");for(let t of e.health.warnings)console.log(` - ${t}`)}e.healthDossier&&console.log(`Health dossier: ${e.healthDossier.markdownPath}`),console.log(""),console.log("Setup steps:");for(let t of e.steps)console.log(` ${t.status.toUpperCase()} ${t.label}${t.message?` - ${t.message}`:""}`);console.log(""),console.log("Smoke tests:");for(let t of e.smokeTests)console.log(` ${t.status.toUpperCase()} ${t.command} - ${t.evidence}`);if(e.indexerRemediation.length>0){console.log(""),console.log("Indexer remediation:");for(let t of e.indexerRemediation){let n=t.after.runnable?"ready":"blocked",i=t.attempted?"attempted install":"manual action required";console.log(` - ${t.language}: ${n} (${i})`),t.recovery&&console.log(` ${t.recovery}`)}}}function zB(e){let t=e.steps.find(o=>o.id==="reindex"),n=e.steps.find(o=>o.id==="project-hooks"),i=e.steps.find(o=>o.id==="agent-guidance"),r=e.steps.find(o=>o.id==="watch-refresh");return[{id:"reindex",command:"scip-query reindex",status:e.reindexResult?"pass":t?.status==="failed"?"fail":"unavailable",evidence:e.reindexResult?`${e.reindexResult.languages.join(", ")} indexed${e.reindexResult.reused?" from cache":""}.`:t?.message??"No reindex result was produced."},{id:"status",command:"scip-query status",status:e.freshness.state==="missing"?"fail":"pass",evidence:`Index freshness is ${e.freshness.state}: ${e.freshness.reason}`},{id:"config-validate",command:"scip-query config-validate",status:KB(e.steps),evidence:QB(e.steps)},{id:"capabilities",command:"scip-query capabilities",status:e.capabilities.matrix.length>0?"pass":"unavailable",evidence:e.capabilities.matrix.length>0?`${e.capabilities.matrix.length} language capability row(s) available.`:"No detected languages produced capability rows."},{id:"capability-matrix",command:"scip-query capability-matrix --json",status:e.capabilities.matrix.length>0?"pass":"unavailable",evidence:e.capabilities.matrix.length>0?XB(e.capabilities):"No detected languages produced capability rows."},{id:"health",command:"scip-query health",status:e.health.score===null?"unavailable":"pass",evidence:e.health.score===null?e.health.unavailableReason??"Health report was not available.":`Health score ${e.health.score}.`},{id:"diff-impact",command:"scip-query diff-impact --json",status:Fy(e.readiness,e.freshness),evidence:_y(e.readiness,e.freshness)},{id:"diff-gate",command:"scip-query diff-gate --json",status:Fy(e.readiness,e.freshness),evidence:_y(e.readiness,e.freshness)},{id:"cleanup-verification",command:"scip-query cleanup-plan --verify",status:YB(e.capabilities),evidence:ZB(e.capabilities)},{id:"setup-hooks",command:"scip-query setup-hooks",status:e.hooksResult?"pass":n?.status==="failed"?"fail":"unavailable",evidence:e.hooksResult?`${e.hooksResult.installed.length} installed, ${e.hooksResult.updated.length} updated, ${e.hooksResult.unchanged.length} already configured.`:n?.message??"Project agent hooks were not configured."},{id:"watch-refresh",command:`printf %s '{"hook_event_name":"SessionStart"}' | scip-query hook-context`,status:r?.status==="ok"?"pass":"unavailable",evidence:r?.message??"Watch refresh policy was not evaluated."},{id:"setup-agent",command:"scip-query setup-agent",status:e.agentResult?"pass":i?.status==="failed"?"fail":"unavailable",evidence:e.agentResult?`${e.agentResult.written.length} written, ${e.agentResult.unchanged.length} already wired, ${e.agentResult.skipped.length} skipped.`:i?.message??"Project agent guidance was not written."}]}function GB(e){return e.some(t=>t.status==="fail")?"failed":e.some(t=>t.status==="unavailable")?"warn":"ok"}function JB(e){let t=e.filter(r=>r.status==="pass").length,n=e.filter(r=>r.status==="unavailable").length,i=e.filter(r=>r.status==="fail").length;return`${t} passed, ${n} unavailable, ${i} failed.`}function KB(e){return e.find(n=>n.id==="config")?.status==="failed"?"fail":"pass"}function QB(e){return e.find(n=>n.id==="config")?.message??"Config diagnostics were not produced."}function XB(e){let t=e.matrix.filter(n=>[n.indexing,n.sourceFacts,n.semantic,n.cleanupVerification].some(i=>i.status==="unavailable")).length;return`${e.matrix.length} language row(s), ${t} with unavailable capability cells.`}function Fy(e,t){return e.gitAvailable?t.state==="missing"?"fail":"pass":"unavailable"}function _y(e,t){if(!e.gitAvailable)return"Git is not available for this project.";let n=t.lastRefresh?` Last refresh: ${t.lastRefresh.result} by ${t.lastRefresh.trigger.kind} at ${t.lastRefresh.completedAt}.`:"";return`Git is available and index freshness is ${t.state}: ${t.reason}${n}`}function YB(e){let t=e.matrix.map(n=>n.cleanupVerification.status);return t.some(n=>n==="available")||t.some(n=>n==="partial")?"pass":"unavailable"}function ZB(e){if(e.matrix.length===0)return"No detected languages produced capability rows.";let t=e.matrix.filter(r=>r.cleanupVerification.status==="available").length,n=e.matrix.filter(r=>r.cleanupVerification.status==="partial").length,i=e.matrix.filter(r=>r.cleanupVerification.status==="unavailable").length;return`${t} available, ${n} partial, ${i} unavailable cleanup-verification row(s).`}function e1(e,t,n){let i=[];if(t.languages.length===0)return te(n,{id:"indexer-remediation",label:"Indexer remediation",status:"skipped",message:"Skipped because no supported languages were detected."}),i;for(let s of t.indexers){if(s.runnable)continue;let a=zn(s.language),c=[],l=!s.installed&&!!a.installMethods?.length,u=!1;l?u=Ws(a,m=>c.push(m)):s.installed?c.push(s.note??`${s.binaryLabel} is installed but is not runnable.`):a.installMethods?.length||c.push(`No auto-install method is configured for ${s.binaryLabel}.`);let d=t1(Us(a,e));i.push({language:s.language,binaryLabel:s.binaryLabel,attempted:l,installed:u,before:s,after:d,messages:c,recovery:d.runnable?void 0:d.note??d.installUrl??`Install ${s.binaryLabel} and put it on PATH.`})}if(i.length===0)return te(n,{id:"indexer-remediation",label:"Indexer remediation",status:"ok",message:"All detected indexers are runnable."}),i;let r=i.filter(s=>!s.after.runnable),o=i.filter(s=>s.attempted);return te(n,{id:"indexer-remediation",label:"Indexer remediation",status:r.length>0?"warn":"ok",message:r.length===0?`${o.length} install attempt(s); all detected indexers are runnable.`:`${o.length} install attempt(s); ${r.length} indexer(s) still blocked.`,details:i.flatMap(s=>[`${s.language}: ${s.after.runnable?"ready":"blocked"}`,...s.messages])}),i}function t1(e){return{...e,resolvedBinary:e.resolvedBinary??void 0}}async function n1(e,t){if(!WB(e)){let n="Skipped because no SQLite index database exists yet.";return te(t,{id:"health",label:"Health audit",status:"skipped",message:n}),Ay(n)}try{let n=await $s({full:!0,json:!0});return te(t,{id:"health",label:"Health audit",status:"ok",message:`Health score ${n.score}. ${n.actions.length} prioritized action(s).`}),i1(n)}catch(n){let i=na(n);return te(t,{id:"health",label:"Health audit",status:"failed",message:i}),Ay(i)}}function i1(e){return{score:e.score,riskScore:e.riskScore,hygieneScore:e.hygieneScore,issuesNeedAttention:e.actions.map(r1),warnings:e.warnings??[]}}function r1(e){return{category:e.category,description:e.description,count:e.count,impact:e.impact,effort:e.effort,evidence:e.evidence,locRecoverable:e.locRecoverable,confirmationStatus:"unconfirmed",safeForAgentToStart:!1,recommendedNextStep:"Run scip-health-audit to confirm this signal; use scip-health-improve when the user wants confirmed issues fixed autonomously."}}function Ay(e){return{score:null,riskScore:null,hygieneScore:null,issuesNeedAttention:[],warnings:[],unavailableReason:e}}function $y(e,t){return e.some(n=>n.status==="failed")?"blocked":t.indexers.some(n=>!n.runnable)||e.some(n=>n.status==="warn"||n.status==="skipped")?"partial":"ready"}function o1(e){let t=e.matrix.flatMap(n=>[n.indexing.status,n.sourceFacts.status,n.semantic.status,n.cleanupVerification.status]);return t.some(n=>n==="unavailable")||t.some(n=>n==="partial")?"warn":"ok"}function s1(e){return e.matrix.length===0?"No language capability rows.":`${e.matrix.filter(n=>n.indexing.status==="available").length}/${e.matrix.length} language(s) have available indexing.`}function a1(e){return e.score===null?`unavailable (${e.unavailableReason??"not checked"})`:`${e.score} (risk ${e.riskScore}, hygiene ${e.hygieneScore})`}function te(e,t){e.push({...t,details:t.details?.filter(n=>n.trim()!=="")})}function na(e){return e instanceof Error?e.message:String(e)}import{existsSync as c1,mkdirSync as l1,writeFileSync as u1}from"fs";import{dirname as d1,join as m1}from"path";function jy(e,t={}){let n=m1(e,".github","workflows","scip-query.yml"),i=p1();return c1(n)&&!t.force?{path:n,written:!1,skipped:!0,content:i,reason:"Workflow already exists. Re-run with --force to overwrite."}:(t.dryRun||(l1(d1(n),{recursive:!0}),u1(n,i)),{path:n,written:!t.dryRun,skipped:!1,content:i})}function p1(){return`name: scip-query
|
|
897
|
+
Stop hook allowed this turn to finish. Review these findings when relevant. Set ${Ju}=feedback to ask the agent to continue without a hook error, or ${Ju}=block to enforce the gate.`}}function tV(e){return xo(e).replace(" \u2014 fix or knowingly accept them before finishing:"," \u2014 review these findings when relevant:")}async function nV(e){let t=Jb(e),n=sV(t);if(n!=="SessionStart"&&n!=="UserPromptSubmit")return;let i=Xb(t);if(!i)return;let r=await iV(i),o=n==="SessionStart"?rV(i.projectRoot,i.config,i.paths):oV(String(t.prompt??"")),s=[r,o].filter(a=>!!a?.trim()).join(`
|
|
898
|
+
`);if(s.trim())return{hookSpecificOutput:{hookEventName:n,additionalContext:s}}}async function iV(e){if(Zi(e.config).autoRefresh===!1)return;let n=Rn(e.projectRoot,e.config,e.paths);if(n.state!=="fresh")try{let i=await vn({projectRoot:e.projectRoot,languages:e.config.languages,outputScip:e.paths.indexPath,outputDb:e.paths.dbPath,pnpmWorkspaces:e.config.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:e.config.indexer?.typescript?.projectMode,typescriptProjects:e.config.indexer?.typescript?.projects,clojureConfigPath:e.config.indexer?.clojure?.configPath,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:e.config.indexerConcurrency,trigger:{kind:"manual-cli",detail:"agent hook auto-refresh"},onStatus:()=>{}});return`scip-query auto-refresh: ${i.reused?"reused":"indexed"} ${i.languages.join(", ")} because the index was ${n.state}.`}catch(i){let r=i instanceof Error?i.message:String(i);return`scip-query auto-refresh skipped: index is ${n.state}, but refresh failed: ${r}`}}function rV(e,t,n){let i=Rn(e,t,n),r=Ot(e,t),s=mi(r).capabilities.filter(c=>c.status!=="available").map(c=>c.label),a=r.languages.length>0?r.languages.join(", "):"none detected";return[`scip-query is available in this repository. Index state: ${i.state} (${i.reason})`,i.lastRefresh?`Last refresh: ${i.lastRefresh.result} by ${i.lastRefresh.trigger.kind} at ${i.lastRefresh.completedAt}.`:void 0,`Detected languages: ${a}.`,s.length>0?`Unavailable or partial capabilities: ${s.join(", ")}.`:"Core capabilities are available.","Use the scip-query router skill when exploring, planning, verifying, debugging, diagramming, or cleaning up code.","For non-trivial edits, plan with concrete-plan anchored by `scip-query plan-context <target>`, then verify with scip-verify."].filter(c=>c!==void 0).join(`
|
|
899
|
+
`)}function oV(e){let t=e.toLowerCase(),n=[];return pi(t,["debug","bug","regression","failing","fails","error","wrong"])&&n.push("Debug or bug request: use scip-debug. For issue-quality triage, use scip-triage-issue."),pi(t,["explain","how does","walk me through","trace","understand"])&&n.push("Exploration request: use scip-explore before answering behavioral questions."),pi(t,["diagram","visualize","visualise","flow map","architecture map"])&&n.push("Diagram request: use scip-diagram and back every node and edge with scip-query evidence."),pi(t,["implement","build","change","refactor","fix","add ","update "])&&n.push("Implementation request: plan first with concrete-plan and `scip-query plan-context <target>`, then verify with scip-verify."),pi(t,["review","maintainability","architecture","boundary"])&&n.push("Review request: use scip-maintainability, scip-api-impact, or scip-verify depending on whether this is architecture, API impact, or post-change verification."),pi(t,["setup","adopt","install","bootstrap"])&&n.push("Setup request: use scip-adoption or scip-query-setup; keep CI setup out of the default path."),pi(t,["health","score","dossier","cleanup","dead code","duplicate","debloat","perfect code","as high as","maximize","maximise"])&&n.push("Health or cleanup request: use scip-health-audit before editing; use scip-health-improve when the user wants the score raised as high as reasonably possible."),n.length===0?"":["scip-query routing reminder:",...n].join(`
|
|
900
|
+
`)}function pi(e,t){return t.some(n=>e.includes(n))}function Jb(e){if(!e.trim())return{};try{let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function sV(e){let t=e.hook_event_name??e.hookEventName;return typeof t=="string"?t:void 0}function Xb(e){let t=typeof e.cwd=="string"?e.cwd:process.cwd(),n=aV(t);if(n)try{let i=Ue(n),r=Mt(n,i);return{projectRoot:n,config:i,paths:r}}catch{return}}function aV(e){try{return HH("git",["-C",e,"rev-parse","--show-toplevel"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function cV(e,t){let n={dbPath:e.paths.dbPath,indexPath:e.paths.indexPath,projectRoot:e.projectRoot,entryRoots:e.config.entryRoots,semantic:e.config.semantic,suppressions:e.config.suppressions,declaredCouplings:e.config.declaredCouplings,locality:e.config.locality},i=new Xi(n,Cn(e.projectRoot));try{return t(i)}finally{i.close()}}import{existsSync as Xu,mkdirSync as lV,symlinkSync as uV,readlinkSync as dV,unlinkSync as mV}from"fs";import{join as vo,dirname as Qb,resolve as Qu}from"path";import{homedir as Yu,platform as pV}from"os";import{fileURLToPath as fV}from"url";var gV=pV()==="win32",Zu=["scip-query","scip-query-setup","scip-adoption","scip-health-audit","scip-health-improve","scip-hyper-optimization","scip-api-impact","concrete-plan","scip-ai-cleanup","scip-debug","scip-explore","scip-triage-issue","scip-diagram","scip-debloat","scip-doc-reconcile","scip-directory-architecture","scip-maintainability","scip-react-maintainability","scip-vue-maintainability","scip-verify","scip-language-playbook"];function wa(e={}){let t=e.quiet?()=>{}:console.log,n=fV(import.meta.url),i=Qu(Qb(n),"..","skills"),r=[vo(Yu(),".claude","skills"),vo(Yu(),".codex","skills"),vo(Yu(),".agents","skills")],o={installed:[],skipped:[],alreadyLinked:[]};for(let s of r){let a=Qb(s);if(!Xu(a))continue;lV(s,{recursive:!0});let c=hV(s);for(let l of Zu){let d=vo(i,l),u=vo(s,l);if(!Xu(d)){o.skipped.push(`${c}/${l}`);continue}if(Xu(u)){try{let m=dV(u);if(Qu(m)===Qu(d)){o.alreadyLinked.push(`${c}/${l}`),t(` ok: ${l} \u2192 ${c} (already linked)`);continue}}catch{o.skipped.push(`${c}/${l}`),t(` skip: ${l} \u2192 ${c} (exists, not a symlink)`);continue}mV(u)}uV(d,u,gV?"junction":"dir"),o.installed.push(`${c}/${l}`),t(` done: ${l} \u2192 ${c}`)}}return o}function hV(e){return e.includes(".codex")?"Codex":e.includes(".agents")?"Agents":"Claude"}import{spawnSync as yS}from"child_process";import{existsSync as gi,renameSync as gS,rmSync as aq}from"fs";import{dirname as cq,extname as lq}from"path";import{execFileSync as yV,fork as bV}from"child_process";import{statSync as SV,watch as xV}from"fs";import{join as CV,relative as vV}from"path";import RV from"ignore";var Pa=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=Zi(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??(n=>console.error(n.message)),this.gitignoreFilter=Cn(t.projectRoot),this.extraIgnore=RV(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"}),this.startGitStatePolling();try{let t=xV(this.projectRoot,{recursive:!0},(n,i)=>{i&&!this.stopped&&this.handleFileChange(i)});this.fsWatchers.push(t)}catch{this.onError(new Error("Failed to start file watcher. On Linux, you may need to increase inotify limits: sysctl -w fs.inotify.max_user_watches=524288"))}}stop(){this.stopped=!0;for(let t of this.fsWatchers)t.close();this.fsWatchers=[],this.clearDebounceTimer(),this.clearCooldownTimer(),this.clearGitPollTimer(),this.setStatus({state:"idle"})}handleFileChange(t){let n=vV(this.projectRoot,CV(this.projectRoot,t));n===".git"||n.startsWith(".git/")||this.gitignoreFilter.isIgnored(n)||this.extraIgnore.ignores(n)||t.endsWith("index.db")||t.endsWith("index.scip")||t.endsWith("index.db.tmp")||this.scheduleReindex({kind:"watch-source",detail:n})}scheduleReindex(t){if(this.pendingTrigger=kV(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 n=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:n}),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 n=this.pendingTrigger??{kind:"watch-source"};this.pendingTrigger=null;let i=Date.now();this.setStatus({state:"indexing",startedAt:i}),this.runReindex(n).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((n,i)=>{let r=Date.now(),o=Ue(this.projectRoot),s=Object.keys(o).length>0?o:this.config,a=Mt(this.projectRoot,s),c=s.indexer?.typescript,l=s.indexer?.clojure,d=bV(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:t.kind,SCIP_REINDEX_TRIGGER_DETAIL:t.detail??""},stdio:"pipe"});d.on("exit",u=>{u===0?n(Date.now()-r):i(new Error(`Reindex worker exited with code ${u}`))}),d.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,n=this.readGitState();if(!t||!n||this.stopped){this.lastGitState=n;return}this.lastGitState=n;let i=t.head!==n.head,r=t.indexPath!==n.indexPath||t.indexMtimeMs!==n.indexMtimeMs||t.indexSize!==n.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:n.indexPath??"index changed"})}readGitState(){let t=Yb(this.projectRoot,["rev-parse","--git-path","index"]);if(!t)return null;let n={head:Yb(this.projectRoot,["rev-parse","--verify","HEAD"]),indexPath:t};try{let i=SV(t);n.indexMtimeMs=i.mtimeMs,n.indexSize=i.size}catch{n.indexMtimeMs=void 0,n.indexSize=void 0}return n}clearGitPollTimer(){this.gitPollTimer&&(clearInterval(this.gitPollTimer),this.gitPollTimer=null)}};function Yb(e,t){try{return yV("git",["-C",e,...t],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return}}function kV(e,t){return e?e.kind===t.kind?e.detail===t.detail?e:{kind:e.kind,detail:"multiple changes"}:{kind:"watch-git-state",detail:`${e.kind}, ${t.kind}`}:t}import{existsSync as MV}from"fs";import{existsSync as wV,mkdirSync as PV,readFileSync as IV,writeFileSync as LV}from"fs";import{dirname as DV,join as Zb}from"path";function tS(e){let t={markdownPath:Zb(e.projectRoot,"docs","scip-query","health-dossier.md"),jsonPath:Zb(e.projectRoot,"docs","scip-query","health-dossier.json"),status:"written",written:[],unchanged:[]},n={...e,healthDossier:t};try{return eS(t.markdownPath,EV(n),t),eS(t.jsonPath,`${JSON.stringify(n,null,2)}
|
|
901
|
+
`,t),t}catch(i){return{...t,status:"failed",error:i instanceof Error?i.message:String(i)}}}function EV(e){return`${["# scip-query Health Dossier","",`Generated: ${new Date().toISOString()}`,`Project: ${e.projectRoot}`,`Setup verdict: ${e.verdict}`,`Health score: ${_V(e)}`,"","## Items That Need Attention","",...NV(e),"","## Blocked Or Unavailable Checks","",...FV(e),"","## Setup Smoke Tests","",...e.smokeTests.map(n=>`- ${n.status.toUpperCase()} \`${n.command}\`: ${n.evidence}`),"","## Setup Steps","",...e.steps.map(n=>`- ${n.status.toUpperCase()} ${n.label}${n.message?`: ${n.message}`:""}`),"","## Indexer Remediation","",...TV(e),"","## JSON","",`Machine-readable report: \`${AV(e)}\``,""].join(`
|
|
902
|
+
`)}`}function NV(e){return e.health.issuesNeedAttention.length===0?["No prioritized health actions were reported."]:e.health.issuesNeedAttention.map(t=>`- ${t.category}: ${t.description} (${t.count}; impact ${t.impact}, effort ${t.effort}, evidence ${t.evidence}; confirmation ${t.confirmationStatus}; safe to start ${t.safeForAgentToStart?"yes":"no"}). ${t.recommendedNextStep}`)}function FV(e){let t=[...e.smokeTests.filter(n=>n.status!=="pass").map(n=>`- ${n.status.toUpperCase()} \`${n.command}\`: ${n.evidence}`),...e.indexerRemediation.filter(n=>!n.after.runnable).map(n=>`- BLOCKED ${n.language}: ${n.recovery??`Install ${n.binaryLabel}.`}`)];return t.length>0?t:["No blocked or unavailable setup checks were reported."]}function TV(e){return e.indexerRemediation.length===0?["All detected indexers were already runnable."]:e.indexerRemediation.map(t=>{let n=t.after.runnable?"READY":"BLOCKED",i=t.attempted?"install attempted":"no automatic install attempted";return`- ${n} ${t.language}: ${t.binaryLabel} (${i})`})}function _V(e){return e.health.score===null?`unavailable (${e.health.unavailableReason??"not checked"})`:`${e.health.score} (risk ${e.health.riskScore}, hygiene ${e.health.hygieneScore})`}function AV(e){return e.healthDossier?.jsonPath.replace(`${e.projectRoot}/`,"")??"docs/scip-query/health-dossier.json"}function eS(e,t,n){if(PV(DV(e),{recursive:!0}),(wV(e)?IV(e,"utf-8"):null)===t){n.unchanged.push(e);return}LV(e,t),n.written.push(e)}async function sS(e={}){let t=[],{projectRoot:n,config:i,paths:r,dbPath:o}=ai(),s=fo();ce(t,{id:"scip-cli",label:"scip CLI",status:s?"ok":"warn",message:s?"scip CLI is available.":"scip CLI is not available; reindex may attempt install."});let a=wa({quiet:!0});ce(t,{id:"skills",label:"Agent skills",status:a.skipped.length>0?"warn":"ok",message:`${a.installed.length} installed, ${a.alreadyLinked.length} already linked, ${a.skipped.length} skipped.`,details:a.skipped.map(k=>`Skipped ${k}`)});let c=Yi(i,{projectRoot:n}),l=c.filter(k=>k.level==="error");ce(t,{id:"config",label:"Project config",status:l.length>0?"failed":c.length>0?"warn":"ok",message:c.length===0?"Config OK.":`${c.length} diagnostic(s), ${l.length} error(s).`,details:c.map(k=>`${k.level.toUpperCase()} ${k.path}: ${k.message}`)});let d=Zi(i);ce(t,{id:"watch-refresh",label:"Watch refresh policy",status:d.autoRefresh===!1?"skipped":"ok",message:d.autoRefresh===!1?"Project hooks report freshness but do not auto-refresh stale indexes.":`Project hooks auto-refresh stale indexes; live watch defaults are ${d.debounceMs}ms debounce, ${d.cooldownMs}ms cooldown, and ${d.gitPollMs}ms Git polling.`});let u=Ot(n,i);ce(t,{id:"readiness",label:"Indexer readiness",status:u.languages.length===0?"failed":u.indexers.some(k=>!k.runnable)?"warn":"ok",message:u.languages.length===0?"No supported project languages detected.":`Detected languages: ${u.languages.join(", ")}`,details:u.indexers.map(k=>`${k.runnable?"OK":k.installed?"WARN":"MISSING"} ${k.language}: ${k.binaryLabel}${k.note?` - ${k.note}`:""}`)});let m=zV(n,u,t),p=Ot(n,i),f=null;if(p.languages.length===0||l.length>0)ce(t,{id:"reindex",label:"Index refresh",status:"skipped",message:p.languages.length===0?"Skipped because no supported languages were detected.":"Skipped because config validation has errors."});else{let k=[];try{f=await vn({projectRoot:n,languages:p.languages,outputScip:r.indexPath,outputDb:r.dbPath,pnpmWorkspaces:i.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:i.indexer?.typescript?.projectMode,typescriptProjects:i.indexer?.typescript?.projects,clojureConfigPath:i.indexer?.clojure?.configPath,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:i.indexerConcurrency,trigger:{kind:"setup",detail:"scip-query setup"},onStatus:T=>k.push(T)}),ce(t,{id:"reindex",label:"Index refresh",status:f.skipped.length>0?"warn":"ok",message:`${f.reused?"Reused":"Indexed"} ${f.languages.join(", ")} in ${(f.durationMs/1e3).toFixed(1)}s.`,details:[...k,...f.skipped.map(T=>`Skipped ${T.language}: ${T.reason}`)]})}catch(T){ce(t,{id:"reindex",label:"Index refresh",status:"failed",message:Ia(T),details:k})}}let g=Ot(n,i),b=mi(g),x=Rn(n,i,r);ce(t,{id:"capabilities",label:"Capability matrix",status:XV(b),message:QV(b)});let S=await GV(r.dbPath,t),R=null;try{R=ka(n),ce(t,{id:"project-hooks",label:"Project agent hooks",status:R.skipped.length>0?"warn":"ok",message:`${R.installed.length} installed, ${R.updated.length} updated, ${R.unchanged.length} already configured, ${R.removed.length} legacy user hook config(s) cleaned up, ${R.skipped.length} skipped.`,details:[...R.removed.map(k=>`Removed legacy user-level ${k}`),...R.skipped.map(k=>`Skipped ${k.target}: ${k.reason}`)]})}catch(k){ce(t,{id:"project-hooks",label:"Project agent hooks",status:"failed",message:Ia(k)})}let C=null;try{C=Ra(n,{gitHook:e.gitHook}),ce(t,{id:"agent-guidance",label:"Project agent guidance",status:C.skipped.length>0?"warn":"ok",message:`${C.written.length} written, ${C.unchanged.length} already wired, ${C.skipped.length} skipped.`,details:C.skipped.map(k=>`Skipped ${k.target}: ${k.reason}`)})}catch(k){ce(t,{id:"agent-guidance",label:"Project agent guidance",status:"failed",message:Ia(k)})}let y=$V({reindexResult:f,readiness:g,capabilities:b,freshness:x,health:S,hooksResult:R,agentResult:C,steps:t});ce(t,{id:"smoke-tests",label:"Setup smoke tests",status:jV(y),message:OV(y),details:y.map(k=>`${k.command}: ${k.status} - ${k.evidence}`)});let w={projectRoot:n,dbPath:o,configuredDbPath:r.dbPath,scipCliInstalled:s,languages:g.languages,steps:t,skills:a,initialReadiness:u,indexerRemediation:m,readiness:g,capabilities:b,freshness:x,reindex:f,health:S,smokeTests:y,healthDossier:null,hooks:R,setupAgent:C,filesWritten:C?.written??[],verdict:oS(t,g)},L=tS(w);return w.healthDossier=L,w.filesWritten=[...w.filesWritten,...L.written],ce(t,{id:"health-dossier",label:"Health dossier",status:L.status==="failed"?"failed":"ok",message:L.status==="failed"?L.error:`${L.written.length} written, ${L.unchanged.length} unchanged.`,details:[L.markdownPath,L.jsonPath]}),w.verdict=oS(t,g),w}function aS(e){if(console.log("scip-query setup"),console.log(`Project: ${e.projectRoot}`),console.log(`Verdict: ${e.verdict}`),console.log(`Health score: ${YV(e.health)}`),console.log(""),e.health.issuesNeedAttention.length===0)console.log("Items that need attention: none reported by the health pass.");else{console.log("Items that need attention:");for(let t of e.health.issuesNeedAttention)console.log(` - ${t.category}: ${t.description} (${t.count}; impact ${t.impact}, effort ${t.effort})`)}if(e.health.unavailableReason&&console.log(`Health pass: ${e.health.unavailableReason}`),e.health.warnings.length>0){console.log("Health warnings:");for(let t of e.health.warnings)console.log(` - ${t}`)}e.healthDossier&&console.log(`Health dossier: ${e.healthDossier.markdownPath}`),console.log(""),console.log("Setup steps:");for(let t of e.steps)console.log(` ${t.status.toUpperCase()} ${t.label}${t.message?` - ${t.message}`:""}`);console.log(""),console.log("Smoke tests:");for(let t of e.smokeTests)console.log(` ${t.status.toUpperCase()} ${t.command} - ${t.evidence}`);if(e.indexerRemediation.length>0){console.log(""),console.log("Indexer remediation:");for(let t of e.indexerRemediation){let n=t.after.runnable?"ready":"blocked",i=t.attempted?"attempted install":"manual action required";console.log(` - ${t.language}: ${n} (${i})`),t.recovery&&console.log(` ${t.recovery}`)}}}function $V(e){let t=e.steps.find(o=>o.id==="reindex"),n=e.steps.find(o=>o.id==="project-hooks"),i=e.steps.find(o=>o.id==="agent-guidance"),r=e.steps.find(o=>o.id==="watch-refresh");return[{id:"reindex",command:"scip-query reindex",status:e.reindexResult?"pass":t?.status==="failed"?"fail":"unavailable",evidence:e.reindexResult?`${e.reindexResult.languages.join(", ")} indexed${e.reindexResult.reused?" from cache":""}.`:t?.message??"No reindex result was produced."},{id:"status",command:"scip-query status",status:e.freshness.state==="missing"?"fail":"pass",evidence:`Index freshness is ${e.freshness.state}: ${e.freshness.reason}`},{id:"config-validate",command:"scip-query config-validate",status:BV(e.steps),evidence:HV(e.steps)},{id:"capabilities",command:"scip-query capabilities",status:e.capabilities.matrix.length>0?"pass":"unavailable",evidence:e.capabilities.matrix.length>0?`${e.capabilities.matrix.length} language capability row(s) available.`:"No detected languages produced capability rows."},{id:"capability-matrix",command:"scip-query capability-matrix --json",status:e.capabilities.matrix.length>0?"pass":"unavailable",evidence:e.capabilities.matrix.length>0?VV(e.capabilities):"No detected languages produced capability rows."},{id:"health",command:"scip-query health",status:e.health.score===null?"unavailable":"pass",evidence:e.health.score===null?e.health.unavailableReason??"Health report was not available.":`Health score ${e.health.score}.`},{id:"diff-impact",command:"scip-query diff-impact --json",status:nS(e.readiness,e.freshness),evidence:iS(e.readiness,e.freshness)},{id:"diff-gate",command:"scip-query diff-gate --json",status:nS(e.readiness,e.freshness),evidence:iS(e.readiness,e.freshness)},{id:"cleanup-verification",command:"scip-query cleanup-plan --verify",status:qV(e.capabilities),evidence:UV(e.capabilities)},{id:"setup-hooks",command:"scip-query setup-hooks",status:e.hooksResult?"pass":n?.status==="failed"?"fail":"unavailable",evidence:e.hooksResult?`${e.hooksResult.installed.length} installed, ${e.hooksResult.updated.length} updated, ${e.hooksResult.unchanged.length} already configured.`:n?.message??"Project agent hooks were not configured."},{id:"watch-refresh",command:`printf %s '{"hook_event_name":"SessionStart"}' | scip-query hook-context`,status:r?.status==="ok"?"pass":"unavailable",evidence:r?.message??"Watch refresh policy was not evaluated."},{id:"setup-agent",command:"scip-query setup-agent",status:e.agentResult?"pass":i?.status==="failed"?"fail":"unavailable",evidence:e.agentResult?`${e.agentResult.written.length} written, ${e.agentResult.unchanged.length} already wired, ${e.agentResult.skipped.length} skipped.`:i?.message??"Project agent guidance was not written."}]}function jV(e){return e.some(t=>t.status==="fail")?"failed":e.some(t=>t.status==="unavailable")?"warn":"ok"}function OV(e){let t=e.filter(r=>r.status==="pass").length,n=e.filter(r=>r.status==="unavailable").length,i=e.filter(r=>r.status==="fail").length;return`${t} passed, ${n} unavailable, ${i} failed.`}function BV(e){return e.find(n=>n.id==="config")?.status==="failed"?"fail":"pass"}function HV(e){return e.find(n=>n.id==="config")?.message??"Config diagnostics were not produced."}function VV(e){let t=e.matrix.filter(n=>[n.indexing,n.sourceFacts,n.semantic,n.cleanupVerification].some(i=>i.status==="unavailable")).length;return`${e.matrix.length} language row(s), ${t} with unavailable capability cells.`}function nS(e,t){return e.gitAvailable?t.state==="missing"?"fail":"pass":"unavailable"}function iS(e,t){if(!e.gitAvailable)return"Git is not available for this project.";let n=t.lastRefresh?` Last refresh: ${t.lastRefresh.result} by ${t.lastRefresh.trigger.kind} at ${t.lastRefresh.completedAt}.`:"";return`Git is available and index freshness is ${t.state}: ${t.reason}${n}`}function qV(e){let t=e.matrix.map(n=>n.cleanupVerification.status);return t.some(n=>n==="available")||t.some(n=>n==="partial")?"pass":"unavailable"}function UV(e){if(e.matrix.length===0)return"No detected languages produced capability rows.";let t=e.matrix.filter(r=>r.cleanupVerification.status==="available").length,n=e.matrix.filter(r=>r.cleanupVerification.status==="partial").length,i=e.matrix.filter(r=>r.cleanupVerification.status==="unavailable").length;return`${t} available, ${n} partial, ${i} unavailable cleanup-verification row(s).`}function zV(e,t,n){let i=[];if(t.languages.length===0)return ce(n,{id:"indexer-remediation",label:"Indexer remediation",status:"skipped",message:"Skipped because no supported languages were detected."}),i;for(let s of t.indexers){if(s.runnable)continue;let a=li(s.language),c=[],l=!s.installed&&!!a.installMethods?.length,d=!1;l?d=ga(a,m=>c.push(m)):s.installed?c.push(s.note??`${s.binaryLabel} is installed but is not runnable.`):a.installMethods?.length||c.push(`No auto-install method is configured for ${s.binaryLabel}.`);let u=WV(fa(a,e));i.push({language:s.language,binaryLabel:s.binaryLabel,attempted:l,installed:d,before:s,after:u,messages:c,recovery:u.runnable?void 0:u.note??u.installUrl??`Install ${s.binaryLabel} and put it on PATH.`})}if(i.length===0)return ce(n,{id:"indexer-remediation",label:"Indexer remediation",status:"ok",message:"All detected indexers are runnable."}),i;let r=i.filter(s=>!s.after.runnable),o=i.filter(s=>s.attempted);return ce(n,{id:"indexer-remediation",label:"Indexer remediation",status:r.length>0?"warn":"ok",message:r.length===0?`${o.length} install attempt(s); all detected indexers are runnable.`:`${o.length} install attempt(s); ${r.length} indexer(s) still blocked.`,details:i.flatMap(s=>[`${s.language}: ${s.after.runnable?"ready":"blocked"}`,...s.messages])}),i}function WV(e){return{...e,resolvedBinary:e.resolvedBinary??void 0}}async function GV(e,t){if(!MV(e)){let n="Skipped because no SQLite index database exists yet.";return ce(t,{id:"health",label:"Health audit",status:"skipped",message:n}),rS(n)}try{let n=await oa({full:!0,json:!0});return ce(t,{id:"health",label:"Health audit",status:"ok",message:`Health score ${n.score}. ${n.actions.length} prioritized action(s).`}),KV(n)}catch(n){let i=Ia(n);return ce(t,{id:"health",label:"Health audit",status:"failed",message:i}),rS(i)}}function KV(e){return{score:e.score,riskScore:e.riskScore,hygieneScore:e.hygieneScore,issuesNeedAttention:e.actions.map(JV),warnings:e.warnings??[]}}function JV(e){return{category:e.category,description:e.description,count:e.count,impact:e.impact,effort:e.effort,evidence:e.evidence,locRecoverable:e.locRecoverable,confirmationStatus:"unconfirmed",safeForAgentToStart:!1,recommendedNextStep:"Run scip-health-audit to confirm this signal; use scip-health-improve when the user wants confirmed issues fixed autonomously."}}function rS(e){return{score:null,riskScore:null,hygieneScore:null,issuesNeedAttention:[],warnings:[],unavailableReason:e}}function oS(e,t){return e.some(n=>n.status==="failed")?"blocked":t.indexers.some(n=>!n.runnable)||e.some(n=>n.status==="warn"||n.status==="skipped")?"partial":"ready"}function XV(e){let t=e.matrix.flatMap(n=>[n.indexing.status,n.sourceFacts.status,n.semantic.status,n.cleanupVerification.status]);return t.some(n=>n==="unavailable")||t.some(n=>n==="partial")?"warn":"ok"}function QV(e){return e.matrix.length===0?"No language capability rows.":`${e.matrix.filter(n=>n.indexing.status==="available").length}/${e.matrix.length} language(s) have available indexing.`}function YV(e){return e.score===null?`unavailable (${e.unavailableReason??"not checked"})`:`${e.score} (risk ${e.riskScore}, hygiene ${e.hygieneScore})`}function ce(e,t){e.push({...t,details:t.details?.filter(n=>n.trim()!=="")})}function Ia(e){return e instanceof Error?e.message:String(e)}import{existsSync as ZV,mkdirSync as eq,writeFileSync as tq}from"fs";import{dirname as nq,join as iq}from"path";function cS(e,t={}){let n=iq(e,".github","workflows","scip-query.yml"),i=rq();return ZV(n)&&!t.force?{path:n,written:!1,skipped:!0,content:i,reason:"Workflow already exists. Re-run with --force to overwrite."}:(t.dryRun||(eq(nq(n),{recursive:!0}),tq(n,i)),{path:n,written:!t.dryRun,skipped:!1,content:i})}function rq(){return`name: scip-query
|
|
881
903
|
|
|
882
904
|
on:
|
|
883
905
|
pull_request:
|
|
@@ -895,47 +917,47 @@ jobs:
|
|
|
895
917
|
- run: npm ci
|
|
896
918
|
- run: npx scip-query reindex
|
|
897
919
|
- run: npx scip-query diff-gate --base "origin/\${{ github.base_ref }}"
|
|
898
|
-
`}var By=Symbol("option-value-source");function Y(e){return(...t)=>{let{args:n,opts:i}=g1(t);rt(r=>e({db:r,args:n,opts:i}))}}function ne(e,t){return Y(n=>{let i=As(n.db,e,I(n.opts,"full"),{quiet:I(n.opts,"json")});t({...n,budget:i})})}function Hy(e){return Y(t=>Ji(t,e,{kind:"list"}))}function Vy(e){return Y(t=>Ji(t,e,{kind:"table",headers:e.headers,dashWidths:e.dashWidths}))}function qy(e){return Y(t=>Ji(t,e,{kind:"grouped",key:e.key}))}function Yn(e){return Y(t=>bu(t,e))}function Uy(e){return Yn({commandName:e.commandName,query:e.query,emptyMessage:e.emptyMessage,heuristicLabel:e.heuristicLabel,before:e.before,render:(t,n)=>N.sectionedReport(e.sections(t,n)),toJson:e.toJson,after:e.after})}function st(e,t){return ne(e,n=>bu(n,{...t,commandName:t.commandName??e}))}function Wy(e,t){return st(e,{commandName:t.commandName??e,query:t.query,emptyMessage:t.emptyMessage,heuristicLabel:t.heuristicLabel,before:t.before,render:(n,i)=>N.sectionedReport(t.sections(n,i)),toJson:t.toJson,after:t.after})}function Bt(e,t){return ne(e,n=>Ji(n,{...t,commandName:e},{kind:"list"}))}function ia(e,t){return ne(e,n=>Ji(n,{...t,commandName:e},{kind:"table",headers:t.headers,dashWidths:t.dashWidths}))}function ra(e,t){return ne(e,n=>Ji(n,{...t,commandName:e},{kind:"grouped",key:t.key}))}function q(e,t){return String(e[t])}function ve(e,t){let n=e[t];return typeof n=="string"?n:void 0}function _(e,t){let n=e[t];return typeof n=="string"?n:void 0}function Te(e,t){let n=e[t];return typeof n=="number"?n:void 0}function I(e,t){return!!e[t]}function hu(e,t){let n=e[t];return Array.isArray(n)&&n.every(i=>typeof i=="string")?n:[]}function E(e,t,n){return Te(e,t)??n}function H(e,t,n){let i=Te(e,t),r=i!==void 0&&yu(e,t)!=="default";if(I(e,"full")){if(r)throw new Error("--full cannot be combined with --limit. Use --full for all findings, or --limit N for a capped report.");return Number.POSITIVE_INFINITY}return i??n}function yu(e,t){return e[By]?.(t)}function Ji(e,t,n){bu(e,{commandName:t.commandName,query:t.query,emptyMessage:(i,r)=>i.length===0&&t.emptyMessage?t.emptyMessage(r):void 0,heuristicLabel:t.heuristicLabel,render:(i,r)=>{n.kind==="list"?N.list(i,o=>t.format(o,r)):n.kind==="table"?N.table(n.headers,i.map(o=>t.format(o,r)),n.dashWidths):N.groupedByFile(i,o=>t.format(o,r),n.key?o=>n.key(o,r):void 0)},toJson:t.toJson,after:t.after})}function bu(e,t){let n=t.query(e);if(I(e.opts,"json")){O(t.commandName,e.args,e.opts,t.toJson?t.toJson(n,e):n);return}let i=t.emptyMessage?.(n,e);if(i){N.empty(i);return}t.heuristicLabel&&qi(t.heuristicLabel),t.before?.(n,e),t.render(n,e),t.after?.(n,e)}function O(e,t,n,i){console.log(JSON.stringify({command:e,args:f1(t),options:n,result:i},null,2))}function f1(e){return e.filter(t=>typeof t=="string"||typeof t=="number"||typeof t=="boolean")}function g1(e){if(e.length===0)return{args:[],opts:{}};let t=e[e.length-1];return{args:e.slice(0,-1),opts:he(t)}}function he(e){if(!e||typeof e!="object")return{};let t=e;if(typeof t.opts=="function"){let n=t.opts();return!n||typeof n!="object"?{}:(typeof t.getOptionValueSource=="function"&&Object.defineProperty(n,By,{value:i=>t.getOptionValueSource(i),enumerable:!1}),n)}return e}var S1=new Set(["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php"]),x1=18e4,Ky=100*1024*1024,C1=new Set(va),v1=[["status","--json"],["status","--capabilities"],["capabilities","--json"],["capability-matrix","--json"],["stats"],["kind-counts"],["diff-impact","--json"],["diff-gate","--json"]],R1=[["health","--json"],["dead","--json","--full"],["isolated","--json","--full"],["similar","--json","--full"],["similar-files","--json","--full"],["recent-duplicates","--json","--full"],["doc-drift","--json","--full"],["unused-params","--json","--full"],["wrapper-candidates","--json","--full"],["passthrough-candidates","--json","--full"],["stale-abstractions","--json","--full"],["incomplete-migration","--json","--full"],["cleanup-plan","--verify","--json"],["complexity-hotspots","--json","--full"]];function k1(e){return e.filter(t=>S1.has(t))}async function Qy(e){let t=he(e),n=xe(),i=je(n),r=wt(n,i);try{let o=k1(hu(t,"language")),s=await ln({projectRoot:n,languages:o.length>0?o:i.languages,outputScip:r.indexPath,outputDb:r.dbPath,pnpmWorkspaces:I(t,"pnpmWorkspaces")||i.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:i.indexer?.typescript?.projectMode,typescriptProjects:i.indexer?.typescript?.projects,skipIfUnchanged:!I(t,"force"),allowPartial:I(t,"allowPartial"),indexerConcurrency:Te(t,"indexerConcurrency")??i.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query reindex"}});console.log(`${s.reused?"Reused":"Indexed"} ${s.languages.join(", ")} in ${(s.durationMs/1e3).toFixed(1)}s`)}catch(o){console.error(`error: ${o instanceof Error?o.message:o}`),process.exit(1)}}function Xy(){let e=xe(),t=Vi(e);try{let n=cn({projectRoot:e,dbPath:t,onStatus:i=>console.log(i)});console.log(`Scanned ${n.scanned} auxiliary source files; inserted ${n.inserted}.`)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function Yy(e){let t=he(e),n=xe(),i=Vi(n);try{let r=Zl({projectRoot:n,dbPath:i,tsconfig:_(t,"project")??"frontend/tsconfig.scip.json",onStatus:o=>console.log(o)});console.log(`Vue files: ${r.vueFiles}; resolved references: ${r.resolvedReferences}; inserted mentions: ${r.insertedMentions}.`)}catch(r){console.error(`error: ${r instanceof Error?r.message:r}`),process.exit(1)}}function Zy(e){let t=he(e);rt(n=>{let i=JSON.parse(process.env.SCIP_QUERY_DIFF_IMPACT_FILES??"[]"),r=vt(n,{base:_(t,"base")}),o=ms(n,i,r.changedFiles,r.changedRanges);console.log(JSON.stringify(o))})}async function eb(e){let t=he(e);try{let n=await qg({base:_(t,"base")});if(I(t,"json")){O("diff-impact",[],t,n);return}Wg(n)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function tb(e,t){let n=he(t),i=String(e).split(",").filter(r=>r.length>0);rt(r=>{let o=[];for(let c of i)Mi.includes(c)||(console.error(`error: Unknown health phase: ${c}`),process.exit(1)),o.push(c);let s={scope:_(n,"scope"),full:I(n,"full")},a=o.length===1?Gr(r,o[0],s):hl(r,o,s);console.log(JSON.stringify(a))})}async function nb(e){let t=he(e);if(I(t,"writeBaseline")||I(t,"baseline")){F1(t);return}try{let n=await $s({scope:_(t,"scope"),full:!0,json:I(t,"json")});if(I(t,"json")){O("health",[],t,n);return}Vg(n,!1)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function ib(e){let t=he(e),n=xe(),i=Te(t,"timeoutMs")??x1,r=I(t,"progress"),o=I(t,"profile"),s=_(t,"profileOut"),a={projectRoot:n,...E1(n),index:Su(Qi(Vi(n))),commands:[]};I(t,"coldIndex")&&(Ki(r,"cold index started"),a.coldIndex=await w1(n),Ki(r,`cold index finished ${a.coldIndex.durationMs}ms`),In({type:"bench-index",phase:"cold-index",projectRoot:n,durationMs:a.coldIndex.durationMs,result:a.coldIndex.result,files:a.coldIndex.files,symbols:a.coldIndex.symbols},s),Ki(r,"warm index started"),a.warmIndex=await I1(n),Ki(r,`warm index finished ${a.warmIndex.durationMs}ms`),In({type:"bench-index",phase:"warm-index",projectRoot:n,durationMs:a.warmIndex.durationMs,result:a.warmIndex.result,files:a.warmIndex.files,symbols:a.warmIndex.symbols},s),a.index=Su(Qi(Vi(n))));for(let c of L1(t))a.commands.push(P1(n,c,i,{progress:r,profile:o,profileOut:s}));if(I(t,"json")){O("bench",[],t,a);return}T1(a)}async function w1(e){let t=je(e),n=wt(e,t),i=y1(n.dbPath),r=`${i}.bench-backup-${Date.now()}`,o=!1;Qi(i)&&(zy(i,r),o=!0);try{let s=await rb(()=>ln({projectRoot:e,languages:t.languages,outputScip:n.indexPath,outputDb:n.dbPath,pnpmWorkspaces:t.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:t.indexer?.typescript?.projectMode,typescriptProjects:t.indexer?.typescript?.projects,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:t.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query bench --cold-index"},onStatus:()=>{}}));return o&&h1(r,{recursive:!0,force:!0}),{durationMs:s.durationMs,result:s.value.reused?"reused":"rebuilt",languages:s.value.languages,...ob(e)}}catch(s){throw o&&!Qi(i)&&zy(r,i),s}}async function I1(e){let t=je(e),n=wt(e,t),i=await rb(()=>ln({projectRoot:e,languages:t.languages,outputScip:n.indexPath,outputDb:n.dbPath,pnpmWorkspaces:t.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:t.indexer?.typescript?.projectMode,typescriptProjects:t.indexer?.typescript?.projects,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:t.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query bench warm index"},onStatus:()=>{}}));return{durationMs:i.durationMs,result:i.value.reused?"reused":"rebuilt",languages:i.value.languages,...ob(e)}}async function rb(e){let t=performance.now(),n=await e();return{durationMs:Math.round(performance.now()-t),value:n}}function ob(e){return Qi(Vi(e))?rt(t=>{let n=Ue(t);return{files:n.documents,symbols:n.symbols}}):{}}function L1(e){let t=hu(e,"command");return t.length>0?t.map(D1).filter(n=>n.length>0):[...v1.map(n=>[...n]),...I(e,"includeHeavy")?R1.map(n=>[...n]):[]]}function D1(e){return e.trim().split(/\s+/).filter(Boolean).filter((t,n)=>!(n===0&&t==="scip-query"))}function P1(e,t,n,i={}){let r=`scip-query ${t.join(" ")}`;Ki(i.progress,`${r} started`),In({type:"bench-command-start",command:r,projectRoot:e},i.profileOut);let o=performance.now(),s=i.profile?N1(r,i.profileOut):process.env,a=Jy(process.execPath,[...process.execArgv,process.argv[1]??"",...t],{cwd:e,env:s,encoding:"buffer",maxBuffer:Ky,timeout:n}),c=Math.round(performance.now()-o),l={command:r,durationMs:c,exitCode:a.status,signal:a.signal,timedOut:a.error?.name==="ETIMEDOUT",stdoutBytes:a.stdout?.length??0,stderrBytes:a.stderr?.length??0,...i.profileOut?{profilePath:i.profileOut}:{}};return Ki(i.progress,`${r} finished ${c}ms exit=${l.exitCode??l.signal??"unknown"}${l.timedOut?" timed-out":""}`),In({type:"bench-command-finish",command:r,projectRoot:e,durationMs:c,exitCode:l.exitCode,signal:l.signal,timedOut:l.timedOut,stdoutBytes:l.stdoutBytes,stderrBytes:l.stderrBytes},i.profileOut),l}function Ki(e,t){e&&process.stderr.write(`[bench] ${t}
|
|
899
|
-
`)}function
|
|
900
|
-
`).filter(Boolean);return{repoFiles:n.length,sourceFiles:n.filter(i=>
|
|
901
|
-
Commands:`);for(let t of[...e.commands].sort((n,i)=>i.durationMs-n.durationMs)){let n=t.timedOut?"timeout":t.exitCode===0?"ok":`exit ${t.exitCode??t.signal??"unknown"}`;console.log(` ${String(t.durationMs).padStart(7)}ms ${n.padEnd(10)} ${String(t.stdoutBytes).padStart(8)}B out ${t.command}`)}}function
|
|
902
|
-
${e.installed.length} installed, ${e.alreadyLinked.length} already linked, ${e.skipped.length} skipped.`),t>0&&console.log("Skills will be available in your next Claude Code / Codex session.")}function
|
|
920
|
+
`}var lS=Symbol("option-value-source");function ne(e){return(...t)=>{let{args:n,opts:i}=sq(t);ut(r=>e({db:r,args:n,opts:i}))}}function le(e,t){return ne(n=>{let i=ra(n.db,e,P(n.opts,"full"),{quiet:P(n.opts,"json")});t({...n,budget:i})})}function uS(e){return ne(t=>cr(t,e,{kind:"list"}))}function dS(e){return ne(t=>cr(t,e,{kind:"table",headers:e.headers,dashWidths:e.dashWidths}))}function mS(e){return ne(t=>cr(t,e,{kind:"grouped",key:e.key}))}function fi(e){return ne(t=>nd(t,e))}function pS(e){return fi({commandName:e.commandName,query:e.query,emptyMessage:e.emptyMessage,heuristicLabel:e.heuristicLabel,before:e.before,render:(t,n)=>N.sectionedReport(e.sections(t,n)),toJson:e.toJson,after:e.after})}function dt(e,t){return le(e,n=>nd(n,{...t,commandName:t.commandName??e}))}function fS(e,t){return dt(e,{commandName:t.commandName??e,query:t.query,emptyMessage:t.emptyMessage,heuristicLabel:t.heuristicLabel,before:t.before,render:(n,i)=>N.sectionedReport(t.sections(n,i)),toJson:t.toJson,after:t.after})}function nn(e,t){return le(e,n=>cr(n,{...t,commandName:e},{kind:"list"}))}function La(e,t){return le(e,n=>cr(n,{...t,commandName:e},{kind:"table",headers:t.headers,dashWidths:t.dashWidths}))}function Da(e,t){return le(e,n=>cr(n,{...t,commandName:e},{kind:"grouped",key:t.key}))}function z(e,t){return String(e[t])}function ke(e,t){let n=e[t];return typeof n=="string"?n:void 0}function _(e,t){let n=e[t];return typeof n=="string"?n:void 0}function Ae(e,t){let n=e[t];return typeof n=="number"?n:void 0}function P(e,t){return!!e[t]}function ed(e,t){let n=e[t];return Array.isArray(n)&&n.every(i=>typeof i=="string")?n:[]}function F(e,t,n){return Ae(e,t)??n}function V(e,t,n){let i=Ae(e,t),r=i!==void 0&&td(e,t)!=="default";if(P(e,"full")){if(r)throw new Error("--full cannot be combined with --limit. Use --full for all findings, or --limit N for a capped report.");return Number.POSITIVE_INFINITY}return i??n}function td(e,t){return e[lS]?.(t)}function cr(e,t,n){nd(e,{commandName:t.commandName,query:t.query,emptyMessage:(i,r)=>i.length===0&&t.emptyMessage?t.emptyMessage(r):void 0,heuristicLabel:t.heuristicLabel,render:(i,r)=>{n.kind==="list"?N.list(i,o=>t.format(o,r)):n.kind==="table"?N.table(n.headers,i.map(o=>t.format(o,r)),n.dashWidths):N.groupedByFile(i,o=>t.format(o,r),n.key?o=>n.key(o,r):void 0)},toJson:t.toJson,after:t.after})}function nd(e,t){let n=t.query(e);if(P(e.opts,"json")){B(t.commandName,e.args,e.opts,t.toJson?t.toJson(n,e):n);return}let i=t.emptyMessage?.(n,e);if(i){N.empty(i);return}t.heuristicLabel&&tr(t.heuristicLabel),t.before?.(n,e),t.render(n,e),t.after?.(n,e)}function B(e,t,n,i){console.log(JSON.stringify({command:e,args:oq(t),options:n,result:i},null,2))}function oq(e){return e.filter(t=>typeof t=="string"||typeof t=="number"||typeof t=="boolean")}function sq(e){if(e.length===0)return{args:[],opts:{}};let t=e[e.length-1];return{args:e.slice(0,-1),opts:xe(t)}}function xe(e){if(!e||typeof e!="object")return{};let t=e;if(typeof t.opts=="function"){let n=t.opts();return!n||typeof n!="object"?{}:(typeof t.getOptionValueSource=="function"&&Object.defineProperty(n,lS,{value:i=>t.getOptionValueSource(i),enumerable:!1}),n)}return e}var uq=new Set(["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php","clojure"]),dq=18e4,bS=100*1024*1024,mq=new Set(Ga),pq=[["status","--json"],["status","--capabilities"],["capabilities","--json"],["capability-matrix","--json"],["stats"],["kind-counts"],["diff-impact","--json"],["diff-gate","--json"]],fq=[["health","--json"],["dead","--json","--full"],["isolated","--json","--full"],["similar","--json","--full"],["similar-files","--json","--full"],["recent-duplicates","--json","--full"],["doc-drift","--json","--full"],["unused-params","--json","--full"],["wrapper-candidates","--json","--full"],["passthrough-candidates","--json","--full"],["stale-abstractions","--json","--full"],["incomplete-migration","--json","--full"],["cleanup-plan","--verify","--json"],["complexity-hotspots","--json","--full"]];function gq(e){return e.filter(t=>uq.has(t))}async function SS(e){let t=xe(e),n=Ne(),i=Ue(n),r=Mt(n,i);try{let o=gq(ed(t,"language")),s=await vn({projectRoot:n,languages:o.length>0?o:i.languages,outputScip:r.indexPath,outputDb:r.dbPath,pnpmWorkspaces:P(t,"pnpmWorkspaces")||i.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:i.indexer?.typescript?.projectMode,typescriptProjects:i.indexer?.typescript?.projects,clojureConfigPath:i.indexer?.clojure?.configPath,skipIfUnchanged:!P(t,"force"),allowPartial:P(t,"allowPartial"),indexerConcurrency:Ae(t,"indexerConcurrency")??i.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query reindex"}});console.log(`${s.reused?"Reused":"Indexed"} ${s.languages.join(", ")} in ${(s.durationMs/1e3).toFixed(1)}s`)}catch(o){console.error(`error: ${o instanceof Error?o.message:o}`),process.exit(1)}}function xS(){let e=Ne(),t=er(e);try{let n=ua({projectRoot:e,dbPath:t,onStatus:i=>console.log(i)});console.log(`Scanned ${n.scanned} auxiliary source files; inserted ${n.inserted}.`)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function CS(e){let t=xe(e),n=Ne(),i=er(n);try{let r=Mu({projectRoot:n,dbPath:i,tsconfig:_(t,"project")??"frontend/tsconfig.scip.json",onStatus:o=>console.log(o)});console.log(`Vue files: ${r.vueFiles}; resolved references: ${r.resolvedReferences}; inserted mentions: ${r.insertedMentions}.`)}catch(r){console.error(`error: ${r instanceof Error?r.message:r}`),process.exit(1)}}function vS(e){let t=xe(e);ut(n=>{let i=JSON.parse(process.env.SCIP_QUERY_DIFF_IMPACT_FILES??"[]"),r=Tt(n,{base:_(t,"base")}),o=Ts(n,i,r.changedFiles,r.changedRanges);console.log(JSON.stringify(o))})}async function RS(e){let t=xe(e);try{let n=await uy({base:_(t,"base")});if(P(t,"json")){B("diff-impact",[],t,n);return}my(n)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function kS(e,t){let n=xe(t),i=String(e).split(",").filter(r=>r.length>0);ut(r=>{let o=[];for(let c of i)Ji.includes(c)||(console.error(`error: Unknown health phase: ${c}`),process.exit(1)),o.push(c);let s={scope:_(n,"scope"),full:P(n,"full")},a=o.length===1?ao(r,o[0],s):Zl(r,o,s);console.log(JSON.stringify(a))})}async function wS(e){let t=xe(e);if(P(t,"writeBaseline")||P(t,"baseline")){kq(t);return}try{let n=await oa({scope:_(t,"scope"),full:!0,json:P(t,"json")});if(P(t,"json")){B("health",[],t,n);return}ly(n,!1)}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}async function PS(e){let t=xe(e),n=Ne(),i=Ae(t,"timeoutMs")??dq,r=P(t,"progress"),o=P(t,"profile"),s=_(t,"profileOut"),a={projectRoot:n,...vq(n),index:id(gi(er(n))),commands:[]};P(t,"coldIndex")&&(lr(r,"cold index started"),a.coldIndex=await hq(n),lr(r,`cold index finished ${a.coldIndex.durationMs}ms`),Bn({type:"bench-index",phase:"cold-index",projectRoot:n,durationMs:a.coldIndex.durationMs,result:a.coldIndex.result,files:a.coldIndex.files,symbols:a.coldIndex.symbols},s),lr(r,"warm index started"),a.warmIndex=await yq(n),lr(r,`warm index finished ${a.warmIndex.durationMs}ms`),Bn({type:"bench-index",phase:"warm-index",projectRoot:n,durationMs:a.warmIndex.durationMs,result:a.warmIndex.result,files:a.warmIndex.files,symbols:a.warmIndex.symbols},s),a.index=id(gi(er(n))));for(let c of bq(t))a.commands.push(xq(n,c,i,{progress:r,profile:o,profileOut:s}));if(P(t,"json")){B("bench",[],t,a);return}Rq(a)}async function hq(e){let t=Ue(e),n=Mt(e,t),i=cq(n.dbPath),r=`${i}.bench-backup-${Date.now()}`,o=!1;gi(i)&&(gS(i,r),o=!0);try{let s=await IS(()=>vn({projectRoot:e,languages:t.languages,outputScip:n.indexPath,outputDb:n.dbPath,pnpmWorkspaces:t.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:t.indexer?.typescript?.projectMode,typescriptProjects:t.indexer?.typescript?.projects,clojureConfigPath:t.indexer?.clojure?.configPath,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:t.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query bench --cold-index"},onStatus:()=>{}}));return o&&aq(r,{recursive:!0,force:!0}),{durationMs:s.durationMs,result:s.value.reused?"reused":"rebuilt",languages:s.value.languages,...LS(e)}}catch(s){throw o&&!gi(i)&&gS(r,i),s}}async function yq(e){let t=Ue(e),n=Mt(e,t),i=await IS(()=>vn({projectRoot:e,languages:t.languages,outputScip:n.indexPath,outputDb:n.dbPath,pnpmWorkspaces:t.indexer?.typescript?.pnpmWorkspaces,typescriptProjectMode:t.indexer?.typescript?.projectMode,typescriptProjects:t.indexer?.typescript?.projects,clojureConfigPath:t.indexer?.clojure?.configPath,skipIfUnchanged:!0,allowPartial:!0,indexerConcurrency:t.indexerConcurrency,trigger:{kind:"manual-cli",detail:"scip-query bench warm index"},onStatus:()=>{}}));return{durationMs:i.durationMs,result:i.value.reused?"reused":"rebuilt",languages:i.value.languages,...LS(e)}}async function IS(e){let t=performance.now(),n=await e();return{durationMs:Math.round(performance.now()-t),value:n}}function LS(e){return gi(er(e))?ut(t=>{let n=We(t);return{files:n.documents,symbols:n.symbols}}):{}}function bq(e){let t=ed(e,"command");return t.length>0?t.map(Sq).filter(n=>n.length>0):[...pq.map(n=>[...n]),...P(e,"includeHeavy")?fq.map(n=>[...n]):[]]}function Sq(e){return e.trim().split(/\s+/).filter(Boolean).filter((t,n)=>!(n===0&&t==="scip-query"))}function xq(e,t,n,i={}){let r=`scip-query ${t.join(" ")}`;lr(i.progress,`${r} started`),Bn({type:"bench-command-start",command:r,projectRoot:e},i.profileOut);let o=performance.now(),s=i.profile?Cq(r,i.profileOut):process.env,a=yS(process.execPath,[...process.execArgv,process.argv[1]??"",...t],{cwd:e,env:s,encoding:"buffer",maxBuffer:bS,timeout:n}),c=Math.round(performance.now()-o),l={command:r,durationMs:c,exitCode:a.status,signal:a.signal,timedOut:a.error?.name==="ETIMEDOUT",stdoutBytes:a.stdout?.length??0,stderrBytes:a.stderr?.length??0,...i.profileOut?{profilePath:i.profileOut}:{}};return lr(i.progress,`${r} finished ${c}ms exit=${l.exitCode??l.signal??"unknown"}${l.timedOut?" timed-out":""}`),Bn({type:"bench-command-finish",command:r,projectRoot:e,durationMs:c,exitCode:l.exitCode,signal:l.signal,timedOut:l.timedOut,stdoutBytes:l.stdoutBytes,stderrBytes:l.stderrBytes},i.profileOut),l}function lr(e,t){e&&process.stderr.write(`[bench] ${t}
|
|
921
|
+
`)}function Cq(e,t){return{...process.env,SCIP_QUERY_PROFILE:"1",SCIP_QUERY_PROFILE_COMMAND:e,...t?{SCIP_QUERY_PROFILE_OUT:t}:{}}}function vq(e){let t=yS("git",["-C",e,"ls-files","-co","--exclude-standard"],{encoding:"utf8",maxBuffer:bS});if(t.status!==0)return{repoFiles:null,sourceFiles:null};let n=t.stdout.split(`
|
|
922
|
+
`).filter(Boolean);return{repoFiles:n.length,sourceFiles:n.filter(i=>mq.has(lq(i).toLowerCase())).length}}function Rq(e){console.log("scip-query bench"),console.log(`Project: ${e.projectRoot}`),console.log(`Repo files: ${e.repoFiles??"unknown"}; source-like files: ${e.sourceFiles??"unknown"}`),e.index&&console.log(`Index: ${e.index.files} files, ${e.index.symbols} symbols, ${ci(e.index.indexSizeBytes)}`),e.coldIndex&&hS("Cold index",e.coldIndex),e.warmIndex&&hS("Warm index",e.warmIndex),console.log(`
|
|
923
|
+
Commands:`);for(let t of[...e.commands].sort((n,i)=>i.durationMs-n.durationMs)){let n=t.timedOut?"timeout":t.exitCode===0?"ok":`exit ${t.exitCode??t.signal??"unknown"}`;console.log(` ${String(t.durationMs).padStart(7)}ms ${n.padEnd(10)} ${String(t.stdoutBytes).padStart(8)}B out ${t.command}`)}}function hS(e,t){console.log(`${e}: ${t.durationMs}ms, ${t.result}, ${t.languages.join(", ")}${t.files?`, ${t.files} files`:""}${t.symbols?`, ${t.symbols} symbols`:""}`)}function kq(e){let t=_(e,"scope");ut(n=>{if(P(e,"writeBaseline")){let r=Gl(n,{scope:t});console.log(`Baseline written to ${r.path} (${r.findingCount} finding(s)).`);return}let i=Zr(n,{scope:t});if(i.fixedFindings.length>0&&console.log(`${i.fixedFindings.length} finding(s) fixed since baseline. Re-run --write-baseline to ratchet down.`),i.newFindings.length===0){console.log(`OK: no new findings vs baseline (${i.baselineCount} baselined, ${i.current.length} current).`);return}console.log(`FAIL: ${i.newFindings.length} new finding(s) vs ${i.baselinePath}:`);for(let r of i.newFindings)console.log(` + ${r}`);process.exitCode=1})}function DS(){let e=wa(),t=e.installed.length+e.alreadyLinked.length;console.log(`
|
|
924
|
+
${e.installed.length} installed, ${e.alreadyLinked.length} already linked, ${e.skipped.length} skipped.`),t>0&&console.log("Skills will be available in your next Claude Code / Codex session.")}function ES(e){let t=xe(e),n=Ne(),i=ka(n);if(P(t,"json")){B("setup-hooks",[],t,i);return}for(let o of i.installed)console.log(` done: ${o}`);for(let o of i.updated)console.log(` update: ${o}`);for(let o of i.unchanged)console.log(` ok: ${o} (already configured)`);for(let o of i.removed)console.log(` remove: legacy user-level ${o}`);for(let o of i.skipped)console.log(` skip: ${o.target} \u2014 ${o.reason}`);i.installed.length+i.updated.length+i.unchanged.length>0?(console.log(`
|
|
903
925
|
Project-local scip-query hooks are configured for this repository.`),console.log("Review new or changed hooks in Codex/Claude Code with /hooks before they run.")):console.log(`
|
|
904
|
-
No project-local hook config was written.`)}function
|
|
926
|
+
No project-local hook config was written.`)}function NS(){let e=!1;fo()?console.log("scip CLI: installed"):(xu(),e=!0);let t=Ne(),n=Ue(t),i=Ot(t,n);if(i.languages.length===0){console.log(`
|
|
905
927
|
No supported project languages detected in the current directory.`),process.exitCode=e?1:0;return}console.log(`
|
|
906
928
|
Detected languages: ${i.languages.join(", ")}`),console.log(`
|
|
907
929
|
Indexer readiness:`);for(let r of i.indexers){let o=r.runnable?" OK":r.installed?" WARN":" MISSING",s=r.resolvedBinary?` (${r.resolvedBinary})`:"";console.log(`${o} ${r.language}: ${r.binaryLabel}${s}`),r.note&&console.log(` ${r.note}`),!r.installed&&r.installUrl&&console.log(` install: ${r.installUrl}`),r.runnable||(e=!0)}if(i.semantic){let r=i.semantic,o=r.available?" OK":r.dependencyAvailable?" WARN":" MISSING",s=r.tsconfigPaths&&r.tsconfigPaths.length>1?` (${r.tsconfigPaths.length} tsconfigs)`:r.tsconfigPath?` (${r.tsconfigPath})`:"";console.log(`
|
|
908
|
-
Semantic provider readiness:`),console.log(`${o} typescript: ts-morph${s}`),r.reason&&console.log(` ${r.reason}; semantic checks will fall back to SCIP/source evidence`)}process.exitCode=e?1:0}function
|
|
909
|
-
Agents reading this project now know to route through the scip-query skills and gate their diffs.`),console.log("Keep the index fresh (`scip-query reindex` or `scip-query watch`) so the gate sees current code.")}async function
|
|
930
|
+
Semantic provider readiness:`),console.log(`${o} typescript: ts-morph${s}`),r.reason&&console.log(` ${r.reason}; semantic checks will fall back to SCIP/source evidence`)}process.exitCode=e?1:0}function FS(e){_S(e,"capabilities")}function TS(e){_S(e,"capability-matrix")}function _S(e,t){let n=xe(e),{projectRoot:i,config:r,paths:o,dbPath:s}=ai(),a=Ot(i,r),c=Rn(i,r,o),l=mi(a,{hasIndexedGraph:gi(s)&&c.state!=="missing"});if(P(n,"json")){B(t,[],n,l);return}rd(l)}function AS(){let e=Ne(),t=tn(e),n=ey(e,t);console.log(`Config written to ${n}`),console.log(`Detected languages: ${t.join(", ")||"(none)"}`)}function MS(e){let t=xe(e),n=Ne(),i=Ue(n),r=Yi(i,{projectRoot:n});if(P(t,"json"))B("config-validate",[],t,{diagnostics:r});else if(r.length===0)console.log("Config OK.");else for(let o of r)console.log(`${o.level.toUpperCase()} ${o.path}: ${o.message}`);r.some(o=>o.level==="error")&&(process.exitCode=1)}function $S(e,t){let n=xe(t),i=_(n,"reason");if(!i||i.trim()===""){console.error("error: suppress requires --reason <text>."),process.exitCode=1;return}try{let r=ty(Ne(),{id:String(e),check:_(n,"check"),file:_(n,"file"),reason:i,expiresAt:_(n,"expiresAt")});if(P(n,"json")){B("suppress",[String(e)],n,r);return}console.log(`Suppression added to ${r.path} (${r.suppressionCount} total).`)}catch(r){console.error(`error: ${r instanceof Error?r.message:r}`),process.exitCode=1}}function jS(e){let t=xe(e),{report:n,hasIndexerProblems:i,hasErrors:r}=OS("doctor");P(t,"json")?B("doctor",[],t,n):wq(n,i),process.exitCode=r?1:0}function OS(e){let{projectRoot:t,config:n,paths:i,dbPath:r}=ai(),o=Yi(n,{projectRoot:t}),s=Ot(t,n),a=Rn(t,n,i),c=gi(r),l=mi(s,{hasIndexedGraph:c&&a.state!=="missing"}),d=s.indexers.some(m=>!m.runnable),u=o.some(m=>m.level==="error")||d||a.state==="missing"||a.state==="stale";return{report:{command:e,projectRoot:t,dbPath:r,configuredDbPath:i.dbPath,exists:c,configDiagnostics:o,readiness:s,freshness:a,capabilities:l,ok:!u},hasIndexerProblems:d,hasErrors:u}}function BS(e){let t=xe(e),n=Ne(),i=Ra(n,{gitHook:P(t,"gitHook")});for(let r of i.written)console.log(` done: ${r}`);for(let r of i.unchanged)console.log(` ok: ${r} (already wired)`);for(let r of i.skipped)console.log(` skip: ${r.target} \u2014 ${r.reason}`);console.log(`
|
|
931
|
+
Agents reading this project now know to route through the scip-query skills and gate their diffs.`),console.log("Keep the index fresh (`scip-query reindex` or `scip-query watch`) so the gate sees current code.")}async function HS(e){let t=xe(e);try{let n=await sS({gitHook:P(t,"gitHook")});P(t,"json")?B("setup",[],t,n):aS(n),process.exitCode=n.verdict==="blocked"?1:0}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function VS(e){let t=xe(e),n=Ne(),i=cS(n,{force:P(t,"force"),dryRun:P(t,"dryRun")});if(P(t,"dryRun")){console.log(i.content);return}if(i.skipped){console.log(`skip: ${i.path} \u2014 ${i.reason}`);return}console.log(`done: ${i.path}`)}function qS(e){let t=xe(e),n=Ne(),i=Ue(n),r=Ae(t,"debounce"),o=Ae(t,"cooldown"),s=Ae(t,"gitPoll");r&&((i.watch??={}).debounceMs=r),o&&((i.watch??={}).cooldownMs=o),s&&((i.watch??={}).gitPollMs=s);let a=new Pa({projectRoot:n,config:i,languages:i.languages,onStatus:c=>{process.stdout.write(`\r\x1B[K${iy(c)}`)},onReindexComplete:c=>{console.log(`
|
|
910
932
|
Reindex complete in ${(c/1e3).toFixed(1)}s`)},onError:c=>{console.error(`
|
|
911
933
|
Watch error: ${c.message}`)}});console.log(`Watching ${n}`),console.log(`Debounce: ${i.watch?.debounceMs??3e4}ms | Cooldown: ${i.watch?.cooldownMs??6e4}ms | Git poll: ${i.watch?.gitPollMs??2e3}ms`),console.log(`Press Ctrl+C to stop.
|
|
912
934
|
`),a.start(),process.on("SIGINT",()=>{a.stop(),console.log(`
|
|
913
|
-
Stopped.`),process.exit(0)})}function
|
|
914
|
-
Language matrix:`);for(let t of e.matrix){console.log(` ${t.language}`);for(let n of[t.indexing,t.sourceFacts,t.semantic,t.detectors,t.cleanupVerification])console.log(` ${n.status.toUpperCase().padEnd(11)} ${n.label}`),console.log(` ${n.reason}`)}}}function
|
|
915
|
-
Safe to delete.`,m),
|
|
935
|
+
Stopped.`),process.exit(0)})}function US(e){let t=xe(e),{report:n}=OS("status");if(P(t,"json")){B("status",[],t,{...n,stats:id(n.exists)});return}Pq(n,{capabilities:P(t,"capabilities")})}function wq(e,t){console.log(`Doctor: ${e.ok?"OK":"needs attention"}`);for(let n of e.configDiagnostics)console.log(` ${n.level.toUpperCase()} ${n.path}: ${n.message}`);if(t)for(let n of e.readiness.indexers.filter(i=>!i.runnable))console.log(` MISSING ${n.language}: ${n.note??n.binaryLabel}`);console.log(` Freshness: ${e.freshness.state}${e.freshness.remedy?` (${e.freshness.remedy})`:""}`),rd(e.capabilities)}function Pq(e,t){if(console.log(`Project: ${e.projectRoot}`),console.log(`DB path: ${e.dbPath}`),e.dbPath!==e.configuredDbPath&&console.log(`Config: ${e.configuredDbPath} (fallback to project root index.db)`),e.readiness.semantic){let n=e.readiness.semantic.available?"available":"fallback",i=e.readiness.semantic.tsconfigPaths&&e.readiness.semantic.tsconfigPaths.length>1?` (${e.readiness.semantic.tsconfigPaths.length} tsconfigs)`:e.readiness.semantic.tsconfigPath?` (${e.readiness.semantic.tsconfigPath})`:"";console.log(`TS sem: ${n}${i}`),e.readiness.semantic.reason&&console.log(`TS note: ${e.readiness.semantic.reason}`)}console.log(`Exists: ${e.exists?"yes":"no"}`),console.log(`Fresh: ${e.freshness.state}${e.freshness.remedy?` (${e.freshness.remedy})`:""}`),e.freshness.lastRefresh&&console.log(`Refresh: ${Iq(e.freshness.lastRefresh)}`),Lq(e.exists),t.capabilities&&(console.log(""),rd(e.capabilities))}function Iq(e){let t=(e.durationMs/1e3).toFixed(1),n=e.trigger.detail?` (${e.trigger.detail})`:"",i=e.error?`: ${e.error}`:"";return`${e.result} by ${e.trigger.kind}${n} in ${t}s at ${e.completedAt}${i}`}function id(e){if(e)return ut(t=>{let n=We(t);return{symbols:n.symbols,files:n.documents,indexSizeBytes:n.indexSizeBytes,lastBuilt:n.lastBuilt?.toISOString()}})}function Lq(e){e&&ut(t=>{let n=We(t);if(console.log(`Symbols: ${n.symbols}`),console.log(`Files: ${n.documents}`),console.log(`Size: ${ci(n.indexSizeBytes)}`),n.lastBuilt){let i=Math.round((Date.now()-n.lastBuilt.getTime())/1e3);console.log(`Built: ${i}s ago`)}})}function rd(e){console.log(`Capabilities for: ${e.languages.join(", ")||"(no detected languages)"}`);for(let t of e.capabilities)console.log(` ${t.status.toUpperCase().padEnd(11)} ${t.label} [${t.evidence}]`),console.log(` ${t.reason}`);if(e.matrix.length!==0){console.log(`
|
|
936
|
+
Language matrix:`);for(let t of e.matrix){console.log(` ${t.language}`);for(let n of[t.indexing,t.sourceFacts,t.semantic,t.detectors,t.cleanupVerification])console.log(` ${n.status.toUpperCase().padEnd(11)} ${n.label}`),console.log(` ${n.reason}`)}}}function Ro(e){return{...e,options:j(e.options)}}function Bt({query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r,...o}){let s=Ro(o);return{...s,renderShape:"list",handler:uS({commandName:s.id,query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r})}}function Ea({query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r,headers:o,dashWidths:s,...a}){let c=Ro(a);return{...c,renderShape:"table",handler:dS({commandName:c.id,query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r,headers:o,dashWidths:s})}}function zS({query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r,key:o,...s}){let a=Ro(s);return{...a,renderShape:"grouped-by-file",handler:mS({commandName:a.id,query:e,format:t,emptyMessage:n,heuristicLabel:i,after:r,key:o})}}function WS({query:e,emptyMessage:t,heuristicLabel:n,sections:i,before:r,after:o,...s}){let a=Ro(s);return{...a,renderShape:"sectioned-report",handler:pS({commandName:a.id,query:e,emptyMessage:t,heuristicLabel:n,before:r,sections:i,after:o})}}function Na({query:e,emptyMessage:t,heuristicLabel:n,sections:i,before:r,after:o,...s}){let a=Ro(s);return{...a,budget:a.budget??"semantic",renderShape:"sectioned-report",handler:fS(a.id,{commandName:a.id,query:e,emptyMessage:t,heuristicLabel:n,before:r,sections:i,after:o})}}function od(e,t,n,i){console.log(`\u2550\u2550\u2550 ${t} (${e.length}, ${i} LOC) \u2550\u2550\u2550`),console.log(n),console.log("");let r=new Map;for(let a of e){let c=r.get(a.relativePath)??[];c.push(a),r.set(a.relativePath,c)}let o=[...r.entries()].map(([a,c])=>({file:a,bucket:c,totalLoc:c.reduce((l,d)=>l+d.loc,0)})).sort((a,c)=>c.totalLoc-a.totalLoc||a.file.localeCompare(c.file)),s=!0;for(let{file:a,bucket:c}of o){s||console.log(""),s=!1,console.log(` ${a}`),c.sort((l,d)=>l.startLine-d.startLine);for(let l of c)console.log(` ${_e(l.startLine,l.endLine)} (${l.loc} LOC) ${l.shortName}`)}}var GS=le("dead",({db:e,args:t,opts:n,budget:i})=>{let r={scope:ke(t,0)||void 0,minLoc:F(n,"minLoc",1),includeTests:P(n,"includeTests"),skipBarrels:P(n,"skipBarrels"),includeMembers:P(n,"includeMembers"),scanLimit:i.scanLimit,semantic:i.semantic},o=Qt(e,r),s=o.symbols.filter(b=>b.kind==="dead-code"),a=o.symbols.filter(b=>b.kind!=="dead-code"),c=!P(n,"onlyInternal"),l=!P(n,"onlyDead"),d=c?s:[],u=l?a:[],m=d.reduce((b,x)=>b+x.loc,0),p=u.reduce((b,x)=>b+x.loc,0),f={total:d.length+u.length,deadCode:d.length,fileInternal:u.length,loc:m+p};if(P(n,"json")){B("dead",t,n,{...o,shown:{deadCode:d,fileInternal:u},shownCounts:f,totals:{total:o.counts.total,deadCode:o.counts.deadCode,fileInternal:o.counts.fileInternal,loc:o.counts.loc}});return}if(d.length===0&&u.length===0){N.empty("No matching dead-code symbols found.");return}d.length>0&&od(d,"DEAD CODE",` Zero references anywhere \u2014 no cross-file callers AND no same-file uses.
|
|
937
|
+
Safe to delete.`,m),u.length>0&&(d.length>0&&console.log(""),od(u,"FILE-INTERNAL ONLY",` Used only within the same file (no cross-file callers). Could be a
|
|
916
938
|
single-use helper, an abstraction-in-progress, or a callback registered
|
|
917
939
|
through a framework path that static analysis cannot trace (signal
|
|
918
940
|
handlers, event listeners, dependency injection). NOT necessarily dead \u2014
|
|
919
|
-
review case by case.`,p));let g=[];c&&g.push(`${
|
|
920
|
-
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`),console.log(`Total: ${
|
|
921
|
-
${e.length} unused import(s)`)}),
|
|
922
|
-
${e.length} isolated symbol(s)`)}),
|
|
923
|
-
${
|
|
924
|
-
${r.length} extraction candidate(s) found.`)}),
|
|
941
|
+
review case by case.`,p));let g=[];c&&g.push(`${d.length} dead code (${m} LOC)`),l&&g.push(`${u.length} file-internal (${p} LOC)`),console.log(`
|
|
942
|
+
\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500`),console.log(`Total: ${d.length+u.length} symbols \u2014 ${g.join(" + ")}`)}),KS=nn("unused-imports",{query:({db:e,args:t,budget:n})=>Gc(e,z(t,0),{semantic:n.semantic}),format:e=>` ${e.shortName} in ${e.importedIn}`,emptyMessage:()=>"No unused imports found.",after:e=>console.log(`
|
|
943
|
+
${e.length} unused import(s)`)}),JS=Da("isolated",{query:({db:e,opts:t,budget:n})=>zn(e,{scope:_(t,"scope"),minLoc:F(t,"minLoc",3),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${_e(e.startLine,e.endLine)} (${e.loc} LOC) ${e.shortName}`,emptyMessage:()=>"No isolated symbols found.",after:e=>console.log(`
|
|
944
|
+
${e.length} isolated symbol(s)`)}),XS=le("extract-candidates",({db:e,args:t,opts:n,budget:i})=>{let r=Qn(e,{scope:_(n,"scope"),minLoc:F(n,"minLoc",10),minCallees:F(n,"minCallees",6),limit:V(n,"limit",20),scanLimit:i.scanLimit,semantic:i.semantic});if(P(n,"json")){B("extract-candidates",t,n,r);return}if(r.length===0)return N.empty("No extraction candidates found.");tr("extraction candidates");for(let o of r){console.log(`
|
|
945
|
+
${Fe(o.relativePath,o.startLine,o.endLine)} ${o.shortName} (${o.loc} LOC, ${o.totalCallees} callees)`),console.log(` Kind: ${o.extractionKind}; tier: ${o.actionTier}`),console.log(` Recommendation: ${o.recommendation}`);for(let s of o.evidenceReasons)console.log(` - ${s}`);for(let s=0;s<o.clusters.length;s++){let a=o.clusters[s];console.log(` Cluster ${s+1} (${Math.round(a.isolation*100)}% isolated, ${a.callees.length} callees):`);for(let c of a.callees)console.log(` ${c}`)}}console.log(`
|
|
946
|
+
${r.length} extraction candidate(s) found.`)}),QS=le("locality-candidates",({db:e,args:t,opts:n,budget:i})=>{let r=xl(e,{target:ke(t,0)||void 0,scope:_(n,"scope"),minConsumers:F(n,"minConsumers",1),limit:V(n,"limit",20),scanLimit:i.scanLimit,semantic:i.semantic,architecturalBoundarySegments:e.config.locality?.architecturalBoundarySegments});if(P(n,"json")){B("locality-candidates",t,n,r);return}if(r.length===0)return N.empty("No locality candidates found.");tr("locality candidates");for(let o of r){let s=o.sourceUnit.kind==="symbol"&&o.sourceUnit.startLine!==void 0&&o.sourceUnit.endLine!==void 0?Fe(o.sourceUnit.file,o.sourceUnit.startLine,o.sourceUnit.endLine):o.sourceUnit.file;if(console.log(`
|
|
925
947
|
${s} ${o.sourceUnit.shortName}`),console.log(` Current directory: ${o.currentDirectory}; tier: ${o.recommendedTier}; action: ${o.actionTier}`),console.log(` Consumer coverage: ${o.consumerCoverage}; consumers: ${o.consumerFiles.length}`),o.nearestCommonOwner&&console.log(` Nearest common owner: ${o.nearestCommonOwner}`),o.suggestedHome&&console.log(` Suggested home: ${o.suggestedHome}`),o.whyNoSuggestedHome&&console.log(` Suggested home withheld: ${o.whyNoSuggestedHome}`),o.boundaryMarkers.length>0&&console.log(` Boundary markers: ${o.boundaryMarkers.join("; ")}`),console.log(` Recommendation: ${o.recommendation}`),o.consumerFiles.length>0){for(let a of o.consumerFiles.slice(0,8))console.log(` - consumer: ${a}`);o.consumerFiles.length>8&&console.log(` - ... ${o.consumerFiles.length-8} more consumer(s)`)}for(let a of o.counterevidence)console.log(` - counterevidence: ${a}`)}console.log(`
|
|
926
|
-
${r.length} locality candidate(s) found.`)}),
|
|
948
|
+
${r.length} locality candidate(s) found.`)}),YS=nn("wrapper-candidates",{query:({db:e,opts:t,budget:n})=>oi(e,{scope:_(t,"scope"),maxLoc:F(t,"maxLoc",15),limit:V(t,"limit",30),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${Fe(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.loc} LOC)
|
|
927
949
|
Only called by: ${e.singleCallerShort} (fan-in: ${e.callerFanIn}, tier: ${e.actionTier})`+(e.boundaryEvidence.length>0?`
|
|
928
950
|
Boundary evidence: ${e.boundaryEvidence.join("; ")}`:""),emptyMessage:()=>"No wrapper candidates found.",heuristicLabel:"wrapper candidates",after:e=>console.log(`
|
|
929
|
-
${e.length} wrapper candidate(s).`)}),
|
|
951
|
+
${e.length} wrapper candidate(s).`)}),ZS=nn("passthrough-candidates",{query:({db:e,opts:t,budget:n})=>ii(e,{scope:_(t,"scope"),maxLoc:F(t,"maxLoc",15),limit:V(t,"limit",30),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${Fe(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.loc} LOC)
|
|
930
952
|
Forwards to: ${e.forwardsToShort} (${e.forwardsToFile}, tier: ${e.actionTier})
|
|
931
953
|
Recommendation: ${e.recommendation}`+(e.boundaryEvidence.length>0?`
|
|
932
954
|
Boundary evidence: ${e.boundaryEvidence.join("; ")}`:"")+(e.publicFacadeEvidence.length>0?`
|
|
933
955
|
Public facade evidence: ${e.publicFacadeEvidence.join("; ")}`:""),emptyMessage:()=>"No passthrough candidates found.",heuristicLabel:"passthrough candidates",after:e=>console.log(`
|
|
934
|
-
${e.length} passthrough candidate(s).`)}),
|
|
956
|
+
${e.length} passthrough candidate(s).`)}),ex=nn("stale-abstractions",{query:({db:e,opts:t,budget:n})=>ri(e,{scope:_(t,"scope"),minLoc:F(t,"minLoc",3),limit:V(t,"limit",30),includeLowConfidence:P(t,"includeLowConfidence"),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>{let t=e.consumers===0?"unused":`${e.consumers} consumer`,n=e.barrelConsumers>0?`, +${e.barrelConsumers} barrel`:"";return` [${e.confidence}] ${Fe(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.kind}, ${e.loc} LOC, ${t}${n})
|
|
935
957
|
${e.reason}
|
|
936
958
|
Kind: ${e.stalenessKind}; tier: ${e.actionTier}
|
|
937
959
|
Recommendation: ${e.recommendation}`},emptyMessage:()=>"No stale abstractions found.",heuristicLabel:"stale abstraction candidates",after:e=>console.log(`
|
|
938
|
-
${e.length} stale abstraction(s).`)}),
|
|
960
|
+
${e.length} stale abstraction(s).`)}),tx=La("complexity-hotspots",{headers:["score"," LOC","fan-in","fan-out","callees","symbol"],query:({db:e,opts:t,budget:n})=>oo(e,{scope:_(t,"scope"),minLoc:F(t,"minLoc",10),limit:V(t,"limit",20),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${e.score.toFixed(1).padStart(5)} ${String(e.loc).padStart(4)} ${String(e.fanIn).padStart(6)} ${String(e.fanOut).padStart(7)} ${String(e.calleeCount).padStart(7)} ${e.shortName}`,emptyMessage:()=>"No complexity hotspots found.",heuristicLabel:"complexity hotspot candidates",dashWidths:[5,4,6,7,7,6]}),nx=dt("similar",{query:({db:e,args:t,opts:n,budget:i})=>{let r=ke(t,0);return r?{mode:"target",rows:Vr(e,r,{minSimilarity:F(n,"minSimilarity",.4),limit:V(n,"limit",20),scanLimit:i.scanLimit,semantic:i.semantic})}:{mode:"all",rows:Wn(e,{minSimilarity:F(n,"minSimilarity",.4),limit:V(n,"limit",20),scope:_(n,"scope"),minCallees:F(n,"minCallees",4),crossFileOnly:P(n,"crossFileOnly"),scanLimit:i.scanLimit,semantic:i.semantic})}},emptyMessage:e=>{if(!(e.rows.length>0))return e.mode==="target"?"No similar symbols found.":"No similar symbol pairs found."},heuristicLabel:"similarity candidates",render:e=>{if(e.mode==="target"){N.list(e.rows,t=>{let n=t.similarityBasis??"callees",i=n==="source-tokens"?"Shared source tokens":"Shared callees",r=n==="source-tokens"?"Only tokens in":"Only in",o=[`
|
|
939
961
|
${Math.round(t.similarity*100)}% similar:`,` A: ${t.shortNameA} (${t.fileA})`,` B: ${t.shortNameB} (${t.fileB})`,` Evidence class: ${t.evidenceClass} (tier: ${t.actionTier})`,` Recommendation: ${t.recommendation}`,` ${i}: ${t.sharedCallees.join(", ")}`];return t.evidenceClassReasons.length&&o.push(` Evidence reasons: ${t.evidenceClassReasons.join("; ")}`),t.uniqueToA.length&&o.push(` ${r} A: ${t.uniqueToA.join(", ")}`),t.uniqueToB.length&&o.push(` ${r} B: ${t.uniqueToB.join(", ")}`),o.join(`
|
|
940
962
|
`)});return}N.list(e.rows,t=>`
|
|
941
963
|
${Math.round(t.similarity*100)}% similar:
|
|
@@ -945,85 +967,85 @@ ${Math.round(t.similarity*100)}% similar:
|
|
|
945
967
|
Recommendation: ${t.recommendation}
|
|
946
968
|
`+(t.evidenceClassReasons.length?` Evidence reasons: ${t.evidenceClassReasons.join("; ")}
|
|
947
969
|
`:"")+` Shared ${t.similarityBasis==="source-tokens"?"source tokens":"callees"}: ${t.sharedCallees.join(", ")}`),console.log(`
|
|
948
|
-
${e.rows.length} similar pair(s) found.`)}}),
|
|
970
|
+
${e.rows.length} similar pair(s) found.`)}}),ix=fi({commandName:"similar-files",query:({db:e,args:t,opts:n})=>pl(e,{minSimilarity:F(n,"minSimilarity",.5),limit:V(n,"limit",20),scope:_(n,"scope"),minDeps:Ae(n,"minDeps"),filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No similar file pairs found.":void 0,heuristicLabel:"similar file candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
949
971
|
${Math.round(t.similarity*100)}% similar:`,` ${t.fileA}`,` ${t.fileB}`,` Shared deps (${t.sharedDeps.length}): ${t.sharedDeps.join(", ")}`];return t.uniqueToA.length&&n.push(` Only in first: ${t.uniqueToA.join(", ")}`),t.uniqueToB.length&&n.push(` Only in second: ${t.uniqueToB.join(", ")}`),n.join(`
|
|
950
972
|
`)}),console.log(`
|
|
951
|
-
${e.length} similar pair(s) found.`)}}),
|
|
973
|
+
${e.length} similar pair(s) found.`)}}),rx=fi({commandName:"similar-chains",query:({db:e,opts:t})=>fl(e,{minSimilarity:F(t,"minSimilarity",.5),limit:V(t,"limit",15),scope:_(t,"scope"),minChainLength:F(t,"minLength",3),maxChainLength:F(t,"maxLength",8)}),emptyMessage:e=>e.length===0?"No similar chains found.":void 0,heuristicLabel:"similar chain candidates",render:e=>{for(let t=0;t<e.length;t++){let n=e[t];console.log(`
|
|
952
974
|
\u2500\u2500 Chain pair ${t+1} (${Math.round(n.similarity*100)}% similar, ${n.divergencePoints.length} divergence point(s)) \u2500\u2500`),console.log(` Chain A: ${n.chainA.join(" \u2192 ")}`),console.log(` Chain B: ${n.chainB.join(" \u2192 ")}`),n.commonPrefix.length&&console.log(` Common prefix: ${n.commonPrefix.join(" \u2192 ")}`),n.commonSuffix.length&&console.log(` Common suffix: ${n.commonSuffix.join(" \u2192 ")}`),console.log(" Divergence points (consolidation targets):");for(let i of n.divergencePoints)console.log(` [${i.index}] ${i.nodeA} \u2194 ${i.nodeB}`)}console.log(`
|
|
953
|
-
${e.length} similar chain pair(s) found.`)}})
|
|
975
|
+
${e.length} similar chain pair(s) found.`)}}),ox=dt("drift",{query:({db:e,args:t,opts:n,budget:i})=>ni(e,{scope:ke(t,0),minDeviation:F(n,"minDeviation",5),semantic:i.semantic}),emptyMessage:e=>e.results.length===0?"No drift detected.":void 0,heuristicLabel:"drift candidates",render:e=>{console.log(""),N.groupedByFile(e.results,t=>{let n=t.kind==="unused-import"?"UNUSED":t.kind==="layer-violation"?"LAYER":"UNIQUE",i=t.policyBasis?`, policy: ${t.policyBasis}`:"",r=[` [${n}] ${t.description}`,` Tier: ${t.actionTier}${i}`,` Recommendation: ${t.recommendation}`,` Evidence: ${t.evidenceReasons.join("; ")}`];return t.detail&&r.push(` ${t.detail}`),r.join(`
|
|
954
976
|
`)},t=>t.file),console.log(`
|
|
955
|
-
${e.unusedImports} unused import(s), ${e.layerViolations} layer violation(s), ${e.patternDeviations} pattern deviation(s)`)}}),
|
|
977
|
+
${e.unusedImports} unused import(s), ${e.layerViolations} layer violation(s), ${e.patternDeviations} pattern deviation(s)`)}}),sx=dt("convergence",{query:({db:e,args:t,budget:n})=>iu(e,z(t,0),z(t,1),{semantic:n.semantic}),emptyMessage:e=>e?void 0:"One or both symbols not found.",render:e=>{if(e){console.log(`
|
|
956
978
|
${Math.round(e.similarity*100)}% callee overlap
|
|
957
979
|
`),console.log(` A: ${e.symbolA.shortName} (${e.symbolA.file}, ${e.symbolA.loc} LOC)`),console.log(` B: ${e.symbolB.shortName} (${e.symbolB.file}, ${e.symbolB.loc} LOC)
|
|
958
980
|
`),console.log(` Shared callees (${e.sharedCallees.length}):`);for(let t of e.sharedCallees)console.log(` ${t}`);if(e.uniqueToA.length>0){console.log(`
|
|
959
981
|
Unique to A (${e.uniqueToA.length}):`);for(let t of e.uniqueToA)console.log(` ${t}`)}if(e.uniqueToB.length>0){console.log(`
|
|
960
982
|
Unique to B (${e.uniqueToB.length}):`);for(let t of e.uniqueToB)console.log(` ${t}`)}console.log(`
|
|
961
|
-
Strategy: ${e.consolidationStrategy}`)}}}),
|
|
962
|
-
Signature: ${e.signature} (${e.functions.length} functions)`,n=e.functions.map(i=>` ${
|
|
983
|
+
Strategy: ${e.consolidationStrategy}`)}}}),ax=nn("similar-signatures",{query:({db:e,opts:t,budget:n})=>lu(e,{scope:_(t,"scope"),minLoc:F(t,"minLoc",3),limit:V(t,"limit",20),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>{let t=`
|
|
984
|
+
Signature: ${e.signature} (${e.functions.length} functions)`,n=e.functions.map(i=>` ${Fe(i.file,i.startLine,i.endLine)} ${i.shortName} (${i.loc} LOC)`).join(`
|
|
963
985
|
`);return`${t}
|
|
964
986
|
${n}`},emptyMessage:()=>"No same-shape function groups found.",after:e=>console.log(`
|
|
965
|
-
${e.length} group(s) found.`)}),
|
|
966
|
-
`);for(let
|
|
967
|
-
Verifying batches against the project checker (throwaway worktree at HEAD)...`),
|
|
987
|
+
${e.length} group(s) found.`)}),cx=le("cleanup-plan",({db:e,args:t,opts:n,budget:i})=>{let r=Ds(e,{scope:_(n,"scope"),minLoc:F(n,"minLoc",1),maxDepth:F(n,"maxDepth",5),scanLimit:i.scanLimit}),o=Ne(),s=P(n,"patch"),a=P(n,"json"),c=P(n,"verify")||s;if(s&&!P(n,"verify")){console.error("error: cleanup-plan --patch requires --verify."),process.exitCode=1;return}if(r.batches.length===0){if(a){B("cleanup-plan",t,n,r);return}return N.empty("Nothing deletable found \u2014 no graph-fact dead code to seed a cascade.")}let l=Wu(r),d=c?qu(o,r):void 0;if(a){B("cleanup-plan",t,n,{result:r,verification:d});return}if(s){let u=Gu(d,l);if(u.length>0){for(let p of u)console.error(`error: ${p}`);process.exitCode=1;return}let m=Ab(o,l);if(m.trim()===""){console.error("error: verified cleanup plan produced an empty patch."),process.exitCode=1;return}console.error(`cleanup-plan --patch: ${l.length} compiler-verified batch(es), ${r.totalLoc} LOC.`),console.log(m);return}console.log(`Cleanup plan: ${r.totalSymbols} symbol(s), ${r.totalLoc} LOC across ${r.batches.length} batch(es).`),console.log(`Apply one batch at a time; run your typecheck between batches.
|
|
988
|
+
`);for(let u of r.batches){let m=u.depth===0?`\u2500\u2500 Batch 0: deletable now (graph-fact, ${u.loc} LOC) \u2500\u2500`:`\u2500\u2500 Batch ${u.depth}: dead once batch ${u.depth-1} lands (cascade, ${u.loc} LOC) \u2500\u2500`;console.log(m);for(let p of u.entries)console.log(` ${p.file}:${p.startLine+1}-${p.endLine+1} ${p.shortName} (${p.loc} LOC)`);u.filesEmptied.length>0&&console.log(` -> empties: ${u.filesEmptied.join(", ")}`),console.log("")}if(r.blocked.length>0){console.log("Cascade blocked (references outside the removal set):");for(let u of r.blocked)console.log(` ${u.shortName} (${u.file}) blocked by ${u.blockingFiles.join(", ")}`)}if(d){if(console.log(`
|
|
989
|
+
Verifying batches against the project checker (throwaway worktree at HEAD)...`),d.checkers.length===0){console.log(" No checker detected (need tsconfig.json or a Cargo.toml) \u2014 skipped.");return}for(let u of d.checkers)console.log(` Checker: ${u}`);d.uncoveredFiles.length>0&&console.log(` WARNING: no checker covers these plan files (entries there are NOT verified): ${d.uncoveredFiles.join(", ")}`),d.baselineErrors>0&&console.log(` Baseline has ${d.baselineErrors} pre-existing error(s) \u2014 verifying differentially (no NEW errors).`),d.dirtyOverlap.length>0&&console.log(` WARNING: plan files dirty in working tree (verification runs at HEAD): ${d.dirtyOverlap.join(", ")}`);for(let u of d.batches)if(u.status==="verified")console.log(` Batch ${u.depth}: COMPILER-VERIFIED`);else{console.log(` Batch ${u.depth}: FAILED \u2014 the errors below name references the static evidence missed:`);for(let m of u.errors??[])console.log(` ${m}`)}}}),lx=le("cleanup-apply",({db:e,opts:t,budget:n})=>{if(!P(t,"verified")){console.error("error: cleanup-apply requires --verified so deletions are checked before mutating files."),process.exitCode=1;return}let i=P(t,"all"),r=Ae(t,"batch");if(i===(r!==void 0)){console.error("error: choose exactly one of --all or --batch <n>."),process.exitCode=1;return}let o=Ds(e,{scope:_(t,"scope"),minLoc:F(t,"minLoc",1),maxDepth:F(t,"maxDepth",5),scanLimit:n.scanLimit});if(o.batches.length===0){N.empty("Nothing deletable found \u2014 no graph-fact dead code to seed a cascade.");return}let s=Wu(o,{all:i,batch:r});if(s.length===0){console.error(`error: No cleanup batch ${r} exists.`),process.exitCode=1;return}let a=Ne(),c=qu(a,o),l=Gu(c,s,{allowDirty:P(t,"forceDirty")});if(l.length>0){for(let m of l)console.error(`error: ${m}`);process.exitCode=1;return}zu(a,s);let d=s.reduce((m,p)=>m+p.entries.length,0),u=s.reduce((m,p)=>m+p.loc,0);console.log(`Applied ${s.length} compiler-verified cleanup batch(es): ${d} symbol(s), ${u} LOC.`)}),ux=le("recent-duplicates",({db:e,args:t,opts:n,budget:i})=>{let r=Xl(e,{windowCommits:F(n,"window",100),minSimilarity:Ae(n,"minSimilarity"),limit:V(n,"limit",30),scope:_(n,"scope"),scanLimit:i.scanLimit,semantic:i.semantic});if(P(n,"json")){B("recent-duplicates",t,n,r);return}if(!r.available)return N.empty("No git history available (not a repository, or git missing).");if(r.findings.length===0)return N.empty(`No recent re-implementations found (window: last ${r.windowCommits} commits).`);console.log(`Recent re-implementations (window: last ${r.windowCommits} commits):
|
|
968
990
|
`);let o=r.rootCauseGroups?.filter(s=>s.count>1)??[];if(o.length>0){console.log(`Root-cause groups (${o.length}):`);for(let s of o)console.log(` ${s.count} pair(s) ${s.kind.toUpperCase()} ${s.domain} ${Math.round(s.maxSimilarity*100)}% max`),s.establishedFile&&s.establishedSymbol&&console.log(` established: ${s.establishedFile} ${s.establishedSymbol}`),console.log(` files: ${s.relatedFiles.slice(0,6).join(", ")}`),console.log(` -> ${s.recommendation}`);console.log("")}for(let s of r.findings){let a=s.sharedEvidence.slice(0,16).join(", ");s.kind==="echo"?(console.log(` ${Math.round(s.similarity*100)}% ECHO ${s.domain} ${s.echoFile} ${s.echoSymbol} (added ${s.echoAgeCommits} commits ago)`),console.log(` duplicates established ${s.establishedFile} ${s.establishedSymbol}`)):(console.log(` ${Math.round(s.similarity*100)}% TWIN ${s.domain} ${s.echoFile} ${s.echoSymbol}`),console.log(` and ${s.establishedFile} ${s.establishedSymbol} (both new \u2014 consolidate before they diverge)`)),console.log(` basis: ${s.basis}`),a.length>0&&console.log(` shared: ${a}`)}console.log(`
|
|
969
|
-
${r.findings.length} finding(s). ECHO: prefer extending the established side and deleting the echo.`)}),
|
|
970
|
-
`);for(let r of i.findings){console.log(` staleness ${r.staleness} ${r.doc}`);for(let o of r.brokenReferences.slice(0,4))console.log(` BROKEN REFERENCE: cites ${o} \u2014 that file no longer exists`);for(let o of r.subjects.slice(0,4)){let s=o.evidence==="both"?`referenced by doc + coupled ${o.coChanges}x`:o.evidence==="reference"?"referenced by doc":`coupled ${o.coChanges}x historically`;console.log(` ${o.changesSinceDocUpdate} change(s) since doc update ${o.file} (${s}; ${o.actionTier}/${o.docIntent})`);let a=o.docIntentReasons[0];a&&console.log(` intent: ${a}`);let c=o.citationContexts?.[0];c&&console.log(` cited claim: ${
|
|
971
|
-
Stale standards docs are worse than none \u2014 agents implement to a dead spec.`)}),
|
|
991
|
+
${r.findings.length} finding(s). ECHO: prefer extending the established side and deleting the echo.`)}),dx=ne(({db:e,args:t,opts:n})=>{let i=Hl(e,{doc:t[0]===void 0?void 0:z(t,0),limit:V(n,"limit",20),minCoupling:F(n,"minCoupling",3)});if(P(n,"json")){B("doc-drift",t,n,i);return}if(!i.available)return N.empty("No git history available (not a repository, or git missing).");if(i.findings.length===0)return N.empty(`No drifting docs found across ${i.docsScanned} doc(s) \u2014 referenced and co-changed code has not moved since each doc last changed.`);console.log(`Docs whose referenced or co-changed code moved on without them (${i.docsScanned} docs scanned, ${i.commitsAnalyzed} commits analyzed):
|
|
992
|
+
`);for(let r of i.findings){console.log(` staleness ${r.staleness} ${r.doc}`);for(let o of r.brokenReferences.slice(0,4))console.log(` BROKEN REFERENCE: cites ${o} \u2014 that file no longer exists`);for(let o of r.subjects.slice(0,4)){let s=o.evidence==="both"?`referenced by doc + coupled ${o.coChanges}x`:o.evidence==="reference"?"referenced by doc":`coupled ${o.coChanges}x historically`;console.log(` ${o.changesSinceDocUpdate} change(s) since doc update ${o.file} (${s}; ${o.actionTier}/${o.docIntent})`);let a=o.docIntentReasons[0];a&&console.log(` intent: ${a}`);let c=o.citationContexts?.[0];c&&console.log(` cited claim: ${ta(c)}`)}}console.log(`
|
|
993
|
+
Stale standards docs are worse than none \u2014 agents implement to a dead spec.`)}),mx=nn("unused-params",{query:({db:e,opts:t,budget:n})=>to(e,{scope:_(t,"scope"),limit:V(t,"limit",30),scanLimit:n.scanLimit}),format:e=>` ${Fe(e.file,e.startLine,e.endLine)} ${e.shortName}
|
|
972
994
|
trailing unused: ${e.unusedTrailing.join(", ")} (${e.unusedTrailing.length} of ${e.paramCount} params \u2014 safe to drop)`,emptyMessage:()=>"No trailing unused parameters found.",heuristicLabel:"unused trailing parameter candidates",after:e=>console.log(`
|
|
973
|
-
${e.length} function(s) with trailing unused parameters.`)});var
|
|
995
|
+
${e.length} function(s) with trailing unused parameters.`)});var px=dt("react-component-duplicates",{query:({db:e,args:t,opts:n,budget:i})=>Gn(e,{minSimilarity:F(n,"minSimilarity",.62),minTokens:F(n,"minTokens",8),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No duplicated React component structures found.":void 0,heuristicLabel:"React component duplicate candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
974
996
|
${Math.round(t.similarity*100)}% similar React structure:`,` ${t.componentA} (${t.fileA})`,` ${t.componentB} (${t.fileB})`];return t.sharedComponents.length&&n.push(` Shared components: ${t.sharedComponents.join(", ")}`),t.sharedNativeTags.length&&n.push(` Shared native tags: ${t.sharedNativeTags.join(", ")}`),t.sharedProps.length&&n.push(` Shared props: ${t.sharedProps.join(", ")}`),t.sharedEvents.length&&n.push(` Shared events: ${t.sharedEvents.join(", ")}`),t.sharedBindings.length&&n.push(` Shared bindings: ${t.sharedBindings.slice(0,20).join(", ")}`),n.join(`
|
|
975
997
|
`)}),console.log(`
|
|
976
|
-
${e.length} duplicated React component pair(s) found.`)}}),
|
|
998
|
+
${e.length} duplicated React component pair(s) found.`)}}),fx=dt("react-hook-candidates",{query:({db:e,args:t,opts:n,budget:i})=>Kn(e,{minSimilarity:F(n,"minSimilarity",.45),minSharedBehaviors:F(n,"minSharedBehaviors",6),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No duplicated React hook behavior candidates found.":void 0,heuristicLabel:"React hook extraction candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
977
999
|
${Math.round(t.similarity*100)}% similar React behavior:`,` ${t.componentA} (${t.fileA})`,` ${t.componentB} (${t.fileB})`,` Evidence class: ${t.evidenceClass} (tier: ${t.actionTier})`,` Recommendation: ${t.recommendation}`,` ${t.reason}`];return t.evidenceClassReasons.length&&n.push(` Evidence reasons: ${t.evidenceClassReasons.join("; ")}`),t.sharedHooks.length&&n.push(` Shared hooks: ${t.sharedHooks.join(", ")}`),t.sharedReactHooks.length&&n.push(` Shared React hooks: ${t.sharedReactHooks.join(", ")}`),t.sharedEffects.length&&n.push(` Shared effects: ${t.sharedEffects.join(", ")}`),t.sharedState.length&&n.push(` Shared state: ${t.sharedState.join(", ")}`),t.sharedRequests.length&&n.push(` Shared requests: ${t.sharedRequests.join(", ")}`),t.sharedHandlers.length&&n.push(` Shared handlers: ${t.sharedHandlers.slice(0,12).join(", ")}`),t.sharedHandlerVerbs.length&&n.push(` Shared action verbs: ${t.sharedHandlerVerbs.slice(0,12).join(", ")}`),n.join(`
|
|
978
1000
|
`)}),console.log(`
|
|
979
|
-
${e.length} React hook candidate pair(s) found.`)}}),
|
|
1001
|
+
${e.length} React hook candidate pair(s) found.`)}}),gx=dt("react-large-component-pressure",{query:({db:e,args:t,opts:n,budget:i})=>qr(e,{minComponentLines:F(n,"minComponentLines",300),minFileLines:F(n,"minFileLines",800),minJsxTokens:F(n,"minJsxTokens",80),minBehaviorTokens:F(n,"minBehaviorTokens",40),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No large React component pressure found.":void 0,heuristicLabel:"large React component pressure candidates",render:e=>{N.list(e,t=>[`
|
|
980
1002
|
${t.componentLines} component line(s): ${t.component} (${t.file})`,` Dominant pressure: ${t.dominantPressure} (context: ${t.contextKind})`,` Pressure kinds: ${t.pressureKinds.join(", ")}`,` File lines: ${t.fileLines}; JSX tokens: ${t.jsxTokens}; behavior tokens: ${t.behaviorTokens}`,` Recommendation: ${t.recommendationKind} - ${t.recommendation}`,` Reasons: ${t.reasons.join("; ")}`].join(`
|
|
981
1003
|
`)),console.log(`
|
|
982
|
-
${e.length} large React component(s) found.`)}}),
|
|
1004
|
+
${e.length} large React component(s) found.`)}}),hx=dt("vue-component-duplicates",{query:({db:e,args:t,opts:n,budget:i})=>Jn(e,{minSimilarity:F(n,"minSimilarity",.62),minTokens:F(n,"minTokens",8),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No duplicated Vue component structures found.":void 0,heuristicLabel:"Vue component duplicate candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
983
1005
|
${Math.round(t.similarity*100)}% similar Vue structure:`,` ${t.fileA}`,` ${t.fileB}`];return t.sharedComponents.length&&n.push(` Shared components: ${t.sharedComponents.join(", ")}`),t.sharedProps.length&&n.push(` Shared props: ${t.sharedProps.join(", ")}`),t.sharedEvents.length&&n.push(` Shared events: ${t.sharedEvents.join(", ")}`),t.sharedDirectives.length&&n.push(` Shared directives: ${t.sharedDirectives.join(", ")}`),t.sharedSlots.length&&n.push(` Shared slots: ${t.sharedSlots.join(", ")}`),t.sharedIdentifiers.length&&n.push(` Shared identifiers: ${t.sharedIdentifiers.slice(0,20).join(", ")}`),n.join(`
|
|
984
1006
|
`)}),console.log(`
|
|
985
|
-
${e.length} duplicated Vue component pair(s) found.`)}}),
|
|
1007
|
+
${e.length} duplicated Vue component pair(s) found.`)}}),yx=dt("vue-composable-candidates",{query:({db:e,args:t,opts:n,budget:i})=>Xn(e,{minSimilarity:F(n,"minSimilarity",.45),minSharedBehaviors:F(n,"minSharedBehaviors",6),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No duplicated Vue behavior candidates found.":void 0,heuristicLabel:"Vue composable extraction candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
986
1008
|
${Math.round(t.similarity*100)}% similar Vue behavior:`,` ${t.fileA}`,` ${t.fileB}`,` Evidence class: ${t.evidenceClass} (tier: ${t.actionTier})`,` Recommendation: ${t.recommendation}`,` ${t.reason}`];return t.evidenceClassReasons.length&&n.push(` Evidence reasons: ${t.evidenceClassReasons.join("; ")}`),t.sharedComposables.length&&n.push(` Shared composables: ${t.sharedComposables.join(", ")}`),t.sharedStores.length&&n.push(` Shared stores: ${t.sharedStores.join(", ")}`),t.sharedRequests.length&&n.push(` Shared requests: ${t.sharedRequests.join(", ")}`),t.sharedLifecycle.length&&n.push(` Shared lifecycle: ${t.sharedLifecycle.join(", ")}`),t.sharedFunctions.length&&n.push(` Shared functions: ${t.sharedFunctions.slice(0,12).join(", ")}`),t.sharedFunctionVerbs.length&&n.push(` Shared action verbs: ${t.sharedFunctionVerbs.slice(0,12).join(", ")}`),t.sharedBindings.length&&n.push(` Shared bindings: ${t.sharedBindings.slice(0,20).join(", ")}`),t.sharedTemplateEvents.length&&n.push(` Shared template events: ${t.sharedTemplateEvents.slice(0,20).join(", ")}`),n.join(`
|
|
987
1009
|
`)}),console.log(`
|
|
988
|
-
${e.length} Vue composable candidate pair(s) found.`)}}),
|
|
1010
|
+
${e.length} Vue composable candidate pair(s) found.`)}}),bx=dt("vue-large-view-pressure",{query:({db:e,args:t,opts:n,budget:i})=>Ur(e,{minTotalLines:P(n,"reviewThresholds")&&td(n,"minTotalLines")==="default"?300:F(n,"minTotalLines",800),minTemplateLines:F(n,"minTemplateLines",300),minScriptLines:F(n,"minScriptLines",300),minStyleLines:F(n,"minStyleLines",500),limit:V(n,"limit",20),scope:_(n,"scope"),scanLimit:i.scanLimit,filePattern:ke(t,0)}),emptyMessage:e=>e.length===0?"No large Vue view pressure found.":void 0,heuristicLabel:"large Vue view pressure candidates",render:e=>{N.list(e,t=>{let n=[`
|
|
989
1011
|
${t.totalLines} total line(s): ${t.file}`,` Dominant pressure: ${t.dominantPressure} (context: ${t.contextKind})`,` Pressure kinds: ${t.pressureKinds.join(", ")}`,` Blocks: template ${t.templateLines}, script ${t.scriptLines}, style ${t.styleLines}, external script ${t.externalScriptLines}, custom ${t.customBlockLines}`,` Recommendation: ${t.recommendationKind} - ${t.recommendation}`];return t.externalScriptPaths.length&&n.push(` External scripts: ${t.externalScriptPaths.join(", ")}`),n.push(` Reasons: ${t.reasons.join("; ")}`),n.join(`
|
|
990
1012
|
`)}),console.log(`
|
|
991
|
-
${e.length} large Vue view pressure file(s) found.`)}});function ht(e){return{docs:P("Cleanup"),...e}}function Fe({heuristicLabel:e,...t}){return ht({...t,heuristic:{label:e}})}var aa=[ht({id:"unused-params",command:"unused-params",description:"Speculative-generality candidates: trailing parameters no body ever uses (TS/JS)",options:$([h("-s, --scope <path>","Limit to files matching path"),h("-n, --limit <n>","Maximum findings",L,30),h("--full","Run unbounded analysis on large indexes")]),budget:"candidate-scan",heuristic:{label:"unused trailing parameter candidates"},renderShape:"list",docs:P("Cleanup",["scip-query unused-params -s src/services"]),handler:qb}),ht({id:"cleanup-plan",command:"cleanup-plan",description:"Ordered, batched deletion plan: graph-fact dead code plus the cascade candidates it unlocks",options:[h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Only include symbols >= N lines",L,1),h("--max-depth <n>","Maximum cascade depth",L,5),h("--verify","Apply batches in a throwaway worktree and run the project checker (tsc / cargo check)"),h("--patch","With --verify, print the compiler-verified deletion patch to stdout"),h("--json","Output as JSON for programmatic consumption"),h("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:P("Cleanup",["scip-query cleanup-plan --min-loc 3","scip-query cleanup-plan --verify"]),handler:jb}),ht({id:"cleanup-apply",command:"cleanup-apply",description:"Apply a compiler-verified cleanup-plan batch to the working tree",options:[h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Only include symbols >= N lines",L,1),h("--max-depth <n>","Maximum cascade depth",L,5),h("--verified","Required: verify the selected cleanup batch before applying it"),h("--batch <n>","Apply one batch depth",L),h("--all","Apply every compiler-verified batch in the plan"),h("--force-dirty","Allow applying when plan files already have working-tree edits"),h("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:P("Cleanup",["scip-query cleanup-apply --verified --batch 0"]),handler:Bb}),ht({id:"recent-duplicates",command:"recent-duplicates",description:"Directional duplicate candidates: recent code that re-implements established callable, React, or Vue code",options:$([h("--window <n>",'How many commits back counts as "recent"',L,100),h("--min-similarity <n>","Minimum similarity (0-1); omitted uses detector defaults",ft),h("-n, --limit <n>","Maximum findings",L,30),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",heuristic:{label:"recent re-implementation candidates"},renderShape:"custom",docs:P("Cleanup",["scip-query recent-duplicates --window 50"]),handler:Hb}),ht({id:"doc-drift",command:"doc-drift [doc]",description:"Stale-doc candidates: code the doc references or co-changed with kept changing after the doc stopped",options:$([h("-n, --limit <n>","Maximum docs to report",L,20),h("--min-coupling <n>","Minimum historical co-changes to track a subject",L,3),h("--full","Run unbounded analysis on large indexes")]),heuristic:{label:"doc drift candidates"},renderShape:"custom",docs:P("Cleanup",["scip-query doc-drift","scip-query doc-drift AGENTS.md"]),handler:Vb}),ht({id:"dead",command:"dead [scope]",description:"Find dead code and file-internal symbols (no cross-file consumers)",options:$([h("--min-loc <n>","Only show symbols >= N lines",L,1),h("--include-tests","Include test files"),h("--skip-barrels","Ignore refs from barrel re-export files"),h("--include-members","Include class members"),h("--only-dead","Show only [dead code] symbols (skip [file-internal only])"),h("--only-internal","Show only [file-internal only] symbols (skip [dead code])"),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"custom",docs:P("Cleanup",["scip-query dead --min-loc 10"]),handler:kb}),ht({id:"unused-imports",command:"unused-imports <file>",description:"Find imports not referenced in the same file",options:$([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"list",handler:wb}),ht({id:"isolated",command:"isolated",description:"Find completely orphaned symbols (no references at all)",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum lines of code",L,3),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"grouped-by-file",handler:Ib}),Fe({id:"similar",command:"similar [symbol]",description:"Find heuristic function similarity candidates from callee fingerprints",options:$([h("--min-similarity <n>","Minimum Jaccard similarity (0-1)",ft,.4),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--min-callees <n>","Minimum callees to consider",L,4),h("--cross-file-only","Only show cross-file pairs (skip same-file matches)"),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"similarity candidates",budget:"candidate-scan",renderShape:"custom",handler:Fb}),Fe({id:"similar-files",command:"similar-files [file]",description:"Find heuristic similar-file candidates from dependency profiles",options:$([h("--min-similarity <n>","Minimum Jaccard similarity (0-1)",ft,.5),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--min-deps <n>","Minimum dependencies to consider",L),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"similar file candidates",renderShape:"custom",handler:_b}),Fe({id:"react-component-duplicates",command:"react-component-duplicates [file]",description:"Find heuristic duplicated React component structure candidates from JSX tags, props, events, and bindings",options:$([h("--min-similarity <n>","Minimum JSX structure similarity (0-1)",ft,.62),h("--min-tokens <n>","Minimum structural tokens to consider",L,8),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"React component duplicate candidates",budget:"candidate-scan",renderShape:"custom",handler:Ub}),Fe({id:"react-hook-candidates",command:"react-hook-candidates [file]",description:"Find heuristic React hook extraction candidates from shared state, effects, requests, and handlers",options:$([h("--min-similarity <n>","Minimum behavior similarity (0-1)",ft,.45),h("--min-shared-behaviors <n>","Minimum shared behavior tokens",L,6),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"React hook extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:Wb}),Fe({id:"react-large-component-pressure",command:"react-large-component-pressure [file]",description:"Find heuristic large React component pressure candidates from component lines, JSX structure, and hook behavior",options:$([h("--min-component-lines <n>","Minimum component lines",L,300),h("--min-file-lines <n>","Minimum file lines",L,800),h("--min-jsx-tokens <n>","Minimum JSX structure tokens",L,80),h("--min-behavior-tokens <n>","Minimum behavior tokens",L,40),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"large React component pressure candidates",budget:"candidate-scan",renderShape:"custom",handler:zb}),Fe({id:"vue-component-duplicates",command:"vue-component-duplicates [file]",description:"Find heuristic duplicated Vue component structure candidates from template tags, bindings, slots, and directives",options:$([h("--min-similarity <n>","Minimum template similarity (0-1)",ft,.62),h("--min-tokens <n>","Minimum structural tokens to consider",L,8),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"Vue component duplicate candidates",budget:"candidate-scan",renderShape:"custom",handler:Gb}),Fe({id:"vue-composable-candidates",command:"vue-composable-candidates [file]",description:"Find heuristic Vue composable extraction candidates from shared state, effects, requests, and template bindings",options:$([h("--min-similarity <n>","Minimum behavior similarity (0-1)",ft,.45),h("--min-shared-behaviors <n>","Minimum shared behavior tokens",L,6),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"Vue composable extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:Jb}),Fe({id:"vue-large-view-pressure",command:"vue-large-view-pressure [file]",description:"Find heuristic large Vue view pressure candidates from template, script, style, and external script line counts",options:$([h("--min-total-lines <n>","Minimum total component lines",L,800),h("--min-template-lines <n>","Minimum template lines",L,300),h("--min-script-lines <n>","Minimum script lines",L,300),h("--min-style-lines <n>","Minimum style lines",L,500),h("--review-thresholds","Use lower review thresholds without changing health scoring"),h("-n, --limit <n>","Number of results",L,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"large Vue view pressure candidates",budget:"candidate-scan",renderShape:"custom",handler:Kb}),Fe({id:"similar-chains",command:"similar-chains",description:"Find heuristic similar-chain candidates from dependency flows",options:$([h("--min-similarity <n>","Minimum chain similarity (0-1)",ft,.5),h("-n, --limit <n>","Number of results",L,15),h("-s, --scope <path>","Limit to files matching path"),h("--min-length <n>","Minimum chain length",L,3),h("--max-length <n>","Maximum chain length",L,8),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"similar chain candidates",renderShape:"custom",handler:Ab}),Fe({id:"extract-candidates",command:"extract-candidates",description:"Find heuristic extraction candidates from isolated callee clusters",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum function LOC",L,10),h("--min-callees <n>","Minimum callees to analyze",L,6),h("-n, --limit <n>","Number of results",L,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:Lb}),Fe({id:"locality-candidates",command:"locality-candidates [symbol-or-file]",description:"Find directory-locality and ancestry candidates from consumer ownership",options:$([h("-s, --scope <path>","Limit scan mode to files matching path"),h("--min-consumers <n>","Minimum consumers in scan mode",L,1),h("-n, --limit <n>","Number of results",L,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"locality candidates",budget:"candidate-scan",renderShape:"custom",docs:P("Cleanup",["scip-query locality-candidates","scip-query locality-candidates formatName --json","scip-query locality-candidates src/shared/date.ts"]),handler:Db}),Fe({id:"drift",command:"drift [module]",description:"Detect heuristic drift candidates: unused imports, layer violations, and pattern deviations",options:$([h("--min-deviation <n>","Minimum sibling files before reporting unique dependency deviations",Yr,5),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"drift candidates",budget:"semantic",renderShape:"grouped-by-file",handler:$b}),Fe({id:"wrapper-candidates",command:"wrapper-candidates",description:"Find heuristic wrapper candidates only called by one consumer",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--max-loc <n>","Maximum LOC for candidates",L,15),h("-n, --limit <n>","Number of results",L,30),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"wrapper candidates",budget:"candidate-scan",renderShape:"list",handler:Pb}),Fe({id:"passthrough-candidates",command:"passthrough-candidates",description:"Find heuristic passthrough candidates that forward to one callee",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--max-loc <n>","Maximum LOC for candidates",L,15),h("-n, --limit <n>","Number of results",L,30),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"passthrough candidates",budget:"candidate-scan",renderShape:"list",handler:Nb}),Fe({id:"stale-abstractions",command:"stale-abstractions",description:"Find heuristic stale abstraction candidates with 0-1 consumers",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum LOC",L,3),h("-n, --limit <n>","Number of results",L,30),h("--include-low-confidence","Include 1-consumer classes (usually encapsulation, not stale)",void 0,!1),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"stale abstraction candidates",budget:"candidate-scan",renderShape:"list",handler:Eb}),Fe({id:"complexity-hotspots",command:"complexity-hotspots",description:"Find heuristic complexity hotspot candidates from LOC x fan-in x fan-out",options:$([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum LOC",L,10),h("-n, --limit <n>","Number of results",L,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"complexity hotspot candidates",budget:"candidate-scan",renderShape:"table",handler:Tb}),ht({id:"convergence",command:"convergence <symbol1> <symbol2>",description:"Show what a consolidated version of two similar functions would look like",options:$([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",handler:Mb}),vb({id:"redundant-reexports",command:"redundant-reexports",description:"Find barrel re-exports that nobody imports through",options:[h("-s, --scope <path>","Limit to files matching path"),h("-n, --limit <n>","Number of results",L,30),h("--full","Run unbounded analysis on large indexes")],docs:P("Cleanup"),query:({db:e,opts:t})=>vl(e,{scope:_(t,"scope"),limit:H(t,"limit",30)}),format:e=>` ${e.shortName} (from ${e.originalFile})
|
|
1013
|
+
${e.length} large Vue view pressure file(s) found.`)}});function Rt(e){return{docs:E("Cleanup"),...e}}function Me({heuristicLabel:e,...t}){return Rt({...t,heuristic:{label:e}})}var Fa=[Rt({id:"unused-params",command:"unused-params",description:"Speculative-generality candidates: trailing parameters no body ever uses (TS/JS)",options:j([h("-s, --scope <path>","Limit to files matching path"),h("-n, --limit <n>","Maximum findings",I,30),h("--full","Run unbounded analysis on large indexes")]),budget:"candidate-scan",heuristic:{label:"unused trailing parameter candidates"},renderShape:"list",docs:E("Cleanup",["scip-query unused-params -s src/services"]),handler:mx}),Rt({id:"cleanup-plan",command:"cleanup-plan",description:"Ordered, batched deletion plan: graph-fact dead code plus the cascade candidates it unlocks",options:[h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Only include symbols >= N lines",I,1),h("--max-depth <n>","Maximum cascade depth",I,5),h("--verify","Apply batches in a throwaway worktree and run the project checker (tsc / cargo check)"),h("--patch","With --verify, print the compiler-verified deletion patch to stdout"),h("--json","Output as JSON for programmatic consumption"),h("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:E("Cleanup",["scip-query cleanup-plan --min-loc 3","scip-query cleanup-plan --verify"]),handler:cx}),Rt({id:"cleanup-apply",command:"cleanup-apply",description:"Apply a compiler-verified cleanup-plan batch to the working tree",options:[h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Only include symbols >= N lines",I,1),h("--max-depth <n>","Maximum cascade depth",I,5),h("--verified","Required: verify the selected cleanup batch before applying it"),h("--batch <n>","Apply one batch depth",I),h("--all","Apply every compiler-verified batch in the plan"),h("--force-dirty","Allow applying when plan files already have working-tree edits"),h("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:E("Cleanup",["scip-query cleanup-apply --verified --batch 0"]),handler:lx}),Rt({id:"recent-duplicates",command:"recent-duplicates",description:"Directional duplicate candidates: recent code that re-implements established callable, React, or Vue code",options:j([h("--window <n>",'How many commits back counts as "recent"',I,100),h("--min-similarity <n>","Minimum similarity (0-1); omitted uses detector defaults",xt),h("-n, --limit <n>","Maximum findings",I,30),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",heuristic:{label:"recent re-implementation candidates"},renderShape:"custom",docs:E("Cleanup",["scip-query recent-duplicates --window 50"]),handler:ux}),Rt({id:"doc-drift",command:"doc-drift [doc]",description:"Stale-doc candidates: code the doc references or co-changed with kept changing after the doc stopped",options:j([h("-n, --limit <n>","Maximum docs to report",I,20),h("--min-coupling <n>","Minimum historical co-changes to track a subject",I,3),h("--full","Run unbounded analysis on large indexes")]),heuristic:{label:"doc drift candidates"},renderShape:"custom",docs:E("Cleanup",["scip-query doc-drift","scip-query doc-drift AGENTS.md"]),handler:dx}),Rt({id:"dead",command:"dead [scope]",description:"Find dead code and file-internal symbols (no cross-file consumers)",options:j([h("--min-loc <n>","Only show symbols >= N lines",I,1),h("--include-tests","Include test files"),h("--skip-barrels","Ignore refs from barrel re-export files"),h("--include-members","Include class members"),h("--only-dead","Show only [dead code] symbols (skip [file-internal only])"),h("--only-internal","Show only [file-internal only] symbols (skip [dead code])"),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"custom",docs:E("Cleanup",["scip-query dead --min-loc 10"]),handler:GS}),Rt({id:"unused-imports",command:"unused-imports <file>",description:"Find imports not referenced in the same file",options:j([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"list",handler:KS}),Rt({id:"isolated",command:"isolated",description:"Find completely orphaned symbols (no references at all)",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum lines of code",I,3),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"grouped-by-file",handler:JS}),Me({id:"similar",command:"similar [symbol]",description:"Find heuristic function similarity candidates from callee fingerprints",options:j([h("--min-similarity <n>","Minimum Jaccard similarity (0-1)",xt,.4),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--min-callees <n>","Minimum callees to consider",I,4),h("--cross-file-only","Only show cross-file pairs (skip same-file matches)"),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"similarity candidates",budget:"candidate-scan",renderShape:"custom",handler:nx}),Me({id:"similar-files",command:"similar-files [file]",description:"Find heuristic similar-file candidates from dependency profiles",options:j([h("--min-similarity <n>","Minimum Jaccard similarity (0-1)",xt,.5),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--min-deps <n>","Minimum dependencies to consider",I),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"similar file candidates",renderShape:"custom",handler:ix}),Me({id:"react-component-duplicates",command:"react-component-duplicates [file]",description:"Find heuristic duplicated React component structure candidates from JSX tags, props, events, and bindings",options:j([h("--min-similarity <n>","Minimum JSX structure similarity (0-1)",xt,.62),h("--min-tokens <n>","Minimum structural tokens to consider",I,8),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"React component duplicate candidates",budget:"candidate-scan",renderShape:"custom",handler:px}),Me({id:"react-hook-candidates",command:"react-hook-candidates [file]",description:"Find heuristic React hook extraction candidates from shared state, effects, requests, and handlers",options:j([h("--min-similarity <n>","Minimum behavior similarity (0-1)",xt,.45),h("--min-shared-behaviors <n>","Minimum shared behavior tokens",I,6),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"React hook extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:fx}),Me({id:"react-large-component-pressure",command:"react-large-component-pressure [file]",description:"Find heuristic large React component pressure candidates from component lines, JSX structure, and hook behavior",options:j([h("--min-component-lines <n>","Minimum component lines",I,300),h("--min-file-lines <n>","Minimum file lines",I,800),h("--min-jsx-tokens <n>","Minimum JSX structure tokens",I,80),h("--min-behavior-tokens <n>","Minimum behavior tokens",I,40),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"large React component pressure candidates",budget:"candidate-scan",renderShape:"custom",handler:gx}),Me({id:"vue-component-duplicates",command:"vue-component-duplicates [file]",description:"Find heuristic duplicated Vue component structure candidates from template tags, bindings, slots, and directives",options:j([h("--min-similarity <n>","Minimum template similarity (0-1)",xt,.62),h("--min-tokens <n>","Minimum structural tokens to consider",I,8),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"Vue component duplicate candidates",budget:"candidate-scan",renderShape:"custom",handler:hx}),Me({id:"vue-composable-candidates",command:"vue-composable-candidates [file]",description:"Find heuristic Vue composable extraction candidates from shared state, effects, requests, and template bindings",options:j([h("--min-similarity <n>","Minimum behavior similarity (0-1)",xt,.45),h("--min-shared-behaviors <n>","Minimum shared behavior tokens",I,6),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"Vue composable extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:yx}),Me({id:"vue-large-view-pressure",command:"vue-large-view-pressure [file]",description:"Find heuristic large Vue view pressure candidates from template, script, style, and external script line counts",options:j([h("--min-total-lines <n>","Minimum total component lines",I,800),h("--min-template-lines <n>","Minimum template lines",I,300),h("--min-script-lines <n>","Minimum script lines",I,300),h("--min-style-lines <n>","Minimum style lines",I,500),h("--review-thresholds","Use lower review thresholds without changing health scoring"),h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"large Vue view pressure candidates",budget:"candidate-scan",renderShape:"custom",handler:bx}),Me({id:"similar-chains",command:"similar-chains",description:"Find heuristic similar-chain candidates from dependency flows",options:j([h("--min-similarity <n>","Minimum chain similarity (0-1)",xt,.5),h("-n, --limit <n>","Number of results",I,15),h("-s, --scope <path>","Limit to files matching path"),h("--min-length <n>","Minimum chain length",I,3),h("--max-length <n>","Maximum chain length",I,8),h("--full","Run unbounded analysis on large indexes")]),heuristicLabel:"similar chain candidates",renderShape:"custom",handler:rx}),Me({id:"extract-candidates",command:"extract-candidates",description:"Find heuristic extraction candidates from isolated callee clusters",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum function LOC",I,10),h("--min-callees <n>","Minimum callees to analyze",I,6),h("-n, --limit <n>","Number of results",I,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:XS}),Me({id:"locality-candidates",command:"locality-candidates [symbol-or-file]",description:"Find directory-locality and ancestry candidates from consumer ownership",options:j([h("-s, --scope <path>","Limit scan mode to files matching path"),h("--min-consumers <n>","Minimum consumers in scan mode",I,1),h("-n, --limit <n>","Number of results",I,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"locality candidates",budget:"candidate-scan",renderShape:"custom",docs:E("Cleanup",["scip-query locality-candidates","scip-query locality-candidates formatName --json","scip-query locality-candidates src/shared/date.ts"]),handler:QS}),Me({id:"drift",command:"drift [module]",description:"Detect heuristic drift candidates: unused imports, layer violations, and pattern deviations",options:j([h("--min-deviation <n>","Minimum sibling files before reporting unique dependency deviations",mo,5),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"drift candidates",budget:"semantic",renderShape:"grouped-by-file",handler:ox}),Me({id:"wrapper-candidates",command:"wrapper-candidates",description:"Find heuristic wrapper candidates only called by one consumer",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--max-loc <n>","Maximum LOC for candidates",I,15),h("-n, --limit <n>","Number of results",I,30),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"wrapper candidates",budget:"candidate-scan",renderShape:"list",handler:YS}),Me({id:"passthrough-candidates",command:"passthrough-candidates",description:"Find heuristic passthrough candidates that forward to one callee",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--max-loc <n>","Maximum LOC for candidates",I,15),h("-n, --limit <n>","Number of results",I,30),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"passthrough candidates",budget:"candidate-scan",renderShape:"list",handler:ZS}),Me({id:"stale-abstractions",command:"stale-abstractions",description:"Find heuristic stale abstraction candidates with 0-1 consumers",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum LOC",I,3),h("-n, --limit <n>","Number of results",I,30),h("--include-low-confidence","Include 1-consumer classes (usually encapsulation, not stale)",void 0,!1),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"stale abstraction candidates",budget:"candidate-scan",renderShape:"list",handler:ex}),Me({id:"complexity-hotspots",command:"complexity-hotspots",description:"Find heuristic complexity hotspot candidates from LOC x fan-in x fan-out",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum LOC",I,10),h("-n, --limit <n>","Number of results",I,20),h("--full","Run unbounded semantic analysis on large indexes")]),heuristicLabel:"complexity hotspot candidates",budget:"candidate-scan",renderShape:"table",handler:tx}),Rt({id:"convergence",command:"convergence <symbol1> <symbol2>",description:"Show what a consolidated version of two similar functions would look like",options:j([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",handler:sx}),zS({id:"redundant-reexports",command:"redundant-reexports",description:"Find barrel re-exports that nobody imports through",options:[h("-s, --scope <path>","Limit to files matching path"),h("-n, --limit <n>","Number of results",I,30),h("--full","Run unbounded analysis on large indexes")],docs:E("Cleanup"),query:({db:e,opts:t})=>ou(e,{scope:_(t,"scope"),limit:V(t,"limit",30)}),format:e=>` ${e.shortName} (from ${e.originalFile})
|
|
992
1014
|
barrel: ${e.barrelConsumers} consumer(s) | direct: ${e.directConsumers} consumer(s) | tier: ${e.actionTier}
|
|
993
1015
|
Recommendation: ${e.recommendation}`+(e.surfaceEvidence.length>0?`
|
|
994
1016
|
Surface evidence: ${e.surfaceEvidence.join("; ")}`:""),key:e=>e.barrelFile,emptyMessage:()=>"No redundant re-exports found.",after:e=>console.log(`
|
|
995
|
-
${e.length} redundant re-export(s).`)}),
|
|
1017
|
+
${e.length} redundant re-export(s).`)}),Rt({id:"similar-signatures",command:"similar-signatures",description:"Find functions with near-identical type signatures (same shape)",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--min-loc <n>","Minimum LOC per function",I,3),h("-n, --limit <n>","Number of groups",I,20),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"list",handler:ax})];var Eq=ne(({db:e,args:t,opts:n})=>{let i=We(e);if(P(n,"json")){B("stats",t,n,i);return}console.log(`Documents: ${i.documents}`),console.log(`Symbols: ${i.symbols}`),console.log(`Definitions: ${i.definitions}`),console.log(`References: ${i.references}`),console.log(`Index size: ${ci(i.indexSizeBytes)}`),i.lastBuilt&&console.log(`Last built: ${i.lastBuilt.toISOString().replace("T"," ").slice(0,19)}`)}),Sx=[{id:"stats",command:"stats",description:"Show index statistics",options:[bu()],renderShape:"custom",docs:E("Core"),handler:Eq}];var Nq=La("bottlenecks",{headers:["tier","risk","score","fan-in","fan-out","symbol"],query:({db:e,opts:t,budget:n})=>il(e,{limit:V(t,"limit",20),scope:_(t,"scope"),minFanIn:F(t,"minFanIn",2),minFanOut:F(t,"minFanOut",2),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${e.actionTier.padEnd(6)} ${e.riskKind.padEnd(20)} ${String(e.score).padStart(5)} ${String(e.fanIn).padStart(6)} ${String(e.fanOut).padStart(7)} ${e.shortName}`,emptyMessage:()=>"No bottlenecks found."}),Fq=ne(({db:e,args:t,opts:n})=>{let i=ke(t,0),r=V(n,"limit",30);if(i){let s=Qc(e,i);if(P(n,"json")){B("fan-in",t,n,{mode:"symbol",symbol:i,rows:s});return}if(s.length===0)return N.empty(`No fan-in for ${i}.`);N.list(s,a=>` ${String(a.count).padStart(4)} files ${a.name}`);return}let o=Zc(e,{limit:r,scope:_(n,"scope")});if(P(n,"json")){B("fan-in",t,n,{mode:"top",rows:o});return}N.table(["files","symbol"],o.map(s=>` ${String(s.count).padStart(5)} ${s.name}`))}),Tq=ne(({db:e,args:t,opts:n})=>{let i=ke(t,0),r=V(n,"limit",30);if(i){let s=Yc(e,i);if(P(n,"json")){B("fan-out",t,n,{mode:"file",file:i,rows:s});return}if(s.length===0)return N.empty(`No fan-out for ${i}.`);N.list(s,a=>` ${String(a.count).padStart(4)} symbols ${a.name}`);return}let o=el(e,{limit:r,scope:_(n,"scope")});if(P(n,"json")){B("fan-out",t,n,{mode:"top",rows:o});return}N.table(["symbols","file"],o.map(s=>` ${String(s.count).padStart(7)} ${s.name}`))}),_q=ne(({db:e,args:t,opts:n})=>{let i=ke(t,0),r=ke(t,1),o=V(n,"limit",20);if(i&&r){let a=tl(e,i,r);if(P(n,"json")){B("coupling",t,n,{mode:"pair",result:a});return}console.log(`${a.file1} \u2194 ${a.file2}: ${a.sharedSymbols} shared symbols (${a.actionTier})`),console.log(` Risk: ${a.couplingKind}`),console.log(` Recommendation: ${a.recommendation}`);return}let s=nl(e,{limit:o,scope:_(n,"scope")});if(P(n,"json")){B("coupling",t,n,{mode:"top",rows:s});return}N.table(["tier","risk","shared","file1 \u2192 file2"],s.map(a=>` ${a.actionTier.padEnd(6)} ${a.couplingKind.padEnd(22)} ${String(a.sharedSymbols).padStart(6)} ${a.file1} \u2192 ${a.file2}`))}),Aq=fi({commandName:"cycles",query:({db:e,opts:t})=>Un(e,{scope:_(t,"scope"),maxDepth:F(t,"maxDepth",10)}),emptyMessage:e=>e.length===0?"No circular dependencies found.":void 0,render:e=>{let t=e.filter(i=>i.kind==="real"),n=e.filter(i=>i.kind==="module-hierarchy");for(let i=0;i<t.length;i++){console.log(`
|
|
996
1018
|
Cycle ${i+1} (${t[i].path.length-1} files):`);for(let r=0;r<t[i].path.length;r++){let o=r<t[i].path.length-1?" \u2192":" (cycle)";console.log(` ${t[i].path[r]}${o}`)}}t.length===0?console.log("No real circular dependencies found."):console.log(`
|
|
997
|
-
${t.length} real cycle(s) found.`),n.length>0&&console.log(`(${n.length} module-hierarchy cycle(s) hidden \u2014 barrel files participating in normal parent/child re-export patterns. Pass --include-module-hierarchy to see them.)`)}}),
|
|
998
|
-
Chain ${t+1} (depth ${e[t].depth}):`);for(let n of e[t].chain)console.log(` \u2192 ${n}`);console.log(` Tier: ${e[t].actionTier} Risk: ${e[t].chainKind}`),console.log(` Recommendation: ${e[t].recommendation}`),console.log(` Evidence: ${e[t].evidenceReasons.join("; ")}`)}}}),
|
|
999
|
-
`)},sections:e=>e?[{title:`CALLERS (${e.callers.length})`,rows:e.callers.map(t=>` ${t.file} ${t.shortName}`)},{title:`CALLEES (${e.callees.length})`,rows:e.callees.map(t=>` ${t.file} ${t.shortName}`)}]:[]})];var
|
|
1000
|
-
`),console.log(` LOC: ${r.loc}`),console.log(` Branches: ${r.branches}`),console.log(` Cyclomatic estimate: ${r.cyclomaticEstimate}`),console.log(` Callees: ${r.calleeCount}`),console.log(` Fan-in: ${r.fanIn}`),console.log(` Fan-out: ${r.fanOut}`)}),
|
|
1001
|
-
`),console.log(
|
|
1002
|
-
Top disagreements (debugging targets):`);for(let
|
|
1019
|
+
${t.length} real cycle(s) found.`),n.length>0&&console.log(`(${n.length} module-hierarchy cycle(s) hidden \u2014 barrel files participating in normal parent/child re-export patterns. Pass --include-module-hierarchy to see them.)`)}}),Mq=fi({commandName:"deep-chains",query:({db:e,opts:t})=>sl(e,{limit:V(t,"limit",10),scope:_(t,"scope"),minDepth:F(t,"minDepth",3)}),emptyMessage:e=>e.length===0?"No deep chains found.":void 0,render:e=>{for(let t=0;t<e.length;t++){console.log(`
|
|
1020
|
+
Chain ${t+1} (depth ${e[t].depth}):`);for(let n of e[t].chain)console.log(` \u2192 ${n}`);console.log(` Tier: ${e[t].actionTier} Risk: ${e[t].chainKind}`),console.log(` Recommendation: ${e[t].recommendation}`),console.log(` Evidence: ${e[t].evidenceReasons.join("; ")}`)}}}),xx=[Ea({id:"hotspots",command:"hotspots",description:"Most-referenced symbols in the codebase (choke points)",options:[h("-n, --limit <n>","Number of results",I,30),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")],docs:E("Graph"),headers:["refs","files","symbol"],query:({db:e,opts:t})=>Uc(e,{limit:V(t,"limit",30),scope:_(t,"scope")}),format:e=>` ${String(e.refCount).padStart(4)} ${String(e.fileCount).padStart(5)} ${e.shortName}`}),{id:"fan-in",command:"fan-in [symbol]",description:"How many files reference a symbol (or top fan-in across codebase)",options:j([h("-n, --limit <n>","Number of results for top mode",I,30),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),renderShape:"custom",docs:E("Graph"),handler:Fq},{id:"fan-out",command:"fan-out [file]",description:"How many external symbols a file uses (or top fan-out across codebase)",options:j([h("-n, --limit <n>","Number of results for top mode",I,30),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),renderShape:"custom",docs:E("Graph"),handler:Tq},{id:"coupling",command:"coupling [file1] [file2]",description:"Coupling between two files, or top coupled pairs in codebase",options:j([h("-n, --limit <n>","Number of results for top mode",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded analysis on large indexes")]),renderShape:"custom",docs:E("Graph"),handler:_q},{id:"cycles",command:"cycles",description:"Detect circular dependency chains between files",options:j([h("-s, --scope <path>","Limit to files matching path"),h("--max-depth <n>","Maximum cycle depth",I,10)]),renderShape:"custom",docs:E("Graph"),handler:Aq},{id:"bottlenecks",command:"bottlenecks",description:"Find coupling hubs: high fan-in AND high fan-out",options:j([h("-n, --limit <n>","Number of results",I,20),h("-s, --scope <path>","Limit to files matching path"),h("--min-fan-in <n>","Minimum fan-in",I,2),h("--min-fan-out <n>","Minimum fan-out",I,2),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"candidate-scan",renderShape:"table",docs:E("Graph"),handler:Nq},{id:"deep-chains",command:"deep-chains",description:"Find the longest transitive dependency chains",options:j([h("-n, --limit <n>","Number of chains to show",I,10),h("-s, --scope <path>","Limit to files matching path"),h("--min-depth <n>","Minimum chain depth",I,3),h("--full","Run unbounded analysis on large indexes")]),renderShape:"custom",docs:E("Graph"),handler:Mq},Na({id:"call-graph",command:"call-graph <symbol>",description:"Show incoming callers and outgoing callees for a symbol",options:[h("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",docs:E("Graph"),query:({db:e,args:t,budget:n})=>Br(e,String(t[0]),{semantic:n.semantic}),emptyMessage:e=>e?void 0:"Symbol not found.",before:e=>{e&&console.log(`Symbol: ${e.shortName}
|
|
1021
|
+
`)},sections:e=>e?[{title:`CALLERS (${e.callers.length})`,rows:e.callers.map(t=>` ${t.file} ${t.shortName}`)},{title:`CALLEES (${e.callees.length})`,rows:e.callees.map(t=>` ${t.file} ${t.shortName}`)}]:[]})];var $q=le("complexity",({db:e,args:t,opts:n,budget:i})=>{let r=io(e,z(t,0),{semantic:i.semantic});if(P(n,"json")){B("complexity",t,n,r);return}if(!r)return N.empty("Symbol not found.");console.log(`${Fe(r.relativePath,r.startLine,r.endLine)} ${r.shortName}
|
|
1022
|
+
`),console.log(` LOC: ${r.loc}`),console.log(` Branches: ${r.branches}`),console.log(` Cyclomatic estimate: ${r.cyclomaticEstimate}`),console.log(` Callees: ${r.calleeCount}`),console.log(` Fan-in: ${r.fanIn}`),console.log(` Fan-out: ${r.fanOut}`)}),jq=ne(({db:e,args:t,opts:n})=>{let i=cu(e,{samples:F(n,"samples",50),scope:_(n,"scope")});if(P(n,"json")){B("self-audit",t,n,i);return}if(!i.available)return N.empty("No semantic or source-backed oracle available to audit against.");let r=i.oracleKind==="source"?"source facts":"compiler semantics";console.log(`Sampled ${i.sampleSize} symbols; ${r} oracle answered ${Math.round(i.oracleCoverage*100)}%.
|
|
1023
|
+
`),console.log(`Agreement with ${r} (file-level):`);for(let o of i.scores){let s=o.precision===null?`unverified ${o.unverified} (oracle partial \u2014 no precision claim)`:`precision ${o.precision}`;console.log(` ${o.question.padEnd(11)} ${s} recall ${o.recall} (${o.comparedSymbols} symbols)`)}if(i.topDisagreements.length>0){console.log(`
|
|
1024
|
+
Top disagreements (debugging targets):`);for(let o of i.topDisagreements)console.log(` ${o.symbol} [${o.question}]`),o.cheapOnly.length>0&&console.log(` cheap-only: ${o.cheapOnly.join(", ")}`),o.oracleOnly.length>0&&console.log(` oracle-only: ${o.oracleOnly.join(", ")}`)}}),Cx=[{id:"self-audit",command:"self-audit",description:"Score cheap evidence paths against the best available semantic/source oracle on sampled symbols",options:j([h("--samples <n>","Number of symbols to sample",I,50),h("-s, --scope <path>","Limit sampling to files matching path")]),renderShape:"custom",docs:E("Health",["scip-query self-audit --samples 100"]),handler:jq},{id:"complexity",command:"complexity <symbol>",description:"Per-symbol complexity: branches, cyclomatic estimate, fan-in/out, callees",options:j([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",docs:E("Health"),handler:$q}];var Oq=ne(({db:e,args:t,opts:n})=>{let i=zr(e,z(t,0),{maxDepth:F(n,"maxDepth",5),scope:_(n,"scope")});if(P(n,"json")){B("affected",t,n,i);return}if(i.length===0)return N.empty("No affected symbols found.");let r=-1;for(let o of i)o.depth!==r&&(console.log(`
|
|
1003
1025
|
\u2500\u2500 Depth ${o.depth} \u2500\u2500`),r=o.depth),console.log(` ${o.file} ${o.shortName}`);console.log(`
|
|
1004
|
-
${i.length} affected symbol(s) across ${new Set(i.map(o=>o.file)).size} files.`)}),
|
|
1026
|
+
${i.length} affected symbol(s) across ${new Set(i.map(o=>o.file)).size} files.`)}),Bq=ne(({db:e,args:t,opts:n})=>{let i=t[0]===void 0?void 0:z(t,0),r=Zn(e,i,{minTogether:F(n,"minTogether",4),limit:V(n,"limit",30),includeLinked:n.all===!0});if(P(n,"json")){B("co-change",t,n,r);return}if(!r.available)return N.empty("No git history available (not a repository, or git missing).");if(r.findings.length===0)return N.empty(i?`No co-change partners found for ${i} in ${r.commitsAnalyzed} commits.`:`No hidden coupling found in ${r.commitsAnalyzed} commits.`);console.log(i?`Co-change partners (${r.commitsAnalyzed} commits analyzed):
|
|
1005
1027
|
`:`Hidden coupling \u2014 pairs that co-change with no dependency edge (${r.commitsAnalyzed} commits analyzed):
|
|
1006
|
-
`);for(let o of r.findings){let s=o.structurallyLinked?" [dep edge]":"",a=` [${o.partnerClass}]`,c=` [${o.commitScope}/${o.recency}]`;console.log(` ${o.together}x (${Math.round(o.confidence*100)}%) ${o.fileA} <-> ${o.fileB}${a}${c}${s}`),console.log(` history: ${o.focusedTogether} focused, ${o.broadTogether} broad-sweep (${Math.round(o.broadCommitRatio*100)}% broad), ${o.recentTogether} recent; last ${
|
|
1007
|
-
${r.findings.length} pair(s). Co-editing one side without the other is how drift starts.`)});function
|
|
1008
|
-
`),N.list(r.symbols,o=>{let s=o.riskLevel==="high"?" *** HIGH RISK ***":o.riskLevel==="medium"?" * medium risk *":"";return` ${
|
|
1028
|
+
`);for(let o of r.findings){let s=o.structurallyLinked?" [dep edge]":"",a=` [${o.partnerClass}]`,c=` [${o.commitScope}/${o.recency}]`;console.log(` ${o.together}x (${Math.round(o.confidence*100)}%) ${o.fileA} <-> ${o.fileB}${a}${c}${s}`),console.log(` history: ${o.focusedTogether} focused, ${o.broadTogether} broad-sweep (${Math.round(o.broadCommitRatio*100)}% broad), ${o.recentTogether} recent; last ${Hq(o.lastTogetherAt)}`),console.log(` subjects: ${Vq(o.subjectContext)}`),o.declaredCouplingSuggestion&&console.log(` declare coupling: ${o.declaredCouplingSuggestion.name} (${o.declaredCouplingSuggestion.reason})`)}console.log(`
|
|
1029
|
+
${r.findings.length} pair(s). Co-editing one side without the other is how drift starts.`)});function Hq(e){return e<=0?"unknown":new Date(e*1e3).toISOString().slice(0,10)}function Vq(e){let t=e.subjectLabels.length>0?e.subjectLabels.slice(0,5).join(", "):"none inferred",n=e.issueRefs.length>0?e.issueRefs.slice(0,5).join(", "):"none",i=e.sampleSubjects.length>0?e.sampleSubjects.slice(0,3).map(r=>`"${r}"`).join("; "):"none";return`labels ${t}; refs ${n}; samples ${i}; external issue/PR labels ${e.externalIssueLabelStatus}`}var qq=le("change-surface",({db:e,args:t,opts:n,budget:i})=>{let r=Wr(e,z(t,0),{semantic:i.semantic});if(P(n,"json")){B("change-surface",t,n,r);return}if(!r)return N.empty("File not found in index.");console.log(`File: ${r.file}`),console.log(`External consumers: ${r.totalExternalConsumers}
|
|
1030
|
+
`),N.list(r.symbols,o=>{let s=o.riskLevel==="high"?" *** HIGH RISK ***":o.riskLevel==="medium"?" * medium risk *":"";return` ${_e(o.startLine,o.endLine)} ${o.shortName} [${o.externalConsumers} consumers]${s}`})}),Uq=le("incomplete-migration",({db:e,args:t,opts:n,budget:i})=>{let r=eo(e,{base:_(n,"base"),minContainment:F(n,"minContainment",.7),maxHelpers:Ae(n,"maxHelpers"),limit:V(n,"limit",20),scanLimit:i.scanLimit,semantic:i.semantic});if(P(n,"json")){B("incomplete-migration",t,n,r),r.available&&r.findings.length>0&&(process.exitCode=1);return}if(!r.available)return N.empty("No git history available (not a repository, or git missing).");if(r.changedFiles.length===0)return N.empty(`No changes vs ${r.base}.`);console.log(`Incomplete migrations vs ${r.base}: ${r.changedFiles.length} changed file(s), ${r.helpersChecked} new helper(s) scored.`),r.note&&console.log(` note: ${r.note}`);for(let o of r.skipped)console.log(` skipped ${o.helperShortName} (${o.helperFile}): ${o.reason}`);if(r.findings.length===0){console.log(`
|
|
1009
1031
|
No incomplete migrations detected.`);return}for(let o of r.findings){console.log(`
|
|
1010
1032
|
${o.helperShortName} (${o.helperFile})`),console.log(` helper shape: ${o.helperShape} (${o.specificHelperCalleeCount}/${o.helperCalleeCount} specific callees)`),console.log(` wired into: ${o.migratedFiles.join(", ")}`);for(let s of o.leftovers)console.log(` un-migrated: ${Math.round(s.containment*100)}% helper / ${Math.round(s.siteCoverage*100)}% site [${s.migrationScope}] ${s.shortName} (${s.file})`),console.log(` scope: ${s.migrationScopeReasons.join("; ")}`),s.uniqueSiteCalleeCount>0&&console.log(` extra site callees: ${s.uniqueSiteCalleeCount}`),console.log(` shared: ${s.sharedCallees.join(", ")}`)}console.log(`
|
|
1011
|
-
${r.findings.length} helper(s) with un-migrated sites. Finish the extraction or confirm the sites differ on purpose.`)});function
|
|
1012
|
-
`);for(let s of r.skipped)console.log(` skipped ${s.check}: ${s.reason}`);if(r.findings.length===0){console.log("PASS: this change introduces no gate findings.");return}let o=r.rootCauseGroups?.filter(s=>s.count>1)??[];if(o.length>0){console.log(`Root-cause groups (${o.length}):`);for(let s of o){console.log(` [${s.check}] ${s.count} finding(s), ${s.severity}${s.actionTier?`, tier: ${s.actionTier}`:""}`),(s.sourceAnalyzer||s.rootCauseKey)&&console.log(` source: ${s.sourceAnalyzer??s.check}${s.rootCauseKey?` root cause: ${s.rootCauseKey}`:""}`);let a=[...new Set([...s.files,...s.relatedFiles])].slice(0,6);a.length>0&&console.log(` files: ${a.join(", ")}`),console.log(` -> ${s.remediation}`)}console.log("")}for(let s of r.findings){if(console.log(` [${s.check}] ${s.message}`),s.partnerClass){console.log(` partner class: ${s.partnerClass}`);for(let a of s.partnerClassReasons??[])console.log(` reason: ${a}`)}s.citationKind&&console.log(` citation kind: ${s.citationKind}${s.actionTier?` (tier: ${s.actionTier})`:""}`);for(let a of s.citedClaims?.slice(0,2)??[])console.log(` cited claim: ${
|
|
1013
|
-
FAIL: ${r.findings.length} finding(s), ${r.rootCauseGroups?.length??r.findings.length} root-cause group(s). Fix or knowingly accept before merging.`),process.exitCode=1}),
|
|
1014
|
-
`).map((s,a)=>` ${
|
|
1015
|
-
`))}let n=[],i="";for(let r of e.referencedBy)r.relativePath!==i&&(i&&n.push(""),n.push(` ${r.relativePath}`),i=r.relativePath),n.push(` line ${
|
|
1033
|
+
${r.findings.length} helper(s) with un-migrated sites. Finish the extraction or confirm the sites differ on purpose.`)});function zq(e){let t=Array.isArray(e)?e:[],n=t.filter(i=>!Ws.includes(i));return n.length>0&&(console.error(`error: unknown --skip check(s): ${n.join(", ")}. Valid checks: ${Ws.join(", ")}`),process.exit(1)),t}var Wq=ne(({db:e,opts:t})=>{let n=t.hook===!0;if(n&&va(So()))return;let i=ra(e,"diff-gate",P(t,"full"),{quiet:n||P(t,"json")}),r=no(e,{base:_(t,"base"),minTogether:F(t,"minTogether",6),maxEchoChecks:Ae(t,"maxEchoChecks"),maxHelpers:Ae(t,"maxHelpers"),includeBaseline:P(t,"baseline"),scanLimit:i.scanLimit,semantic:i.semantic,skip:zq(t.skip)});if(!n&&P(t,"json")){B("diff-gate",[],t,{exitCode:r.findings.length>0?1:0,...r}),r.findings.length>0&&(process.exitCode=1);return}if(n){if(r.findings.length===0)return;console.error(xo(r)),process.exitCode=2;return}if(r.changedFiles.length===0)return N.empty(r.note??`No changes vs ${r.base}.`);console.log(`Diff gate vs ${r.base}: ${r.changedFiles.length} file(s), ${r.changedSymbols} symbol(s) changed.`),console.log(`Checks: ${r.checksRun.join(", ")}
|
|
1034
|
+
`);for(let s of r.skipped)console.log(` skipped ${s.check}: ${s.reason}`);if(r.findings.length===0){console.log("PASS: this change introduces no gate findings.");return}let o=r.rootCauseGroups?.filter(s=>s.count>1)??[];if(o.length>0){console.log(`Root-cause groups (${o.length}):`);for(let s of o){console.log(` [${s.check}] ${s.count} finding(s), ${s.severity}${s.actionTier?`, tier: ${s.actionTier}`:""}`),(s.sourceAnalyzer||s.rootCauseKey)&&console.log(` source: ${s.sourceAnalyzer??s.check}${s.rootCauseKey?` root cause: ${s.rootCauseKey}`:""}`);let a=[...new Set([...s.files,...s.relatedFiles])].slice(0,6);a.length>0&&console.log(` files: ${a.join(", ")}`),console.log(` -> ${s.remediation}`)}console.log("")}for(let s of r.findings){if(console.log(` [${s.check}] ${s.message}`),s.partnerClass){console.log(` partner class: ${s.partnerClass}`);for(let a of s.partnerClassReasons??[])console.log(` reason: ${a}`)}s.citationKind&&console.log(` citation kind: ${s.citationKind}${s.actionTier?` (tier: ${s.actionTier})`:""}`);for(let a of s.citedClaims?.slice(0,2)??[])console.log(` cited claim: ${ta(a)}`);s.declaredCouplingSuggestion&&console.log(` declare coupling: ${s.declaredCouplingSuggestion.name} (${s.declaredCouplingSuggestion.reason})`),console.log(` -> ${s.remediation}`)}console.log(`
|
|
1035
|
+
FAIL: ${r.findings.length} finding(s), ${r.rootCauseGroups?.length??r.findings.length} root-cause group(s). Fix or knowingly accept before merging.`),process.exitCode=1}),vx=[{id:"affected",command:"affected <symbol>",description:"Transitive closure of symbols that could break if this symbol changes",options:j([h("--max-depth <n>","Maximum traversal depth",I,5),h("-s, --scope <path>","Limit to files matching path")]),renderShape:"custom",docs:E("Impact"),handler:Oq},{id:"change-surface",command:"change-surface <file>",description:"Pre-change briefing: exports, consumers, and blast-radius risk",options:j([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"list",docs:E("Impact"),handler:qq},{id:"diff-gate",command:"diff-gate",description:"Gate the current diff: echo candidates, incomplete migrations, missing co-change partners, uncited doc updates, unused params, new dead symbols; exit 1 on findings",options:[h("--base <ref>","Git ref to diff against (default: HEAD)"),h("--min-together <n>","Minimum historical co-changes for the partner check",I,6),h("--max-echo-checks <n>","Maximum changed symbols to test for echoes (default: all)",I),h("--max-helpers <n>","Maximum new helpers to score for incomplete-migration (default: all)",I),h("--baseline","Also run the full health-baseline ratchet"),h("--full","Run unbounded semantic analysis on large indexes"),h("--skip <check>","Skip a check (repeatable): echo, incomplete-migration, co-change-partner, doc-reference, unused-params, new-dead, baseline",uo,[]),h("--hook","Agent Stop-hook mode: silent on pass, exit 2 with findings on stderr to block the stop"),h("--json","Output as JSON for programmatic consumption")],heuristic:{label:"diff gate candidates"},renderShape:"custom",docs:E("Impact",["scip-query diff-gate","scip-query diff-gate --base origin/main"]),handler:Wq},{id:"incomplete-migration",command:"incomplete-migration",description:"Partially-completed extraction candidates: new helpers in the diff wired into some sites while similar un-migrated sites remain",options:j([h("--base <ref>","Git ref to diff against (default: HEAD)"),h("--min-containment <n>","Minimum share of helper callees a site must contain (0-1)",xt,.7),h("--max-helpers <n>","Maximum new helpers to score (default: all)",I),h("-n, --limit <n>","Maximum findings to report",I,20),h("--full","Run unbounded analysis on large indexes")]),heuristic:{label:"incomplete migration candidates"},renderShape:"custom",docs:E("Impact",["scip-query incomplete-migration","scip-query incomplete-migration --base origin/main"]),handler:Uq},{id:"co-change",command:"co-change [file]",description:"Files that change together in git history without a dependency edge \u2014 hidden coupling candidates",options:j([h("--min-together <n>","Minimum commits where both files changed",I,4),h("-n, --limit <n>","Maximum pairs to report",I,30),h("--all","Include pairs that already have a dependency edge"),h("--full","Run unbounded analysis on large indexes")]),heuristic:{label:"co-change candidates"},renderShape:"custom",docs:E("Impact",["scip-query co-change","scip-query co-change src/runtime/config.ts"]),handler:Bq}];function Gq(e){let t=[];for(let r of e.definitions){let o=r.signature?` \u2014 ${r.signature}`:"";t.push(` ${Fe(r.relativePath,r.startLine,r.endLine)}${o}`),r.source&&t.push(r.source.split(`
|
|
1036
|
+
`).map((s,a)=>` ${Qe(r.startLine+a)} ${s}`).join(`
|
|
1037
|
+
`))}let n=[],i="";for(let r of e.referencedBy)r.relativePath!==i&&(i&&n.push(""),n.push(` ${r.relativePath}`),i=r.relativePath),n.push(` line ${Qe(r.line)} in ${r.enclosingShort}`);return[{title:"DEFINITION",rows:t},{title:"REFERENCED BY",rows:n}]}var Kq=ne(({db:e,args:t,opts:n})=>{let i=z(t,0),r=P(n,"signatures"),o=Jc(e,i);if(P(n,"json")){B("outline",t,n,o);return}if(o.length===0)return N.empty(`No symbols found for "${i}".`);function s(a,c){for(let l of a){let d=" ".repeat(c),u=r&&l.signature?` - ${Jq(l.signature)}`:"";console.log(`${d}${_e(l.startLine,l.endLine)} ${l.shortName}${u}`),s(l.children,c+1)}}s(o,0)});function Jq(e){return e.length>120?`${e.slice(0,117)}...`:e}var Xq=nn("imports",{query:({db:e,args:t,budget:n})=>zc(e,z(t,0),{semantic:n.semantic}),format:e=>` ${e.shortName} \u2190 ${e.fromFile}`,emptyMessage:()=>"No imports found (indexer may not emit role=2 for this language)."}),Qq=Da("refs",{query:({db:e,args:t,budget:n})=>Bc(e,z(t,0),{semantic:n.semantic}),format:e=>` line ${Qe(e.line)}`}),Yq=ne(({db:e,args:t,opts:n})=>{let i=ru(e,z(t,0),{context:F(n,"context",0)});if(P(n,"json")){B("code",t,n,i);return}if(!i)return N.empty("Symbol not found or file unreadable.");console.log(`${Fe(i.relativePath,i.startLine,i.endLine)} ${i.shortName} [${i.language??"unknown"}]
|
|
1016
1038
|
`);let r=i.source.split(`
|
|
1017
|
-
`);for(let o=0;o<r.length;o++)console.log(` ${String(
|
|
1018
|
-
`),r.definitionSites.length>0){console.log(" \u2550\u2550\u2550 DEFINED AT \u2550\u2550\u2550");for(let o of r.definitionSites)console.log(` ${o.file}:${
|
|
1019
|
-
\u2550\u2550\u2550 USED AT \u2550\u2550\u2550`);for(let o of r.usageSites)console.log(` ${o.file}:${
|
|
1039
|
+
`);for(let o=0;o<r.length;o++)console.log(` ${String(Qe(i.startLine+o)).padStart(4)} ${r[o]}`)}),Zq=le("dataflow",({db:e,args:t,opts:n,budget:i})=>{let r=ro(e,z(t,0),{semantic:i.semantic});if(P(n,"json")){B("dataflow",t,n,r);return}if(!r)return N.empty("Symbol not found.");if(console.log(`${r.shortName} (${r.relativePath})
|
|
1040
|
+
`),r.definitionSites.length>0){console.log(" \u2550\u2550\u2550 DEFINED AT \u2550\u2550\u2550");for(let o of r.definitionSites)console.log(` ${o.file}:${Qe(o.line)}`)}if(r.usageSites.length>0){console.log(`
|
|
1041
|
+
\u2550\u2550\u2550 USED AT \u2550\u2550\u2550`);for(let o of r.usageSites)console.log(` ${o.file}:${Qe(o.line)} in ${o.enclosingShort}`)}if(r.producers.length>0){console.log(`
|
|
1020
1042
|
\u2550\u2550\u2550 PRODUCERS (feeds into this) \u2550\u2550\u2550`);for(let o of r.producers)console.log(` ${o.file} ${o.shortName}`)}if(r.consumers.length>0){console.log(`
|
|
1021
|
-
\u2550\u2550\u2550 CONSUMERS (this feeds into) \u2550\u2550\u2550`);for(let o of r.consumers)console.log(` ${o.file} ${o.shortName}`)}}),
|
|
1043
|
+
\u2550\u2550\u2550 CONSUMERS (this feeds into) \u2550\u2550\u2550`);for(let o of r.consumers)console.log(` ${o.file} ${o.shortName}`)}}),eU=le("slice",({db:e,args:t,opts:n,budget:i})=>{let r=P(n,"forward")?"forward":"backward",o=Ki(e,z(t,0),{direction:r,maxDepth:F(n,"depth",3),semantic:i.semantic});if(P(n,"json")){B("slice",t,n,o);return}if(!o)return N.empty("Symbol not found.");if(console.log(`${o.direction} slice of ${o.shortName}
|
|
1022
1044
|
`),o.connectedSymbols.length===0){console.log(" No connected symbols found.");return}N.list(o.connectedSymbols,s=>` ${s.file} ${s.shortName}
|
|
1023
1045
|
${s.relationship}`),console.log(`
|
|
1024
|
-
${o.connectedSymbols.length} connected symbol(s).`)}),
|
|
1025
|
-
${e.length} symbol(s)`)}),
|
|
1026
|
-
`).map((o,s)=>` ${String(Je(i.startLine+s)).padStart(4)} ${o}`))}return n.length===0&&n.push(...e.system.symbols.map(i=>` ${Ee(i.startLine,i.endLine)} ${i.shortName}`)),un(n,t).rows}function pH(e,t){let n=e.trace.referencedBy.map(i=>` ${i.relativePath}:${Je(i.line)} in ${i.enclosingShort}`);return Zn(un(n,t))}function fH(e,t){if(!e.callGraph)return[];let n=e.callGraph.callers.map(r=>` caller ${r.file} ${r.shortName}`),i=e.callGraph.callees.map(r=>` callee ${r.file} ${r.shortName}`);return Zn(un([...n,...i],t))}function gH(e,t){if(!e.dataflow)return[];let n=e.dataflow.producers.map(o=>` producer ${o.file} ${o.shortName}`),i=e.dataflow.consumers.map(o=>` consumer ${o.file} ${o.shortName}`),r=e.dataflow.usageSites.map(o=>` usage ${o.file}:${Je(o.line)} in ${o.enclosingShort}`);return Zn(un([...n,...i,...r],t))}function hH(e,t){let n=[...e.deps.map(i=>` file depends on ${i.relativePath}`),...e.rdeps.map(i=>` file depended on by ${i.relativePath}`),...e.system.dependsOn.map(i=>` module depends on ${i}`),...e.system.dependedOnBy.map(i=>` module used by ${i}`)];return Zn(un(n,t))}function yH(e,t){let n=[...e.system.files.map(i=>` file ${i}`),...e.system.symbols.map(i=>` export ${Ee(i.startLine,i.endLine)} ${i.shortName}`),...e.surface.map(i=>` use ${i.consumer} -> ${i.shortName}`)];return Zn(un(n,t))}function bH(e,t){let n=[],i=-1;for(let r of e.affected)r.depth!==i&&(n.push(` -- Depth ${r.depth} --`),i=r.depth),n.push(` ${r.file} ${r.shortName}`);return Zn(un(n,t))}function SH(e,t){let n=[];return e.changeSurface&&(n.push(` File: ${e.changeSurface.file}`),n.push(` External consumers: ${e.changeSurface.totalExternalConsumers}`),n.push(...e.changeSurface.symbols.map(i=>{let r=i.riskLevel==="high"?" *** HIGH RISK ***":i.riskLevel==="medium"?" * medium risk *":"";return` ${Ee(i.startLine,i.endLine)} ${i.shortName} [${i.externalConsumers} consumers]${r}`}))),e.complexity&&(n.push(` Complexity: ${Pe(e.complexity.relativePath,e.complexity.startLine,e.complexity.endLine)} ${e.complexity.shortName}`),n.push(` LOC: ${e.complexity.loc}`),n.push(` Branches: ${e.complexity.branches}`),n.push(` Cyclomatic estimate: ${e.complexity.cyclomaticEstimate}`),n.push(` Callees: ${e.complexity.calleeCount}`),n.push(` Fan-in: ${e.complexity.fanIn}`),n.push(` Fan-out: ${e.complexity.fanOut}`)),Zn(un(n,t))}function xH(e){let t=e.history;if(!t.available||!t.file)return[];let n=[];if(t.churn){let i=t.churn.fixChanges>0?`, ${t.churn.fixChanges} in fix commits`:"";n.push(` Churn: ${t.churn.changes} change(s) in recent history${i}`)}for(let i of t.coChangePartners)n.push(` Usually changes with: ${i.file} (${i.together}x, ${Math.round(i.confidence*100)}%)`);return t.suppressionsInFile>0&&n.push(` Detector suppressions in file: ${t.suppressionsInFile} (accepted findings \u2014 read the reasons before refactoring)`),n}function CH(e){let t=e.warnings.map(i=>` ${i}`);return e.history.coChangePartners.length>0&&t.push(" Check the HISTORY co-change partners \u2014 editing this file usually means editing them too."),(e.changeSurface?.symbols.filter(i=>i.riskLevel==="high")??[]).length>0&&t.push(" Inspect high-risk consumers before editing public behavior."),e.affected.length>0&&t.push(" Validate downstream consumers at the shallowest affected depths first."),t}function un(e,t){let n=Math.max(1,t);return{rows:e.slice(0,n),omitted:Math.max(0,e.length-n)}}function Zn(e){return e.omitted>0?[...e.rows,` ... ${e.omitted} more`]:e.rows}function vu(e){return e?"yes":"no"}var nS=["stats","files","methods","refs","trace","deps","rdeps","system","surface","dead","hotspots","imports","imported-by","unused-imports","outline","members","fan-in","fan-out","coupling","cycles","bottlenecks","isolated","by-kind","kind-counts","deep-chains","hierarchy","call-graph","similar","similar-files","react-component-duplicates","react-hook-candidates","react-large-component-pressure","vue-component-duplicates","vue-composable-candidates","vue-large-view-pressure","similar-chains","extract-candidates","locality-candidates","affected","change-surface","cleanup-plan","cleanup-apply","co-change","recent-duplicates","doc-drift","unused-params","diff-gate","incomplete-migration","plan-context","drift","wrapper-candidates","passthrough-candidates","stale-abstractions","complexity-hotspots","self-audit","convergence","code","complexity","dataflow","slice","redundant-reexports","similar-signatures"],vH=[Qb,eS,Xb,aa,Zb,tS,Yb],iS=vH.flat(),RH=new Map(iS.map(e=>[e.id,e]));for(let e of iS)if(!nS.includes(e.id))throw new Error(`Query command descriptor is not ordered: ${e.id}`);var Xi=nS.map(e=>kH(e));function kH(e){let t=RH.get(e);if(!t)throw new Error(`Unknown query command descriptor: ${e}`);return t}var wH=Xi.slice(0,Ru("plan-context")),IH=Xi.slice(ca("drift"),Ru("self-audit")),LH=Xi.slice(ca("convergence"),Ru("slice")),DH=Xi.slice(ca("redundant-reexports")),rS=[{id:"reindex",command:"reindex",description:"Index the codebase and convert to SQLite",options:[h("-l, --language <lang>","Index only this language (can be repeated)",Xr,[]),h("--pnpm-workspaces","Enable pnpm workspace support (TypeScript)"),h("--force","Rebuild even if source inputs are unchanged"),h("--allow-partial","Write an incomplete index when one or more detected languages fail"),h("--indexer-concurrency <n>","Number of language indexers to run at once",Yr)],renderShape:"custom",docs:P("Indexing",["scip-query reindex"]),handler:Qy},{id:"augment-sources",command:"augment-sources",description:"Add source files skipped by upstream SCIP indexers to the SQLite documents table",renderShape:"custom",docs:P("Indexing"),handler:Xy},{id:"augment-vue",command:"augment-vue",description:"Add compiler-resolved Vue SFC references to the SQLite index using Volar",options:[h("--project <tsconfig>","Vue tsconfig path",void 0,"frontend/tsconfig.scip.json")],renderShape:"custom",docs:P("Indexing"),handler:Yy},...wH,{id:_s,command:_s,description:"Internal diff-impact batch worker",hidden:!0,options:[h("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",handler:Zy},{id:"diff-impact",command:"diff-impact",description:"Compute changed symbols and downstream consumers from current git diff",options:$([h("--base <ref>","Git ref to diff against (default: HEAD)")]),renderShape:"custom",docs:P("Impact"),handler:eb},...IH,{id:Qr,command:Qr,description:"Internal health phase worker",hidden:!0,arguments:[{name:"<phase>"}],options:[h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded candidate analyses on large indexes")],renderShape:"custom",handler:tb},{id:"health",command:"health",description:"Composite codebase health report with prioritized action list",options:[h("-s, --scope <path>","Limit to files matching path"),h("--full","Compatibility flag; health already runs unbounded candidate analyses by default"),h("--json","Output as JSON for programmatic consumption"),h("--baseline","Compare findings against the committed baseline; exit 1 on new findings"),h("--write-baseline","Snapshot current finding identities to the baseline file")],renderShape:"custom",docs:P("Health",["scip-query health --json","scip-query health --baseline"]),handler:nb},{id:"bench",command:"bench",description:"Benchmark indexing and command runtimes for this repository",options:[h("--json","Output as JSON for programmatic consumption"),h("--cold-index","Temporarily clear this project index cache and measure a cold rebuild"),h("--include-heavy","Include expensive full-detector commands in the command matrix"),h("--command <cmd>","Benchmark a specific scip-query command (can be repeated)",Xr,[]),h("--timeout-ms <n>","Per-command timeout in milliseconds",Yr,18e4),h("--progress","Print benchmark command start/finish progress to stderr"),h("--profile","Enable low-overhead phase profiling in benchmarked commands"),h("--profile-out <path>","Append benchmark and phase profile events as JSONL")],renderShape:"custom",docs:P("Maintenance",["scip-query bench","scip-query bench --json --cold-index"]),handler:ib},...LH,{id:"install-skills",command:"install-skills",description:`Install skills (${gu.join(", ")}) into Claude Code, Codex, and shared agent roots`,renderShape:"custom",docs:P("Maintenance"),handler:sb},{id:"setup-hooks",command:"setup-hooks",description:"Install or refresh project-local Codex and Claude Code lifecycle hooks",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:P("Maintenance",["scip-query setup-hooks","scip-query setup-hooks --json"]),handler:ab},{id:"hook-context",command:"hook-context",description:"Internal agent lifecycle hook context renderer",hidden:!0,renderShape:"custom",handler:ky},{id:"hook-stop",command:"hook-stop",description:"Internal agent Stop hook wrapper for diff-gate",hidden:!0,renderShape:"custom",handler:wy},{id:"check-deps",command:"check-deps",description:"Check whether scip-query and the detected language indexers are actually runnable",renderShape:"custom",docs:P("Maintenance"),handler:cb},{id:"capabilities",command:"capabilities",description:"Report which evidence and verification capabilities are available in this project",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:P("Maintenance"),handler:lb},{id:"capability-matrix",command:"capability-matrix",description:"Report the evidence and verification capability matrix by language",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:P("Maintenance"),handler:ub},...DH,{id:"init",command:"init",description:"Create a .scipquery.json config file for this project",renderShape:"custom",docs:P("Maintenance"),handler:mb},{id:"config-validate",command:"config-validate",description:"Validate .scipquery.json, including structured suppressions and declared coupling groups",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:P("Maintenance",["scip-query config-validate"]),handler:pb},{id:"suppress",command:"suppress <id>",description:"Record an accepted finding in .scipquery.json with a required reason",options:$([h("--reason <text>","Required human reason for accepting the finding"),h("--check <check>","Optional detector/check name to narrow the suppression"),h("--file <path>","Optional file path to narrow the suppression"),h("--expires-at <iso>","Optional ISO date after which the suppression expires")]),renderShape:"custom",docs:P("Maintenance",['scip-query suppress SQABC123DEF456 --reason "intentional boundary"']),handler:fb},{id:"doctor",command:"doctor",description:"Diagnose config, index freshness, dependency readiness, and project capabilities",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:P("Maintenance"),handler:gb},{id:"setup",command:"setup",description:"Bootstrap this project: install agent skills, refresh the index, verify capabilities, and report health",options:$([h("--git-hook","Also install a git pre-commit hook that runs diff-gate")]),renderShape:"custom",docs:P("Maintenance",["scip-query setup","scip-query setup --json"]),handler:bb},{id:"setup-agent",command:"setup-agent",description:"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",options:[h("--git-hook","Also install a git pre-commit hook that runs diff-gate")],renderShape:"custom",docs:P("Maintenance",["scip-query setup-agent","scip-query setup-agent --git-hook"]),handler:yb},{id:"setup-ci",command:"setup-ci",description:"Write a GitHub Actions workflow that runs scip-query reindex and diff-gate on pull requests",options:[h("--force","Overwrite an existing workflow"),h("--dry-run","Print the workflow without writing it")],renderShape:"custom",docs:P("Maintenance",["scip-query setup-ci"]),handler:Sb},{id:"watch",command:"watch",description:"Watch for file changes and reindex automatically",options:[h("--debounce <ms>","Ms to wait after last change (default: 30000)",Ms),h("--cooldown <ms>","Min ms between reindexes (default: 60000)",Ms),h("--git-poll <ms>","Ms between Git HEAD/index checks (default: 2000)",Ms)],renderShape:"custom",docs:P("Maintenance"),handler:xb},{id:"status",command:"status",description:"Show index status for this project",options:[h("--json","Output as JSON for programmatic consumption"),h("--capabilities","Include the project capability matrix")],renderShape:"custom",docs:P("Maintenance"),handler:Cb}];function ca(e){let t=Xi.findIndex(n=>n.id===e);if(t<0)throw new Error(`Ordered query command descriptor is missing: ${e}`);return t}function Ru(e){return ca(e)+1}function oS(e,t){return t.map(n=>{let i=n.hidden?e.command(n.command,{hidden:!0}):e.command(n.command);i.description(n.description);for(let r of n.arguments??[])i.argument(r.name);for(let r of n.options??[])r.parser&&Object.hasOwn(r,"defaultValue")?i.option(r.flags,r.description,r.parser,r.defaultValue):r.parser?i.option(r.flags,r.description,r.parser):Object.hasOwn(r,"defaultValue")?i.option(r.flags,r.description,r.defaultValue):i.option(r.flags,r.description);return i.action(async(...r)=>{try{await n.handler(...r)}catch(o){PH(o)}}),{descriptor:n,command:i}})}function PH(e){let t=e instanceof Error?e.message:String(e);console.error(`error: ${t}`),process.exitCode=1}import{existsSync as NH,mkdirSync as EH,readFileSync as TH,writeFileSync as FH}from"fs";import{homedir as _H}from"os";import{join as la}from"path";var AH=1440*60*1e3,aS="update-check.json",$H="https://registry.npmjs.org/scip-query/latest";async function cS(e={}){let t=e.env??process.env;if(t.SCIP_QUERY_UPDATE_CHECK==="0"||t.NO_UPDATE_NOTIFIER)return;let n=e.cacheDir??jH(t),i=e.now??Date.now(),r=e.currentVersion??Fs,o=BH(n),s=o&&i-o.checkedAt<AH?o.latestVersion:await HH(n,e.fetchLatestVersion??qH,i);if(!s||!OH(s,r))return;(e.writeNotice??(c=>console.error(c)))(MH(r,s))}function MH(e,t){return[`scip-query update available: ${e} -> ${t}.`,"Agent: tell your human to update with: npm install -g scip-query@latest",""].join(`
|
|
1027
|
-
`)}function
|
|
1028
|
-
`)}catch{}}async function
|
|
1046
|
+
${o.connectedSymbols.length} connected symbol(s).`)}),Rx=[Bt({id:"files",command:"files <pattern>",description:"Find files matching a pattern",docs:E("Navigation",["scip-query files auth"]),query:({db:e,args:t})=>Ma(e,z(t,0)),format:e=>e.relativePath}),Bt({id:"methods",command:"methods <className>",description:"List methods of a class (with line ranges)",docs:E("Navigation"),query:({db:e,args:t})=>Oc(e,z(t,0)),format:e=>` ${_e(e.startLine,e.endLine)} ${e.name}`}),{id:"refs",command:"refs <symbol>",description:"Find all files referencing a symbol",options:[h("--full","Run unbounded semantic analysis on large indexes"),h("--json","Output as JSON for programmatic consumption")],budget:"semantic",renderShape:"grouped-by-file",docs:E("Navigation",["scip-query refs login"]),handler:Qq},Na({id:"trace",command:"trace <symbol>",description:"Trace a symbol: definition + all references",options:[h("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",docs:E("Navigation",["scip-query trace parseSymbol"]),query:({db:e,args:t,budget:n})=>Tr(e,z(t,0),{semantic:n.semantic}),sections:Gq}),Bt({id:"deps",command:"deps <file>",description:"Files this file depends on (internal)",docs:E("Navigation"),query:({db:e,args:t})=>_r(e,z(t,0)),format:e=>e.relativePath}),Bt({id:"rdeps",command:"rdeps <file>",description:"Files that depend on this file/module",docs:E("Navigation"),query:({db:e,args:t})=>Ar(e,z(t,0)),format:e=>e.relativePath}),WS({id:"system",command:"system <module>",description:"Full module map: files, symbols, deps in/out",docs:E("Navigation",["scip-query system queries"]),query:({db:e,args:t})=>Mr(e,z(t,0)),sections:e=>[{title:"FILES",rows:e.files},{title:"EXPORTED SYMBOLS",rows:e.symbols.map(t=>` ${_e(t.startLine,t.endLine)} ${t.shortName}`)},{title:"DEPENDS ON (internal)",rows:e.dependsOn.map(t=>` ${t}`)},{title:"DEPENDED ON BY",rows:e.dependedOnBy.map(t=>` ${t}`)}]}),Bt({id:"surface",command:"surface <module>",description:"What symbols consumers actually use from this module",docs:E("Navigation"),query:({db:e,args:t})=>$r(e,z(t,0)),format:e=>` ${e.consumer} \u2192 ${e.shortName}`}),{id:"imports",command:"imports <file>",description:"What symbols does this file import?",options:[h("--full","Run unbounded semantic analysis on large indexes"),h("--json","Output as JSON for programmatic consumption")],budget:"semantic",renderShape:"list",docs:E("Navigation"),handler:Xq},Bt({id:"imported-by",command:"imported-by <symbol>",description:"Which files import this symbol?",docs:E("Navigation"),query:({db:e,args:t})=>Wc(e,z(t,0)),format:e=>` ${e.fromFile}`}),{id:"outline",command:"outline <file>",description:"Tree view of symbols in a file, with line ranges",options:j([h("--signatures","Show trimmed symbol signatures")]),renderShape:"custom",docs:E("Navigation"),handler:Kq},Bt({id:"members",command:"members <symbol>",description:"All children of a symbol (methods, fields, nested types)",docs:E("Navigation"),query:({db:e,args:t})=>Xc(e,z(t,0)),format:e=>` ${_e(e.startLine,e.endLine)} [${e.kind}] ${e.shortName}`}),Bt({id:"by-kind",command:"by-kind <kind>",description:"Find symbols by SCIP kind (class, interface, enum, function, etc.)",options:[h("-s, --scope <path>","Limit to files matching path"),h("-n, --limit <n>","Number of results",I,100),h("--full","Run unbounded analysis on large indexes")],docs:E("Navigation"),query:({db:e,args:t,opts:n})=>rl(e,z(t,0),{scope:_(n,"scope"),limit:V(n,"limit",100)}),format:e=>` ${Fe(e.relativePath,e.startLine,e.endLine)} [${e.kindName}] ${e.shortName}`,emptyMessage:({args:e})=>`No symbols found for kind "${z(e,0)}". Use "kind-counts" to see available kinds.`,after:e=>console.log(`
|
|
1047
|
+
${e.length} symbol(s)`)}),Ea({id:"kind-counts",command:"kind-counts",description:"Histogram of symbol kinds in the codebase",options:[h("-s, --scope <path>","Limit to files matching path")],docs:E("Navigation"),headers:["count","kind"],query:({db:e,opts:t})=>ol(e,{scope:_(t,"scope")}),format:e=>` ${String(e.count).padStart(5)} ${e.kindName} (${e.kind})`}),Bt({id:"hierarchy",command:"hierarchy <symbol>",description:"Show a symbol's ancestry chain (method \u2192 class \u2192 module)",docs:E("Navigation"),query:({db:e,args:t})=>al(e,z(t,0)),format:e=>`${" ".repeat(e.depth)}${e.shortName}`,emptyMessage:()=>"Symbol not found."}),{id:"code",command:"code <symbol>",description:"Read the source code for a symbol (bounded to its definition range)",options:j([h("-C, --context <n>","Extra lines of context above/below",I,0)]),renderShape:"custom",docs:E("Navigation"),handler:Yq},{id:"dataflow",command:"dataflow <symbol>",description:"Reference-level dataflow: definition sites, usage sites, producers, consumers",options:j([h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",docs:E("Navigation"),handler:Zq},{id:"slice",command:"slice <symbol>",description:"Reference-level program slice: what affects this (backward) or what this affects (forward)",options:j([h("--forward","Forward slice (what does this affect). Default is backward."),h("--depth <n>","Max transitive depth for backward slice",I,3),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",docs:E("Navigation"),handler:eU}];var tU=le("plan-context",({db:e,args:t,opts:n,budget:i})=>{let r=V(n,"limit",20),o=Ql(e,z(t,0),{semantic:i.semantic,impactDepth:F(n,"impactDepth",3),sliceDepth:F(n,"sliceDepth",3),scope:_(n,"scope")});if(o.warnings.length===1&&o.warnings[0]==="No symbol, file, or module matched target."){if(P(n,"json")){B("plan-context",t,n,o);return}return N.empty(o.warnings[0])}if(P(n,"json")){B("plan-context",t,n,o);return}let s=[{title:"TARGET",rows:nU(o)},{title:"DEFINITIONS",rows:iU(o,r),skipIfEmpty:!0},{title:"REFERENCES",rows:rU(o,r),skipIfEmpty:!0},{title:"CALL GRAPH",rows:oU(o,r),skipIfEmpty:!0},{title:"DATAFLOW",rows:sU(o,r),skipIfEmpty:!0},{title:"DEPENDENCIES",rows:aU(o,r),skipIfEmpty:!0},{title:"SURFACE",rows:cU(o,r),skipIfEmpty:!0},{title:"DOWNSTREAM IMPACT",rows:lU(o,r),skipIfEmpty:!0},{title:"CHANGE RISK",rows:uU(o,r),skipIfEmpty:!0},{title:"HISTORY",rows:dU(o),skipIfEmpty:!0},{title:"PLANNING NOTES",rows:mU(o),skipIfEmpty:!0}];N.sectionedReport(s)}),kx=[{id:"plan-context",command:"plan-context <target>",description:"Pre-edit planning context for a symbol, file, or module",options:j([h("--impact-depth <n>","Maximum affected traversal depth",I,3),h("--slice-depth <n>","Maximum backward slice depth",I,3),h("-s, --scope <path>","Limit downstream impact to files matching path"),h("-n, --limit <n>","Rows per section",I,20),h("--full","Run unbounded semantic analysis on large indexes")]),budget:"semantic",renderShape:"custom",docs:E("Planning",["scip-query plan-context parseSymbol"]),handler:tU}];function nU(e){return[`Target: ${e.target}`,`Matched: symbol=${sd(e.matched.symbol)} file=${sd(e.matched.file)} module=${sd(e.matched.module)}`]}function iU(e,t){let n=[];for(let i of e.trace.definitions){let r=i.signature?` -- ${i.signature}`:"";n.push(` ${Fe(i.relativePath,i.startLine,i.endLine)}${r}`),i.source&&n.push(...i.source.split(`
|
|
1048
|
+
`).map((o,s)=>` ${String(Qe(i.startLine+s)).padStart(4)} ${o}`))}return n.length===0&&n.push(...e.system.symbols.map(i=>` ${_e(i.startLine,i.endLine)} ${i.shortName}`)),kn(n,t).rows}function rU(e,t){let n=e.trace.referencedBy.map(i=>` ${i.relativePath}:${Qe(i.line)} in ${i.enclosingShort}`);return hi(kn(n,t))}function oU(e,t){if(!e.callGraph)return[];let n=e.callGraph.callers.map(r=>` caller ${r.file} ${r.shortName}`),i=e.callGraph.callees.map(r=>` callee ${r.file} ${r.shortName}`);return hi(kn([...n,...i],t))}function sU(e,t){if(!e.dataflow)return[];let n=e.dataflow.producers.map(o=>` producer ${o.file} ${o.shortName}`),i=e.dataflow.consumers.map(o=>` consumer ${o.file} ${o.shortName}`),r=e.dataflow.usageSites.map(o=>` usage ${o.file}:${Qe(o.line)} in ${o.enclosingShort}`);return hi(kn([...n,...i,...r],t))}function aU(e,t){let n=[...e.deps.map(i=>` file depends on ${i.relativePath}`),...e.rdeps.map(i=>` file depended on by ${i.relativePath}`),...e.system.dependsOn.map(i=>` module depends on ${i}`),...e.system.dependedOnBy.map(i=>` module used by ${i}`)];return hi(kn(n,t))}function cU(e,t){let n=[...e.system.files.map(i=>` file ${i}`),...e.system.symbols.map(i=>` export ${_e(i.startLine,i.endLine)} ${i.shortName}`),...e.surface.map(i=>` use ${i.consumer} -> ${i.shortName}`)];return hi(kn(n,t))}function lU(e,t){let n=[],i=-1;for(let r of e.affected)r.depth!==i&&(n.push(` -- Depth ${r.depth} --`),i=r.depth),n.push(` ${r.file} ${r.shortName}`);return hi(kn(n,t))}function uU(e,t){let n=[];return e.changeSurface&&(n.push(` File: ${e.changeSurface.file}`),n.push(` External consumers: ${e.changeSurface.totalExternalConsumers}`),n.push(...e.changeSurface.symbols.map(i=>{let r=i.riskLevel==="high"?" *** HIGH RISK ***":i.riskLevel==="medium"?" * medium risk *":"";return` ${_e(i.startLine,i.endLine)} ${i.shortName} [${i.externalConsumers} consumers]${r}`}))),e.complexity&&(n.push(` Complexity: ${Fe(e.complexity.relativePath,e.complexity.startLine,e.complexity.endLine)} ${e.complexity.shortName}`),n.push(` LOC: ${e.complexity.loc}`),n.push(` Branches: ${e.complexity.branches}`),n.push(` Cyclomatic estimate: ${e.complexity.cyclomaticEstimate}`),n.push(` Callees: ${e.complexity.calleeCount}`),n.push(` Fan-in: ${e.complexity.fanIn}`),n.push(` Fan-out: ${e.complexity.fanOut}`)),hi(kn(n,t))}function dU(e){let t=e.history;if(!t.available||!t.file)return[];let n=[];if(t.churn){let i=t.churn.fixChanges>0?`, ${t.churn.fixChanges} in fix commits`:"";n.push(` Churn: ${t.churn.changes} change(s) in recent history${i}`)}for(let i of t.coChangePartners)n.push(` Usually changes with: ${i.file} (${i.together}x, ${Math.round(i.confidence*100)}%)`);return t.suppressionsInFile>0&&n.push(` Detector suppressions in file: ${t.suppressionsInFile} (accepted findings \u2014 read the reasons before refactoring)`),n}function mU(e){let t=e.warnings.map(i=>` ${i}`);return e.history.coChangePartners.length>0&&t.push(" Check the HISTORY co-change partners \u2014 editing this file usually means editing them too."),(e.changeSurface?.symbols.filter(i=>i.riskLevel==="high")??[]).length>0&&t.push(" Inspect high-risk consumers before editing public behavior."),e.affected.length>0&&t.push(" Validate downstream consumers at the shallowest affected depths first."),t}function kn(e,t){let n=Math.max(1,t);return{rows:e.slice(0,n),omitted:Math.max(0,e.length-n)}}function hi(e){return e.omitted>0?[...e.rows,` ... ${e.omitted} more`]:e.rows}function sd(e){return e?"yes":"no"}var wx=["stats","files","methods","refs","trace","deps","rdeps","system","surface","dead","hotspots","imports","imported-by","unused-imports","outline","members","fan-in","fan-out","coupling","cycles","bottlenecks","isolated","by-kind","kind-counts","deep-chains","hierarchy","call-graph","similar","similar-files","react-component-duplicates","react-hook-candidates","react-large-component-pressure","vue-component-duplicates","vue-composable-candidates","vue-large-view-pressure","similar-chains","extract-candidates","locality-candidates","affected","change-surface","cleanup-plan","cleanup-apply","co-change","recent-duplicates","doc-drift","unused-params","diff-gate","incomplete-migration","plan-context","drift","wrapper-candidates","passthrough-candidates","stale-abstractions","complexity-hotspots","self-audit","convergence","code","complexity","dataflow","slice","redundant-reexports","similar-signatures"],pU=[Sx,Rx,xx,Fa,vx,kx,Cx],Px=pU.flat(),fU=new Map(Px.map(e=>[e.id,e]));for(let e of Px)if(!wx.includes(e.id))throw new Error(`Query command descriptor is not ordered: ${e.id}`);var ur=wx.map(e=>gU(e));function gU(e){let t=fU.get(e);if(!t)throw new Error(`Unknown query command descriptor: ${e}`);return t}var hU=ur.slice(0,ad("plan-context")),yU=ur.slice(Ta("drift"),ad("self-audit")),bU=ur.slice(Ta("convergence"),ad("slice")),SU=ur.slice(Ta("redundant-reexports")),Ix=[{id:"reindex",command:"reindex",description:"Index the codebase and convert to SQLite",options:[h("-l, --language <lang>","Index only this language (can be repeated)",uo,[]),h("--pnpm-workspaces","Enable pnpm workspace support (TypeScript)"),h("--force","Rebuild even if source inputs are unchanged"),h("--allow-partial","Write an incomplete index when one or more detected languages fail"),h("--indexer-concurrency <n>","Number of language indexers to run at once",mo)],renderShape:"custom",docs:E("Indexing",["scip-query reindex"]),handler:SS},{id:"augment-sources",command:"augment-sources",description:"Add source files skipped by upstream SCIP indexers to the SQLite documents table",renderShape:"custom",docs:E("Indexing"),handler:xS},{id:"augment-vue",command:"augment-vue",description:"Add compiler-resolved Vue SFC references to the SQLite index using Volar",options:[h("--project <tsconfig>","Vue tsconfig path",void 0,"frontend/tsconfig.scip.json")],renderShape:"custom",docs:E("Indexing"),handler:CS},...hU,{id:ia,command:ia,description:"Internal diff-impact batch worker",hidden:!0,options:[h("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",handler:vS},{id:"diff-impact",command:"diff-impact",description:"Compute changed symbols and downstream consumers from current git diff",options:j([h("--base <ref>","Git ref to diff against (default: HEAD)")]),renderShape:"custom",docs:E("Impact"),handler:RS},...yU,{id:lo,command:lo,description:"Internal health phase worker",hidden:!0,arguments:[{name:"<phase>"}],options:[h("-s, --scope <path>","Limit to files matching path"),h("--full","Run unbounded candidate analyses on large indexes")],renderShape:"custom",handler:kS},{id:"health",command:"health",description:"Composite codebase health report with prioritized action list",options:[h("-s, --scope <path>","Limit to files matching path"),h("--full","Compatibility flag; health already runs unbounded candidate analyses by default"),h("--json","Output as JSON for programmatic consumption"),h("--baseline","Compare findings against the committed baseline; exit 1 on new findings"),h("--write-baseline","Snapshot current finding identities to the baseline file")],renderShape:"custom",docs:E("Health",["scip-query health --json","scip-query health --baseline"]),handler:wS},{id:"bench",command:"bench",description:"Benchmark indexing and command runtimes for this repository",options:[h("--json","Output as JSON for programmatic consumption"),h("--cold-index","Temporarily clear this project index cache and measure a cold rebuild"),h("--include-heavy","Include expensive full-detector commands in the command matrix"),h("--command <cmd>","Benchmark a specific scip-query command (can be repeated)",uo,[]),h("--timeout-ms <n>","Per-command timeout in milliseconds",mo,18e4),h("--progress","Print benchmark command start/finish progress to stderr"),h("--profile","Enable low-overhead phase profiling in benchmarked commands"),h("--profile-out <path>","Append benchmark and phase profile events as JSONL")],renderShape:"custom",docs:E("Maintenance",["scip-query bench","scip-query bench --json --cold-index"]),handler:PS},...bU,{id:"install-skills",command:"install-skills",description:`Install skills (${Zu.join(", ")}) into Claude Code, Codex, and shared agent roots`,renderShape:"custom",docs:E("Maintenance"),handler:DS},{id:"setup-hooks",command:"setup-hooks",description:"Install or refresh project-local Codex and Claude Code lifecycle hooks",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:E("Maintenance",["scip-query setup-hooks","scip-query setup-hooks --json"]),handler:ES},{id:"hook-context",command:"hook-context",description:"Internal agent lifecycle hook context renderer",hidden:!0,renderShape:"custom",handler:Gb},{id:"hook-stop",command:"hook-stop",description:"Internal agent Stop hook wrapper for diff-gate",hidden:!0,renderShape:"custom",handler:Kb},{id:"check-deps",command:"check-deps",description:"Check whether scip-query and the detected language indexers are actually runnable",renderShape:"custom",docs:E("Maintenance"),handler:NS},{id:"capabilities",command:"capabilities",description:"Report which evidence and verification capabilities are available in this project",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:E("Maintenance"),handler:FS},{id:"capability-matrix",command:"capability-matrix",description:"Report the evidence and verification capability matrix by language",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:E("Maintenance"),handler:TS},...SU,{id:"init",command:"init",description:"Create a .scipquery.json config file for this project",renderShape:"custom",docs:E("Maintenance"),handler:AS},{id:"config-validate",command:"config-validate",description:"Validate .scipquery.json, including structured suppressions and declared coupling groups",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:E("Maintenance",["scip-query config-validate"]),handler:MS},{id:"suppress",command:"suppress <id>",description:"Record an accepted finding in .scipquery.json with a required reason",options:j([h("--reason <text>","Required human reason for accepting the finding"),h("--check <check>","Optional detector/check name to narrow the suppression"),h("--file <path>","Optional file path to narrow the suppression"),h("--expires-at <iso>","Optional ISO date after which the suppression expires")]),renderShape:"custom",docs:E("Maintenance",['scip-query suppress SQABC123DEF456 --reason "intentional boundary"']),handler:$S},{id:"doctor",command:"doctor",description:"Diagnose config, index freshness, dependency readiness, and project capabilities",options:[h("--json","Output as JSON for programmatic consumption")],renderShape:"custom",docs:E("Maintenance"),handler:jS},{id:"setup",command:"setup",description:"Bootstrap this project: install agent skills, refresh the index, verify capabilities, and report health",options:j([h("--git-hook","Also install a git pre-commit hook that runs diff-gate")]),renderShape:"custom",docs:E("Maintenance",["scip-query setup","scip-query setup --json"]),handler:HS},{id:"setup-agent",command:"setup-agent",description:"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",options:[h("--git-hook","Also install a git pre-commit hook that runs diff-gate")],renderShape:"custom",docs:E("Maintenance",["scip-query setup-agent","scip-query setup-agent --git-hook"]),handler:BS},{id:"setup-ci",command:"setup-ci",description:"Write a GitHub Actions workflow that runs scip-query reindex and diff-gate on pull requests",options:[h("--force","Overwrite an existing workflow"),h("--dry-run","Print the workflow without writing it")],renderShape:"custom",docs:E("Maintenance",["scip-query setup-ci"]),handler:VS},{id:"watch",command:"watch",description:"Watch for file changes and reindex automatically",options:[h("--debounce <ms>","Ms to wait after last change (default: 30000)",sa),h("--cooldown <ms>","Min ms between reindexes (default: 60000)",sa),h("--git-poll <ms>","Ms between Git HEAD/index checks (default: 2000)",sa)],renderShape:"custom",docs:E("Maintenance"),handler:qS},{id:"status",command:"status",description:"Show index status for this project",options:[h("--json","Output as JSON for programmatic consumption"),h("--capabilities","Include the project capability matrix")],renderShape:"custom",docs:E("Maintenance"),handler:US}];function Ta(e){let t=ur.findIndex(n=>n.id===e);if(t<0)throw new Error(`Ordered query command descriptor is missing: ${e}`);return t}function ad(e){return Ta(e)+1}function Lx(e,t){return t.map(n=>{let i=n.hidden?e.command(n.command,{hidden:!0}):e.command(n.command);i.description(n.description);for(let r of n.arguments??[])i.argument(r.name);for(let r of n.options??[])r.parser&&Object.hasOwn(r,"defaultValue")?i.option(r.flags,r.description,r.parser,r.defaultValue):r.parser?i.option(r.flags,r.description,r.parser):Object.hasOwn(r,"defaultValue")?i.option(r.flags,r.description,r.defaultValue):i.option(r.flags,r.description);return i.action(async(...r)=>{try{await n.handler(...r)}catch(o){xU(o)}}),{descriptor:n,command:i}})}function xU(e){let t=e instanceof Error?e.message:String(e);console.error(`error: ${t}`),process.exitCode=1}import{existsSync as CU,mkdirSync as vU,readFileSync as RU,writeFileSync as kU}from"fs";import{homedir as wU}from"os";import{join as _a}from"path";var PU=1440*60*1e3,Ex="update-check.json",IU="https://registry.npmjs.org/scip-query/latest";async function Nx(e={}){let t=e.env??process.env;if(t.SCIP_QUERY_UPDATE_CHECK==="0"||t.NO_UPDATE_NOTIFIER)return;let n=e.cacheDir??EU(t),i=e.now??Date.now(),r=e.currentVersion??na,o=NU(n),s=o&&i-o.checkedAt<PU?o.latestVersion:await FU(n,e.fetchLatestVersion??_U,i);if(!s||!DU(s,r))return;(e.writeNotice??(c=>console.error(c)))(LU(r,s))}function LU(e,t){return[`scip-query update available: ${e} -> ${t}.`,"Agent: tell your human to update with: npm install -g scip-query@latest",""].join(`
|
|
1049
|
+
`)}function DU(e,t){let n=Dx(e),i=Dx(t);if(!n||!i)return e!==t;for(let r=0;r<n.length;r++){let o=n[r]-i[r];if(o>0)return!0;if(o<0)return!1}return!1}function EU(e){let t=e.XDG_CACHE_HOME||_a(wU(),".cache");return _a(t,"scip-query")}function NU(e){let t=_a(e,Ex);if(!CU(t))return null;try{let n=JSON.parse(RU(t,"utf8"));return typeof n.checkedAt=="number"&&(typeof n.latestVersion=="string"||n.latestVersion===null)?{checkedAt:n.checkedAt,latestVersion:n.latestVersion}:null}catch{return null}}async function FU(e,t,n){let i;try{i=await t()}catch{i=null}return TU(e,{checkedAt:n,latestVersion:i}),i}function TU(e,t){try{vU(e,{recursive:!0}),kU(_a(e,Ex),`${JSON.stringify(t,null,2)}
|
|
1050
|
+
`)}catch{}}async function _U(){let e=await fetch(IU,{signal:AbortSignal.timeout(1e3)});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}function Dx(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(e);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}Aa.name("scip-query").description("Language-agnostic code intelligence CLI powered by SCIP indexes").version(na);Lx(Aa,Ix);Aa.hook("preAction",async()=>{await Nx()});MU()&&await Aa.parseAsync();function MU(){if(!process.argv[1])return!1;let e=AU(import.meta.url);try{return Fx(e)===Fx(process.argv[1])}catch{return e===process.argv[1]}}export{Aa as program,tr as renderHeuristicNotice};
|
|
1029
1051
|
//# sourceMappingURL=cli.js.map
|