scip-query 0.8.2 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -8
- package/dist/{chunk-GD7XRHSV.js → chunk-2BMFRBV6.js} +2 -2
- package/dist/{chunk-GMEBYEMU.js → chunk-2WEH5QHC.js} +2 -2
- package/dist/{chunk-PE4EJOLN.js → chunk-4DAPXOWD.js} +2 -2
- package/dist/{chunk-EKP7XJ6L.js → chunk-4HTJZC6G.js} +2 -2
- package/dist/{chunk-RCRK4E7E.js → chunk-4JQFTUKD.js} +2 -2
- package/dist/{chunk-7I6KNKE3.js → chunk-4MHT7LKP.js} +2 -2
- package/dist/chunk-5OHZEO3U.js +3 -0
- package/dist/chunk-5QJIEYFB.js +34 -0
- package/dist/{chunk-Z2AJQ7VA.js → chunk-6DEX3XP6.js} +2 -2
- package/dist/{chunk-SSINY7HL.js → chunk-6IGXZZQ4.js} +2 -2
- package/dist/{chunk-FIPE5AQT.js → chunk-6K2JQ2VI.js} +2 -2
- package/dist/{chunk-OIMM7KMI.js → chunk-6QVCPUK6.js} +2 -2
- package/dist/chunk-6VL4AIEO.js +8 -0
- package/dist/{chunk-K6YIGVL7.js → chunk-772YYL6I.js} +2 -2
- package/dist/{chunk-FTBT4RP2.js → chunk-A2VTV2QB.js} +2 -2
- package/dist/{chunk-EM2PPDN7.js → chunk-ADRYSISR.js} +2 -2
- package/dist/chunk-AI2ECT7L.js +2 -0
- package/dist/{chunk-TR5AU6A5.js → chunk-AP5GTKSG.js} +2 -2
- package/dist/chunk-B32FX5KB.js +2 -0
- package/dist/{chunk-UQE3DSXY.js → chunk-BGRPMGTD.js} +2 -2
- package/dist/{chunk-7TYJD45F.js → chunk-BNW3Q24R.js} +2 -2
- package/dist/{chunk-QYQXPPDI.js → chunk-BUAC4Q4G.js} +2 -2
- package/dist/{chunk-7UZWNW4E.js → chunk-BZ6LCGE6.js} +2 -2
- package/dist/{chunk-ZJ737ZMD.js → chunk-CMXFASVD.js} +2 -2
- package/dist/{chunk-XSZ5NC4O.js → chunk-CO3AL7NZ.js} +2 -2
- package/dist/{chunk-4B7YLRXX.js → chunk-FVIKFWUL.js} +2 -2
- package/dist/{chunk-APLCSDXL.js → chunk-FVVT7GV6.js} +2 -2
- package/dist/chunk-HXXRN77A.js +2 -0
- package/dist/{chunk-NK7TQQG4.js → chunk-IC3RC3KJ.js} +2 -2
- package/dist/chunk-ISCKLDSS.js +22 -0
- package/dist/chunk-ITHQJZTG.js +2 -0
- package/dist/{chunk-RIXOMSOR.js → chunk-IVAIPXNO.js} +2 -2
- package/dist/{chunk-NOVKLH2F.js → chunk-IW7ASGVF.js} +2 -2
- package/dist/{chunk-4A4JFNWG.js → chunk-JODYQDE4.js} +2 -2
- package/dist/{chunk-66ORT3LS.js → chunk-L2KFPRMA.js} +2 -2
- package/dist/{chunk-HVXIXDLV.js → chunk-MCW36F2D.js} +2 -2
- package/dist/{chunk-SDGCKEB7.js → chunk-MN75T4UB.js} +2 -2
- package/dist/{chunk-AGW2MVIO.js → chunk-NC4IUW25.js} +2 -2
- package/dist/{chunk-2EC4JTHC.js → chunk-NGI4V4AB.js} +2 -2
- package/dist/{chunk-SOGLYIJ4.js → chunk-O6KCZPJQ.js} +2 -2
- package/dist/chunk-OAI5GEIN.js +6 -0
- package/dist/chunk-OH5HIAID.js +4 -0
- package/dist/{chunk-NGLRXEWN.js → chunk-OLCKSG3Y.js} +2 -2
- package/dist/{chunk-JTCEWV7Q.js → chunk-OXKEUWMJ.js} +2 -2
- package/dist/{chunk-JAMU6FLN.js → chunk-PRVDXGSK.js} +2 -2
- package/dist/{chunk-46ILZVMX.js → chunk-QJWN6LA5.js} +2 -2
- package/dist/{chunk-BCFED24F.js → chunk-QKO474FG.js} +2 -2
- package/dist/{chunk-TQTVM27C.js → chunk-QYKKTYBN.js} +2 -2
- package/dist/chunk-R3G6ERW7.js +7 -0
- package/dist/{chunk-UUDYI3FF.js → chunk-R6XDPWJA.js} +2 -2
- package/dist/{chunk-D43L5PQF.js → chunk-SCEMECW7.js} +2 -2
- package/dist/{chunk-HVGNOUYP.js → chunk-SJR4SB7B.js} +2 -2
- package/dist/chunk-SYKCO25G.js +16 -0
- package/dist/{chunk-MKE7SEEX.js → chunk-T22X7WT6.js} +2 -2
- package/dist/chunk-UIWAZ2NT.js +2 -0
- package/dist/{chunk-SLOIQKY7.js → chunk-VDY4HYNK.js} +2 -2
- package/dist/{chunk-EAU4RDFG.js → chunk-VDZIEDJB.js} +2 -2
- package/dist/{chunk-6ZFKI5EP.js → chunk-VGBSY6N7.js} +2 -2
- package/dist/{chunk-VN6B6HFB.js → chunk-VZRILF2Z.js} +2 -2
- package/dist/{chunk-CVRXOP6M.js → chunk-WJIS6BNI.js} +2 -2
- package/dist/{chunk-DJTJ3DLZ.js → chunk-WN5Z3UVT.js} +2 -2
- package/dist/{chunk-6G76D2YM.js → chunk-XCW7DYHM.js} +2 -2
- package/dist/{chunk-ZIIQ55VK.js → chunk-Y5H7TBVE.js} +2 -2
- package/dist/{chunk-I7OTKWNY.js → chunk-YWZBKYLS.js} +2 -2
- package/dist/{chunk-64UY7VTR.js → chunk-ZF6P2NAT.js} +3 -3
- package/dist/{chunk-SB6I6O3P.js → chunk-ZGIK464P.js} +2 -2
- package/dist/{chunk-WC43FMAB.js → chunk-ZOT3WUZW.js} +2 -2
- package/dist/{chunk-TFO4OMJZ.js → chunk-ZZ2W5P3D.js} +2 -2
- package/dist/cli.js +187 -149
- package/dist/index.js +1 -1
- package/dist/postinstall.js +2 -2
- package/dist/queries/affected.js +1 -1
- package/dist/queries/bottlenecks.js +1 -1
- package/dist/queries/by-kind.js +1 -1
- package/dist/queries/call-graph.js +1 -1
- package/dist/queries/change-surface.js +1 -1
- package/dist/queries/cleanup-plan.js +1 -1
- package/dist/queries/co-change.js +1 -1
- package/dist/queries/code.js +1 -1
- package/dist/queries/complexity-hotspots.js +1 -1
- package/dist/queries/complexity.js +1 -1
- package/dist/queries/convergence.js +1 -1
- package/dist/queries/coupling.js +1 -1
- package/dist/queries/cycles.js +1 -1
- package/dist/queries/dataflow.js +1 -1
- package/dist/queries/dead.js +1 -1
- package/dist/queries/deep-chains.js +1 -1
- package/dist/queries/deps.js +1 -1
- package/dist/queries/diff-gate.d.ts +9 -2
- package/dist/queries/diff-gate.js +1 -1
- package/dist/queries/diff-impact.d.ts +3 -1
- package/dist/queries/diff-impact.js +1 -1
- package/dist/queries/doc-drift.js +1 -1
- package/dist/queries/drift.js +1 -1
- package/dist/queries/extract-candidates.js +1 -1
- package/dist/queries/fan.js +1 -1
- package/dist/queries/health.js +1 -1
- package/dist/queries/hierarchy.js +1 -1
- package/dist/queries/hotspots.js +1 -1
- package/dist/queries/imports.js +1 -1
- package/dist/queries/incomplete-migration.d.ts +71 -0
- package/dist/queries/incomplete-migration.js +2 -0
- package/dist/queries/index.d.ts +2 -1
- package/dist/queries/index.js +1 -1
- package/dist/queries/isolated.js +1 -1
- package/dist/queries/members.js +1 -1
- package/dist/queries/methods.js +1 -1
- package/dist/queries/outline.js +1 -1
- package/dist/queries/passthrough-candidates.js +1 -1
- package/dist/queries/plan-context.js +1 -1
- package/dist/queries/recent-duplicates.js +1 -1
- package/dist/queries/redundant-reexports.js +1 -1
- package/dist/queries/refs.js +1 -1
- package/dist/queries/self-audit.js +1 -1
- package/dist/queries/similar-chains.js +1 -1
- package/dist/queries/similar-files.js +1 -1
- package/dist/queries/similar-signatures.js +1 -1
- package/dist/queries/similar.d.ts +15 -1
- package/dist/queries/similar.js +1 -1
- package/dist/queries/slice.js +1 -1
- package/dist/queries/stale-abstractions.js +1 -1
- package/dist/queries/surface.js +1 -1
- package/dist/queries/symbols.js +1 -1
- package/dist/queries/system.js +1 -1
- package/dist/queries/trace.js +1 -1
- package/dist/queries/unused-params.js +1 -1
- package/dist/queries/wrapper-candidates.js +1 -1
- package/dist/runtime.js +1 -1
- package/package.json +5 -1
- package/skills/scip-query/SKILL.md +79 -0
- package/dist/chunk-6P5W4U6G.js +0 -16
- package/dist/chunk-GTZAU7OL.js +0 -2
- package/dist/chunk-K4Z3FCUJ.js +0 -6
- package/dist/chunk-N5D5ZCBW.js +0 -7
- package/dist/chunk-OQSV6OS2.js +0 -2
- package/dist/chunk-PCMVXWDC.js +0 -34
- package/dist/chunk-PLFYFZX3.js +0 -2
- package/dist/chunk-RKTDEIHF.js +0 -2
- package/dist/chunk-WQFOZIID.js +0 -4
- package/dist/chunk-XBFLIGWU.js +0 -3
package/dist/cli.js
CHANGED
|
@@ -1,20 +1,40 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{program as
|
|
2
|
+
import{program as ji}from"commander";import{realpathSync as Fd}from"fs";import{fileURLToPath as lL}from"url";import{createRequire as iI}from"module";import{fileURLToPath as ku}from"url";import{statSync as Td}from"fs";function Ee(e){let t=e.get("SELECT COUNT(*) as c FROM documents").c,n=e.get("SELECT COUNT(*) as c FROM global_symbols").c,r=e.get("SELECT COUNT(*) as c FROM mentions WHERE role = 1").c,i=e.get("SELECT COUNT(*) as c FROM mentions WHERE role != 1").c;return{documents:t,symbols:n,definitions:r,references:i,...Ad(e.config.dbPath)}}function Ad(e){try{let t=Td(e);return{indexSizeBytes:t.size,lastBuilt:t.mtime}}catch{return{indexSizeBytes:0,lastBuilt:null}}}function M(e,t={}){let n=t.scope?"AND relative_path LIKE ?":"",r=t.like?"AND relative_path LIKE ?":"",i=[...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
|
${r}
|
|
8
|
-
ORDER BY relative_path`,...i).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
|
-
`);for(let o=n-1;o>=0&&o>=n-5;o-=1){let s=(i[o]??"").trim();if(s!==""){if(
|
|
10
|
-
`.repeat(r.startLine)+r.body;return wi(r.language,i)}):null}function ra(e,t){let n=Dd(e,t);if(!n)return null;let r=zt(n);return r?{calleeLeaf:r,memberAccess:Nd(n),line:e.startPosition.row}:null}function Dd(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 Nd(e){switch(e.type){case"field_expression":case"member_expression":case"attribute":return!0;default:return!1}}function zt(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?zt(t):null}case"scoped_identifier":{let t=e.childForFieldName("name")??e.namedChild(e.namedChildCount-1);return t?zt(t):null}case"super":case"self":case"this":return null;default:return null}}function In(e){return e.type==="comment"||e.type==="line_comment"||e.type==="block_comment"}var Ld=new Set(["function_declaration","method_definition","method_signature","function_signature"]);function ca(e,t){let n=wd(e,t);if(n)return{name:n.name,startLine:n.definitionNode.startPosition.row,endLine:n.definitionNode.endPosition.row,paramCount:sa(n.functionNode),params:ia(n.functionNode),paramsEndLine:oa(n.functionNode),isLiteralPassthrough:aa(n.functionNode,t)};if(!_d(e.type,t))return null;let r=e.childForFieldName("name")??e.namedChildren.find(i=>i.type==="identifier"||i.type==="property_identifier");return r?{name:r.text,startLine:e.startPosition.row,endLine:e.endPosition.row,paramCount:sa(e),params:ia(e),paramsEndLine:oa(e),isLiteralPassthrough:aa(e,t)}:null}function la(e){return e.namedChildren.find(t=>t.type==="parameters"||t.type==="formal_parameters")}function ia(e){let t=la(e);if(!t)return[];let n=[];for(let r of t.namedChildren){if(In(r))continue;if(r.type==="identifier"){n.push({name:r.text,simple:!0});continue}let i=r.namedChildren.some(a=>a.type.endsWith("_modifier"))||/^\s*(?:public|private|protected|readonly|override)\b/.test(r.text),o=r.childForFieldName("pattern");if(!i&&o&&o.type==="identifier"){n.push({name:o.text,simple:!0});continue}let s=r.namedChildren.find(a=>a.type==="identifier");n.push({name:o?.type==="identifier"?o.text:s?.text??"",simple:!1})}return n}function oa(e){let t=la(e);return t?t.endPosition.row:e.startPosition.row}function _d(e,t){return t==="rust"?e==="function_item"||e==="function_signature_item":t==="python"?e==="function_definition":t==="typescript"||t==="tsx"||t==="javascript"?Ld.has(e):!1}function wd(e,t){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript")return null;if(e.type==="variable_declarator"){let n=e.childForFieldName("name")??e.namedChild(0),r=e.childForFieldName("value")??e.namedChild(1);return!n||!r||r.type!=="arrow_function"&&r.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:r}}if(e.type==="public_field_definition"){let n=e.childForFieldName("name")??e.namedChild(0),r=e.childForFieldName("value")??e.namedChild(1);return!n||!r||r.type!=="arrow_function"&&r.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:r}}return null}function sa(e){let t=e.namedChildren.find(r=>r.type==="parameters"||r.type==="formal_parameters");if(!t)return 0;let n=0;for(let r of t.namedChildren)In(r)||(n+=1);return n}function aa(e,t){let n=e.namedChildren.find(m=>m.type==="block"||m.type==="statement_block");if(!n)return!1;let r=n.namedChildren.filter(m=>!In(m));if(r.length!==1)return!1;let i=r[0],o=null;if(i.type==="return_statement"||i.type==="expression_statement"?o=i.namedChild(0)??null:t==="rust"&&(i.type==="call_expression"||i.type==="macro_invocation")&&(o=i),!o)return!1;let s=t==="python"?"call":"call_expression";if(o.type!==s)return!1;let a=o.namedChildren.find(m=>m.type==="arguments"||m.type==="argument_list");if(!a)return!1;let c=a.namedChildren.filter(m=>!In(m)),l=e.namedChildren.find(m=>m.type==="parameters"||m.type==="formal_parameters");if(!l)return!1;let u=[];for(let m of l.namedChildren){if(m.type==="identifier"){u.push(m.text);continue}let d=m.namedChildren.find(p=>p.type==="identifier");d&&u.push(d.text)}if(c.length!==u.length)return!1;for(let m=0;m<u.length;m+=1){let d=c[m];if(d.type!=="identifier"||d.text!==u[m])return!1}return!0}var Ed=new Set(["identifier","type_identifier","field_identifier"]),kd=new Set(["identifier"]),Pd=new Set(["identifier","property_identifier","type_identifier","shorthand_property_identifier","shorthand_property_identifier_pattern"]),Fd=new Set(["rust","python"]),Ad=/\{([^{}]*)\}/g,Td=/\b([A-Za-z_][\w]*)\b/g;function ua(e,t){return Md(t).has(e.type)}function ma(e,t){return Fd.has(t)&&e.type==="string_content"}function da(e){let t=0;for(let r of e.values()){let i=r[r.length-1];i!==void 0&&i>t&&(t=i)}let n=new Array(t+1);for(let r=0;r<=t;r+=1)n[r]=new Set;for(let[r,i]of e)for(let o of i)n[o].add(r);return n}function Md(e){return e==="rust"?Ed:e==="python"?kd:Pd}function pa(e,t){let n=e.startPosition.row;for(let r of e.text.matchAll(Ad)){let i=r[1]??"";for(let o of i.matchAll(Td))o[1]&&t(o[1],n)}}var Od=[/\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],$d=/^#!?\[\s*serde\s*\(/,jd=/^#!?\[\s*schemars\s*\(/,Bd=/^#!?\[\s*validate\s*\(/,Hd=new Set(["invoke","invokeTauriCommand","listen","once","emit","subscribe","dispatch","sendCommand","callRust"]);function fa(e,t,n){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript"||e.type!=="call_expression")return;let r=e.childForFieldName("function")??e.namedChild(0);if(!r)return;let i=zt(r);if(!i||!Hd.has(i))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 ga(e,t){let n=$d.test(e),r=jd.test(e),i=Bd.test(e);if(!(!n&&!r&&!i))for(let o of Od){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 ha(e,t){let n=new Map,r=(s,a)=>{if(s===a)return;let c=n.get(s);c||(c=new Set,n.set(s,c)),c.add(a)},i=t==="python"?new Set(["identifier"]):new Set(["type_identifier"]),o=(s,a)=>{let c=l=>{i.has(l.type)&&l.text!==a&&r(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&&r(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 ya=new WeakMap;function K(e,t){let n=$(t);if(!n)return null;let r=ce(e,t);if(!r)return null;let i=ya.get(r);if(i)return i;let o=Vd(r,n);return ya.set(r,o),o}function ki(e,t,n,r){let i=K(e,t);return i?qd(i,n,r)?.isLiteralPassthrough??!0:!0}function qd(e,t,n){return e.callables.find(r=>r.startLine===t&&r.endLine===n)??null}function Vd(e,t){let n=[],r=[],i=new Set,o=new Set,s=new Map,a=(l,u)=>{let m=s.get(l);if(!m){s.set(l,[u]);return}m[m.length-1]!==u&&m.push(u)},c=l=>{let u=ca(l,t);u&&n.push(u);let m=ra(l,t);m&&r.push(m),fa(l,t,o),t==="rust"&&(l.type==="attribute_item"||l.type==="inner_attribute_item")&&ga(l.text,i),ua(l,t)&&a(l.text,l.startPosition.row),ma(l,t)&&pa(l,a);for(let d of l.children)c(d)};return c(e.rootNode),{language:t,callables:n,callSites:r,typeContainerMap:ha(e,t),identifierLineMap:s,identifiersByLine:da(s),fileIdentifiers:new Set(s.keys()),rustAttrReferencedNames:i,crossLanguageDispatchNames:o}}var ba=new Set(["rust","typescript","tsx","javascript","python"]);function Pi(e,t){let n=K(e,t);return!n||!ba.has(n.language)?null:n.callables.map(r=>({name:r.name,startLine:r.startLine,endLine:r.endLine}))}function Qt(e,t){let n=K(e,t);return!n||!ba.has(n.language)?null:n.callSites}function Fi(e,t){return K(e,t)?.typeContainerMap??new Map}function bt(e,t,n={}){let r=K(e,t);if(!r)return[];let i=[];if(n.includeCrossLanguageDispatchNames)for(let o of r.crossLanguageDispatchNames)i.push({name:o,kind:"cross-language-dispatch",occurrences:1});if(n.includeRustAttributeNames&&r.language==="rust")for(let o of r.rustAttrReferencedNames)i.push({name:o,kind:"rust-attribute",occurrences:1});return i}var Wd={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function Z(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],r=t[1],i=e.slice(n.length+1+r.length+1),o;if(i.startsWith("`")){let l=i.indexOf("`",1);l===-1?(o=i.slice(1),i=""):(o=i.slice(1,l),i=i.slice(l+2))}else{let l=i.indexOf(" ");l===-1?(o=i,i=""):(o=i.slice(0,l),i=i.slice(l+1))}let s,a=i.indexOf(" ");a===-1?(s=i,i=""):(s=i.slice(0,a),i=i.slice(a+1));let c=Ud(i);return{scheme:n,manager:r,packageName:o,version:s,descriptors:c,raw:e}}function Me(e){let t=Z(e);if("kind"in t)return null;for(let n=t.descriptors.length-2;n>=0;n--){let r=t.descriptors[n];if(r?.suffix==="type")return r.name}return null}function Ud(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||Sa(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 r;if(e[n]==="`"){let o=e.indexOf("`",n+1);if(o===-1){r=e.slice(n+1),t.push({name:r,suffix:"term"});break}r=e.slice(n+1,o),n=o+1}else{let o=n;for(;n<e.length&&!Sa(e[n]);)n++;r=e.slice(o,n)}if(n>=e.length){r&&t.push({name:r,suffix:"term"});break}let i=e[n];if(i==="("){let o=e.indexOf(")",n+1);o!==-1&&e[o+1]==="."?(t.push({name:r,suffix:"method"}),n=o+2):o!==-1?(t.push({name:r,suffix:"method"}),n=o+1):(t.push({name:r,suffix:"term"}),n++)}else{let o=Wd[i];o&&t.push({name:r,suffix:o}),n+=1}}return t}function Sa(e){return e==="/"||e==="#"||e==="."||e==="("||e==="["||e===":"||e==="!"}function b(e){let t=Z(e);if("kind"in t&&t.kind==="local")return`local:${t.id}`;let n=t;if(n.descriptors.length===0)return n.raw;let r=[];for(let i of n.descriptors){let o=Gd(i);o&&r.push(o)}return r.join(":")}function Gd(e){let t=e.suffix==="namespace"?Jd(e.name):e.name;return t?e.suffix==="method"?`${t}()`:t:""}function Jd(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 P(e){let t=Z(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=Z(e);if("kind"in t&&t.kind==="local")return null;let n=t;return n.descriptors[n.descriptors.length-1]?.suffix??null}function ie(e){return e.endsWith("().")||ee(e)==="method"}function Y(e){let t=ee(e);return t==="method"||t==="term"}function ot(e){return ee(e)==="namespace"}var zd=/^rust-analyzer\b.*[\s/]impl#\[[^\]]+\]\[[^\]]+\]/;function dr(e){return zd.test(e)}var Qd=new Set(["test","tests","_tests"]);function Kt(e){let t=Z(e);if("kind"in t)return!1;for(let n=0;n<t.descriptors.length-1;n+=1){let r=t.descriptors[n];if(r?.suffix==="namespace"&&r.name&&Qd.has(r.name))return!0}return!1}function xa(e,t){let n=Z(e),r=Z(t);if("kind"in n||"kind"in r)return!1;let i=n.descriptors,o=r.descriptors;if(o.length!==i.length+1)return!1;for(let s=0;s<i.length;s++){let a=i[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function Ca(e,t){let n=Z(e),r=Z(t);if("kind"in n||"kind"in r)return!1;let i=n.descriptors,o=r.descriptors;if(o.length<=i.length)return!1;for(let s=0;s<i.length;s++){let a=i[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function Yt(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
|
|
8
|
+
ORDER BY relative_path`,...i).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 Md(e){return/[*?]/.test(e)?e.replace(/\*\*/g,"%").replace(/\*/g,"%").replace(/\?/g,"_"):`%${e}%`}function Bi(e,t){let n=Md(t);return M(e,{like:n,includeIgnored:!1}).map(r=>({relativePath:r}))}import{extname as fa}from"path";var Od={".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"};function B(e){return Od[fa(e).toLowerCase()]??null}function xt(e){return fa(e).toLowerCase()===".vue"}var ga=[];function at(e){e.groups.length>0&&ga.push(e)}function Hi(e,t){let n=new Set(t.groups);for(let r of ga)r.groups.some(i=>n.has(i))&&(t.file!==void 0&&r.clearFile?r.clearFile(e,t.file):r.clearAll(e))}function ha(){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 H(e,t){let{cache:n,ensure:r}=ha(),i={get(o,s,a){let c=r(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 at({name:e,groups:t.clearGroups,clearAll:o=>i.invalidateAll(o),clearFile:(o,s)=>i.invalidate(o,s)}),i}function te(e,t){let n=new WeakMap,r={get(i,o){let s=n.get(i);if(s)return s.value;let a=o();return n.set(i,{value:a}),a},invalidate(i){n.delete(i)},has(i){return n.has(i)}};return at({name:e,groups:t.clearGroups,clearAll:i=>r.invalidate(i)}),r}function Zt(e,t){let{cache:n,ensure:r}=ha(),i={get(o,s,a,c){let l=r(o),u=l.get(s);if(u&&u.source===a)return u.value;let m=c();return l.set(s,{source:a,value:m}),m},invalidate(o,s){n.get(o)?.delete(s)},invalidateAll(o){n.delete(o)}};return at({name:e,groups:t.clearGroups,clearAll:o=>i.invalidateAll(o),clearFile:(o,s)=>i.invalidate(o,s)}),i}import{createRequire as $d}from"module";var le=$d(import.meta.url),Sr=null,ya=!1;function jd(){if(ya)return null;if(Sr)return Sr;try{return Sr=le("tree-sitter"),Sr}catch{return ya=!0,null}}var ba=new Map,qi=new Set;function Bd(e){if(qi.has(e))return null;let t=ba.get(e);if(t)return t;let n;try{switch(e){case"rust":n=le("tree-sitter-rust");break;case"typescript":n=le("tree-sitter-typescript").typescript;break;case"tsx":n=le("tree-sitter-typescript").tsx;break;case"javascript":n=le("tree-sitter-javascript");break;case"python":n=le("tree-sitter-python");break;case"java":n=le("tree-sitter-java");break;case"kotlin":n=le("tree-sitter-kotlin");break;case"scala":n=le("tree-sitter-scala");break;case"ruby":n=le("tree-sitter-ruby");break;case"c":n=le("tree-sitter-c");break;case"cpp":n=le("tree-sitter-cpp");break;case"csharp":n=le("tree-sitter-c-sharp");break;case"php":n=le("tree-sitter-php").php;break;case"vb":{let r=le("tree-sitter-vb-dotnet");n=r.language??r;break}}}catch{return qi.add(e),null}return ba.set(e,n),n}var Sa=new Map;function Hd(e){let t=Sa.get(e);if(t)return t;let n=Bd(e);if(!n)return null;let r=jd();if(!r)return null;let i=new r;try{i.setLanguage(n)}catch{return qi.add(e),null}return Sa.set(e,i),i}function qd(e,t){return e.parse(r=>r>=t.length?null:t.slice(r,Math.min(t.length,r+16384)))}function Vi(e,t){let n=Hd(e);if(!n)return null;try{return qd(n,t)}catch{return null}}import{existsSync as Vd,readFileSync as Wd}from"fs";import{join as Ud}from"path";var Gd=H("source-text",{clearGroups:["whole-project","source-file"]});function P(e,t){let n=t.replace(/\\/g,"/");return Gd.get(e,n,()=>{let r=Ud(e.config.projectRoot,n);return Vd(r)?Wd(r,"utf-8"):""})}var Jd=/scip-query[\s:-]*ignore[\s:-]*(?:dead(?:-code)?|stale|wrapper|passthrough|drift|extract)?/i;function Wi(e,t,n){if(n<=0)return!1;let r=P(e,t);if(!r)return!1;let i=r.split(`
|
|
9
|
+
`);for(let o=n-1;o>=0&&o>=n-5;o-=1){let s=(i[o]??"").trim();if(s!==""){if(Jd.test(s))return!0;if(!s.startsWith("//")&&!s.startsWith("*")&&!s.startsWith("/*")&&!s.startsWith("@")&&!s.startsWith("#"))return!1}}return!1}function xa(e){let t=[],n=/<script\b([^>]*)>([\s\S]*?)<\/script>/g;for(let a of e.matchAll(n))typeof a.index=="number"&&t.push({tagOpen:a[1]??"",body:a[2]??"",openIdx:a.index+(a[0].length-(a[2]?.length??0)-9)});if(t.length===0)return null;let r=t.find(a=>/\bsetup\b/.test(a.tagOpen))??t[0],o=r.tagOpen.match(/\blang\s*=\s*["']?([\w-]+)/)?.[1]?.toLowerCase(),s=o==="ts"||o==="typescript"?"typescript":o==="tsx"?"tsx":"javascript";return{body:r.body,startLine:zd(e,r.openIdx),language:s}}function zd(e,t){let n=0;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}var Ca=Zt("ast-trees",{clearGroups:["whole-project","source-file"]});function ue(e,t){if(xt(t))return Kd(e,t);let n=B(t);if(!n)return null;let r=P(e,t);return r?Ca.get(e,t,r,()=>Vi(n,r)):null}function Kd(e,t){let n=P(e,t);return n?Ca.get(e,t,n,()=>{let r=xa(n);if(!r)return null;let i=`
|
|
10
|
+
`.repeat(r.startLine)+r.body;return Vi(r.language,i)}):null}function Ra(e,t){let n=Qd(e,t);if(!n)return null;let r=en(n);return r?{calleeLeaf:r,memberAccess:Yd(n),line:e.startPosition.row}:null}function Qd(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 Yd(e){switch(e.type){case"field_expression":case"member_expression":case"attribute":return!0;default:return!1}}function en(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?en(t):null}case"scoped_identifier":{let t=e.childForFieldName("name")??e.namedChild(e.namedChildCount-1);return t?en(t):null}case"super":case"self":case"this":return null;default:return null}}import{createHash as Xd}from"crypto";import{createRequire as Zd}from"module";import{dirname as ep,join as tp}from"path";import np from"better-sqlite3";var rp=Zd(import.meta.url),ip="evidence.db",xr=new WeakMap,op=H("evidence-content-hash",{clearGroups:["whole-project","source-file"]});function sp(){for(let e of["../package.json","../../package.json"])try{return rp(e).version}catch{}return"0.0.0"}var Cr=sp();function Ui(e){return Xd("sha256").update(e).digest("hex")}function Ct(e,t,n){return op.get(e,t,()=>Ui(n))}function Ia(e,t){process.env.SCIP_QUERY_DEBUG&&console.error(`evidence-cache: ${e}: ${t instanceof Error?t.message:String(t)}`)}function wn(e){if(xr.has(e))return xr.get(e)??null;let t=null;try{let n=new np(tp(ep(e.config.dbPath),ip));n.pragma("journal_mode = WAL"),n.pragma("busy_timeout = 5000"),n.pragma("synchronous = NORMAL"),n.exec(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS file_evidence (
|
|
12
|
+
kind TEXT NOT NULL,
|
|
13
|
+
relative_path TEXT NOT NULL,
|
|
14
|
+
content_hash TEXT NOT NULL,
|
|
15
|
+
version TEXT NOT NULL,
|
|
16
|
+
payload TEXT NOT NULL,
|
|
17
|
+
PRIMARY KEY (kind, relative_path)
|
|
18
|
+
);
|
|
19
|
+
CREATE TABLE IF NOT EXISTS semantic_callees (
|
|
20
|
+
relative_path TEXT NOT NULL,
|
|
21
|
+
symbol TEXT NOT NULL,
|
|
22
|
+
content_hash TEXT NOT NULL,
|
|
23
|
+
deps_digest TEXT NOT NULL,
|
|
24
|
+
version TEXT NOT NULL,
|
|
25
|
+
payload TEXT NOT NULL,
|
|
26
|
+
PRIMARY KEY (relative_path, symbol)
|
|
27
|
+
);
|
|
28
|
+
`),t={evidence:n,readFileEvidence:n.prepare("SELECT payload FROM file_evidence WHERE kind = ? AND relative_path = ? AND content_hash = ? AND version = ?"),writeFileEvidence:n.prepare("INSERT OR REPLACE INTO file_evidence (kind, relative_path, content_hash, version, payload) VALUES (?, ?, ?, ?, ?)"),readCallees:n.prepare(`SELECT payload FROM semantic_callees
|
|
29
|
+
WHERE relative_path = ? AND symbol = ? AND content_hash = ? AND deps_digest = ? AND version = ?`),writeCallees:n.prepare(`INSERT OR REPLACE INTO semantic_callees
|
|
30
|
+
(relative_path, symbol, content_hash, deps_digest, version, payload) VALUES (?, ?, ?, ?, ?, ?)`),dropStaleCallees:n.prepare("DELETE FROM semantic_callees WHERE relative_path = ? AND content_hash != ?")}}catch(n){Ia("disabled (open failed)",n)}return xr.set(e,t),t}function En(e,t,n){Ia(`disabled (${t})`,n),xr.set(e,null)}function Rr(e,t,n,r){let i=wn(e);if(!i)return null;try{return i.readFileEvidence.get(t,n,r,Cr)?.payload??null}catch(o){return En(e,"file_evidence read",o),null}}function Ir(e,t,n,r,i){let o=wn(e);if(o)try{o.writeFileEvidence.run(t,n,r,Cr,i)}catch(s){En(e,"file_evidence write",s)}}function va(e){let t=wn(e);if(!t)return 0;try{return t.evidence.prepare("SELECT COUNT(*) AS count FROM semantic_callees").get()?.count??0}catch(n){return En(e,"semantic_callees count",n),0}}function Da(e,t,n,r,i){let o=wn(e);if(!o)return null;try{return o.readCallees.get(t,n,r,i,Cr)?.payload??null}catch(s){return En(e,"semantic_callees read",s),null}}function Na(e,t){if(t.length===0)return;let n=wn(e);if(n)try{n.evidence.transaction(()=>{for(let r of t)n.dropStaleCallees.run(r.relativePath,r.contentHash),n.writeCallees.run(r.relativePath,r.symbol,r.contentHash,r.depsDigest,Cr,r.payload)})()}catch(r){En(e,"semantic_callees write",r)}}function kn(e){return e.type==="comment"||e.type==="line_comment"||e.type==="block_comment"}var ap=new Set(["function_declaration","method_definition","method_signature","function_signature"]);function ka(e,t){let n=lp(e,t);if(n)return{name:n.name,startLine:n.definitionNode.startPosition.row,endLine:n.definitionNode.endPosition.row,paramCount:wa(n.functionNode),params:_a(n.functionNode),paramsEndLine:La(n.functionNode),isLiteralPassthrough:Ea(n.functionNode,t)};if(!cp(e.type,t))return null;let r=e.childForFieldName("name")??e.namedChildren.find(i=>i.type==="identifier"||i.type==="property_identifier");return r?{name:r.text,startLine:e.startPosition.row,endLine:e.endPosition.row,paramCount:wa(e),params:_a(e),paramsEndLine:La(e),isLiteralPassthrough:Ea(e,t)}:null}function Pa(e){return e.namedChildren.find(t=>t.type==="parameters"||t.type==="formal_parameters")}function _a(e){let t=Pa(e);if(!t)return[];let n=[];for(let r of t.namedChildren){if(kn(r))continue;if(r.type==="identifier"){n.push({name:r.text,simple:!0});continue}let i=r.namedChildren.some(a=>a.type.endsWith("_modifier"))||/^\s*(?:public|private|protected|readonly|override)\b/.test(r.text),o=r.childForFieldName("pattern");if(!i&&o&&o.type==="identifier"){n.push({name:o.text,simple:!0});continue}let s=r.namedChildren.find(a=>a.type==="identifier");n.push({name:o?.type==="identifier"?o.text:s?.text??"",simple:!1})}return n}function La(e){let t=Pa(e);return t?t.endPosition.row:e.startPosition.row}function cp(e,t){return t==="rust"?e==="function_item"||e==="function_signature_item":t==="python"?e==="function_definition":t==="typescript"||t==="tsx"||t==="javascript"?ap.has(e):!1}function lp(e,t){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript")return null;if(e.type==="variable_declarator"){let n=e.childForFieldName("name")??e.namedChild(0),r=e.childForFieldName("value")??e.namedChild(1);return!n||!r||r.type!=="arrow_function"&&r.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:r}}if(e.type==="public_field_definition"){let n=e.childForFieldName("name")??e.namedChild(0),r=e.childForFieldName("value")??e.namedChild(1);return!n||!r||r.type!=="arrow_function"&&r.type!=="function_expression"?null:{name:n.text,definitionNode:e,functionNode:r}}return null}function wa(e){let t=e.namedChildren.find(r=>r.type==="parameters"||r.type==="formal_parameters");if(!t)return 0;let n=0;for(let r of t.namedChildren)kn(r)||(n+=1);return n}function Ea(e,t){let n=e.namedChildren.find(m=>m.type==="block"||m.type==="statement_block");if(!n)return!1;let r=n.namedChildren.filter(m=>!kn(m));if(r.length!==1)return!1;let i=r[0],o=null;if(i.type==="return_statement"||i.type==="expression_statement"?o=i.namedChild(0)??null:t==="rust"&&(i.type==="call_expression"||i.type==="macro_invocation")&&(o=i),!o)return!1;let s=t==="python"?"call":"call_expression";if(o.type!==s)return!1;let a=o.namedChildren.find(m=>m.type==="arguments"||m.type==="argument_list");if(!a)return!1;let c=a.namedChildren.filter(m=>!kn(m)),l=e.namedChildren.find(m=>m.type==="parameters"||m.type==="formal_parameters");if(!l)return!1;let u=[];for(let m of l.namedChildren){if(m.type==="identifier"){u.push(m.text);continue}let d=m.namedChildren.find(p=>p.type==="identifier");d&&u.push(d.text)}if(c.length!==u.length)return!1;for(let m=0;m<u.length;m+=1){let d=c[m];if(d.type!=="identifier"||d.text!==u[m])return!1}return!0}var up=new Set(["identifier","type_identifier","field_identifier"]),mp=new Set(["identifier"]),dp=new Set(["identifier","property_identifier","type_identifier","shorthand_property_identifier","shorthand_property_identifier_pattern"]),pp=new Set(["rust","python"]),fp=/\{([^{}]*)\}/g,gp=/\b([A-Za-z_][\w]*)\b/g;function Fa(e,t){return hp(t).has(e.type)}function Ta(e,t){return pp.has(t)&&e.type==="string_content"}function Gi(e){let t=0;for(let r of e.values()){let i=r[r.length-1];i!==void 0&&i>t&&(t=i)}let n=new Array(t+1);for(let r=0;r<=t;r+=1)n[r]=new Set;for(let[r,i]of e)for(let o of i)n[o].add(r);return n}function hp(e){return e==="rust"?up:e==="python"?mp:dp}function Aa(e,t){let n=e.startPosition.row;for(let r of e.text.matchAll(fp)){let i=r[1]??"";for(let o of i.matchAll(gp))o[1]&&t(o[1],n)}}var yp=[/\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],bp=/^#!?\[\s*serde\s*\(/,Sp=/^#!?\[\s*schemars\s*\(/,xp=/^#!?\[\s*validate\s*\(/,Cp=new Set(["invoke","invokeTauriCommand","listen","once","emit","subscribe","dispatch","sendCommand","callRust"]);function Ma(e,t,n){if(t!=="typescript"&&t!=="tsx"&&t!=="javascript"||e.type!=="call_expression")return;let r=e.childForFieldName("function")??e.namedChild(0);if(!r)return;let i=en(r);if(!i||!Cp.has(i))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 Oa(e,t){let n=bp.test(e),r=Sp.test(e),i=xp.test(e);if(!(!n&&!r&&!i))for(let o of yp){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 $a(e,t){let n=new Map,r=(s,a)=>{if(s===a)return;let c=n.get(s);c||(c=new Set,n.set(s,c)),c.add(a)},i=t==="python"?new Set(["identifier"]):new Set(["type_identifier"]),o=(s,a)=>{let c=l=>{i.has(l.type)&&l.text!==a&&r(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&&r(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 Rp=Zt("source-facts",{clearGroups:["whole-project","source-file"]});function Q(e,t){let n=B(t);if(!n)return null;let r=P(e,t);return r?Rp.get(e,t,r,()=>Ip(e,t,n,r)):null}function Ip(e,t,n,r){let i=Ct(e,t,r),o=Rr(e,"source-facts",t,i);if(o){let c=Dp(o);if(c&&c.language===n)return c}let s=ue(e,t);if(!s)return null;let a=_p(s,n);return Ir(e,"source-facts",t,i,vp(a)),a}function vp(e){let t={language:e.language,callables:e.callables,callSites:e.callSites,typeContainerMap:[...e.typeContainerMap.entries()].map(([n,r])=>[n,[...r]]),identifierLineMap:[...e.identifierLineMap.entries()],rustAttrReferencedNames:[...e.rustAttrReferencedNames],crossLanguageDispatchNames:[...e.crossLanguageDispatchNames]};return JSON.stringify(t)}function Dp(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(([r,i])=>[r,new Set(i)])),identifierLineMap:n,identifiersByLine:Gi(n),fileIdentifiers:new Set(n.keys()),rustAttrReferencedNames:new Set(t.rustAttrReferencedNames),crossLanguageDispatchNames:new Set(t.crossLanguageDispatchNames)}}catch{return null}}function Ji(e,t,n,r){let i=Q(e,t);return i?Np(i,n,r)?.isLiteralPassthrough??!0:!0}function Np(e,t,n){return e.callables.find(r=>r.startLine===t&&r.endLine===n)??null}function _p(e,t){let n=[],r=[],i=new Set,o=new Set,s=new Map,a=(l,u)=>{let m=s.get(l);if(!m){s.set(l,[u]);return}m[m.length-1]!==u&&m.push(u)},c=l=>{let u=ka(l,t);u&&n.push(u);let m=Ra(l,t);m&&r.push(m),Ma(l,t,o),t==="rust"&&(l.type==="attribute_item"||l.type==="inner_attribute_item")&&Oa(l.text,i),Fa(l,t)&&a(l.text,l.startPosition.row),Ta(l,t)&&Aa(l,a);for(let d of l.children)c(d)};return c(e.rootNode),{language:t,callables:n,callSites:r,typeContainerMap:$a(e,t),identifierLineMap:s,identifiersByLine:Gi(s),fileIdentifiers:new Set(s.keys()),rustAttrReferencedNames:i,crossLanguageDispatchNames:o}}var ja=new Set(["rust","typescript","tsx","javascript","python"]);function zi(e,t){let n=Q(e,t);return!n||!ja.has(n.language)?null:n.callables.map(r=>({name:r.name,startLine:r.startLine,endLine:r.endLine}))}function tn(e,t){let n=Q(e,t);return!n||!ja.has(n.language)?null:n.callSites}function Ki(e,t){return Q(e,t)?.typeContainerMap??new Map}function Rt(e,t,n={}){let r=Q(e,t);if(!r)return[];let i=[];if(n.includeCrossLanguageDispatchNames)for(let o of r.crossLanguageDispatchNames)i.push({name:o,kind:"cross-language-dispatch",occurrences:1});if(n.includeRustAttributeNames&&r.language==="rust")for(let o of r.rustAttrReferencedNames)i.push({name:o,kind:"rust-attribute",occurrences:1});return i}var Lp={"/":"namespace","#":"type",".":"term","[":"type-param",":":"meta","!":"macro"};function ne(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],r=t[1],i=e.slice(n.length+1+r.length+1),o;if(i.startsWith("`")){let l=i.indexOf("`",1);l===-1?(o=i.slice(1),i=""):(o=i.slice(1,l),i=i.slice(l+2))}else{let l=i.indexOf(" ");l===-1?(o=i,i=""):(o=i.slice(0,l),i=i.slice(l+1))}let s,a=i.indexOf(" ");a===-1?(s=i,i=""):(s=i.slice(0,a),i=i.slice(a+1));let c=wp(i);return{scheme:n,manager:r,packageName:o,version:s,descriptors:c,raw:e}}function Be(e){let t=ne(e);if("kind"in t)return null;for(let n=t.descriptors.length-2;n>=0;n--){let r=t.descriptors[n];if(r?.suffix==="type")return r.name}return null}function wp(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||Ba(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 r;if(e[n]==="`"){let o=e.indexOf("`",n+1);if(o===-1){r=e.slice(n+1),t.push({name:r,suffix:"term"});break}r=e.slice(n+1,o),n=o+1}else{let o=n;for(;n<e.length&&!Ba(e[n]);)n++;r=e.slice(o,n)}if(n>=e.length){r&&t.push({name:r,suffix:"term"});break}let i=e[n];if(i==="("){let o=e.indexOf(")",n+1);o!==-1&&e[o+1]==="."?(t.push({name:r,suffix:"method"}),n=o+2):o!==-1?(t.push({name:r,suffix:"method"}),n=o+1):(t.push({name:r,suffix:"term"}),n++)}else{let o=Lp[i];o&&t.push({name:r,suffix:o}),n+=1}}return t}function Ba(e){return e==="/"||e==="#"||e==="."||e==="("||e==="["||e===":"||e==="!"}function b(e){let t=ne(e);if("kind"in t&&t.kind==="local")return`local:${t.id}`;let n=t;if(n.descriptors.length===0)return n.raw;let r=[];for(let i of n.descriptors){let o=Ep(i);o&&r.push(o)}return r.join(":")}function Ep(e){let t=e.suffix==="namespace"?kp(e.name):e.name;return t?e.suffix==="method"?`${t}()`:t:""}function kp(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 T(e){let t=ne(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 re(e){let t=ne(e);if("kind"in t&&t.kind==="local")return null;let n=t;return n.descriptors[n.descriptors.length-1]?.suffix??null}function ae(e){return e.endsWith("().")||re(e)==="method"}function Y(e){let t=re(e);return t==="method"||t==="term"}function ct(e){return re(e)==="namespace"}var Pp=/^rust-analyzer\b.*[\s/]impl#\[[^\]]+\]\[[^\]]+\]/;function vr(e){return Pp.test(e)}var Fp=new Set(["test","tests","_tests"]);function nn(e){let t=ne(e);if("kind"in t)return!1;for(let n=0;n<t.descriptors.length-1;n+=1){let r=t.descriptors[n];if(r?.suffix==="namespace"&&r.name&&Fp.has(r.name))return!0}return!1}function Ha(e,t){let n=ne(e),r=ne(t);if("kind"in n||"kind"in r)return!1;let i=n.descriptors,o=r.descriptors;if(o.length!==i.length+1)return!1;for(let s=0;s<i.length;s++){let a=i[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function qa(e,t){let n=ne(e),r=ne(t);if("kind"in n||"kind"in r)return!1;let i=n.descriptors,o=r.descriptors;if(o.length<=i.length)return!1;for(let s=0;s<i.length;s++){let a=i[s],c=o[s];if(a.name!==c.name||a.suffix!==c.suffix)return!1}return!0}function rn(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
|
|
11
31
|
FROM global_symbols gs
|
|
12
32
|
JOIN defn_enclosing_ranges der ON gs.id = der.symbol_id
|
|
13
33
|
JOIN documents d ON der.document_id = d.id
|
|
14
34
|
WHERE ${t.where}
|
|
15
35
|
${e.pathExclusionsFor("d")}
|
|
16
|
-
${
|
|
17
|
-
${
|
|
36
|
+
${Wa(t.orderBy)}
|
|
37
|
+
${Ua(t.limit)}`,...t.params??[])}function on(e,t){return e.all(`SELECT
|
|
18
38
|
gs.id,
|
|
19
39
|
gs.symbol,
|
|
20
40
|
c.document_id,
|
|
@@ -31,8 +51,8 @@ import{program as Di}from"commander";import{realpathSync as cd}from"fs";import{f
|
|
|
31
51
|
AND ${t.where}
|
|
32
52
|
${e.pathExclusionsFor("d")}
|
|
33
53
|
GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path, gs.display_name, gs.documentation
|
|
34
|
-
${
|
|
35
|
-
${
|
|
54
|
+
${Wa(t.orderBy)}
|
|
55
|
+
${Ua(t.limit)}`,...t.params??[])}function Wa(e){return e?`ORDER BY ${e}`:""}function Ua(e){return typeof e=="number"?`LIMIT ${e}`:""}function It(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 vt(e){if(!e)return null;let t=Va(e);if(t)return t.replace(/\n/g," ");let n=e.indexOf("|");if(n===-1)return e.replace(/\n/g," ");let r=e.slice(n+1);return(Va(r)??r).replace(/\n/g," ")}function Va(e){return/^```(?:\w+)?\s*\n?([\s\S]*?)\n?```/.exec(e.trimStart())?.[1]?.trim()||null}function Tp(e){if(Be(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 sn(e,t,n={}){let r=new Map;for(let o of t)e.length>0&&!Tp(o)||r.set(o.id,o);for(let o of e)r.set(o.id,o);let i=[...r.values()];return n.sort?i.sort((o,s)=>o.start_line-s.start_line||o.end_line-s.end_line||o.symbol.localeCompare(s.symbol)):i}var Ap=H("file-definitions",{clearGroups:["definition-catalog"]});function W(e,t){return Ap.get(e,t,()=>{let n=sn(Mp(e,t),Op(e,t),{sort:!0});return jp(e,t,n.map($p))})}function Mp(e,t){return e.all(`SELECT
|
|
36
56
|
gs.id,
|
|
37
57
|
gs.symbol,
|
|
38
58
|
der.document_id,
|
|
@@ -48,7 +68,7 @@ import{program as Di}from"commander";import{realpathSync as cd}from"fs";import{f
|
|
|
48
68
|
JOIN documents d ON der.document_id = d.id
|
|
49
69
|
WHERE d.relative_path = ?
|
|
50
70
|
${e.symbolNoiseFor("gs")}
|
|
51
|
-
ORDER BY der.start_line, der.end_line`,t)}function
|
|
71
|
+
ORDER BY der.start_line, der.end_line`,t)}function Op(e,t){return e.all(`SELECT
|
|
52
72
|
gs.id,
|
|
53
73
|
gs.symbol,
|
|
54
74
|
c.document_id,
|
|
@@ -67,10 +87,10 @@ import{program as Di}from"commander";import{realpathSync as cd}from"fs";import{f
|
|
|
67
87
|
AND m.role = 1
|
|
68
88
|
${e.symbolNoiseFor("gs")}
|
|
69
89
|
GROUP BY gs.id, gs.symbol, c.document_id, d.relative_path
|
|
70
|
-
ORDER BY start_line, end_line`,t)}function
|
|
71
|
-
AND `),o=Yt(e,{where:i,params:r,limit:200}),s=Xt(e,{where:i,params:r,limit:200});return Zt(o,s)}function Ip(e,t,n,r){let i=t.trim(),o=n,s=o.replace(/\(\)$/,""),a=t.toLowerCase(),c=n.toLowerCase(),l=c.replace(/\(\)$/,""),u=e.symbol,m=b(e.symbol),d=P(e.symbol),p=e.display_name??"",h=e.symbol.toLowerCase(),f=m.toLowerCase(),y=d.toLowerCase(),C=p.toLowerCase(),E=e.relative_path.toLowerCase(),N=/[/:.]/.test(n),I=Ti(n),v=I?.leaf.toLowerCase(),w=0;return(u===i||u===o)&&(w+=1150),(m===i||m===o)&&(w+=1100),p===s&&(w+=1180),d===s&&(w+=1160),(`${d}()`===i||`${d}()`===o)&&(w+=955),(h===a||h===c)&&(w+=1e3),(f===a||f===c)&&(w+=950),(E===a||E===c)&&(w+=925),(E.endsWith(`/${c}`)||E.endsWith(`/${a}`))&&(w+=875),C===l&&(w+=850),y===l&&(w+=825),(`${y}()`===a||`${y}()`===c)&&(w+=820),(f.endsWith(`:${c}`)||f.endsWith(`:${l}`)||f.endsWith(`:${l}()`))&&(w+=800),h.includes(c)&&(w+=120),f.includes(c)&&(w+=140),E.includes(c)&&(w+=140),C.includes(c)&&(w+=110),r.every(V=>{let O=V.toLowerCase();return h.includes(O)||f.includes(O)||E.includes(O)||C.includes(O)})&&(w+=100+r.length*15),I&&E.includes(I.path.toLowerCase())&&(w+=360,v&&(y===v||`${y}()`===v||`${y}()`==`${v}()`)&&(w+=700),ie(e.symbol)&&(w+=180)),Y(e.symbol)&&y===l&&(w+=60),!N&&ot(e.symbol)&&(w-=160),w-=Math.min(50,Math.max(0,e.end_line-e.start_line)),w}function Ti(e){let t=e.trim().replace(/\\/g,"/"),n=t.lastIndexOf("/");if(n<=0||n===t.length-1)return null;let r=t.slice(n+1).replace(/\(\)$/,"");return!r||r.includes(".")?null:{path:t.slice(0,n),leaf:r}}function Mi(e){return e.trim().replace(/\(\)$/,"").replace(/\(.*$/,"")}function vp(e){let t=Mi(e),n=t.split(/[^A-Za-z0-9_]+/).map(r=>r.trim()).filter(r=>r.length>0);return n.length>0?[...new Set(n)]:[t]}function Dp(e,t,n){let r=t.trim(),i=e.filter(o=>{let s=b(o.symbol),a=(o.display_name??"").trim();return o.symbol===r||s===r||s===n||a===r||a===n||`${a}()`===r||en(o,n)>1||o.relative_path===r});return i.length===0?null:(i.sort((o,s)=>en(s,n)-en(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)),i[0]??null)}function en(e,t){let n=Ti(t);if(!n)return 0;let r=e.relative_path.toLowerCase(),i=P(e.symbol).toLowerCase(),o=n.path.toLowerCase(),s=n.leaf.toLowerCase();return r.includes(o)?i!==s?1:ie(e.symbol)?Me(e.symbol)===null?5:4:Me(e.symbol)===null?3:2:0}function me(e,t){let n=La(e,t,{allowMultiple:!1})[0]?.relativePath;return n||wp(e,t)}function nn(e,t){return La(e,t,{allowMultiple:!0}).map(n=>n.relativePath)}function wp(e,t){if(!t)return null;let n=t.replace(/\\/g,"/").replace(/^\.\//,""),r=Lp(n)&&n.startsWith(e.config.projectRoot)?n.slice(e.config.projectRoot.length).replace(/^\/+/,""):n,i=_p(e.config.projectRoot,r);return Np(i)?r:null}function La(e,t,n){let r=_a(t);if(!r)return[];let i=A(e,{includeIgnored:!1}).map(a=>({relativePath:a,score:Ep(a,r)})).filter(a=>a.score>0).sort((a,c)=>c.score-a.score||a.relativePath.localeCompare(c.relativePath));if(i.length===0){let a=F(e,t);return!a||e.isIgnored(a.relativePath)?[]:[{relativePath:a.relativePath,score:700}]}let o=i.filter(a=>a.score>=1100);if(o.length>0)return n.allowMultiple?o:[o[0]];let s=i.filter(a=>a.score>=800);return s.length>0?n.allowMultiple?s:[s[0]]:n.allowMultiple?i:[i[0]]}function Ep(e,t){let n=_a(e),r=Na(n),i=Na(t),o=0;return n===t&&(o+=1200),n.endsWith(`/${t}`)&&(o+=1100),r===i&&(o+=900),n.startsWith(`${t}/`)&&(o+=850),n.includes(t)&&(o+=250),o}function _a(e){return e.trim().replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"")}import{basename as Mh}from"path";import{existsSync as yr}from"fs";import{basename as kp,dirname as st,extname as Ue,join as Le,relative as vn,resolve as Se}from"path";var Pp=re("indexed-paths",{clearGroups:[]}),Rt=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".vue"],br=[".py",".pyi"],fe=[".java",".scala",".kt",".kts"],Sr=[".rs"],xr=[".rb"],Cr=[".c",".h",".cc",".cpp",".cxx",".hpp",".hh",".hxx"],at=[".cs",".vb"],Rr=[".dart"],It=[".php"],Fp=new Set(Rt),Oi=new Set(br),wa=new Set(fe),$i=new Set(Sr),ji=new Set(xr),Ea=new Set(Cr),ka=new Set(at),Bi=new Set(Rr),Pa=new Set(It),Ap=[{extensions:Rt,lookup:Fp},{extensions:br,lookup:Oi},{extensions:fe,lookup:wa},{extensions:Sr,lookup:$i},{extensions:xr,lookup:ji},{extensions:Cr,lookup:Ea},{extensions:at,lookup:ka},{extensions:Rr,lookup:Bi},{extensions:It,lookup:Pa}];function ct(e,t){return t.has(Ue(e).toLowerCase())}function Tp(e){return ct(e,Oi)}function Mp(e){return ct(e,wa)}function Op(e){return ct(e,$i)}function $p(e){return ct(e,ji)}function jp(e){return ct(e,Ea)}function Bp(e){return ct(e,ka)}function Fa(e){return Ue(e).toLowerCase()===".vb"}function Hp(e){return ct(e,Bi)}function qp(e){return ct(e,Pa)}function Hi(e){let t=Ue(e).toLowerCase();for(let n of Ap)if(n.lookup.has(t))return n.extensions;return Rt}function Vp(e){return Mp(e)||Bp(e)||qp(e)}function we(e,t,n){return Tp(t)?rn(e,t,n):Op(t)?Ge(e,t,n):$p(t)?Ir(e,t,n):jp(t)?vr(e,t,n):Vp(t)?J(e,n.replace(/\\/g,"."),Hi(t)):Hp(t)?Dr(e,t,n):Wp(e,t,n)}function Wp(e,t,n){if(!n.startsWith(".")&&!n.startsWith("/"))return null;let r=st(Le(e.config.projectRoot,t)),i=Se(r,n),o=Dn(e);for(let s of Qp(i)){let a=_e(vn(e.config.projectRoot,s));if(o.has(a)||yr(s))return a}return _e(vn(e.config.projectRoot,i))}function rn(e,t,n){let r=Dn(e),i;if(n.startsWith(".")){let o=n.match(/^(\.+)(.*)$/);if(!o)return null;let s=o[1].length,a=o[2].replace(/^\./,""),c=st(Le(e.config.projectRoot,t));for(let l=1;l<s;l++)c=st(c);i=a?Se(c,a.replace(/\./g,"/")):c}else i=Se(e.config.projectRoot,n.replace(/\./g,"/"));for(let o of Up(i)){let s=_e(vn(e.config.projectRoot,o));if(r.has(s)||yr(o))return s}return null}function Ge(e,t,n){if(!n)return null;let r=n.replace(/\s+as\s+.+$/,"").trim();if(!r.startsWith("crate::")&&!r.startsWith("self::")&&!r.startsWith("super::"))return null;let i=st(Le(e.config.projectRoot,t)),o;return r.startsWith("crate::")?o=Se(e.config.projectRoot,"src",r.slice(7).replace(/::/g,"/")):r.startsWith("self::")?o=Se(i,r.slice(6).replace(/::/g,"/")):o=Se(st(i),r.slice(7).replace(/::/g,"/")),qi(e,Gp(o))}function Ir(e,t,n){let r=st(Le(e.config.projectRoot,t)),i=Se(r,n);return qi(e,Jp(i))}function vr(e,t,n){let r=st(Le(e.config.projectRoot,t)),i=[Se(r,n),Se(e.config.projectRoot,n),Se(e.config.projectRoot,"include",n),Se(e.config.projectRoot,"src",n)];return qi(e,i)}function J(e,t,n){let r=Dn(e),i=t.replace(/\\/g,".").replace(/::/g,".").replace(/^global::/,""),o=i.replace(/\./g,"/"),s=i.split(".").pop()??i;for(let c of n){let l=`${o}${c}`,u=[...r].find(m=>m.endsWith(l));if(u)return u}for(let c of n){let l=[...r].find(u=>kp(u)===`${s}${c}`);if(l)return l}let a=[...r].filter(c=>n.includes(Ue(c).toLowerCase())).filter(c=>c.includes(`/${o}/`)||c.includes(`/${s}/`)).sort((c,l)=>c.localeCompare(l));return a.length===1?a[0]:null}function Dr(e,t,n){let r=Dn(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=_e(c.startsWith("lib/")?c:`lib/${c}`);return r.has(l)?l:null}let i=st(Le(e.config.projectRoot,t)),o=Se(i,n);for(let s of zp(o)){let a=_e(vn(e.config.projectRoot,s));if(r.has(a)||yr(s))return a}return null}function Up(e){let t=Ue(e);return Oi.has(t)?[e]:[`${e}.py`,`${e}.pyi`,Le(e,"__init__.py"),Le(e,"__init__.pyi")]}function qi(e,t){let n=Dn(e);for(let r of t){let i=_e(vn(e.config.projectRoot,r));if(n.has(i)||yr(r))return i}return null}function Gp(e){let t=Ue(e);return $i.has(t)?[e]:[`${e}.rs`,Le(e,"mod.rs")]}function Jp(e){let t=Ue(e);return ji.has(t)?[e]:[`${e}.rb`,Le(e,"index.rb")]}function zp(e){let t=Ue(e);return Bi.has(t)?[e]:[`${e}.dart`,e]}function Qp(e){let t=Ue(e),n=new Set;if(t){n.add(e);for(let r of Rt)n.add(e.slice(0,-t.length)+r)}else for(let r of Rt)n.add(`${e}${r}`),n.add(Le(e,`index${r}`));return[...n]}function Dn(e){return Pp.get(e,()=>new Set(A(e,{includeIgnored:!1}).map(_e)))}function _e(e){return e.replace(/\\/g,"/")}import{basename as Ta}from"path";function vt(e){return e.replace(/'''[\s\S]*?'''/g,lt).replace(/"""[\s\S]*?"""/g,lt).replace(/#.*$/gm,lt).replace(/\/\/.*$/gm,lt).replace(/\/\*[\s\S]*?\*\//g,lt).replace(/`(?:\\[\s\S]|[^`])*`/g,lt).replace(/'(?:\\.|[^'\\\r\n])*'/g,lt).replace(/"(?:\\.|[^"\\\r\n])*"/g,lt)}function lt(e){return e.replace(/[^\r\n]/g," ")}var L_=ur("stripped-lines",{clearGroups:["whole-project","source-file"]});it({name:"stripped-source-singleton",groups:["whole-project","source-file"],clearAll:()=>{Nr=null,Nn=""},clearFile:()=>{Nr=null,Nn=""}});var Nr=null,Nn="";function Kp(e){return Nr===e||(Nr=e,Nn=vt(e)),Nn}function ut(e,t,n){let r=Kp(e);return`${r.slice(0,t)}${" ".repeat(n-t)}${r.slice(n)}`}function de(e,t){return new RegExp(`\\b${Aa(t)}\\b`,"m").test(e)}function on(e,t){let n=new Set,r=new RegExp(`\\b${Aa(t)}\\s*\\.\\s*([A-Za-z_$][\\w$]*)`,"g");for(let i of e.matchAll(r)){let o=i[1];o&&n.add(o)}return[...n]}function Aa(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ln(e){let t=0;for(let n of e)n==="("&&(t+=1),n===")"&&(t-=1);return t}var Yp=new Set(["identifier","type_identifier","property_identifier","shorthand_property_identifier","field_identifier"]);function pe(e){let t=[],n=0,r=0;for(let i=0;i<e.length;i++){let o=e[i];(o==="{"||o==="["||o==="(")&&n++,(o==="}"||o==="]"||o===")")&&n--,o===","&&n===0&&(t.push(e.slice(r,i)),r=i+1)}return t.push(e.slice(r)),t}function ge(e,t){for(let n of e.namedChildren)if(n.type===t)return n;return null}function z(e,t){let n=new Set,r=(i,o)=>{let s=o||t.has(i.type);!s&&Yp.has(i.type)&&n.add(i.text);for(let a of i.children)r(a,s)};return r(e.rootNode,!1),n}function $e(e,t,n,r,i,o,s){return{importedName:i,localName:o,sourcePath:s??J(e,r,Hi(t)),kind:"named",used:de(n,o),usedMembers:[]}}function U(e,t,n,r,i="named",o={}){return{importedName:e,localName:t,sourcePath:n,kind:i,used:r.has(t),usedMembers:[],isTypeOnly:o.isTypeOnly}}function sn(e,t,n,r,i="named",o=[],s={}){return{importedName:e,localName:t,sourcePath:n,kind:i,used:r,usedMembers:o,isTypeOnly:s.isTypeOnly}}function Dt(e,t){return{importedName:e,localName:null,sourcePath:t,kind:"side-effect",used:!0,usedMembers:[]}}function Nt(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 xe(e,t,n){let r=[];for(let i of e.matchAll(t)){let o=i[0];if(!o||typeof i.index!="number")continue;let s=ut(e,i.index,i.index+o.length);for(let a of n(i,s))r.push(a)}return r}function Ce(e,t,n,r){let i=ce(e,t);if(i){let o=n(i);if(o)return o}return r()}function Lr(e,t,n,r){let i=ce(e,t),o=$(t),s=o?n[o]:void 0;return i&&s?s(i):r()}function Ma(e,t,n){return Ce(e,t,r=>Zp(e,t,r),()=>Xp(e,t,n))}function Xp(e,t,n){return xe(n,/^[ \t]*#include\s+[<"]([^">]+)[">]\s*$/gm,(r,i)=>{let o=r[1]?.trim();if(!o)return[];let s=Ta(o).replace(/\.[^.]+$/,"");return[sn(o,s,vr(e,t,o),de(i,s))]})}function Zp(e,t,n){let r=z(n,new Set(["preproc_include"])),i=[];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=Ta(s).replace(/\.[^.]+$/,"");i.push(U(s,a,vr(e,t,s),r))}return i}function Oa(e,t,n){let r=[];for(let i of n.matchAll(/^[ \t]*import\s+['"]([^'"]+)['"](?:\s+as\s+([A-Za-z_]\w*))?[\s\S]*?;$/gm)){let o=i[1]?.trim(),s=i[2]?.trim()??null,a=i[0];if(!o||!a||typeof i.index!="number")continue;let c=ut(n,i.index,i.index+a.length);r.push({importedName:o,localName:s,sourcePath:Dr(e,t,o),kind:s?"namespace":"side-effect",used:s?de(c,s):!0,usedMembers:s?on(c,s):[]})}return r}function $a(e,t,n){let r=[];for(let i of n.matchAll(/^[ \t]*export\s+['"]([^'"]+)['"][\s\S]*?;$/gm)){let o=i[1]?.trim();o&&r.push({specifier:o,sourcePath:Dr(e,t,o)})}return r}function ja(e,t,n){return Lr(e,t,{csharp:r=>tf(e,t,r),vb:r=>ef(e,t,r)},()=>{let r=Fa(t)?/^[ \t]*Imports\s+(.+?)\s*$/gm:/^[ \t]*using\s+(.+?)\s*;$/gm;return xe(n,r,(i,o)=>{let s=i[1]?.trim();if(!s)return[];let[a,c]=s.split(/\s*=\s*/),l=!!c,u=(l?c:a)?.trim()??s,m=u.split(".").pop()??u,d=l?a?.trim()??m:m;return[$e(e,t,o,u,m,d,J(e,u,at))]})})}function ef(e,t,n){let r=z(n,new Set(["imports_statement"])),i=[];for(let o of n.rootNode.descendantsOfType("imports_statement")){let s=o.namedChildren.filter(d=>d.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,m=c?.text??u;i.push(U(u,m,J(e,l,at),r,c?"namespace":"named"))}return i}function tf(e,t,n){let r=z(n,new Set(["using_directive"])),i=[];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,m=a?.text??u;i.push(U(u,m,J(e,l,at),r,a?"namespace":"named"))}return i}var nf=W("vue-non-script-identifiers",{clearGroups:["whole-project","source-file"]});function Ba(e,t){return nf.get(e,t,()=>{let n=new Set,r=T(e,t);if(!r)return n;let o=r.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 Vi(e,t,n){return Ce(e,t,r=>of(e,t,r),()=>rf(e,t,n))}function rf(e,t,n){return hf(n).flatMap(r=>yf(e,t,r.clause,r.specifier,r.start,r.end,n))}function of(e,t,n){let r=sf(e,t,n),i=[];for(let o of n.rootNode.descendantsOfType("import_statement"))i.push(...af(e,t,n,o,r));return i}function sf(e,t,n){let r=z(n,new Set(["import_statement"]));if(yt(t))for(let i of Ba(e,t))r.add(i);return r}function af(e,t,n,r,i){let o=df(r);if(!o)return[];let s=we(e,t,o),a=ge(r,"import_clause");return a?cf(n,a,s,i,pf(r.text)):[Dt("*",s)]}function cf(e,t,n,r,i){let o=[];for(let s of t.namedChildren)if(s.type==="identifier")o.push(lf(s.text,n,r,i));else if(s.type==="namespace_import"){let a=uf(e,s,n,r,i);a&&o.push(a)}else s.type==="named_imports"&&o.push(...mf(s,n,r,i));return o}function lf(e,t,n,r){return U("default",e,t,n,"default",{isTypeOnly:r})}function uf(e,t,n,r,i){let s=ge(t,"identifier")?.text??"";if(!s)return null;let a=gf(e,s);return Nt("*",n,{localName:s,usedMembers:a,isTypeOnly:i,used:a.length>0||r.has(s)})}function mf(e,t,n,r){let i=[];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;i.push(U(c,l,t,n,"named",{isTypeOnly:r||ff(o.text)}))}return i}function df(e){let t=ge(e,"string");if(!t)return null;let n=ge(t,"string_fragment");return n?n.text:null}function pf(e){return/^\s*import\s+type\b/.test(e)}function ff(e){return/^\s*type\b/.test(e.trim())}function gf(e,t){let n=new Set;for(let r of e.rootNode.descendantsOfType("member_expression")){let i=r.namedChild(0),o=r.namedChild(1);!i||!o||i.type!=="identifier"||i.text!==t||(o.type==="property_identifier"||o.type==="identifier")&&n.add(o.text)}return[...n]}function hf(e){let t=[],n=/^[ \t]*import\s+([\s\S]*?)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let i of e.matchAll(n)){let o=i[0],s=i[1],a=i[2];!o||!a||typeof i.index!="number"||t.push({clause:s,specifier:a,start:i.index,end:i.index+o.length})}let r=/^[ \t]*import\s+['"]([^'"]+)['"]\s*;?/gm;for(let i of e.matchAll(r)){let o=i[0],s=i[1];!o||!s||typeof i.index!="number"||t.push({clause:null,specifier:s,start:i.index,end:i.index+o.length})}return t.sort((i,o)=>i.start-o.start)}function yf(e,t,n,r,i,o,s){let a=we(e,t,r),c=ut(s,i,o);return n?bf(n).map(u=>({...u,sourcePath:a})).map(u=>{if(u.kind==="namespace"){let m=on(c,u.localName);return Nt(u.importedName,u.sourcePath,{localName:u.localName,usedMembers:m,used:m.length>0||de(c,u.localName),isTypeOnly:u.isTypeOnly})}return u.kind==="side-effect"?Dt(u.importedName,u.sourcePath):sn(u.importedName,u.localName??"",u.sourcePath,u.localName?de(c,u.localName):!1,u.kind,[],{isTypeOnly:u.isTypeOnly})}):[Dt("*",a)]}function bf(e){let t=e.trim(),n=/^type\b/.test(t),r=t.replace(/^type\s+/,""),[i,o]=Sf(r),s=[];return i&&s.push(...Ha(i,n)),o&&s.push(...Ha(o,n)),s}function Ha(e,t){let n=e.trim();if(!n)return[];if(n.startsWith("{")){let r=n.slice(1,-1).trim();return r?pe(r).map(i=>{let o=i.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 Sf(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];if(r==="{"&&t++,r==="}"&&t--,r===","&&t===0)return[e.slice(0,n).trim(),e.slice(n+1).trim()]}return[e.trim(),null]}function Wi(e,t,n){let r=ce(e,t);return r?Df(e,t,r):xf(e,t,n)}function xf(e,t,n){return[...Cf(e,t,n),...Rf(e,t,n),...If(e,t,n)]}function Cf(e,t,n){let r=[],i=/^[ \t]*export\s+(?:type\s+)?\{([\s\S]*?)\}\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[1]??"",a=o[2]??"",c=pe(s).map(m=>vf(m.trim())).filter(m=>!!m),l=an(n,o.index),u=an(n,o.index+o[0].length-1);r.push({kind:"named",sourcePath:we(e,t,a),names:c,startLine:l,endLine:u})}return r}function Rf(e,t,n){let r=[],i=/^[ \t]*export\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[2]??"",a=an(n,o.index),c=an(n,o.index+o[0].length-1);r.push({kind:"star-as",sourcePath:we(e,t,s),names:[],startLine:a,endLine:c})}return r}function If(e,t,n){let r=[],i=/^[ \t]*export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[1]??"",a=an(n,o.index),c=an(n,o.index+o[0].length-1);r.push({kind:"star",sourcePath:we(e,t,s),names:[],startLine:a,endLine:c})}return r}function vf(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 r=t.match(/^(\w+)$/);return r?r[1]??null:null}function an(e,t){let n=0;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function Df(e,t,n){let r=[];for(let i of n.rootNode.descendantsOfType("export_statement")){let o=Nf(e,t,i);if(o===void 0)continue;let s=i.startPosition.row,a=i.endPosition.row,c=Lf(i,o,s,a);r.push(c)}return r}function Nf(e,t,n){let r=ge(n,"string");if(!r)return;let i=ge(r,"string_fragment");if(i)return we(e,t,i.text)}function Lf(e,t,n,r){let i=ge(e,"export_clause");if(i){let s=[];for(let a of i.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:r}}return ge(e,"namespace_export")?{kind:"star-as",sourcePath:t,names:[],startLine:n,endLine:r}:{kind:"star",sourcePath:t,names:[],startLine:n,endLine:r}}function qa(e,t,n){return Lr(e,t,{java:r=>_f(e,t,r),kotlin:r=>wf(e,t,r),scala:r=>Ef(e,t,r)},()=>xe(n,/^[ \t]*import\s+(?:static\s+)?(.+?)\s*;?$/gm,(r,i)=>{let o=r[1]?.trim();return o?kf(e,t,o,i):[]}))}function _f(e,t,n){let r=z(n,new Set(["import_declaration"])),i=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.children.some(m=>m.type==="asterisk"),c=o.namedChildren.find(m=>m.type==="scoped_identifier")??o.namedChildren.find(m=>m.type==="identifier");if(!c)continue;let l=c.text;if(s){i.push(Nt("*",J(e,l,fe)));continue}let u=l.split(".").pop()??l;i.push(U(u,u,J(e,l,fe),r))}return i}function wf(e,t,n){let r=z(n,new Set(["import_header","import_list"])),i=[];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){i.push(Nt("*",J(e,s.text,fe)));continue}let l=s.text,u=l.split(".").pop()??l,d=c?.namedChild(0)?.text??u;i.push(U(u,d,J(e,l,fe),r))}return i}function Ef(e,t,n){let r=z(n,new Set(["import_declaration"])),i=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.namedChildren.find(m=>m.type==="namespace_selectors"||m.type==="namespace_wildcard"),a=o.namedChildren.filter(m=>m!==s&&(m.type==="identifier"||m.type==="stable_identifier")),c=a.map(m=>m.text).join(".");if(!c)continue;if(s?.type==="namespace_wildcard"){i.push(Nt("*",J(e,c,fe)));continue}if(s?.type==="namespace_selectors"){for(let m of s.namedChildren)if(m.type==="arrow_renamed_identifier"){let[d,p]=m.namedChildren;if(!d)continue;let h=d.text,f=p?.text??h;if(h==="_")continue;i.push(U(h,f,J(e,`${c}.${h}`,fe),r))}else if(m.type==="identifier"){let d=m.text;i.push(U(d,d,J(e,`${c}.${d}`,fe),r))}continue}let l=a[a.length-1]?.text??c,u=a.slice(0,-1).map(m=>m.text).join(".")||c;i.push(U(l,l,J(e,u&&a.length>1?`${u}.${l}`:c,fe),r))}return i}function kf(e,t,n,r){if(n.includes("{")&&n.includes("}")){let i=n.slice(0,n.indexOf("{")).replace(/\.$/,"").trim(),o=n.slice(n.indexOf("{")+1,n.lastIndexOf("}")).trim();return pe(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 m=(l??u.split(".").pop()??u).trim(),d=u==="_"?i:`${i}.${u}`.replace(/\.\./g,".");return[$e(e,t,r,d,u,m)]})}return[$e(e,t,r,n,n.split(".").pop()??n,n.split(".").pop()??n)]}function Wa(e,t,n){return Ce(e,t,r=>Pf(e,t,r),()=>xe(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(r,i)=>{let o=r[1]?.trim();return o?pe(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.split(/\s+as\s+/i),u=c?.trim()??a,m=u.split("\\").pop()??u,d=(l??m).trim();return[$e(e,t,i,u,m,d,J(e,u.replace(/\\/g,"."),It))]}):[]}))}function Pf(e,t,n){let r=z(n,new Set(["namespace_use_declaration"])),i=[],o=(s,a,c)=>{i.push(U(a,c,J(e,s.replace(/\\/g,"."),It),r))};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:m,qualified:d}=Va(l,c);u&&o(d,u,m)}continue}for(let c of s.namedChildren){if(c.type!=="namespace_use_clause")continue;let{importedName:l,localName:u,qualified:m}=Va(c,"");l&&o(m,l,u)}}return i}function Va(e,t){let n=e.namedChildren.find(l=>l.type==="qualified_name"),r=e.namedChildren.filter(l=>l.type==="name"),i="";n?i=n.text:r.length>=1&&(i=r[0].text);let o=n&&r.length>0?r[r.length-1]:null,s=i.split("\\").pop()??i,a=o?.text??s,c=t?`${t}\\${i}`:i;return{importedName:s,localName:a,qualified:c}}function Ga(e,t,n){return Ce(e,t,r=>Ff(e,t,r),()=>Tf(n).flatMap(r=>Of(e,t,r,n)))}function Ff(e,t,n){let r=z(n,new Set(["import_statement","import_from_statement"])),i=[];for(let o of n.rootNode.descendantsOfType("import_statement"))for(let s of o.namedChildren){let a=Ua(s);if(!a)continue;let c=rn(e,t,a.qualifiedName);i.push({importedName:a.qualifiedName,localName:a.localName,sourcePath:c,kind:"namespace",used:r.has(a.localName),usedMembers:[]})}for(let o of n.rootNode.descendantsOfType("import_from_statement")){let s=o.namedChild(0);if(!s)continue;let a=Af(s);if(a===null)continue;let c=rn(e,t,a);for(let l=1;l<o.namedChildCount;l+=1){let u=o.namedChild(l);if(u.type==="wildcard_import"){i.push({importedName:"*",localName:null,sourcePath:c,kind:"side-effect",used:!0,usedMembers:[]});continue}let m=Ua(u);m&&i.push({importedName:m.qualifiedName,localName:m.localName,sourcePath:c,kind:"named",used:r.has(m.localName),usedMembers:[]})}}return i}function Ua(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 Af(e){if(e.type==="dotted_name")return e.text;if(e.type==="relative_import"){let t=ge(e,"import_prefix")?.text??"",n=ge(e,"dotted_name")?.text??"";return`${t}${n}`}return null}function Tf(e){let t=e.split(`
|
|
72
|
-
`),n=[],r=0;for(let i=0;i<t.length;i++){let o=t[i],s=o.trimStart(),a=r;if(r+=o.length+1,!s.startsWith("import ")&&!s.startsWith("from "))continue;let c=o,l=a+o.length,u=
|
|
73
|
-
${d}`,l+=1+d.length,u+=
|
|
90
|
+
ORDER BY start_line, end_line`,t)}function $p(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:T(e.symbol),parentTypeName:Be(e.symbol),isFunctionLike:Y(e.symbol),isTypeLike:re(e.symbol)==="type",kind:e.kind??null,documentation:e.documentation??null,enclosingSymbol:e.enclosing_symbol??null}}function He(e,t={}){return Qi(e,t.scope)}function Qi(e,t){return M(e,{scope:t,includeIgnored:!1}).flatMap(n=>W(e,n)).filter(n=>!e.isIgnored(n.relativePath))}function Dr(e,t,n={}){if(t.length===0)return[];let r=t.flatMap(i=>W(e,i)).filter(i=>!e.isIgnored(i.relativePath));return n.onlyDocumented&&(r=r.filter(i=>i.documentation!==null&&i.documentation!=="")),n.sort&&(r=r.sort((i,o)=>i.relativePath.localeCompare(o.relativePath)||i.startLine-o.startLine||i.endLine-o.endLine)),r.map(i=>({startLine:i.startLine,endLine:i.endLine,symbol:i.symbol,shortName:b(i.symbol),signature:It(vt(i.documentation)),relativePath:i.relativePath,enclosingSymbol:i.enclosingSymbol}))}function Ce(e,t){let n=null;for(let r of e)r.startLine>t||r.endLine<t||(!n||r.endLine-r.startLine<n.endLine-n.startLine)&&(n=r);return n}function Dt(e,t){let n=W(e,t.relative_path).find(r=>r.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 jp(e,t,n){let r=P(e,t),i=zi(e,t);return i?Up(n,i,r):r?Bp(n,r):n}function Bp(e,t){let n=t.split(/\r?\n/),r=Hp(e,n),i=qp(e,r),o=Vp(i,n);return Wp(e,o)}function Hp(e,t){let n=e.some(i=>Nr(i.symbol))?zp(t):null,r=new Map;for(let i of e)r.set(i.symbolId,Jp(t,n,i));return r}function qp(e,t){return e.filter(n=>Nr(n.symbol)).map(n=>({definition:n,startLine:t.get(n.symbolId)??n.startLine})).sort((n,r)=>n.startLine-r.startLine||n.definition.startLine-r.definition.startLine||n.definition.symbol.localeCompare(r.definition.symbol))}function Vp(e,t){let n=new Map;for(let r=0;r<e.length;r+=1){let i=e[r],o=e[r+1],s=o?Math.max(i.startLine,o.startLine-1):t.length-1;n.set(i.definition.symbolId,{startLine:i.startLine,endLine:Kp(t,i.definition,i.startLine,s)})}return n}function Wp(e,t){return e.map(n=>{let r=t.get(n.symbolId);return r?{...n,startLine:r.startLine,endLine:r.endLine}:n})}function Up(e,t,n=null){let r=new Map;for(let i of t){let o=r.get(i.name);o?o.push(i):r.set(i.name,[i])}return e.map(i=>{if(!Gp(i)||!i.leaf)return Ga(i,n);let o=r.get(i.leaf);if(!o||o.length===0)return Ga(i,n);let s=o[0],a=Math.abs(s.startLine-i.startLine);for(let c=1;c<o.length;c+=1){let l=o[c],u=Math.abs(l.startLine-i.startLine);u<a&&(s=l,a=u)}return{...i,startLine:s.startLine,endLine:s.endLine}})}function Gp(e){return Nr(e.symbol)?!0:re(e.symbol)==="term"&&Be(e.symbol)===null}function Ga(e,t){if(!t||!e.leaf||re(e.symbol)!=="term"||Be(e.symbol)!==null)return e;let n=e.leaf.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),r=new RegExp(`\\b(?:export\\s+)?(?:const|let|var)\\s+${n}\\b`),o=t.split(/\r?\n/).findIndex(s=>r.test(s));return o>=0?{...e,startLine:o,endLine:o}:e}function Jp(e,t,n){if(!Nr(n.symbol))return n.startLine;let r=Math.max(0,Math.min(n.startLine,e.length-1));if(!t)return r;let i=t.get(n.leaf);if(!i||i.length===0)return r;let o=null;for(let s of i){let a=Math.abs(s-n.startLine);(!o||a<o.distance)&&(o={line:s,distance:a})}return o?.line??r}function zp(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,r=/^\s*(?:(?:export|public|private|protected|static|readonly|async|abstract|get|set)\s+)*([A-Za-z_$][\w$]*)\s*(?:<[^(]*>)?\s*\(/,i=/\b([A-Za-z_$][\w$]*)\s*\(/g,o=new Map,s=(a,c)=>{let l=o.get(a);if(!l){o.set(a,[c]);return}l[l.length-1]!==c&&l.push(c)};for(let a=0;a<e.length;a+=1){let c=e[a]??"";for(let u of c.matchAll(t))u[1]&&s(u[1],a);for(let u of c.matchAll(n))u[1]&&s(u[1],a);let l=c.match(r);l?.[1]&&s(l[1],a);for(let u of c.matchAll(i))u[1]&&s(u[1],a)}return o}function Kp(e,t,n,r){let i=Math.max(n,Math.min(e.length-1,r)),o=Math.max(n,Math.min(i,t.endLine)),s=0,a=0,c=!1;for(let l=n;l<=i;l+=1){let u=Qp(e[l]??"");for(let m of u)m==="{"?(s+=1,c=!0):m==="}"?s=Math.max(0,s-1):m==="("?a+=1:m===")"&&(a=Math.max(0,a-1));if(c&&s===0||!c&&a===0&&l>=o)return l}return o}function Qp(e){let t="",n=null,r=!1;for(let i=0;i<e.length;i+=1){let o=e[i],s=e[i+1];if(!n&&o==="/"&&s==="/"){t+=" ".repeat(e.length-i);break}if(n){if(r){r=!1,t+=" ";continue}if(o==="\\"){r=!0,t+=" ";continue}o===n&&(n=null),t+=" ";continue}if(o==='"'||o==="'"||o==="`"){n=o,t+=" ";continue}t+=o}return t}function Nr(e){return e.includes("().")}function _r(e){let t=ne(e);if("kind"in t)return[];let n=[];for(let r=t.descriptors.length-2;r>=0;r-=1){let i=t.descriptors[r];i?.suffix==="type"&&i.name&&n.push(i.name)}return n}import{existsSync as mf}from"fs";import{basename as Ja,isAbsolute as df,join as pf}from"path";function A(e,t){let n=cn(e,t.trim());if(n)return n;let r=nf(e,t);if(r)return r;let i=Yp(e,t);return i||tf(e,t)}function Yp(e,t){let n=Xi(t),r=Yi(n);if(!r)return null;let i=`%${r.path}%`,o=r.leaf,a=Xp(e,i,o,n)[0];return a?Dt(e,a):null}function Xp(e,t,n,r){let i=sn([],[...Zp(e,t,n),...ef(e,t,n)]).filter(o=>!e.isIgnored(o.relative_path)).filter(o=>an(o,r)>1);return i.sort((o,s)=>an(s,r)-an(o,r)||o.end_line-o.start_line-(s.end_line-s.start_line)||o.start_line-s.start_line||o.symbol.localeCompare(s.symbol)),i}function Zp(e,t,n){return rn(e,{where:"d.relative_path LIKE ? AND (gs.display_name = ? OR gs.symbol LIKE ?)",params:[t,n,`%/${n}.%`]})}function ef(e,t,n){return on(e,{where:"d.relative_path LIKE ? AND (gs.display_name = ? OR gs.symbol LIKE ?)",params:[t,n,`%/${n}.%`]})}function tf(e,t){let n=Xi(t),r=lf(t),i=af(e,r),o=uf(i,t,n);if(o&&!e.isIgnored(o.relative_path))return Dt(e,o);let s=null;for(let a of i){if(e.isIgnored(a.relative_path))continue;let c=cf(a,t,n,r);c<=0||(!s||c>s.score)&&(s={row:a,score:c})}return s?Dt(e,s.row):null}function nf(e,t){let n=t.match(/^(.+):(\d+)-(\d+)$/);if(!n)return null;let[,r,i,o]=n,s=Math.max(0,parseInt(i,10)-1),a=Math.max(s,parseInt(o,10)-1),c=rf(e,r,s,a)??of(e,r,s,a);return c&&!e.isIgnored(c.relative_path)?Dt(e,c):null}function rf(e,t,n,r){return rn(e,{where:"d.relative_path LIKE ? AND der.start_line <= ? AND der.end_line >= ?",params:[`%${t}%`,n,r],orderBy:"(der.end_line - der.start_line) ASC",limit:1})[0]}function of(e,t,n,r){return on(e,{where:"d.relative_path LIKE ? AND c.start_line <= ? AND c.end_line >= ?",params:[`%${t}%`,n,r],orderBy:"(MAX(c.end_line) - MIN(c.start_line)) ASC",limit:1})[0]}function cn(e,t){let r=rn(e,{where:"gs.symbol = ?",params:[t],orderBy:"d.relative_path, der.start_line",limit:1})[0]??on(e,{where:"gs.symbol = ?",params:[t],orderBy:"d.relative_path, start_line",limit:1})[0];return!r||e.isIgnored(r.relative_path)?null:Dt(e,r)}function Lr(e,t){if("symbol"in t&&"relativePath"in t)return t;let n=sf(e,t.symbolId)[0];return n?Dt(e,n):null}function sf(e,t){let n=rn(e,{where:"gs.id = ?",params:[t],orderBy:"der.start_line, der.end_line"}),r=on(e,{where:"gs.id = ?",params:[t],orderBy:"start_line, end_line"});return sn(n,r)}function af(e,t){let n=t.map(()=>"(gs.symbol LIKE ? OR d.relative_path LIKE ? OR COALESCE(gs.display_name, '') LIKE ?)"),r=t.flatMap(a=>{let c=`%${a}%`;return[c,c,c]}),i=n.join(`
|
|
91
|
+
AND `),o=rn(e,{where:i,params:r,limit:200}),s=on(e,{where:i,params:r,limit:200});return sn(o,s)}function cf(e,t,n,r){let i=t.trim(),o=n,s=o.replace(/\(\)$/,""),a=t.toLowerCase(),c=n.toLowerCase(),l=c.replace(/\(\)$/,""),u=e.symbol,m=b(e.symbol),d=T(e.symbol),p=e.display_name??"",h=e.symbol.toLowerCase(),f=m.toLowerCase(),y=d.toLowerCase(),R=p.toLowerCase(),E=e.relative_path.toLowerCase(),S=/[/:.]/.test(n),x=Yi(n),D=x?.leaf.toLowerCase(),w=0;return(u===i||u===o)&&(w+=1150),(m===i||m===o)&&(w+=1100),p===s&&(w+=1180),d===s&&(w+=1160),(`${d}()`===i||`${d}()`===o)&&(w+=955),(h===a||h===c)&&(w+=1e3),(f===a||f===c)&&(w+=950),(E===a||E===c)&&(w+=925),(E.endsWith(`/${c}`)||E.endsWith(`/${a}`))&&(w+=875),R===l&&(w+=850),y===l&&(w+=825),(`${y}()`===a||`${y}()`===c)&&(w+=820),(f.endsWith(`:${c}`)||f.endsWith(`:${l}`)||f.endsWith(`:${l}()`))&&(w+=800),h.includes(c)&&(w+=120),f.includes(c)&&(w+=140),E.includes(c)&&(w+=140),R.includes(c)&&(w+=110),r.every($=>{let F=$.toLowerCase();return h.includes(F)||f.includes(F)||E.includes(F)||R.includes(F)})&&(w+=100+r.length*15),x&&E.includes(x.path.toLowerCase())&&(w+=360,D&&(y===D||`${y}()`===D||`${y}()`==`${D}()`)&&(w+=700),ae(e.symbol)&&(w+=180)),Y(e.symbol)&&y===l&&(w+=60),!S&&ct(e.symbol)&&(w-=160),w-=Math.min(50,Math.max(0,e.end_line-e.start_line)),w}function Yi(e){let t=e.trim().replace(/\\/g,"/"),n=t.lastIndexOf("/");if(n<=0||n===t.length-1)return null;let r=t.slice(n+1).replace(/\(\)$/,"");return!r||r.includes(".")?null:{path:t.slice(0,n),leaf:r}}function Xi(e){return e.trim().replace(/\(\)$/,"").replace(/\(.*$/,"")}function lf(e){let t=Xi(e),n=t.split(/[^A-Za-z0-9_]+/).map(r=>r.trim()).filter(r=>r.length>0);return n.length>0?[...new Set(n)]:[t]}function uf(e,t,n){let r=t.trim(),i=e.filter(o=>{let s=b(o.symbol),a=(o.display_name??"").trim();return o.symbol===r||s===r||s===n||a===r||a===n||`${a}()`===r||an(o,n)>1||o.relative_path===r});return i.length===0?null:(i.sort((o,s)=>an(s,n)-an(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)),i[0]??null)}function an(e,t){let n=Yi(t);if(!n)return 0;let r=e.relative_path.toLowerCase(),i=T(e.symbol).toLowerCase(),o=n.path.toLowerCase(),s=n.leaf.toLowerCase();return r.includes(o)?i!==s?1:ae(e.symbol)?Be(e.symbol)===null?5:4:Be(e.symbol)===null?3:2:0}function pe(e,t){let n=za(e,t,{allowMultiple:!1})[0]?.relativePath;return n||ff(e,t)}function ln(e,t){return za(e,t,{allowMultiple:!0}).map(n=>n.relativePath)}function ff(e,t){if(!t)return null;let n=t.replace(/\\/g,"/").replace(/^\.\//,""),r=df(n)&&n.startsWith(e.config.projectRoot)?n.slice(e.config.projectRoot.length).replace(/^\/+/,""):n,i=pf(e.config.projectRoot,r);return mf(i)?r:null}function za(e,t,n){let r=Ka(t);if(!r)return[];let i=M(e,{includeIgnored:!1}).map(a=>({relativePath:a,score:gf(a,r)})).filter(a=>a.score>0).sort((a,c)=>c.score-a.score||a.relativePath.localeCompare(c.relativePath));if(i.length===0){let a=A(e,t);return!a||e.isIgnored(a.relativePath)?[]:[{relativePath:a.relativePath,score:700}]}let o=i.filter(a=>a.score>=1100);if(o.length>0)return n.allowMultiple?o:[o[0]];let s=i.filter(a=>a.score>=800);return s.length>0?n.allowMultiple?s:[s[0]]:n.allowMultiple?i:[i[0]]}function gf(e,t){let n=Ka(e),r=Ja(n),i=Ja(t),o=0;return n===t&&(o+=1200),n.endsWith(`/${t}`)&&(o+=1100),r===i&&(o+=900),n.startsWith(`${t}/`)&&(o+=850),n.includes(t)&&(o+=250),o}function Ka(e){return e.trim().replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,"").replace(/\/+$/,"")}import{basename as vy}from"path";import{existsSync as wr}from"fs";import{basename as hf,dirname as lt,extname as Ke,join as ke,relative as Pn,resolve as Re}from"path";var yf=te("indexed-paths",{clearGroups:[]}),Nt=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs",".vue"],Er=[".py",".pyi"],ye=[".java",".scala",".kt",".kts"],kr=[".rs"],Pr=[".rb"],Fr=[".c",".h",".cc",".cpp",".cxx",".hpp",".hh",".hxx"],ut=[".cs",".vb"],Tr=[".dart"],_t=[".php"],bf=new Set(Nt),Zi=new Set(Er),Qa=new Set(ye),eo=new Set(kr),to=new Set(Pr),Ya=new Set(Fr),Xa=new Set(ut),no=new Set(Tr),Za=new Set(_t),Sf=[{extensions:Nt,lookup:bf},{extensions:Er,lookup:Zi},{extensions:ye,lookup:Qa},{extensions:kr,lookup:eo},{extensions:Pr,lookup:to},{extensions:Fr,lookup:Ya},{extensions:ut,lookup:Xa},{extensions:Tr,lookup:no},{extensions:_t,lookup:Za}];function mt(e,t){return t.has(Ke(e).toLowerCase())}function xf(e){return mt(e,Zi)}function Cf(e){return mt(e,Qa)}function Rf(e){return mt(e,eo)}function If(e){return mt(e,to)}function vf(e){return mt(e,Ya)}function Df(e){return mt(e,Xa)}function ec(e){return Ke(e).toLowerCase()===".vb"}function Nf(e){return mt(e,no)}function _f(e){return mt(e,Za)}function ro(e){let t=Ke(e).toLowerCase();for(let n of Sf)if(n.lookup.has(t))return n.extensions;return Nt}function Lf(e){return Cf(e)||Df(e)||_f(e)}function Fe(e,t,n){return xf(t)?un(e,t,n):Rf(t)?Qe(e,t,n):If(t)?Ar(e,t,n):vf(t)?Mr(e,t,n):Lf(t)?J(e,n.replace(/\\/g,"."),ro(t)):Nf(t)?Or(e,t,n):wf(e,t,n)}function wf(e,t,n){if(!n.startsWith(".")&&!n.startsWith("/"))return null;let r=lt(ke(e.config.projectRoot,t)),i=Re(r,n),o=Fn(e);for(let s of Tf(i)){let a=Pe(Pn(e.config.projectRoot,s));if(o.has(a)||wr(s))return a}return Pe(Pn(e.config.projectRoot,i))}function un(e,t,n){let r=Fn(e),i;if(n.startsWith(".")){let o=n.match(/^(\.+)(.*)$/);if(!o)return null;let s=o[1].length,a=o[2].replace(/^\./,""),c=lt(ke(e.config.projectRoot,t));for(let l=1;l<s;l++)c=lt(c);i=a?Re(c,a.replace(/\./g,"/")):c}else i=Re(e.config.projectRoot,n.replace(/\./g,"/"));for(let o of Ef(i)){let s=Pe(Pn(e.config.projectRoot,o));if(r.has(s)||wr(o))return s}return null}function Qe(e,t,n){if(!n)return null;let r=n.replace(/\s+as\s+.+$/,"").trim();if(!r.startsWith("crate::")&&!r.startsWith("self::")&&!r.startsWith("super::"))return null;let i=lt(ke(e.config.projectRoot,t)),o;return r.startsWith("crate::")?o=Re(e.config.projectRoot,"src",r.slice(7).replace(/::/g,"/")):r.startsWith("self::")?o=Re(i,r.slice(6).replace(/::/g,"/")):o=Re(lt(i),r.slice(7).replace(/::/g,"/")),io(e,kf(o))}function Ar(e,t,n){let r=lt(ke(e.config.projectRoot,t)),i=Re(r,n);return io(e,Pf(i))}function Mr(e,t,n){let r=lt(ke(e.config.projectRoot,t)),i=[Re(r,n),Re(e.config.projectRoot,n),Re(e.config.projectRoot,"include",n),Re(e.config.projectRoot,"src",n)];return io(e,i)}function J(e,t,n){let r=Fn(e),i=t.replace(/\\/g,".").replace(/::/g,".").replace(/^global::/,""),o=i.replace(/\./g,"/"),s=i.split(".").pop()??i;for(let c of n){let l=`${o}${c}`,u=[...r].find(m=>m.endsWith(l));if(u)return u}for(let c of n){let l=[...r].find(u=>hf(u)===`${s}${c}`);if(l)return l}let a=[...r].filter(c=>n.includes(Ke(c).toLowerCase())).filter(c=>c.includes(`/${o}/`)||c.includes(`/${s}/`)).sort((c,l)=>c.localeCompare(l));return a.length===1?a[0]:null}function Or(e,t,n){let r=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=Pe(c.startsWith("lib/")?c:`lib/${c}`);return r.has(l)?l:null}let i=lt(ke(e.config.projectRoot,t)),o=Re(i,n);for(let s of Ff(o)){let a=Pe(Pn(e.config.projectRoot,s));if(r.has(a)||wr(s))return a}return null}function Ef(e){let t=Ke(e);return Zi.has(t)?[e]:[`${e}.py`,`${e}.pyi`,ke(e,"__init__.py"),ke(e,"__init__.pyi")]}function io(e,t){let n=Fn(e);for(let r of t){let i=Pe(Pn(e.config.projectRoot,r));if(n.has(i)||wr(r))return i}return null}function kf(e){let t=Ke(e);return eo.has(t)?[e]:[`${e}.rs`,ke(e,"mod.rs")]}function Pf(e){let t=Ke(e);return to.has(t)?[e]:[`${e}.rb`,ke(e,"index.rb")]}function Ff(e){let t=Ke(e);return no.has(t)?[e]:[`${e}.dart`,e]}function Tf(e){let t=Ke(e),n=new Set;if(t){n.add(e);for(let r of Nt)n.add(e.slice(0,-t.length)+r)}else for(let r of Nt)n.add(`${e}${r}`),n.add(ke(e,`index${r}`));return[...n]}function Fn(e){return yf.get(e,()=>new Set(M(e,{includeIgnored:!1}).map(Pe)))}function Pe(e){return e.replace(/\\/g,"/")}import{basename as nc}from"path";function Lt(e){return e.replace(/'''[\s\S]*?'''/g,dt).replace(/"""[\s\S]*?"""/g,dt).replace(/#.*$/gm,dt).replace(/\/\/.*$/gm,dt).replace(/\/\*[\s\S]*?\*\//g,dt).replace(/`(?:\\[\s\S]|[^`])*`/g,dt).replace(/'(?:\\.|[^'\\\r\n])*'/g,dt).replace(/"(?:\\.|[^"\\\r\n])*"/g,dt)}function dt(e){return e.replace(/[^\r\n]/g," ")}var zw=Zt("stripped-lines",{clearGroups:["whole-project","source-file"]});at({name:"stripped-source-singleton",groups:["whole-project","source-file"],clearAll:()=>{$r=null,Tn=""},clearFile:()=>{$r=null,Tn=""}});var $r=null,Tn="";function Af(e){return $r===e||($r=e,Tn=Lt(e)),Tn}function pt(e,t,n){let r=Af(e);return`${r.slice(0,t)}${" ".repeat(n-t)}${r.slice(n)}`}function fe(e,t){return new RegExp(`\\b${tc(t)}\\b`,"m").test(e)}function mn(e,t){let n=new Set,r=new RegExp(`\\b${tc(t)}\\s*\\.\\s*([A-Za-z_$][\\w$]*)`,"g");for(let i of e.matchAll(r)){let o=i[1];o&&n.add(o)}return[...n]}function tc(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function An(e){let t=0;for(let n of e)n==="("&&(t+=1),n===")"&&(t-=1);return t}var Mf=new Set(["identifier","type_identifier","property_identifier","shorthand_property_identifier","field_identifier"]);function ge(e){let t=[],n=0,r=0;for(let i=0;i<e.length;i++){let o=e[i];(o==="{"||o==="["||o==="(")&&n++,(o==="}"||o==="]"||o===")")&&n--,o===","&&n===0&&(t.push(e.slice(r,i)),r=i+1)}return t.push(e.slice(r)),t}function be(e,t){for(let n of e.namedChildren)if(n.type===t)return n;return null}function z(e,t){let n=new Set,r=(i,o)=>{let s=o||t.has(i.type);!s&&Mf.has(i.type)&&n.add(i.text);for(let a of i.children)r(a,s)};return r(e.rootNode,!1),n}function qe(e,t,n,r,i,o,s){return{importedName:i,localName:o,sourcePath:s??J(e,r,ro(t)),kind:"named",used:fe(n,o),usedMembers:[]}}function U(e,t,n,r,i="named",o={}){return{importedName:e,localName:t,sourcePath:n,kind:i,used:r.has(t),usedMembers:[],isTypeOnly:o.isTypeOnly}}function dn(e,t,n,r,i="named",o=[],s={}){return{importedName:e,localName:t,sourcePath:n,kind:i,used:r,usedMembers:o,isTypeOnly:s.isTypeOnly}}function wt(e,t){return{importedName:e,localName:null,sourcePath:t,kind:"side-effect",used:!0,usedMembers:[]}}function Et(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 Ie(e,t,n){let r=[];for(let i of e.matchAll(t)){let o=i[0];if(!o||typeof i.index!="number")continue;let s=pt(e,i.index,i.index+o.length);for(let a of n(i,s))r.push(a)}return r}function ve(e,t,n,r){let i=ue(e,t);if(i){let o=n(i);if(o)return o}return r()}function jr(e,t,n,r){let i=ue(e,t),o=B(t),s=o?n[o]:void 0;return i&&s?s(i):r()}function rc(e,t,n){return ve(e,t,r=>$f(e,t,r),()=>Of(e,t,n))}function Of(e,t,n){return Ie(n,/^[ \t]*#include\s+[<"]([^">]+)[">]\s*$/gm,(r,i)=>{let o=r[1]?.trim();if(!o)return[];let s=nc(o).replace(/\.[^.]+$/,"");return[dn(o,s,Mr(e,t,o),fe(i,s))]})}function $f(e,t,n){let r=z(n,new Set(["preproc_include"])),i=[];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=nc(s).replace(/\.[^.]+$/,"");i.push(U(s,a,Mr(e,t,s),r))}return i}function ic(e,t,n){let r=[];for(let i of n.matchAll(/^[ \t]*import\s+['"]([^'"]+)['"](?:\s+as\s+([A-Za-z_]\w*))?[\s\S]*?;$/gm)){let o=i[1]?.trim(),s=i[2]?.trim()??null,a=i[0];if(!o||!a||typeof i.index!="number")continue;let c=pt(n,i.index,i.index+a.length);r.push({importedName:o,localName:s,sourcePath:Or(e,t,o),kind:s?"namespace":"side-effect",used:s?fe(c,s):!0,usedMembers:s?mn(c,s):[]})}return r}function oc(e,t,n){let r=[];for(let i of n.matchAll(/^[ \t]*export\s+['"]([^'"]+)['"][\s\S]*?;$/gm)){let o=i[1]?.trim();o&&r.push({specifier:o,sourcePath:Or(e,t,o)})}return r}function sc(e,t,n){return jr(e,t,{csharp:r=>Bf(e,t,r),vb:r=>jf(e,t,r)},()=>{let r=ec(t)?/^[ \t]*Imports\s+(.+?)\s*$/gm:/^[ \t]*using\s+(.+?)\s*;$/gm;return Ie(n,r,(i,o)=>{let s=i[1]?.trim();if(!s)return[];let[a,c]=s.split(/\s*=\s*/),l=!!c,u=(l?c:a)?.trim()??s,m=u.split(".").pop()??u,d=l?a?.trim()??m:m;return[qe(e,t,o,u,m,d,J(e,u,ut))]})})}function jf(e,t,n){let r=z(n,new Set(["imports_statement"])),i=[];for(let o of n.rootNode.descendantsOfType("imports_statement")){let s=o.namedChildren.filter(d=>d.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,m=c?.text??u;i.push(U(u,m,J(e,l,ut),r,c?"namespace":"named"))}return i}function Bf(e,t,n){let r=z(n,new Set(["using_directive"])),i=[];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,m=a?.text??u;i.push(U(u,m,J(e,l,ut),r,a?"namespace":"named"))}return i}var Hf=H("vue-non-script-identifiers",{clearGroups:["whole-project","source-file"]});function ac(e,t){return Hf.get(e,t,()=>{let n=new Set,r=P(e,t);if(!r)return n;let o=r.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 oo(e,t,n){return ve(e,t,r=>Vf(e,t,r),()=>qf(e,t,n))}function qf(e,t,n){return eg(n).flatMap(r=>tg(e,t,r.clause,r.specifier,r.start,r.end,n))}function Vf(e,t,n){let r=Wf(e,t,n),i=[];for(let o of n.rootNode.descendantsOfType("import_statement"))i.push(...Uf(e,t,n,o,r));return i}function Wf(e,t,n){let r=z(n,new Set(["import_statement"]));if(xt(t))for(let i of ac(e,t))r.add(i);return r}function Uf(e,t,n,r,i){let o=Qf(r);if(!o)return[];let s=Fe(e,t,o),a=be(r,"import_clause");return a?Gf(n,a,s,i,Yf(r.text)):[wt("*",s)]}function Gf(e,t,n,r,i){let o=[];for(let s of t.namedChildren)if(s.type==="identifier")o.push(Jf(s.text,n,r,i));else if(s.type==="namespace_import"){let a=zf(e,s,n,r,i);a&&o.push(a)}else s.type==="named_imports"&&o.push(...Kf(s,n,r,i));return o}function Jf(e,t,n,r){return U("default",e,t,n,"default",{isTypeOnly:r})}function zf(e,t,n,r,i){let s=be(t,"identifier")?.text??"";if(!s)return null;let a=Zf(e,s);return Et("*",n,{localName:s,usedMembers:a,isTypeOnly:i,used:a.length>0||r.has(s)})}function Kf(e,t,n,r){let i=[];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;i.push(U(c,l,t,n,"named",{isTypeOnly:r||Xf(o.text)}))}return i}function Qf(e){let t=be(e,"string");if(!t)return null;let n=be(t,"string_fragment");return n?n.text:null}function Yf(e){return/^\s*import\s+type\b/.test(e)}function Xf(e){return/^\s*type\b/.test(e.trim())}function Zf(e,t){let n=new Set;for(let r of e.rootNode.descendantsOfType("member_expression")){let i=r.namedChild(0),o=r.namedChild(1);!i||!o||i.type!=="identifier"||i.text!==t||(o.type==="property_identifier"||o.type==="identifier")&&n.add(o.text)}return[...n]}function eg(e){let t=[],n=/^[ \t]*import\s+([\s\S]*?)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let i of e.matchAll(n)){let o=i[0],s=i[1],a=i[2];!o||!a||typeof i.index!="number"||t.push({clause:s,specifier:a,start:i.index,end:i.index+o.length})}let r=/^[ \t]*import\s+['"]([^'"]+)['"]\s*;?/gm;for(let i of e.matchAll(r)){let o=i[0],s=i[1];!o||!s||typeof i.index!="number"||t.push({clause:null,specifier:s,start:i.index,end:i.index+o.length})}return t.sort((i,o)=>i.start-o.start)}function tg(e,t,n,r,i,o,s){let a=Fe(e,t,r),c=pt(s,i,o);return n?ng(n).map(u=>({...u,sourcePath:a})).map(u=>{if(u.kind==="namespace"){let m=mn(c,u.localName);return Et(u.importedName,u.sourcePath,{localName:u.localName,usedMembers:m,used:m.length>0||fe(c,u.localName),isTypeOnly:u.isTypeOnly})}return u.kind==="side-effect"?wt(u.importedName,u.sourcePath):dn(u.importedName,u.localName??"",u.sourcePath,u.localName?fe(c,u.localName):!1,u.kind,[],{isTypeOnly:u.isTypeOnly})}):[wt("*",a)]}function ng(e){let t=e.trim(),n=/^type\b/.test(t),r=t.replace(/^type\s+/,""),[i,o]=rg(r),s=[];return i&&s.push(...cc(i,n)),o&&s.push(...cc(o,n)),s}function cc(e,t){let n=e.trim();if(!n)return[];if(n.startsWith("{")){let r=n.slice(1,-1).trim();return r?ge(r).map(i=>{let o=i.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 rg(e){let t=0;for(let n=0;n<e.length;n++){let r=e[n];if(r==="{"&&t++,r==="}"&&t--,r===","&&t===0)return[e.slice(0,n).trim(),e.slice(n+1).trim()]}return[e.trim(),null]}function so(e,t,n){let r=ue(e,t);return r?lg(e,t,r):ig(e,t,n)}function ig(e,t,n){return[...og(e,t,n),...sg(e,t,n),...ag(e,t,n)]}function og(e,t,n){let r=[],i=/^[ \t]*export\s+(?:type\s+)?\{([\s\S]*?)\}\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[1]??"",a=o[2]??"",c=ge(s).map(m=>cg(m.trim())).filter(m=>!!m),l=pn(n,o.index),u=pn(n,o.index+o[0].length-1);r.push({kind:"named",sourcePath:Fe(e,t,a),names:c,startLine:l,endLine:u})}return r}function sg(e,t,n){let r=[],i=/^[ \t]*export\s+\*\s+as\s+(\w+)\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[2]??"",a=pn(n,o.index),c=pn(n,o.index+o[0].length-1);r.push({kind:"star-as",sourcePath:Fe(e,t,s),names:[],startLine:a,endLine:c})}return r}function ag(e,t,n){let r=[],i=/^[ \t]*export\s+\*\s+from\s+['"]([^'"]+)['"]\s*;?/gm;for(let o of n.matchAll(i)){if(typeof o.index!="number")continue;let s=o[1]??"",a=pn(n,o.index),c=pn(n,o.index+o[0].length-1);r.push({kind:"star",sourcePath:Fe(e,t,s),names:[],startLine:a,endLine:c})}return r}function cg(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 r=t.match(/^(\w+)$/);return r?r[1]??null:null}function pn(e,t){let n=0;for(let r=0;r<t&&r<e.length;r++)e.charCodeAt(r)===10&&n++;return n}function lg(e,t,n){let r=[];for(let i of n.rootNode.descendantsOfType("export_statement")){let o=ug(e,t,i);if(o===void 0)continue;let s=i.startPosition.row,a=i.endPosition.row,c=mg(i,o,s,a);r.push(c)}return r}function ug(e,t,n){let r=be(n,"string");if(!r)return;let i=be(r,"string_fragment");if(i)return Fe(e,t,i.text)}function mg(e,t,n,r){let i=be(e,"export_clause");if(i){let s=[];for(let a of i.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:r}}return be(e,"namespace_export")?{kind:"star-as",sourcePath:t,names:[],startLine:n,endLine:r}:{kind:"star",sourcePath:t,names:[],startLine:n,endLine:r}}function lc(e,t,n){return jr(e,t,{java:r=>dg(e,t,r),kotlin:r=>pg(e,t,r),scala:r=>fg(e,t,r)},()=>Ie(n,/^[ \t]*import\s+(?:static\s+)?(.+?)\s*;?$/gm,(r,i)=>{let o=r[1]?.trim();return o?gg(e,t,o,i):[]}))}function dg(e,t,n){let r=z(n,new Set(["import_declaration"])),i=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.children.some(m=>m.type==="asterisk"),c=o.namedChildren.find(m=>m.type==="scoped_identifier")??o.namedChildren.find(m=>m.type==="identifier");if(!c)continue;let l=c.text;if(s){i.push(Et("*",J(e,l,ye)));continue}let u=l.split(".").pop()??l;i.push(U(u,u,J(e,l,ye),r))}return i}function pg(e,t,n){let r=z(n,new Set(["import_header","import_list"])),i=[];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){i.push(Et("*",J(e,s.text,ye)));continue}let l=s.text,u=l.split(".").pop()??l,d=c?.namedChild(0)?.text??u;i.push(U(u,d,J(e,l,ye),r))}return i}function fg(e,t,n){let r=z(n,new Set(["import_declaration"])),i=[];for(let o of n.rootNode.descendantsOfType("import_declaration")){let s=o.namedChildren.find(m=>m.type==="namespace_selectors"||m.type==="namespace_wildcard"),a=o.namedChildren.filter(m=>m!==s&&(m.type==="identifier"||m.type==="stable_identifier")),c=a.map(m=>m.text).join(".");if(!c)continue;if(s?.type==="namespace_wildcard"){i.push(Et("*",J(e,c,ye)));continue}if(s?.type==="namespace_selectors"){for(let m of s.namedChildren)if(m.type==="arrow_renamed_identifier"){let[d,p]=m.namedChildren;if(!d)continue;let h=d.text,f=p?.text??h;if(h==="_")continue;i.push(U(h,f,J(e,`${c}.${h}`,ye),r))}else if(m.type==="identifier"){let d=m.text;i.push(U(d,d,J(e,`${c}.${d}`,ye),r))}continue}let l=a[a.length-1]?.text??c,u=a.slice(0,-1).map(m=>m.text).join(".")||c;i.push(U(l,l,J(e,u&&a.length>1?`${u}.${l}`:c,ye),r))}return i}function gg(e,t,n,r){if(n.includes("{")&&n.includes("}")){let i=n.slice(0,n.indexOf("{")).replace(/\.$/,"").trim(),o=n.slice(n.indexOf("{")+1,n.lastIndexOf("}")).trim();return ge(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 m=(l??u.split(".").pop()??u).trim(),d=u==="_"?i:`${i}.${u}`.replace(/\.\./g,".");return[qe(e,t,r,d,u,m)]})}return[qe(e,t,r,n,n.split(".").pop()??n,n.split(".").pop()??n)]}function mc(e,t,n){return ve(e,t,r=>hg(e,t,r),()=>Ie(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(r,i)=>{let o=r[1]?.trim();return o?ge(o).flatMap(s=>{let a=s.trim();if(!a)return[];let[c,l]=a.split(/\s+as\s+/i),u=c?.trim()??a,m=u.split("\\").pop()??u,d=(l??m).trim();return[qe(e,t,i,u,m,d,J(e,u.replace(/\\/g,"."),_t))]}):[]}))}function hg(e,t,n){let r=z(n,new Set(["namespace_use_declaration"])),i=[],o=(s,a,c)=>{i.push(U(a,c,J(e,s.replace(/\\/g,"."),_t),r))};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:m,qualified:d}=uc(l,c);u&&o(d,u,m)}continue}for(let c of s.namedChildren){if(c.type!=="namespace_use_clause")continue;let{importedName:l,localName:u,qualified:m}=uc(c,"");l&&o(m,l,u)}}return i}function uc(e,t){let n=e.namedChildren.find(l=>l.type==="qualified_name"),r=e.namedChildren.filter(l=>l.type==="name"),i="";n?i=n.text:r.length>=1&&(i=r[0].text);let o=n&&r.length>0?r[r.length-1]:null,s=i.split("\\").pop()??i,a=o?.text??s,c=t?`${t}\\${i}`:i;return{importedName:s,localName:a,qualified:c}}function pc(e,t,n){return ve(e,t,r=>yg(e,t,r),()=>Sg(n).flatMap(r=>Cg(e,t,r,n)))}function yg(e,t,n){let r=z(n,new Set(["import_statement","import_from_statement"])),i=[];for(let o of n.rootNode.descendantsOfType("import_statement"))for(let s of o.namedChildren){let a=dc(s);if(!a)continue;let c=un(e,t,a.qualifiedName);i.push({importedName:a.qualifiedName,localName:a.localName,sourcePath:c,kind:"namespace",used:r.has(a.localName),usedMembers:[]})}for(let o of n.rootNode.descendantsOfType("import_from_statement")){let s=o.namedChild(0);if(!s)continue;let a=bg(s);if(a===null)continue;let c=un(e,t,a);for(let l=1;l<o.namedChildCount;l+=1){let u=o.namedChild(l);if(u.type==="wildcard_import"){i.push({importedName:"*",localName:null,sourcePath:c,kind:"side-effect",used:!0,usedMembers:[]});continue}let m=dc(u);m&&i.push({importedName:m.qualifiedName,localName:m.localName,sourcePath:c,kind:"named",used:r.has(m.localName),usedMembers:[]})}}return i}function dc(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 bg(e){if(e.type==="dotted_name")return e.text;if(e.type==="relative_import"){let t=be(e,"import_prefix")?.text??"",n=be(e,"dotted_name")?.text??"";return`${t}${n}`}return null}function Sg(e){let t=e.split(`
|
|
92
|
+
`),n=[],r=0;for(let i=0;i<t.length;i++){let o=t[i],s=o.trimStart(),a=r;if(r+=o.length+1,!s.startsWith("import ")&&!s.startsWith("from "))continue;let c=o,l=a+o.length,u=An(o);for(;i+1<t.length&&(u>0||c.trimEnd().endsWith("\\"));){i++;let d=t[i];c+=`
|
|
93
|
+
${d}`,l+=1+d.length,u+=An(d),r+=d.length+1}let m=xg(c);m&&n.push({...m,start:a,end:l})}return n}function xg(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 r=n[2].trim();return r.startsWith("(")&&r.endsWith(")")&&(r=r.slice(1,-1).trim()),{kind:"from",module:n[1],clause:r}}function Cg(e,t,n,r){let i=pt(r,n.start,n.end),o=n.clause.replace(/\n/g," ").trim();if(n.kind==="import")return ge(o).flatMap(c=>{let l=c.trim().replace(/,$/,"");if(!l)return[];let[u,m]=l.split(/\s+as\s+/),d=u.trim(),p=(m??d.split(".")[0]??d).trim(),h=un(e,t,d),f=mn(i,p);return[{importedName:d,localName:p,sourcePath:h,kind:"namespace",used:fe(i,p)||f.length>0,usedMembers:f}]});let s=n.module?un(e,t,n.module):null,a=[];for(let c of ge(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,m]=l.split(/\s+as\s+/),d=(m??u).trim();a.push({importedName:u.trim(),localName:d,sourcePath:s,kind:"named",used:fe(i,d),usedMembers:[]})}return a}import{basename as Rg}from"path";function fc(e,t,n){return ve(e,t,r=>vg(e,t,r),()=>Ig(e,t,n))}function Ig(e,t,n){return Ie(n,/^[ \t]*(require_relative|require)\s+["']([^"']+)["']\s*$/gm,(r,i)=>{let o=r[1],s=r[2];if(!o||!s)return[];let a=o==="require_relative"?Ar(e,t,s):null;if(a){let c=gc(s);return[dn(c,c,a,fe(i,c))]}return[wt(s,a)]})}function vg(e,t,n){let r=z(n,new Set([])),i=[],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 m=l.namedChildren.find(p=>p.type==="string_content")?.text;if(!m)continue;let d=a.text==="require_relative"?Ar(e,t,m):null;if(d){let p=gc(m);i.push(U(p,p,d,r))}else i.push(wt(m,d))}return i}function gc(e){return Rg(e).replace(/\.[^.]+$/,"").split("_").filter(Boolean).map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join("")}function hc(e,t,n){return ve(e,t,r=>Dg(e,t,r),()=>Ie(n,/^[ \t]*use\s+(.+?)\s*;$/gm,(r,i)=>{let o=r[1]?.trim();return o?Ng(e,t,o,i):[]}))}function Dg(e,t,n){let r=z(n,new Set(["use_declaration"])),i=[];for(let o of n.rootNode.descendantsOfType("use_declaration")){let s=o.namedChild(0);if(s)for(let a of Mn(s,"")){if(!a.importedName||a.importedName==="*")continue;let c=Qe(e,t,a.qualifiedName)??Qe(e,t,a.qualifiedName.split("::").slice(0,-1).join("::"));i.push(U(a.importedName,a.localName,c,r))}}return i}function Mn(e,t){switch(e.type){case"identifier":case"super":case"self":case"crate":{let n=e.text;return[{qualifiedName:Br(t,n),importedName:n,localName:n}]}case"scoped_identifier":{let n=e.text,r=n.split("::").pop()??n;return[{qualifiedName:Br(t,n),importedName:r,localName:r}]}case"scoped_use_list":{let n=e.namedChild(0),r=e.namedChild(1);if(!n||!r)return[];let i=Br(t,n.text),o=[];for(let s of r.namedChildren)o.push(...Mn(s,i));return o}case"use_list":{let n=[];for(let r of e.namedChildren)n.push(...Mn(r,t));return n}case"use_as_clause":{let n=e.namedChild(0),r=e.namedChild(1);if(!n||!r)return[];let i=Mn(n,t),o=r.text;return i.map(s=>({...s,localName:o}))}case"use_wildcard":{let n=e.namedChild(0),r=n?n.text:"";return[{qualifiedName:Br(t,`${r}::*`),importedName:"*",localName:"*"}]}default:return[]}}function Br(e,t){return e?t?`${e}::${t}`:e:t}function Ng(e,t,n,r){let i=n.trim();if(i.includes("{")&&i.includes("}")){let u=i.slice(0,i.indexOf("{")).replace(/::$/,"").trim(),m=i.slice(i.indexOf("{")+1,i.lastIndexOf("}")).trim();return ge(m).flatMap(d=>{let p=d.trim();if(!p||p==="self")return[];let[h,f]=p.split(/\s+as\s+/),y=h?.trim();if(!y)return[];let R=(f??y.split("::").pop()??y).trim(),E=`${u}::${y}`.replace(/::::/g,"::");return[qe(e,t,r,E,y.split("::").pop()??y,R,Qe(e,t,u))]})}let[o,s]=i.split(/\s+as\s+/),a=o?.trim()??i,c=(s??a.split("::").pop()??a).trim(),l=Qe(e,t,a)??Qe(e,t,a.split("::").slice(0,-1).join("::"));return[qe(e,t,r,a,a.split("::").pop()??a,c,l)]}function yc(e,t,n){let r=ue(e,t);if(r)return _g(e,t,r);let i=[];for(let o of n.matchAll(/^[ \t]*pub\s+use\s+(.+?)\s*;$/gm)){let s=o[1]?.trim();s&&i.push(...wg(e,t,s))}return i}function _g(e,t,n){let r=[];for(let i of n.rootNode.descendantsOfType("use_declaration")){if(!Lg(i))continue;let o=i.namedChildren.find(s=>s.type!=="visibility_modifier");if(o)for(let s of Mn(o,""))s.importedName&&r.push(ao(e,t,s.qualifiedName))}return r}function Lg(e){for(let t of e.children)if(t.type==="visibility_modifier"&&t.text.startsWith("pub"))return!0;return!1}function wg(e,t,n){let r=n.trim();if(r.includes("{")&&r.includes("}")){let i=r.slice(0,r.indexOf("{")).replace(/::$/,"").trim(),o=r.slice(r.indexOf("{")+1,r.lastIndexOf("}")).trim();return ge(o).flatMap(s=>{let a=s.trim();if(!a||a==="self")return[];let[c]=a.split(/\s+as\s+/),l=`${i}::${c?.trim()??a}`.replace(/::::/g,"::");return[ao(e,t,l)]})}return[ao(e,t,r)]}function ao(e,t,n){return{specifier:n,sourcePath:Qe(e,t,n)??Qe(e,t,n.split("::").slice(0,-1).join("::"))}}function kt({language:e,extensions:t,imports:n,parseImports:r}){return{language:e,extensions:t,capabilities:{imports:n},parseImports:r}}function bc(e,t){let n=t.toLowerCase();for(let r of e)for(let i of r.extensions)if(n.endsWith(i))return r;return null}var Eg={language:"javascript",extensions:Nt,capabilities:{imports:"ast-with-regex-fallback",reExports:"ast-with-regex-fallback"},parseImports:oo,parseReExports:so},kg=kt({language:"python",extensions:Er,imports:"ast-with-regex-fallback",parseImports:pc}),Pg=kt({language:"jvm",extensions:ye,imports:"ast-dispatch-with-regex-fallback",parseImports:lc}),Fg={language:"rust",extensions:kr,capabilities:{imports:"ast-with-regex-fallback",exports:"ast-with-regex-fallback"},parseImports:hc,parseExports:yc},Tg=kt({language:"ruby",extensions:Pr,imports:"ast-with-regex-fallback",parseImports:fc}),Ag=kt({language:"c/cpp",extensions:Fr,imports:"ast-with-regex-fallback",parseImports:rc}),Mg=kt({language:"dotnet",extensions:ut,imports:"ast-dispatch-with-regex-fallback",parseImports:sc}),Og={language:"dart",extensions:Tr,capabilities:{imports:"regex-only",exports:"regex-only"},parseImports:ic,parseExports:oc},$g=kt({language:"php",extensions:_t,imports:"ast-with-regex-fallback",parseImports:mc}),jg=[Eg,kg,Pg,Fg,Tg,Ag,Mg,Og,$g];function Hr(e){return bc(jg,e)}var co={clearGroups:["whole-project","source-file"]},Bg=H("source-imports",co),Hg=H("source-exports",co),qg=H("source-reexports",co);function Sc(e,t){let n=Pe(t);return qg.get(e,n,()=>{let r=Hr(n);if(!r?.parseReExports)return[];let i=P(e,n);return i?r.parseReExports(e,n,i):[]})}function ie(e,t){let n=Pe(t);return Bg.get(e,n,()=>{let r=Hr(n);if(!r)return[];let i=P(e,n);return i?r.parseImports(e,n,i):[]})}function lo(e,t){let n=Pe(t);return Hg.get(e,n,()=>{let r=Hr(n);if(!r?.parseExports)return[];let i=P(e,n);return i?r.parseExports(e,n,i):[]})}var Vg=H("file-dep-graph",{clearGroups:["whole-project"]});function X(e,t){return Vg.get(e,t??"",()=>{let n=new Map,r=new Set(M(e,{includeIgnored:!1})),i=(o,s)=>Ug(e,n,r,o,s);for(let o of Wg(e,t))i(o.from_file,o.to_file);for(let o of r)if(!(t&&!o.includes(t)))for(let s of ie(e,o))s.sourcePath&&i(o,s.sourcePath);return n})}function Wg(e,t){let n=t?`AND d1.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT
|
|
74
94
|
d1.relative_path AS from_file,
|
|
75
95
|
d2.relative_path AS to_file
|
|
76
96
|
FROM mentions m
|
|
@@ -88,11 +108,11 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
88
108
|
WHERE d1.id != d2.id
|
|
89
109
|
AND m.role != 1
|
|
90
110
|
${e.pathExclusionsFor("d1","d2")}
|
|
91
|
-
${n}`)}function
|
|
111
|
+
${n}`)}function Ug(e,t,n,r,i){if(r===i||e.isIgnored(r)||e.isIgnored(i)||!n.has(i))return;let o=t.get(r);o||(o=new Set,t.set(r,o)),o.add(i)}import{readdirSync as Gg}from"fs";import{extname as xc,join as Jg}from"path";var zg=[".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"],Cc=[".vue"],Rc=new Set(zg.map(e=>e.toLowerCase())),Kg=[...Rc].sort().join(","),uo=new Set(["node_modules",".git","target","dist","build",".next",".nuxt",".cache",".turbo","out","coverage",".scipquery-cache","__pycache__",".venv","venv",".idea",".vscode"]);function Ve(e,t={}){let n=t.includeIndexed??!0,r=t.includeAuxiliary??!0,i=t.extensions?.map(c=>c.toLowerCase()),o=i?new Set(i):Rc,s=i?[...o].sort().join(","):Kg,a=`${n?"1":"0"}|${r?"1":"0"}|${s}`;return Qg.get(e,a,()=>{let c=new Set;if(n)for(let l of M(e,{includeIgnored:!1}))o.has(xc(l).toLowerCase())&&c.add(l);if(r)for(let l of Yg(e.config.projectRoot,o))e.isIgnored(l)||c.add(l);return[...c].sort()})}var Qg=H("source-files",{clearGroups:[]});function Yg(e,t){let n=new Set,r=i=>{let o=i?Jg(e,i):e,s;try{s=Gg(o,{withFileTypes:!0})}catch{return}for(let a of s)if(!uo.has(a.name)){if(a.isDirectory()){r(i?`${i}/${a.name}`:a.name);continue}t.has(xc(a.name).toLowerCase())&&n.add(i?`${i}/${a.name}`:a.name)}};return r(""),n}import{readFileSync as Xg}from"fs";import{join as Zg}from"path";var eh={files:new Set,pathPrefixes:[]},mo=/^(?:dist|build|lib|out|output|esm|cjs|umd)\//,th=/\.(?:d\.ts|d\.mts|d\.cts|ts|tsx|mts|cts|js|jsx|mjs|cjs)$/,nh=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"],rh=te("package-surface",{clearGroups:["whole-project"]});function ih(e){return rh.get(e,()=>oh(e.config.projectRoot))}function vc(e,t){let n=ih(e);return n.files.has(t)?!0:n.pathPrefixes.some(r=>t.startsWith(r))}function oh(e){let t=sh(e);if(!t)return eh;let n=new Set,r=[];for(let i of ah(t))ch(i,n,r);return{files:n,pathPrefixes:r}}function sh(e){try{let t=Xg(Zg(e,"package.json"),"utf-8"),n=JSON.parse(t);return n&&typeof n=="object"?n:null}catch{return null}}function ah(e){let t=[];for(let r of["main","module","types","browser"])typeof e[r]=="string"&&t.push(e[r]);let n=e.bin;if(typeof n=="string")t.push(n);else if(n&&typeof n=="object")for(let r of Object.values(n))typeof r=="string"&&t.push(r);return Dc(e.exports,t),t}function Dc(e,t){if(typeof e=="string"){t.push(e);return}if(!(!e||typeof e!="object"))for(let n of Object.values(e))Dc(n,t)}function ch(e,t,n){let r=e.replace(/\\/g,"/").replace(/^\.\//,"");if(r===""||r.startsWith(".."))return;let i=r.indexOf("*");if(i>=0){let s=r.slice(0,i);for(let a of Ic(s))a!==""&&n.push(a);return}let o=r.replace(th,"");for(let s of Ic(o)){s===o&&s===r&&t.add(r);for(let a of nh)t.add(s+a)}t.add(r)}function Ic(e){let t=[e];return mo.test(e)&&(t.push(e.replace(mo,"src/")),t.push(e.replace(mo,""))),t}function G(e){let t=fn(e);return mh(t)?"test":dh(t)?"worker":ph(t)?"entry":fh(t)?"barrel":"source"}function qr(e){return G(e)==="barrel"}function _c(e){return lh.get(e,()=>{let t=X(e),n=Ve(e).filter(o=>{let s=G(o);return s==="entry"||s==="worker"}),r=new Set,i=new Set;for(;n.length>0;){let o=n.shift();if(!r.has(o)){r.add(o),G(o)==="barrel"&&i.add(o);for(let s of t.get(o)??[])r.has(s)||n.push(s)}}return i})}var lh=te("live-barrels",{clearGroups:["whole-project"]});function po(e,t){return _c(e).has(fn(t))}function Lc(e){let t=_c(e);return Ve(e).filter(n=>qr(n)&&!t.has(n)&&!uh(e,n))}function uh(e,t){let n=fn(t),r=Q(e,n)?.callables;return r&&r.length>0?!0:(e.get(`SELECT COUNT(*) AS n
|
|
92
112
|
FROM defn_enclosing_ranges der
|
|
93
113
|
JOIN documents d ON d.id = der.document_id
|
|
94
114
|
WHERE d.relative_path = ?
|
|
95
|
-
AND der.end_line - der.start_line >= 2`,n)?.n??0)>0}function
|
|
115
|
+
AND der.end_line - der.start_line >= 2`,n)?.n??0)>0}function me(e,t){let n=G(t);return n==="entry"||n==="worker"||po(e,t)}function oe(e,t,n){let r=fn(n);if(vc(e,r))return!0;let i=e.config.entryRoots;return i?!!(i.files?.some(o=>fn(o)===r)||i.pathPrefixes?.some(o=>r.startsWith(fn(o)))||i.qualifiedVars?.some(o=>gh(t,o))||i.symbolPatterns?.some(o=>{try{return new RegExp(o).test(t)}catch{return!1}})):!1}function mh(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 dh(e){return/(?:^|\/)[^/]*worker\.(?:ts|tsx|js|mjs|cjs|rs|py|go)$/.test(e)}function ph(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 fh(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 fn(e){return e.replace(/\\/g,"/")}function gh(e,t){let n=t.lastIndexOf("/");if(n<0)return!1;let r=t.slice(0,n),i=t.slice(n+1);return e.includes(Nc(r)+"/")&&e.includes(Nc(i)+".")}function Nc(e){return/^[A-Za-z0-9_$+-]+$/.test(e)?e:"`"+e.replace(/`/g,"``")+"`"}function Vr(e,t,n,r={}){if(!n)return[];let i=P(e,t);return i?i.indexOf(n)===-1?[]:(Ye(e,t).get(n)??[]).filter(s=>!hh(s,r)):[]}function hh(e,t){return typeof t.excludeStartLine=="number"&&typeof t.excludeEndLine=="number"&&e>=t.excludeStartLine&&e<=t.excludeEndLine}var yh=H("file-identifiers",{clearGroups:["whole-project","source-file"]});function wc(e,t){let n=Q(e,t);return n?n.fileIdentifiers:yh.get(e,t,()=>new Set(Ye(e,t).keys()))}var bh=H("file-ident-lines",{clearGroups:["whole-project","source-file"]});function Ye(e,t){let n=Q(e,t);return n?n.identifierLineMap:bh.get(e,t,()=>xh(e,t))}var Sh=H("file-idents-by-line",{clearGroups:["whole-project","source-file"]});function Ec(e,t){let n=Q(e,t);return n?n.identifiersByLine:Sh.get(e,t,()=>{let r=Ye(e,t),i=0;for(let s of r.values()){let a=s[s.length-1];a!==void 0&&a>i&&(i=a)}let o=new Array(i+1);for(let s=0;s<=i;s+=1)o[s]=new Set;for(let[s,a]of r)for(let c of a)o[c].add(s);return o})}function xh(e,t){let n=new Map,r=(a,c)=>{let l=n.get(a);if(!l){n.set(a,[c]);return}l[l.length-1]!==c&&l.push(c)},i=P(e,t);if(!i)return n;let o=Lt(i).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]&&r(l[1],a)}return n}function kc(e,t){return fo(e,t,n=>{let r=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT
|
|
96
116
|
m.symbol_id,
|
|
97
117
|
d.relative_path,
|
|
98
118
|
COUNT(*) AS ref_count
|
|
@@ -102,13 +122,13 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
102
122
|
WHERE m.role != 1
|
|
103
123
|
${r}
|
|
104
124
|
${e.pathExclusionsFor("d")}
|
|
105
|
-
GROUP BY m.symbol_id, d.relative_path`,...n??[])})}function
|
|
125
|
+
GROUP BY m.symbol_id, d.relative_path`,...n??[])})}function Pc(e,t){return fo(e,t,n=>{let r=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT DISTINCT m.symbol_id, d.relative_path
|
|
106
126
|
FROM mentions m
|
|
107
127
|
JOIN chunks c ON m.chunk_id = c.id
|
|
108
128
|
JOIN documents d ON c.document_id = d.id
|
|
109
129
|
WHERE m.role != 1
|
|
110
130
|
${r}
|
|
111
|
-
${e.pathExclusionsFor("d")}`,...n??[])}).filter(n=>n.symbol_id!==null)}function
|
|
131
|
+
${e.pathExclusionsFor("d")}`,...n??[])}).filter(n=>n.symbol_id!==null)}function Wr(e,t){return fo(e,t,n=>{let r=n?`AND m.symbol_id IN (${n.map(()=>"?").join(",")})`:"";return e.all(`SELECT DISTINCT m.symbol_id, d.relative_path, c.document_id,
|
|
112
132
|
c.start_line AS chunk_start, c.end_line AS chunk_end
|
|
113
133
|
FROM mentions m
|
|
114
134
|
JOIN chunks c ON m.chunk_id = c.id
|
|
@@ -116,7 +136,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
116
136
|
WHERE m.role != 1
|
|
117
137
|
${r}
|
|
118
138
|
${e.pathExclusionsFor("d")}
|
|
119
|
-
ORDER BY d.relative_path, c.start_line`,...n??[])})}function
|
|
139
|
+
ORDER BY d.relative_path, c.start_line`,...n??[])})}function fo(e,t,n){if(!t)return n();if(t.length===0)return[];let r=[];for(let i=0;i<t.length;i+=750)r.push(...n(t.slice(i,i+750)));return r}function Fc(e){return e.replace(/\\/g,"/").replace(/^\.\//,"")}function ft(e,t){return Fc(e)===Fc(t)}function Ur(e,t){let n=Tc(e);return n?t.filter(r=>Tc(r.file)===n):t}function Gr(e,t,n,r){let i=n.find(o=>o.file===t);if(i)return i;if(r){let o=new Set(ie(e,t).map(s=>s.sourcePath).filter(s=>!!s));for(let s of n)for(let a of o)if(ft(a,s.file))return s;return null}return n.length===1?n[0]:null}function Tc(e){let t=B(e);return t?t==="typescript"||t==="tsx"||t==="javascript"?"javascript-family":t:null}var Ch=te("global-leaf-index",{clearGroups:["whole-project"]});function Pt(e){return Ch.get(e,()=>{let t=e.all(`SELECT gs.id, gs.symbol,
|
|
120
140
|
COALESCE(der_doc.relative_path, mention_doc.relative_path) AS relative_path
|
|
121
141
|
FROM global_symbols gs
|
|
122
142
|
LEFT JOIN defn_enclosing_ranges der ON der.symbol_id = gs.id
|
|
@@ -130,8 +150,8 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
130
150
|
GROUP BY m.symbol_id
|
|
131
151
|
) mention_doc ON mention_doc.symbol_id = gs.id
|
|
132
152
|
WHERE 1 = 1
|
|
133
|
-
${e.symbolNoiseFor("gs")}`),n=new Map;for(let r of t){if(!r.relative_path||e.isIgnored(r.relative_path))continue;let i=
|
|
134
|
-
`),c=[];for(let l=0;l<a.length;l++){if(l===i)continue;let u=a[l]??"";s.lastIndex=0;let m;for(;(m=s.exec(u))!==null;)c.push({file:t,line:l,column:m.index})}return
|
|
153
|
+
${e.symbolNoiseFor("gs")}`),n=new Map;for(let r of t){if(!r.relative_path||e.isIgnored(r.relative_path))continue;let i=T(r.symbol);if(!i)continue;let o=n.get(i);o||(o=[],n.set(i,o)),o.some(s=>s.symbolId===r.id)||o.push({symbol:r.symbol,symbolId:r.id,file:r.relative_path})}return n})}function Te(e,t,n){if(e.has(t))return e.get(t);let r=n();return e.set(t,r),r}import Ac from"path";function Rh(e,t){return e.getReferences().map(n=>{let r=n.getNode();return $c(r,t)})}function Ih(e){let t=e;return typeof t.findReferences=="function"?t.findReferences():[]}function Mc(e,t,n,r){let i=[];for(let o of Ih(e))for(let s of Rh(o,r))s.file===t.relativePath&&s.line>=t.startLine&&s.line<=t.endLine||i.push(s);for(let o of n)i.push(o);return Jr(i)}function Oc(e,t,n,r){let i=[],o=n?.getStart();for(let s of e.getReferences()){let a=s.getNode();On(r,a.getSourceFile().getFilePath())===t&&(o!==void 0&&a.getStart()===o||i.push({location:$c(a,r),node:a}))}return i}function $c(e,t){let n=e.getSourceFile(),r=n.getLineAndColumnAtPos(e.getStart());return{file:On(t,n.getFilePath())??n.getBaseName(),line:r.line-1,column:r.column-1}}function jc(e,t,n){let r=e.getSourceFile(),i=gn(r,e),o=e.getText(),s=new RegExp(`\\b${vh(o)}\\b`,"g"),a=r.getFullText().split(`
|
|
154
|
+
`),c=[];for(let l=0;l<a.length;l++){if(l===i)continue;let u=a[l]??"";s.lastIndex=0;let m;for(;(m=s.exec(u))!==null;)c.push({file:t,line:l,column:m.index})}return Jr(c.filter(l=>On(n,Ac.join(n,l.file))===t))}function go(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 gn(e,t){return e.getLineAndColumnAtPos(t.getStart()).line-1}function Jr(e){let t=new Set,n=[];for(let r of e){let i=`${r.file}:${r.line}:${r.column}`;t.has(i)||(t.add(i),n.push(r))}return n}function On(e,t){let n=Ac.relative(e||process.cwd(),t).replace(/\\/g,"/");return!n||n.startsWith("..")?null:n}function vh(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bc(e,t,n,r){let i=Dh(t,r);return i.size===0?new Map:Nh(e,n,i)}function Dh(e,t){let n=new Map;for(let r of W(e,t)){let i=T(r.symbol)??r.leaf;if(!i)continue;let o=n.get(i);o||(o=[],n.set(i,o)),o.push(r)}return n}function Nh(e,t,n){let r=new Map,i=new Map;return t.forEachDescendant(o=>{for(let s of _h(e,o)){let a=n.get(s);if(!a)continue;let c=gn(t,o);for(let l of a){if(c<l.startLine-1||c>l.endLine+1)continue;let u=Math.abs(c-l.startLine),m=i.get(l.symbolId);m!==void 0&&m<=u||(i.set(l.symbolId,u),r.set(l.symbolId,o))}}}),r}function _h(e,t){let n=[],r=i=>{i&&!n.includes(i)&&n.push(i)};if("getNameNode"in t&&typeof t.getNameNode=="function"){let i=t.getNameNode();r(i?.getText())}if("getName"in t&&typeof t.getName=="function"){let i=t.getName();r(i)}return e.Node.isIdentifier(t)&&r(t.getText()),n}function Hc(e,t,n,r){return e.all(`SELECT
|
|
135
155
|
gs.id AS symbolId,
|
|
136
156
|
gs.symbol,
|
|
137
157
|
d.relative_path AS relativePath,
|
|
@@ -151,7 +171,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
151
171
|
WHERE d.relative_path = ?
|
|
152
172
|
AND COALESCE(gs.display_name, gs.symbol) LIKE ?
|
|
153
173
|
ORDER BY ABS(COALESCE(der.start_line, c.start_line) - ?)
|
|
154
|
-
LIMIT 5`,t,`%${r}%`,n)[0]??null}function
|
|
174
|
+
LIMIT 5`,t,`%${r}%`,n)[0]??null}function qc(e,t){let n=e.all(`SELECT
|
|
155
175
|
d.id AS documentId,
|
|
156
176
|
gs.id AS symbolId,
|
|
157
177
|
gs.symbol,
|
|
@@ -191,7 +211,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
191
211
|
WHERE d.relative_path = ?
|
|
192
212
|
AND m.role = 1
|
|
193
213
|
GROUP BY gs.id, gs.symbol, d.id, d.relative_path, gs.display_name, gs.kind, gs.documentation, gs.enclosing_symbol
|
|
194
|
-
ORDER BY startLine, endLine`,t,t),r=new Set,i=new Map;for(let o of n){if(r.has(o.symbolId))continue;r.add(o.symbolId);let s=o.leaf||P(o.symbol);!s||i.has(s)||i.set(s,{...o,leaf:s})}return i}import Wg from"path";var En=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function Mr(e){let t=e.toLowerCase();return En.some(n=>t.endsWith(n))}function Rc(e,t){let n=new Map,r=i=>Mr(i)?Ee(n,i,()=>{let o=Wg.join(e.config.projectRoot,i);for(let{project:s}of t){let a=s.getSourceFile(o)??s.addSourceFileAtPathIfExists(o)??null;if(a)return{project:s,sourceFile:a}}return null}):null;return{sourceFile:i=>r(i)?.sourceFile??null,sourceFileMatch:r,indexedTypeScriptLikeDocuments:()=>A(e,{extensions:En})}}import dt from"path";import{existsSync as Or,readdirSync as Ug,readFileSync as Ic}from"fs";function vc(e){let t=dt.join(e,"package.json");if(!Or(t))return[];let n;try{n=JSON.parse(Ic(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(i=>Gg(e,i)).flatMap(i=>Jg(e,i))}function Gg(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=dt.join(e,t);return Or(dt.join(s,"package.json"))?[s]:[]}let n=t.indexOf("*"),r=t.slice(0,n).replace(/\/$/,""),i=t.slice(n+1).replace(/^\//,""),o=dt.join(e,r||".");if(!Or(o))return[];try{return Ug(o).map(s=>dt.join(o,s,i)).filter(s=>Or(dt.join(s,"package.json")))}catch{return[]}}function Jg(e,t){try{let n=JSON.parse(Ic(dt.join(t,"package.json"),"utf8"));if(!n.name)return[];let r=dt.relative(e,t).replace(/\\/g,"/");return[{name:n.name,rootRelative:r,sourceRootRelative:`${r}/src`}]}catch{return[]}}function Dc(e,t){for(let n of e)if(t===n.name||t.startsWith(`${n.name}/`))return n.name;return null}function Nc(e){return[`${e.sourceRootRelative}/index.ts`,`${e.sourceRootRelative}/index.tsx`,`${e.sourceRootRelative}/index.mts`,`${e.sourceRootRelative}/index.cts`]}import{existsSync as kn,readFileSync as zg,readdirSync as Qg,statSync as Kg}from"fs";import Q from"path";var eo=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function to(e,t){let r=t?Q.dirname(Q.join(e,t)):e,i=Q.resolve(e);for(;r.startsWith(i);){for(let s of eo){let a=Q.join(r,s);if(kn(a))return a}let o=Q.dirname(r);if(o===r)break;r=o}for(let o of eo){let s=Q.join(e,o);if(kn(s))return s}return null}function Lc(e){let t=e.config.projectRoot,n=new Set(no(t,e.config.semantic?.typescript?.tsconfigs)),r=A(e,{includeIgnored:!1,extensions:En});for(let i of r){let o=to(t,i);o&&n.add(Q.resolve(o))}if(n.size===0){let i=to(t);i&&n.add(Q.resolve(i))}return[...n].filter(i=>!_c(t,i)).sort((i,o)=>i.localeCompare(o))}function no(e,t=[]){let n=new Set;for(let r of t){let i=Q.isAbsolute(r)?r:Q.join(e,r);kn(i)&&n.add(Q.resolve(i))}for(let r of Yg(e))for(let i of eo){let o=Q.join(r,i);kn(o)&&n.add(Q.resolve(o))}if(n.size===0){let r=to(e);r&&n.add(Q.resolve(r))}return[...n].filter(r=>!_c(e,r)).sort((r,i)=>r.localeCompare(i))}function Yg(e){let t=Q.join(e,"package.json");if(!kn(t))return[];let n;try{n=JSON.parse(zg(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(i=>Xg(e,i))}function Xg(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=Q.join(e,t);return Zi(s)?[s]:[]}let n=t.indexOf("*"),r=t.slice(0,n).replace(/\/$/,""),i=t.slice(n+1).replace(/^\//,""),o=Q.join(e,r||".");return Zi(o)?Qg(o).map(s=>Q.join(o,s,i)).filter(Zi):[]}function Zi(e){try{return Kg(e).isDirectory()}catch{return!1}}function _c(e,t){let n=Q.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 Zg}from"module";var eh=Zg(import.meta.url),Pn;function wc(){if(Pn!==void 0)return Pn;try{Pn=eh("ts-morph")}catch{Pn=null}return Pn}function Ec(e,t){return t.map(n=>({tsconfigPath:n,project:new e.Project({tsConfigFilePath:n,skipFileDependencyResolution:!1})}))}function $r(e,t,n){return{language:"typescript",availability:()=>({available:!1,reason:e,tsconfigPath:t,tsconfigPaths:n}),importUsage:()=>[],referencesFor:()=>[],calleesFor:()=>[],signatureFor:()=>null}}function Fc(e,t){let n=wc();if(!n)return $r("ts-morph is not installed");let r=Lc(e);if(r.length===0)return $r("no tsconfig found");try{let i=Ec(n,r);return new ro(e,n,i)}catch(i){return $r(i instanceof Error?i.message:String(i),r[0],r)}}var ro=class{constructor(t,n,r){this.db=t;this.tsMorph=n;this.projects=r;this.workspacePackages=vc(t.config.projectRoot),this.sourceFiles=Rc(t,r)}db;tsMorph;projects;language="typescript";importUsageCache=new Map;referencesCache=new Map;calleesCache=new Map;fileCalleesCache=new Map;signatureCache=new Map;definitionNodeCache=new Map;fileDefinitionNodeCache=new Map;indexedDefinitionLeafCache=new Map;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 Ee(this.importUsageCache,t,()=>{let n=this.sourceFiles.sourceFile(t);if(!n)return[];let r=[];for(let i of n.getImportDeclarations())for(let o of this.importUsageForDeclaration(t,i))r.push(o);return r})}referencesFor(t){return Ee(this.referencesCache,t.symbolId,()=>{let n=this.nodeForDefinition(t),r=this.packageImportReferencesForDefinition(t);return n?gc(n,t,r,this.db.config.projectRoot):r})}calleesFor(t){return Ee(this.calleesCache,t.symbolId,()=>Ee(this.fileCalleesCache,t.relativePath,()=>this.calleeMapForFile(t.relativePath)).get(t.symbolId)??[])}signatureFor(t){return Ee(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 r=n.getType().getCallSignatures()[0];if(!r)return null;let i=r.getParameters().map(s=>{let a=s.getDeclarations()[0],c=a?s.getTypeAtLocation(a).getText(a):s.getValueDeclaration()?.getType().getText()??"unknown";return Pc(c)}),o=r.getReturnType().getText(n);return`(${i.join(",")})=>${Pc(o)}`})}importUsageForDeclaration(t,n){let r=we(this.db,t,n.getModuleSpecifierValue()),i=kc(n);return n.getImportClause()?.isTypeOnly()?i.map(o=>th(t,r,o)):i.map(o=>this.valueImportUsageForEntry(t,r,o))}valueImportUsageForEntry(t,n,r){let i=r.identifier?r.identifier.findReferences():[],o=[];for(let l of i)for(let u of hc(l,t,r.identifier,this.db.config.projectRoot))o.push(u);let s=o.some(l=>!Xi(l.node)),a=o.some(l=>Xi(l.node)),c=r.isTypeOnly;return{importer:t,sourcePath:n,importedName:r.importedName,localName:r.localName,kind:r.kind,isTypeOnly:c,isUsed:c||o.length>0,isTypeUsed:c||a,isValueUsed:s,references:o.map(l=>l.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 r of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(t,n,r);for(let[r,i]of t)t.set(r,Tr(i));return this.packageImportReferenceIndex=t,t}addPackageImportReferencesForDocument(t,n,r){if(this.db.isIgnored(r))return;let i=this.sourceFiles.sourceFileMatch(r);if(i)for(let o of i.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(t,n,r,o)}addPackageImportReferencesForDeclaration(t,n,r,i){let o=Dc(this.workspacePackages,i.getModuleSpecifierValue());if(!o)return;let s=n.get(o);if(s)for(let a of kc(i)){if(a.kind!=="named"||!a.identifier)continue;let c=s.get(a.importedName);if(!c||c.size===0)continue;let l=bc(a.identifier,r,this.db.config.projectRoot);l.length>0&&ih(t,c,l)}}packageExports(){if(this.packageExportIndex)return this.packageExportIndex;let t=new Map;for(let n of this.workspacePackages){let r=new Map;for(let i of Nc(n))this.collectPackageExports(n,i,r,new Set);r.size>0&&t.set(n.name,r)}return this.packageExportIndex=t,t}collectPackageExports(t,n,r,i){if(i.has(n))return;i.add(n);let o=this.sourceFiles.sourceFile(n);if(o)for(let s of o.getExportDeclarations()){let a=s.getModuleSpecifierValue(),c=a?we(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,r,i);continue}for(let u of l){let m=u.getNameNode().getText(),d=u.getAliasNode()?.getText()??m,p=this.indexedDefinitionByLeaf(c,m);if(!p)continue;let h=r.get(d);h||(h=new Set,r.set(d,h)),h.add(p.symbolId)}}}indexedDefinitionByLeaf(t,n){return Ee(this.indexedDefinitionLeafCache,t,()=>Cc(this.db,t)).get(n)??null}nodeForDefinition(t){return Ee(this.definitionNodeCache,t.symbolId,()=>this.definitionNodesForFile(t.relativePath).get(t.symbolId)??null)}definitionNodesForFile(t){return Ee(this.fileDefinitionNodeCache,t,()=>{let n=this.sourceFiles.sourceFile(t);return n?Sc(this.tsMorph,this.db,n,t):new Map})}definitionFromSymbol(t){let n=t.getDeclarations();for(let r of n){let i=r.getSourceFile(),o=wn(this.db.config.projectRoot,i.getFilePath());if(!o||this.db.isIgnored(o))continue;let s=ln(i,r),a=xc(this.db,o,s,t.getName());if(a)return{symbol:a.symbol,file:a.relativePath,line:a.startLine}}return null}calleeMapForFile(t){let n=this.sourceFiles.sourceFile(t);if(!n)return new Map;let r=H(this.db,t).sort((o,s)=>o.startLine-s.startLine||s.endLine-o.endLine);if(r.length===0)return new Map;let i=new Map;n.forEachDescendant(o=>{if(!this.tsMorph.Node.isCallExpression(o)&&!this.tsMorph.Node.isNewExpression(o))return;let s=this.semanticCalleeForCallNode(n,r,o);s&&nh(i,s.callerId,s.target)});for(let[o,s]of i)i.set(o,oh(s));return i}semanticCalleeForCallNode(t,n,r){let i=rh(n,ln(t,r));if(!i)return null;let o=r.getExpression(),s=o.getSymbol()??o.getType().getSymbol(),a=s?this.definitionFromSymbol(s):null;return a?{callerId:i.symbolId,target:{symbol:a.symbol,file:a.file,line:a.line}}:null}};function kc(e){let t=[],n=e.getDefaultImport();n&&t.push({identifier:n,importedName:"default",localName:n.getText(),kind:"default",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});let r=e.getNamespaceImport();r&&t.push({identifier:r,importedName:"*",localName:r.getText(),kind:"namespace",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});for(let i of e.getNamedImports()){let o=i.getNameNode(),a=i.getAliasNode()??(o.getKindName()==="Identifier"?o:null);t.push({identifier:a,importedName:o.getText(),localName:a?.getText()??o.getText(),kind:"named",isTypeOnly:i.isTypeOnly()||(e.getImportClause()?.isTypeOnly()??!1)})}return t.length===0&&t.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),t}function th(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 nh(e,t,n){let r=e.get(t);r||(r=[],e.set(t,r)),r.push(n)}function rh(e,t){let n=null;for(let r of e)t<r.startLine||t>r.endLine||(!n||r.startLine>=n.startLine)&&(n=r);return n}function ih(e,t,n){for(let r of t){let i=e.get(r)??[];i.push(...n),e.set(r,i)}}function oh(e){let t=new Set,n=[];for(let r of e){let i=`${r.symbol}|${r.file}|${r.line}`;t.has(i)||(t.add(i),n.push(r))}return n}function Pc(e){return e.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var io=new WeakMap;it({name:"semantic-provider",groups:["semantic-provider"],clearAll:e=>io.delete(e)});function Fn(e,t){let n=`${e.config.projectRoot}:typescript-workspace`,r=io.get(e);r||(r=new Map,io.set(e,r));let i=r.get(n);if(i)return i;let o=Fc(e,t);return r.set(n,o),o}function An(e,t){let n=Br(e,t);return n?n.importUsage(t):[]}function wt(e,t){let n=Br(e,t.relativePath);return n?n.referencesFor(t):[]}function un(e,t){let n=new Map;for(let r of t)for(let i of wt(e,r)){if(i.file===r.relativePath||e.isIgnored(i.file))continue;let o=n.get(r.symbolId);o||(o=new Set,n.set(r.symbolId,o)),o.add(i.file)}return n}function jr(e,t){let n=new Map;for(let r of t){let i=Br(e,r.relativePath);if(!i)continue;let o=i.calleesFor(r);o.length>0&&n.set(r.symbolId,o)}return n}function Ac(e,t){let n=Br(e,t.relativePath);return n?n.signatureFor(t):null}function Br(e,t){if(!Mr(t))return null;let n=Fn(e,t);return n.availability().available?n:null}function Hr(e,t){let n=new Map;for(let r of te(e,t)){if(!r.sourcePath)continue;let i=r.localName??r.importedName;if(i&&Tc(n,i,r.sourcePath),r.kind==="namespace")for(let o of r.usedMembers)Tc(n,o,r.sourcePath)}return n}function Tc(e,t,n){let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)}function mn(e,t,n){let r=_t(e).get(n);if(!r||r.length===0)return[];if(r.length===1)return[Tn(r[0])];let i=r.filter(c=>c.file===t);if(i.length>0)return i.map(Tn);let o=Hr(e,t),s=o.get(n);if(s)for(let c of s){let l=r.filter(u=>mt(c,u.file));if(l.length>0)return l.map(Tn)}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=r.filter(u=>mt(c,u.file));if(l.length>0&&l.length===r.length)return l.map(Tn)}return[]}function Oc(e,t,n){let r=mn(e,t,n);if(r.length>0)return r;let i=_t(e).get(n);return!i||i.length===0?[]:i.map(Tn)}function $c(e,t,n={}){let r=hr(e,t);if(!r)return[];let i=P(r.symbol);if(!i)return[];if(n.semantic!==!1){let s=wt(e,{...r,leaf:i,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 Mc(e,a)}}let o=new Map;for(let s of je(e)){let a=T(e,s);if(!a||a.indexOf(i)===-1||s!==r.relativePath&&!mn(e,s,i).some(u=>u.symbolId===r.symbolId))continue;let c=kr(e,s,i,s===r.relativePath?{excludeStartLine:r.startLine,excludeEndLine:r.endLine}:{});c.length>0&&o.set(s,c)}return Mc(e,o)}function jc(e,t){let n=new Map;for(let o of t){if(!o.leaf)continue;let s=n.get(o.leaf)??[];s.push(o),n.set(o.leaf,s)}if(n.size===0)return new Map;let r=new Set(t.map(o=>o.symbolId)),i=new Map;for(let o of je(e)){let s=cc(e,o);if(s.size!==0){for(let a of s)if(n.has(a))for(let c of mn(e,o,a)){if(!r.has(c.symbolId)||o===c.relativePath)continue;let l=i.get(c.symbolId);l||(l=new Set,i.set(c.symbolId,l)),l.add(o)}}}return i}function Tn(e){return{symbolId:e.symbolId,symbol:e.symbol,relativePath:e.file}}function Mc(e,t){let n=[],r=new Set;for(let[i,o]of t){let s=H(e,i);for(let a of o){let c=be(s,a),l=`${i}|${a}|${c?.symbol??""}`;r.has(l)||(r.add(l),n.push({file:i,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function Et(e,t){let n=mh(e,t);return n?dh(e,ah(e,n.match,n.identifier)):[]}function pt(e,t,n={}){return sh(e,t,n).map(r=>({file:r.file,line:r.line,enclosingSymbol:r.enclosingSymbol}))}function sh(e,t,n={}){let r=$c(e,t,{semantic:n.semantic}),i=r.length>0?Bc(r,"source-attribution"):Bc(Et(e,t),"scip-reference-chunk");return n.includeIgnored===!0?i:i.filter(o=>!e.isIgnored(o.file))}function Bc(e,t){return e.map(n=>({...n,provenance:t}))}function ah(e,t,n){let r=new Map;for(let[i,o]of ch(e,t.symbolId))r.set(i,lh(e,i,o,t,n));return r}function ch(e,t){let n=new Map;for(let r of Pr(e,[t])){if(e.isIgnored(r.relative_path))continue;let i=n.get(r.relative_path);i||(i=[],n.set(r.relative_path,i)),i.push({start_line:r.chunk_start,end_line:r.chunk_end})}return n}function lh(e,t,n,r,i){let o=t===r.relativePath?{excludeStartLine:r.startLine,excludeEndLine:r.endLine}:{},s=i?kr(e,t,i,o):[];return n.flatMap(a=>uh(s,a))}function uh(e,t){let n=e.filter(r=>r>=t.start_line&&r<=t.end_line);return n.length>0?n:[t.start_line]}function mh(e,t){let n=hr(e,t);return n?{match:n,identifier:P(n.symbol)||null}:null}function dh(e,t){let n=[],r=new Set;for(let[i,o]of t){let s=H(e,i);for(let a of o){let c=be(s,a),l=`${i}|${a}|${c?.symbol??""}`;r.has(l)||(r.add(l),n.push({file:i,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function he(e,t,n={}){let r=qr(e,[t],{additive:n.additive,semantic:n.semantic}),i=n.callableOnly?(r.get(t.symbolId)??[]).filter(o=>ie(o.symbol)):r.get(t.symbolId)??[];return typeof n.limit=="number"?i.slice(0,n.limit):i}function Hc(e,t,n={}){let r=gh(e)?yh(e,t,{semantic:n.semantic!==!1}):hh(e).get(t.symbolId)??[];return typeof n.limit=="number"?r.slice(0,n.limit):r}var ph=re("caller-rows",{clearGroups:["whole-project"]}),fh=2e4;function gh(e){return(e.get("SELECT COUNT(*) AS count FROM global_symbols")?.count??0)>fh}function hh(e){return ph.get(e,()=>{let t=Oe(e),n=qr(e,t),r=new Map;for(let s of t)r.set(s.symbol,s.symbolId);let i=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=r.get(c.symbol);if(l===void 0||l===s.symbolId)continue;let u=i.get(l);u||(u=[],i.set(l,u),o.set(l,new Set));let m=`${s.symbol}|${s.relativePath}`;o.get(l).has(m)||(o.get(l).add(m),u.push({symbol:s.symbol,file:s.relativePath,source:"caller-map-inversion"}))}}return i})}function yh(e,t,n){let r=[],i=new Set,o=a=>{if(a.symbol===t.symbol)return;let c=`${a.symbol}|${a.file}`;i.has(c)||(i.add(c),r.push(a))};for(let a of Et(e,t))a.file!==t.relativePath&&o({symbol:a.enclosingSymbol??a.file,file:a.file,source:"resolved-reference"});let s=n.semantic?bh(e,t):null;if(s)for(let a of wt(e,s)){if(a.file===t.relativePath||e.isIgnored(a.file))continue;let c=be(H(e,a.file),a.line);o({symbol:c?.symbol??a.file,file:a.file,source:"semantic-reference"})}return r}function bh(e,t){return e.get(`SELECT
|
|
214
|
+
ORDER BY startLine, endLine`,t,t),r=new Set,i=new Map;for(let o of n){if(r.has(o.symbolId))continue;r.add(o.symbolId);let s=o.leaf||T(o.symbol);!s||i.has(s)||i.set(s,{...o,leaf:s})}return i}import Lh from"path";var $n=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function hn(e){let t=e.toLowerCase();return $n.some(n=>t.endsWith(n))}function Vc(e,t){let n=new Map,r=i=>hn(i)?Te(n,i,()=>{let o=Lh.join(e.config.projectRoot,i);for(let{project:s}of t){let a=s.getSourceFile(o)??s.addSourceFileAtPathIfExists(o)??null;if(a)return{project:s,sourceFile:a}}return null}):null;return{sourceFile:i=>r(i)?.sourceFile??null,sourceFileMatch:r,indexedTypeScriptLikeDocuments:()=>M(e,{extensions:$n})}}import gt from"path";import{existsSync as zr,readdirSync as wh,readFileSync as Wc}from"fs";function Uc(e){let t=gt.join(e,"package.json");if(!zr(t))return[];let n;try{n=JSON.parse(Wc(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(i=>Eh(e,i)).flatMap(i=>kh(e,i))}function Eh(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=gt.join(e,t);return zr(gt.join(s,"package.json"))?[s]:[]}let n=t.indexOf("*"),r=t.slice(0,n).replace(/\/$/,""),i=t.slice(n+1).replace(/^\//,""),o=gt.join(e,r||".");if(!zr(o))return[];try{return wh(o).map(s=>gt.join(o,s,i)).filter(s=>zr(gt.join(s,"package.json")))}catch{return[]}}function kh(e,t){try{let n=JSON.parse(Wc(gt.join(t,"package.json"),"utf8"));if(!n.name)return[];let r=gt.relative(e,t).replace(/\\/g,"/");return[{name:n.name,rootRelative:r,sourceRootRelative:`${r}/src`}]}catch{return[]}}function Gc(e,t){for(let n of e)if(t===n.name||t.startsWith(`${n.name}/`))return n.name;return null}function Jc(e){return[`${e.sourceRootRelative}/index.ts`,`${e.sourceRootRelative}/index.tsx`,`${e.sourceRootRelative}/index.mts`,`${e.sourceRootRelative}/index.cts`]}import{existsSync as jn,readFileSync as Ph,readdirSync as Fh,statSync as Th}from"fs";import K from"path";var yo=["tsconfig.json","tsconfig.app.json","tsconfig.node.json","tsconfig.base.json"];function bo(e,t){let r=t?K.dirname(K.join(e,t)):e,i=K.resolve(e);for(;r.startsWith(i);){for(let s of yo){let a=K.join(r,s);if(jn(a))return a}let o=K.dirname(r);if(o===r)break;r=o}for(let o of yo){let s=K.join(e,o);if(jn(s))return s}return null}function zc(e){let t=e.config.projectRoot,n=new Set(So(t,e.config.semantic?.typescript?.tsconfigs)),r=M(e,{includeIgnored:!1,extensions:$n});for(let i of r){let o=bo(t,i);o&&n.add(K.resolve(o))}if(n.size===0){let i=bo(t);i&&n.add(K.resolve(i))}return[...n].filter(i=>!Kc(t,i)).sort((i,o)=>i.localeCompare(o))}function So(e,t=[]){let n=new Set;for(let r of t){let i=K.isAbsolute(r)?r:K.join(e,r);jn(i)&&n.add(K.resolve(i))}for(let r of Ah(e))for(let i of yo){let o=K.join(r,i);jn(o)&&n.add(K.resolve(o))}if(n.size===0){let r=bo(e);r&&n.add(K.resolve(r))}return[...n].filter(r=>!Kc(e,r)).sort((r,i)=>r.localeCompare(i))}function Ah(e){let t=K.join(e,"package.json");if(!jn(t))return[];let n;try{n=JSON.parse(Ph(t,"utf8"))}catch{return[]}return(Array.isArray(n.workspaces)?n.workspaces:n.workspaces?.packages??[]).flatMap(i=>Mh(e,i))}function Mh(e,t){if(!t||t.startsWith("!")||t.includes("node_modules"))return[];if(!t.includes("*")){let s=K.join(e,t);return ho(s)?[s]:[]}let n=t.indexOf("*"),r=t.slice(0,n).replace(/\/$/,""),i=t.slice(n+1).replace(/^\//,""),o=K.join(e,r||".");return ho(o)?Fh(o).map(s=>K.join(o,s,i)).filter(ho):[]}function ho(e){try{return Th(e).isDirectory()}catch{return!1}}function Kc(e,t){let n=K.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 Oh}from"module";var $h=Oh(import.meta.url),Bn;function Qc(){if(Bn!==void 0)return Bn;try{Bn=$h("ts-morph")}catch{Bn=null}return Bn}function Yc(e,t){return t.map(n=>({tsconfigPath:n,project:new e.Project({tsConfigFilePath:n,skipFileDependencyResolution:!1})}))}function Kr(e,t,n){return{language:"typescript",availability:()=>({available:!1,reason:e,tsconfigPath:t,tsconfigPaths:n}),importUsage:()=>[],referencesFor:()=>[],calleesFor:()=>[],signatureFor:()=>null}}function el(e,t){let n=Qc();if(!n)return Kr("ts-morph is not installed");let r=zc(e);if(r.length===0)return Kr("no tsconfig found");try{let i=Yc(n,r);return new xo(e,n,i)}catch(i){return Kr(i instanceof Error?i.message:String(i),r[0],r)}}var xo=class{constructor(t,n,r){this.db=t;this.tsMorph=n;this.projects=r;this.workspacePackages=Uc(t.config.projectRoot),this.sourceFiles=Vc(t,r)}db;tsMorph;projects;language="typescript";importUsageCache=new Map;referencesCache=new Map;calleesCache=new Map;fileCalleesCache=new Map;signatureCache=new Map;definitionNodeCache=new Map;fileDefinitionNodeCache=new Map;indexedDefinitionLeafCache=new Map;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 Te(this.importUsageCache,t,()=>{let n=this.sourceFiles.sourceFile(t);if(!n)return[];let r=[];for(let i of n.getImportDeclarations())for(let o of this.importUsageForDeclaration(t,i))r.push(o);return r})}referencesFor(t){return Te(this.referencesCache,t.symbolId,()=>{let n=this.nodeForDefinition(t),r=this.packageImportReferencesForDefinition(t);return n?Mc(n,t,r,this.db.config.projectRoot):r})}calleesFor(t){return Te(this.calleesCache,t.symbolId,()=>Te(this.fileCalleesCache,t.relativePath,()=>this.calleeMapForFile(t.relativePath)).get(t.symbolId)??[])}signatureFor(t){return Te(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 r=n.getType().getCallSignatures()[0];if(!r)return null;let i=r.getParameters().map(s=>{let a=s.getDeclarations()[0],c=a?s.getTypeAtLocation(a).getText(a):s.getValueDeclaration()?.getType().getText()??"unknown";return Zc(c)}),o=r.getReturnType().getText(n);return`(${i.join(",")})=>${Zc(o)}`})}importUsageForDeclaration(t,n){let r=Fe(this.db,t,n.getModuleSpecifierValue()),i=Xc(n);return n.getImportClause()?.isTypeOnly()?i.map(o=>jh(t,r,o)):i.map(o=>this.valueImportUsageForEntry(t,r,o))}valueImportUsageForEntry(t,n,r){let i=r.identifier?r.identifier.findReferences():[],o=[];for(let l of i)for(let u of Oc(l,t,r.identifier,this.db.config.projectRoot))o.push(u);let s=o.some(l=>!go(l.node)),a=o.some(l=>go(l.node)),c=r.isTypeOnly;return{importer:t,sourcePath:n,importedName:r.importedName,localName:r.localName,kind:r.kind,isTypeOnly:c,isUsed:c||o.length>0,isTypeUsed:c||a,isValueUsed:s,references:o.map(l=>l.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 r of this.sourceFiles.indexedTypeScriptLikeDocuments())this.addPackageImportReferencesForDocument(t,n,r);for(let[r,i]of t)t.set(r,Jr(i));return this.packageImportReferenceIndex=t,t}addPackageImportReferencesForDocument(t,n,r){if(this.db.isIgnored(r))return;let i=this.sourceFiles.sourceFileMatch(r);if(i)for(let o of i.sourceFile.getImportDeclarations())this.addPackageImportReferencesForDeclaration(t,n,r,o)}addPackageImportReferencesForDeclaration(t,n,r,i){let o=Gc(this.workspacePackages,i.getModuleSpecifierValue());if(!o)return;let s=n.get(o);if(s)for(let a of Xc(i)){if(a.kind!=="named"||!a.identifier)continue;let c=s.get(a.importedName);if(!c||c.size===0)continue;let l=jc(a.identifier,r,this.db.config.projectRoot);l.length>0&&qh(t,c,l)}}packageExports(){if(this.packageExportIndex)return this.packageExportIndex;let t=new Map;for(let n of this.workspacePackages){let r=new Map;for(let i of Jc(n))this.collectPackageExports(n,i,r,new Set);r.size>0&&t.set(n.name,r)}return this.packageExportIndex=t,t}collectPackageExports(t,n,r,i){if(i.has(n))return;i.add(n);let o=this.sourceFiles.sourceFile(n);if(o)for(let s of o.getExportDeclarations()){let a=s.getModuleSpecifierValue(),c=a?Fe(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,r,i);continue}for(let u of l){let m=u.getNameNode().getText(),d=u.getAliasNode()?.getText()??m,p=this.indexedDefinitionByLeaf(c,m);if(!p)continue;let h=r.get(d);h||(h=new Set,r.set(d,h)),h.add(p.symbolId)}}}indexedDefinitionByLeaf(t,n){return Te(this.indexedDefinitionLeafCache,t,()=>qc(this.db,t)).get(n)??null}nodeForDefinition(t){return Te(this.definitionNodeCache,t.symbolId,()=>this.definitionNodesForFile(t.relativePath).get(t.symbolId)??null)}definitionNodesForFile(t){return Te(this.fileDefinitionNodeCache,t,()=>{let n=this.sourceFiles.sourceFile(t);return n?Bc(this.tsMorph,this.db,n,t):new Map})}definitionFromSymbol(t){let n=t.getDeclarations();for(let r of n){let i=r.getSourceFile(),o=On(this.db.config.projectRoot,i.getFilePath());if(!o||this.db.isIgnored(o))continue;let s=gn(i,r),a=Hc(this.db,o,s,t.getName());if(a)return{symbol:a.symbol,file:a.relativePath,line:a.startLine}}return null}calleeMapForFile(t){let n=this.sourceFiles.sourceFile(t);if(!n)return new Map;let r=W(this.db,t).sort((o,s)=>o.startLine-s.startLine||s.endLine-o.endLine);if(r.length===0)return new Map;let i=new Map;n.forEachDescendant(o=>{if(!this.tsMorph.Node.isCallExpression(o)&&!this.tsMorph.Node.isNewExpression(o))return;let s=this.semanticCalleeForCallNode(n,r,o);s&&Bh(i,s.callerId,s.target)});for(let[o,s]of i)i.set(o,Vh(s));return i}semanticCalleeForCallNode(t,n,r){let i=Hh(n,gn(t,r));if(!i)return null;let o=r.getExpression(),s=o.getSymbol()??o.getType().getSymbol(),a=s?this.definitionFromSymbol(s):null;return a?{callerId:i.symbolId,target:{symbol:a.symbol,file:a.file,line:a.line}}:null}};function Xc(e){let t=[],n=e.getDefaultImport();n&&t.push({identifier:n,importedName:"default",localName:n.getText(),kind:"default",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});let r=e.getNamespaceImport();r&&t.push({identifier:r,importedName:"*",localName:r.getText(),kind:"namespace",isTypeOnly:e.getImportClause()?.isTypeOnly()??!1});for(let i of e.getNamedImports()){let o=i.getNameNode(),a=i.getAliasNode()??(o.getKindName()==="Identifier"?o:null);t.push({identifier:a,importedName:o.getText(),localName:a?.getText()??o.getText(),kind:"named",isTypeOnly:i.isTypeOnly()||(e.getImportClause()?.isTypeOnly()??!1)})}return t.length===0&&t.push({identifier:null,importedName:"*",localName:null,kind:"side-effect",isTypeOnly:!1}),t}function jh(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 Bh(e,t,n){let r=e.get(t);r||(r=[],e.set(t,r)),r.push(n)}function Hh(e,t){let n=null;for(let r of e)t<r.startLine||t>r.endLine||(!n||r.startLine>=n.startLine)&&(n=r);return n}function qh(e,t,n){for(let r of t){let i=e.get(r)??[];i.push(...n),e.set(r,i)}}function Vh(e){let t=new Set,n=[];for(let r of e){let i=`${r.symbol}|${r.file}|${r.line}`;t.has(i)||(t.add(i),n.push(r))}return n}function Zc(e){return e.replace(/\s+/g," ").replace(/\bimport\("[^"]+"\)\./g,"").trim()}var Co=new WeakMap;at({name:"semantic-provider",groups:["semantic-provider"],clearAll:e=>Co.delete(e)});function Ft(e,t){let n=`${e.config.projectRoot}:typescript-workspace`,r=Co.get(e);r||(r=new Map,Co.set(e,r));let i=r.get(n);if(i)return i;let o=el(e,t);return r.set(n,o),o}function Hn(e,t){let n=Yr(e,t);return n?n.importUsage(t):[]}function Tt(e,t){let n=Yr(e,t.relativePath);return n?n.referencesFor(t):[]}function yn(e,t){let n=new Map;for(let r of t)for(let i of Tt(e,r)){if(i.file===r.relativePath||e.isIgnored(i.file))continue;let o=n.get(r.symbolId);o||(o=new Set,n.set(r.symbolId,o)),o.add(i.file)}return n}function Qr(e,t){let n=new Map;for(let r of t){let i=Yr(e,r.relativePath);if(!i)continue;let o=i.calleesFor(r);o.length>0&&n.set(r.symbolId,o)}return n}function tl(e,t){let n=Yr(e,t.relativePath);return n?n.signatureFor(t):null}function Yr(e,t){if(!hn(t))return null;let n=Ft(e,t);return n.availability().available?n:null}function Xr(e,t){let n=new Map;for(let r of ie(e,t)){if(!r.sourcePath)continue;let i=r.localName??r.importedName;if(i&&nl(n,i,r.sourcePath),r.kind==="namespace")for(let o of r.usedMembers)nl(n,o,r.sourcePath)}return n}function nl(e,t,n){let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)}function bn(e,t,n){let r=Pt(e).get(n);if(!r||r.length===0)return[];if(r.length===1)return[qn(r[0])];let i=r.filter(c=>c.file===t);if(i.length>0)return i.map(qn);let o=Xr(e,t),s=o.get(n);if(s)for(let c of s){let l=r.filter(u=>ft(c,u.file));if(l.length>0)return l.map(qn)}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=r.filter(u=>ft(c,u.file));if(l.length>0&&l.length===r.length)return l.map(qn)}return[]}function il(e,t,n){let r=bn(e,t,n);if(r.length>0)return r;let i=Pt(e).get(n);return!i||i.length===0?[]:i.map(qn)}function ol(e,t,n={}){let r=Lr(e,t);if(!r)return[];let i=T(r.symbol);if(!i)return[];if(n.semantic!==!1){let s=Tt(e,{...r,leaf:i,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 rl(e,a)}}let o=new Map;for(let s of Ve(e)){let a=P(e,s);if(!a||a.indexOf(i)===-1||s!==r.relativePath&&!bn(e,s,i).some(u=>u.symbolId===r.symbolId))continue;let c=Vr(e,s,i,s===r.relativePath?{excludeStartLine:r.startLine,excludeEndLine:r.endLine}:{});c.length>0&&o.set(s,c)}return rl(e,o)}function sl(e,t){let n=new Map;for(let o of t){if(!o.leaf)continue;let s=n.get(o.leaf)??[];s.push(o),n.set(o.leaf,s)}if(n.size===0)return new Map;let r=new Set(t.map(o=>o.symbolId)),i=new Map;for(let o of Ve(e)){let s=wc(e,o);if(s.size!==0){for(let a of s)if(n.has(a))for(let c of bn(e,o,a)){if(!r.has(c.symbolId)||o===c.relativePath)continue;let l=i.get(c.symbolId);l||(l=new Set,i.set(c.symbolId,l)),l.add(o)}}}return i}function qn(e){return{symbolId:e.symbolId,symbol:e.symbol,relativePath:e.file}}function rl(e,t){let n=[],r=new Set;for(let[i,o]of t){let s=W(e,i);for(let a of o){let c=Ce(s,a),l=`${i}|${a}|${c?.symbol??""}`;r.has(l)||(r.add(l),n.push({file:i,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function At(e,t){let n=Kh(e,t);return n?Qh(e,Uh(e,n.match,n.identifier)):[]}function ht(e,t,n={}){return Wh(e,t,n).map(r=>({file:r.file,line:r.line,enclosingSymbol:r.enclosingSymbol}))}function Wh(e,t,n={}){let r=ol(e,t,{semantic:n.semantic}),i=r.length>0?al(r,"source-attribution"):al(At(e,t),"scip-reference-chunk");return n.includeIgnored===!0?i:i.filter(o=>!e.isIgnored(o.file))}function al(e,t){return e.map(n=>({...n,provenance:t}))}function Uh(e,t,n){let r=new Map;for(let[i,o]of Gh(e,t.symbolId))r.set(i,Jh(e,i,o,t,n));return r}function Gh(e,t){let n=new Map;for(let r of Wr(e,[t])){if(e.isIgnored(r.relative_path))continue;let i=n.get(r.relative_path);i||(i=[],n.set(r.relative_path,i)),i.push({start_line:r.chunk_start,end_line:r.chunk_end})}return n}function Jh(e,t,n,r,i){let o=t===r.relativePath?{excludeStartLine:r.startLine,excludeEndLine:r.endLine}:{},s=i?Vr(e,t,i,o):[];return n.flatMap(a=>zh(s,a))}function zh(e,t){let n=e.filter(r=>r>=t.start_line&&r<=t.end_line);return n.length>0?n:[t.start_line]}function Kh(e,t){let n=Lr(e,t);return n?{match:n,identifier:T(n.symbol)||null}:null}function Qh(e,t){let n=[],r=new Set;for(let[i,o]of t){let s=W(e,i);for(let a of o){let c=Ce(s,a),l=`${i}|${a}|${c?.symbol??""}`;r.has(l)||(r.add(l),n.push({file:i,line:a,enclosingSymbol:c?.symbol??null}))}}return n}function Se(e,t,n={}){let r=Zr(e,[t],{additive:n.additive,semantic:n.semantic}),i=n.callableOnly?(r.get(t.symbolId)??[]).filter(o=>ae(o.symbol)):r.get(t.symbolId)??[];return typeof n.limit=="number"?i.slice(0,n.limit):i}function cl(e,t,n={}){let r=Zh(e)?ty(e,t,{semantic:n.semantic!==!1}):ey(e).get(t.symbolId)??[];return typeof n.limit=="number"?r.slice(0,n.limit):r}var Yh=te("caller-rows",{clearGroups:["whole-project"]}),Xh=2e4;function Zh(e){return(e.get("SELECT COUNT(*) AS count FROM global_symbols")?.count??0)>Xh}function ey(e){return Yh.get(e,()=>{let t=He(e),n=Zr(e,t),r=new Map;for(let s of t)r.set(s.symbol,s.symbolId);let i=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=r.get(c.symbol);if(l===void 0||l===s.symbolId)continue;let u=i.get(l);u||(u=[],i.set(l,u),o.set(l,new Set));let m=`${s.symbol}|${s.relativePath}`;o.get(l).has(m)||(o.get(l).add(m),u.push({symbol:s.symbol,file:s.relativePath,source:"caller-map-inversion"}))}}return i})}function ty(e,t,n){let r=[],i=new Set,o=a=>{if(a.symbol===t.symbol)return;let c=`${a.symbol}|${a.file}`;i.has(c)||(i.add(c),r.push(a))};for(let a of At(e,t))a.file!==t.relativePath&&o({symbol:a.enclosingSymbol??a.file,file:a.file,source:"resolved-reference"});let s=n.semantic?ny(e,t):null;if(s)for(let a of Tt(e,s)){if(a.file===t.relativePath||e.isIgnored(a.file))continue;let c=Ce(W(e,a.file),a.line);o({symbol:c?.symbol??a.file,file:a.file,source:"semantic-reference"})}return r}function ny(e,t){return e.get(`SELECT
|
|
195
215
|
d.id AS documentId,
|
|
196
216
|
gs.id AS symbolId,
|
|
197
217
|
gs.symbol,
|
|
@@ -210,7 +230,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
210
230
|
LEFT JOIN chunks c ON c.document_id = der.document_id
|
|
211
231
|
JOIN documents d ON d.id = COALESCE(der.document_id, c.document_id)
|
|
212
232
|
WHERE gs.id = ?
|
|
213
|
-
LIMIT 1`,t.symbolId)??null}function
|
|
233
|
+
LIMIT 1`,t.symbolId)??null}function Zr(e,t,n={}){if(t.length===0)return new Map;let r=n.additive??!1,i=[],o=[];for(let u of t)B(u.relativePath)&&tn(e,u.relativePath)!==null?i.push(u):o.push(u);let s=new Map,a=new Map,c=u=>{for(let[m,d]of u){let p=s.get(m);p||(p=[],s.set(m,p));let h=a.get(m);h||(h=new Set,a.set(m,h));for(let f of d){let y=`${f.symbol}|${f.chunkId}`;h.has(y)||(h.add(y),p.push(f))}}};i.length>0&&c(ay(e,i)),n.semantic!==!1&&c(dy(ry(e,t)));let l=r?t:o;return l.length>0&&c(my(e,l)),s}function ry(e,t){let n=new Map,r=[],i=[];for(let s of t){if(!hn(s.relativePath))continue;let a=P(e,s.relativePath);if(!a){i.push(s);continue}let c=Ct(e,s.relativePath,a),l=sy(e,s.relativePath),u=Da(e,s.relativePath,s.symbol,c,l);if(u!==null){let m=iy(u);if(m){m.length>0&&n.set(s.symbolId,m);continue}}r.push({def:s,contentHash:c,depsDigest:l})}if(r.length===0&&i.length===0)return n;let o=Qr(e,[...i,...r.map(s=>s.def)]);for(let[s,a]of o)n.set(s,a);return Ft(e).availability().available&&Na(e,r.map(s=>({relativePath:s.def.relativePath,symbol:s.def.symbol,contentHash:s.contentHash,depsDigest:s.depsDigest,payload:JSON.stringify(o.get(s.def.symbolId)??[])}))),n}function iy(e){try{return JSON.parse(e)}catch{return null}}var oy=H("semantic-deps-digest",{clearGroups:["whole-project","source-file"]});function sy(e,t){return oy.get(e,t,()=>{let r=[...X(e).get(t)??[]].sort().map(i=>`${i}:${Ct(e,i,P(e,i))}`);return Ui(r.join("|"))})}function ay(e,t){let n=new Map,r=cy(t,n),i=Pt(e);for(let[o,s]of r){let a=tn(e,o);if(a)for(let c of a){let l=ly(s,c.line);if(!l)continue;let u=uy(e,o,i,c.calleeLeaf,c.memberAccess);u&&u.symbol!==l.symbol&&n.get(l.symbolId).push({symbol:u.symbol,file:u.file,chunkId:c.line,source:"ast-callsite"})}}return n}function cy(e,t){let n=new Map;for(let r of e){let i=n.get(r.relativePath);i?i.push(r):n.set(r.relativePath,[r]),t.set(r.symbolId,[])}for(let r of n.values())r.sort((i,o)=>i.endLine-i.startLine-(o.endLine-o.startLine));return n}function ly(e,t){return e.find(n=>t>=n.startLine&&t<=n.endLine)??null}function uy(e,t,n,r,i){let o=Ur(t,n.get(r)??[]);return o.length===0?null:Gr(e,t,o,i)}function my(e,t){if(t.length===0)return new Map;let n=e.all(`SELECT c.document_id, c.id AS chunk_id, c.start_line, c.end_line, m.symbol_id
|
|
214
234
|
FROM mentions m
|
|
215
235
|
JOIN chunks c ON m.chunk_id = c.id
|
|
216
236
|
WHERE m.role != 1`),r=new Map;for(let l of n)r.has(l.document_id)||r.set(l.document_id,[]),r.get(l.document_id).push(l);let i=new Map(e.all("SELECT id, relative_path FROM documents").map(l=>[l.id,l.relative_path])),o=new Map,s=e.all(`SELECT gs.id AS symbol_id, gs.symbol,
|
|
@@ -223,10 +243,10 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
223
243
|
JOIN chunks c ON m.chunk_id = c.id
|
|
224
244
|
WHERE m.role = 1
|
|
225
245
|
GROUP BY m.symbol_id
|
|
226
|
-
) def_chunk ON def_chunk.symbol_id = gs.id`);for(let l of s)o.has(l.symbol_id)||o.set(l.symbol_id,{symbol:l.symbol,file:l.document_id!==null?i.get(l.document_id)??"":""});let a=new Map,c=i;for(let l of t){let u=r.get(l.documentId)??[],m=new Set,d=[],p=null,h=()=>{if(p)return p;let f=c.get(l.documentId)??"",y=new Set;if(f){let
|
|
227
|
-
`);for(let a=0;a<s.length;a++){let c=s[a]??"";n.some(l=>new RegExp(`@${l}\\b|\\b${l}:`).test(c))&&r.push({relativePath:i,line:a})}}return r}function
|
|
246
|
+
) def_chunk ON def_chunk.symbol_id = gs.id`);for(let l of s)o.has(l.symbol_id)||o.set(l.symbol_id,{symbol:l.symbol,file:l.document_id!==null?i.get(l.document_id)??"":""});let a=new Map,c=i;for(let l of t){let u=r.get(l.documentId)??[],m=new Set,d=[],p=null,h=()=>{if(p)return p;let f=c.get(l.documentId)??"",y=new Set;if(f){let R=Ec(e,f),E=Math.max(0,l.startLine),S=Math.min(R.length-1,l.endLine);for(let x=E;x<=S;x+=1)for(let D of R[x])y.add(D)}return p=y,y};for(let f of u){if(f.symbol_id===l.symbolId)continue;let y=o.get(f.symbol_id);if(!y)continue;if(!(f.start_line>=l.startLine&&f.end_line<=l.endLine)){if(!(f.start_line<=l.endLine&&f.end_line>=l.startLine))continue;let x=T(y.symbol);if(!x||!h().has(x))continue}let E=`${y.symbol}|${f.chunk_id}`;m.has(E)||(m.add(E),d.push({...y,chunkId:f.chunk_id,source:"scip-chunk"}))}a.set(l.symbolId,d)}return a}function dy(e){let t=new Map;for(let[n,r]of e){let i=[];for(let o of r)i.push({symbol:o.symbol,file:o.file,chunkId:-1,source:"semantic-callee"});t.set(n,i)}return t}function ll(e,t,n={}){let r=new Map;if(t&&t.length===0)return r;let i=M(e,{includeIgnored:!1}),o=Pt(e),s=t??He(e),a=new Set(s.map(c=>c.symbolId));return py(e,r,i,o,a),fy(e,r,s,a),by(e,r,i,o,a),n.semantic!==!1&&xy(r,yn(e,Sy(s))),r}function py(e,t,n,r,i){for(let o of n){if(!B(o))continue;let s=tn(e,o);if(s)for(let a of s){let c=Ur(o,r.get(a.calleeLeaf)??[]);if(!c||c.length===0)continue;let l=Gr(e,o,c,a.memberAccess);l&&i.has(l.symbolId)&&l.file!==o&&Ro(t,l.symbolId,o)}}}function fy(e,t,n,r){let i=hy(n);for(let o of gy(e,r))e.isIgnored(o.relative_path)||yy(o,i.get(o.symbol_id))||Ro(t,o.symbol_id,o.relative_path)}function gy(e,t){return Wr(e,t?[...t]:void 0)}function hy(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 yy(e,t){return!!t&&t.docId===e.document_id&&e.chunk_start>=t.startLine&&e.chunk_end<=t.endLine}function by(e,t,n,r,i){for(let o of n){if(B(o)!=="rust")continue;let s=Rt(e,o,{includeRustAttributeNames:!0});if(s.length!==0)for(let{name:a}of s){let c=r.get(a);if(c)for(let l of c)i.has(l.symbolId)&&l.file!==o&&Ro(t,l.symbolId,o)}}}function Ro(e,t,n){let r=e.get(t);r||(r=new Set,e.set(t,r)),r.add(n)}function Sy(e){return e.filter(t=>"relativePath"in t&&"symbol"in t&&"leaf"in t)}function xy(e,t){for(let[n,r]of t){let i=e.get(n);i||(i=new Set,e.set(n,i));for(let o of r)i.add(o)}}function De(e,t,n={}){return cl(e,t,n)}function Io(e,t,n={}){return ll(e,t,n)}function vo(e,t){return sl(e,t)}function ul(e,t,n={}){let r=Io(e,t,{semantic:n.semantic});return n.sourceFallback===!1?r:Cy(r,vo(e,t))}function Cy(e,t){let n=new Map;for(let[r,i]of e)n.set(r,new Set(i));for(let[r,i]of t){let o=n.get(r)??new Set;for(let s of i)o.add(s);n.set(r,o)}return n}function ml(e,t,n){let r=t.identifierResolution==="strict"?bn:il;for(let i of t.paths)if(!(!B(i)&&!(t.includeVueSfc&&xt(i)))&&!e.isIgnored(i)&&!t.skipPath?.(i))try{let s=(c,l,u,m)=>{if(t.candidateNames&&!t.candidateNames.has(c))return;let d=t.resolveTargets?t.resolveTargets({sourceFile:i,name:c,kind:l,defaultTargets:m}):m();for(let p of d)n({sourceFile:i,name:c,target:p,occurrences:u,kind:l})},a=Ye(e,i);for(let[c,l]of a)s(c,"identifier",l.length,()=>r(e,i,c));for(let c of Rt(e,i,{includeCrossLanguageDispatchNames:t.includeCrossLanguageDispatchNames,includeRustAttributeNames:t.includeRustAttributeNames})){let l=c.kind==="cross-language-dispatch"?()=>bn(e,i,c.name):()=>r(e,i,c.name);s(c.name,c.kind,c.occurrences,l)}}finally{t.afterPath?.(i)}}var _=class{constructor(t){this.db=t}db;scopedDefinitions(t){return Qi(this.db,t)}definitionsForFile(t){return W(this.db,t)}productionCallableDefinitions(t={}){let{scope:n,minLoc:r=1,maxLoc:i=Number.POSITIVE_INFINITY,excludeSymbol:o,excludeEntrySurfaces:s=!1,excludeTypesFiles:a=!1,excludeRootedSymbols:c=!1,requireFunctionLikeSymbol:l=!1,requireCallableSymbol:u=!1,excludeRustTraitImplMembers:m=!1,includeSuppressed:d=!1,sortByLocDesc:p=!1}=t,h=[];for(let f of this.scopedDefinitions(n)){let y=f.relativePath;if(this.db.isIgnored(y)||s&&me(this.db,y)||!Ry(f,{requireFunctionLikeSymbol:l,requireCallableSymbol:u})||o!==void 0&&f.symbol===o)continue;let R=Do(f);R<r||R>i||a&&Iy(y)||c&&oe(this.db,f.symbol,y)||m&&vr(f.symbol)||G(y)!=="test"&&(nn(f.symbol)||!d&&Wi(this.db,y,f.startLine)||h.push(f))}return p?h.sort((f,y)=>Do(y)-Do(f)):h}calleeMap(t,n={}){return Zr(this.db,t,n)}crossFileCallerMap(t,n={}){return Io(this.db,t,n)}sourceFallbackCallerFiles(t){return vo(this.db,t)}callerFileMap(t,n={}){return ul(this.db,t,n)}frameworkReferencedSymbolIds(t){let n=new Map;for(let i of t){if(!i.leaf)continue;let o=n.get(i.leaf)??[];o.push(i.symbolId),n.set(i.leaf,o)}let r=new Set;for(let i of M(this.db,{includeIgnored:!1}))if(B(i)==="rust")for(let{name:o}of Rt(this.db,i,{includeRustAttributeNames:!0}))for(let s of n.get(o)??[])r.add(s);return r}symbolsWithNonSelfCallees(t,n={}){if(t.length===0)return new Set;let r=new Map(t.map(o=>[o.symbolId,o.symbol])),i=this.calleeMap(t,n);return new Set([...i.entries()].filter(([o,s])=>{let a=r.get(o);return s.some(c=>c.symbol!==a)}).map(([o])=>o))}fileDependencyGraph(t){return X(this.db,t)}fileKind(t){return G(t)}hasSuppressionComment(t){return Wi(this.db,t.relativePath,t.startLine)}sourceFiles(){return Ve(this.db)}scanSourceReferences(t,n){ml(this.db,t,n)}callableSignature(t){let n=Q(this.db,t.relativePath)?.callables.find(r=>r.startLine===t.startLine&&r.endLine===t.endLine);return n?{paramCount:n.paramCount}:null}};function Ry(e,t){return t.requireCallableSymbol?ae(e.symbol):t.requireFunctionLikeSymbol?Y(e.symbol):e.isFunctionLike}function Do(e){return e.endLine-e.startLine+1}function Iy(e){return(e.split("/").pop()??"").includes("types")}function No(e,t){let n=A(e,t);if(!n)return[];let r=T(n.symbol),o=new _(e).definitionsForFile(n.relativePath).filter(c=>ae(c.symbol)),s=o.filter(c=>c.parentTypeName===r||c.symbol.includes(r));return(s.length>0?s:Dy(vy(n.relativePath))===r?o.filter(c=>c.symbol.includes("<invalid-global-code>")):[]).map(c=>({startLine:c.startLine,endLine:c.endLine,name:T(c.symbol)}))}function Dy(e){return e.replace(/\.[^.]+$/,"")}function _o(e,t,n={}){let r=A(e,t);if(!r)return[];let o=!Y(r.symbol)&&!e.isIgnored(r.relativePath)?[{relativePath:r.relativePath,line:r.startLine}]:[],s=ht(e,r,{semantic:n.semantic}).map(u=>({relativePath:u.file,line:u.line})),a=Ny(e,r),c=new Set,l=[];for(let u of[...o,...s,...a]){let m=`${u.relativePath}:${u.line}`;c.has(m)||(c.add(m),l.push(u))}return l}function Ny(e,t){if(!t.relativePath.endsWith(".rb"))return[];let n=_y(t.symbol);if(n.length===0)return[];let r=[];for(let i of M(e,{extensions:[".rb"],includeIgnored:!1})){let o=P(e,i);if(!o)continue;let s=o.split(`
|
|
247
|
+
`);for(let a=0;a<s.length;a++){let c=s[a]??"";n.some(l=>new RegExp(`@${l}\\b|\\b${l}:`).test(c))&&r.push({relativePath:i,line:a})}}return r}function _y(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,""),r=n.split("_").filter(Boolean),i=new Set;return n&&i.add(n),r.length>=1&&i.add(r[r.length-1]),r.length>=2&&i.add(r.slice(-2).join("_")),[...i]}function Vn(e,t,n={}){let r=A(e,t);if(!r)return{definitions:[],referencedBy:[]};let i=e.get("SELECT display_name, documentation FROM global_symbols WHERE id = ?",r.symbolId),o=vt(i?.documentation??null),s=e.isIgnored(r.relativePath)?[]:[{relativePath:r.relativePath,startLine:r.startLine,endLine:r.endLine,signature:wy(o,i?.display_name??null,r.symbol),source:Ly(e,r.relativePath,r.startLine,r.endLine)}],a=ht(e,r,{semantic:n.semantic}).map(c=>({relativePath:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol,enclosingShort:c.enclosingSymbol?b(c.enclosingSymbol):"(top-level)"}));return{definitions:s,referencedBy:a}}function Ly(e,t,n,r){let i=P(e,t);if(!i)return null;let s=i.split(`
|
|
228
248
|
`).slice(n,r+1).join(`
|
|
229
|
-
`).trimEnd();return s.length>0?s:null}function
|
|
249
|
+
`).trimEnd();return s.length>0?s:null}function wy(e,t,n){let r=It(e);if(r&&!Ey(r))return r;let i=(t??"").trim();return i?Y(n)&&!i.endsWith("()")?`${i}()`:i:b(n)}function Ey(e){return e.startsWith("undefined")||e.includes("|")||e.includes("```")}function Wn(e,t){let n=pe(e,t);return n?e.all(`SELECT DISTINCT d2.relative_path
|
|
230
250
|
FROM mentions m
|
|
231
251
|
JOIN chunks c ON m.chunk_id = c.id
|
|
232
252
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -242,7 +262,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
242
262
|
WHERE d1.relative_path = ?
|
|
243
263
|
AND d2.relative_path <> d1.relative_path
|
|
244
264
|
AND ${e.localSymbolPredicate}
|
|
245
|
-
ORDER BY d2.relative_path`,n).filter(i=>!e.isIgnored(i.relative_path)).map(i=>({relativePath:i.relative_path})):[]}function
|
|
265
|
+
ORDER BY d2.relative_path`,n).filter(i=>!e.isIgnored(i.relative_path)).map(i=>({relativePath:i.relative_path})):[]}function Un(e,t){let n=pe(e,t);return n?e.all(`SELECT DISTINCT d1.relative_path
|
|
246
266
|
FROM mentions m
|
|
247
267
|
JOIN chunks c ON m.chunk_id = c.id
|
|
248
268
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -257,9 +277,9 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
257
277
|
JOIN documents d2 ON sym_def.document_id = d2.id
|
|
258
278
|
WHERE d2.relative_path = ?
|
|
259
279
|
AND d1.relative_path != ?
|
|
260
|
-
ORDER BY d1.relative_path`,n,n).filter(i=>!e.isIgnored(i.relative_path)).map(i=>({relativePath:i.relative_path})):[]}function
|
|
280
|
+
ORDER BY d1.relative_path`,n,n).filter(i=>!e.isIgnored(i.relative_path)).map(i=>({relativePath:i.relative_path})):[]}function Gn(e,t){let n=ln(e,t);if(n.length===0)return{files:[],symbols:[],dependsOn:[],dependedOnBy:[]};let r=n.map(()=>"?").join(", "),o=e.all(`SELECT relative_path FROM documents
|
|
261
281
|
WHERE relative_path IN (${r})
|
|
262
|
-
ORDER BY relative_path`,...n).map(m=>m.relative_path).filter(m=>!e.isIgnored(m)),s=
|
|
282
|
+
ORDER BY relative_path`,...n).map(m=>m.relative_path).filter(m=>!e.isIgnored(m)),s=Dr(e,o,{onlyDocumented:!0,sort:!0}).map(({relativePath:m,...d})=>d),c=e.all(`SELECT DISTINCT d2.relative_path
|
|
263
283
|
FROM mentions m
|
|
264
284
|
JOIN chunks c ON m.chunk_id = c.id
|
|
265
285
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -290,7 +310,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
290
310
|
JOIN documents d2 ON sym_def.document_id = d2.id
|
|
291
311
|
WHERE d2.relative_path IN (${r})
|
|
292
312
|
AND d1.relative_path NOT IN (${r})
|
|
293
|
-
ORDER BY d1.relative_path`,...n,...n).map(m=>m.relative_path).filter(m=>!e.isIgnored(m));return{files:o,symbols:s,dependsOn:c,dependedOnBy:u}}function
|
|
313
|
+
ORDER BY d1.relative_path`,...n,...n).map(m=>m.relative_path).filter(m=>!e.isIgnored(m));return{files:o,symbols:s,dependsOn:c,dependedOnBy:u}}function Jn(e,t){let n=ln(e,t);return n.length===0?[]:Fy([...ky(e,n),...Py(e,n)]).filter(r=>!e.isIgnored(r.relative_path)).map(Ty)}function ky(e,t){let n=t.map(()=>"?").join(", ");return e.all(`SELECT DISTINCT d1.relative_path, gs.symbol
|
|
294
314
|
FROM mentions m
|
|
295
315
|
JOIN chunks c ON m.chunk_id = c.id
|
|
296
316
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -317,7 +337,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
317
337
|
AND m.role != 1
|
|
318
338
|
AND ${e.localSymbolPredicate}
|
|
319
339
|
${e.pathExclusionsFor("d1")}
|
|
320
|
-
ORDER BY d1.relative_path`,...t,...t,...t)}function Wh(e,t){let n=new L(e);return t.flatMap(r=>n.definitionsForFile(r).filter(i=>ie(i.symbol)).map(i=>({relative_path:r,symbol:i.symbol})))}function Uh(e){let t=new Set;return e.filter(n=>{let r=`${n.relative_path}|${n.symbol}`;return t.has(r)?!1:(t.add(r),!0)})}function Gh(e){return{consumer:e.relative_path,symbol:e.symbol,shortName:b(e.symbol)}}var Hn=new WeakMap;function Gc(e,t){let n=$(t);return n==="rust"?Yh(e,t):n==="typescript"||n==="tsx"||n==="javascript"?zh(e,t):[]}var Jh=new Set(["describe","it","test","fdescribe","fit","xdescribe","xit","beforeEach","afterEach","beforeAll","afterAll","before","after","suite","bench","benchmark"]);function zh(e,t){let n=ce(e,t);if(!n)return[];let r=Hn.get(n);if(r)return r;let i=/(^|\/)(pages|app)\/.+\.(tsx?|jsx?)$/.test(t)||/(^|\/)(layout|page|loading|error|not-found|head|template|default)\.(tsx?|jsx?)$/.test(t),o=/(^|\/)src\/(pages|views|routes)\/.+\.(tsx?|jsx?|vue)$/.test(t),s=!1,a=n.rootNode;for(let l of a.namedChildren){if(l.type!=="expression_statement")continue;let u=l.namedChild(0);if(!u||u.type!=="call_expression")continue;let m=u.namedChild(0);if(!m)continue;let d=m.type==="member_expression"?m.namedChild(m.namedChildCount-1)?.text:m.text;if(d&&Jh.has(d)){s=!0;break}}let c=[];s&&c.push({startLine:0,endLine:a.endPosition.row,reason:"TS/JS test file (describe/it/test at top level)"}),(i||o)&&c.push({startLine:0,endLine:a.endPosition.row,reason:i?"Next.js / Remix route file":"Vite/Vue route component"});for(let l of a.namedChildren){let u=null,m=null;if(l.type==="function_declaration")u=l.namedChild(0)?.text??null,m=l;else if(l.type==="export_statement"){let d=l.namedChild(0);d?.type==="function_declaration"&&(u=d.namedChild(0)?.text??null,m=d)}else if(l.type==="lexical_declaration"){let d=l.namedChild(0);if(d?.type==="variable_declarator"){let p=d.namedChild(0)?.text,h=d.namedChild(1);p&&(h?.type==="arrow_function"||h?.type==="function_expression")&&(u=p,m=d)}}u&&/^use[A-Z]/.test(u)&&m&&c.push({startLine:m.startPosition.row,endLine:m.endPosition.row,reason:"React custom hook (use*)"})}return c.push(...Jc(n,new Set(["function_declaration","method_definition","class_declaration","interface_declaration","type_alias_declaration","enum_declaration","variable_declarator","export_statement"]),new Set(["comment"]))),Hn.set(n,c),c}var Qh=/scip-query[\s:-]*ignore[\s:-]*(?:dead(?:-code)?|stale)?/i;function Kh(e){return Qh.test(e)}function Jc(e,t,n){let r=[],i=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(Kh(u.text)){r.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)i(s)};return i(e.rootNode),r}function Yh(e,t){let n=ce(e,t);if(!n)return[];let r=Hn.get(n);if(r)return r;let i=[],o=Xh(n);return o?(Hn.set(n,o),o):(zc(n.rootNode,i,!1,!1),i.push(...Jc(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"]))),i.push(...sy(n.rootNode)),Hn.set(n,i),i)}function Xh(e){return ay(e.rootNode)?[{startLine:0,endLine:e.rootNode.endPosition.row,reason:"generated file (@generated header)"}]:null}function zc(e,t,n,r){let i=n,o=r;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"?Zh(e,t,n,r):r&&oy(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"?ey(e,t,n):e.type==="mod_item"&&mo(e).some(s=>/#\[\s*cfg\s*\(\s*test\s*\)/.test(s))&&(i=!0);for(let s of e.namedChildren)zc(s,t,i,o)}function Zh(e,t,n,r){let i=mo(e),o=null;r?o="trait impl method (dynamic dispatch)":n&&(o="inside #[cfg(test)] mod");for(let s of i){let a=ny(s);if(a){o=a;break}if(Qc(s)){o="#[allow(dead_code)]";break}}o&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:o})}function ey(e,t,n){let r=mo(e),i=e.namedChildren.find(o=>o.type==="type_identifier")?.text;r.some(iy)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[derive(<reflective>)] \u2014 fields accessed via macro/reflection",containerName:i}),r.some(Qc)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[allow(dead_code)]",containerName:i}),n&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"inside #[cfg(test)] mod",containerName:i})}function mo(e){let t=e.parent;if(!t)return[];let n=t.children,r=-1;for(let o=0;o<n.length;o+=1)if(n[o].startIndex===e.startIndex&&n[o].type===e.type){r=o;break}if(r<=0)return[];let i=[];for(let o=r-1;o>=0;o-=1){let s=n[o];if(s.type==="attribute_item"||s.type==="inner_attribute_item")i.push(s.text);else{if(s.type==="line_comment"||s.type==="block_comment")continue;break}}return i}var ty=[{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 ny(e){return ty.find(({re:t})=>t.test(e))?.reason??null}var ry=[/\bSerialize\b/,/\bDeserialize\b/,/\bFromRow\b/,/\bsqlx::FromRow\b/,/\bDeriveEntityModel\b/,/\bIntoSchema\b/,/\bToSchema\b/,/\bDeriveValueType\b/,/\bError\b/,/\bthiserror::Error\b/];function iy(e){return/#\[\s*derive\s*\(/.test(e)?ry.some(t=>t.test(e)):!1}function Qc(e){return/#\[\s*allow\s*\(\s*dead_code\s*\)/.test(e)}function oy(e){return e.type==="const_item"||e.type==="type_item"||e.type==="static_item"||e.type==="associated_type"}function sy(e){let t=ly(e);if(t.size===0)return[];let n=[];for(let r of e.descendantsOfType("mod_item")){let i=r.childForFieldName("name")?.text;i&&t.has(i)&&n.push({startLine:r.startPosition.row,endLine:r.endPosition.row,reason:'serde `with = "..."` module \u2014 body invoked via reflection',containerName:i})}return n}function ay(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 cy=/^#!?\[\s*serde\s*\(/,Uc=/\bwith\s*=\s*"([^"]+)"/g;function ly(e){let t=new Set;for(let n of e.descendantsOfType("attribute_item")){if(!cy.test(n.text))continue;Uc.lastIndex=0;let r;for(;(r=Uc.exec(n.text))!==null;){let i=r[1],o=i.split("::").pop()??i;o&&t.add(o)}}return t}function Kc(e){let t=new Map,n=r=>{let i=t.get(r);if(i)return i;let o=Gc(e,r);return i={ranges:o.map(s=>({startLine:s.startLine,endLine:s.endLine})),containers:new Set(o.map(s=>s.containerName).filter(s=>!!s))},t.set(r,i),i};return(r,i,o,s)=>{let a=n(r);for(let c of a.ranges)if(i>=c.startLine&&i<=c.endLine)return!0;if(s&&a.containers.has(s))return!0;for(let c of gr(o))if(a.containers.has(c))return!0;return!1}}function po(e,t={}){Li(e,{groups:t.semanticProvider===!0?["whole-project","semantic-provider"]:["whole-project"]})}function fo(e,t,n={}){Li(e,{groups:n.definitions===!0?["source-file","definition-catalog"]:["source-file"],file:t.replace(/\\/g,"/")})}function Xc(e,t){return t.isIgnoredPath(e.relativePath)?Be("ignored-file"):ot(e.symbol)?Be("module-like-symbol"):Yc(e.symbol)?!e.isFunctionLike&&e.enclosingSymbol&&Yc(e.enclosingSymbol)?Be("nested-non-callable-value"):!t.includeTests&&!go(e.relativePath)?Be("test-file"):!t.includeTests&&t.isExcludedRegion(e.relativePath,e.startLine,e.symbol,e.parentTypeName)?Be("excluded-file-region"):dr(e.symbol)?Be("rust-trait-impl-member"):Kt(e.symbol)?Be("rust-test-module"):!t.includeMembers&&!uy(e)?Be("member"):e.endLine-e.startLine+1<t.minLoc?Be("below-min-loc"):{accepted:!0}:Be("non-value-symbol")}function go(e){return G(e)!=="test"}function Be(e){return{accepted:!1,rejectionReason:e}}function Yc(e){return Y(e)||e.endsWith("().")||e.endsWith(".")}function uy(e){return ie(e.symbol)||gr(e.symbol).length===0}function B(e){return e.endLine-e.startLine+1}function Vr(e,t){return B(e)-B(t)||e.relativePath.localeCompare(t.relativePath)}function Ie(e,t){return typeof t!="number"||t<=0||e.length<=t?e:e.slice(0,t)}function dn(e){let t=new Set,n=[];for(let r of e){let i=`${r.symbol}|${r.file}`;t.has(i)||(t.add(i),n.push(r))}return n}function Zc(){return new Map}function el(e,t,n){let r=new Map;for(let i of uc(e,n))e.isIgnored(i.relative_path)||t.has(i.relative_path)||Wr(r,i.symbol_id,i.relative_path,i.ref_count,"scip-mention");return r}function tl(e,t,n){let r=new Set;for(let i of mc(e,t))e.isIgnored(i.relative_path)||n.has(i.relative_path)||r.add(i.symbol_id);return r}function ho(e,t){let n=e.get(t);if(!n)return!1;for(let r of n.values())if(r.occurrences>0)return!0;return!1}function nl(e){return e?.occurrences??0}function Wr(e,t,n,r,i="source-fallback"){if(r<=0)return;let o=il(e,t,n);o.occurrences+=r,o.sources.add(i)}function rl(e,t,n,r,i){if(r<=0)return;let o=il(e,t,n);o.occurrences=Math.max(r,o.occurrences),o.sources.add(i)}function il(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=r.get(n);return i||(i={occurrences:0,sources:new Set},r.set(n,i)),i}function ze(e,t={}){let{scope:n,minLoc:r=1,includeTests:i=!1,skipBarrels:o=!1,includeMembers:s=!1,deadCodeOnly:a=!1,scanLimit:c,semantic:l=!0}=t,u=Ie(my(e,{scope:n,minLoc:r,includeTests:i,includeMembers:s}),c),m=o?new Set(ac(e)):new Set,d=a?Zc():el(e,m,u.map(C=>C.symbolId)),p=a?tl(e,u.map(C=>C.symbolId),m):new Set,h=a?u.filter(C=>!p.has(C.symbolId)):u;a?hy(e,h,d,m):gy(e,h,d,m);let f=a?h.filter(C=>!ho(d,C.symbolId)):u;Cy(e,f,d,{includeTests:i,inactiveBarrelPaths:m,includeSemantic:!a&&l});let y=a?h.filter(C=>!ho(d,C.symbolId)):u;return fy(e,dy(y,d))}function my(e,t){let n=Kc(e),r=[];for(let i of A(e,{scope:t.scope}))try{for(let o of H(e,i))Xc(o,{minLoc:t.minLoc,includeTests:t.includeTests,includeMembers:t.includeMembers,isIgnoredPath:a=>e.isIgnored(a),isExcludedRegion:n}).accepted&&r.push(o)}finally{fo(e,i,{definitions:!0})}return r}function dy(e,t){return e.map(n=>py(n,t)).filter(n=>n.cross_file_refs===0).sort((n,r)=>r.loc-n.loc||n.relative_path.localeCompare(r.relative_path)||n.start_line-r.start_line)}function py(e,t){let n=t.get(e.symbolId)??new Map,r=nl(n.get(e.relativePath)),i=0;for(let[o,s]of n)o!==e.relativePath&&(i+=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:r,cross_file_refs:i}}function fy(e,t){let n=[],r=0,i=0,o=0;for(let s of t){if(e.isIgnored(s.relative_path)||le(e,s.relative_path)||ne(e,s.symbol,s.relative_path))continue;let a=s.same_file_refs===0?"dead-code":"file-internal";a==="dead-code"?r++:i++,o+=s.loc,n.push({relativePath:s.relative_path,startLine:s.start_line,endLine:s.end_line,loc:s.loc,symbol:s.symbol,shortName:b(s.symbol),sameFileRefs:s.same_file_refs,kind:a})}return{symbols:n,totalCount:n.length,deadCodeCount:r,fileInternalCount:i,totalLoc:o}}function gy(e,t,n,r){if(t.length===0)return;let i=new L(e),o=new Set(t.map(c=>c.symbolId)),s=new Set(t.map(c=>c.leaf).filter(Boolean)),a=new Set(i.sourceFiles());for(let c of A(e))a.add(c);i.scanSourceReferences({paths:a,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:s,skipPath:c=>r.has(c)},c=>{o.has(c.target.symbolId)&&(Sy(e,c)||Wr(n,c.target.symbolId,c.sourceFile,xy(c),"source-fallback"))})}function hy(e,t,n,r){if(t.length===0)return;let i=new L(e),o=yy(t),s=new Set(i.sourceFiles());for(let u of A(e))s.add(u);let a=new Set(o.keys()),c=new Map,l=u=>{let m=c.get(u);return m||(m=Hr(e,u),c.set(u,m)),m};i.scanSourceReferences({paths:s,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:a,skipPath:u=>r.has(u),resolveTargets:({sourceFile:u,name:m,kind:d})=>{let p=o.get(m);return p?by(u,m,p,l(u),{permissive:d!=="cross-language-dispatch"}):[]},afterPath:u=>{c.delete(u),fo(e,u)}},u=>{let m=u.kind==="identifier"&&u.sourceFile===u.target.relativePath?Math.max(0,u.occurrences-1):u.occurrences;u.kind==="identifier"&&ol(e,{sourceFile:u.sourceFile,name:u.name,target:u.target,occurrences:m})||Wr(n,u.target.symbolId,u.sourceFile,m,"source-fallback")})}function yy(e){let t=new Map;for(let n of e){if(!n.leaf)continue;let r=t.get(n.leaf)??[];r.push(n),t.set(n.leaf,r)}return t}function by(e,t,n,r,i){let o=n.filter(c=>c.relativePath===e);if(o.length>0)return o;if(!i.permissive&&n.length===1)return[...n];let s=r.get(t);if(s)for(let c of s){let l=n.filter(u=>mt(c,u.relativePath));if(l.length>0)return l}let a=new Set;for(let c of r.values())for(let l of c)a.add(l);for(let c of a){let l=n.filter(u=>mt(c,u.relativePath));if(l.length>0&&l.length===n.length)return l}return i.permissive?[...n]:[]}function Sy(e,t){return t.kind==="cross-language-dispatch"&&t.target.relativePath===t.sourceFile?!0:t.kind==="identifier"&&ol(e,t)}function xy(e){return e.kind==="identifier"&&e.target.relativePath===e.sourceFile?Math.max(0,e.occurrences-1):e.occurrences}function ol(e,t){return t.occurrences>1?!1:te(e,t.sourceFile).some(n=>n.used||n.sourcePath!==t.target.relativePath?!1:n.importedName===t.name||n.localName===t.name)}function Cy(e,t,n,r){for(let i of t){let o=Re(e,i,{semantic:r.includeSemantic!==!1});if(o.length!==0)for(let s of o){let a=s.file;a===i.relativePath||e.isIgnored(a)||r.inactiveBarrelPaths.has(a)||!r.includeTests&&!go(a)||rl(n,i.symbolId,a,1,"caller-map")}}}function yo(e,t={}){let{limit:n=30,scope:r}=t,i=r?`AND def_d.relative_path LIKE '%${r}%'`:"",s=e.all(`SELECT
|
|
340
|
+
ORDER BY d1.relative_path`,...t,...t,...t)}function Py(e,t){let n=new _(e);return t.flatMap(r=>n.definitionsForFile(r).filter(i=>ae(i.symbol)).map(i=>({relative_path:r,symbol:i.symbol})))}function Fy(e){let t=new Set;return e.filter(n=>{let r=`${n.relative_path}|${n.symbol}`;return t.has(r)?!1:(t.add(r),!0)})}function Ty(e){return{consumer:e.relative_path,symbol:e.symbol,shortName:b(e.symbol)}}var zn=new WeakMap;function pl(e,t){let n=B(t);return n==="rust"?jy(e,t):n==="typescript"||n==="tsx"||n==="javascript"?My(e,t):[]}var Ay=new Set(["describe","it","test","fdescribe","fit","xdescribe","xit","beforeEach","afterEach","beforeAll","afterAll","before","after","suite","bench","benchmark"]);function My(e,t){let n=ue(e,t);if(!n)return[];let r=zn.get(n);if(r)return r;let i=/(^|\/)(pages|app)\/.+\.(tsx?|jsx?)$/.test(t)||/(^|\/)(layout|page|loading|error|not-found|head|template|default)\.(tsx?|jsx?)$/.test(t),o=/(^|\/)src\/(pages|views|routes)\/.+\.(tsx?|jsx?|vue)$/.test(t),s=!1,a=n.rootNode;for(let l of a.namedChildren){if(l.type!=="expression_statement")continue;let u=l.namedChild(0);if(!u||u.type!=="call_expression")continue;let m=u.namedChild(0);if(!m)continue;let d=m.type==="member_expression"?m.namedChild(m.namedChildCount-1)?.text:m.text;if(d&&Ay.has(d)){s=!0;break}}let c=[];s&&c.push({startLine:0,endLine:a.endPosition.row,reason:"TS/JS test file (describe/it/test at top level)"}),(i||o)&&c.push({startLine:0,endLine:a.endPosition.row,reason:i?"Next.js / Remix route file":"Vite/Vue route component"});for(let l of a.namedChildren){let u=null,m=null;if(l.type==="function_declaration")u=l.namedChild(0)?.text??null,m=l;else if(l.type==="export_statement"){let d=l.namedChild(0);d?.type==="function_declaration"&&(u=d.namedChild(0)?.text??null,m=d)}else if(l.type==="lexical_declaration"){let d=l.namedChild(0);if(d?.type==="variable_declarator"){let p=d.namedChild(0)?.text,h=d.namedChild(1);p&&(h?.type==="arrow_function"||h?.type==="function_expression")&&(u=p,m=d)}}u&&/^use[A-Z]/.test(u)&&m&&c.push({startLine:m.startPosition.row,endLine:m.endPosition.row,reason:"React custom hook (use*)"})}return c.push(...fl(n,new Set(["function_declaration","method_definition","class_declaration","interface_declaration","type_alias_declaration","enum_declaration","variable_declarator","export_statement"]),new Set(["comment"]))),zn.set(n,c),c}var Oy=/scip-query[\s:-]*ignore[\s:-]*(?:dead(?:-code)?|stale)?/i;function $y(e){return Oy.test(e)}function fl(e,t,n){let r=[],i=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($y(u.text)){r.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)i(s)};return i(e.rootNode),r}function jy(e,t){let n=ue(e,t);if(!n)return[];let r=zn.get(n);if(r)return r;let i=[],o=By(n);return o?(zn.set(n,o),o):(gl(n.rootNode,i,!1,!1),i.push(...fl(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"]))),i.push(...zy(n.rootNode)),zn.set(n,i),i)}function By(e){return Ky(e.rootNode)?[{startLine:0,endLine:e.rootNode.endPosition.row,reason:"generated file (@generated header)"}]:null}function gl(e,t,n,r){let i=n,o=r;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"?Hy(e,t,n,r):r&&Jy(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"?qy(e,t,n):e.type==="mod_item"&&Lo(e).some(s=>/#\[\s*cfg\s*\(\s*test\s*\)/.test(s))&&(i=!0);for(let s of e.namedChildren)gl(s,t,i,o)}function Hy(e,t,n,r){let i=Lo(e),o=null;r?o="trait impl method (dynamic dispatch)":n&&(o="inside #[cfg(test)] mod");for(let s of i){let a=Wy(s);if(a){o=a;break}if(hl(s)){o="#[allow(dead_code)]";break}}o&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:o})}function qy(e,t,n){let r=Lo(e),i=e.namedChildren.find(o=>o.type==="type_identifier")?.text;r.some(Gy)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[derive(<reflective>)] \u2014 fields accessed via macro/reflection",containerName:i}),r.some(hl)&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"#[allow(dead_code)]",containerName:i}),n&&t.push({startLine:e.startPosition.row,endLine:e.endPosition.row,reason:"inside #[cfg(test)] mod",containerName:i})}function Lo(e){let t=e.parent;if(!t)return[];let n=t.children,r=-1;for(let o=0;o<n.length;o+=1)if(n[o].startIndex===e.startIndex&&n[o].type===e.type){r=o;break}if(r<=0)return[];let i=[];for(let o=r-1;o>=0;o-=1){let s=n[o];if(s.type==="attribute_item"||s.type==="inner_attribute_item")i.push(s.text);else{if(s.type==="line_comment"||s.type==="block_comment")continue;break}}return i}var Vy=[{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 Wy(e){return Vy.find(({re:t})=>t.test(e))?.reason??null}var Uy=[/\bSerialize\b/,/\bDeserialize\b/,/\bFromRow\b/,/\bsqlx::FromRow\b/,/\bDeriveEntityModel\b/,/\bIntoSchema\b/,/\bToSchema\b/,/\bDeriveValueType\b/,/\bError\b/,/\bthiserror::Error\b/];function Gy(e){return/#\[\s*derive\s*\(/.test(e)?Uy.some(t=>t.test(e)):!1}function hl(e){return/#\[\s*allow\s*\(\s*dead_code\s*\)/.test(e)}function Jy(e){return e.type==="const_item"||e.type==="type_item"||e.type==="static_item"||e.type==="associated_type"}function zy(e){let t=Yy(e);if(t.size===0)return[];let n=[];for(let r of e.descendantsOfType("mod_item")){let i=r.childForFieldName("name")?.text;i&&t.has(i)&&n.push({startLine:r.startPosition.row,endLine:r.endPosition.row,reason:'serde `with = "..."` module \u2014 body invoked via reflection',containerName:i})}return n}function Ky(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 Qy=/^#!?\[\s*serde\s*\(/,dl=/\bwith\s*=\s*"([^"]+)"/g;function Yy(e){let t=new Set;for(let n of e.descendantsOfType("attribute_item")){if(!Qy.test(n.text))continue;dl.lastIndex=0;let r;for(;(r=dl.exec(n.text))!==null;){let i=r[1],o=i.split("::").pop()??i;o&&t.add(o)}}return t}function yl(e){let t=new Map,n=r=>{let i=t.get(r);if(i)return i;let o=pl(e,r);return i={ranges:o.map(s=>({startLine:s.startLine,endLine:s.endLine})),containers:new Set(o.map(s=>s.containerName).filter(s=>!!s))},t.set(r,i),i};return(r,i,o,s)=>{let a=n(r);for(let c of a.ranges)if(i>=c.startLine&&i<=c.endLine)return!0;if(s&&a.containers.has(s))return!0;for(let c of _r(o))if(a.containers.has(c))return!0;return!1}}function wo(e,t={}){Hi(e,{groups:t.semanticProvider===!0?["whole-project","semantic-provider"]:["whole-project"]})}function Eo(e,t,n={}){Hi(e,{groups:n.definitions===!0?["source-file","definition-catalog"]:["source-file"],file:t.replace(/\\/g,"/")})}function Sl(e,t){return t.isIgnoredPath(e.relativePath)?We("ignored-file"):ct(e.symbol)?We("module-like-symbol"):bl(e.symbol)?!e.isFunctionLike&&e.enclosingSymbol&&bl(e.enclosingSymbol)?We("nested-non-callable-value"):!t.includeTests&&!ko(e.relativePath)?We("test-file"):!t.includeTests&&t.isExcludedRegion(e.relativePath,e.startLine,e.symbol,e.parentTypeName)?We("excluded-file-region"):vr(e.symbol)?We("rust-trait-impl-member"):nn(e.symbol)?We("rust-test-module"):!t.includeMembers&&!Xy(e)?We("member"):e.endLine-e.startLine+1<t.minLoc?We("below-min-loc"):{accepted:!0}:We("non-value-symbol")}function ko(e){return G(e)!=="test"}function We(e){return{accepted:!1,rejectionReason:e}}function bl(e){return Y(e)||e.endsWith("().")||e.endsWith(".")}function Xy(e){return ae(e.symbol)||_r(e.symbol).length===0}function q(e){return e.endLine-e.startLine+1}function ei(e,t){return q(e)-q(t)||e.relativePath.localeCompare(t.relativePath)}function Ne(e,t){return typeof t!="number"||t<=0||e.length<=t?e:e.slice(0,t)}function Sn(e){let t=new Set,n=[];for(let r of e){let i=`${r.symbol}|${r.file}`;t.has(i)||(t.add(i),n.push(r))}return n}function xl(){return new Map}function Cl(e,t,n){let r=new Map;for(let i of kc(e,n))e.isIgnored(i.relative_path)||t.has(i.relative_path)||ti(r,i.symbol_id,i.relative_path,i.ref_count,"scip-mention");return r}function Rl(e,t,n){let r=new Set;for(let i of Pc(e,t))e.isIgnored(i.relative_path)||n.has(i.relative_path)||r.add(i.symbol_id);return r}function Po(e,t){let n=e.get(t);if(!n)return!1;for(let r of n.values())if(r.occurrences>0)return!0;return!1}function Il(e){return e?.occurrences??0}function ti(e,t,n,r,i="source-fallback"){if(r<=0)return;let o=Dl(e,t,n);o.occurrences+=r,o.sources.add(i)}function vl(e,t,n,r,i){if(r<=0)return;let o=Dl(e,t,n);o.occurrences=Math.max(r,o.occurrences),o.sources.add(i)}function Dl(e,t,n){let r=e.get(t);r||(r=new Map,e.set(t,r));let i=r.get(n);return i||(i={occurrences:0,sources:new Set},r.set(n,i)),i}function Xe(e,t={}){let{scope:n,minLoc:r=1,includeTests:i=!1,skipBarrels:o=!1,includeMembers:s=!1,deadCodeOnly:a=!1,scanLimit:c,semantic:l=!0}=t,u=Ne(Zy(e,{scope:n,minLoc:r,includeTests:i,includeMembers:s}),c),m=o?new Set(Lc(e)):new Set,d=a?xl():Cl(e,m,u.map(R=>R.symbolId)),p=a?Rl(e,u.map(R=>R.symbolId),m):new Set,h=a?u.filter(R=>!p.has(R.symbolId)):u;a?ib(e,h,d,m):rb(e,h,d,m);let f=a?h.filter(R=>!Po(d,R.symbolId)):u;lb(e,f,d,{includeTests:i,inactiveBarrelPaths:m,includeSemantic:!a&&l});let y=a?h.filter(R=>!Po(d,R.symbolId)):u;return nb(e,eb(y,d))}function Zy(e,t){let n=yl(e),r=[];for(let i of M(e,{scope:t.scope}))try{for(let o of W(e,i))Sl(o,{minLoc:t.minLoc,includeTests:t.includeTests,includeMembers:t.includeMembers,isIgnoredPath:a=>e.isIgnored(a),isExcludedRegion:n}).accepted&&r.push(o)}finally{Eo(e,i,{definitions:!0})}return r}function eb(e,t){return e.map(n=>tb(n,t)).filter(n=>n.cross_file_refs===0).sort((n,r)=>r.loc-n.loc||n.relative_path.localeCompare(r.relative_path)||n.start_line-r.start_line)}function tb(e,t){let n=t.get(e.symbolId)??new Map,r=Il(n.get(e.relativePath)),i=0;for(let[o,s]of n)o!==e.relativePath&&(i+=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:r,cross_file_refs:i}}function nb(e,t){let n=[],r=0,i=0,o=0;for(let s of t){if(e.isIgnored(s.relative_path)||me(e,s.relative_path)||oe(e,s.symbol,s.relative_path))continue;let a=s.same_file_refs===0?"dead-code":"file-internal";a==="dead-code"?r++:i++,o+=s.loc,n.push({relativePath:s.relative_path,startLine:s.start_line,endLine:s.end_line,loc:s.loc,symbol:s.symbol,shortName:b(s.symbol),sameFileRefs:s.same_file_refs,kind:a})}return{symbols:n,totalCount:n.length,deadCodeCount:r,fileInternalCount:i,totalLoc:o}}function rb(e,t,n,r){if(t.length===0)return;let i=new _(e),o=new Set(t.map(c=>c.symbolId)),s=new Set(t.map(c=>c.leaf).filter(Boolean)),a=new Set(i.sourceFiles());for(let c of M(e))a.add(c);i.scanSourceReferences({paths:a,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:s,skipPath:c=>r.has(c)},c=>{o.has(c.target.symbolId)&&(ab(e,c)||ti(n,c.target.symbolId,c.sourceFile,cb(c),"source-fallback"))})}function ib(e,t,n,r){if(t.length===0)return;let i=new _(e),o=ob(t),s=new Set(i.sourceFiles());for(let u of M(e))s.add(u);let a=new Set(o.keys()),c=new Map,l=u=>{let m=c.get(u);return m||(m=Xr(e,u),c.set(u,m)),m};i.scanSourceReferences({paths:s,includeVueSfc:!0,includeCrossLanguageDispatchNames:!0,includeRustAttributeNames:!0,identifierResolution:"permissive",candidateNames:a,skipPath:u=>r.has(u),resolveTargets:({sourceFile:u,name:m,kind:d})=>{let p=o.get(m);return p?sb(u,m,p,l(u),{permissive:d!=="cross-language-dispatch"}):[]},afterPath:u=>{c.delete(u),Eo(e,u)}},u=>{let m=u.kind==="identifier"&&u.sourceFile===u.target.relativePath?Math.max(0,u.occurrences-1):u.occurrences;u.kind==="identifier"&&Nl(e,{sourceFile:u.sourceFile,name:u.name,target:u.target,occurrences:m})||ti(n,u.target.symbolId,u.sourceFile,m,"source-fallback")})}function ob(e){let t=new Map;for(let n of e){if(!n.leaf)continue;let r=t.get(n.leaf)??[];r.push(n),t.set(n.leaf,r)}return t}function sb(e,t,n,r,i){let o=n.filter(c=>c.relativePath===e);if(o.length>0)return o;if(!i.permissive&&n.length===1)return[...n];let s=r.get(t);if(s)for(let c of s){let l=n.filter(u=>ft(c,u.relativePath));if(l.length>0)return l}let a=new Set;for(let c of r.values())for(let l of c)a.add(l);for(let c of a){let l=n.filter(u=>ft(c,u.relativePath));if(l.length>0&&l.length===n.length)return l}return i.permissive?[...n]:[]}function ab(e,t){return t.kind==="cross-language-dispatch"&&t.target.relativePath===t.sourceFile?!0:t.kind==="identifier"&&Nl(e,t)}function cb(e){return e.kind==="identifier"&&e.target.relativePath===e.sourceFile?Math.max(0,e.occurrences-1):e.occurrences}function Nl(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 lb(e,t,n,r){for(let i of t){let o=De(e,i,{semantic:r.includeSemantic!==!1});if(o.length!==0)for(let s of o){let a=s.file;a===i.relativePath||e.isIgnored(a)||r.inactiveBarrelPaths.has(a)||!r.includeTests&&!ko(a)||vl(n,i.symbolId,a,1,"caller-map")}}}function Fo(e,t={}){let{limit:n=30,scope:r}=t,i=r?`AND def_d.relative_path LIKE '%${r}%'`:"",s=e.all(`SELECT
|
|
321
341
|
gs.symbol,
|
|
322
342
|
COUNT(*) AS ref_count,
|
|
323
343
|
COUNT(DISTINCT ref_d.id) AS file_count,
|
|
@@ -340,14 +360,14 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
340
360
|
${i}
|
|
341
361
|
GROUP BY gs.id
|
|
342
362
|
ORDER BY ref_count DESC
|
|
343
|
-
LIMIT ?`,n).filter(a=>!e.isIgnored(a.defined_in)).map(a=>({symbol:a.symbol,shortName:b(a.symbol),refCount:a.ref_count,fileCount:a.file_count,definedIn:a.defined_in}));return s.length>0?s:
|
|
363
|
+
LIMIT ?`,n).filter(a=>!e.isIgnored(a.defined_in)).map(a=>({symbol:a.symbol,shortName:b(a.symbol),refCount:a.ref_count,fileCount:a.file_count,definedIn:a.defined_in}));return s.length>0?s:ub(e,r,n)}function ub(e,t,n){return He(e,{scope:t}).filter(r=>!e.isIgnored(r.relativePath)).map(r=>mb(e,r)).filter(r=>r.refCount>0).sort((r,i)=>i.refCount-r.refCount||i.fileCount-r.fileCount).slice(0,n)}function mb(e,t){let n=De(e,t,{limit:500});return{symbol:t.symbol,shortName:b(t.symbol),refCount:n.length,fileCount:new Set(n.map(r=>r.file)).size,definedIn:t.relativePath}}function To(e,t,n={}){return Ll(e,t,n)?.map(r=>({symbol:r.symbol,shortName:r.shortName,fromFile:r.fromFile}))??[]}function Ao(e,t){let n=db(e,t);return n.length>0?n:pb(e,t)}function Mo(e,t,n={}){return Ll(e,t,n)?.filter(r=>!r.used).map(r=>({symbol:r.symbol,shortName:r.shortName,importedIn:r.importer}))??[]}function db(e,t){return e.all(`SELECT DISTINCT gs.symbol, d.relative_path AS importer
|
|
344
364
|
FROM mentions m
|
|
345
365
|
JOIN chunks c ON m.chunk_id = c.id
|
|
346
366
|
JOIN documents d ON c.document_id = d.id
|
|
347
367
|
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
348
368
|
WHERE gs.symbol LIKE ?
|
|
349
369
|
AND m.role = 2
|
|
350
|
-
ORDER BY d.relative_path`,`%${t}%`).filter(r=>!e.isIgnored(r.importer)).map(r=>({symbol:r.symbol,shortName:b(r.symbol),fromFile:r.importer}))}function
|
|
370
|
+
ORDER BY d.relative_path`,`%${t}%`).filter(r=>!e.isIgnored(r.importer)).map(r=>({symbol:r.symbol,shortName:b(r.symbol),fromFile:r.importer}))}function pb(e,t){let n=A(e,t),r=n?.relativePath??null,i=n?T(n.symbol):t.replace(/\(\)$/,""),o=n?ct(n.symbol):!1,s=new Set;for(let a of M(e,{includeIgnored:!1}))for(let c of ie(e,a))fb(c,a,{targetFile:r,targetLeaf:i,targetIsModule:o})&&s.add(a);return[...s].sort().map(a=>({symbol:n?.symbol??i,shortName:n?b(n.symbol):i,fromFile:a}))}function fb(e,t,n){return!e.sourcePath||n.targetFile&&_l(e.sourcePath)!==_l(n.targetFile)?!1:e.kind==="side-effect"||n.targetFile&&bb(t)||n.targetIsModule||e.kind==="named"&&e.importedName===n.targetLeaf?!0:e.kind==="namespace"&&e.usedMembers.includes(n.targetLeaf)}function Ll(e,t,n={}){let r=pe(e,t);return r?gb(e,r,n)??(n.semantic===!1?null:hb(e,r))??yb(e,r):null}function gb(e,t,n){let i=e.all(`SELECT DISTINCT
|
|
351
371
|
gs.symbol,
|
|
352
372
|
def_d.relative_path AS from_file,
|
|
353
373
|
imp_d.relative_path AS importer,
|
|
@@ -373,11 +393,11 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
373
393
|
LEFT JOIN documents def_d ON sym_def.document_id = def_d.id
|
|
374
394
|
WHERE imp_d.relative_path = ?
|
|
375
395
|
AND m.role = 2
|
|
376
|
-
ORDER BY def_d.relative_path, gs.symbol`,t).filter(o=>!e.isIgnored(o.importer));if(i.length>0){let o=n.semantic===!1?[]:
|
|
396
|
+
ORDER BY def_d.relative_path, gs.symbol`,t).filter(o=>!e.isIgnored(o.importer));if(i.length>0){let o=n.semantic===!1?[]:Hn(e,t);return i.map(s=>({symbol:s.symbol,shortName:b(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 hb(e,t){let n=Hn(e,t);return n.length>0?n.map(r=>{let i=wl(r.importedName,r.localName,r.kind);return{symbol:i,shortName:i,fromFile:r.sourcePath??"(external)",importer:t,used:r.kind==="side-effect"?!0:r.isUsed}}):null}function yb(e,t){return ie(e,t).map(n=>{let r=wl(n.importedName,n.localName,n.kind),i=n.kind==="side-effect"?!0:n.used;return{symbol:r,shortName:r,fromFile:n.sourcePath??"(external)",importer:t,used:i}})}function wl(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 _l(e){return e.replace(/\\/g,"/")}function bb(e){return/\.(?:c|h|cc|cpp|cxx|hpp|hh|hxx)$/i.test(e)}function Oo(e,t){let n=ln(e,t),r=Dr(e,n,{sort:!0});if(r.length===0)return[];let i=r.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 i)o.set(a.symbol,a);let s=[];for(let a=0;a<r.length;a++){let c=r[a],l=i[a];if(c.enclosingSymbol&&o.has(c.enclosingSymbol)){o.get(c.enclosingSymbol).children.push(l);continue}let u=null,m=1/0;for(let d of i)if(d!==l&&d.startLine<=l.startLine&&d.endLine>=l.endLine){if(d.startLine===l.startLine&&d.endLine===l.endLine&&!qa(d.symbol,l.symbol))continue;let h=d.endLine-d.startLine;h<m&&(m=h,u=d)}u?u.children.push(l):s.push(l)}return s}function $o(e,t){let n=A(e,t);return n?new _(e).definitionsForFile(n.relativePath).filter(i=>i.symbol!==n.symbol).filter(i=>Ha(n.symbol,i.symbol)).sort((i,o)=>i.startLine-o.startLine||i.endLine-o.endLine).map(i=>({symbol:i.symbol,shortName:b(i.symbol),startLine:i.startLine,endLine:i.endLine,kind:re(i.symbol)??"unknown"})):[]}function jo(e,t){let n=A(e,t);if(!n)return[];let r=e.get(`SELECT COUNT(DISTINCT c.document_id) AS file_count
|
|
377
397
|
FROM mentions m
|
|
378
398
|
JOIN chunks c ON m.chunk_id = c.id
|
|
379
399
|
WHERE m.symbol_id = ?
|
|
380
|
-
AND m.role != 1`,n.symbolId);return[{name:b(n.symbol),count:r?.file_count??0}]}function
|
|
400
|
+
AND m.role != 1`,n.symbolId);return[{name:b(n.symbol),count:r?.file_count??0}]}function Bo(e,t){let n=pe(e,t);if(!n)return[];let i=e.all(`SELECT d.relative_path, COUNT(DISTINCT gs.id) AS symbol_count
|
|
381
401
|
FROM mentions m
|
|
382
402
|
JOIN chunks c ON m.chunk_id = c.id
|
|
383
403
|
JOIN documents d ON c.document_id = d.id
|
|
@@ -394,7 +414,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
394
414
|
AND m.role != 1
|
|
395
415
|
AND def_d.id != d.id
|
|
396
416
|
GROUP BY d.id
|
|
397
|
-
ORDER BY symbol_count DESC`,n).filter(a=>!e.isIgnored(a.relative_path)).map(a=>({name:a.relative_path,count:a.symbol_count}));if(i.length>0)return i;let s=
|
|
417
|
+
ORDER BY symbol_count DESC`,n).filter(a=>!e.isIgnored(a.relative_path)).map(a=>({name:a.relative_path,count:a.symbol_count}));if(i.length>0)return i;let s=X(e).get(n);return!s||s.size===0?[]:[{name:n,count:s.size}]}function Ho(e,t={}){return Sb(e,t).map(n=>({name:b(n.symbol),count:n.file_count}))}function Sb(e,t){let{limit:n=30,scope:r}=t,i=r?`AND def_d.relative_path LIKE '%${r}%'`:"";return e.all(`SELECT gs.symbol, COUNT(DISTINCT c.document_id) AS file_count
|
|
398
418
|
FROM mentions m
|
|
399
419
|
JOIN chunks c ON m.chunk_id = c.id
|
|
400
420
|
JOIN global_symbols gs ON m.symbol_id = gs.id
|
|
@@ -413,7 +433,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
413
433
|
GROUP BY gs.id
|
|
414
434
|
HAVING file_count > 1
|
|
415
435
|
ORDER BY file_count DESC
|
|
416
|
-
LIMIT ?`,n)}function
|
|
436
|
+
LIMIT ?`,n)}function qo(e,t={}){let{limit:n=30,scope:r}=t,i=r?`AND d.relative_path LIKE '%${r}%'`:"";return e.all(`SELECT d.relative_path, COUNT(DISTINCT gs.id) AS symbol_count
|
|
417
437
|
FROM mentions m
|
|
418
438
|
JOIN chunks c ON m.chunk_id = c.id
|
|
419
439
|
JOIN documents d ON c.document_id = d.id
|
|
@@ -433,7 +453,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
433
453
|
${i}
|
|
434
454
|
GROUP BY d.id
|
|
435
455
|
ORDER BY symbol_count DESC
|
|
436
|
-
LIMIT ?`,n).filter(s=>!e.isIgnored(s.relative_path)).map(s=>({name:s.relative_path,count:s.symbol_count}))}function
|
|
456
|
+
LIMIT ?`,n).filter(s=>!e.isIgnored(s.relative_path)).map(s=>({name:s.relative_path,count:s.symbol_count}))}function Vo(e,t,n){let r=pe(e,t)??t,i=pe(e,n)??n,o=e.get(`SELECT COUNT(DISTINCT gs.id) AS shared
|
|
437
457
|
FROM global_symbols gs
|
|
438
458
|
WHERE (
|
|
439
459
|
-- Defined in file1, referenced in file2
|
|
@@ -465,7 +485,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
465
485
|
JOIN documents d ON c.document_id = d.id
|
|
466
486
|
WHERE m.symbol_id = gs.id AND m.role != 1 AND d.relative_path = ?
|
|
467
487
|
)
|
|
468
|
-
)`,r,i,i,r);return{file1:r,file2:i,sharedSymbols:o?.shared??0}}function
|
|
488
|
+
)`,r,i,i,r);return{file1:r,file2:i,sharedSymbols:o?.shared??0}}function Wo(e,t={}){let{limit:n=20,scope:r}=t,i=r?`AND d1.relative_path LIKE '%${r}%' AND d2.relative_path LIKE '%${r}%'`:"";return e.all(`SELECT
|
|
469
489
|
def_d.relative_path AS file1,
|
|
470
490
|
ref_d.relative_path AS file2,
|
|
471
491
|
COUNT(DISTINCT gs.id) AS shared
|
|
@@ -487,12 +507,12 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
487
507
|
${i}
|
|
488
508
|
GROUP BY def_d.id, ref_d.id
|
|
489
509
|
ORDER BY shared DESC
|
|
490
|
-
LIMIT ?`,n).filter(s=>!e.isIgnored(s.file1)&&!e.isIgnored(s.file2)).map(s=>({file1:s.file1,file2:s.file2,sharedSymbols:s.shared}))}function
|
|
491
|
-
WHERE id = ? LIMIT 1`,n.symbolId);if(!r)return[];let i=[{symbol:r.symbol,shortName:b(r.symbol),depth:0}],o=r.enclosing_symbol,s=1,a=new Set([r.symbol]);for(;o&&!a.has(o)&&s<20;){a.add(o);let m=e.get("SELECT symbol, enclosing_symbol FROM global_symbols WHERE symbol = ?",o);if(!m)break;i.push({symbol:m.symbol,shortName:b(m.symbol),depth:s}),o=m.enclosing_symbol,s++}if(i.length>1)return i;let c=
|
|
510
|
+
LIMIT ?`,n).filter(s=>!e.isIgnored(s.file1)&&!e.isIgnored(s.file2)).map(s=>({file1:s.file1,file2:s.file2,sharedSymbols:s.shared}))}function Mt(e,t={}){let{scope:n,maxDepth:r=10}=t,i=X(e,n),o=[],s=new Set,a=new Set,c=[];function l(m,d){if(d>r)return;if(a.has(m)){let h=c.indexOf(m);if(h!==-1){let f=c.slice(h).concat(m),y=f.indexOf(f.reduce((S,x)=>S<x?S:x)),R=[...f.slice(y,-1),...f.slice(0,y),f[y]],E=R.join(" -> ");u.has(E)||(u.add(E),o.push({path:R,kind:xb(R)}))}return}if(s.has(m))return;s.add(m),a.add(m),c.push(m);let p=i.get(m);if(p)for(let h of p)l(h,d+1);c.pop(),a.delete(m)}let u=new Set;for(let m of i.keys())s.has(m)||l(m,0);return o.sort((m,d)=>m.kind!==d.kind?m.kind==="real"?-1:1:m.path.length-d.path.length),o}function xb(e){for(let r of e){let i=G(r);if(i==="test"||i==="barrel"||i==="entry")return"module-hierarchy"}if(e.length!==3)return"real";let[t,n]=e;return!t||!n?"real":qr(t)||qr(n)||El(t,n)||El(n,t)||kl(t,n)||kl(n,t)||G(t)==="entry"||G(n)==="entry"?"module-hierarchy":"real"}function El(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 kl(e,t){if(!/\.rs$/.test(e)||!/\.rs$/.test(t))return!1;let n=e.replace(/\.rs$/,""),r=t.replace(/\.rs$/,"");if(n===r+"_tests"||n===r+"/tests")return!0;let i=e.split("/"),o=t.split("/");if(i.length===o.length&&i.includes("tests")&&o.includes("src")){let s=i[i.length-1],a=o[o.length-1];if(s&&s===a)return!0}return!1}function Uo(e,t={}){let{limit:n=20,scope:r,minFanIn:i=2,minFanOut:o=2,scanLimit:s}=t,a=new _(e);return Ne(a.productionCallableDefinitions({scope:r,requireCallableSymbol:!0,includeSuppressed:!0,sortByLocDesc:typeof s=="number"&&s>0}),s).map(u=>Cb(e,u,t.semantic!==!1)).filter(u=>u.fanIn>=i&&u.fanOut>=o).sort((u,m)=>m.score-u.score||m.fanIn-u.fanIn).slice(0,n)}function Cb(e,t,n){let r=new Set(De(e,t,{limit:500,semantic:n}).map(o=>o.file)).size,i=new Set(Se(e,t,{limit:500,semantic:n}).filter(o=>o.file!==t.relativePath).map(o=>`${o.symbol}|${o.file}`)).size;return{symbol:t.symbol,shortName:b(t.symbol),fanIn:r,fanOut:i,score:r*i,definedIn:t.relativePath}}function Ot(e,t={}){let{scope:n,minLoc:r=3,scanLimit:i}=t,o=new _(e),s=t.semantic!==!1,a=Ne(o.productionCallableDefinitions({scope:n,minLoc:r,excludeEntrySurfaces:!0,excludeRustTraitImplMembers:!0,includeSuppressed:!0,sortByLocDesc:typeof i=="number"&&i>0}),i),c=o.crossFileCallerMap(a,{semantic:s}),l=new Set(c.keys());for(let f of o.frameworkReferencedSymbolIds(a))l.add(f);let u=o.symbolsWithNonSelfCallees(a,{additive:!1,semantic:s}),m=a.filter(f=>!l.has(f.symbolId)).filter(f=>!u.has(f.symbolId)),d=o.sourceFallbackCallerFiles(m);for(let f of d.keys())l.add(f);let p=m.filter(f=>!l.has(f.symbolId)),h=o.symbolsWithNonSelfCallees(p,{additive:!0,semantic:s});for(let f of h)u.add(f);return p.filter(f=>!u.has(f.symbolId)).sort((f,y)=>q(y)-q(f)||f.relativePath.localeCompare(y.relativePath)||f.startLine-y.startLine).map(f=>({symbol:f.symbol,shortName:b(f.symbol),relativePath:f.relativePath,startLine:f.startLine,endLine:f.endLine,loc:q(f)}))}var Jo={0:"UnspecifiedKind",1:"AbstractMethod",2:"Accessor",3:"Array",4:"Assertion",5:"AssociatedType",6:"Attribute",7:"Axiom",8:"Boolean",9:"Class",10:"Constant",11:"Constructor",12:"Contract",13:"DataFamily",14:"DefinitionMacro",15:"Delegate",16:"Enum",17:"EnumMember",18:"Error",19:"Event",20:"Fact",21:"Field",22:"File",23:"Function",24:"Getter",25:"Grammar",26:"Instance",27:"Interface",28:"Key",29:"Lang",30:"Lemma",31:"Library",32:"Macro",33:"Method",34:"MethodAlias",35:"MethodReceiver",36:"MethodSpecification",37:"Message",38:"Modifier",39:"Module",40:"Namespace",41:"Null",42:"Number",43:"Object",44:"Operator",45:"Package",46:"PackageObject",47:"Parameter",48:"ParameterLabel",49:"Pattern",50:"Predicate",51:"Property",52:"Protocol",53:"ProtocolMethod",54:"PureVirtualMethod",55:"Quasiquoter",56:"SelfParameter",57:"Setter",58:"Signature",59:"SingletonClass",60:"SingletonMethod",61:"StaticDataMember",62:"StaticEvent",63:"StaticField",64:"StaticMethod",65:"StaticProperty",66:"StaticVariable",67:"String",68:"Struct",69:"Subscript",70:"Tactic",71:"Theorem",72:"ThisParameter",73:"Trait",74:"TraitMethod",75:"Type",76:"TypeAlias",77:"TypeClass",78:"TypeClassMethod",79:"TypeFamily",80:"TypeParameter",81:"Union",82:"Value",83:"Variable"},Go=new Map;for(let[e,t]of Object.entries(Jo))Go.set(t.toLowerCase(),Number(e));function Rb(e){let t=parseInt(e,10);if(!isNaN(t))return t;let n=e.toLowerCase(),r=Go.get(n);if(r!==void 0)return r;for(let[i,o]of Go)if(i.includes(n))return o;return null}function zo(e,t,n={}){let{scope:r,limit:i=100}=n,o=Rb(t);return o===null?[]:Pl(e,r).map(a=>({row:a,resolvedKind:Fl(a)})).filter(a=>a.resolvedKind===o).slice(0,i).map(({row:a,resolvedKind:c})=>({symbol:a.symbol,shortName:b(a.symbol),kind:c,kindName:Jo[c]??"Unknown",relativePath:a.relative_path,startLine:a.start_line,endLine:a.end_line}))}function Ko(e,t={}){let n=new Map;for(let r of Pl(e,t.scope)){let i=Fl(r);i===null||i===0||n.set(i,(n.get(i)??0)+1)}return[...n.entries()].sort((r,i)=>i[1]-r[1]||r[0]-i[0]).map(([r,i])=>({kind:r,kindName:Jo[r]??"Unknown",count:i}))}function Pl(e,t){return He(e,{scope:t}).map(Ib)}function Ib(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 Fl(e){return e.kind!==null&&e.kind!==0?vb(e.kind,e.symbol,e.documentation):Db(e.symbol,e.documentation,e.enclosing_symbol)}function vb(e,t,n){let r=(n??"").toLowerCase();if(re(t)==="type"){if(r.includes("type "))return 76;if(r.includes("interface "))return 27;if(r.includes("struct "))return 68;if(r.includes("trait "))return 73;if(r.includes("class "))return 9}return e}function Db(e,t,n){let r=ne(e);if("kind"in r)return null;let i=r.descriptors,o=i[i.length-2]??null,s=re(e),a=(t??"").toLowerCase();return s==="type"?a.includes("type ")?76:a.includes("interface ")?27:a.includes("struct ")?68:a.includes("trait ")?73:(a.includes("class "),9):s==="method"?o?.suffix==="type"?33:23:s==="namespace"?39:s!=="term"?null:a.includes("async def ")||a.includes("def ")?23:(n?re(n):o?.suffix??null)==="type"?21:83}function Qo(e,t={}){let{limit:n=10,scope:r,minDepth:i=3}=t,o=X(e,r),s=new Map,a=[],c=new Map,l=new Map,u=new Set,m=[],d=0;for(let D of o.keys()){if(c.has(D))continue;let w=[],$=(o.get(D)??new Set).values();for(c.set(D,d),l.set(D,d),d+=1,m.push(D),u.add(D),w.push({node:D,iter:$,pendingChild:null});w.length>0;){let F=w[w.length-1];if(F.pendingChild!==null){let je=F.pendingChild;F.pendingChild=null,l.set(F.node,Math.min(l.get(F.node),l.get(je)))}let se=F.iter.next();if(se.done){if(l.get(F.node)===c.get(F.node)){let je=[];for(;;){let br=m.pop();if(u.delete(br),je.push(br),s.set(br,a.length),br===F.node)break}a.push(je)}w.pop();continue}let he=se.value;if(c.has(he))u.has(he)&&l.set(F.node,Math.min(l.get(F.node),c.get(he)));else{c.set(he,d),l.set(he,d),d+=1,m.push(he),u.add(he);let je=(o.get(he)??new Set).values();F.pendingChild=he,w.push({node:he,iter:je,pendingChild:null})}}}let p=new Map,h=new Array(a.length);for(let D=0;D<a.length;D++)h[D]=a[D].length,p.set(D,new Set);for(let[D,w]of o){let $=s.get(D);for(let F of w){let se=s.get(F);se!==$&&p.get($).add(se)}}let f=new Array(a.length),y=new Array(a.length);for(let D=0;D<a.length;D++){let w=[],$=0;for(let F of p.get(D)){let se=y[F];se>$&&($=se,w=f[F])}f[D]=[D,...w],y[D]=h[D]+$}function R(D){return f[D]}let E=a.map(D=>[...D].sort()),S=new Set,x=[];for(let D=0;D<a.length;D++){let w=R(D),$=[];for(let se of w)$.push(...E[se]);if($.length<i)continue;let F=$.join(" ");S.has(F)||(S.add(F),x.push({chain:$,depth:$.length}))}return x.sort((D,w)=>w.depth-D.depth),x.slice(0,n)}function Yo(e,t){let n=A(e,t);if(!n)return[];let r=e.get(`SELECT symbol, enclosing_symbol FROM global_symbols
|
|
511
|
+
WHERE id = ? LIMIT 1`,n.symbolId);if(!r)return[];let i=[{symbol:r.symbol,shortName:b(r.symbol),depth:0}],o=r.enclosing_symbol,s=1,a=new Set([r.symbol]);for(;o&&!a.has(o)&&s<20;){a.add(o);let m=e.get("SELECT symbol, enclosing_symbol FROM global_symbols WHERE symbol = ?",o);if(!m)break;i.push({symbol:m.symbol,shortName:b(m.symbol),depth:s}),o=m.enclosing_symbol,s++}if(i.length>1)return i;let c=ne(r.symbol);if("kind"in c)return i;let l=c.descriptors;if(l.length<=1)return i;let u=[i[0]];for(let m=l.length-2,d=1;m>=0;m--,d++){let h=l.slice(0,m+1).map(f=>f.suffix==="method"?`${f.name}()`:f.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:h,shortName:h,depth:d})}return u}function Kn(e,t,n={}){let r=A(e,t);if(!r)return null;let i=n.semantic!==!1,o=De(e,r,{limit:50,semantic:i}),s=Sn(Se(e,r,{limit:50,additive:!0,callableOnly:!0,semantic:i}));return{symbol:r.symbol,shortName:b(r.symbol),callers:o.map(a=>({symbol:a.symbol,shortName:b(a.symbol),file:a.file})),callees:s.map(a=>({symbol:a.symbol,shortName:b(a.symbol),file:a.file}))}}function Qn(e,t){let n=new Set;for(let r of e)t.has(r)&&n.add(r);return n}function Yn(e,t){let n=new Set;for(let r of e)t.has(r)||n.add(r);return n}function Tl(e,t){if(e.size===0&&t.size===0)return 0;let n=0;for(let i of e)t.has(i)&&(n+=1);let r=e.size+t.size-n;return r===0?0:n/r}function Al(e,t){if(e.size===0)return 0;let n=0;for(let r of e)t.has(r)&&(n+=1);return n/e.size}function Xo(e){let t=e.length;if(t===0)return new Map;let n=new Map;for(let i of e)for(let o of i)n.set(o,(n.get(o)??0)+1);let r=new Map;for(let[i,o]of n)r.set(i,Math.log(t/o));return r}function Nb(e){let t=[...e.values()].sort((r,i)=>r-i);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 Ml(e,t,n){let r=Qn(e,t);if(r.size===0)return{similarity:0,significantShared:[],trivialShared:[]};let i=0,o=0,s=0,a=new Set([...e,...t]);for(let p of a){let h=n.get(p)??0,f=e.has(p)?h:0,y=t.has(p)?h:0;i+=f*y,o+=f*f,s+=y*y}let c=Math.sqrt(o)*Math.sqrt(s),l=c>0?i/c:0,u=Nb(n),m=[],d=[];for(let p of r)(n.get(p)??0)>=u?m.push(p):d.push(p);return m.sort((p,h)=>(n.get(h)??0)-(n.get(p)??0)),{similarity:l,significantShared:m,trivialShared:d}}function Zn(e,t,n={}){let{minSimilarity:r=.4,limit:i=20}=n,o=wb(e,t,{semantic:n.semantic!==!1});if(!o)return[];if(!Y(o.symbol))return[];let s=_b(e,o,r,{scanLimit:n.scanLimit,semantic:n.semantic!==!1});return s.length>0?s.slice(0,i):Fb(e,t,{minSimilarity:r,limit:i})}function _b(e,t,n,r){let i=ni(e,{minCallees:3,excludeSymbol:t.symbol,scanLimit:r.scanLimit,semantic:r.semantic}),o=Xo([t,...i].map(a=>a.callees)),s=[];for(let a of i){if(a.callees.size<3)continue;let c=Ol(t,a,o,{minSimilarity:n,requireSignificantShared:1,requireSharedCount:0});c&&s.push(c)}return s.sort((a,c)=>c.similarity-a.similarity),s}function Ol(e,t,n,r){let{similarity:i,significantShared:o}=Ml(e.callees,t.callees,n);if(i<r.minSimilarity)return null;let s=Qn(e.callees,t.callees).size;if(o.length<r.requireSignificantShared&&s<r.requireSharedCount)return null;let a=o.length>0?o:[...Qn(e.callees,t.callees)];return{symbolA:e.symbol,shortNameA:b(e.symbol),fileA:e.file,symbolB:t.symbol,shortNameB:b(t.symbol),fileB:t.file,similarity:i,similarityBasis:"callees",sharedCallees:a.map(b),uniqueToA:[...Yn(e.callees,t.callees)].map(b),uniqueToB:[...Yn(t.callees,e.callees)].map(b)}}function Ze(e,t={}){let{minSimilarity:n=.5,limit:r=20,scope:i,minCallees:o=4,crossFileOnly:s=!1,scanLimit:a}=t,c=ni(e,{minCallees:o,scope:i,scanLimit:a,semantic:t.semantic!==!1}),l=Xo(c.map(f=>f.callees)),u=new Map;for(let f of c)for(let y of f.callees)u.set(y,(u.get(y)??0)+1);let m=Math.max(8,Math.ceil(Math.sqrt(c.length))),d=new Map;for(let f=0;f<c.length;f+=1)for(let y of c[f].callees){if((u.get(y)??0)>m)continue;let R=d.get(y);R||(R=[],d.set(y,R)),R.push(f)}let p=[],h=new Set;e:for(let f=0;f<c.length;f+=1){let y=c[f],R=new Set;for(let E of y.callees){let S=d.get(E);if(S)for(let x of S)x>f&&R.add(x)}for(let E of R){let S=`${f}|${E}`;if(h.has(S))continue;h.add(S);let x=c[E];if(s&&y.file===x.file)continue;if(y.paramCount>=0&&x.paramCount>=0){let w=Math.abs(y.paramCount-x.paramCount),$=Math.max(2,Math.ceil(Math.max(y.paramCount,x.paramCount)*.5));if(w>$)continue}let D=Ol(y,x,l,{minSimilarity:n,requireSignificantShared:2,requireSharedCount:4});if(D&&(p.push(D),p.length>r*5))break e}}return p.sort((f,y)=>y.similarity-f.similarity),p.slice(0,r)}var Lb=["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 wb(e,t,n){let r=A(e,t),i=new _(e);if(!r)return null;let o=Se(e,r,{semantic:n.semantic});return{symbol:r.symbol,file:r.relativePath,callees:ri(o.map(s=>s.symbol)),paramCount:i.callableSignature(r)?.paramCount??-1}}var Eb=te("callee-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]});function ni(e,t){let{minCallees:n,scope:r,excludeSymbol:i,scanLimit:o}=t,s=t.semantic!==!1,a=Eb.get(e,()=>new Map),c=`${n}|${r??""}|${o??""}|${s}`,l=a.get(c);return l||(l=kb(e,{minCallees:n,scope:r,scanLimit:o,semantic:s}),a.set(c,l)),i===void 0?l:l.filter(u=>u.symbol!==i)}function kb(e,t){let{minCallees:n,scope:r,scanLimit:i,semantic:o}=t,s=new _(e),a=Ne(s.productionCallableDefinitions({scope:r,minLoc:5,sortByLocDesc:typeof i=="number"&&i>0}),i),c=s.calleeMap(a,{semantic:o});return a.map(l=>({symbol:l.symbol,file:l.relativePath,callees:ri((c.get(l.symbolId)??[]).map(u=>u.symbol)),paramCount:s.callableSignature(l)?.paramCount??-1})).filter(l=>l.callees.size>=n)}function ri(e){return new Set([...e].filter(t=>!Pb(t)))}function Pb(e){return Lb.some(t=>e.includes(t))}function Fb(e,t,n){let r=Tb(e,t);if(!r||r.tokens.size<3)return[];let i=n.minSimilarity>=.5?n.minSimilarity:.3,o=[];for(let s of Ob(e)){if(s.symbol===r.symbol||s.tokens.size<3)continue;let a=Qn(r.tokens,s.tokens);if(a.size<2)continue;let c=new Set([...r.tokens,...s.tokens]),l=c.size>0?a.size/c.size:0;l<i||o.push({symbolA:r.symbol,shortNameA:b(r.symbol),fileA:r.file,symbolB:s.symbol,shortNameB:b(s.symbol),fileB:s.file,similarity:l,similarityBasis:"source-tokens",sharedCallees:[...a].sort(),uniqueToA:[...Yn(r.tokens,s.tokens)].sort(),uniqueToB:[...Yn(s.tokens,r.tokens)].sort()})}return o.sort((s,a)=>a.similarity-s.similarity||s.shortNameB.localeCompare(a.shortNameB)),o.slice(0,n.limit)}function Tb(e,t){let n=A(e,t);if(!n||!Y(n.symbol))return null;let r=Ab(e,n);return r?{symbol:n.symbol,file:n.relativePath,tokens:r}:null}function Ab(e,t){let n=T(t.symbol),r=$l(e,t.relativePath,t.startLine,t.endLine,n),i=jl(r,n);return i.size>0?i:null}var Mb=te("source-fingerprint-corpus",{clearGroups:["whole-project","definition-catalog"]});function Ob(e){return Mb.get(e,()=>$b(e))}function $b(e){return new _(e).productionCallableDefinitions().map(n=>({symbol:n.symbol,file:n.relativePath,tokens:jl($l(e,n.relativePath,n.startLine,n.endLine,n.leaf),n.leaf)})).filter(n=>n.tokens.size>0)}function $l(e,t,n,r,i){let o=P(e,t);if(!o)return"";let s=o.split(`
|
|
492
512
|
`);if(r>=n&&r-n<=12)return s.slice(n,r+1).join(`
|
|
493
|
-
`);let a=[new RegExp(`\\bdef\\s+${
|
|
513
|
+
`);let a=[new RegExp(`\\bdef\\s+${Xn(i)}\\b`),new RegExp(`\\bfun\\s+${Xn(i)}\\b`),new RegExp(`\\bfn\\s+${Xn(i)}\\b`),new RegExp(`\\bfunction\\s+${Xn(i)}\\b`),new RegExp(`\\b${Xn(i)}\\s*\\(`)],c=s.findIndex(l=>a.some(u=>u.test(l)));if(c>=0){let l=c;for(let u=c+1;u<s.length&&u<=c+8;u++){let m=s[u]??"";if(u>c&&Bb(m)||(l=u,m.trim()===""&&u>c+1))break}return s.slice(c,l+1).join(`
|
|
494
514
|
`)}return s.slice(n,Math.min(s.length,n+8)).join(`
|
|
495
|
-
`)}function
|
|
515
|
+
`)}function jl(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"]),r=jb(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=>!r.has(s));return new Set(o)}function jb(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 Bb(e){return/^\s*(?:def|fun|fn|function|class|trait|module|object|enum|interface|public|private|protected)\b/.test(e)}function Xn(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Zo(e,t={}){let{minSimilarity:n=.5,limit:r=20,scope:i,filePattern:o}=t,s=t.minDeps??(o?1:3),{profiles:a,distinctiveDeps:c}=Hb(e,{scope:i,minDeps:s}),l=[];if(o){let u=a.find(m=>m.file.includes(o));if(!u)return[];for(let m of a){if(m.file===u.file)continue;let d=Bl(u,m,n,c);d&&l.push(d)}}else for(let u=0;u<a.length;u++){for(let m=u+1;m<a.length;m++){let d=Bl(a[u],a[m],n,c);d&&l.push(d)}if(l.length>r*5)break}return l.sort((u,m)=>m.similarity-u.similarity),l.slice(0,r)}function Hb(e,t){let{scope:n,minDeps:r}=t,i=X(e,n),{universalDeps:o,distinctiveDeps:s}=qb(i),a=[];for(let[c,l]of i)l.size>=r&&a.push({file:c,deps:new Set([...l].filter(u=>!o.has(u)))});return{profiles:a,distinctiveDeps:s}}function qb(e){let t=new Set,n=new Set,r=e.size;if(r===0)return{universalDeps:t,distinctiveDeps:n};let i=new Map;for(let s of e.values())for(let a of s)i.set(a,(i.get(a)??0)+1);let o=Math.max(3,Math.ceil(r*.03));for(let[s,a]of i)a>=5&&a/r>.3?t.add(s):a<=o&&n.add(s);return{universalDeps:t,distinctiveDeps:n}}function Bl(e,t,n,r){let i=new Set;for(let l of e.deps)t.deps.has(l)&&i.add(l);if(i.size<3||e.deps.size<4||t.deps.size<4)return null;let o=0;for(let l of i)r.has(l)&&o++;if(o<2)return null;let s=Tl(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:[...i],uniqueToA:a,uniqueToB:c}}function es(e,t={}){let{minSimilarity:n=.5,limit:r=15,scope:i,minChainLength:o=3,maxChainLength:s=8}=t,a=X(e,i),c=Qb(a,o,s);if(c.length===0)return[];let l=Vb(c);return l.length<2?[]:Kb(Gb(l,n,r),r)}function Vb(e){let t=Wb(e),n=[];for(let r of e){let i=r.filter(o=>!t.has(o));i.length>=2&&n.push({original:r,filtered:i})}return n}function Wb(e){let{nodeFreq:t,tailFreq:n}=Ub(e),r=e.length*.9,i=e.length*.8,o=new Set;for(let[a,c]of t)c>r&&o.add(a);for(let[a,c]of n)c>i&&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 Ub(e){let t=new Map,n=new Map;for(let r of e){let i=new Set;for(let o of r)i.has(o)||(t.set(o,(t.get(o)??0)+1),i.add(o));for(let o=Math.max(0,r.length-2);o<r.length;o++)n.set(r[o],(n.get(r[o])??0)+1)}return{nodeFreq:t,tailFreq:n}}function Gb(e,t,n){let r=[];for(let i=0;i<e.length;i++){for(let o=i+1;o<e.length;o++){let s=Jb(e[i],e[o],t);s&&r.push(s)}if(r.length>n*10)break}return r.sort((i,o)=>Math.abs(o.similarity-i.similarity)>.01?o.similarity-i.similarity:i.divergencePoints.length-o.divergencePoints.length),r}function Jb(e,t,n){if(!zb(e.filtered,t.filtered))return null;let{distance:r,ops:i}=Yb(e.filtered,t.filtered),o=Math.max(e.filtered.length,t.filtered.length);if(o===0)return null;let s=1-r/o;if(s<n||r===0)return null;let a=i.filter(l=>l.type==="substitute").map(l=>({index:l.indexA,nodeA:e.filtered[l.indexA],nodeB:t.filtered[l.indexB]}));return a.length===0||i.filter(l=>l.type==="match").length<2?null:{chainA:e.original,chainB:t.original,similarity:s,editDistance:r,divergencePoints:a,commonPrefix:Xb(e.original,t.original),commonSuffix:Zb(e.original,t.original)}}function zb(e,t){let n=new Set(e);return t.some(r=>n.has(r))}function Kb(e,t){let n=[];for(let r of e)if(n.some(o=>Hl(r.chainA,o.chainA)&&Hl(r.chainB,o.chainB))||n.push(r),n.length>=t)break;return n}function Qb(e,t,n){let r=[];for(let o of e.keys()){if(r.length>=500)break;ql(e,o,[o],new Set([o]),t,n,r,500)}return r}function ql(e,t,n,r,i,o,s,a){if(s.length>=a)return;if(n.length>=o){n.length>=i&&s.push([...n]);return}let c=e.get(t);if(!c||c.size===0){n.length>=i&&s.push([...n]);return}let l=!1;for(let u of c)if(!r.has(u)&&(r.add(u),n.push(u),ql(e,u,n,r,i,o,s,a),n.pop(),r.delete(u),l=!0,s.length>=a))return;!l&&n.length>=i&&s.push([...n])}function Yb(e,t){let n=e.length,r=t.length,i=Array.from({length:n+1},()=>Array(r+1).fill(0));for(let c=0;c<=n;c++)i[c][0]=c;for(let c=0;c<=r;c++)i[0][c]=c;for(let c=1;c<=n;c++)for(let l=1;l<=r;l++)e[c-1]===t[l-1]?i[c][l]=i[c-1][l-1]:i[c][l]=1+Math.min(i[c-1][l],i[c][l-1],i[c-1][l-1]);let o=[],s=n,a=r;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&&i[s][a]===i[s-1][a-1]+1?(o.unshift({type:"substitute",indexA:s-1,indexB:a-1}),s--,a--):a>0&&i[s][a]===i[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:i[n][r],ops:o}}function Xb(e,t){let n=[];for(let r=0;r<Math.min(e.length,t.length)&&e[r]===t[r];r++)n.push(e[r]);return n}function Zb(e,t){let n=[],r=e.length-1,i=t.length-1;for(;r>=0&&i>=0&&e[r]===t[i];)n.unshift(e[r]),r--,i--;return n}function Hl(e,t){if(e.length>t.length)return!1;let n=t.join("\u2192"),r=e.join("\u2192");return n.includes(r)}function _e(e){let t=e.orderCandidates?[...e.candidates()].sort(e.orderCandidates):e.candidates(),n=Ne(t,e.scanLimit),r=e.prepare?.(n)??void 0,i=[];for(let o of n){let s=e.evaluate(o,r);s&&i.push(s)}return e.orderResults&&i.sort(e.orderResults),typeof e.limit=="number"?i.slice(0,e.limit):i}function $t(e,t={}){let{scope:n,minLoc:r=10,minCallees:i=6,limit:o=20,scanLimit:s}=t,a=new _(e);return _e({candidates:()=>a.productionCallableDefinitions({scope:n,minLoc:r,excludeTypesFiles:!0,requireFunctionLikeSymbol:!0,sortByLocDesc:!0}),scanLimit:s,prepare:c=>a.calleeMap(c,{semantic:t.semantic!==!1}),evaluate:(c,l)=>eS(c,l.get(c.symbolId)??[],i),orderResults:(c,l)=>l.clusters.length-c.clusters.length||l.loc-c.loc,limit:o})}function eS(e,t,n){let r=new Set(t.map(a=>a.symbol));if(r.size<n)return null;let i=tS(r,t),o=nS(r,i);if(o.length<2)return null;let s=rS(o,i);return s.length===0?null:{symbol:e.symbol,shortName:b(e.symbol),relativePath:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:q(e),totalCallees:r.size,clusters:s}}function tS(e,t){let n=new Map;for(let i of e)n.set(i,new Set);let r=new Map;for(let i of t){let o=r.get(i.chunkId);o||(o=new Set,r.set(i.chunkId,o)),o.add(i.symbol)}for(let i of r.values()){let o=[...i];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 nS(e,t){let n=new Set,r=[];for(let i of e){if(n.has(i))continue;let o=new Set,s=[i];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)}}r.push(o)}return r}function rS(e,t){return e.filter(n=>n.size>=3).map(n=>iS(n,e,t)).filter(n=>n.isolation>.5).sort((n,r)=>r.isolation-n.isolation)}function iS(e,t,n){let r=new Set;for(let a of t)if(a!==e)for(let c of a)r.add(c);let i=0;for(let a of e)for(let c of n.get(a)??[])r.has(c)&&i++;let o=e.size*r.size,s=o>0?1-i/o:1;return{callees:[...e].map(b),isolation:s}}function er(e,t,n={}){let{maxDepth:r=5,scope:i}=n,o=A(e,t);if(!o)return[];let s=[],a=new Set([o.symbolId]),c=new Set,l=[o];for(let u=1;u<=r&&l.length!==0;u++){let m=[];for(let d of l)for(let p of oS(e,d,i)){let h=`${p.file}|${p.shortName}`;if(p.symbolId!==null){if(a.has(p.symbolId))continue;a.add(p.symbolId)}else if(c.has(h))continue;c.add(h),s.push({symbol:p.symbol,shortName:p.shortName,file:p.file,depth:u}),p.symbolId!==null&&p.symbolMatch&&m.push(p.symbolMatch)}l=m}return s.sort((u,m)=>u.depth-m.depth||u.file.localeCompare(m.file)),s}function oS(e,t,n){let r=De(e,t,{limit:500}).filter(l=>!e.isIgnored(l.file)).filter(l=>!n||l.file.includes(n)),i=new Set(r.map(l=>l.file)),o=[];for(let l of sS(e,t,n)){if(i.has(l))continue;let u=W(e,l),m=u.length>0?Ce(u,u[0].startLine):null;o.push({symbol:m?.symbol??l,file:l})}let s=[...r,...o],a=[],c=new Set;for(let l of s){let u=cn(e,l.symbol);if(!u){let d=`${l.file}|${l.symbol}`;if(c.has(d))continue;c.add(d),a.push({symbolId:null,symbol:l.symbol,shortName:b(l.symbol),file:l.file,symbolMatch:null});continue}if(u.symbolId===t.symbolId||e.isIgnored(u.relativePath)||!aS(u.symbol))continue;let m=`${u.symbolId}|${u.relativePath}`;c.has(m)||(c.add(m),a.push({symbolId:u.symbolId,symbol:u.symbol,shortName:b(u.symbol),file:u.relativePath,symbolMatch:u}))}return a}function sS(e,t,n){let r=n?"AND consumer_d.relative_path LIKE ?":"",i=[t.symbolId,t.documentId];return n&&i.push(`%${n}%`),new Set(e.all(`SELECT DISTINCT consumer_d.relative_path
|
|
496
516
|
FROM mentions m
|
|
497
517
|
JOIN chunks c ON m.chunk_id = c.id
|
|
498
518
|
JOIN documents consumer_d ON consumer_d.id = c.document_id
|
|
@@ -500,40 +520,40 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
500
520
|
AND m.role != 1
|
|
501
521
|
AND c.document_id != ?
|
|
502
522
|
${e.pathExclusionsFor("consumer_d")}
|
|
503
|
-
${r}`,...i).map(o=>o.relative_path).filter(o=>!e.isIgnored(o)))}function
|
|
523
|
+
${r}`,...i).map(o=>o.relative_path).filter(o=>!e.isIgnored(o)))}function aS(e){let t=re(e);return t==="method"||t==="type"||e.endsWith("().")}function tr(e,t,n={}){let r=pe(e,t);if(!r)return null;let i=cS(e,r);if(!i||e.isIgnored(i.relative_path))return null;let o=[],s=0,a=lS(e,i.relative_path),c=n.semantic===!1?new Map:yn(e,a);for(let l of a){let u=uS(e,i,l,c.get(l.symbolId)??new Set);s+=u,o.push({symbol:l.symbol,shortName:b(l.symbol),startLine:l.startLine,endLine:l.endLine,externalConsumers:u,riskLevel:mS(u)})}return{file:i.relative_path,symbols:o,totalExternalConsumers:s}}function cS(e,t){return e.get(`SELECT id, relative_path FROM documents
|
|
504
524
|
WHERE relative_path = ?
|
|
505
525
|
${e.pathExclusionsFor("documents")}
|
|
506
|
-
LIMIT 1`,t)??null}function
|
|
526
|
+
LIMIT 1`,t)??null}function lS(e,t){return new _(e).definitionsForFile(t).sort((n,r)=>n.startLine-r.startLine||n.endLine-r.endLine)}function uS(e,t,n,r){let i=e.all(`SELECT DISTINCT consumer_d.relative_path
|
|
507
527
|
FROM mentions m
|
|
508
528
|
JOIN chunks c ON m.chunk_id = c.id
|
|
509
529
|
JOIN documents consumer_d ON consumer_d.id = c.document_id
|
|
510
530
|
WHERE m.symbol_id = ?
|
|
511
531
|
AND m.role != 1
|
|
512
|
-
AND c.document_id != ?`,n.symbolId,t.id);return new Set([...i.map(o=>o.relative_path),...[...r].filter(o=>o!==t.relative_path)]).size}function
|
|
532
|
+
AND c.document_id != ?`,n.symbolId,t.id);return new Set([...i.map(o=>o.relative_path),...[...r].filter(o=>o!==t.relative_path)]).size}function mS(e){return e>10?"high":e>0?"medium":"low"}function ns(e,t={}){let{scope:n,minLoc:r=1,maxDepth:i=5,scanLimit:o}=t,s=new _(e),a=dS(e,n,r,o),c=new ts;for(let f of a)c.add(f);let l=[],u=[];a.length>0&&l.push(Vl(e,0,a,c));let m=a.map(f=>f.definition).filter(f=>f!==null),d=new Set(a.map(f=>f.symbol));for(let f=1;f<=i&&m.length>0;f++){let y=s.calleeMap(m,{semantic:!1}),R=new Set;for(let S of m)for(let x of y.get(S.symbolId)??[])d.has(x.symbol)||R.add(x.symbol);let E=[];for(let S of R){d.add(S);let x=Wl(e,S);if(!x||e.isIgnored(x.relativePath)||me(e,x.relativePath)||oe(e,x.symbol,x.relativePath)||s.fileKind(x.relativePath)==="test"||s.hasSuppressionComment(x))continue;let D=fS(e,x,c);D.removable?E.push(pS(x,"cascade")):D.blockingFiles.length>0&&u.push({shortName:b(x.symbol),file:x.relativePath,blockingFiles:D.blockingFiles.slice(0,3)})}if(E.length===0)break;for(let S of E)c.add(S);l.push(Vl(e,f,E,c)),m=E.map(S=>S.definition).filter(S=>S!==null)}let p=l.reduce((f,y)=>f+y.loc,0),h=l.reduce((f,y)=>f+y.entries.length,0);return{batches:l,totalSymbols:h,totalLoc:p,blocked:u}}function dS(e,t,n,r){let i=Xe(e,{scope:t,minLoc:n,skipBarrels:!0,deadCodeOnly:!0,scanLimit:r,semantic:!1}),o=[];for(let s of i.symbols)s.kind==="dead-code"&&(me(e,s.relativePath)||oe(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:Wl(e,s.symbol)}));return o}function pS(e,t){return{symbol:e.symbol,shortName:b(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:e.endLine-e.startLine+1,evidence:t,definition:e}}function Wl(e,t){let n=e.get(`SELECT d.relative_path
|
|
513
533
|
FROM global_symbols gs
|
|
514
534
|
JOIN defn_enclosing_ranges der ON der.symbol_id = gs.id
|
|
515
535
|
JOIN documents d ON d.id = der.document_id
|
|
516
536
|
WHERE gs.symbol = ?
|
|
517
|
-
LIMIT 1`,t);return n?
|
|
537
|
+
LIMIT 1`,t);return n?W(e,n.relative_path).find(r=>r.symbol===t)??null:null}function fS(e,t,n){let r=At(e,t);if(r.length===0)return{removable:!1,blockingFiles:[]};let i=new Set;for(let o of r)o.file===t.relativePath&&o.line>=t.startLine&&o.line<=t.endLine||n.contains(o.file,o.line)||i.add(o.file);return{removable:i.size===0,blockingFiles:[...i]}}function Vl(e,t,n,r){let i=[...n].sort((a,c)=>a.file.localeCompare(c.file)||a.startLine-c.startLine),o=new Set(i.map(a=>a.file)),s=[];for(let a of o){let c=W(e,a);c.length>0&&c.every(l=>r.contains(a,l.startLine))&&s.push(a)}return{depth:t,entries:i.map(({definition:a,...c})=>c),loc:i.reduce((a,c)=>a+c.loc,0),filesEmptied:s.sort()}}var ts=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 r=this.ranges.get(t);return r?r.some(i=>n>=i.start&&n<=i.end):!1}};import{existsSync as au}from"fs";import{execFileSync as gS}from"child_process";var Gl=2e3,hS=50,yS=/\b(?:fix(?:es|ed)?|bug|regression|hotfix)\b/i;function rs(e){let t=te(e,{clearGroups:["whole-project"]});return(n,r)=>{let i=SS(n.config.projectRoot);if(!i)return null;let o=t.has(n)?t.get(n,()=>({head:"",value:null})):null;return o&&o.head===i?o.value:(t.invalidate(n),t.get(n,()=>({head:i,value:r(n.config.projectRoot,i)})).value)}}var bS=rs("git-commit-history");function jt(e){return bS(e,xS)}function SS(e){try{return ii(e,["rev-parse","HEAD"]).trim()||null}catch{return null}}function ii(e,t){return gS("git",["-C",e,...t],{encoding:"utf-8",maxBuffer:64*1024*1024,stdio:["ignore","pipe","ignore"]})}function xS(e,t){let n;try{n=ii(e,["log","--no-merges","--name-only","-n",String(Gl),"--pretty=format:%x01%H%x00%ct%x00%s"])}catch{return null}let r=[],i=0;for(let o of n.split("")){if(o.trim()==="")continue;let s=o.indexOf(`
|
|
518
538
|
`),a=s>=0?o.slice(0,s):o,[c,l,u]=a.split("\0");if(!c||!l)continue;let m=s>=0?o.slice(s+1).split(`
|
|
519
|
-
`).map(d=>d.trim()).filter(d=>d!==""):[];if(m.length>
|
|
520
|
-
`).map(
|
|
539
|
+
`).map(d=>d.trim()).filter(d=>d!==""):[];if(m.length>hS){i+=1;continue}r.push({hash:c,timestamp:Number(l)||0,subject:u??"",files:m})}return{head:t,commits:r,skippedBulkCommits:i}}function CS(e){return yS.test(e.subject)}function oi(e){let t=jt(e);if(!t)return null;let n=new Map;for(let r of t.commits){let i=CS(r);for(let o of r.files){let s=n.get(o)??{changes:0,fixChanges:0,lastChangedAt:0};s.changes+=1,i&&(s.fixChanges+=1),r.timestamp>s.lastChangedAt&&(s.lastChangedAt=r.timestamp),n.set(o,s)}}return n}function Jl(e){let t=jt(e);if(!t||t.commits.length===0)return null;let n=t.commits.map(r=>r.files.length).filter(r=>r>0).sort((r,i)=>r-i);return n.length===0?null:{medianFilesPerCommit:Ul(n,.5),p90FilesPerCommit:Ul(n,.9),commitsAnalyzed:n.length}}function Ul(e,t){let n=Math.min(e.length-1,Math.floor(e.length*t));return e[n]}var RS=rs("git-tracked-files");function is(e){return RS(e,t=>{try{let n=ii(t,["ls-files"]);return new Set(n.split(`
|
|
540
|
+
`).map(r=>r.trim()).filter(r=>r!==""))}catch{return null}})}var IS=rs("git-file-adds");function zl(e){return IS(e,t=>vS(t))}function vS(e){let t;try{t=ii(e,["log","--no-merges","--diff-filter=A","--name-only","-n",String(Gl),"--pretty=format:%x01%H%x00%ct%x00%s"])}catch{return null}let n=new Map,r=-1;for(let i of t.split("")){if(i.trim()==="")continue;r+=1;let o=i.indexOf(`
|
|
521
541
|
`),s=o>=0?i.slice(0,o):i,[,a]=s.split("\0"),c=Number(a)||0;if(!(o<0))for(let l of i.slice(o+1).split(`
|
|
522
|
-
`)){let u=l.trim();u!==""&&n.set(u,{commitsAgo:r,addedAt:c})}}return n}function
|
|
523
|
-
`)).map(o=>o.trim()).filter(o=>o.length>0))]}function
|
|
542
|
+
`)){let u=l.trim();u!==""&&n.set(u,{commitsAgo:r,addedAt:c})}}return n}function si(e,t={}){let{minTogether:n=4,minConfidence:r=.6}=t,i=jt(e);if(!i)return null;let o=new Map,s=new Map;for(let c of i.commits){let l=[...new Set(c.files)].sort();for(let u of l)o.set(u,(o.get(u)??0)+1);for(let u=0;u<l.length;u++)for(let m=u+1;m<l.length;m++){let d=`${l[u]}\0${l[m]}`;s.set(d,(s.get(d)??0)+1)}}let a=[];for(let[c,l]of s){if(l<n)continue;let[u,m]=c.split("\0"),d=o.get(u)??l,p=o.get(m)??l,h=Math.max(l/d,l/p);h<r||a.push({fileA:u,fileB:m,together:l,confidence:h,changesA:d,changesB:p})}return a.sort((c,l)=>l.together-c.together||l.confidence-c.confidence||c.fileA.localeCompare(l.fileA)),a}import{existsSync as DS}from"fs";import{join as NS}from"path";function ss(e){return os.test(e)}var os=/(?:^|\/)(?:package-lock\.json|pnpm-lock\.yaml|yarn\.lock|Cargo\.lock|CHANGELOG(?:\.[a-z]+)?|.*\.map)$|(?:^|\/)(?:dist|build|out|node_modules)\//i;function Bt(e,t,n={}){let{minTogether:r=4,minConfidence:i=.6,limit:o=30}=n,s=jt(e),a=t!==void 0,c=si(e,{minTogether:a?Math.min(r,2):r,minConfidence:a?0:i});if(!s||!c)return{available:!1,commitsAnalyzed:0,findings:[]};let l=X(e),u=n.includeLinked===!0||a,m=[];for(let d of c){if(os.test(d.fileA)||os.test(d.fileB)||!Kl(e,d.fileA)||!Kl(e,d.fileB)||a&&!d.fileA.includes(t)&&!d.fileB.includes(t)||!a&&(G(d.fileA)==="test"||G(d.fileB)==="test"||_S(d.fileA,d.fileB)))continue;let p=LS(l,d.fileA,d.fileB);if(!(!u&&p)&&(m.push({...d,structurallyLinked:p}),m.length>=o))break}return{available:!0,commitsAnalyzed:s.commits.length,findings:m}}function Kl(e,t){return DS(NS(e.config.projectRoot,t))}function _S(e,t){let n=e.lastIndexOf("/"),r=t.lastIndexOf("/");if(e.slice(0,n)!==t.slice(0,r))return!1;let i=e.slice(n+1).split(".")[0],o=t.slice(r+1).split(".")[0];return i!==""&&i===o}function LS(e,t,n){return e.get(t)?.has(n)===!0||e.get(n)?.has(t)===!0}import{execFileSync as as}from"child_process";var cs="Unable to compute git diff.";function xn(e,t={}){let n=yt(e,t);return n.note?wS(n.note,n.changedFileLines):n.changedFiles.length===0?ES(n.changedFileLines):ci(n.changedFiles,[ai(e,n.changedFiles,n.changedFiles)])}function yt(e,t={}){let{base:n="HEAD"}=t;try{let r=kS(e.config.projectRoot,n);return{changedFileLines:r,changedFiles:PS(e,r),note:r.length===0?"No changed files found.":void 0}}catch{return{changedFileLines:[],changedFiles:[],note:cs}}}function ai(e,t,n){let r=new _(e),i=new Set(n),o=[],s=new Map,a=t.flatMap(u=>r.definitionsForFile(u)).filter(OS).sort((u,m)=>u.relativePath.localeCompare(m.relativePath)||u.startLine-m.startLine),c=new Map(a.map(u=>[u.symbolId,TS(e,u.symbolId)])),l=yn(e,a.filter(u=>c.get(u.symbolId)===0));for(let u of a)FS(e,u,n,i,o,s,l.get(u.symbolId)??new Set,c.get(u.symbolId)??0);return{changedSymbols:o,consumerEntries:[...s.entries()].map(([u,m])=>({file:u,symbols:[...m].sort()}))}}function ci(e,t){let n=new Map,r=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 i=MS(n);return{changedFiles:[...e],changedSymbols:r,affectedConsumers:i,summary:{totalChangedFiles:e.length,totalChangedSymbols:r.length,totalAffectedFiles:i.length}}}function wS(e,t=[]){return{changedFiles:t,changedSymbols:[],affectedConsumers:[],summary:{totalChangedFiles:t.length,totalChangedSymbols:0,totalAffectedFiles:0,note:e}}}function ES(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 kS(e,t){let n=as("git",["diff","--name-only",t],{encoding:"utf-8",cwd:e,timeout:1e4}),r=as("git",["diff","--name-only","--cached",t],{encoding:"utf-8",cwd:e,timeout:1e4}),i=as("git",["ls-files","--others","--exclude-standard"],{encoding:"utf-8",cwd:e,timeout:1e4});return[...new Set([n,r,i].flatMap(o=>o.split(`
|
|
543
|
+
`)).map(o=>o.trim()).filter(o=>o.length>0))]}function PS(e,t){let n=[];for(let r of t){let i=e.get(`SELECT relative_path FROM documents
|
|
524
544
|
WHERE relative_path LIKE ?
|
|
525
|
-
LIMIT 1`,`%${r}`);i&&!e.isIgnored(i.relative_path)&&n.push(i.relative_path)}return n}function
|
|
545
|
+
LIMIT 1`,`%${r}`);i&&!e.isIgnored(i.relative_path)&&n.push(i.relative_path)}return n}function FS(e,t,n,r,i,o,s,a){let c=Math.max(a,s.size);if(!$S(t,c))return;let l=b(t.symbol);i.push({symbol:t.symbol,shortName:l,file:t.relativePath,fanIn:c});for(let u of AS(e,t.symbolId,n))Ql(e,r,o,u,l);for(let u of s)Ql(e,r,o,u,l)}function TS(e,t){return e.get(`SELECT COUNT(DISTINCT c.document_id) AS fan_in
|
|
526
546
|
FROM mentions m
|
|
527
547
|
JOIN chunks c ON m.chunk_id = c.id
|
|
528
548
|
WHERE m.symbol_id = ?
|
|
529
|
-
AND m.role != 1`,t)?.fan_in??0}function
|
|
549
|
+
AND m.role != 1`,t)?.fan_in??0}function AS(e,t,n){return n.length===0?[]:e.all(`SELECT DISTINCT ref_d.relative_path
|
|
530
550
|
FROM mentions m
|
|
531
551
|
JOIN chunks c ON m.chunk_id = c.id
|
|
532
552
|
JOIN documents ref_d ON c.document_id = ref_d.id
|
|
533
553
|
WHERE m.symbol_id = ?
|
|
534
554
|
AND m.role != 1
|
|
535
555
|
AND ref_d.relative_path NOT IN (${n.map(()=>"?").join(",")})
|
|
536
|
-
${e.pathExclusionsFor("ref_d")}`,t,...n).map(i=>i.relative_path)}function
|
|
556
|
+
${e.pathExclusionsFor("ref_d")}`,t,...n).map(i=>i.relative_path)}function Ql(e,t,n,r,i){if(e.isIgnored(r)||t.has(r))return;let o=n.get(r);o||(o=new Set,n.set(r,o)),o.add(i)}function MS(e){return[...e.entries()].map(([t,n])=>({file:t,consumedSymbols:n.size})).sort((t,n)=>n.consumedSymbols-t.consumedSymbols)}function OS(e){return!(ct(e.symbol)||e.parentTypeName!==null&&!ae(e.symbol))}function $S(e,t){return ae(e.symbol)||e.isTypeLike?!0:e.parentTypeName===null&&t>0}import{existsSync as Yl,readFileSync as jS}from"fs";import{join as ls}from"path";var nr=/\.(?:md|mdx|rst|txt)$/i;function BS(e){return/(?:^|\/)(?:docs\/plans|plans|adrs?|rfcs?|decisions|changelogs?|archive|reports?)\//i.test(e)||/(?:^|\/)CHANGELOG\.(?:md|mdx|rst|txt)$/i.test(e)}var HS=3,qS=/[A-Za-z0-9_@-]+(?:\/[A-Za-z0-9_.@-]+)+\.[A-Za-z0-9]{1,6}\b/g;function us(e,t={}){let{doc:n,limit:r=20,minCoupling:i=HS}=t,o=jt(e);if(!o)return{available:!1,commitsAnalyzed:0,docsScanned:0,findings:[]};let s=is(e)??new Set,a=new Map,c=new Map,l=new Set;for(let p of o.commits){let h=[...new Set(p.files)],f=h.filter(R=>nr.test(R)),y=h.filter(R=>!nr.test(R));for(let R of h){l.add(R);let E=a.get(R)??[];E.push(p.timestamp),a.set(R,E)}for(let R of f){let E=c.get(R);E||(E=new Map,c.set(R,E));for(let S of y)E.set(S,(E.get(S)??0)+1)}}let u=[...s].filter(p=>nr.test(p)),m=eu(s),d=[];for(let p of u){if(n!==void 0&&!p.includes(n)||n===void 0&&!Zl(e,p)||n!==void 0&&!Yl(ls(e.config.projectRoot,p)))continue;let h=Math.max(0,...a.get(p)??[]),f=new Map,{resolved:y,broken:R}=tu(e,p,s,m,l);for(let S of y){if(S===p||nr.test(S))continue;let x=(a.get(S)??[]).filter(D=>D>h).length;x!==0&&f.set(S,{file:S,evidence:"reference",coChanges:0,changesSinceDocUpdate:x})}for(let[S,x]of c.get(p)??[]){if(x<i||!s.has(S))continue;let D=(a.get(S)??[]).filter($=>$>h).length;if(D===0)continue;let w=f.get(S);w?(w.evidence="both",w.coChanges=x):f.set(S,{file:S,evidence:"co-change",coChanges:x,changesSinceDocUpdate:D})}if(f.size===0&&R.length===0)continue;let E=[...f.values()].sort((S,x)=>x.changesSinceDocUpdate-S.changesSinceDocUpdate);d.push({doc:p,docLastChangedAt:h,staleness:E.reduce((S,x)=>S+x.changesSinceDocUpdate,0)+R.length*10,subjects:E.slice(0,8),brokenReferences:R})}return d.sort((p,h)=>h.staleness-p.staleness),{available:!0,commitsAnalyzed:o.commits.length,docsScanned:u.length,findings:d.slice(0,r)}}function Xl(e,t){let n=is(e)??new Set,r=eu(n),i=[];for(let o of n){if(!Zl(e,o))continue;let{resolved:s}=tu(e,o,n,r,new Set),a=[...s].filter(c=>t.has(c));a.length>0&&i.push({doc:o,cited:a.sort()})}return i}function Zl(e,t){return nr.test(t)&&!BS(t)&&Yl(ls(e.config.projectRoot,t))}function eu(e){let t=new Map;for(let n of e){let r=n.split("/");for(let i of[2,3]){if(r.length<i)continue;let o=r.slice(-i).join("/"),s=t.get(o)??[];s.push(n),t.set(o,s)}}return t}function tu(e,t,n,r,i){let o=new Set,s=new Set,a=VS(e,t);if(!a)return{resolved:o,broken:[]};for(let c of a){if(n.has(c)){o.add(c);continue}let l=r.get(c);if(l&&l.length===1){o.add(l[0]);continue}l&&l.length>1||i.has(c)&&s.add(c)}return{resolved:o,broken:[...s]}}function VS(e,t){let n;try{n=jS(ls(e.config.projectRoot,t),"utf-8")}catch{return null}let r=Ct(e,t,n),i=Rr(e,"doc-path-tokens",t,r);if(i!==null)try{return JSON.parse(i)}catch{}let o=[...new Set([...n.matchAll(qS)].map(s=>s[0].replace(/^\.?\//,"")))];return Ir(e,"doc-path-tokens",t,r,JSON.stringify(o)),o}import{existsSync as qx,readFileSync as Vx,writeFileSync as Wx}from"fs";import{isAbsolute as Ux,join as Gx}from"path";var Z={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 rr from"path";function Ht(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 ms(e,t){if(e===t)return"ok";let n=li(e),r=li(t);return n&&r?WS(n,r)?"ok":"violation":US(e,t)}function nu(e,t){let n=li(Ht(e)),r=li(Ht(t));return!!n&&!!r}function li(e){return/^src\/([^/]+)$/.exec(e)?.[1]??null}function WS(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 US(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 qt(e,t){let{scope:n,minDeviation:r=5}=t??{},i=t?.semantic!==!1,s=new _(e).fileDependencyGraph(n),a=XS(e,n);return KS([...GS(e,s,a,{semantic:i}),...JS(s),...zS(s,r)])}function GS(e,t,n,r){let i=[];for(let[o,s]of t){if(et(o))continue;let a=n.get(o)??new Set;for(let c of s)if(!et(c)&&!a.has(c)){if(r.semantic&&ix(e,o,c)||ox(e,o,c)||sx(e,o,c)||rx(c)||cx(e,o,c)||ax(c))continue;i.push({file:o,kind:"unused-import",description:`Depends on ${c} but references none of its symbols`,dep:c})}}return i}function JS(e){let t=[],n=nx(e);for(let[r,i]of e){if(et(r))continue;let o=Ht(r);for(let s of i){if(et(s))continue;let a=Ht(s);if(o===a)continue;(ms(o,a)??n.get(`${o}->${a}`))==="violation"&&t.push({file:r,kind:"layer-violation",description:`Imports from ${a}/ (${s}) \u2014 may cross architectural boundary`,dep:s,detail:`${o}/ should not depend on ${a}/`})}}return t}function zS(e,t){let n=[];for(let[r,i]of QS(e)){let o=i.filter(a=>!et(a));if(o.length<t)continue;let s=YS(e,o);for(let a of o)for(let c of e.get(a)??[])et(c)||(s.get(c)??0)===1&&rr.dirname(c)!==r&&rr.dirname(c)!==rr.dirname(r)&&(nu(a,c)||n.push({file:a,kind:"pattern-deviation",description:`Only file in ${r}/ that depends on ${c}`,dep:c}))}return n}function KS(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 QS(e){let t=new Map;for(let n of e.keys()){let r=rr.dirname(n),i=t.get(r);i||(i=[],t.set(r,i)),i.push(n)}return t}function YS(e,t){let n=new Map;for(let r of t)for(let i of e.get(r)??[])et(i)||n.set(i,(n.get(i)??0)+1);return n}function XS(e,t){let n=new Map;return ZS(e,n,t),tx(e,n),n}function ZS(e,t,n){for(let r of ex(e,n))ru(e,t,r.from_file,r.to_file)}function ex(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
|
|
537
557
|
FROM mentions m
|
|
538
558
|
JOIN chunks c ON m.chunk_id = c.id
|
|
539
559
|
JOIN documents d1 ON c.document_id = d1.id
|
|
@@ -549,25 +569,31 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
549
569
|
WHERE d1.id != d2.id
|
|
550
570
|
AND m.role != 1
|
|
551
571
|
${e.pathExclusionsFor("d1","d2")}
|
|
552
|
-
${n}`)}function
|
|
553
|
-
`),l=0;for(let u=0;u<c.length;u++){if(!a.test(c[u]??""))continue;if(l++,!o.find(d=>d.startLine<=u&&u<=d.endLine))return!1}return l>0}function
|
|
554
|
-
`),o=Math.max(0,n-2),s=Math.min(i.length-1,n+2);for(let a=o;a<=s;a++){let l=(i[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
|
|
555
|
-
`);for(let a=0;a<s.length;a++)if(!(a>=t.startLine&&a<=t.endLine)&&o.test(s[a]??""))return!0;return!1}function
|
|
572
|
+
${n}`)}function tx(e,t){new _(e).scanSourceReferences({paths:M(e,{includeIgnored:!1}),includeRustAttributeNames:!0,identifierResolution:"permissive"},r=>{r.target.relativePath!==r.sourceFile&&(e.isIgnored(r.target.relativePath)||ru(e,t,r.sourceFile,r.target.relativePath))})}function ru(e,t,n,r){if(e.isIgnored(n)||e.isIgnored(r))return;let i=t.get(n);i||(i=new Set,t.set(n,i)),i.add(r)}function nx(e){let t=new Map;for(let[r,i]of e){if(et(r))continue;let o=Ht(r);for(let s of i){if(et(s))continue;let a=Ht(s);if(o===a||ms(o,a))continue;let c=`${o}->${a}`;t.set(c,(t.get(c)??0)+1)}}let n=new Map;for(let[r,i]of t)n.set(r,i<=2?"violation":"ok");return n}function rx(e){return e.includes("types")||e.endsWith(".d.ts")}function ix(e,t,n){let r=Hn(e,t).filter(i=>i.sourcePath===n);return r.length>0&&r.some(i=>i.isUsed)}function ox(e,t,n){let r=ie(e,t).filter(i=>i.sourcePath===n);return r.length>0&&r.some(i=>i.used)}function sx(e,t,n){let r=ie(e,t).filter(i=>i.sourcePath===n);return r.length>0&&r.every(i=>i.isTypeOnly===!0)}function ax(e){return e.endsWith(".vue")}function cx(e,t,n){let r=ie(e,t).filter(i=>i.sourcePath===n);return r.length===0?!1:r.every(i=>i.kind==="side-effect"||i.kind==="namespace"&&i.usedMembers.length===0&&!i.used)}function et(e){let t=G(e);return!!(t==="entry"||t==="barrel"||t==="test"||t==="worker"||lx(rr.basename(e)))}function lx(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")}function Vt(e,t){let{scope:n,maxLoc:r=15,limit:i=30,scanLimit:o}=t??{},s=new _(e);return _e({candidates:()=>dx(s,n,r),orderCandidates:ei,scanLimit:o,prepare:a=>s.calleeMap(a,{semantic:t?.semantic!==!1}),evaluate:(a,c)=>ux(e,a,c.get(a.symbolId)??[]),orderResults:(a,c)=>a.loc-c.loc||a.file.localeCompare(c.file),limit:i})}function ux(e,t,n){let r=mx(n);if(r.size!==1||!Ji(e,t.relativePath,t.startLine,t.endLine))return null;let[,i]=[...r.entries()][0];return{symbol:t.symbol,shortName:b(t.symbol),file:t.relativePath,startLine:t.startLine,endLine:t.endLine,loc:q(t),forwardsTo:i.symbol,forwardsToShort:b(i.symbol),forwardsToFile:i.file}}function mx(e){let t=e.some(r=>Y(r.symbol))?e.filter(r=>Y(r.symbol)):e,n=new Map;for(let r of t)n.has(r.symbol)||n.set(r.symbol,r);return n}function dx(e,t,n){return e.productionCallableDefinitions({scope:t,minLoc:3,maxLoc:n,requireFunctionLikeSymbol:!0,excludeRootedSymbols:!0,excludeRustTraitImplMembers:!0})}var px=H("definition-consumer-file-usage",{clearGroups:["whole-project","source-file"]});function ir(e,t,n){return e.callerFileMap(t,{semantic:n.semantic,sourceFallback:n.sourceFallback})}function ui(e,t,n){let r=[],i=0,o=0,s=T(t.symbol);for(let a of n)gx(e,a,t.relativePath,s)?i++:ds(e,a,s)?o++:r.push(a);return{realConsumers:r,barrelConsumers:i,importOnlyConsumers:o}}function ds(e,t,n){if(!n)return!1;let r=B(t);if(!r)return!1;let i=px.get(e,t,()=>fx(e,t,r));return i.importedLeaves.has(n)&&!i.usedLeaves.has(n)}function fx(e,t,n){let r=new Set,i=new Set,o=ue(e,t);if(!o)return{importedLeaves:r,usedLeaves:i};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?r.add(c.text):i.add(c.text));for(let m of c.children)a(m,u)};return a(o.rootNode,!1),{importedLeaves:r,usedLeaves:i}}function gx(e,t,n,r){if(!r)return!1;let i=P(e,t);if(!i)return!1;let o=Sc(e,t);if(o.length===0)return!1;let s=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),a=new RegExp(`\\b${s}\\b`),c=i.split(`
|
|
573
|
+
`),l=0;for(let u=0;u<c.length;u++){if(!a.test(c[u]??""))continue;if(l++,!o.find(d=>d.startLine<=u&&u<=d.endLine))return!1}return l>0}function Wt(e,t){let{scope:n,minLoc:r=3,maxLoc:i=80,limit:o=30,includeLowConfidence:s=!1,scanLimit:a}=t??{},c=t?.semantic!==!1,l=new _(e),u=l.scopedDefinitions(n),m=_x(l,n),d={high:0,medium:1,low:2};return _e({candidates:()=>hx(e,l,u,{minLoc:r,maxLoc:i}),orderCandidates:(p,h)=>q(h)-q(p)||p.relativePath.localeCompare(h.relativePath),scanLimit:a,prepare:p=>({consumerFileMap:yx(l,p,{semantic:c}),singletonBackedClassIds:Cx(e,l,u,p,{semantic:c}),candidateIndex:bx(p)}),evaluate:(p,h)=>{if(h.singletonBackedClassIds.has(p.symbolId))return null;let f=Sx(e,p,h.consumerFileMap,h.candidateIndex);if(f.transitivelyReachable||f.realConsumers.length>1||f.realConsumers.length===0&&f.barrelConsumers>0||!wx(f.definition,f.realConsumers.length,m))return null;let y=xx(e,f);return!s&&y.confidence==="low"?null:y},orderResults:(p,h)=>d[p.confidence]-d[h.confidence]||h.loc-p.loc||p.file.localeCompare(h.file)||p.startLine-h.startLine,limit:o})}function hx(e,t,n,r){return n.filter(i=>i.isTypeLike&&q(i)>=r.minLoc).filter(i=>q(i)<=r.maxLoc).filter(i=>!e.isIgnored(i.relativePath)).filter(i=>G(i.relativePath)!=="test").filter(i=>!oe(e,i.symbol,i.relativePath)).filter(i=>!Lx(i.symbol)).filter(i=>!t.hasSuppressionComment(i))}function yx(e,t,n){return ir(e,t,{semantic:n.semantic})}function bx(e){let t=new Map;for(let n of e){let r=t.get(n.relativePath);r||(r=new Map,t.set(n.relativePath,r));let i=T(n.symbol);i&&r.set(i,n)}return t}function Sx(e,t,n,r){let o=[...n.get(t.symbolId)??new Set].filter(u=>u!==t.relativePath&&!e.isIgnored(u)),{realConsumers:s,barrelConsumers:a,importOnlyConsumers:c}=ui(e,t,o),l=Ex(e,t,n,r);return{definition:t,realConsumers:s,barrelConsumers:a+c,transitivelyReachable:l}}function xx(e,t){let n=su(e,t.definition.relativePath,t.definition.startLine),r=ou(t.definition.relativePath)?!0:kx(e,t.definition),{confidence:i,reason:o}=Px(t.realConsumers.length,n,r);return{symbol:t.definition.symbol,shortName:b(t.definition.symbol),file:t.definition.relativePath,startLine:t.definition.startLine,endLine:t.definition.endLine,loc:q(t.definition),consumers:t.realConsumers.length,barrelConsumers:t.barrelConsumers,kind:n,definerUsesType:r,confidence:i,reason:o}}function Cx(e,t,n,r,i){let o=Ix(e,Rx(n),r),s=o.map(l=>l.singleton);if(o.length===0)return new Set;let a=ir(t,s,{semantic:i.semantic}),c=new Set;for(let{singleton:l,classId:u}of o)Dx(e,l,a)&&c.add(u);return c}function Rx(e){let t=new Map;for(let n of e){let r=T(n.symbol);r&&t.set(iu(n.relativePath,r),n)}return t}function Ix(e,t,n){let r=[];for(let i of n){let o=vx(e,t,i);o&&r.push({singleton:o,classId:i.symbolId})}return r}function vx(e,t,n){if(su(e,n.relativePath,n.startLine)!=="class")return null;let r=T(n.symbol);if(!r)return null;let i=Nx(e,n.relativePath,r);return i?t.get(iu(n.relativePath,i))??null:null}function Dx(e,t,n){let r=T(t.symbol),i=n.get(t.symbolId);return!r||!i?!1:[...i].some(o=>o!==t.relativePath&&!e.isIgnored(o)&&!ds(e,o,r))}function iu(e,t){return`${e}\0${t}`}function Nx(e,t,n){let r=P(e,t);if(!r)return null;let i=n.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\bexport\\s+const\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*new\\s+${i}\\s*\\(`);return r.match(o)?.[1]??null}function _x(e,t){return new Set(e.scopedDefinitions(t).filter(n=>n.isFunctionLike).map(n=>n.relativePath))}function Lx(e){let t=ne(e);if("kind"in t)return!1;let n=t.descriptors;if(n.length<2)return!1;let r=n[n.length-1],i=n[n.length-2];return r?.suffix==="type"&&i?.suffix==="type"}function ou(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 wx(e,t,n){return!(ou(e.relativePath)&&t>0||t===0&&n.has(e.relativePath))}function Ex(e,t,n,r){let i=Ki(e,t.relativePath),o=T(t.symbol);if(!o)return!1;let s=i.get(o);if(!s||s.size===0)return!1;let a=r.get(t.relativePath);if(!a)return!1;for(let c of s){let l=a.get(c);if(!l)continue;let u=n.get(l.symbolId);if(u){for(let m of u)if(m!==t.relativePath&&!e.isIgnored(m))return!0}}return!1}function su(e,t,n){let r=P(e,t);if(!r)return"other";let i=r.split(`
|
|
574
|
+
`),o=Math.max(0,n-2),s=Math.min(i.length-1,n+2);for(let a=o;a<=s;a++){let l=(i[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 kx(e,t){let n=P(e,t.relativePath);if(!n)return!1;let r=T(t.symbol);if(!r)return!1;let i=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),o=new RegExp(`\\b${i}\\b`),s=n.split(`
|
|
575
|
+
`);for(let a=0;a<s.length;a++)if(!(a>=t.startLine&&a<=t.endLine)&&o.test(s[a]??""))return!0;return!1}function Px(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 or,extname as mi}from"path";function Ut(e,t){let{scope:n,maxLoc:r=15,limit:i=30,scanLimit:o}=t??{},s=new _(e),a=Bx(s.fileDependencyGraph(n));return _e({candidates:()=>Tx(s,n,r),orderCandidates:ei,scanLimit:o,prepare:c=>({callerFileMap:ir(s,c,{semantic:t?.semantic!==!1}),reverseFanIn:a}),evaluate:(c,l)=>Fx(e,s,c,l),orderResults:(c,l)=>l.callerFanIn-c.callerFanIn||l.loc-c.loc,limit:i})}function Fx(e,t,n,r){let i=Ax(e,t,n,r.callerFileMap);if(i.length!==1)return null;let o=i[0],s=Mx(e,n.symbolId,o);if(!s)return null;let a=Ox(t,e,o,n.symbol,s);if(a&&nn(a.symbol))return null;let{fanIn:c,source:l}=$x(r.callerFileMap,r.reverseFanIn,o,a);return(l==="function"?c<=3:c<=5)?null:{symbol:n.symbol,shortName:b(n.symbol),file:n.relativePath,startLine:n.startLine,endLine:n.endLine,loc:q(n),singleCaller:a?.symbol??"",singleCallerShort:a?.isFunctionLike?b(a.symbol):or(o),callerFanIn:c}}function Tx(e,t,n){return e.productionCallableDefinitions({scope:t,minLoc:2,maxLoc:n,requireFunctionLikeSymbol:!0,excludeRootedSymbols:!0})}function Ax(e,t,n,r){let i=or(n.relativePath,mi(n.relativePath)),o=[...r.get(n.symbolId)??[]].filter(s=>s!==n.relativePath).filter(s=>or(s,mi(s))!==i).filter(s=>{let a=t.fileKind(s);return a!=="barrel"&&a!=="entry"&&a!=="test"});return ui(e,n,o).realConsumers}function Mx(e,t,n){return e.get(`SELECT c.start_line, c.end_line
|
|
556
576
|
FROM mentions m
|
|
557
577
|
JOIN chunks c ON m.chunk_id = c.id
|
|
558
578
|
JOIN documents d ON c.document_id = d.id
|
|
559
579
|
WHERE m.symbol_id = ? AND m.role != 1 AND d.relative_path = ?
|
|
560
|
-
LIMIT 1`,t,n)}function
|
|
561
|
-
`),{path:r,findingCount:n.length}}function
|
|
580
|
+
LIMIT 1`,t,n)}function Ox(e,t,n,r,i){let o=e.definitionsForFile(n),s=jx(t,n,r,i.start_line,i.end_line);return Ce(o,s)}function $x(e,t,n,r){if(r?.isFunctionLike){let i=[...e.get(r.symbolId)??[]].filter(o=>o!==r.relativePath);if(i.length>0)return{fanIn:i.length,source:"function"}}return{fanIn:Hx(t,n),source:"file"}}function jx(e,t,n,r,i){let o=T(n);if(!o)return r;let s=Ye(e,t).get(o);if(!s||s.length===0)return r;for(let a of s)if(a>=r&&a<=i)return a;return r}function Bx(e){let t=new Map;for(let[n,r]of e){t.has(n)||t.set(n,t.get(n)??0);for(let i of r)t.set(i,(t.get(i)??0)+1)}return t}function Hx(e,t){let n=e.get(t)??0;if(n>0)return n;let r=or(t,mi(t)),i=0;for(let[o,s]of e)o!==t&&or(o,mi(o))===r&&s>i&&(i=s);return i}var Jx=75e3,zx=5e3,Kx=2500;function Qx(e){let t=Ee(e);return t.symbols>=Jx||t.documents>=zx?Kx:void 0}var Yx=".scipquery-baseline.json";function di(e,t){return t&&Ux(t)?t:Gx(e.config.projectRoot,t??Yx)}function ps(e,t={}){let{scope:n}=t,r=Qx(e),i=[],o=Xe(e,{scope:n,...Z.dead,scanLimit:r});for(let s of o.symbols)me(e,s.relativePath)||oe(e,s.symbol,s.relativePath)||s.kind==="dead-code"&&i.push(`dead:${s.relativePath}:${s.shortName}`);for(let s of Ot(e,{scope:n,...Z.isolated,scanLimit:r}))me(e,s.relativePath)||oe(e,s.symbol,s.relativePath)||i.push(`isolated:${s.relativePath}:${s.shortName}`);for(let s of Mt(e,{scope:n}))s.kind==="real"&&i.push(`cycle:${Xx(s.path)}`);for(let s of Ze(e,{scope:n,...Z.similar,scanLimit:r}))i.push(`similar:${[s.symbolA,s.symbolB].sort().join("|")}`);for(let s of $t(e,{scope:n,...Z.extract,scanLimit:r}))i.push(`extract:${s.relativePath}:${s.shortName}`);for(let s of Ut(e,{scope:n,...Z.wrappers,scanLimit:r}))i.push(`wrapper:${s.file}:${s.shortName}`);for(let s of Vt(e,{scope:n,...Z.passthroughs,scanLimit:r}))i.push(`passthrough:${s.file}:${s.shortName}`);for(let s of Wt(e,{scope:n,...Z.stale,scanLimit:r}))i.push(`stale:${s.file}:${s.shortName}`);for(let s of qt(e,{scope:n,...Z.drift}).results)s.kind!=="pattern-deviation"&&i.push(`drift:${s.kind}:${s.file}:${s.dep}`);return[...new Set(i)].sort()}function Xx(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 fs(e,t={}){let n=ps(e,{scope:t.scope}),r=di(e,t.path);return Wx(r,JSON.stringify({version:1,findings:n},null,2)+`
|
|
581
|
+
`),{path:r,findingCount:n.length}}function sr(e,t={}){let n=di(e,t.path);if(!qx(n))throw new Error(`No baseline found at ${n}. Create one with: scip-query health --write-baseline`);let r=JSON.parse(Vx(n,"utf-8")),i=new Set(r.findings??[]),o=ps(e,{scope:t.scope}),s=new Set(o);return{baselinePath:n,baselineCount:i.size,current:o,newFindings:o.filter(a=>!i.has(a)),fixedFindings:[...i].filter(a=>!s.has(a))}}import{execFileSync as Zx}from"child_process";var eC=5;function ar(e,t={}){let{base:n="HEAD",minContainment:r=.7,minCallees:i=3,maxHelpers:o=Number.POSITIVE_INFINITY,limit:s=20}=t,a=t.semantic!==!1,c=yt(e,{base:n}),l={available:c.note!==cs,base:n,changedFiles:c.changedFiles,helpersChecked:0,skipped:[],findings:[]};if(!l.available||c.changedFiles.length===0)return l;let u=new _(e),m=new Set(c.changedFiles),d=tC(e,u,m,n);if(d.length===0)return l;let p=d.slice(0,o);d.length>o&&(l.note=`helper scoring capped at ${o} of ${d.length} new symbols`);let h=ni(e,{minCallees:Math.min(3,i),semantic:a}),f=u.calleeMap(p,{semantic:a}),y=p.map(S=>({def:S,callees:ri((f.get(S.symbolId)??[]).map(x=>x.symbol))})),R=new Map;for(let S of h)for(let x of S.callees)R.set(x,(R.get(x)??0)+1);let E=Math.max(8,Math.ceil(Math.sqrt(h.length)));for(let{def:S,callees:x}of y){let D=b(S.symbol);if(x.size<i){l.skipped.push({helperShortName:D,helperFile:S.relativePath,reason:`fewer than ${i} meaningful callees \u2014 too small to score`});continue}let w=rC(e,S.symbolId);if(w.length===0){l.skipped.push({helperShortName:D,helperFile:S.relativePath,reason:"no references yet \u2014 covered by the new-dead check"});continue}l.helpersChecked+=1;let $=[];for(let F of h){if(F.symbol===S.symbol||m.has(F.file)||F.callees.has(S.symbol))continue;let se=Al(x,F.callees);if(se<r)continue;let he=[...x].filter(je=>F.callees.has(je));he.some(je=>(R.get(je)??0)<=E)&&$.push({symbol:F.symbol,shortName:b(F.symbol),file:F.file,containment:se,sharedCallees:he.map(b).sort()})}$.length!==0&&($.sort((F,se)=>se.containment-F.containment||F.file.localeCompare(se.file)),l.findings.push({helperSymbol:S.symbol,helperShortName:D,helperFile:S.relativePath,migratedFiles:w.sort(),leftovers:$.slice(0,eC)}))}return l.findings.sort((S,x)=>(x.leftovers[0]?.containment??0)-(S.leftovers[0]?.containment??0)||S.helperFile.localeCompare(x.helperFile)),l.findings=l.findings.slice(0,s),l}function tC(e,t,n,r){let i=new Map;return t.productionCallableDefinitions({requireFunctionLikeSymbol:!0}).filter(o=>{if(!n.has(o.relativePath))return!1;let s=i.get(o.relativePath);return s===void 0&&(s=nC(e.config.projectRoot,r,o.relativePath),i.set(o.relativePath,s)),s===null||!new RegExp(`\\b${iC(o.leaf)}\\b`).test(s)})}function nC(e,t,n){try{return Zx("git",["show",`${t}:./${n}`],{encoding:"utf-8",cwd:e,timeout:1e4,stdio:["ignore","pipe","ignore"]})}catch{return null}}function rC(e,t){return e.all(`SELECT DISTINCT ref_d.relative_path
|
|
582
|
+
FROM mentions m
|
|
583
|
+
JOIN chunks c ON m.chunk_id = c.id
|
|
584
|
+
JOIN documents ref_d ON c.document_id = ref_d.id
|
|
585
|
+
WHERE m.symbol_id = ?
|
|
586
|
+
AND m.role != 1
|
|
587
|
+
${e.pathExclusionsFor("ref_d")}`,t).map(r=>r.relative_path)}function iC(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function cr(e,t={}){let{scope:n,limit:r=30,scanLimit:i}=t,o=t.files===void 0?null:new Set(t.files),s=new _(e);return _e({candidates:()=>s.productionCallableDefinitions({scope:n,minLoc:2,excludeRootedSymbols:!0,requireFunctionLikeSymbol:!0}).filter(a=>oC(a.relativePath)&&(o===null||o.has(a.relativePath))),scanLimit:i,evaluate:a=>{let c=Q(e,a.relativePath)?.callables.find(m=>m.startLine===a.startLine&&m.endLine===a.endLine);if(!c||c.params.length===0||c.params.some(m=>!m.simple)||c.paramsEndLine>=c.endLine)return null;let l=Ye(e,a.relativePath),u=[];for(let m=c.params.length-1;m>=0;m--){let d=c.params[m];if(d.name===""||d.name.startsWith("_")||sC(l.get(d.name),c.paramsEndLine,c.endLine))break;u.unshift(d.name)}return u.length===0?null:{symbol:a.symbol,shortName:b(a.symbol),file:a.relativePath,startLine:a.startLine,endLine:a.endLine,paramCount:c.paramCount,unusedTrailing:u}},orderResults:(a,c)=>c.unusedTrailing.length-a.unusedTrailing.length||a.file.localeCompare(c.file)||a.startLine-c.startLine,limit:r})}function oC(e){let t=B(e);return t==="typescript"||t==="tsx"||t==="javascript"}function sC(e,t,n){return e?e.some(r=>r>t&&r<=n):!1}var pi=["echo","incomplete-migration","co-change-partner","doc-reference","unused-params","new-dead","baseline"];function gs(e,t={}){let n=t.base??"HEAD",{minTogether:r=6,minConfidence:i=.6,maxEchoChecks:o=Number.POSITIVE_INFINITY,maxHelpers:s=Number.POSITIVE_INFINITY,minSimilarity:a=.8}=t,c=new Set(t.skip??[]),l=xn(e,{base:n}),u=l.changedFiles,m=new Set(u),d={base:n,changedFiles:u,changedSymbols:l.changedSymbols.length,checksRun:[],skipped:[],findings:[],note:l.summary.note};if(u.length===0)return d;let p=(h,f)=>{if(c.has(h)){d.skipped.push({check:h,reason:"skipped via --skip"});return}f()};return p("echo",()=>aC(e,l.changedSymbols,m,o,a,d)),p("incomplete-migration",()=>cC(e,n,s,d)),p("co-change-partner",()=>lC(e,m,r,i,d)),p("doc-reference",()=>uC(e,m,d)),p("unused-params",()=>mC(e,u,d)),p("new-dead",()=>dC(e,l.changedSymbols,d)),p("baseline",()=>pC(e,d)),d}function aC(e,t,n,r,i,o){o.checksRun.push("echo");for(let s of t.slice(0,r)){let a=Zn(e,s.symbol,{minSimilarity:i,limit:3});for(let c of a){let l=c.fileA===s.file?c.fileB:c.fileA,u=c.fileA===s.file?c.shortNameB:c.shortNameA;n.has(l)||o.findings.push({check:"echo",message:`${s.shortName} (${s.file}) is ${Math.round(c.similarity*100)}% similar to established ${u} (${l})`,remediation:`Extend or reuse ${u} instead of keeping the re-implementation.`})}}t.length>r&&o.skipped.push({check:"echo",reason:`echo check capped at ${r} of ${t.length} changed symbols`})}function cC(e,t,n,r){let i=ar(e,{base:t,maxHelpers:n});if(!i.available){r.skipped.push({check:"incomplete-migration",reason:"no git history"});return}r.checksRun.push("incomplete-migration"),i.note&&r.skipped.push({check:"incomplete-migration",reason:i.note});for(let o of i.findings){let s=o.leftovers.map(a=>`${a.shortName} (${a.file}, ${Math.round(a.containment*100)}%)`).join(", ");r.findings.push({check:"incomplete-migration",message:`new helper ${o.helperShortName} (${o.helperFile}) is wired into ${o.migratedFiles.length} file(s), but ${o.leftovers.length} similar un-migrated site(s) remain: ${s}`,remediation:`Migrate the remaining sites to ${o.helperShortName}, or confirm they are intentionally different.`})}}function lC(e,t,n,r,i){let o=si(e,{minTogether:n,minConfidence:0});if(!o){i.skipped.push({check:"co-change-partner",reason:"no git history"});return}i.checksRun.push("co-change-partner");let s=new Set;for(let a of o){let c=t.has(a.fileA),l=t.has(a.fileB);if(c===l)continue;let u=c?a.fileA:a.fileB,m=c?a.fileB:a.fileA,d=c?a.changesA:a.changesB,p=d>0?a.together/d:0;if(p<r||ss(m)||ss(u)||!au(`${e.config.projectRoot}/${m}`))continue;let h=`${u}|${m}`;s.has(h)||(s.add(h),i.findings.push({check:"co-change-partner",message:`${u} changed, but ${m} did not \u2014 they change together ${a.together}x (${Math.round(p*100)}% of the time)`,remediation:`Update ${m} alongside this change, or confirm the coupling no longer holds.`}))}}function uC(e,t,n){n.checksRun.push("doc-reference");for(let r of Xl(e,t))t.has(r.doc)||n.findings.push({check:"doc-reference",message:`${r.doc} cites ${r.cited.join(", ")} \u2014 changed in this diff, doc untouched`,remediation:`Re-read ${r.doc} and update its claims, or update its citations.`})}function mC(e,t,n){n.checksRun.push("unused-params");for(let r of cr(e,{files:t,limit:50}))n.findings.push({check:"unused-params",message:`${r.shortName} (${r.file}) has trailing unused parameter(s): ${r.unusedTrailing.join(", ")}`,remediation:"Drop the unused trailing parameters and their call-site arguments."})}function dC(e,t,n){n.checksRun.push("new-dead");let r=new _(e);for(let i of t)i.fanIn>0||r.fileKind(i.file)!=="test"&&(me(e,i.file)||oe(e,i.symbol,i.file)||n.findings.push({check:"new-dead",message:`${i.shortName} (${i.file}) was changed but has zero indexed consumers`,remediation:"Wire it up, or remove it before it becomes permanent dead code."}))}function pC(e,t){if(!au(di(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=sr(e);for(let r of n.newFindings)t.findings.push({check:"baseline",message:`new finding vs committed baseline: ${r}`,remediation:"Fix the finding, or knowingly accept it via health --write-baseline."})}function hs(e,t={}){let{windowCommits:n=100,minSimilarity:r=.7,limit:i=30,scope:o,scanLimit:s}=t,a=zl(e);if(!a)return{available:!1,windowCommits:n,findings:[]};let c=Ze(e,{scope:o,minSimilarity:r,limit:i*5,crossFileOnly:!0,scanLimit:s,semantic:t.semantic}),l=[];for(let u of c){let m=a.get(u.fileA)?.commitsAgo??null,d=a.get(u.fileB)?.commitsAgo??null,p=m!==null&&m<=n,h=d!==null&&d<=n;if(!(!p&&!h)){if(p&&h){let f=(m??0)<=(d??0);l.push({kind:"twin",echoSymbol:f?u.shortNameA:u.shortNameB,echoFile:f?u.fileA:u.fileB,echoAgeCommits:(f?m:d)??0,establishedSymbol:f?u.shortNameB:u.shortNameA,establishedFile:f?u.fileB:u.fileA,establishedAgeCommits:f?d:m,similarity:u.similarity,sharedCallees:u.sharedCallees})}else l.push({kind:"echo",echoSymbol:p?u.shortNameA:u.shortNameB,echoFile:p?u.fileA:u.fileB,echoAgeCommits:(p?m:d)??0,establishedSymbol:p?u.shortNameB:u.shortNameA,establishedFile:p?u.fileB:u.fileA,establishedAgeCommits:p?d:m,similarity:u.similarity,sharedCallees:u.sharedCallees});if(l.length>=i)break}}return l.sort((u,m)=>(u.kind===m.kind?0:u.kind==="echo"?-1:1)||m.similarity-u.similarity),{available:!0,windowCommits:n,findings:l}}var fC=/scip-query[\s:-]*ignore[\s:-]*(dead(?:-code)?|stale|wrapper|passthrough|drift|extract|similar)?/gi,gC=te("suppression-inventory",{clearGroups:["whole-project"]});function fi(e){return gC.get(e,()=>hC(e))}function hC(e){let t={dead:0,stale:0,wrapper:0,passthrough:0,drift:0,extract:0,similar:0,uncategorized:0},n=new Map,r=0;for(let i of Ve(e)){let o=P(e,i);if(!(!o||!o.includes("scip-query")))for(let s of o.matchAll(fC)){r+=1,n.set(i,(n.get(i)??0)+1);let a=yC(s[1]);t[a]+=1}}return{total:r,byCategory:t,byFile:n}}function yC(e){if(!e)return"uncategorized";let t=e.toLowerCase();return t==="dead-code"?"dead":t}import{readFileSync as bC}from"fs";import{join as SC}from"path";function lr(e,t,n={}){let r=A(e,t);if(!r)return null;let i=new _(e),o=vC(CC(e,r.relativePath,r.startLine,r.endLine),xC(e,r.relativePath)),s=r.endLine-r.startLine+1,c=i.calleeMap([r],{additive:!0,semantic:n.semantic}).get(r.symbolId)??[],l=new Set(c.map(u=>u.symbol));return{symbol:r.symbol,shortName:b(r.symbol),relativePath:r.relativePath,startLine:r.startLine,endLine:r.endLine,loc:s,branches:o,cyclomaticEstimate:o+1,calleeCount:l.size,fanIn:RC(e,r.symbolId),fanOut:IC(c,r.relativePath)}}function xC(e,t){return e.get("SELECT language FROM documents WHERE relative_path = ?",t)?.language??"unknown"}function CC(e,t,n,r){try{return bC(SC(e.config.projectRoot,t),"utf-8").split(`
|
|
562
588
|
`).slice(n,r+1).join(`
|
|
563
|
-
`)}catch{return""}}function
|
|
589
|
+
`)}catch{return""}}function RC(e,t){return e.get(`SELECT COUNT(DISTINCT c.document_id) AS c
|
|
564
590
|
FROM mentions m
|
|
565
591
|
JOIN chunks c ON m.chunk_id = c.id
|
|
566
|
-
WHERE m.symbol_id = ? AND m.role != 1`,t)?.c??0}function bx(e,t){return new Set(e.filter(n=>n.file!==t).map(n=>n.symbol)).size}function Sx(e,t){let n=vt(e),r=0,i=[/\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 i){let s=n.match(o);s&&(r+=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&&(r+=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&&(r+=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&&(r+=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&&(r+=a.length)}}return r}function nr(e,t,n={}){let r=F(e,t);if(!r)return null;let i=[{file:r.relativePath,line:r.startLine}],o=pt(e,r,{semantic:n.semantic}).map(c=>({file:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol??"(top-level)",enclosingShort:c.enclosingSymbol?b(c.enclosingSymbol):"(top-level)"})),{producers:s,consumers:a}=xx(e,r,o,{semantic:n.semantic!==!1});return{symbol:r.symbol,shortName:b(r.symbol),relativePath:r.relativePath,definitionSites:i.filter(c=>!e.isIgnored(c.file)),usageSites:o,producers:s.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:b(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)":b(c.symbol),file:c.file}))}}function xx(e,t,n,r){let i=dn(he(e,t,{limit:30,semantic:r.semantic}).map(a=>({symbol:a.symbol,file:a.file}))),o=dn(Re(e,t,{limit:30,semantic:r.semantic})),s=o.length>0?o:dn(n.map(a=>({symbol:a.enclosingSymbol==="(top-level)"?a.file:a.enclosingSymbol,file:a.file})));return{producers:i,consumers:s}}function gn(e,t,n={}){let{direction:r="backward",maxDepth:i=3}=n,o=F(e,t);return o?r==="backward"?Cx(e,o,i,{semantic:n.semantic!==!1}):Rx(e,o,{semantic:n.semantic!==!1}):null}function Cx(e,t,n,r){let i=[],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=he(e,l,{semantic:r.semantic});for(let m of u){if(o.has(m.symbol))continue;o.add(m.symbol),i.push({symbol:m.symbol,shortName:b(m.symbol),file:m.file,relationship:a===1?"referenced within definition (callee)":`depth ${a} callee`});let d=tn(e,m.symbol);d&&!e.isIgnored(d.relativePath)&&c.push(d)}}s=c}return{symbol:t.symbol,shortName:b(t.symbol),direction:"backward",connectedSymbols:i}}function Rx(e,t,n){let r=new Set,i=[],o=new L(e);for(let s of pt(e,t,{semantic:n.semantic})){if(i.length>=30)break;let a=s.enclosingSymbol??be(o.definitionsForFile(s.file),s.line)?.symbol??null;if(!a||a===t.symbol)continue;let c=tn(e,a);!c||e.isIgnored(c.relativePath)||r.has(c.symbol)||(r.add(c.symbol),i.push({symbol:c.symbol,shortName:b(c.symbol),file:c.relativePath,relationship:`references target at ${s.file}:${s.line+1}`}))}return i.sort((s,a)=>s.file.localeCompare(a.file)),{symbol:t.symbol,shortName:b(t.symbol),direction:"forward",connectedSymbols:i}}function es(e,t,n={}){let r=n.impactDepth??3,i=n.sliceDepth??3,o=n.semantic,s=!vx(t),a=s?Mn(e,t,{semantic:o}):{definitions:[],referencedBy:[]},c=s?qn(e,t,{semantic:o}):null,l=s?tr(e,t,{semantic:o}):null,u=s?nr(e,t,{semantic:o}):null,m=s?gn(e,t,{direction:"backward",maxDepth:i,semantic:o}):null,d=s?gn(e,t,{direction:"forward",maxDepth:i,semantic:o}):null,p=s?Jn(e,t,{maxDepth:r,scope:n.scope}):[],h=zn(e,t,{semantic:o}),f=On(e,t),y=$n(e,t),C=jn(e,t),E=Bn(e,t),N={symbol:a.definitions.length>0||a.referencedBy.length>0||c!==null||l!==null||u!==null||m!==null||d!==null||p.length>0,file:h!==null||f.length>0||y.length>0,module:C.files.length>0||C.symbols.length>0||E.length>0},I=[];!N.symbol&&!N.file&&!N.module&&I.push("No symbol, file, or module matched target.");let v=h?.file??a.definitions[0]?.relativePath??null;return{target:t,matched:N,history:Ix(e,v),trace:a,callGraph:c,complexity:l,dataflow:u,backwardSlice:m,forwardSlice:d,affected:p,changeSurface:h,deps:f,rdeps:y,system:C,surface:E,warnings:I}}function Ix(e,t){let n={available:!1,file:t,churn:null,coChangePartners:[],suppressionsInFile:0};if(!t)return n;let r=Qr(e);if(!r)return n;let i=Tt(e,t,{limit:5});return{available:!0,file:t,churn:r.get(t)??{changes:0,fixChanges:0,lastChangedAt:0},coChangePartners:i.findings.map(o=>({file:o.fileA===t?o.fileB:o.fileA,together:o.together,confidence:o.confidence})),suppressionsInFile:ri(e).byFile.get(t)??0}}function vx(e){return e.includes("/")||e.includes("\\")||/\.[A-Za-z0-9]+(?::\d+(?:-\d+)?)?$/.test(e)}function rr(e,t){let{scope:n,minLoc:r=10,limit:i=30,scanLimit:o}=t??{},s=new L(e);return ve({candidates:()=>s.productionCallableDefinitions({scope:n,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)=>Dx(a,c,r),orderResults:(a,c)=>c.score-a.score||c.loc-a.loc,limit:i})}function Dx(e,t,n){let r=e.endLine-e.startLine+1;if(r<n)return null;let i=t.callerMap.get(e.symbolId)?.size??0,o=t.calleeMap.get(e.symbolId)??[],s=o.filter(l=>l.file!==e.relativePath),a=new Set(s.map(l=>`${l.symbol}|${l.file}`)).size,c=new Set(o.map(l=>`${l.symbol}|${l.file}`)).size;return{symbol:e.symbol,shortName:b(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:r,fanIn:i,fanOut:a,calleeCount:c,score:Math.round(r/50*(i/5)*Math.max(a/5,1)*100)/100}}function Vl(e){let t=wx(e),{breakdown:n}=kx(e),r=ql(n,"risk"),i=ql(n,"hygiene");return{score:Math.min(r,i),riskScore:r,hygieneScore:i,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,extractionCandidates:e.extractCount,wrappers:e.wrappers.count,passthroughs:e.passthroughs.count,staleTypes:e.stale.count,driftedFiles:e.drift.count,complexityHotspotCount:e.complexity.extremeCount,hiddenCouplingPairs:e.gitEvidence?.hiddenCoupling.pairCount??null},axes:Nx(e),validation:_x(e),suppressions:e.suppressions,actions:t,topComplexity:e.complexity.top,warnings:e.warnings.length>0?e.warnings:void 0}}function Nx(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:Lx(e),evidenceQuality:{graphFindings:e.dead.count+e.isolated.count+e.realCycleCount,heuristicFindings:e.similarCount+e.extractCount+e.wrappers.count+e.passthroughs.count+e.stale.count+e.drift.count,userSuppressed:e.suppressions?.total??0}}}function Lx(e){let t=e.gitEvidence?.fileStats;return t?e.complexity.top.map(n=>{let r=n.file?t[n.file]?.changes??0:0;return{...n,changes:r,weighted:hn(n.score*Math.log2(1+r))}}).sort((n,r)=>r.weighted-n.weighted):null}function _x(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??[]},r=new Set(Object.values(n).flat()),i=0,o=0,s=0;for(let[u,m]of Object.entries(t))r.has(u)?i+=m.fixChanges:(o+=m.fixChanges,s+=1);let a=r.size>0?hn(i/r.size):0,c=s>0?hn(o/s):0,l={};for(let[u,m]of Object.entries(n)){let d=new Set(m);if(d.size===0)continue;let p=0;for(let f of d)p+=t[f]?.fixChanges??0;let h=hn(p/d.size);l[u]={flaggedFiles:d.size,fixDensity:h,lift:c>0?hn(h/c):null}}return{flaggedFiles:r.size,flaggedFixDensity:a,baselineFixDensity:c,ratio:r.size>0&&c>0?hn(a/c):null,byCategory:l}}function hn(e){return Math.round(e*100)/100}function wx(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.extractCount>0&&t.push({category:"Extraction candidates",evidence:"heuristic",description:`${e.extractCount} large functions with isolated callee clusters \u2014 extract method opportunities`,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 that could be inlined`,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 i=[];e.stale.unused>0&&i.push(`${e.stale.unused} unused`),e.stale.singleUse>0&&i.push(`${e.stale.singleUse} single-consumer (not in types file)`),t.push({category:"Stale abstractions",evidence:"heuristic",description:`${i.join(", ")} \u2014 premature abstraction`,effort:"low",impact:"medium",count:e.stale.count,locRecoverable:e.stale.loc})}if(e.drift.count>0){let i=[];e.drift.unusedImports>0&&i.push(`${e.drift.unusedImports} unused imports`),e.drift.layerViolations>0&&i.push(`${e.drift.layerViolations} layer violations`),t.push({category:"Structural drift",evidence:"heuristic",description:i.join(", "),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 i=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 dependency edge`+(i?` (e.g. ${i.fileA} \u2194 ${i.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},r={low:3,medium:2,high:1};return t.sort((i,o)=>{let s=n[i.impact]*r[i.effort];return n[o.impact]*r[o.effort]-s}),t}var Ex={"dead-code":"risk",isolated:"risk",cycles:"risk",complexity:"risk","hidden-coupling":"risk",similar:"hygiene",extract:"hygiene",wrappers:"hygiene",passthroughs:"hygiene","stale-abstractions":"hygiene",drift:"hygiene"};function ql(e,t){let n=e.filter(r=>r.kind===t).reduce((r,i)=>r+i.points,0);return Math.max(0,Math.min(100,100-n))}function kx(e){let t=Math.max(e.statsResult.documents,1),n=Math.max(e.statsResult.symbols,1),r=[],i=(m,d,p)=>{d>0&&r.push({axis:m,points:d,detail:p,kind:Ex[m]??"hygiene"})},o=e.dead.count/n;i("dead-code",Math.min(20,Math.round(o*200)),`${e.dead.count} dead symbols (${e.dead.loc} LOC deletable)`);let s=e.isolated.count/n;i("isolated",Math.min(10,Math.round(s*200)),`${e.isolated.count} isolated symbols (${e.isolated.loc} LOC deletable)`),i("cycles",Math.min(15,e.realCycleCount*5),`${e.realCycleCount} real dependency cycle(s)`);let a=e.similarCount/n*1e3;i("similar",Math.min(10,Math.round(a)),`${e.similarCount} similar function pair(s)`);let c=e.extractCount/n*1e3;i("extract",Math.min(5,Math.round(c/2)),`${e.extractCount} extraction candidate(s)`),i("wrappers",Math.min(3,e.wrappers.count),`${e.wrappers.count} wrapper candidate(s)`),i("passthroughs",Math.min(3,e.passthroughs.count),`${e.passthroughs.count} passthrough candidate(s)`);let l=e.stale.count/Math.max(n*.1,1);i("stale-abstractions",Math.min(8,Math.round(l*10)),`${e.stale.count} stale abstraction(s)`);let u=e.drift.count/t;return i("drift",Math.min(5,Math.round(u*50)),`${e.drift.count} drift finding(s)`),i("complexity",Math.min(5,e.complexity.extremeCount*2),`${e.complexity.extremeCount} extreme complexity hotspot(s)`),e.gitEvidence&&i("hidden-coupling",Math.min(5,e.gitEvidence.hiddenCoupling.pairCount),`${e.gitEvidence.hiddenCoupling.pairCount} co-changing pair(s) without a dependency edge`),{breakdown:r}}import{getHeapStatistics as Px}from"v8";var Fx=64*1024*1024;function ts(){let e=globalThis.gc;if(!e)return;let t=Px();t.heap_size_limit-t.used_heap_size<Fx||e()}var Ax=50,Tx=75e3,Mx=5e3,Wl=2500,ir=["overview","dead","isolated","cycles","similar","extract-candidates","wrapper-candidates","passthrough-candidates","stale-abstractions","drift","complexity-hotspots","git-evidence","suppressions"],Ox={overview:(e,t,n,r)=>({phase:"overview",statsResult:r,warnings:n.warnings}),dead:(e,t,n)=>({phase:"dead",dead:Bx(e,t,n)}),isolated:(e,t,n)=>({phase:"isolated",isolated:Hx(e,t,n)}),cycles:(e,t,n)=>({phase:"cycles",realCycleCount:qx(e,t,n)}),similar:(e,t,n)=>({phase:"similar",similarCount:Vx(e,t,n)}),"extract-candidates":(e,t,n)=>({phase:"extract-candidates",extractCount:Wx(e,t,n)}),"wrapper-candidates":(e,t,n)=>({phase:"wrapper-candidates",wrappers:Ux(e,t,n)}),"passthrough-candidates":(e,t,n)=>({phase:"passthrough-candidates",passthroughs:Gx(e,t,n)}),"stale-abstractions":(e,t,n)=>({phase:"stale-abstractions",stale:Jx(e,t,n)}),drift:(e,t,n)=>({phase:"drift",drift:Kx(e,t,n)}),"complexity-hotspots":(e,t,n)=>({phase:"complexity-hotspots",complexity:Yx(e,t,n)}),"git-evidence":(e,t,n)=>({phase:"git-evidence",gitEvidence:zx(e,n)}),suppressions:(e,t,n)=>({phase:"suppressions",suppressions:Qx(e,n)})};function ns(e,t,n={}){return $x(e,n.full===!0,(r,i)=>Ox[t](e,n.scope,i,r))}function $x(e,t,n){let r=Ne(e),i=Xx(r,t);try{return n(r,i)}finally{po(e,{semanticProvider:!0}),ts()}}function rs(e){return Vl(jx(e))}function jx(e){let t=ke(e,"overview");return{statsResult:t.statsResult,warnings:t.warnings,dead:ke(e,"dead").dead,isolated:ke(e,"isolated").isolated,realCycleCount:ke(e,"cycles").realCycleCount,similarCount:ke(e,"similar").similarCount,extractCount:ke(e,"extract-candidates").extractCount,wrappers:ke(e,"wrapper-candidates").wrappers,passthroughs:ke(e,"passthrough-candidates").passthroughs,stale:ke(e,"stale-abstractions").stale,drift:ke(e,"drift").drift,complexity:ke(e,"complexity-hotspots").complexity,gitEvidence:Ul(e,"git-evidence")?.gitEvidence??null,suppressions:Ul(e,"suppressions")?.suppressions??null}}function Ul(e,t){return e.find(n=>n.phase===t)}function ke(e,t){let n=e.find(r=>r.phase===t);if(!n)throw new Error(`Missing health phase result: ${t}`);return n}function Bx(e,t,n){return Pe(e,n,"dead",()=>{let r=ze(e,{scope:t,minLoc:3,skipBarrels:!0,deadCodeOnly:!0,scanLimit:n.candidateScanLimit,semantic:!1});return is(tC(e,r.symbols))})}function Hx(e,t,n){return Pe(e,n,"isolated",()=>{let r=Pt(e,{scope:t,minLoc:3,scanLimit:n.candidateScanLimit,semantic:!1});return is(nC(e,r))})}function qx(e,t,n){return Pe(e,n,"cycles",()=>kt(e,{scope:t}).filter(i=>i.kind==="real").length)}function Vx(e,t,n){return Pe(e,n,"similar",()=>Qe(e,{scope:t,minSimilarity:.6,limit:50,minCallees:4,scanLimit:n.candidateScanLimit,semantic:!1}).length)}function Wx(e,t,n){return Pe(e,n,"extract-candidates",()=>Ft(e,{scope:t,minLoc:15,minCallees:5,limit:50,scanLimit:n.candidateScanLimit,semantic:!1}).length)}function Ux(e,t,n){return Gl(e,n,"wrapper-candidates",()=>Bt(e,{scope:t,maxLoc:15,limit:50,scanLimit:n.candidateScanLimit,semantic:!1}))}function Gx(e,t,n){return Gl(e,n,"passthrough-candidates",()=>$t(e,{scope:t,maxLoc:15,limit:50,scanLimit:n.candidateScanLimit,semantic:!1}))}function Jx(e,t,n){return Pe(e,n,"stale-abstractions",()=>{let r=jt(e,{scope:t,minLoc:3,limit:50,scanLimit:n.candidateScanLimit,semantic:!1}),i=r.filter(o=>o.consumers===0).length;return{count:r.length,loc:r.reduce((o,s)=>o+s.loc,0),files:[...new Set(r.map(o=>o.file))],unused:i,singleUse:r.length-i}})}function zx(e,t){return Pe(e,t,"git-evidence",()=>{let n=Qr(e);if(!n)return null;let r=Tt(e,void 0,{limit:50}),i={};for(let[o,s]of n)i[o]={changes:s.changes,fixChanges:s.fixChanges};return{amplification:Ll(e),hiddenCoupling:{pairCount:r.findings.length,top:r.findings.slice(0,5).map(o=>({fileA:o.fileA,fileB:o.fileB,together:o.together,confidence:o.confidence}))},fileStats:i}})}function Qx(e,t){return Pe(e,t,"suppressions",()=>{let n=ri(e);return{total:n.total,byCategory:{...n.byCategory}}})}function Kx(e,t,n){return Pe(e,n,"drift",()=>{let r=Ot(e,{scope:t,semantic:!1});return{count:r.unusedImports+r.layerViolations,unusedImports:r.unusedImports,layerViolations:r.layerViolations}})}function Yx(e,t,n){return Pe(e,n,"complexity-hotspots",()=>{let r=rr(e,{scope:t,minLoc:10,limit:10,scanLimit:n.candidateScanLimit,semantic:!1});return{top:r.slice(0,5).map(i=>({symbol:i.shortName,score:i.score,file:i.file})),extremeCount:r.filter(i=>i.score>Ax).length}})}function Xx(e,t){return e.symbols>=Tx||e.documents>=Mx?t?{candidateScanLimit:void 0,releaseCachesBetweenPhases:!0,warnings:["Large index detected; running unbounded health analyses because --full was supplied."]}:{candidateScanLimit:Wl,releaseCachesBetweenPhases:!0,warnings:[`Large index detected; candidate-style health checks scanned their highest-priority ${Wl} symbols. Run "scip-query health --full" for unbounded candidate counts.`]}:{candidateScanLimit:void 0,releaseCachesBetweenPhases:!0,warnings:[]}}function Zx(e,t){t.releaseCachesBetweenPhases&&(po(e),ts())}function Pe(e,t,n,r){eC(n);try{return r()}finally{Zx(e,t)}}function Gl(e,t,n,r){return Pe(e,t,n,()=>is(r()))}function eC(e){process.env.SCIP_QUERY_HEALTH_TRACE==="1"&&console.error(`[health] ${e}`)}function tC(e,t){return t.filter(n=>!le(e,n.relativePath)&&!ne(e,n.symbol,n.relativePath)&&n.kind==="dead-code")}function nC(e,t){return t.filter(n=>!le(e,n.relativePath)&&!ne(e,n.symbol,n.relativePath))}function is(e){let t=new Set;for(let n of e){let r=n.relativePath??n.file;r&&t.add(r)}return{count:e.length,loc:e.reduce((n,r)=>n+r.loc,0),files:[...t]}}function os(e,t,n,r={}){let i=F(e,t),o=F(e,n);if(!i||!o)return null;let s=new Set(he(e,i,{semantic:r.semantic}).map(y=>y.symbol)),a=new Set(he(e,o,{semantic:r.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 m=new Set([...s,...a]),d=m.size>0?c.length/m.size:0,p;m.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 h=i.endLine-i.startLine+1,f=o.endLine-o.startLine+1;return{symbolA:{symbol:i.symbol,shortName:b(i.symbol),file:i.relativePath,loc:h},symbolB:{symbol:o.symbol,shortName:b(o.symbol),file:o.relativePath,loc:f},similarity:d,sharedCallees:c.map(b),uniqueToA:l.map(b),uniqueToB:u.map(b),consolidationStrategy:p}}import{readFileSync as Jl}from"fs";import{extname as rC,join as zl}from"path";function ss(e,t,n={}){let{context:r=0}=n,i=iC(t);if(i)return sC(e,i.filePath,i.startLine,i.endLine,r);let o=F(e,t);return o?oC(e,o,r):null}function iC(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 oC(e,t,n){let r=e.get("SELECT language FROM documents WHERE relative_path = ?",t.relativePath),i=zl(e.config.projectRoot,t.relativePath),o;try{o=Jl(i,"utf-8")}catch{return null}let s=o.split(`
|
|
592
|
+
WHERE m.symbol_id = ? AND m.role != 1`,t)?.c??0}function IC(e,t){return new Set(e.filter(n=>n.file!==t).map(n=>n.symbol)).size}function vC(e,t){let n=Lt(e),r=0,i=[/\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 i){let s=n.match(o);s&&(r+=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&&(r+=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&&(r+=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&&(r+=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&&(r+=a.length)}}return r}function ur(e,t,n={}){let r=A(e,t);if(!r)return null;let i=[{file:r.relativePath,line:r.startLine}],o=ht(e,r,{semantic:n.semantic}).map(c=>({file:c.file,line:c.line,enclosingSymbol:c.enclosingSymbol??"(top-level)",enclosingShort:c.enclosingSymbol?b(c.enclosingSymbol):"(top-level)"})),{producers:s,consumers:a}=DC(e,r,o,{semantic:n.semantic!==!1});return{symbol:r.symbol,shortName:b(r.symbol),relativePath:r.relativePath,definitionSites:i.filter(c=>!e.isIgnored(c.file)),usageSites:o,producers:s.filter(c=>!e.isIgnored(c.file)).map(c=>({symbol:c.symbol,shortName:b(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)":b(c.symbol),file:c.file}))}}function DC(e,t,n,r){let i=Sn(Se(e,t,{limit:30,semantic:r.semantic}).map(a=>({symbol:a.symbol,file:a.file}))),o=Sn(De(e,t,{limit:30,semantic:r.semantic})),s=o.length>0?o:Sn(n.map(a=>({symbol:a.enclosingSymbol==="(top-level)"?a.file:a.enclosingSymbol,file:a.file})));return{producers:i,consumers:s}}function Cn(e,t,n={}){let{direction:r="backward",maxDepth:i=3}=n,o=A(e,t);return o?r==="backward"?NC(e,o,i,{semantic:n.semantic!==!1}):_C(e,o,{semantic:n.semantic!==!1}):null}function NC(e,t,n,r){let i=[],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=Se(e,l,{semantic:r.semantic});for(let m of u){if(o.has(m.symbol))continue;o.add(m.symbol),i.push({symbol:m.symbol,shortName:b(m.symbol),file:m.file,relationship:a===1?"referenced within definition (callee)":`depth ${a} callee`});let d=cn(e,m.symbol);d&&!e.isIgnored(d.relativePath)&&c.push(d)}}s=c}return{symbol:t.symbol,shortName:b(t.symbol),direction:"backward",connectedSymbols:i}}function _C(e,t,n){let r=new Set,i=[],o=new _(e);for(let s of ht(e,t,{semantic:n.semantic})){if(i.length>=30)break;let a=s.enclosingSymbol??Ce(o.definitionsForFile(s.file),s.line)?.symbol??null;if(!a||a===t.symbol)continue;let c=cn(e,a);!c||e.isIgnored(c.relativePath)||r.has(c.symbol)||(r.add(c.symbol),i.push({symbol:c.symbol,shortName:b(c.symbol),file:c.relativePath,relationship:`references target at ${s.file}:${s.line+1}`}))}return i.sort((s,a)=>s.file.localeCompare(a.file)),{symbol:t.symbol,shortName:b(t.symbol),direction:"forward",connectedSymbols:i}}function ys(e,t,n={}){let r=n.impactDepth??3,i=n.sliceDepth??3,o=n.semantic,s=!wC(t),a=s?Vn(e,t,{semantic:o}):{definitions:[],referencedBy:[]},c=s?Kn(e,t,{semantic:o}):null,l=s?lr(e,t,{semantic:o}):null,u=s?ur(e,t,{semantic:o}):null,m=s?Cn(e,t,{direction:"backward",maxDepth:i,semantic:o}):null,d=s?Cn(e,t,{direction:"forward",maxDepth:i,semantic:o}):null,p=s?er(e,t,{maxDepth:r,scope:n.scope}):[],h=tr(e,t,{semantic:o}),f=Wn(e,t),y=Un(e,t),R=Gn(e,t),E=Jn(e,t),S={symbol:a.definitions.length>0||a.referencedBy.length>0||c!==null||l!==null||u!==null||m!==null||d!==null||p.length>0,file:h!==null||f.length>0||y.length>0,module:R.files.length>0||R.symbols.length>0||E.length>0},x=[];!S.symbol&&!S.file&&!S.module&&x.push("No symbol, file, or module matched target.");let D=h?.file??a.definitions[0]?.relativePath??null;return{target:t,matched:S,history:LC(e,D),trace:a,callGraph:c,complexity:l,dataflow:u,backwardSlice:m,forwardSlice:d,affected:p,changeSurface:h,deps:f,rdeps:y,system:R,surface:E,warnings:x}}function LC(e,t){let n={available:!1,file:t,churn:null,coChangePartners:[],suppressionsInFile:0};if(!t)return n;let r=oi(e);if(!r)return n;let i=Bt(e,t,{limit:5});return{available:!0,file:t,churn:r.get(t)??{changes:0,fixChanges:0,lastChangedAt:0},coChangePartners:i.findings.map(o=>({file:o.fileA===t?o.fileB:o.fileA,together:o.together,confidence:o.confidence})),suppressionsInFile:fi(e).byFile.get(t)??0}}function wC(e){return e.includes("/")||e.includes("\\")||/\.[A-Za-z0-9]+(?::\d+(?:-\d+)?)?$/.test(e)}function mr(e,t){let{scope:n,minLoc:r=10,limit:i=30,scanLimit:o}=t??{},s=new _(e);return _e({candidates:()=>s.productionCallableDefinitions({scope:n,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)=>EC(a,c,r),orderResults:(a,c)=>c.score-a.score||c.loc-a.loc,limit:i})}function EC(e,t,n){let r=e.endLine-e.startLine+1;if(r<n)return null;let i=t.callerMap.get(e.symbolId)?.size??0,o=t.calleeMap.get(e.symbolId)??[],s=o.filter(l=>l.file!==e.relativePath),a=new Set(s.map(l=>`${l.symbol}|${l.file}`)).size,c=new Set(o.map(l=>`${l.symbol}|${l.file}`)).size;return{symbol:e.symbol,shortName:b(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:r,fanIn:i,fanOut:a,calleeCount:c,score:Math.round(r/50*(i/5)*Math.max(a/5,1)*100)/100}}function lu(e){let t=TC(e),{breakdown:n}=MC(e),r=cu(n,"risk"),i=cu(n,"hygiene");return{score:Math.min(r,i),riskScore:r,hygieneScore:i,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,extractionCandidates:e.extractCount,wrappers:e.wrappers.count,passthroughs:e.passthroughs.count,staleTypes:e.stale.count,driftedFiles:e.drift.count,complexityHotspotCount:e.complexity.extremeCount,hiddenCouplingPairs:e.gitEvidence?.hiddenCoupling.pairCount??null},axes:kC(e),validation:FC(e),suppressions:e.suppressions,actions:t,topComplexity:e.complexity.top,warnings:e.warnings.length>0?e.warnings:void 0}}function kC(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:PC(e),evidenceQuality:{graphFindings:e.dead.count+e.isolated.count+e.realCycleCount,heuristicFindings:e.similarCount+e.extractCount+e.wrappers.count+e.passthroughs.count+e.stale.count+e.drift.count,userSuppressed:e.suppressions?.total??0}}}function PC(e){let t=e.gitEvidence?.fileStats;return t?e.complexity.top.map(n=>{let r=n.file?t[n.file]?.changes??0:0;return{...n,changes:r,weighted:Rn(n.score*Math.log2(1+r))}}).sort((n,r)=>r.weighted-n.weighted):null}function FC(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??[]},r=new Set(Object.values(n).flat()),i=0,o=0,s=0;for(let[u,m]of Object.entries(t))r.has(u)?i+=m.fixChanges:(o+=m.fixChanges,s+=1);let a=r.size>0?Rn(i/r.size):0,c=s>0?Rn(o/s):0,l={};for(let[u,m]of Object.entries(n)){let d=new Set(m);if(d.size===0)continue;let p=0;for(let f of d)p+=t[f]?.fixChanges??0;let h=Rn(p/d.size);l[u]={flaggedFiles:d.size,fixDensity:h,lift:c>0?Rn(h/c):null}}return{flaggedFiles:r.size,flaggedFixDensity:a,baselineFixDensity:c,ratio:r.size>0&&c>0?Rn(a/c):null,byCategory:l}}function Rn(e){return Math.round(e*100)/100}function TC(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.extractCount>0&&t.push({category:"Extraction candidates",evidence:"heuristic",description:`${e.extractCount} large functions with isolated callee clusters \u2014 extract method opportunities`,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 that could be inlined`,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 i=[];e.stale.unused>0&&i.push(`${e.stale.unused} unused`),e.stale.singleUse>0&&i.push(`${e.stale.singleUse} single-consumer (not in types file)`),t.push({category:"Stale abstractions",evidence:"heuristic",description:`${i.join(", ")} \u2014 premature abstraction`,effort:"low",impact:"medium",count:e.stale.count,locRecoverable:e.stale.loc})}if(e.drift.count>0){let i=[];e.drift.unusedImports>0&&i.push(`${e.drift.unusedImports} unused imports`),e.drift.layerViolations>0&&i.push(`${e.drift.layerViolations} layer violations`),t.push({category:"Structural drift",evidence:"heuristic",description:i.join(", "),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 i=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 dependency edge`+(i?` (e.g. ${i.fileA} \u2194 ${i.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},r={low:3,medium:2,high:1};return t.sort((i,o)=>{let s=n[i.impact]*r[i.effort];return n[o.impact]*r[o.effort]-s}),t}var AC={"dead-code":"risk",isolated:"risk",cycles:"risk",complexity:"risk","hidden-coupling":"risk",similar:"hygiene",extract:"hygiene",wrappers:"hygiene",passthroughs:"hygiene","stale-abstractions":"hygiene",drift:"hygiene"};function cu(e,t){let n=e.filter(r=>r.kind===t).reduce((r,i)=>r+i.points,0);return Math.max(0,Math.min(100,100-n))}function MC(e){let t=Math.max(e.statsResult.documents,1),n=Math.max(e.statsResult.symbols,1),r=[],i=(m,d,p)=>{d>0&&r.push({axis:m,points:d,detail:p,kind:AC[m]??"hygiene"})},o=e.dead.count/n;i("dead-code",Math.min(20,Math.round(o*200)),`${e.dead.count} dead symbols (${e.dead.loc} LOC deletable)`);let s=e.isolated.count/n;i("isolated",Math.min(10,Math.round(s*200)),`${e.isolated.count} isolated symbols (${e.isolated.loc} LOC deletable)`),i("cycles",Math.min(15,e.realCycleCount*5),`${e.realCycleCount} real dependency cycle(s)`);let a=e.similarCount/n*1e3;i("similar",Math.min(10,Math.round(a)),`${e.similarCount} similar function pair(s)`);let c=e.extractCount/n*1e3;i("extract",Math.min(5,Math.round(c/2)),`${e.extractCount} extraction candidate(s)`),i("wrappers",Math.min(3,e.wrappers.count),`${e.wrappers.count} wrapper candidate(s)`),i("passthroughs",Math.min(3,e.passthroughs.count),`${e.passthroughs.count} passthrough candidate(s)`);let l=e.stale.count/Math.max(n*.1,1);i("stale-abstractions",Math.min(8,Math.round(l*10)),`${e.stale.count} stale abstraction(s)`);let u=e.drift.count/t;return i("drift",Math.min(5,Math.round(u*50)),`${e.drift.count} drift finding(s)`),i("complexity",Math.min(5,e.complexity.extremeCount*2),`${e.complexity.extremeCount} extreme complexity hotspot(s)`),e.gitEvidence&&i("hidden-coupling",Math.min(5,e.gitEvidence.hiddenCoupling.pairCount),`${e.gitEvidence.hiddenCoupling.pairCount} co-changing pair(s) without a dependency edge`),{breakdown:r}}import{getHeapStatistics as OC}from"v8";var $C=64*1024*1024;function bs(){let e=globalThis.gc;if(!e)return;let t=OC();t.heap_size_limit-t.used_heap_size<$C||e()}var jC=50,BC=75e3,HC=5e3,uu=2500,dr=["overview","dead","isolated","cycles","similar","extract-candidates","wrapper-candidates","passthrough-candidates","stale-abstractions","drift","complexity-hotspots","git-evidence","suppressions"],qC={overview:(e,t,n,r)=>({phase:"overview",statsResult:r,warnings:n.warnings}),dead:(e,t,n)=>({phase:"dead",dead:UC(e,t,n)}),isolated:(e,t,n)=>({phase:"isolated",isolated:GC(e,t,n)}),cycles:(e,t,n)=>({phase:"cycles",realCycleCount:JC(e,t,n)}),similar:(e,t,n)=>({phase:"similar",similarCount:zC(e,t,n)}),"extract-candidates":(e,t,n)=>({phase:"extract-candidates",extractCount:KC(e,t,n)}),"wrapper-candidates":(e,t,n)=>({phase:"wrapper-candidates",wrappers:QC(e,t,n)}),"passthrough-candidates":(e,t,n)=>({phase:"passthrough-candidates",passthroughs:YC(e,t,n)}),"stale-abstractions":(e,t,n)=>({phase:"stale-abstractions",stale:XC(e,t,n)}),drift:(e,t,n)=>({phase:"drift",drift:tR(e,t,n)}),"complexity-hotspots":(e,t,n)=>({phase:"complexity-hotspots",complexity:nR(e,t,n)}),"git-evidence":(e,t,n)=>({phase:"git-evidence",gitEvidence:ZC(e,n)}),suppressions:(e,t,n)=>({phase:"suppressions",suppressions:eR(e,n)})};function Ss(e,t,n={}){return VC(e,n.full===!0,(r,i)=>qC[t](e,n.scope,i,r))}function VC(e,t,n){let r=Ee(e),i=rR(r,t);try{return n(r,i)}finally{wo(e,{semanticProvider:!0}),bs()}}function xs(e){return lu(WC(e))}function WC(e){let t=Ae(e,"overview");return{statsResult:t.statsResult,warnings:t.warnings,dead:Ae(e,"dead").dead,isolated:Ae(e,"isolated").isolated,realCycleCount:Ae(e,"cycles").realCycleCount,similarCount:Ae(e,"similar").similarCount,extractCount:Ae(e,"extract-candidates").extractCount,wrappers:Ae(e,"wrapper-candidates").wrappers,passthroughs:Ae(e,"passthrough-candidates").passthroughs,stale:Ae(e,"stale-abstractions").stale,drift:Ae(e,"drift").drift,complexity:Ae(e,"complexity-hotspots").complexity,gitEvidence:mu(e,"git-evidence")?.gitEvidence??null,suppressions:mu(e,"suppressions")?.suppressions??null}}function mu(e,t){return e.find(n=>n.phase===t)}function Ae(e,t){let n=e.find(r=>r.phase===t);if(!n)throw new Error(`Missing health phase result: ${t}`);return n}function UC(e,t,n){return Me(e,n,"dead",()=>{let r=Xe(e,{scope:t,...Z.dead,scanLimit:n.candidateScanLimit});return Cs(sR(e,r.symbols))})}function GC(e,t,n){return Me(e,n,"isolated",()=>{let r=Ot(e,{scope:t,...Z.isolated,scanLimit:n.candidateScanLimit});return Cs(aR(e,r))})}function JC(e,t,n){return Me(e,n,"cycles",()=>Mt(e,{scope:t}).filter(i=>i.kind==="real").length)}function zC(e,t,n){return Me(e,n,"similar",()=>Ze(e,{scope:t,...Z.similar,scanLimit:n.candidateScanLimit}).length)}function KC(e,t,n){return Me(e,n,"extract-candidates",()=>$t(e,{scope:t,...Z.extract,scanLimit:n.candidateScanLimit}).length)}function QC(e,t,n){return du(e,n,"wrapper-candidates",()=>Ut(e,{scope:t,...Z.wrappers,scanLimit:n.candidateScanLimit}))}function YC(e,t,n){return du(e,n,"passthrough-candidates",()=>Vt(e,{scope:t,...Z.passthroughs,scanLimit:n.candidateScanLimit}))}function XC(e,t,n){return Me(e,n,"stale-abstractions",()=>{let r=Wt(e,{scope:t,...Z.stale,scanLimit:n.candidateScanLimit}),i=r.filter(o=>o.consumers===0).length;return{count:r.length,loc:r.reduce((o,s)=>o+s.loc,0),files:[...new Set(r.map(o=>o.file))],unused:i,singleUse:r.length-i}})}function ZC(e,t){return Me(e,t,"git-evidence",()=>{let n=oi(e);if(!n)return null;let r=Bt(e,void 0,{limit:50}),i={};for(let[o,s]of n)i[o]={changes:s.changes,fixChanges:s.fixChanges};return{amplification:Jl(e),hiddenCoupling:{pairCount:r.findings.length,top:r.findings.slice(0,5).map(o=>({fileA:o.fileA,fileB:o.fileB,together:o.together,confidence:o.confidence}))},fileStats:i}})}function eR(e,t){return Me(e,t,"suppressions",()=>{let n=fi(e);return{total:n.total,byCategory:{...n.byCategory}}})}function tR(e,t,n){return Me(e,n,"drift",()=>{let r=qt(e,{scope:t,...Z.drift});return{count:r.unusedImports+r.layerViolations,unusedImports:r.unusedImports,layerViolations:r.layerViolations}})}function nR(e,t,n){return Me(e,n,"complexity-hotspots",()=>{let r=mr(e,{scope:t,minLoc:10,limit:10,scanLimit:n.candidateScanLimit,semantic:!1});return{top:r.slice(0,5).map(i=>({symbol:i.shortName,score:i.score,file:i.file})),extremeCount:r.filter(i=>i.score>jC).length}})}function rR(e,t){return e.symbols>=BC||e.documents>=HC?t?{candidateScanLimit:void 0,releaseCachesBetweenPhases:!0,warnings:["Large index detected; running unbounded health analyses because --full was supplied."]}:{candidateScanLimit:uu,releaseCachesBetweenPhases:!0,warnings:[`Large index detected; candidate-style health checks scanned their highest-priority ${uu} symbols. Run "scip-query health --full" for unbounded candidate counts.`]}:{candidateScanLimit:void 0,releaseCachesBetweenPhases:!0,warnings:[]}}function iR(e,t){t.releaseCachesBetweenPhases&&(wo(e),bs())}function Me(e,t,n,r){oR(n);try{return r()}finally{iR(e,t)}}function du(e,t,n,r){return Me(e,t,n,()=>Cs(r()))}function oR(e){process.env.SCIP_QUERY_HEALTH_TRACE==="1"&&console.error(`[health] ${e}`)}function sR(e,t){return t.filter(n=>!me(e,n.relativePath)&&!oe(e,n.symbol,n.relativePath)&&n.kind==="dead-code")}function aR(e,t){return t.filter(n=>!me(e,n.relativePath)&&!oe(e,n.symbol,n.relativePath))}function Cs(e){let t=new Set;for(let n of e){let r=n.relativePath??n.file;r&&t.add(r)}return{count:e.length,loc:e.reduce((n,r)=>n+r.loc,0),files:[...t]}}function Rs(e,t,n,r={}){let i=A(e,t),o=A(e,n);if(!i||!o)return null;let s=new Set(Se(e,i,{semantic:r.semantic}).map(y=>y.symbol)),a=new Set(Se(e,o,{semantic:r.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 m=new Set([...s,...a]),d=m.size>0?c.length/m.size:0,p;m.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 h=i.endLine-i.startLine+1,f=o.endLine-o.startLine+1;return{symbolA:{symbol:i.symbol,shortName:b(i.symbol),file:i.relativePath,loc:h},symbolB:{symbol:o.symbol,shortName:b(o.symbol),file:o.relativePath,loc:f},similarity:d,sharedCallees:c.map(b),uniqueToA:l.map(b),uniqueToB:u.map(b),consolidationStrategy:p}}import{readFileSync as pu}from"fs";import{extname as cR,join as fu}from"path";function Is(e,t,n={}){let{context:r=0}=n,i=lR(t);if(i)return mR(e,i.filePath,i.startLine,i.endLine,r);let o=A(e,t);return o?uR(e,o,r):null}function lR(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 uR(e,t,n){let r=e.get("SELECT language FROM documents WHERE relative_path = ?",t.relativePath),i=fu(e.config.projectRoot,t.relativePath),o;try{o=pu(i,"utf-8")}catch{return null}let s=o.split(`
|
|
567
593
|
`),a=Math.max(0,t.startLine-n),c=Math.min(s.length-1,t.endLine+n),l=s.slice(a,c+1).join(`
|
|
568
|
-
`);return{symbol:t.symbol,shortName:b(t.symbol),relativePath:t.relativePath,startLine:a,endLine:c,language:r?.language??
|
|
594
|
+
`);return{symbol:t.symbol,shortName:b(t.symbol),relativePath:t.relativePath,startLine:a,endLine:c,language:r?.language??gu(t.relativePath),source:l}}function mR(e,t,n,r,i){let o=pe(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=fu(e.config.projectRoot,s.relative_path),c;try{c=pu(a,"utf-8")}catch{return null}let l=c.split(`
|
|
569
595
|
`),u=Math.max(0,n-1-i),m=Math.min(l.length-1,r-1+i),d=l.slice(u,m+1).join(`
|
|
570
|
-
`);return{symbol:`${s.relative_path}:${n}-${r}`,shortName:`${s.relative_path}:${n}-${r}`,relativePath:s.relative_path,startLine:u,endLine:m,language:s.language??
|
|
596
|
+
`);return{symbol:`${s.relative_path}:${n}-${r}`,shortName:`${s.relative_path}:${n}-${r}`,relativePath:s.relative_path,startLine:u,endLine:m,language:s.language??gu(s.relative_path),source:d}}function gu(e){switch(cR(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 vs(e,t={}){let{scope:n,limit:r}=t,i=new _(e),o=xR([...dR(e,n),...gR(e,i,n)]);return CR(o),r?o.slice(0,r):o}function dR(e,t){let n=[];for(let r of pR(e,t)){if(e.isIgnored(r.barrel_path)||e.isIgnored(r.original_path)||po(e,r.barrel_path))continue;let i=fR(e,r),o=i?.barrel_consumers??0,s=i?.direct_consumers??0;o!==0||s!==0||n.push({barrelFile:r.barrel_path,symbol:r.symbol,shortName:b(r.symbol),originalFile:r.original_path,barrelConsumers:o,directConsumers:s})}return n}function pR(e,t){let n=t?`AND barrel_d.relative_path LIKE '%${t}%'`:"";return e.all(`SELECT DISTINCT
|
|
571
597
|
barrel_d.id AS barrel_doc_id,
|
|
572
598
|
barrel_d.relative_path AS barrel_path,
|
|
573
599
|
gs.id AS symbol_id,
|
|
@@ -597,7 +623,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
597
623
|
-- Only function-level symbols (ending with ().), not module-level
|
|
598
624
|
AND gs.symbol LIKE '%().'
|
|
599
625
|
${n}
|
|
600
|
-
ORDER BY barrel_d.relative_path, gs.symbol`)}function
|
|
626
|
+
ORDER BY barrel_d.relative_path, gs.symbol`)}function fR(e,t){return e.get(`SELECT
|
|
601
627
|
SUM(CASE WHEN uses_barrel = 1 THEN 1 ELSE 0 END) AS barrel_consumers,
|
|
602
628
|
SUM(CASE WHEN uses_barrel = 0 THEN 1 ELSE 0 END) AS direct_consumers
|
|
603
629
|
FROM (
|
|
@@ -626,7 +652,7 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
626
652
|
AND consumer_d.id != ?
|
|
627
653
|
${e.pathExclusionsFor("consumer_d")}
|
|
628
654
|
GROUP BY consumer_d.id
|
|
629
|
-
)`,t.barrel_doc_id,t.symbol_id,t.barrel_doc_id,t.original_doc_id)}function
|
|
655
|
+
)`,t.barrel_doc_id,t.symbol_id,t.barrel_doc_id,t.original_doc_id)}function gR(e,t,n){let r=[];for(let i of hR(e,n))hu(e,i,i)>0||r.push(...yR(e,t,i));return r}function hR(e,t){return M(e,{scope:t,includeIgnored:!1}).filter(n=>lo(e,n).length>0)}function yR(e,t,n){return lo(e,n).filter(r=>r.sourcePath&&!e.isIgnored(r.sourcePath)).flatMap(r=>bR(e,t,n,r.sourcePath))}function bR(e,t,n,r){let i=SR(t,r);return i?[{barrelFile:n,symbol:i.symbol,shortName:b(i.symbol),originalFile:r,barrelConsumers:0,directConsumers:hu(e,r,n)}]:[]}function hu(e,t,n){let r=new Set;for(let i of M(e,{includeIgnored:!1}))if(i!==n)for(let o of ie(e,i))o.sourcePath===t&&r.add(i);return r.size}function SR(e,t){let n=e.definitionsForFile(t);return n.find(r=>re(r.symbol)==="method")??n[0]??null}function xR(e){let t=new Set,n=[];for(let r of e){let i=`${r.barrelFile}|${r.symbol}|${r.originalFile}`;t.has(i)||(t.add(i),n.push(r))}return n}function CR(e){e.sort((t,n)=>n.directConsumers-t.directConsumers||t.barrelFile.localeCompare(n.barrelFile)||t.shortName.localeCompare(n.shortName))}function Ns(e,t={}){let{samples:n=50,scope:r,maxDisagreements:i=5}=t,o=new _(e),s=RR(o.productionCallableDefinitions({scope:r,minLoc:2,requireFunctionLikeSymbol:!0}),n);if(s.length===0||!IR(e,s))return{available:!1,sampleSize:s.length,oracleCoverage:0,scores:[],topDisagreements:[]};let a={references:yu(),callees:yu()},c=[],l=0,u=Qr(e,s);for(let m of s){let d=gi(m,Tt(e,m).map(y=>y.file)),p=gi(m,(u.get(m.symbolId)??[]).map(y=>y.file));if(d.size===0&&p.size===0)continue;l+=1;let h=gi(m,At(e,m).map(y=>y.file)),f=gi(m,(o.calleeMap([m],{semantic:!1}).get(m.symbolId)??[]).map(y=>y.file));bu(a.references,m,"references",h,d,c),bu(a.callees,m,"callees",f,p,c)}return c.sort((m,d)=>d.cheapOnly.length+d.oracleOnly.length-(m.cheapOnly.length+m.oracleOnly.length)),{available:!0,sampleSize:s.length,oracleCoverage:s.length>0?Ds(l/s.length):0,scores:["references","callees"].map(m=>DR(m,a[m])),topDisagreements:c.slice(0,i)}}function yu(){return{comparedSymbols:0,agreed:0,cheapTotal:0,oracleTotal:0}}function RR(e,t){let n=[...e].sort((o,s)=>o.symbolId-s.symbolId);if(n.length<=t)return n;let r=n.length/t,i=[];for(let o=0;o<t;o++)i.push(n[Math.floor(o*r)]);return i}function IR(e,t){let n=t[0];if(!n)return!1;try{return Ft(e,n.relativePath).availability().available}catch{return!1}}function gi(e,t){let n=new Set;for(let r of t)r!==e.relativePath&&n.add(r);return n}function bu(e,t,n,r,i,o){if(r.size===0&&i.size===0)return;e.comparedSymbols+=1,e.cheapTotal+=r.size,e.oracleTotal+=i.size;let s=[],a=[];for(let c of r)i.has(c)?e.agreed+=1:s.push(c);for(let c of i)r.has(c)||a.push(c);(s.length>0||a.length>0)&&o.push({symbol:b(t.symbol),question:n,cheapOnly:s,oracleOnly:a})}var vR={references:!0,callees:!1};function DR(e,t){let n=t.oracleTotal>0?t.agreed/t.oracleTotal:1,r=t.cheapTotal-t.agreed;return{question:e,comparedSymbols:t.comparedSymbols,precision:vR[e]&&t.cheapTotal>0?Ds(t.agreed/t.cheapTotal):null,recall:Ds(n),unverified:r}}function Ds(e){return Math.round(e*1e3)/1e3}function _s(e,t={}){let{scope:n,minLoc:r=1,limit:i,scanLimit:o}=t,s=t.semantic!==!1,a=_R(e,NR(e,{scope:n,minLoc:r,scanLimit:o}),{semantic:s}),c=wR(a);return i?c.slice(0,i):c}function NR(e,t){let n=He(e,{scope:t.scope}).filter(r=>r.isFunctionLike&&!e.isIgnored(r.relativePath)).filter(r=>q(r)>=t.minLoc);return typeof t.scanLimit=="number"&&t.scanLimit>0&&n.sort((r,i)=>q(i)-q(r)||r.relativePath.localeCompare(i.relativePath)),Ne(n,t.scanLimit)}function _R(e,t,n){let r=new Map;for(let i of t){let o=ER(e,i,n);if(!o)continue;let s=r.get(o)??[];s.push(LR(i)),r.set(o,s)}return r}function LR(e){return{symbol:e.symbol,shortName:b(e.symbol),file:e.relativePath,startLine:e.startLine,endLine:e.endLine,loc:q(e)}}function wR(e){let t=[];for(let[n,r]of e)r.length>=2&&t.push({signature:n,functions:r});return t.sort((n,r)=>{let i=r.functions.length-n.functions.length;if(i!==0)return i;let o=n.functions.reduce((a,c)=>a+c.loc,0);return r.functions.reduce((a,c)=>a+c.loc,0)-o}),t}function ER(e,t,n){if(n.semantic){let o=tl(e,t);if(o)return o}let r=kR(t.documentation),i=r?TR(r):null;return i||AR(PR(e,t.relativePath,t.startLine,t.endLine,t.leaf),t.leaf)}function kR(e){return It(vt(e))}function PR(e,t,n,r,i){let o=P(e,t);if(!o)return null;let s=o.split(/\r?\n/),a=OR(s,n,r,i);for(let c of a){let l=Math.min(s.length-1,Math.max(c,c+4)),u="";for(let m=c;m<=l;m+=1){let d=s[m]?.trim();if(d&&(u=u?`${u} ${d}`:d,FR(u)))return u}if(u&&u.includes("("))return u}return null}function FR(e){let t=e.replace(/\s+/g," ").trim();return!t.includes("(")||An(t)>0?!1:/[;{]$/.test(t)||/\)\s*(?::\s*[^={]+)?\s*(?:=>|=|throws\b|where\b|$)/i.test(t)||/\)\s*As\s+.+$/i.test(t)}function TR(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 AR(e,t){if(!e||!e.trim())return null;let n=e.replace(/\s+/g," ").trim(),r=n.indexOf("(");if(r===-1)return null;let i=n.slice(0,r),s=new RegExp(`\\b${Su(t)}\\b`,"i").exec(i);s&&typeof s.index=="number"&&(i=i.slice(0,s.index)),i=i.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=MR(n.slice(r)).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=`${i?`${i} `:""}${a}`.replace(/\s+/g,"").toLowerCase();return c.length>=3?c:null}function MR(e){let t=0,n=0,r=0,i=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==="[")r+=1;else if(c==="]")r=Math.max(0,r-1);else if(c==="<")i+=1;else if(c===">")i=Math.max(0,i-1);else if(c==="{"){if(t===0&&r===0&&i===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&&r===0&&i===0)return e.slice(0,a)}return e}function OR(e,t,n,r){let i=Su(r),o=new RegExp(`\\b${i}\\b\\s*\\(`,"i"),s=new RegExp(`\\bdef\\s+${i}\\b`,"i"),a=[],c=new Set,l=Math.max(0,Math.min(t,e.length-1)),u=Math.max(l,Math.min(e.length-1,Math.max(n,t+4)));for(let m=l;m<=u;m+=1){let d=e[m]??"";(o.test(d)||s.test(d))&&!c.has(m)&&(c.add(m),a.push(m))}for(let m=0;m<e.length;m+=1){let d=e[m]??"";(o.test(d)||s.test(d))&&!c.has(m)&&(c.add(m),a.push(m))}return a}function Su(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}import{existsSync as _u}from"fs";import{join as eI}from"path";import $R from"better-sqlite3";var jR=["node_modules",".git","dist","build","out","coverage","target",".next",".nuxt",".cache",".turbo",".scipquery-cache","__pycache__",".venv","venv"],hi=class{db;config;pathFilter;constructor(t,n){this.config=t,this.pathFilter=n??null,this.db=new $R(t.dbPath,{readonly:!0}),this.db.pragma("busy_timeout = 5000")}isIgnored(t){return this.pathFilter?.isIgnored(t)??!1}get localSymbolPredicate(){return`(
|
|
630
656
|
EXISTS (
|
|
631
657
|
SELECT 1
|
|
632
658
|
FROM defn_enclosing_ranges local_der
|
|
@@ -643,8 +669,8 @@ ${d}`,l+=1+d.length,u+=Ln(d),r+=d.length+1}let m=Mf(c);m&&n.push({...m,start:a,e
|
|
|
643
669
|
AND local_m.role = 1
|
|
644
670
|
${this.pathExclusionsFor("local_d").trimStart()}
|
|
645
671
|
)
|
|
646
|
-
)`}get pathExclusions(){return this.pathExclusionsFor("d")}get symbolNoise(){return this.symbolNoiseFor("gs")}pathExclusionsFor(...t){return t.flatMap(n=>
|
|
647
|
-
`)}symbolNoiseFor(t){return`AND ${t}.symbol NOT LIKE '%().(%' AND ${t}.symbol NOT LIKE '%typeLiteral%'`}all(t,...n){return this.db.prepare(t).all(...n)}get(t,...n){return this.db.prepare(t).get(...n)}close(){this.db.close()}};import
|
|
672
|
+
)`}get pathExclusions(){return this.pathExclusionsFor("d")}get symbolNoise(){return this.symbolNoiseFor("gs")}pathExclusionsFor(...t){return t.flatMap(n=>jR.flatMap(r=>[`AND ${n}.relative_path NOT LIKE '${r}/%'`,`AND ${n}.relative_path NOT LIKE '%/${r}/%'`])).join(`
|
|
673
|
+
`)}symbolNoiseFor(t){return`AND ${t}.symbol NOT LIKE '%().(%' AND ${t}.symbol NOT LIKE '%typeLiteral%'`}all(t,...n){return this.db.prepare(t).all(...n)}get(t,...n){return this.db.prepare(t).get(...n)}close(){this.db.close()}};import BR from"ignore";import{readFileSync as HR,existsSync as Ls}from"fs";import{dirname as ws,isAbsolute as xu,join as Es,relative as qR,resolve as VR}from"path";function In(e){let t=BR(),n=!1,r=WR(e);for(let i of r)try{let o=HR(i,"utf-8");t.add(o),n=!0}catch{}return n||t.add(UR),{isIgnored:i=>Cu(t,e,i),filter:i=>i.filter(o=>!Cu(t,e,o))}}function WR(e){let t=[],n=Es(e,".gitignore");Ls(n)&&t.push(n);let r=ws(e),i=0;for(;r!==ws(r)&&i<5;){let o=Es(r,".gitignore");if(Ls(o)&&t.push(o),Ls(Es(r,".git")))break;r=ws(r),i++}return t}var UR=`
|
|
648
674
|
# Dependencies
|
|
649
675
|
node_modules/
|
|
650
676
|
vendor/
|
|
@@ -701,27 +727,27 @@ Thumbs.db
|
|
|
701
727
|
|
|
702
728
|
# Type definitions (often noise in queries)
|
|
703
729
|
*.d.ts
|
|
704
|
-
`;function
|
|
705
|
-
`),n}function
|
|
706
|
-
${n}`:""}`)}return JSON.parse(t.stdout)}function
|
|
707
|
-
`)}function
|
|
730
|
+
`;function Cu(e,t,n){let r=GR(t,n);if(!r)return!1;try{return e.ignores(r)}catch{return!1}}function GR(e,t){if(!t||t===".")return null;if(!xu(t)&&!t.startsWith(".."))return t.replaceAll("\\","/");let n=xu(t)?t:VR(e,t),r=qR(e,n).replaceAll("\\","/");return!r||r==="."||r.startsWith("..")?null:r}import{readFileSync as JR,writeFileSync as zR,existsSync as Iu,mkdirSync as KR}from"fs";import{join as Gt,resolve as Ru}from"path";import{createHash as QR}from"crypto";import{homedir as YR}from"os";var vu=".scipquery.json",XR={enabled:!1,debounceMs:3e4,cooldownMs:6e4,ignore:[]};function vn(e){let t=Gt(e,vu);if(!Iu(t))return{};try{let n=JR(t,"utf-8");return JSON.parse(n)}catch{return{}}}function Du(e){return{...XR,...e.watch}}function ZR(e,t){let n=process.env.SCIP_QUERY_CACHE_DIR;if(n)return ks(n);if(t?.dbPath)return ks(Ru(e,t.dbPath));let i=process.env.XDG_CACHE_HOME||Gt(YR(),".cache"),o=QR("sha256").update(Ru(e)).digest("hex").slice(0,12),s=Gt(i,"scip-query","projects",o);return ks(s)}function Dn(e,t){let n=ZR(e,t);return{cacheDir:n,dbPath:Gt(n,"index.db"),indexPath:Gt(n,"index.scip"),metaPath:Gt(n,"meta.json")}}function Nu(e,t){let n=Gt(e,vu);return Iu(n)||zR(n,JSON.stringify({languages:t,watch:{enabled:!1,debounceMs:3e4,cooldownMs:6e4}},null,2)+`
|
|
731
|
+
`),n}function ks(e){return KR(e,{recursive:!0}),e}function Oe(){return process.env.SCIP_QUERY_PROJECT_ROOT??process.cwd()}function yi(e=Oe()){let t=vn(e),n=Dn(e,t),r=process.env.SCIP_QUERY_INDEX_DB??(_u(n.dbPath)?n.dbPath:eI(e,"index.db"));return{projectRoot:e,config:t,paths:n,dbPath:r}}function Ps(e){return yi(e).dbPath}function tI(){let{projectRoot:e,config:t,paths:n,dbPath:r}=yi();_u(r)||(console.error("error: No index.db found. Run: scip-query reindex"),process.exit(1));let i={dbPath:r,indexPath:process.env.SCIP_QUERY_INDEX_SCIP??n.indexPath,projectRoot:e,entryRoots:t.entryRoots,semantic:t.semantic},o=In(e);return new hi(i,o)}function nt(e){let t=tI();try{return e(t)}finally{t.close()}}function Fs(e,t){return t.concat([e])}function Nn(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 Lu(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 nI(e)}}function nI(e){throw new Error(`Unhandled watcher status: ${JSON.stringify(e)}`)}import{spawnSync as rI}from"child_process";function Ts(e){let t=rI(process.execPath,[...process.execArgv,e.cliPath,e.command,...e.args??[]],{cwd:process.cwd(),env:e.env??process.env,encoding:"utf8",maxBuffer:e.maxBuffer??10485760});if(t.status!==0){let n=t.stderr.trim();throw new Error(`${e.label} failed${n?`:
|
|
732
|
+
${n}`:""}`)}return JSON.parse(t.stdout)}function wu(e,t){let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function xe(e){return e+1}function de(e,t){return`${xe(e)}-${xe(t)}`}function ce(e,t,n){return`${e}:${de(t,n)}`}var L={empty(e){console.log(e)},list(e,t){for(let n of e)console.log(t(n))},groupedByFile(e,t,n=r=>r.relativePath){let r="";for(let i of e){let o=n(i);o!==r&&(r&&console.log(""),console.log(o),r=o),console.log(t(i))}},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 r of n.rows)console.log(r)}},table(e,t,n){console.log(` ${e.join(" ")}`);let r=n??e.map(i=>i.length);console.log(` ${r.map(i=>"\u2500".repeat(i)).join(" ")}`);for(let i of t)console.log(i)}};var oI=iI(import.meta.url),{version:bi}=lI(),Si="__health-phase",xi="__diff-impact-batch",sI=10,aI=75e3,cI=5e3,Eu=2500;function lI(){for(let e of["../package.json","../../package.json"])try{return oI(e)}catch{}return{version:"0.0.0"}}function pr(e){console.log(`Heuristic ${e}: review before acting; these are candidates, not exact compiler facts.
|
|
733
|
+
`)}function As(e){let t=Ee(e);return t.symbols>=aI||t.documents>=cI}function Pu(e,t,n){return As(e)?n?(console.error(`Large index detected; ${t} is running the unbounded semantic pass because --full was supplied.`),{semantic:!0}):(console.error(`Large index detected; ${t} will scan the highest-priority ${Eu} candidates with semantic enrichment disabled. Run "scip-query ${t} --full" for the unbounded semantic pass.`),{scanLimit:Eu,semantic:!1}):{semantic:!0}}function Fu(e){let t=dr.map(n=>uI(n,e));return xs(t)}function uI(e,t){let n=process.argv[1]??ku(import.meta.url),r=[e];return t.scope&&r.push("--scope",t.scope),t.full&&r.push("--full"),Ts({cliPath:n,command:Si,args:r,label:`Health phase "${e}"`})}function Tu(e,t){if(t){console.log(JSON.stringify(e,null,2));return}if(console.log(`
|
|
708
734
|
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)
|
|
709
|
-
`),console.log(` ${e.overview.documents} files | ${e.overview.symbols} symbols | ${
|
|
735
|
+
`),console.log(` ${e.overview.documents} files | ${e.overview.symbols} symbols | ${Nn(e.overview.indexSizeBytes)}
|
|
710
736
|
`),e.warnings&&e.warnings.length>0){console.log(" Warnings:");for(let r of e.warnings)console.log(` ${r}`);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.extractionCandidates>0&&console.log(` Extract candidates: ${n.extractionCandidates}`),n.wrappers>0&&console.log(` Wrapper functions: ${n.wrappers}`),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(`
|
|
711
737
|
Prioritized Actions (highest impact + lowest effort first):`);for(let r=0;r<e.actions.length;r++){let i=e.actions[r],o=i.locRecoverable>0?` (~${i.locRecoverable} LOC recoverable)`:"";console.log(` ${r+1}. [${i.effort} effort / ${i.impact} impact] ${i.description}${o}`)}}if(e.topComplexity.length>0){console.log(`
|
|
712
|
-
Top Complexity Hotspots:`);for(let r of e.topComplexity)console.log(` ${r.score.toFixed(1).padStart(6)} ${r.symbol}`)}if(
|
|
738
|
+
Top Complexity Hotspots:`);for(let r of e.topComplexity)console.log(` ${r.score.toFixed(1).padStart(6)} ${r.symbol}`)}if(mI(e),e.scoreBreakdown.length>0){console.log(`
|
|
713
739
|
Score Breakdown (100 minus the following):`);for(let r of e.scoreBreakdown)console.log(` -${String(r.points).padStart(2)} ${r.axis}: ${r.detail}`)}e.actions.length===0&&console.log(`
|
|
714
|
-
No issues found. Codebase is clean.`)}function
|
|
715
|
-
Axes:`),console.log(` Deletable: ${t.deletable.loc} LOC across ${t.deletable.symbols} symbols`),t.changeAmplification){let r=t.changeAmplification;console.log(` Change amplification: ${r.medianFilesPerCommit} files/commit median, ${r.p90FilesPerCommit} p90 (${r.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 r of t.hiddenCoupling.top.slice(0,3))console.log(` ${r.fileA} <-> ${r.fileB} (${r.together}x together, ${Math.round(r.confidence*100)}%)`)}if(t.churnWeightedComplexity&&t.churnWeightedComplexity.length>0){let r=t.churnWeightedComplexity[0];r.weighted>0&&console.log(` Churn x complexity: hottest is ${r.symbol} (${r.changes} changes, weighted ${r.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 r=e.validation,i=r.ratio===null?"n/a":`${r.ratio}x`;console.log(` Validation: flagged files fix-density ${r.flaggedFixDensity} vs baseline ${r.baselineFixDensity} (${i})`)}}function
|
|
716
|
-
Affected consumer files:`),
|
|
740
|
+
No issues found. Codebase is clean.`)}function mI(e){let t=e.axes;if(console.log(`
|
|
741
|
+
Axes:`),console.log(` Deletable: ${t.deletable.loc} LOC across ${t.deletable.symbols} symbols`),t.changeAmplification){let r=t.changeAmplification;console.log(` Change amplification: ${r.medianFilesPerCommit} files/commit median, ${r.p90FilesPerCommit} p90 (${r.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 r of t.hiddenCoupling.top.slice(0,3))console.log(` ${r.fileA} <-> ${r.fileB} (${r.together}x together, ${Math.round(r.confidence*100)}%)`)}if(t.churnWeightedComplexity&&t.churnWeightedComplexity.length>0){let r=t.churnWeightedComplexity[0];r.weighted>0&&console.log(` Churn x complexity: hottest is ${r.symbol} (${r.changes} changes, weighted ${r.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 r=e.validation,i=r.ratio===null?"n/a":`${r.ratio}x`;console.log(` Validation: flagged files fix-density ${r.flaggedFixDensity} vs baseline ${r.baselineFixDensity} (${i})`)}}function Au(e){return nt(t=>{let n=yt(t,{base:e.base});if(n.note)return xn(t,{base:e.base});if(n.changedFiles.length===0)return xn(t,{base:e.base});let r=[];for(let i of wu(n.changedFiles,sI))r.push(dI(i,e));return ci(n.changedFiles,r)})}function dI(e,t){let n=process.argv[1]??ku(import.meta.url),r=[];return t.base&&r.push("--base",t.base),Ts({cliPath:n,command:xi,args:r,env:{...process.env,SCIP_QUERY_DIFF_IMPACT_FILES:JSON.stringify(e)},label:"Diff-impact batch"})}function Mu(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:"),L.list(e.changedSymbols,t=>` ${t.file} ${t.shortName} (fan-in: ${t.fanIn})`)),e.affectedConsumers.length>0&&(console.log(`
|
|
742
|
+
Affected consumer files:`),L.list(e.affectedConsumers,t=>` ${t.file} (${t.consumedSymbols} symbol(s))`))}var Ci=Fs,I=(e=>parseInt(e,10)),Ri=(e=>{let t=parseInt(e,10);if(!Number.isFinite(t)||t<1)throw new Error(`Expected a positive integer, got ${e}`);return t}),Jt=parseFloat,Ms=parseInt;function g(e,t,n,...r){return r.length>0?{flags:e,description:t,parser:n,defaultValue:r[0]}:{flags:e,description:t,parser:n}}function v(e,t=[]){return{category:e,examples:t}}import{existsSync as Bs,mkdirSync as bI,symlinkSync as SI,readlinkSync as xI,unlinkSync as CI}from"fs";import{join as fr,dirname as Bu,resolve as Hs}from"path";import{homedir as qs,platform as RI}from"os";import{fileURLToPath as II}from"url";import{execFileSync as Ou}from"child_process";import{platform as Os,arch as hI}from"os";import{execFileSync as pI}from"child_process";import{platform as fI}from"os";var gI=fI()==="win32";function Le(e){let t=gI?"where":"which";try{return pI(t,[e],{stdio:"pipe"}),!0}catch{return!1}}var $u="v0.7.0";function $s(){return Le("scip")}function yI(){let e=Os(),t=hI(),n,r,i;switch(e){case"darwin":n="darwin",i="tar.gz";break;case"linux":n="linux",i="tar.gz";break;case"win32":n="windows",i="zip";break;default:return null}switch(t){case"arm64":r="arm64";break;case"x64":r="amd64";break;default:return null}let o=`scip-${n}-${r}.${i}`;return{url:`https://github.com/sourcegraph/scip/releases/download/${$u}/${o}`,filename:o}}function js(){let e=yI();console.log("\nThe `scip` CLI is required but not found on PATH.\n"),Os()==="darwin"?(console.log("Install via Homebrew:"),console.log(` brew install sourcegraph/scip/scip
|
|
717
743
|
`),console.log("Or download manually:")):console.log("Download from:"),console.log(e?` ${e.url}
|
|
718
|
-
`:` https://github.com/sourcegraph/scip/releases/tag/${
|
|
719
|
-
`),console.log("After installing, ensure `scip` is on your PATH and run `scip-query reindex`.")}function
|
|
720
|
-
VALUES (?, ?, NULL, ?)`),c=i.transaction(u=>{let m=0;for(let d of u){if(o.has(d))continue;let p=
|
|
721
|
-
`).filter(r=>r&&t.has(
|
|
722
|
-
`)){if(!r)continue;let i=
|
|
723
|
-
`).filter(Boolean)}catch{return null}}function
|
|
724
|
-
`)[0]}`;return n(`Skipping ${e.language}: ${s}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:s}}}finally{
|
|
744
|
+
`:` https://github.com/sourcegraph/scip/releases/tag/${$u}
|
|
745
|
+
`),console.log("After installing, ensure `scip` is on your PATH and run `scip-query reindex`.")}function ju(e){if(Os()==="darwin"&&Le("brew")){e("Installing scip CLI via Homebrew...");try{if(Ou("brew",["install","sourcegraph/scip/scip"],{stdio:"inherit",timeout:3e5,env:process.env}),Le("scip"))return e("Successfully installed scip CLI via Homebrew"),!0}catch(t){let n=t instanceof Error?t.message:String(t);e(`Homebrew install failed: ${n}`)}}if(Le("go")){e("Installing scip CLI via go install...");try{if(Ou("go",["install","github.com/sourcegraph/scip/cmd/scip@latest"],{stdio:"inherit",timeout:3e5,env:process.env}),Le("scip"))return e("Successfully installed scip CLI via go install"),!0}catch(t){let n=t instanceof Error?t.message:String(t);e(`go install failed: ${n}`)}}return e("Could not auto-install scip CLI."),e("Install manually from: https://github.com/sourcegraph/scip/releases"),!1}var vI=RI()==="win32",Vs=["scip-query","concrete-plan","scip-ai-cleanup","scip-explore","scip-debloat","scip-doc-reconcile","scip-maintainability","scip-verify","scip-language-playbook"];function Hu(e={}){let t=e.quiet?()=>{}:console.log,n=II(import.meta.url),r=Hs(Bu(n),"..","skills"),i=[fr(qs(),".claude","skills"),fr(qs(),".codex","skills"),fr(qs(),".agents","skills")],o={installed:[],skipped:[],alreadyLinked:[]};for(let s of i){let a=Bu(s);if(!Bs(a))continue;bI(s,{recursive:!0});let c=DI(s);for(let l of Vs){let u=fr(r,l),m=fr(s,l);if(!Bs(u)){o.skipped.push(`${c}/${l}`);continue}if(Bs(m)){try{let d=xI(m);if(Hs(d)===Hs(u)){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}CI(m)}SI(u,m,vI?"junction":"dir"),o.installed.push(`${c}/${l}`),t(` done: ${l} \u2192 ${c}`)}}return o}function DI(e){return e.includes(".codex")?"Codex":e.includes(".agents")?"Agents":"Claude"}import{existsSync as Ym}from"fs";import{execFileSync as $D}from"child_process";import{closeSync as jD,existsSync as sa,mkdirSync as Pm,mkdtempSync as BD,openSync as HD,readFileSync as qD,renameSync as aa,rmSync as ca,writeFileSync as Fm}from"fs";import{basename as Ei,dirname as Qt,extname as VD,join as rt}from"path";import NI from"better-sqlite3";import{execFileSync as _I}from"child_process";import{existsSync as LI,readdirSync as wI,readFileSync as EI}from"fs";import{extname as Ii,join as qu}from"path";function bt(e){let t=new Set((e.extensions??Cc).map(o=>o.toLowerCase()));if(t.size===0)return{scanned:0,inserted:0,existing:0};if(!LI(e.dbPath))throw new Error(`SCIP SQLite database not found at ${e.dbPath}`);let n=In(e.projectRoot),r=kI(e.projectRoot,t).filter(o=>!n.isIgnored(o)),i=new NI(e.dbPath);try{let o=FI(i,r),s=i.prepare(`INSERT OR IGNORE INTO documents (language, relative_path, position_encoding, text)
|
|
746
|
+
VALUES (?, ?, NULL, ?)`),c=i.transaction(u=>{let m=0;for(let d of u){if(o.has(d))continue;let p=EI(qu(e.projectRoot,d),"utf-8"),h=s.run(TI(d),d,p);m+=Number(h.changes)}return m})(r),l={scanned:r.length,inserted:c,existing:r.length-c};return e.onStatus?.(`Augmented SQLite documents with ${c} auxiliary source file${c===1?"":"s"} (${l.existing} already present).`),l}finally{i.close()}}function kI(e,t){let n=PI(e,t);if(n)return n;let r=[],i=o=>{let s=o?qu(e,o):e,a;try{a=wI(s,{withFileTypes:!0})}catch{return}for(let c of a){if(uo.has(c.name))continue;let l=o?`${o}/${c.name}`:c.name;if(c.isDirectory()){i(l);continue}t.has(Ii(c.name).toLowerCase())&&r.push(l)}};return i(""),r.sort()}function PI(e,t){try{return _I("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}).split(`
|
|
747
|
+
`).filter(r=>r&&t.has(Ii(r).toLowerCase())).sort()}catch{return null}}function FI(e,t){let n=new Set,r=500;for(let i=0;i<t.length;i+=r){let o=t.slice(i,i+r),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 TI(e){return Ii(e).toLowerCase()===".vue"?"vue":Ii(e).replace(/^\./,"").toLowerCase()||"source"}import{execFileSync as AI}from"child_process";import{existsSync as MI,readdirSync as Wu}from"fs";import{extname as Uu,join as Gu}from"path";var OI=new Set([".git",".hg",".svn",".idea",".vscode","node_modules","vendor","dist","build","target","bin","obj",".dart_tool",".gradle",".next",".venv","venv","__pycache__"]),$I=[{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:"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 zt(e){let t=[],n=jI(e),r=VI(e);for(let i of $I){if(BI(e,i.files)){t.push(i.language);continue}if(HI(n,i.globs)){t.push(i.language);continue}UI(r,i.extensions)&&t.push(i.language)}return t.includes("typescript")&&Vu(t,"javascript"),t.includes("cpp")&&!r.has(".c")&&Vu(t,"c"),t}function jI(e){try{return Wu(e)}catch{return[]}}function BI(e,t){return t?.length?t.some(n=>MI(Gu(e,n))):!1}function HI(e,t){return t?.length?e.some(n=>t.some(r=>qI(n,r))):!1}function qI(e,t){if(t==="*")return!0;if(!t.includes("*"))return e===t;let[n,r]=t.split("*");return e.startsWith(n??"")&&e.endsWith(r??"")}function VI(e){let t=WI(e);if(t)return t;let n=new Set,r=[e];for(;r.length>0;){let i=r.pop();if(!i)continue;let o;try{o=Wu(i,{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=Gu(i,s.name);if(s.isDirectory()){OI.has(s.name)||r.push(a);continue}let c=Uu(s.name).toLowerCase();c&&n.add(c)}}return n}function WI(e){try{let t=AI("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:26214400,stdio:["ignore","pipe","ignore"]}),n=new Set;for(let r of t.split(`
|
|
748
|
+
`)){if(!r)continue;let i=Uu(r).toLowerCase();i&&n.add(i)}return n}catch{return null}}function UI(e,t){return t?.length?t.some(n=>e.has(n)):!1}function Vu(e,t){let n=e.indexOf(t);n!==-1&&e.splice(n,1)}import{existsSync as Ju,readdirSync as GI}from"fs";import{join as Ws}from"path";var JI={typescript:{language:"typescript",indexerBinary:"scip-typescript",checkCommand:"npx scip-typescript --version",indexArgs:({outputPath:e,pnpmWorkspaces:t,indexerBinary:n})=>{let r=["index","--infer-tsconfig","--output",e,"--no-progress-bar"];return t&&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"},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",zu(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",zu(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=Ws(e,"vendor","bin","scip-php"),r=Ws(e,"vendor","davidrjenni","scip-php","bin","scip-php");return{binary:"php",args:["-d","error_reporting=E_ALL & ~E_DEPRECATED & ~E_USER_DEPRECATED",Ju(r)?r:Ju(n)?n:t]}},defaultOutputPath:"index.scip",markerFiles:["composer.json"],installMethods:[],installUrl:"https://github.com/davidrjenni/scip-php/releases"}};function vi(e){return JI[e]}function zu(e,t){let n;try{n=GI(e)}catch{return null}for(let r of n)if(t.some(i=>r.endsWith(i)))return Ws(e,r);return null}import{readFileSync as zI,writeFileSync as KI}from"fs";import{create as Us}from"@bufbuild/protobuf";import{deserializeSCIP as QI,serializeSCIP as YI,DocumentSchema as XI,IndexSchema as ZI,SymbolInformationSchema as ev}from"@c4312/scip";function tv(e){if(e.length===0)throw new Error("Cannot merge zero SCIP indexes");if(e.length===1)return e[0];let t=nv(e),n=rv(e.flatMap(i=>i.documents??[])),r=Qu(e.flatMap(i=>i.externalSymbols??[]));return Us(ZI,{metadata:t,documents:n,externalSymbols:r})}function Ku(e,t){if(e.length===0)throw new Error("Cannot merge zero SCIP files");let n=e.map(i=>QI(zI(i))),r=tv(n);return KI(t,Buffer.from(YI(r))),{documentCount:r.documents.length,externalSymbolCount:r.externalSymbols.length,inputCount:e.length}}function nv(e){let t=e[0]?.metadata;if(!t)return;let n=t.projectRoot;for(let r of e.slice(1)){let i=r.metadata?.projectRoot;if(n&&i&&i!==n)throw new Error(`Cannot merge SCIP indexes with different project roots: ${n} vs ${i}`)}return t}function rv(e){let t=new Map;for(let n of e){let r=t.get(n.relativePath);if(!r){t.set(n.relativePath,n);continue}t.set(n.relativePath,Us(XI,{language:r.language||n.language,relativePath:r.relativePath||n.relativePath,occurrences:[...r.occurrences,...n.occurrences],symbols:Qu([...r.symbols,...n.symbols]),text:ov(r.text,n.text),positionEncoding:r.positionEncoding||n.positionEncoding}))}return[...t.values()]}function Qu(e){let t=new Map;for(let n of e){let r=t.get(n.symbol);if(!r){t.set(n.symbol,n);continue}t.set(n.symbol,Us(ev,{symbol:r.symbol,documentation:sv([...r.documentation,...n.documentation]),relationships:iv([...r.relationships,...n.relationships]),kind:r.kind||n.kind,displayName:r.displayName||n.displayName,enclosingSymbol:r.enclosingSymbol||n.enclosingSymbol,signatureDocumentation:r.signatureDocumentation??n.signatureDocumentation}))}return[...t.values()]}function iv(e){let t=new Set,n=[];for(let r of e){let i=[r.symbol,r.isReference?"1":"0",r.isImplementation?"1":"0",r.isTypeDefinition?"1":"0",r.isDefinition?"1":"0"].join("|");t.has(i)||(t.add(i),n.push(r))}return n}function ov(e,t){return e?t?e.length>=t.length?e:t:e:t}function sv(e){return[...new Set(e)]}import{execFileSync as av}from"child_process";import{createHash as cv}from"crypto";import{readdirSync as lv,readFileSync as uv}from"fs";import{join as Yu}from"path";function mv(e){return(dv(e)??pv(e)).filter(t=>t&&!Xu(t)).sort()}function Di(e){return mv(e).map(t=>{let n=Yu(e,t);try{let r=uv(n);return{path:t,size:r.byteLength,hash:cv("sha256").update(r).digest("hex")}}catch{return{path:t,size:-1,hash:"unreadable"}}})}function dv(e){try{return av("git",["-C",e,"ls-files","-co","--exclude-standard","--","."],{encoding:"utf-8",maxBuffer:50*1024*1024,stdio:["ignore","pipe","ignore"]}).split(`
|
|
749
|
+
`).filter(Boolean)}catch{return null}}function pv(e){let t=[],n=[""];for(;n.length>0;){let r=n.pop(),i=r?Yu(e,r):e,o;try{o=lv(i,{withFileTypes:!0})}catch{continue}for(let s of o){let a=r?`${r}/${s.name}`:s.name;if(s.isDirectory()){Xu(a)||n.push(a);continue}t.push(a)}}return t}function Xu(e){return e.split("/").some(n=>fv.has(n))||e.endsWith(".db")||e.endsWith(".db-wal")||e.endsWith(".db-shm")||e.endsWith(".scip")}var fv=new Set([".git","node_modules",".scipquery-cache",".stryker-tmp","dist","build","coverage",".next",".nuxt","target"]);import{readFileSync as gv,writeFileSync as hv}from"fs";import{create as Zu}from"@bufbuild/protobuf";import{deserializeSCIP as yv,DocumentSchema as bv,IndexSchema as Sv,serializeSCIP as xv,SymbolRole as Cv}from"@c4312/scip";function em(e){let t;try{t=yv(gv(e))}catch{return{removedDefinitionOccurrences:0,touchedDocuments:0}}let n=Rv(t);return n.removedDefinitionOccurrences>0&&hv(e,Buffer.from(xv(n.index))),{removedDefinitionOccurrences:n.removedDefinitionOccurrences,touchedDocuments:n.touchedDocuments}}function Rv(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,r=0,i=[];for(let o of e.documents){let s=o.occurrences.filter(a=>(a.symbolRoles&Cv.Definition)===0||t.has(a.symbol)?!0:(n+=1,!1));if(s.length===o.occurrences.length){i.push(o);continue}r+=1,i.push(Zu(bv,{language:o.language,relativePath:o.relativePath,occurrences:s,symbols:o.symbols,text:o.text,positionEncoding:o.positionEncoding}))}return{index:n===0?e:Zu(Sv,{metadata:e.metadata,documents:i,externalSymbols:e.externalSymbols}),removedDefinitionOccurrences:n,touchedDocuments:r}}import{execFile as Iv}from"child_process";import{existsSync as Ni,renameSync as Js,rmSync as zs}from"fs";import{cpus as vv}from"os";import{join as tm}from"path";function Dv(e,t,n){if(!e.defaultOutputPath)return;let r=tm(t,e.defaultOutputPath);n!==r&&Ni(r)&&Js(r,n)}function Nv(e,t,n){if(!e.defaultOutputPath)return null;let r=tm(t,e.defaultOutputPath);if(r===n)return null;let i=`${n}.default-output-backup`;return zs(i,{force:!0}),Ni(r)?(Js(r,i),{defaultOutputPath:r,backupPath:i}):{defaultOutputPath:r,backupPath:null}}function _v(e){e&&(zs(e.defaultOutputPath,{force:!0}),e.backupPath&&Ni(e.backupPath)&&Js(e.backupPath,e.defaultOutputPath))}function Lv(e,t){if(e<=1)return 1;let n=Number(process.env.SCIP_QUERY_INDEXER_CONCURRENCY??0),r=Number.isFinite(t)&&t&&t>0?t:Number.isFinite(n)&&n>0?n:Math.min(2,Math.max(1,vv().length-1));return Math.max(1,Math.min(e,Math.floor(r)))}async function nm(e,t,n,r){let i=e.filter(l=>l.config.defaultOutputPath),o=e.filter(l=>!l.config.defaultOutputPath),s=[],a=Lv(o.length,r),c=await Ev(o,a,l=>Gs(l,t,n));if(a>1){let l=new Map;for(let u of c.filter(m=>m.skipped)){let m=o.find(d=>d.language===u.language);m&&(n(`Retrying ${m.language} indexer serially after parallel failure...`),l.set(m.language,await Gs(m,t,n)))}s.push(...c.map(u=>l.get(u.language)??u))}else s.push(...c);for(let l of i)s.push(await Gs(l,t,n));return s.sort((l,u)=>e.findIndex(m=>m.language===l.language)-e.findIndex(m=>m.language===u.language))}async function Gs(e,t,n){n(`Indexing ${e.language} with ${e.resolvedBinary}...`),zs(e.scipPath,{force:!0});let r=Nv(e.config,t,e.scipPath);try{await wv(e.binary,e.args,{cwd:t,env:e.env,maxBuffer:50*1024*1024}),Dv(e.config,t,e.scipPath)}catch(i){let o=i instanceof Error?i.message:String(i),s=`${e.resolvedBinary} indexer failed: ${o.split(`
|
|
750
|
+
`)[0]}`;return n(`Skipping ${e.language}: ${s}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:s}}}finally{_v(r)}if(!Ni(e.scipPath)){let i=`${e.resolvedBinary} indexer completed but did not produce ${e.scipPath}`;return n(`Skipping ${e.language}: ${i}`),{language:e.language,scipPath:e.scipPath,skipped:{language:e.language,reason:i}}}return{language:e.language,scipPath:e.scipPath}}function wv(e,t,n){return new Promise((r,i)=>{Iv(e,[...t],n,o=>{o?i(o):r()})})}async function Ev(e,t,n){if(e.length===0)return[];let r=new Array(e.length),i=0,o=Math.max(1,Math.min(e.length,t)),s=Array.from({length:o},async()=>{for(;i<e.length;){let a=i++;r[a]=await n(e[a])}});return await Promise.all(s),r}import{execFileSync as Qs}from"child_process";import{existsSync as Ks,readFileSync as kv}from"fs";import{createRequire as Pv}from"module";import{platform as Fv}from"os";import{dirname as rm,join as _i}from"path";var Tv=Pv(import.meta.url);function Ys(e){return[e.indexerBinary,...e.binaryAliases??[]]}function Li(e){let t=Ys(e);return t.length===1?t[0]:t.join(" or ")}function _n(e){for(let t of Ys(e))if(Le(t))return t;return Mv(e)}function im(e){return _n(e)!==null||Av(e)}function Av(e){return om(e)!==null}function Mv(e){let t=om(e);if(!t)return null;let r=JSON.parse(kv(t,"utf8")).bin;if(!r)return null;if(typeof r=="string")return _i(rm(t),r);for(let i of Ys(e)){let o=r[i];if(o)return _i(rm(t),o)}return null}function om(e){if(!e.bundledNpmPackage)return null;try{return Tv.resolve(`${e.bundledNpmPackage}/package.json`)}catch{return null}}function Xs(e,t){for(let n of e.projectLocalBinaries??[]){let r=_i(t,n);if(Ks(r))return r}return null}function Ov(e,t){return Xs(e,t)??_n(e)}function sm(e,t=process.env,n=e.indexerBinary){if(e.indexerBinary!=="scip-dotnet"||Zs(n,t))return t;let r=lm(n,t);return r?{...t,DOTNET_ROOT:r}:t}function am(e,t){let n=Li(e),r=t?Ov(e,t):_n(e);if(!r)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:r};let i=$v(r);return{language:e.language,binaryLabel:n,installed:!0,runnable:i.runnable,resolvedBinary:r,installUrl:e.installUrl,note:i.note}}function cm(e,t){let n=e.installMethods,r=Li(e);if(!n?.length)return t(`No auto-install method available for ${r}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1;for(let i of n)if(Le(i.prerequisite)){t(`Installing ${r} via ${i.label}...`);try{Qs(i.binary,i.args,{stdio:"inherit",timeout:3e5,env:process.env});let o=_n(e);if(o){let s=o===e.indexerBinary?"":` (using ${o})`;return t(`Successfully installed ${r} via ${i.label}${s}`),!0}t(`${i.label} command completed but ${r} was not found on PATH`)}catch(o){let s=o instanceof Error?o.message:String(o);t(`${i.label} install failed: ${s}`)}}return t(`Could not auto-install ${r}.`),e.installUrl&&t(`Install manually from: ${e.installUrl}`),!1}function $v(e){if(Zs(e,process.env))return{runnable:!0};let t=lm(e,process.env);if(t)return{runnable:!0,note:`using .NET 9 runtime from ${t}`};let n=um(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 lm(e,t){for(let n of um(t))if(Zs(e,{...t,DOTNET_ROOT:n}))return n;return null}function um(e){let t=[],n=e.DOTNET_ROOT;if(n&&Ks(n)&&t.push(n),Fv()==="darwin"&&Le("brew"))try{let r=Qs("brew",["--prefix","dotnet@9"],{stdio:"pipe",env:e}).toString().trim(),i=_i(r,"libexec");Ks(i)&&!t.includes(i)&&t.push(i)}catch{}return t}function Zs(e,t){try{return Qs(e,["--version"],{stdio:"pipe",env:t}),!0}catch{return!1}}import bD from"better-sqlite3";import{existsSync as SD,readFileSync as xD,writeFileSync as CD}from"fs";import{dirname as RD,join as ID,resolve as vD}from"path";import{readFileSync as jv,rmSync as Bv,statSync as Hv,mkdtempSync as qv}from"fs";import{cpus as Vv,tmpdir as Wv}from"os";import{join as ea}from"path";import{Worker as Uv}from"worker_threads";function mm(e){return e.length>=8&&pm(e.length)>1}function dm(e){let t=pm(e.vueFiles.length),n=Jv(e.vueFiles),r=Kv(n,t),i=new URL("./augment-vue-worker.js",import.meta.url),o=qv(ea(Wv(),"scip-query-vue-workers-")),s=new SharedArrayBuffer(4),a=new Int32Array(s),c=Gv(),l=Date.now();try{for(let m=0;m<r.length;m++)new Uv(i,{workerData:{projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,tasks:r[m],resultPath:ea(o,`${m}.json`),sharedBuffer:s}});for(;Atomics.load(a,0)<r.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 u=r.map((m,d)=>{let p=JSON.parse(jv(ea(o,`${d}.json`),"utf-8"));if(!p.ok)throw new Error(`Vue reference worker failed: ${p.error}`);return p.result});return{occurrences:u.flatMap(m=>m.occurrences),skippedReferences:u.reduce((m,d)=>m+d.skippedReferences,0)}}finally{Bv(o,{recursive:!0,force:!0})}}function pm(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,Vv().length-1));return Math.max(1,Math.min(e,n))}function Gv(){let e=Number(process.env.SCIP_QUERY_AUGMENT_VUE_WORKER_TIMEOUT_MS??0);return Number.isFinite(e)&&e>0?e:3e5}function Jv(e){let t=zv(),n=[];for(let r of e){let i=fm(r),o=Math.max(1,Math.ceil(i/t));for(let s=0;s<o;s++)n.push({fileName:r,startOffset:Math.floor(i*s/o),endOffset:s===o-1?Number.POSITIVE_INFINITY:Math.floor(i*(s+1)/o),countFileSkip:s===0})}return n}function zv(){return Number.POSITIVE_INFINITY}function Kv(e,t){let n=Array.from({length:t},()=>({tasks:[],weight:0})),r=e.map(i=>({task:i,weight:Qv(i)})).sort((i,o)=>o.weight-i.weight);for(let i of r){let o=n.reduce((s,a)=>a.weight<s.weight?a:s);o.tasks.push(i.task),o.weight+=i.weight}return n.map(i=>i.tasks).filter(i=>i.length>0)}function Qv(e){return Number.isFinite(e.endOffset)?Math.max(1,e.endOffset-e.startOffset):Math.max(1,fm(e.fileName)-e.startOffset)}function fm(e){try{return Hv(e).size}catch{return 1}}import{createRequire as Yv}from"module";import{existsSync as Xv,readFileSync as na}from"fs";import{dirname as gm,extname as Zv,join as hm,relative as eD,resolve as tD}from"path";import{pathToFileURL as nD}from"url";function rD(e){e.transaction(()=>{e.prepare(`
|
|
725
751
|
DELETE FROM mentions
|
|
726
752
|
WHERE chunk_id IN (
|
|
727
753
|
SELECT c.id
|
|
@@ -736,12 +762,12 @@ Affected consumer files:`),_.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
736
762
|
FROM documents
|
|
737
763
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
738
764
|
)
|
|
739
|
-
`).run()})()}function
|
|
765
|
+
`).run()})()}function ym(e,t){return e.prepare(`
|
|
740
766
|
SELECT relative_path AS relativePath
|
|
741
767
|
FROM documents
|
|
742
768
|
WHERE language = 'vue' OR relative_path LIKE '%.vue'
|
|
743
769
|
ORDER BY relative_path
|
|
744
|
-
`).all().map(r=>
|
|
770
|
+
`).all().map(r=>tD(t,r.relativePath))}function bm(e,t){let{vueCore:n,ts:r,volarTs:i}=iD(e),{parsed:o,vueOptions:s}=oD(n,r,t),a=gm(t),c=n.createVueLanguagePlugin(r,o.options,s,p=>p),l=sD(n,r,c),u=aD(a,o),{languageServiceHost:m}=i.createLanguageServiceHost(r,r.sys,l,p=>p,u),d=r.createLanguageService(m);return{ts:r,language:l,languageService:d,fileNames:o.fileNames,configDir:a}}function iD(e){let t=Yv(nD(hm(e,"package.json")).href);return{vueCore:ta(t,"@vue/language-core",e),ts:ta(t,"typescript",e),volarTs:ta(t,"@volar/typescript",e)}}function oD(e,t,n){let r=t.readConfigFile(n,t.sys.readFile);if(r.error||!r.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(r.config,t.sys,gm(n),void 0,n,void 0,e.getAllExtensions(o).map(s=>({extension:s.slice(1),isMixedContent:!0,scriptKind:t.ScriptKind.Deferred}))),vueOptions:o}}function sD(e,t,n){let r={},i=e.createLanguage([n],new Map,o=>{if(!Xv(o))return;let s=na(o,"utf-8");r.current?.scripts.set(o,t.ScriptSnapshot.fromString(s),n.getLanguageId(o)??pD(o))});return r.current=i,i}function aD(e,t){return{getCurrentDirectory:()=>e,getCompilationSettings:()=>t.options,getScriptFileNames:()=>t.fileNames,getProjectReferences:()=>t.projectReferences,getProjectVersion:()=>"0"}}function ta(e,t,n){try{return e(t)}catch(r){throw(typeof r=="object"&&r!==null&&"code"in r?r.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:r}):r}}function Sm(e,t,n){let r=cD(e);return i=>{let o=Kt(t,i.fileName),s=n.get(i.fileName);if(!s)return null;let a=n.positionAt(s,i.textSpan.start),c=r.get(o);if(!c)return null;let l=c.containingByLine.get(a.line);return l!==void 0?l:lD(c.starts,a.line,2)}}function cD(e){let t=e.prepare(`
|
|
745
771
|
SELECT
|
|
746
772
|
d.relative_path AS relativePath,
|
|
747
773
|
der.start_line AS startLine,
|
|
@@ -750,23 +776,23 @@ Affected consumer files:`),_.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
750
776
|
FROM defn_enclosing_ranges der
|
|
751
777
|
JOIN documents d ON d.id = der.document_id
|
|
752
778
|
ORDER BY d.relative_path, (der.end_line - der.start_line) DESC
|
|
753
|
-
`).all(),n=new Map;for(let r of t){let i=n.get(r.relativePath);i||(i={containingByLine:new Map,starts:[]},n.set(r.relativePath,i)),i.starts.push({line:r.startLine,symbolId:r.symbolId});for(let o=r.startLine;o<=r.endLine;o++)i.containingByLine.set(o,r.symbolId)}for(let r of n.values())r.starts.sort((i,o)=>i.line-o.line);return n}function
|
|
779
|
+
`).all(),n=new Map;for(let r of t){let i=n.get(r.relativePath);i||(i={containingByLine:new Map,starts:[]},n.set(r.relativePath,i)),i.starts.push({line:r.startLine,symbolId:r.symbolId});for(let o=r.startLine;o<=r.endLine;o++)i.containingByLine.set(o,r.symbolId)}for(let r of n.values())r.starts.sort((i,o)=>i.line-o.line);return n}function lD(e,t,n){let r=0,i=e.length-1;for(;r<=i;){let s=Math.floor((r+i)/2);e[s].line<t?r=s+1:i=s-1}let o=null;for(let s of[i,r]){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 xm(e,t,n){let r=hD(t),i=e.prepare("SELECT id FROM global_symbols WHERE symbol = ?"),o=e.prepare(`
|
|
754
780
|
INSERT OR IGNORE INTO global_symbols (symbol, display_name, kind, documentation)
|
|
755
781
|
VALUES (?, ?, ?, ?)
|
|
756
|
-
`),s=0,a=new Map;return e.transaction(()=>{for(let l of n){let u=
|
|
782
|
+
`),s=0,a=new Map;return e.transaction(()=>{for(let l of n){let u=Kt(t,l),m=wm(r.name,r.version,u);o.run(m,"default",7,`Vue component|${u}`);let d=yD(i,r,t,l);d&&(s++,a.set(l,d))}})(),{get(l){return a.get(l)??null},syntheticSymbols:s}}function Cm(e,t,n,r,i){return e.transaction(()=>(rD(e),uD(e,t,n,r),mD(e,i)))()}function uD(e,t,n,r){let i=e.prepare("SELECT id FROM documents WHERE relative_path = ?"),o=e.prepare(`
|
|
757
783
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
758
784
|
VALUES (?, ?, ?, ?, X'00')
|
|
759
785
|
`),s=e.prepare(`
|
|
760
786
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
761
787
|
VALUES (?, ?, 1)
|
|
762
|
-
`);for(let a of n){let c=r.get(a);if(!c)continue;let l=
|
|
788
|
+
`);for(let a of n){let c=r.get(a);if(!c)continue;let l=Kt(t,a),u=i.get(l);if(!u)continue;let m=o.run(u.id,-1,0,0);s.run(Number(m.lastInsertRowid),c)}}function Rm(e,t,n,r,i){if(e.fileName.endsWith(".vue")){let o=r.language.scripts.get(e.fileName),s=o?.generated?.languagePlugin.typescript?.getServiceScript(o.generated.root)?.code;if(o&&s){let a=r.language.maps.get(s,o);if(ra(a,e.textSpan.start)!==null)return n.get(e.fileName)}return e.fileName.startsWith(i)?n.get(e.fileName):null}return t(e)}function Im(e){let t=new Set,n=[];for(let r of e){let i=vm(r);t.has(i)||(t.add(i),n.push(r))}return n}function vm(e){return[e.sourceFile,e.sourceLine,e.sourceStartChar,e.sourceEndChar,e.symbolId].join(":")}function mD(e,t){let n=gD(e,[...new Set(t.map(c=>c.sourceFile))]),r=e.prepare(`
|
|
763
789
|
INSERT INTO chunks (document_id, chunk_index, start_line, end_line, occurrences)
|
|
764
790
|
VALUES (?, ?, ?, ?, X'00')
|
|
765
791
|
`),i=e.prepare(`
|
|
766
792
|
INSERT OR IGNORE INTO mentions (chunk_id, symbol_id, role)
|
|
767
793
|
VALUES (?, ?, 0)
|
|
768
|
-
`),o=new Set,s=0,a=0;for(let c of t){let l=
|
|
769
|
-
`)}function
|
|
794
|
+
`),o=new Set,s=0,a=0;for(let c of t){let l=vm(c);if(o.has(l))continue;o.add(l);let u=n.get(c.sourceFile);if(!u)continue;let m=r.run(u,a++,c.sourceLine,c.sourceLine),d=i.run(Number(m.lastInsertRowid),c.symbolId);s+=Number(d.changes)}return s}function*Dm(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"]),r;for(;r=t.exec(e);){let i=r[0];n.has(i)||(yield{text:i,start:r.index,end:r.index+i.length})}}function Nm(e,t){for(let[n]of e.toGeneratedLocation(t,r=>!!r.navigation))return n;return null}function ra(e,t){let n=e;for(let[r]of n.toSourceLocation(t,i=>!!i.navigation))return r;return null}function dD(e,t){let n=0,r=e.lineStarts.length-1;for(;n<=r;){let o=Math.floor((n+r)/2);e.lineStarts[o]<=t?n=o+1:r=o-1}let i=Math.max(0,r);return{line:i,character:t-e.lineStarts[i]}}function _m(e,t){return Kt(e,t).startsWith("node_modules/")}function Kt(e,t){return eD(e,t).replaceAll("\\","/")}function pD(e){switch(Zv(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 Lm(){let e=new Map;return{get(t){if(e.has(t))return e.get(t)??null;try{let n=na(t,"utf-8"),r={text:n,lineStarts:fD(n)};return e.set(t,r),r}catch{return e.set(t,null),null}},positionAt:dD}}function fD(e){let t=[0];for(let n=0;n<e.length;n++)e.charCodeAt(n)===10&&t.push(n+1);return t}function gD(e,t){let n=new Map,r=500;for(let i=0;i<t.length;i+=r){let o=t.slice(i,i+r),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 hD(e){try{let t=JSON.parse(na(hm(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 yD(e,t,n,r){let i=Kt(n,r),o=wm(t.name,t.version,i);return e.get(o)?.id??null}function wm(e,t,n){let r=n.split("/").map(i=>`\`${i.replaceAll("`","")}\``).join("/");return`scip-vue npm ${e} ${t} ${r}/default.`}function ia(e){bt({projectRoot:e.projectRoot,dbPath:e.dbPath});let t=vD(e.projectRoot,e.tsconfig);if(!SD(t))throw new Error(`Vue tsconfig not found at ${t}`);let n=new bD(e.dbPath);try{let r=ym(n,e.projectRoot),i=ID(RD(e.dbPath),"augment-vue-meta.json"),o=Em(n,e.projectRoot,e.tsconfig),s=DD(i,o,e.onStatus);if(s)return s;let a=ND({db:n,projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,configPath:t,vueFiles:r,onStatus:e.onStatus});return wD(i,Em(n,e.projectRoot,e.tsconfig),a),a}finally{n.close()}}function DD(e,t,n){let r=LD(e,t);return r&&n?.(`Vue references unchanged; reused ${r.resolvedReferences} cached resolved references.`),r}function ND(e){let t=xm(e.db,e.projectRoot,e.vueFiles),n=_D(e,t),r=Im(n.occurrences),i=Cm(e.db,e.projectRoot,e.vueFiles,t,r),o={vueFiles:e.vueFiles.length,resolvedReferences:r.length,insertedMentions:i,skippedReferences:n.skippedReferences,syntheticSymbols:t.syntheticSymbols};return e.onStatus?.(`Resolved ${o.resolvedReferences} Vue references with Volar; inserted ${o.insertedMentions} mentions.`),o}function _D(e,t){if(mm(e.vueFiles))return dm({projectRoot:e.projectRoot,dbPath:e.dbPath,tsconfig:e.tsconfig,vueFiles:e.vueFiles});let n=ED({db:e.db,projectRoot:e.projectRoot,configPath:e.configPath,vueSymbolLookup:t});return kD({...n,vueFiles:n.context.fileNames.filter(r=>r.endsWith(".vue"))})}function LD(e,t){try{let n=JSON.parse(xD(e,"utf-8"));return JSON.stringify(n.fingerprint)===JSON.stringify(t)?n.result:null}catch{return null}}function wD(e,t,n){CD(e,JSON.stringify({updatedAt:new Date().toISOString(),fingerprint:t,result:n},null,2)+`
|
|
795
|
+
`)}function Em(e,t,n){let r=e.prepare(`
|
|
770
796
|
SELECT
|
|
771
797
|
(SELECT COUNT(*) FROM documents) AS documents,
|
|
772
798
|
(SELECT COUNT(*) FROM global_symbols) AS symbols,
|
|
@@ -775,108 +801,120 @@ Affected consumer files:`),_.list(e.affectedConsumers,t=>` ${t.file} (${t.cons
|
|
|
775
801
|
(SELECT COUNT(*) FROM defn_enclosing_ranges) AS ranges,
|
|
776
802
|
(SELECT MAX(id) FROM chunks) AS maxChunkId,
|
|
777
803
|
(SELECT MAX(id) FROM global_symbols) AS maxSymbolId
|
|
778
|
-
`).get();return{version:2,tsconfig:n,files:
|
|
779
|
-
Install from: https://github.com/sourcegraph/scip/releases`);if(t("scip CLI not found on PATH. Attempting auto-install..."),!
|
|
780
|
-
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function
|
|
804
|
+
`).get();return{version:2,tsconfig:n,files:Di(t),db:r}}function ED(e){let t=Lm();return{projectRoot:e.projectRoot,context:bm(e.projectRoot,e.configPath),symbolLookup:Sm(e.db,e.projectRoot,t),vueSymbolLookup:e.vueSymbolLookup,sourceReader:t}}function kD(e){let t=[],n=0,r=e.tasks??e.vueFiles.map(i=>({fileName:i,startOffset:0,endOffset:Number.POSITIVE_INFINITY,countFileSkip:!0}));for(let i of r){let o=PD(e,i);t.push(...o.occurrences),n+=o.skippedReferences}return{occurrences:t,skippedReferences:n}}function PD(e,t){let n=e.context.language.scripts.get(t.fileName),r=n?.generated?.languagePlugin.typescript?.getServiceScript(n.generated.root)?.code;if(!n||!r)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let i=e.sourceReader.get(t.fileName);if(!i)return{occurrences:[],skippedReferences:t.countFileSkip?1:0};let o=e.context.language.maps.get(r,n),s=Kt(e.projectRoot,t.fileName),a=[...Dm(i.text)],c={tokens:a.filter(l=>l.start>=t.startOffset&&l.start<t.endOffset),tokenByStart:new Map(a.map(l=>[l.start,l])),tokenTextCounts:AD(a),processedStarts:new Set};return FD({...e,fileName:t.fileName,sourceInfo:i,sourceFile:s,map:o,tokenContext:c})}function FD(e){let t=[],n=0;for(let r of e.tokenContext.tokens){if(e.tokenContext.processedStarts.has(r.start))continue;let i=Nm(e.map,r.start);if(i===null)continue;let s=(e.context.languageService.getDefinitionAtPosition(e.fileName,i+1)??[]).find(c=>!_m(e.projectRoot,c.fileName));if(!s){n++;continue}let a=Rm(s,e.symbolLookup,e.vueSymbolLookup,e.context,e.projectRoot);if(a===null){n++;continue}km(t,e.sourceReader,e.sourceInfo,e.sourceFile,r,a),e.tokenContext.processedStarts.add(r.start),TD(t,e,r,i,a)}return{occurrences:t,skippedReferences:n}}function TD(e,t,n,r,i){if(!((t.tokenContext.tokenTextCounts.get(n.text)??0)<=1))for(let o of MD(t.context.languageService,t.fileName,r+1,t.map,n,t.tokenContext.tokenByStart)){if(t.tokenContext.processedStarts.has(o))continue;let s=t.tokenContext.tokenByStart.get(o);s&&(km(e,t.sourceReader,t.sourceInfo,t.sourceFile,s,i),t.tokenContext.processedStarts.add(o))}}function km(e,t,n,r,i,o){let s=t.positionAt(n,i.start);e.push({sourceFile:r,sourceLine:s.line,sourceStartChar:s.character,sourceEndChar:s.character+i.text.length,symbolId:o})}function AD(e){let t=new Map;for(let n of e)t.set(n.text,(t.get(n.text)??0)+1);return t}function MD(e,t,n,r,i,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 u=OD(r,l.textSpan.start,o,i.text);u!==null&&a.push(u)}return a}function OD(e,t,n,r){let i=n.get(t);if(i?.text===r)return i.start;let o=ra(e,t);if(o===null)return null;let s=n.get(o);return s?.text===r?s.start:null}async function Tm(e){let{projectRoot:t,maxHeapMb:n=8192,onStatus:r=console.log,skipAutoInstall:i=!1}=e,o=WD(e),s=Date.now();Pm(Qt(o.outputScip),{recursive:!0}),Pm(Qt(o.outputDb),{recursive:!0});let a=e.languages??zt(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.");r(`Detected languages: ${a.join(", ")}`);let c=sN(t,a,{pnpmWorkspaces:e.pnpmWorkspaces}),l=iN(rt(Qt(o.outputDb),"index.lock")),u=null;try{let m=UD({opts:e,paths:o,languages:a,fingerprint:c,start:s,onStatus:r});if(m)return m;QD(i,r);let d=GD(o);return u=d.runDir,await JD({opts:e,languages:a,projectRoot:t,paths:o,tempPaths:d,fingerprint:c,start:s,maxHeapMb:n,skipAutoInstall:i,onStatus:r})}finally{u&&ca(u,{recursive:!0,force:!0}),l()}}function WD(e){let t=e.outputScip??rt(e.projectRoot,"index.scip"),n=e.outputDb??rt(e.projectRoot,"index.db");return{outputScip:t,outputDb:n,metaPath:rt(Qt(n),"meta.json")}}function UD(e){if(e.opts.skipIfUnchanged===!1||!sa(e.paths.outputScip)||!sa(e.paths.outputDb)||!aN(e.paths.metaPath,e.fingerprint))return null;bt({projectRoot:e.opts.projectRoot,dbPath:e.paths.outputDb,onStatus:e.onStatus});let t=Date.now()-e.start;return 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:[]}}function GD(e){let t=BD(rt(Qt(e.outputDb),"reindex-"));return{runDir:t,tempOutputScip:rt(t,Ei(e.outputScip)),tempOutputDb:rt(t,Ei(e.outputDb)),tempMetaPath:rt(t,Ei(e.metaPath))}}async function JD(e){let t={...process.env,NODE_OPTIONS:`--max-old-space-size=${e.maxHeapMb}`},{indexedOutputs:n,skippedLanguages:r}=await zD(e,t);KD(e,t,n,r);let i=Date.now()-e.start;return e.onStatus(`Done in ${(i/1e3).toFixed(1)}s`),{languages:n.map(o=>o.language),indexPath:e.paths.outputScip,dbPath:e.paths.outputDb,durationMs:i,reused:!1,skipped:r}}async function zD(e,t){let{preparedRuns:n,skippedLanguages:r}=YD({languages:e.languages,tempOutputScip:e.tempPaths.tempOutputScip,projectRoot:e.projectRoot,env:t,skipAutoInstall:e.skipAutoInstall,pnpmWorkspaces:e.opts.pnpmWorkspaces,onStatus:e.onStatus}),i=await nm(n,e.projectRoot,e.onStatus,e.opts.indexerConcurrency),{indexedOutputs:o}=ZD(i,r);return eN(o,r,e.languages,e.opts.allowPartial,e.onStatus),{indexedOutputs:o,skippedLanguages:r}}function KD(e,t,n,r){tN(n,e.tempPaths.tempOutputScip,e.onStatus),nN(e.tempPaths.tempOutputScip,e.tempPaths.tempOutputDb,t,e.onStatus),bt({projectRoot:e.projectRoot,dbPath:e.tempPaths.tempOutputDb,onStatus:e.onStatus}),cN(e.tempPaths.tempMetaPath,{version:2,status:r.length===0?"complete":"partial",updatedAt:new Date().toISOString(),fingerprint:e.fingerprint,requestedLanguages:e.languages,indexedLanguages:n.map(i=>i.language),skipped:[...r]}),oN({tempOutputScip:e.tempPaths.tempOutputScip,tempOutputDb:e.tempPaths.tempOutputDb,tempMetaPath:e.tempPaths.tempMetaPath,outputScip:e.paths.outputScip,outputDb:e.paths.outputDb,metaPath:e.paths.metaPath})}function QD(e,t){if(!Le("scip")){if(e)throw new Error(`The scip CLI is required but not found on PATH.
|
|
805
|
+
Install from: https://github.com/sourcegraph/scip/releases`);if(t("scip CLI not found on PATH. Attempting auto-install..."),!ju(t))throw new Error(`The scip CLI is required but could not be installed.
|
|
806
|
+
Install manually from: https://github.com/sourcegraph/scip/releases`)}}function YD(e){let t=[],n=[],r=e.languages.map((i,o)=>({language:i,scipPath:e.languages.length>1?rN(e.tempOutputScip,i,o):e.tempOutputScip}));for(let{language:i,scipPath:o}of r){let s=XD({...e,language:i,scipPath:o});"skipped"in s?n.push(s.skipped):t.push(s.prepared)}return{preparedRuns:t,skippedLanguages:n}}function XD(e){let t=vi(e.language),n=Li(t),r=Xs(t,e.projectRoot);if(!r&&!im(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...`),!cm(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 i=r??_n(t);if(!i){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:i});return{prepared:{language:e.language,scipPath:e.scipPath,config:t,resolvedBinary:i,binary:o,args:s,env:sm(t,e.env,i)}}}function ZD(e,t){let n=[];for(let r of e)r.skipped?t.push(r.skipped):n.push({language:r.language,scipPath:r.scipPath});return{indexedOutputs:n}}function eN(e,t,n,r,i){if(e.length===0){let o=t.map(s=>` - ${s.language}: ${s.reason}`).join(`
|
|
781
807
|
`);throw new Error(`No language indexers ran successfully. Install at least one indexer for the languages in this project.
|
|
782
808
|
`+o)}if(t.length!==0&&(i(`Indexed ${e.length} of ${n.length} languages; skipped ${t.map(o=>o.language).join(", ")}.`),!r))throw new Error(`Failed to index all required languages; preserving the previous index. Pass --allow-partial to intentionally write an incomplete index.
|
|
783
809
|
`+t.map(o=>` - ${o.language}: ${o.reason}`).join(`
|
|
784
|
-
`))}function
|
|
785
|
-
`),()=>{try{
|
|
786
|
-
`)}function yi(e){return JSON.stringify(e)}import{createRequire as iD}from"module";var oD=iD(import.meta.url);function hm(e,t=[]){let n=sD(),r=no(e,t),i=r[0];return n?r.length===0?{available:!1,dependencyAvailable:n,reason:"no tsconfig found"}:{available:!0,dependencyAvailable:n,tsconfigPath:i,tsconfigPaths:r}:{available:!1,dependencyAvailable:n,tsconfigPath:i,tsconfigPaths:r,reason:"ts-morph is not installed"}}function sD(){try{return oD.resolve("ts-morph"),!0}catch{return!1}}function Us(e,t){let n=t.languages??qt(e),r=n.map(o=>{let s=qu(di(o),e);return{...s,language:o,resolvedBinary:s.resolvedBinary??void 0}}),i=n.includes("typescript")?{language:"typescript",...hm(e,t.semantic?.typescript?.tsconfigs)}:void 0;return{languages:n,indexers:r,semantic:i}}import{watch as aD}from"fs";import{existsSync as ym,renameSync as bm}from"fs";import{join as cD,relative as lD}from"path";import{fork as uD}from"child_process";import mD from"ignore";var Si=class{projectRoot;watchConfig;indexPaths;languages;pnpmWorkspaces;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitignoreFilter;extraIgnore;stopped=!1;constructor(t){this.projectRoot=t.projectRoot,this.watchConfig=ou(t.config),this.indexPaths=Sn(t.projectRoot,t.config),this.languages=t.languages,this.pnpmWorkspaces=t.config.indexer?.typescript?.pnpmWorkspaces??!1,this.onStatus=t.onStatus??(()=>{}),this.onReindexComplete=t.onReindexComplete??(()=>{}),this.onError=t.onError??(n=>console.error(n.message)),this.gitignoreFilter=yn(t.projectRoot),this.extraIgnore=mD(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"});try{let t=aD(this.projectRoot,{recursive:!0},(n,r)=>{r&&!this.stopped&&this.handleFileChange(r)});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.setStatus({state:"idle"})}handleFileChange(t){let n=lD(this.projectRoot,cD(this.projectRoot,t));if(this.gitignoreFilter.isIgnored(n)||this.extraIgnore.ignores(n)||t.endsWith("index.db")||t.endsWith("index.scip")||t.endsWith("index.db.tmp")||t.endsWith(".scipquery.json"))return;if(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 r=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:r}),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 i=Date.now()+r;this.setStatus({state:"cooldown",until:i,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=Date.now();this.setStatus({state:"indexing",startedAt:n}),this.runReindex().then(r=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(r),this.dirty&&!this.stopped){let i=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:i,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(){return new Promise((t,n)=>{let r=Date.now(),i=this.indexPaths.dbPath+".tmp",o=dD(this.indexPaths.indexPath),s=uD(new URL("./reindex-worker.js",import.meta.url).pathname,[],{env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:o,SCIP_REINDEX_OUTPUT_DB:i,SCIP_REINDEX_LANGUAGES:this.languages?.join(",")??"",SCIP_REINDEX_PNPM_WORKSPACES:this.pnpmWorkspaces?"1":""},stdio:"pipe"});s.on("exit",a=>{if(a===0)try{ym(i)&&bm(i,this.indexPaths.dbPath),ym(o)&&bm(o,this.indexPaths.indexPath),t(Date.now()-r)}catch(c){n(new Error(`Atomic swap failed: ${c}`))}else n(new Error(`Reindex worker exited with code ${a}`))}),s.on("error",n)})}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)}};function dD(e){return e.endsWith(".scip")?e.slice(0,-5)+".tmp.scip":e+".tmp.scip"}function q(e){return(...t)=>{let{args:n,opts:r}=pD(t);Xe(i=>e({db:i,args:n,opts:r}))}}function X(e,t){return q(n=>{let r=du(n.db,e,j(n.opts,"full"));t({...n,budget:r})})}function Sm(e){return q(t=>Rn(t,e,{kind:"list"}))}function xm(e){return q(t=>Rn(t,e,{kind:"table",headers:e.headers,dashWidths:e.dashWidths}))}function Cm(e){return q(t=>Rn(t,e,{kind:"grouped",key:e.key}))}function Ut(e){return q(t=>Gs(t,e))}function Rm(e){return Ut({query:e.query,emptyMessage:e.emptyMessage,heuristicLabel:e.heuristicLabel,before:e.before,render:(t,n)=>_.sectionedReport(e.sections(t,n)),after:e.after})}function cr(e,t){return X(e,n=>Gs(n,t))}function Im(e,t){return cr(e,{query:t.query,emptyMessage:t.emptyMessage,heuristicLabel:t.heuristicLabel,before:t.before,render:(n,r)=>_.sectionedReport(t.sections(n,r)),after:t.after})}function et(e,t){return X(e,n=>Rn(n,t,{kind:"list"}))}function xi(e,t){return X(e,n=>Rn(n,t,{kind:"table",headers:t.headers,dashWidths:t.dashWidths}))}function Ci(e,t){return X(e,n=>Rn(n,t,{kind:"grouped",key:t.key}))}function M(e,t){return String(e[t])}function qe(e,t){let n=e[t];return typeof n=="string"?n:void 0}function k(e,t){let n=e[t];return typeof n=="string"?n:void 0}function gt(e,t){let n=e[t];return typeof n=="number"?n:void 0}function j(e,t){return!!e[t]}function vm(e,t){let n=e[t];return Array.isArray(n)&&n.every(r=>typeof r=="string")?n:[]}function S(e,t,n){return gt(e,t)??n}function Rn(e,t,n){Gs(e,{query:t.query,emptyMessage:(r,i)=>r.length===0&&t.emptyMessage?t.emptyMessage(i):void 0,heuristicLabel:t.heuristicLabel,render:(r,i)=>{n.kind==="list"?_.list(r,o=>t.format(o,i)):n.kind==="table"?_.table(n.headers,r.map(o=>t.format(o,i)),n.dashWidths):_.groupedByFile(r,o=>t.format(o,i),n.key?o=>n.key(o,i):void 0)},after:t.after})}function Gs(e,t){let n=t.query(e),r=t.emptyMessage?.(n,e);if(r){_.empty(r);return}t.heuristicLabel&&or(t.heuristicLabel),t.before?.(n,e),t.render(n,e),t.after?.(n,e)}function pD(e){if(e.length===0)return{args:[],opts:{}};let t=e[e.length-1];return{args:e.slice(0,-1),opts:tt(t)}}function tt(e){if(!e||typeof e!="object")return{};let t=e;if(typeof t.opts=="function"){let n=t.opts();return n&&typeof n=="object"?n:{}}return e}var fD=new Set(["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php"]);function gD(e){return e.filter(t=>fD.has(t))}async function Nm(e){let t=tt(e),n=He(),r=bn(n),i=Sn(n,r);try{let o=gD(vm(t,"language")),s=await gm({projectRoot:n,languages:o.length>0?o:r.languages,outputScip:i.indexPath,outputDb:i.dbPath,pnpmWorkspaces:j(t,"pnpmWorkspaces")||r.indexer?.typescript?.pnpmWorkspaces,skipIfUnchanged:!j(t,"force"),allowPartial:j(t,"allowPartial"),indexerConcurrency:gt(t,"indexerConcurrency")});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 Lm(){let e=He(),t=gs(e);try{let n=ft({projectRoot:e,dbPath:t,onStatus:r=>console.log(r)});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 _m(e){let t=tt(e),n=He(),r=gs(n);try{let i=Bs({projectRoot:n,dbPath:r,tsconfig:k(t,"project")??"frontend/tsconfig.scip.json",onStatus:o=>console.log(o)});console.log(`Vue files: ${i.vueFiles}; resolved references: ${i.resolvedReferences}; inserted mentions: ${i.insertedMentions}.`)}catch(i){console.error(`error: ${i instanceof Error?i.message:i}`),process.exit(1)}}function wm(e){let t=tt(e);Xe(n=>{let r=JSON.parse(process.env.SCIP_QUERY_DIFF_IMPACT_FILES??"[]"),i=fn(n,{base:k(t,"base")}),o=Yr(n,r,i.changedFiles);console.log(JSON.stringify(o))})}function Em(e){let t=tt(e);try{hu(gu({base:k(t,"base")}))}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function km(e,t){let n=tt(t);Xe(r=>{ir.includes(e)||(console.error(`error: Unknown health phase: ${e}`),process.exit(1));let i=ns(r,e,{scope:k(n,"scope"),full:j(n,"full")});console.log(JSON.stringify(i))})}function Pm(e){let t=tt(e);if(j(t,"writeBaseline")||j(t,"baseline")){hD(t);return}try{let n=pu({scope:k(t,"scope"),full:j(t,"full"),json:j(t,"json")});fu(n,j(t,"json"))}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function hD(e){let t=k(e,"scope");Xe(n=>{if(j(e,"writeBaseline")){let i=Yo(n,{scope:t});console.log(`Baseline written to ${i.path} (${i.findingCount} finding(s)).`);return}let r=Zn(n,{scope:t});if(r.fixedFindings.length>0&&console.log(`${r.fixedFindings.length} finding(s) fixed since baseline. Re-run --write-baseline to ratchet down.`),r.newFindings.length===0){console.log(`OK: no new findings vs baseline (${r.baselineCount} baselined, ${r.current.length} current).`);return}console.log(`FAIL: ${r.newFindings.length} new finding(s) vs ${r.baselinePath}:`);for(let i of r.newFindings)console.log(` + ${i}`);process.exitCode=1})}function Fm(){let e=Ru(),t=e.installed.length+e.alreadyLinked.length;console.log(`
|
|
787
|
-
|
|
810
|
+
`))}function tN(e,t,n){e.length>1?(n(`Merging ${e.length} language indexes...`),Ku(e.map(r=>r.scipPath),t)):e[0].scipPath!==t&&aa(e[0].scipPath,t)}function nN(e,t,n,r){if(r("Converting to SQLite..."),!sa(e))throw new Error(`SCIP index not found at ${e} after indexing`);try{let i=em(e);i.removedDefinitionOccurrences>0&&r(`Sanitized ${i.removedDefinitionOccurrences} invalid definition occurrences across ${i.touchedDocuments} documents before SQLite conversion.`),$D("scip",["expt-convert","--output",t,e],{env:n,stdio:"pipe",maxBuffer:50*1024*1024})}catch(i){let o=i instanceof Error?i.message:String(i);throw new Error(`Failed to convert SCIP index to SQLite: ${o}`,{cause:i})}}function rN(e,t,n){let r=VD(e)||".scip",i=Ei(e,r);return rt(Qt(e),`${i}.${n+1}.${t}${r}`)}function iN(e){let t;try{t=HD(e,"wx")}catch(n){throw(typeof n=="object"&&n&&"code"in n?n.code:void 0)==="EEXIST"?new Error(`Another scip-query reindex is already running for ${Qt(e)}.`,{cause:n}):n}return Fm(t,JSON.stringify({pid:process.pid,startedAt:new Date().toISOString()})+`
|
|
811
|
+
`),()=>{try{jD(t)}finally{ca(e,{force:!0})}}}function oN(e){oa(e.tempOutputScip,e.outputScip),oa(e.tempOutputDb,e.outputDb),oa(e.tempMetaPath,e.metaPath)}function oa(e,t){ca(`${t}.tmp-replace`,{force:!0}),aa(e,`${t}.tmp-replace`),aa(`${t}.tmp-replace`,t)}function sN(e,t,n){return{version:1,languages:[...t].sort(),pnpmWorkspaces:n.pnpmWorkspaces===!0,files:Di(e)}}function aN(e,t){try{let n=JSON.parse(qD(e,"utf-8"));return n.version===2&&n.status==="complete"&&wi(n.fingerprint)===wi(t)&&wi([...n.indexedLanguages??[]].sort())===wi(t.languages)}catch{return!1}}function cN(e,t){Fm(e,`${JSON.stringify(t,null,2)}
|
|
812
|
+
`)}function wi(e){return JSON.stringify(e)}import{createRequire as lN}from"module";var uN=lN(import.meta.url);function Am(e,t=[]){let n=mN(),r=So(e,t),i=r[0];return n?r.length===0?{available:!1,dependencyAvailable:n,reason:"no tsconfig found"}:{available:!0,dependencyAvailable:n,tsconfigPath:i,tsconfigPaths:r}:{available:!1,dependencyAvailable:n,tsconfigPath:i,tsconfigPaths:r,reason:"ts-morph is not installed"}}function mN(){try{return uN.resolve("ts-morph"),!0}catch{return!1}}function la(e,t){let n=t.languages??zt(e),r=n.map(o=>{let s=am(vi(o),e);return{...s,language:o,resolvedBinary:s.resolvedBinary??void 0}}),i=n.includes("typescript")?{language:"typescript",...Am(e,t.semantic?.typescript?.tsconfigs)}:void 0;return{languages:n,indexers:r,semantic:i}}import{watch as dN}from"fs";import{existsSync as Mm,renameSync as Om}from"fs";import{join as pN,relative as fN}from"path";import{fork as gN}from"child_process";import hN from"ignore";var ki=class{projectRoot;watchConfig;indexPaths;languages;pnpmWorkspaces;onStatus;onReindexComplete;onError;status={state:"idle"};debounceTimer=null;cooldownTimer=null;dirty=!1;changedFiles=0;reindexInFlight=!1;lastReindexEnd=0;fsWatchers=[];gitignoreFilter;extraIgnore;stopped=!1;constructor(t){this.projectRoot=t.projectRoot,this.watchConfig=Du(t.config),this.indexPaths=Dn(t.projectRoot,t.config),this.languages=t.languages,this.pnpmWorkspaces=t.config.indexer?.typescript?.pnpmWorkspaces??!1,this.onStatus=t.onStatus??(()=>{}),this.onReindexComplete=t.onReindexComplete??(()=>{}),this.onError=t.onError??(n=>console.error(n.message)),this.gitignoreFilter=In(t.projectRoot),this.extraIgnore=hN(),this.watchConfig.ignore.length>0&&this.extraIgnore.add(this.watchConfig.ignore)}start(){this.stopped=!1,this.setStatus({state:"idle"});try{let t=dN(this.projectRoot,{recursive:!0},(n,r)=>{r&&!this.stopped&&this.handleFileChange(r)});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.setStatus({state:"idle"})}handleFileChange(t){let n=fN(this.projectRoot,pN(this.projectRoot,t));if(this.gitignoreFilter.isIgnored(n)||this.extraIgnore.ignores(n)||t.endsWith("index.db")||t.endsWith("index.scip")||t.endsWith("index.db.tmp")||t.endsWith(".scipquery.json"))return;if(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 r=Date.now()+this.watchConfig.debounceMs;this.setStatus({state:"waiting",changedFiles:this.changedFiles,reindexAt:r}),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 i=Date.now()+r;this.setStatus({state:"cooldown",until:i,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=Date.now();this.setStatus({state:"indexing",startedAt:n}),this.runReindex().then(r=>{if(this.reindexInFlight=!1,this.lastReindexEnd=Date.now(),this.onReindexComplete(r),this.dirty&&!this.stopped){let i=Date.now()+this.watchConfig.cooldownMs;this.setStatus({state:"cooldown",until:i,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(){return new Promise((t,n)=>{let r=Date.now(),i=this.indexPaths.dbPath+".tmp",o=yN(this.indexPaths.indexPath),s=gN(new URL("./reindex-worker.js",import.meta.url).pathname,[],{env:{...process.env,SCIP_REINDEX_PROJECT_ROOT:this.projectRoot,SCIP_REINDEX_OUTPUT_SCIP:o,SCIP_REINDEX_OUTPUT_DB:i,SCIP_REINDEX_LANGUAGES:this.languages?.join(",")??"",SCIP_REINDEX_PNPM_WORKSPACES:this.pnpmWorkspaces?"1":""},stdio:"pipe"});s.on("exit",a=>{if(a===0)try{Mm(i)&&Om(i,this.indexPaths.dbPath),Mm(o)&&Om(o,this.indexPaths.indexPath),t(Date.now()-r)}catch(c){n(new Error(`Atomic swap failed: ${c}`))}else n(new Error(`Reindex worker exited with code ${a}`))}),s.on("error",n)})}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)}};function yN(e){return e.endsWith(".scip")?e.slice(0,-5)+".tmp.scip":e+".tmp.scip"}import{chmodSync as bN,existsSync as Pi,readFileSync as Fi,writeFileSync as Bm}from"fs";import{join as hr}from"path";var gr="<!-- scip-query:agent-setup:begin -->",ua="<!-- scip-query:agent-setup:end -->",$m="# scip-query:agent-setup";function Hm(){if(process.stdin.isTTY)return"";try{return Fi(0,"utf-8")}catch{return""}}function qm(e){if(!e.trim())return!1;try{return JSON.parse(e).stop_hook_active===!0}catch{return!1}}function Vm(e){let t=[`scip-query diff-gate found ${e.findings.length} issue(s) in this diff \u2014 fix or knowingly accept them before finishing:`];for(let n of e.findings)t.push(`- [${n.check}] ${n.message}`),t.push(` -> ${n.remediation}`);return t.join(`
|
|
813
|
+
`)}function Wm(e,t={}){let n={written:[],unchanged:[],skipped:[]};return SN(e,n),t.gitHook&&xN(e,n),n}function SN(e,t){let n=[gr,"## 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.",ua].join(`
|
|
814
|
+
`);jm(e,"AGENTS.md",n,t);let r=Pi(hr(e,"CLAUDE.md"))?Fi(hr(e,"CLAUDE.md"),"utf-8"):"";if(r.includes("@AGENTS.md")&&!r.includes(gr)){t.unchanged.push("CLAUDE.md");return}let i=[gr,"@AGENTS.md",ua].join(`
|
|
815
|
+
`);jm(e,"CLAUDE.md",i,t)}function jm(e,t,n,r){let i=hr(e,t),o=Pi(i)?Fi(i,"utf-8"):"",s;if(o.includes(gr)){let a=new RegExp(`${gr}[\\s\\S]*?${ua}`);s=o.replace(a,n)}else s=o.length>0?`${o.replace(/\n*$/,`
|
|
816
|
+
|
|
817
|
+
`)}${n}
|
|
818
|
+
`:`${n}
|
|
819
|
+
`;s===o?r.unchanged.push(t):(Bm(i,s),r.written.push(t))}function xN(e,t){let n=hr(e,".git","hooks");if(!Pi(n)){t.skipped.push({target:".git/hooks/pre-commit",reason:"no .git/hooks directory (not a git repository?)"});return}let r=hr(n,"pre-commit"),i=["#!/bin/sh",$m,"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(`
|
|
820
|
+
`);if(Pi(r)){let o=Fi(r,"utf-8");if(o.includes($m)){if(o===i){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}}Bm(r,i),bN(r,493),t.written.push(".git/hooks/pre-commit")}function V(e){return(...t)=>{let{args:n,opts:r}=CN(t);nt(i=>e({db:i,args:n,opts:r}))}}function ee(e,t){return V(n=>{let r=Pu(n.db,e,j(n.opts,"full"));t({...n,budget:r})})}function Um(e){return V(t=>Ln(t,e,{kind:"list"}))}function Gm(e){return V(t=>Ln(t,e,{kind:"table",headers:e.headers,dashWidths:e.dashWidths}))}function Jm(e){return V(t=>Ln(t,e,{kind:"grouped",key:e.key}))}function Yt(e){return V(t=>ma(t,e))}function zm(e){return Yt({query:e.query,emptyMessage:e.emptyMessage,heuristicLabel:e.heuristicLabel,before:e.before,render:(t,n)=>L.sectionedReport(e.sections(t,n)),after:e.after})}function yr(e,t){return ee(e,n=>ma(n,t))}function Km(e,t){return yr(e,{query:t.query,emptyMessage:t.emptyMessage,heuristicLabel:t.heuristicLabel,before:t.before,render:(n,r)=>L.sectionedReport(t.sections(n,r)),after:t.after})}function it(e,t){return ee(e,n=>Ln(n,t,{kind:"list"}))}function Ti(e,t){return ee(e,n=>Ln(n,t,{kind:"table",headers:t.headers,dashWidths:t.dashWidths}))}function Ai(e,t){return ee(e,n=>Ln(n,t,{kind:"grouped",key:t.key}))}function O(e,t){return String(e[t])}function Ue(e,t){let n=e[t];return typeof n=="string"?n:void 0}function k(e,t){let n=e[t];return typeof n=="string"?n:void 0}function we(e,t){let n=e[t];return typeof n=="number"?n:void 0}function j(e,t){return!!e[t]}function Qm(e,t){let n=e[t];return Array.isArray(n)&&n.every(r=>typeof r=="string")?n:[]}function C(e,t,n){return we(e,t)??n}function Ln(e,t,n){ma(e,{query:t.query,emptyMessage:(r,i)=>r.length===0&&t.emptyMessage?t.emptyMessage(i):void 0,heuristicLabel:t.heuristicLabel,render:(r,i)=>{n.kind==="list"?L.list(r,o=>t.format(o,i)):n.kind==="table"?L.table(n.headers,r.map(o=>t.format(o,i)),n.dashWidths):L.groupedByFile(r,o=>t.format(o,i),n.key?o=>n.key(o,i):void 0)},after:t.after})}function ma(e,t){let n=t.query(e),r=t.emptyMessage?.(n,e);if(r){L.empty(r);return}t.heuristicLabel&&pr(t.heuristicLabel),t.before?.(n,e),t.render(n,e),t.after?.(n,e)}function CN(e){if(e.length===0)return{args:[],opts:{}};let t=e[e.length-1];return{args:e.slice(0,-1),opts:Ge(t)}}function Ge(e){if(!e||typeof e!="object")return{};let t=e;if(typeof t.opts=="function"){let n=t.opts();return n&&typeof n=="object"?n:{}}return e}var RN=new Set(["typescript","javascript","java","scala","kotlin","rust","python","ruby","go","cpp","c","csharp","vb","dart","php"]);function IN(e){return e.filter(t=>RN.has(t))}async function Xm(e){let t=Ge(e),n=Oe(),r=vn(n),i=Dn(n,r);try{let o=IN(Qm(t,"language")),s=await Tm({projectRoot:n,languages:o.length>0?o:r.languages,outputScip:i.indexPath,outputDb:i.dbPath,pnpmWorkspaces:j(t,"pnpmWorkspaces")||r.indexer?.typescript?.pnpmWorkspaces,skipIfUnchanged:!j(t,"force"),allowPartial:j(t,"allowPartial"),indexerConcurrency:we(t,"indexerConcurrency")});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 Zm(){let e=Oe(),t=Ps(e);try{let n=bt({projectRoot:e,dbPath:t,onStatus:r=>console.log(r)});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 ed(e){let t=Ge(e),n=Oe(),r=Ps(n);try{let i=ia({projectRoot:n,dbPath:r,tsconfig:k(t,"project")??"frontend/tsconfig.scip.json",onStatus:o=>console.log(o)});console.log(`Vue files: ${i.vueFiles}; resolved references: ${i.resolvedReferences}; inserted mentions: ${i.insertedMentions}.`)}catch(i){console.error(`error: ${i instanceof Error?i.message:i}`),process.exit(1)}}function td(e){let t=Ge(e);nt(n=>{let r=JSON.parse(process.env.SCIP_QUERY_DIFF_IMPACT_FILES??"[]"),i=yt(n,{base:k(t,"base")}),o=ai(n,r,i.changedFiles);console.log(JSON.stringify(o))})}function nd(e){let t=Ge(e);try{Mu(Au({base:k(t,"base")}))}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function rd(e,t){let n=Ge(t);nt(r=>{dr.includes(e)||(console.error(`error: Unknown health phase: ${e}`),process.exit(1));let i=Ss(r,e,{scope:k(n,"scope"),full:j(n,"full")});console.log(JSON.stringify(i))})}function id(e){let t=Ge(e);if(j(t,"writeBaseline")||j(t,"baseline")){vN(t);return}try{let n=Fu({scope:k(t,"scope"),full:j(t,"full"),json:j(t,"json")});Tu(n,j(t,"json"))}catch(n){console.error(`error: ${n instanceof Error?n.message:n}`),process.exit(1)}}function vN(e){let t=k(e,"scope");nt(n=>{if(j(e,"writeBaseline")){let i=fs(n,{scope:t});console.log(`Baseline written to ${i.path} (${i.findingCount} finding(s)).`);return}let r=sr(n,{scope:t});if(r.fixedFindings.length>0&&console.log(`${r.fixedFindings.length} finding(s) fixed since baseline. Re-run --write-baseline to ratchet down.`),r.newFindings.length===0){console.log(`OK: no new findings vs baseline (${r.baselineCount} baselined, ${r.current.length} current).`);return}console.log(`FAIL: ${r.newFindings.length} new finding(s) vs ${r.baselinePath}:`);for(let i of r.newFindings)console.log(` + ${i}`);process.exitCode=1})}function od(){let e=Hu(),t=e.installed.length+e.alreadyLinked.length;console.log(`
|
|
821
|
+
${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 sd(){let e=!1;$s()?console.log("scip CLI: installed"):(js(),e=!0);let t=Oe(),n=vn(t),r=la(t,n);if(r.languages.length===0){console.log(`
|
|
788
822
|
No supported project languages detected in the current directory.`),process.exitCode=e?1:0;return}console.log(`
|
|
789
823
|
Detected languages: ${r.languages.join(", ")}`),console.log(`
|
|
790
824
|
Indexer readiness:`);for(let i of r.indexers){let o=i.runnable?" OK":i.installed?" WARN":" MISSING",s=i.resolvedBinary?` (${i.resolvedBinary})`:"";console.log(`${o} ${i.language}: ${i.binaryLabel}${s}`),i.note&&console.log(` ${i.note}`),!i.installed&&i.installUrl&&console.log(` install: ${i.installUrl}`),i.runnable||(e=!0)}if(r.semantic){let i=r.semantic,o=i.available?" OK":i.dependencyAvailable?" WARN":" MISSING",s=i.tsconfigPaths&&i.tsconfigPaths.length>1?` (${i.tsconfigPaths.length} tsconfigs)`:i.tsconfigPath?` (${i.tsconfigPath})`:"";console.log(`
|
|
791
|
-
Semantic provider readiness:`),console.log(`${o} typescript: ts-morph${s}`),i.reason&&console.log(` ${i.reason}; semantic checks will fall back to SCIP/source evidence`)}process.exitCode=e?1:0}function
|
|
825
|
+
Semantic provider readiness:`),console.log(`${o} typescript: ts-morph${s}`),i.reason&&console.log(` ${i.reason}; semantic checks will fall back to SCIP/source evidence`)}process.exitCode=e?1:0}function ad(){let e=Oe(),t=zt(e),n=Nu(e,t);console.log(`Config written to ${n}`),console.log(`Detected languages: ${t.join(", ")||"(none)"}`)}function cd(e){let t=Ge(e),n=Oe(),r=Wm(n,{gitHook:j(t,"gitHook")});for(let i of r.written)console.log(` done: ${i}`);for(let i of r.unchanged)console.log(` ok: ${i} (already wired)`);for(let i of r.skipped)console.log(` skip: ${i.target} \u2014 ${i.reason}`);console.log(`
|
|
826
|
+
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.")}function ld(e){let t=Ge(e),n=Oe(),r=vn(n),i=we(t,"debounce"),o=we(t,"cooldown");i&&((r.watch??={}).debounceMs=i),o&&((r.watch??={}).cooldownMs=o);let s=new ki({projectRoot:n,config:r,languages:r.languages,onStatus:a=>{process.stdout.write(`\r\x1B[K${Lu(a)}`)},onReindexComplete:a=>{console.log(`
|
|
792
827
|
Reindex complete in ${(a/1e3).toFixed(1)}s`)},onError:a=>{console.error(`
|
|
793
828
|
Watch error: ${a.message}`)}});console.log(`Watching ${n}`),console.log(`Debounce: ${r.watch?.debounceMs??3e4}ms | Cooldown: ${r.watch?.cooldownMs??6e4}ms`),console.log(`Press Ctrl+C to stop.
|
|
794
829
|
`),s.start(),process.on("SIGINT",()=>{s.stop(),console.log(`
|
|
795
|
-
Stopped.`),process.exit(0)})}function
|
|
796
|
-
`).map(o=>o.slice(3).trim()).filter(o=>o!==""));return[...new Set(t.batches.flatMap(o=>o.entries.map(s=>s.file)))].filter(o=>r.has(o)).sort()}function
|
|
797
|
-
`),i=(n.rust===!0?
|
|
798
|
-
`),o=new Set;for(let s of t){let a=
|
|
799
|
-
`)}function
|
|
830
|
+
Stopped.`),process.exit(0)})}function ud(){let{projectRoot:e,config:t,paths:n,dbPath:r}=yi(),i=la(e,t);if(console.log(`Project: ${e}`),console.log(`DB path: ${r}`),r!==n.dbPath&&console.log(`Config: ${n.dbPath} (fallback to project root index.db)`),i.semantic){let o=i.semantic.available?"available":"fallback",s=i.semantic.tsconfigPaths&&i.semantic.tsconfigPaths.length>1?` (${i.semantic.tsconfigPaths.length} tsconfigs)`:i.semantic.tsconfigPath?` (${i.semantic.tsconfigPath})`:"";console.log(`TS sem: ${o}${s}`),i.semantic.reason&&console.log(`TS note: ${i.semantic.reason}`)}console.log(`Exists: ${Ym(r)?"yes":"no"}`),Ym(r)&&nt(o=>{let s=Ee(o);if(console.log(`Symbols: ${s.symbols}`),console.log(`Files: ${s.documents}`),console.log(`Size: ${Nn(s.indexSizeBytes)}`),s.lastBuilt){let a=Math.round((Date.now()-s.lastBuilt.getTime())/1e3);console.log(`Built: ${a}s ago`)}})}import{execFileSync as da,spawnSync as fd}from"child_process";import{existsSync as ot,mkdtempSync as NN,readFileSync as _N,readdirSync as LN,rmSync as wN,symlinkSync as EN,writeFileSync as kN}from"fs";import{tmpdir as PN}from"os";import{join as $e}from"path";var FN=3e5,TN=12;function gd(e,t,n={}){let r=MN(e);if(r.length===0)return{checkers:[],uncoveredFiles:[],baselineErrors:0,dirtyOverlap:[],batches:[]};let i=AN(t,r),o=n.timeoutMs??FN,s=jN(e,t),a=NN($e(PN(),"scip-cleanup-verify-")),c=[],l=new Set;try{da("git",["-C",e,"worktree","add","--detach","--force",a,"HEAD"],{stdio:"ignore"}),BN(e,a);for(let u of r)for(let m of pd(u,a,o).errorKeys)l.add(m);for(let u of t.batches){HN(a,u);let m=[];for(let d of r){let p=pd(d,a,o);m.push(...p.rawErrors.filter(h=>!l.has(hd(h))))}if(m.length===0)c.push({depth:u.depth,status:"verified"});else{c.push({depth:u.depth,status:"failed",errors:m.slice(0,TN)});break}}}finally{try{da("git",["-C",e,"worktree","remove","--force",a],{stdio:"ignore"})}catch{wN(a,{recursive:!0,force:!0})}}return{checkers:r.map(u=>u.label),uncoveredFiles:i,baselineErrors:l.size,dirtyOverlap:s,batches:c}}function AN(e,t){let n=new Set(t.flatMap(i=>i.coversExtensions));return[...new Set(e.batches.flatMap(i=>i.entries.map(o=>o.file)))].filter(i=>{let o=i.slice(i.lastIndexOf("."));return!n.has(o)}).sort()}function hd(e){return e.replace(/\(\d+,\d+\)|:\d+(?::\d+)?/g,"").trim()}var md=[".ts",".tsx",".mts",".cts",".js",".jsx",".vue"];function MN(e){let t=[];if(ot($e(e,"tsconfig.json"))){let n=$e(e,"node_modules",".bin","tsc");t.push(ot(n)?{label:"tsc --noEmit",binary:n,args:["--noEmit"],coversExtensions:md}:{label:"npx tsc --noEmit",binary:"npx",args:["tsc","--noEmit"],coversExtensions:md})}if(ot($e(e,"go.mod"))&&t.push({label:"go build ./...",binary:"go",args:["build","./..."],coversExtensions:[".go"]}),["pyproject.toml","setup.py","requirements.txt"].some(n=>ot($e(e,n)))){let n=ON();n&&t.push(n)}for(let n of $N(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:$e(e,n,"..","target")}});return t}function ON(){return dd("ruff")?{label:"ruff check --select E9,F821,F822",binary:"ruff",args:["check","--quiet","--select","E9,F821,F822","."],coversExtensions:[".py"]}:dd("python3")?{label:"python3 -m compileall (syntax only)",binary:"python3",args:["-m","compileall","-q","."],coversExtensions:[".py"]}:null}function dd(e){try{return fd(e,["--version"],{stdio:"ignore",timeout:1e4}).status===0}catch{return!1}}function $N(e){let t=[];if(ot($e(e,"Cargo.toml")))return t.push("Cargo.toml"),t;let n;try{n=LN(e)}catch{return t}for(let r of n)r==="node_modules"||r.startsWith(".")||ot($e(e,r,"Cargo.toml"))&&t.push(`${r}/Cargo.toml`);return t}function jN(e,t){let n;try{n=da("git",["-C",e,"status","--porcelain"],{encoding:"utf-8"})}catch{return[]}let r=new Set(n.split(`
|
|
831
|
+
`).map(o=>o.slice(3).trim()).filter(o=>o!==""));return[...new Set(t.batches.flatMap(o=>o.entries.map(s=>s.file)))].filter(o=>r.has(o)).sort()}function BN(e,t){for(let n of["node_modules"]){let r=$e(e,n),i=$e(t,n);if(ot(r)&&!ot(i))try{EN(r,i,"junction")}catch{}}}function HN(e,t){let n=new Map;for(let r of t.entries){let i=n.get(r.file)??[];i.push({start:r.startLine,end:r.endLine}),n.set(r.file,i)}for(let[r,i]of n){let o=$e(e,r);ot(o)&&kN(o,qN(_N(o,"utf-8"),i,{rust:r.endsWith(".rs")}))}}function qN(e,t,n={}){let r=e.split(`
|
|
832
|
+
`),i=(n.rust===!0?VN(e):Lt(e)).split(`
|
|
833
|
+
`),o=new Set;for(let s of t){let a=WN(r,s.start),c=GN(i,a,Math.min(s.end,r.length-1));for(let l=a;l<=c&&l<r.length;l++)o.add(l)}return r.filter((s,a)=>!o.has(a)).join(`
|
|
834
|
+
`)}function VN(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 WN(e,t){let n=t;for(;n>0;){let r=(e[n-1]??"").trim();if(/^(?:\/\/\/|\/\/!|#\[|#!\[|\/\*\*|\*|\*\/|@\w)/.test(r))n-=1;else break}return n}var UN=200;function GN(e,t,n){let r=0;for(let i=t;i<e.length;i++){for(let o of e[i]??"")o==="("||o==="["||o==="{"?r+=1:(o===")"||o==="]"||o==="}")&&(r-=1);if(i>=n&&r<=0)return i;if(i-n>UN)break}return n}function pd(e,t,n){let r=fd(e.binary,e.args,{cwd:t,encoding:"utf-8",timeout:n,env:e.env??process.env,maxBuffer:33554432});if(r.status===0)return{ok:!0,rawErrors:[],errorKeys:new Set};let o=`${r.stdout??""}
|
|
800
835
|
${r.stderr??""}`.split(`
|
|
801
|
-
`).map(s=>s.trim()).filter(s=>/\berror\b/i.test(s));return r.error&&o.length===0&&o.push(String(r.error)),{ok:!1,rawErrors:o,errorKeys:new Set(o.map(
|
|
802
|
-
Safe to delete.`,d),m.length>0&&(u.length>0&&console.log(""),
|
|
836
|
+
`).map(s=>s.trim()).filter(s=>/\berror\b/i.test(s));return r.error&&o.length===0&&o.push(String(r.error)),{ok:!1,rawErrors:o,errorKeys:new Set(o.map(hd))}}function Je({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i,...o}){return{...o,renderShape:"list",handler:Um({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i})}}function Mi({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i,headers:o,dashWidths:s,...a}){return{...a,renderShape:"table",handler:Gm({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i,headers:o,dashWidths:s})}}function yd({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i,key:o,...s}){return{...s,renderShape:"grouped-by-file",handler:Jm({query:e,format:t,emptyMessage:n,heuristicLabel:r,after:i,key:o})}}function bd({query:e,emptyMessage:t,heuristicLabel:n,sections:r,before:i,after:o,...s}){return{...s,renderShape:"sectioned-report",handler:zm({query:e,emptyMessage:t,heuristicLabel:n,before:i,sections:r,after:o})}}function Oi({query:e,emptyMessage:t,heuristicLabel:n,sections:r,before:i,after:o,...s}){return{...s,budget:s.budget??"semantic",renderShape:"sectioned-report",handler:Km(s.id,{query:e,emptyMessage:t,heuristicLabel:n,before:i,sections:r,after:o})}}var JN=ee("dead",({db:e,args:t,opts:n,budget:r})=>{let i={scope:Ue(t,0)||void 0,minLoc:C(n,"minLoc",1),includeTests:j(n,"includeTests"),skipBarrels:j(n,"skipBarrels"),includeMembers:j(n,"includeMembers"),scanLimit:r.scanLimit,semantic:r.semantic},o=Xe(e,i),s=o.symbols.filter(f=>f.kind==="dead-code"),a=o.symbols.filter(f=>f.kind!=="dead-code"),c=!j(n,"onlyInternal"),l=!j(n,"onlyDead"),u=c?s:[],m=l?a:[];if(u.length===0&&m.length===0){L.empty("No matching dead-code symbols found.");return}let d=u.reduce((f,y)=>f+y.loc,0),p=m.reduce((f,y)=>f+y.loc,0);u.length>0&&Sd(u,"DEAD CODE",` Zero references anywhere \u2014 no cross-file callers AND no same-file uses.
|
|
837
|
+
Safe to delete.`,d),m.length>0&&(u.length>0&&console.log(""),Sd(m,"FILE-INTERNAL ONLY",` Used only within the same file (no cross-file callers). Could be a
|
|
803
838
|
single-use helper, an abstraction-in-progress, or a callback registered
|
|
804
839
|
through a framework path that static analysis cannot trace (signal
|
|
805
840
|
handlers, event listeners, dependency injection). NOT necessarily dead \u2014
|
|
806
841
|
review case by case.`,p));let h=[];c&&h.push(`${u.length} dead code (${d} LOC)`),l&&h.push(`${m.length} file-internal (${p} LOC)`),console.log(`
|
|
807
|
-
\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: ${u.length+m.length} symbols \u2014 ${h.join(" + ")}`)});function
|
|
808
|
-
${e.length} unused import(s)`)}),
|
|
809
|
-
${e.length} isolated symbol(s)`)}),
|
|
810
|
-
${
|
|
811
|
-
${r.length} extraction candidate(s) found.`)}),
|
|
842
|
+
\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: ${u.length+m.length} symbols \u2014 ${h.join(" + ")}`)});function Sd(e,t,n,r){console.log(`\u2550\u2550\u2550 ${t} (${e.length}, ${r} LOC) \u2550\u2550\u2550`),console.log(n),console.log("");let i=new Map;for(let a of e){let c=i.get(a.relativePath)??[];c.push(a),i.set(a.relativePath,c)}let o=[...i.entries()].map(([a,c])=>({file:a,bucket:c,totalLoc:c.reduce((l,u)=>l+u.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,u)=>l.startLine-u.startLine);for(let l of c)console.log(` ${de(l.startLine,l.endLine)} (${l.loc} LOC) ${l.shortName}`)}}var zN=it("unused-imports",{query:({db:e,args:t,budget:n})=>Mo(e,O(t,0),{semantic:n.semantic}),format:e=>` ${e.shortName} in ${e.importedIn}`,emptyMessage:()=>"No unused imports found.",after:e=>console.log(`
|
|
843
|
+
${e.length} unused import(s)`)}),KN=Ai("isolated",{query:({db:e,opts:t,budget:n})=>Ot(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",3),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${de(e.startLine,e.endLine)} (${e.loc} LOC) ${e.shortName}`,emptyMessage:()=>"No isolated symbols found.",after:e=>console.log(`
|
|
844
|
+
${e.length} isolated symbol(s)`)}),QN=ee("extract-candidates",({db:e,opts:t,budget:n})=>{let r=$t(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",10),minCallees:C(t,"minCallees",6),limit:C(t,"limit",20),scanLimit:n.scanLimit,semantic:n.semantic});if(r.length===0)return L.empty("No extraction candidates found.");pr("extraction candidates");for(let i of r){console.log(`
|
|
845
|
+
${ce(i.relativePath,i.startLine,i.endLine)} ${i.shortName} (${i.loc} LOC, ${i.totalCallees} callees)`);for(let o=0;o<i.clusters.length;o++){let s=i.clusters[o];console.log(` Cluster ${o+1} (${Math.round(s.isolation*100)}% isolated, ${s.callees.length} callees):`);for(let a of s.callees)console.log(` ${a}`)}}console.log(`
|
|
846
|
+
${r.length} extraction candidate(s) found.`)}),YN=it("wrapper-candidates",{query:({db:e,opts:t,budget:n})=>Ut(e,{scope:k(t,"scope"),maxLoc:C(t,"maxLoc",15),limit:C(t,"limit",30),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${ce(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.loc} LOC)
|
|
812
847
|
Only called by: ${e.singleCallerShort} (fan-in: ${e.callerFanIn})`,emptyMessage:()=>"No wrapper candidates found.",heuristicLabel:"wrapper candidates",after:e=>console.log(`
|
|
813
|
-
${e.length} wrapper candidate(s).`)}),
|
|
848
|
+
${e.length} wrapper candidate(s).`)}),XN=it("passthrough-candidates",{query:({db:e,opts:t,budget:n})=>Vt(e,{scope:k(t,"scope"),maxLoc:C(t,"maxLoc",15),limit:C(t,"limit",30),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${ce(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.loc} LOC)
|
|
814
849
|
Forwards to: ${e.forwardsToShort} (${e.forwardsToFile})`,emptyMessage:()=>"No passthrough candidates found.",heuristicLabel:"passthrough candidates",after:e=>console.log(`
|
|
815
|
-
${e.length} passthrough candidate(s).`)}),
|
|
850
|
+
${e.length} passthrough candidate(s).`)}),ZN=it("stale-abstractions",{query:({db:e,opts:t,budget:n})=>Wt(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",3),limit:C(t,"limit",30),includeLowConfidence:j(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}] ${ce(e.file,e.startLine,e.endLine)} ${e.shortName} (${e.kind}, ${e.loc} LOC, ${t}${n})
|
|
816
851
|
${e.reason}`},emptyMessage:()=>"No stale abstractions found.",heuristicLabel:"stale abstraction candidates",after:e=>console.log(`
|
|
817
|
-
${e.length} stale abstraction(s).`)}),
|
|
852
|
+
${e.length} stale abstraction(s).`)}),e_=Ti("complexity-hotspots",{headers:["score"," LOC","fan-in","fan-out","callees","symbol"],query:({db:e,opts:t,budget:n})=>mr(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",10),limit:C(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]}),t_=yr("similar",{query:({db:e,args:t,opts:n,budget:r})=>{let i=Ue(t,0);return i?{mode:"target",rows:Zn(e,i,{minSimilarity:C(n,"minSimilarity",.4),limit:C(n,"limit",20),scanLimit:r.scanLimit,semantic:r.semantic})}:{mode:"all",rows:Ze(e,{minSimilarity:C(n,"minSimilarity",.4),limit:C(n,"limit",20),scope:k(n,"scope"),minCallees:C(n,"minCallees",4),crossFileOnly:j(n,"crossFileOnly"),scanLimit:r.scanLimit,semantic:r.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"){L.list(e.rows,t=>{let n=t.similarityBasis??"callees",r=n==="source-tokens"?"Shared source tokens":"Shared callees",i=n==="source-tokens"?"Only tokens in":"Only in",o=[`
|
|
818
853
|
${Math.round(t.similarity*100)}% similar:`,` A: ${t.shortNameA} (${t.fileA})`,` B: ${t.shortNameB} (${t.fileB})`,` ${r}: ${t.sharedCallees.join(", ")}`];return t.uniqueToA.length&&o.push(` ${i} A: ${t.uniqueToA.join(", ")}`),t.uniqueToB.length&&o.push(` ${i} B: ${t.uniqueToB.join(", ")}`),o.join(`
|
|
819
|
-
`)});return}
|
|
854
|
+
`)});return}L.list(e.rows,t=>`
|
|
820
855
|
${Math.round(t.similarity*100)}% similar:
|
|
821
856
|
A: ${t.shortNameA} (${t.fileA})
|
|
822
857
|
B: ${t.shortNameB} (${t.fileB})
|
|
823
858
|
Shared ${t.similarityBasis==="source-tokens"?"source tokens":"callees"}: ${t.sharedCallees.join(", ")}`),console.log(`
|
|
824
|
-
${e.rows.length} similar pair(s) found.`)}}),
|
|
859
|
+
${e.rows.length} similar pair(s) found.`)}}),n_=Yt({query:({db:e,args:t,opts:n})=>Zo(e,{minSimilarity:C(n,"minSimilarity",.5),limit:C(n,"limit",20),scope:k(n,"scope"),minDeps:we(n,"minDeps"),filePattern:Ue(t,0)}),emptyMessage:e=>e.length===0?"No similar file pairs found.":void 0,heuristicLabel:"similar file candidates",render:e=>{L.list(e,t=>{let n=[`
|
|
825
860
|
${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(`
|
|
826
861
|
`)}),console.log(`
|
|
827
|
-
${e.length} similar pair(s) found.`)}}),
|
|
862
|
+
${e.length} similar pair(s) found.`)}}),r_=Yt({query:({db:e,opts:t})=>es(e,{minSimilarity:C(t,"minSimilarity",.5),limit:C(t,"limit",15),scope:k(t,"scope"),minChainLength:C(t,"minLength",3),maxChainLength:C(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(`
|
|
828
863
|
\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 r of n.divergencePoints)console.log(` [${r.index}] ${r.nodeA} \u2194 ${r.nodeB}`)}console.log(`
|
|
829
|
-
${e.length} similar chain pair(s) found.`)}}),
|
|
864
|
+
${e.length} similar chain pair(s) found.`)}}),i_=yr("drift",{query:({db:e,args:t,opts:n,budget:r})=>qt(e,{scope:Ue(t,0),minDeviation:C(n,"minDeviation",5),semantic:r.semantic}),emptyMessage:e=>e.results.length===0?"No drift detected.":void 0,heuristicLabel:"drift candidates",render:e=>{console.log(""),L.groupedByFile(e.results,t=>{let r=` [${t.kind==="unused-import"?"UNUSED":t.kind==="layer-violation"?"LAYER":"UNIQUE"}] ${t.description}`;return t.detail?`${r}
|
|
830
865
|
${t.detail}`:r},t=>t.file),console.log(`
|
|
831
|
-
${e.unusedImports} unused import(s), ${e.layerViolations} layer violation(s), ${e.patternDeviations} pattern deviation(s)`)}}),
|
|
866
|
+
${e.unusedImports} unused import(s), ${e.layerViolations} layer violation(s), ${e.patternDeviations} pattern deviation(s)`)}}),o_=yr("convergence",{query:({db:e,args:t,budget:n})=>Rs(e,O(t,0),O(t,1),{semantic:n.semantic}),emptyMessage:e=>e?void 0:"One or both symbols not found.",render:e=>{if(e){console.log(`
|
|
832
867
|
${Math.round(e.similarity*100)}% callee overlap
|
|
833
868
|
`),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)
|
|
834
869
|
`),console.log(` Shared callees (${e.sharedCallees.length}):`);for(let t of e.sharedCallees)console.log(` ${t}`);if(e.uniqueToA.length>0){console.log(`
|
|
835
870
|
Unique to A (${e.uniqueToA.length}):`);for(let t of e.uniqueToA)console.log(` ${t}`)}if(e.uniqueToB.length>0){console.log(`
|
|
836
871
|
Unique to B (${e.uniqueToB.length}):`);for(let t of e.uniqueToB)console.log(` ${t}`)}console.log(`
|
|
837
|
-
Strategy: ${e.consolidationStrategy}`)}}}),
|
|
838
|
-
Signature: ${e.signature} (${e.functions.length} functions)`,n=e.functions.map(r=>` ${
|
|
872
|
+
Strategy: ${e.consolidationStrategy}`)}}}),s_=it("similar-signatures",{query:({db:e,opts:t,budget:n})=>_s(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",3),limit:C(t,"limit",20),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>{let t=`
|
|
873
|
+
Signature: ${e.signature} (${e.functions.length} functions)`,n=e.functions.map(r=>` ${ce(r.file,r.startLine,r.endLine)} ${r.shortName} (${r.loc} LOC)`).join(`
|
|
839
874
|
`);return`${t}
|
|
840
875
|
${n}`},emptyMessage:()=>"No same-shape function groups found.",after:e=>console.log(`
|
|
841
|
-
${e.length} group(s) found.`)});function
|
|
876
|
+
${e.length} group(s) found.`)});function ze(e){return{docs:v("Cleanup"),...e}}function st({heuristicLabel:e,...t}){return ze({...t,heuristic:{label:e}})}var a_=ee("cleanup-plan",({db:e,opts:t,budget:n})=>{let r=ns(e,{scope:k(t,"scope"),minLoc:C(t,"minLoc",1),maxDepth:C(t,"maxDepth",5),scanLimit:n.scanLimit});if(r.batches.length===0)return L.empty("Nothing deletable found \u2014 no graph-fact dead code to seed a cascade.");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.
|
|
842
877
|
`);for(let i of r.batches){let o=i.depth===0?`\u2500\u2500 Batch 0: deletable now (graph-fact, ${i.loc} LOC) \u2500\u2500`:`\u2500\u2500 Batch ${i.depth}: dead once batch ${i.depth-1} lands (cascade, ${i.loc} LOC) \u2500\u2500`;console.log(o);for(let s of i.entries)console.log(` ${s.file}:${s.startLine+1}-${s.endLine+1} ${s.shortName} (${s.loc} LOC)`);i.filesEmptied.length>0&&console.log(` -> empties: ${i.filesEmptied.join(", ")}`),console.log("")}if(r.blocked.length>0){console.log("Cascade blocked (references outside the removal set):");for(let i of r.blocked)console.log(` ${i.shortName} (${i.file}) blocked by ${i.blockingFiles.join(", ")}`)}if(j(t,"verify")){console.log(`
|
|
843
|
-
Verifying batches against the project checker (throwaway worktree at HEAD)...`);let i=
|
|
878
|
+
Verifying batches against the project checker (throwaway worktree at HEAD)...`);let i=gd(Oe(),r);if(i.checkers.length===0){console.log(" No checker detected (need tsconfig.json or a Cargo.toml) \u2014 skipped.");return}for(let o of i.checkers)console.log(` Checker: ${o}`);i.uncoveredFiles.length>0&&console.log(` WARNING: no checker covers these plan files (entries there are NOT verified): ${i.uncoveredFiles.join(", ")}`),i.baselineErrors>0&&console.log(` Baseline has ${i.baselineErrors} pre-existing error(s) \u2014 verifying differentially (no NEW errors).`),i.dirtyOverlap.length>0&&console.log(` WARNING: plan files dirty in working tree (verification runs at HEAD): ${i.dirtyOverlap.join(", ")}`);for(let o of i.batches)if(o.status==="verified")console.log(` Batch ${o.depth}: COMPILER-VERIFIED`);else{console.log(` Batch ${o.depth}: FAILED \u2014 the errors below name references the static evidence missed:`);for(let s of o.errors??[])console.log(` ${s}`)}}}),c_=ee("recent-duplicates",({db:e,opts:t,budget:n})=>{let r=hs(e,{windowCommits:C(t,"window",100),minSimilarity:we(t,"minSimilarity")??.7,limit:C(t,"limit",30),scope:k(t,"scope"),scanLimit:n.scanLimit,semantic:n.semantic});if(!r.available)return L.empty("No git history available (not a repository, or git missing).");if(r.findings.length===0)return L.empty(`No recent re-implementations found (window: last ${r.windowCommits} commits).`);console.log(`Recent re-implementations (window: last ${r.windowCommits} commits):
|
|
844
879
|
`);for(let i of r.findings)i.kind==="echo"?(console.log(` ${Math.round(i.similarity*100)}% ECHO ${i.echoFile} ${i.echoSymbol} (added ${i.echoAgeCommits} commits ago)`),console.log(` duplicates established ${i.establishedFile} ${i.establishedSymbol}`)):(console.log(` ${Math.round(i.similarity*100)}% TWIN ${i.echoFile} ${i.echoSymbol}`),console.log(` and ${i.establishedFile} ${i.establishedSymbol} (both new \u2014 consolidate before they diverge)`));console.log(`
|
|
845
|
-
${r.findings.length} finding(s). ECHO: prefer extending the established side and deleting the echo.`)}),
|
|
880
|
+
${r.findings.length} finding(s). ECHO: prefer extending the established side and deleting the echo.`)}),l_=V(({db:e,args:t,opts:n})=>{let r=us(e,{doc:t[0]===void 0?void 0:O(t,0),limit:C(n,"limit",20),minCoupling:C(n,"minCoupling",3)});if(!r.available)return L.empty("No git history available (not a repository, or git missing).");if(r.findings.length===0)return L.empty(`No drifting docs found across ${r.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 (${r.docsScanned} docs scanned, ${r.commitsAnalyzed} commits analyzed):
|
|
846
881
|
`);for(let i of r.findings){console.log(` staleness ${i.staleness} ${i.doc}`);for(let o of i.brokenReferences.slice(0,4))console.log(` BROKEN REFERENCE: cites ${o} \u2014 that file no longer exists`);for(let o of i.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})`)}}console.log(`
|
|
847
|
-
Stale standards docs are worse than none \u2014 agents implement to a dead spec.`)}),
|
|
882
|
+
Stale standards docs are worse than none \u2014 agents implement to a dead spec.`)}),u_=it("unused-params",{query:({db:e,opts:t,budget:n})=>cr(e,{scope:k(t,"scope"),limit:C(t,"limit",30),scanLimit:n.scanLimit}),format:e=>` ${ce(e.file,e.startLine,e.endLine)} ${e.shortName}
|
|
848
883
|
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(`
|
|
849
|
-
${e.length} function(s) with trailing unused parameters.`)}),
|
|
884
|
+
${e.length} function(s) with trailing unused parameters.`)}),xd=[ze({id:"unused-params",command:"unused-params",description:"Speculative-generality candidates: trailing parameters no body ever uses (TS/JS)",options:[g("-s, --scope <path>","Limit to files matching path"),g("-n, --limit <n>","Maximum findings",I,30),g("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",heuristic:{label:"unused trailing parameter candidates"},renderShape:"list",docs:v("Cleanup",["scip-query unused-params -s src/services"]),handler:u_}),ze({id:"cleanup-plan",command:"cleanup-plan",description:"Ordered, batched deletion plan: graph-fact dead code plus the cascade candidates it unlocks",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Only include symbols >= N lines",I,1),g("--max-depth <n>","Maximum cascade depth",I,5),g("--verify","Apply batches in a throwaway worktree and run the project checker (tsc / cargo check)"),g("--full","Run unbounded analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:v("Cleanup",["scip-query cleanup-plan --min-loc 3","scip-query cleanup-plan --verify"]),handler:a_}),ze({id:"recent-duplicates",command:"recent-duplicates",description:"Directional duplicate candidates: recent code that re-implements established code",options:[g("--window <n>",'How many commits back counts as "recent"',I,100),g("--min-similarity <n>","Minimum similarity (0-1)",Jt,.7),g("-n, --limit <n>","Maximum findings",I,30),g("-s, --scope <path>","Limit to files matching path"),g("--full","Run unbounded semantic analysis on large indexes")],budget:"candidate-scan",heuristic:{label:"recent re-implementation candidates"},renderShape:"custom",docs:v("Cleanup",["scip-query recent-duplicates --window 50"]),handler:c_}),ze({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:[g("-n, --limit <n>","Maximum docs to report",I,20),g("--min-coupling <n>","Minimum historical co-changes to track a subject",I,3)],heuristic:{label:"doc drift candidates"},renderShape:"custom",docs:v("Cleanup",["scip-query doc-drift","scip-query doc-drift AGENTS.md"]),handler:l_}),ze({id:"dead",command:"dead [scope]",description:"Find dead code and file-internal symbols (no cross-file consumers)",options:[g("--min-loc <n>","Only show symbols >= N lines",I,1),g("--include-tests","Include test files"),g("--skip-barrels","Ignore refs from barrel re-export files"),g("--include-members","Include class members"),g("--only-dead","Show only [dead code] symbols (skip [file-internal only])"),g("--only-internal","Show only [file-internal only] symbols (skip [dead code])"),g("--full","Run unbounded semantic analysis on large indexes")],budget:"candidate-scan",renderShape:"custom",docs:v("Cleanup",["scip-query dead --min-loc 10"]),handler:JN}),ze({id:"unused-imports",command:"unused-imports <file>",description:"Find imports not referenced in the same file",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"list",handler:zN}),ze({id:"isolated",command:"isolated",description:"Find completely orphaned symbols (no references at all)",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Minimum lines of code",I,3),g("--full","Run unbounded semantic analysis on large indexes")],budget:"candidate-scan",renderShape:"grouped-by-file",handler:KN}),st({id:"similar",command:"similar [symbol]",description:"Find heuristic function similarity candidates from callee fingerprints",options:[g("--min-similarity <n>","Minimum Jaccard similarity (0-1)",Jt,.4),g("-n, --limit <n>","Number of results",I,20),g("-s, --scope <path>","Limit to files matching path"),g("--min-callees <n>","Minimum callees to consider",I,4),g("--cross-file-only","Only show cross-file pairs (skip same-file matches)"),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"similarity candidates",budget:"candidate-scan",renderShape:"custom",handler:t_}),st({id:"similar-files",command:"similar-files [file]",description:"Find heuristic similar-file candidates from dependency profiles",options:[g("--min-similarity <n>","Minimum Jaccard similarity (0-1)",Jt,.5),g("-n, --limit <n>","Number of results",I,20),g("-s, --scope <path>","Limit to files matching path"),g("--min-deps <n>","Minimum dependencies to consider",I)],heuristicLabel:"similar file candidates",renderShape:"custom",handler:n_}),st({id:"similar-chains",command:"similar-chains",description:"Find heuristic similar-chain candidates from dependency flows",options:[g("--min-similarity <n>","Minimum chain similarity (0-1)",Jt,.5),g("-n, --limit <n>","Number of results",I,15),g("-s, --scope <path>","Limit to files matching path"),g("--min-length <n>","Minimum chain length",I,3),g("--max-length <n>","Maximum chain length",I,8)],heuristicLabel:"similar chain candidates",renderShape:"custom",handler:r_}),st({id:"extract-candidates",command:"extract-candidates",description:"Find heuristic extraction candidates from isolated callee clusters",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Minimum function LOC",I,10),g("--min-callees <n>","Minimum callees to analyze",I,6),g("-n, --limit <n>","Number of results",I,20),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"extraction candidates",budget:"candidate-scan",renderShape:"custom",handler:QN}),st({id:"drift",command:"drift [module]",description:"Detect heuristic drift candidates: unused imports, layer violations, and pattern deviations",options:[g("--min-deviation <n>","Minimum sibling files before reporting unique dependency deviations",Ri,5),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"drift candidates",budget:"semantic",renderShape:"grouped-by-file",handler:i_}),st({id:"wrapper-candidates",command:"wrapper-candidates",description:"Find heuristic wrapper candidates only called by one consumer",options:[g("-s, --scope <path>","Limit to files matching path"),g("--max-loc <n>","Maximum LOC for candidates",I,15),g("-n, --limit <n>","Number of results",I,30),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"wrapper candidates",budget:"candidate-scan",renderShape:"list",handler:YN}),st({id:"passthrough-candidates",command:"passthrough-candidates",description:"Find heuristic passthrough candidates that forward to one callee",options:[g("-s, --scope <path>","Limit to files matching path"),g("--max-loc <n>","Maximum LOC for candidates",I,15),g("-n, --limit <n>","Number of results",I,30),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"passthrough candidates",budget:"candidate-scan",renderShape:"list",handler:XN}),st({id:"stale-abstractions",command:"stale-abstractions",description:"Find heuristic stale abstraction candidates with 0-1 consumers",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Minimum LOC",I,3),g("-n, --limit <n>","Number of results",I,30),g("--include-low-confidence","Include 1-consumer classes (usually encapsulation, not stale)",void 0,!1),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"stale abstraction candidates",budget:"candidate-scan",renderShape:"list",handler:ZN}),st({id:"complexity-hotspots",command:"complexity-hotspots",description:"Find heuristic complexity hotspot candidates from LOC x fan-in x fan-out",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Minimum LOC",I,10),g("-n, --limit <n>","Number of results",I,20),g("--full","Run unbounded semantic analysis on large indexes")],heuristicLabel:"complexity hotspot candidates",budget:"candidate-scan",renderShape:"table",handler:e_}),ze({id:"convergence",command:"convergence <symbol1> <symbol2>",description:"Show what a consolidated version of two similar functions would look like",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"custom",handler:o_}),yd({id:"redundant-reexports",command:"redundant-reexports",description:"Find barrel re-exports that nobody imports through",options:[g("-s, --scope <path>","Limit to files matching path"),g("-n, --limit <n>","Number of results",I,30)],docs:v("Cleanup"),query:({db:e,opts:t})=>vs(e,{scope:k(t,"scope"),limit:C(t,"limit",30)}),format:e=>` ${e.shortName} (from ${e.originalFile})
|
|
850
885
|
barrel: ${e.barrelConsumers} consumer(s) | direct: ${e.directConsumers} consumer(s)`,key:e=>e.barrelFile,emptyMessage:()=>"No redundant re-exports found.",after:e=>console.log(`
|
|
851
|
-
${e.length} redundant re-export(s).`)}),
|
|
886
|
+
${e.length} redundant re-export(s).`)}),ze({id:"similar-signatures",command:"similar-signatures",description:"Find functions with near-identical type signatures (same shape)",options:[g("-s, --scope <path>","Limit to files matching path"),g("--min-loc <n>","Minimum LOC per function",I,3),g("-n, --limit <n>","Number of groups",I,20),g("--full","Run unbounded semantic analysis on large indexes")],budget:"candidate-scan",renderShape:"list",handler:s_})];var m_=V(({db:e})=>{let t=Ee(e);console.log(`Documents: ${t.documents}`),console.log(`Symbols: ${t.symbols}`),console.log(`Definitions: ${t.definitions}`),console.log(`References: ${t.references}`),console.log(`Index size: ${Nn(t.indexSizeBytes)}`),t.lastBuilt&&console.log(`Last built: ${t.lastBuilt.toISOString().replace("T"," ").slice(0,19)}`)}),Cd=[{id:"stats",command:"stats",description:"Show index statistics",renderShape:"custom",docs:v("Core"),handler:m_}];var d_=Ti("bottlenecks",{headers:["score","fan-in","fan-out","symbol"],query:({db:e,opts:t,budget:n})=>Uo(e,{limit:C(t,"limit",20),scope:k(t,"scope"),minFanIn:C(t,"minFanIn",2),minFanOut:C(t,"minFanOut",2),scanLimit:n.scanLimit,semantic:n.semantic}),format:e=>` ${String(e.score).padStart(5)} ${String(e.fanIn).padStart(6)} ${String(e.fanOut).padStart(7)} ${e.shortName}`,emptyMessage:()=>"No bottlenecks found."}),p_=V(({db:e,args:t,opts:n})=>{let r=Ue(t,0);if(r){let i=jo(e,r);if(i.length===0)return L.empty(`No fan-in for ${r}.`);L.list(i,o=>` ${String(o.count).padStart(4)} files ${o.name}`);return}L.table(["files","symbol"],Ho(e,{limit:C(n,"limit",30),scope:k(n,"scope")}).map(i=>` ${String(i.count).padStart(5)} ${i.name}`))}),f_=V(({db:e,args:t,opts:n})=>{let r=Ue(t,0);if(r){let i=Bo(e,r);if(i.length===0)return L.empty(`No fan-out for ${r}.`);L.list(i,o=>` ${String(o.count).padStart(4)} symbols ${o.name}`);return}L.table(["symbols","file"],qo(e,{limit:C(n,"limit",30),scope:k(n,"scope")}).map(i=>` ${String(i.count).padStart(7)} ${i.name}`))}),g_=V(({db:e,args:t,opts:n})=>{let r=Ue(t,0),i=Ue(t,1);if(r&&i){let o=Vo(e,r,i);console.log(`${o.file1} \u2194 ${o.file2}: ${o.sharedSymbols} shared symbols`);return}L.table(["shared","file1 \u2192 file2"],Wo(e,{limit:C(n,"limit",20),scope:k(n,"scope")}).map(o=>` ${String(o.sharedSymbols).padStart(6)} ${o.file1} \u2192 ${o.file2}`))}),h_=Yt({query:({db:e,opts:t})=>Mt(e,{scope:k(t,"scope"),maxDepth:C(t,"maxDepth",10)}),emptyMessage:e=>e.length===0?"No circular dependencies found.":void 0,render:e=>{let t=e.filter(r=>r.kind==="real"),n=e.filter(r=>r.kind==="module-hierarchy");for(let r=0;r<t.length;r++){console.log(`
|
|
852
887
|
Cycle ${r+1} (${t[r].path.length-1} files):`);for(let i=0;i<t[r].path.length;i++){let o=i<t[r].path.length-1?" \u2192":" (cycle)";console.log(` ${t[r].path[i]}${o}`)}}t.length===0?console.log("No real circular dependencies found."):console.log(`
|
|
853
|
-
${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.)`)}}),
|
|
854
|
-
Chain ${t+1} (depth ${e[t].depth}):`);for(let n of e[t].chain)console.log(` \u2192 ${n}`)}}}),
|
|
855
|
-
`)},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
|
|
856
|
-
`),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}`)}),
|
|
888
|
+
${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.)`)}}),y_=Yt({query:({db:e,opts:t})=>Qo(e,{limit:C(t,"limit",10),scope:k(t,"scope"),minDepth:C(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(`
|
|
889
|
+
Chain ${t+1} (depth ${e[t].depth}):`);for(let n of e[t].chain)console.log(` \u2192 ${n}`)}}}),Rd=[Mi({id:"hotspots",command:"hotspots",description:"Most-referenced symbols in the codebase (choke points)",options:[g("-n, --limit <n>","Number of results",I,30),g("-s, --scope <path>","Limit to files matching path")],docs:v("Graph"),headers:["refs","files","symbol"],query:({db:e,opts:t})=>Fo(e,{limit:C(t,"limit",30),scope:k(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:[g("-n, --limit <n>","Number of results for top mode",I,30),g("-s, --scope <path>","Limit to files matching path")],renderShape:"custom",docs:v("Graph"),handler:p_},{id:"fan-out",command:"fan-out [file]",description:"How many external symbols a file uses (or top fan-out across codebase)",options:[g("-n, --limit <n>","Number of results for top mode",I,30),g("-s, --scope <path>","Limit to files matching path")],renderShape:"custom",docs:v("Graph"),handler:f_},{id:"coupling",command:"coupling [file1] [file2]",description:"Coupling between two files, or top coupled pairs in codebase",options:[g("-n, --limit <n>","Number of results for top mode",I,20),g("-s, --scope <path>","Limit to files matching path")],renderShape:"custom",docs:v("Graph"),handler:g_},{id:"cycles",command:"cycles",description:"Detect circular dependency chains between files",options:[g("-s, --scope <path>","Limit to files matching path"),g("--max-depth <n>","Maximum cycle depth",I,10)],renderShape:"custom",docs:v("Graph"),handler:h_},{id:"bottlenecks",command:"bottlenecks",description:"Find coupling hubs: high fan-in AND high fan-out",options:[g("-n, --limit <n>","Number of results",I,20),g("-s, --scope <path>","Limit to files matching path"),g("--min-fan-in <n>","Minimum fan-in",I,2),g("--min-fan-out <n>","Minimum fan-out",I,2),g("--full","Run unbounded semantic analysis on large indexes")],budget:"candidate-scan",renderShape:"table",docs:v("Graph"),handler:d_},{id:"deep-chains",command:"deep-chains",description:"Find the longest transitive dependency chains",options:[g("-n, --limit <n>","Number of chains to show",I,10),g("-s, --scope <path>","Limit to files matching path"),g("--min-depth <n>","Minimum chain depth",I,3)],renderShape:"custom",docs:v("Graph"),handler:y_},Oi({id:"call-graph",command:"call-graph <symbol>",description:"Show incoming callers and outgoing callees for a symbol",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",docs:v("Graph"),query:({db:e,args:t,budget:n})=>Kn(e,String(t[0]),{semantic:n.semantic}),emptyMessage:e=>e?void 0:"Symbol not found.",before:e=>{e&&console.log(`Symbol: ${e.shortName}
|
|
890
|
+
`)},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 b_=ee("complexity",({db:e,args:t,budget:n})=>{let r=lr(e,O(t,0),{semantic:n.semantic});if(!r)return L.empty("Symbol not found.");console.log(`${ce(r.relativePath,r.startLine,r.endLine)} ${r.shortName}
|
|
891
|
+
`),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}`)}),S_=V(({db:e,opts:t})=>{let n=Ns(e,{samples:C(t,"samples",50),scope:k(t,"scope")});if(!n.available)return L.empty("No semantic provider available to audit against (TypeScript projects only).");console.log(`Sampled ${n.sampleSize} symbols; oracle answered ${Math.round(n.oracleCoverage*100)}%.
|
|
857
892
|
`),console.log("Agreement with compiler semantics (file-level):");for(let r of n.scores){let i=r.precision===null?`unverified ${r.unverified} (oracle partial \u2014 no precision claim)`:`precision ${r.precision}`;console.log(` ${r.question.padEnd(11)} ${i} recall ${r.recall} (${r.comparedSymbols} symbols)`)}if(n.topDisagreements.length>0){console.log(`
|
|
858
|
-
Top disagreements (debugging targets):`);for(let r of n.topDisagreements)console.log(` ${r.symbol} [${r.question}]`),r.cheapOnly.length>0&&console.log(` cheap-only: ${r.cheapOnly.join(", ")}`),r.oracleOnly.length>0&&console.log(` oracle-only: ${r.oracleOnly.join(", ")}`)}}),
|
|
893
|
+
Top disagreements (debugging targets):`);for(let r of n.topDisagreements)console.log(` ${r.symbol} [${r.question}]`),r.cheapOnly.length>0&&console.log(` cheap-only: ${r.cheapOnly.join(", ")}`),r.oracleOnly.length>0&&console.log(` oracle-only: ${r.oracleOnly.join(", ")}`)}}),Id=[{id:"self-audit",command:"self-audit",description:"Score the cheap evidence paths against the TypeScript compiler oracle on sampled symbols",options:[g("--samples <n>","Number of symbols to sample",I,50),g("-s, --scope <path>","Limit sampling to files matching path")],renderShape:"custom",docs:v("Health",["scip-query self-audit --samples 100"]),handler:S_},{id:"complexity",command:"complexity <symbol>",description:"Per-symbol complexity: branches, cyclomatic estimate, fan-in/out, callees",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"custom",docs:v("Health"),handler:b_}];var x_=V(({db:e,args:t,opts:n})=>{let r=er(e,O(t,0),{maxDepth:C(n,"maxDepth",5),scope:k(n,"scope")});if(r.length===0)return L.empty("No affected symbols found.");let i=-1;for(let o of r)o.depth!==i&&(console.log(`
|
|
859
894
|
\u2500\u2500 Depth ${o.depth} \u2500\u2500`),i=o.depth),console.log(` ${o.file} ${o.shortName}`);console.log(`
|
|
860
|
-
${r.length} affected symbol(s) across ${new Set(r.map(o=>o.file)).size} files.`)}),
|
|
895
|
+
${r.length} affected symbol(s) across ${new Set(r.map(o=>o.file)).size} files.`)}),C_=V(({db:e,args:t,opts:n})=>{let r=t[0]===void 0?void 0:O(t,0),i=Bt(e,r,{minTogether:C(n,"minTogether",4),limit:C(n,"limit",30),includeLinked:n.all===!0});if(!i.available)return L.empty("No git history available (not a repository, or git missing).");if(i.findings.length===0)return L.empty(r?`No co-change partners found for ${r} in ${i.commitsAnalyzed} commits.`:`No hidden coupling found in ${i.commitsAnalyzed} commits.`);console.log(r?`Co-change partners (${i.commitsAnalyzed} commits analyzed):
|
|
861
896
|
`:`Hidden coupling \u2014 pairs that co-change with no dependency edge (${i.commitsAnalyzed} commits analyzed):
|
|
862
897
|
`);for(let o of i.findings){let s=o.structurallyLinked?" [dep edge]":"";console.log(` ${o.together}x (${Math.round(o.confidence*100)}%) ${o.fileA} <-> ${o.fileB}${s}`)}console.log(`
|
|
863
|
-
${i.findings.length} pair(s). Co-editing one side without the other is how drift starts.`)}),
|
|
864
|
-
`),
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
`)
|
|
898
|
+
${i.findings.length} pair(s). Co-editing one side without the other is how drift starts.`)}),R_=ee("change-surface",({db:e,args:t,budget:n})=>{let r=tr(e,O(t,0),{semantic:n.semantic});if(!r)return L.empty("File not found in index.");console.log(`File: ${r.file}`),console.log(`External consumers: ${r.totalExternalConsumers}
|
|
899
|
+
`),L.list(r.symbols,i=>{let o=i.riskLevel==="high"?" *** HIGH RISK ***":i.riskLevel==="medium"?" * medium risk *":"";return` ${de(i.startLine,i.endLine)} ${i.shortName} [${i.externalConsumers} consumers]${o}`})}),I_=V(({db:e,opts:t})=>{let n=ar(e,{base:k(t,"base"),minContainment:C(t,"minContainment",.7),maxHelpers:we(t,"maxHelpers"),limit:C(t,"limit",20)});if(!n.available)return L.empty("No git history available (not a repository, or git missing).");if(n.changedFiles.length===0)return L.empty(`No changes vs ${n.base}.`);console.log(`Incomplete migrations vs ${n.base}: ${n.changedFiles.length} changed file(s), ${n.helpersChecked} new helper(s) scored.`),n.note&&console.log(` note: ${n.note}`);for(let r of n.skipped)console.log(` skipped ${r.helperShortName} (${r.helperFile}): ${r.reason}`);if(n.findings.length===0){console.log(`
|
|
900
|
+
No incomplete migrations detected.`);return}for(let r of n.findings){console.log(`
|
|
901
|
+
${r.helperShortName} (${r.helperFile})`),console.log(` wired into: ${r.migratedFiles.join(", ")}`);for(let i of r.leftovers)console.log(` un-migrated: ${Math.round(i.containment*100)}% ${i.shortName} (${i.file})`),console.log(` shared: ${i.sharedCallees.join(", ")}`)}console.log(`
|
|
902
|
+
${n.findings.length} helper(s) with un-migrated sites. Finish the extraction or confirm the sites differ on purpose.`)});function v_(e){let t=Array.isArray(e)?e:[],n=t.filter(r=>!pi.includes(r));return n.length>0&&(console.error(`error: unknown --skip check(s): ${n.join(", ")}. Valid checks: ${pi.join(", ")}`),process.exit(1)),t}var D_=V(({db:e,opts:t})=>{let n=t.hook===!0;if(n&&qm(Hm()))return;!n&&As(e)&&va(e)===0&&console.error("Large index with a cold evidence cache: this first run computes semantic callee evidence for every production callable and can take minutes. Re-runs are incremental (evidence.db).");let r=gs(e,{base:k(t,"base"),minTogether:C(t,"minTogether",6),maxEchoChecks:we(t,"maxEchoChecks"),maxHelpers:we(t,"maxHelpers"),skip:v_(t.skip)});if(n){if(r.findings.length===0)return;console.error(Vm(r)),process.exitCode=2;return}if(r.changedFiles.length===0)return L.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(", ")}
|
|
903
|
+
`);for(let i of r.skipped)console.log(` skipped ${i.check}: ${i.reason}`);if(r.findings.length===0){console.log("PASS: this change introduces no gate findings.");return}for(let i of r.findings)console.log(` [${i.check}] ${i.message}`),console.log(` -> ${i.remediation}`);console.log(`
|
|
904
|
+
FAIL: ${r.findings.length} finding(s). Fix or knowingly accept before merging.`),process.exitCode=1}),vd=[{id:"affected",command:"affected <symbol>",description:"Transitive closure of symbols that could break if this symbol changes",options:[g("--max-depth <n>","Maximum traversal depth",I,5),g("-s, --scope <path>","Limit to files matching path")],renderShape:"custom",docs:v("Impact"),handler:x_},{id:"change-surface",command:"change-surface <file>",description:"Pre-change briefing: exports, consumers, and blast-radius risk",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"list",docs:v("Impact"),handler:R_},{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:[g("--base <ref>","Git ref to diff against (default: HEAD)"),g("--min-together <n>","Minimum historical co-changes for the partner check",I,6),g("--max-echo-checks <n>","Maximum changed symbols to test for echoes (default: all)",I),g("--max-helpers <n>","Maximum new helpers to score for incomplete-migration (default: all)",I),g("--skip <check>","Skip a check (repeatable): echo, incomplete-migration, co-change-partner, doc-reference, unused-params, new-dead, baseline",Ci,[]),g("--hook","Agent Stop-hook mode: silent on pass, exit 2 with findings on stderr to block the stop")],heuristic:{label:"diff gate candidates"},renderShape:"custom",docs:v("Impact",["scip-query diff-gate","scip-query diff-gate --base origin/main"]),handler:D_},{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:[g("--base <ref>","Git ref to diff against (default: HEAD)"),g("--min-containment <n>","Minimum share of helper callees a site must contain (0-1)",Jt,.7),g("--max-helpers <n>","Maximum new helpers to score (default: all)",I),g("-n, --limit <n>","Maximum findings to report",I,20)],heuristic:{label:"incomplete migration candidates"},renderShape:"custom",docs:v("Impact",["scip-query incomplete-migration","scip-query incomplete-migration --base origin/main"]),handler:I_},{id:"co-change",command:"co-change [file]",description:"Files that change together in git history without a dependency edge \u2014 hidden coupling candidates",options:[g("--min-together <n>","Minimum commits where both files changed",I,4),g("-n, --limit <n>","Maximum pairs to report",I,30),g("--all","Include pairs that already have a dependency edge")],heuristic:{label:"co-change candidates"},renderShape:"custom",docs:v("Impact",["scip-query co-change","scip-query co-change src/runtime/config.ts"]),handler:C_}];function N_(e){let t=[];for(let i of e.definitions){let o=i.signature?` \u2014 ${i.signature}`:"";t.push(` ${ce(i.relativePath,i.startLine,i.endLine)}${o}`),i.source&&t.push(i.source.split(`
|
|
905
|
+
`).map((s,a)=>` ${xe(i.startLine+a)} ${s}`).join(`
|
|
906
|
+
`))}let n=[],r="";for(let i of e.referencedBy)i.relativePath!==r&&(r&&n.push(""),n.push(` ${i.relativePath}`),r=i.relativePath),n.push(` line ${xe(i.line)} in ${i.enclosingShort}`);return[{title:"DEFINITION",rows:t},{title:"REFERENCED BY",rows:n}]}var __=V(({db:e,args:t,opts:n})=>{let r=O(t,0),i=j(n,"signatures"),o=Oo(e,r);if(o.length===0)return L.empty(`No symbols found for "${r}".`);function s(a,c){for(let l of a){let u=" ".repeat(c),m=i&&l.signature?` - ${L_(l.signature)}`:"";console.log(`${u}${de(l.startLine,l.endLine)} ${l.shortName}${m}`),s(l.children,c+1)}}s(o,0)});function L_(e){return e.length>120?`${e.slice(0,117)}...`:e}var w_=it("imports",{query:({db:e,args:t,budget:n})=>To(e,O(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)."}),E_=Ai("refs",{query:({db:e,args:t,budget:n})=>_o(e,O(t,0),{semantic:n.semantic}),format:e=>` line ${xe(e.line)}`}),k_=V(({db:e,args:t,opts:n})=>{let r=Is(e,O(t,0),{context:C(n,"context",0)});if(!r)return L.empty("Symbol not found or file unreadable.");console.log(`${ce(r.relativePath,r.startLine,r.endLine)} ${r.shortName} [${r.language??"unknown"}]
|
|
869
907
|
`);let i=r.source.split(`
|
|
870
|
-
`);for(let o=0;o<i.length;o++)console.log(` ${String(
|
|
871
|
-
`),r.definitionSites.length>0){console.log(" \u2550\u2550\u2550 DEFINED AT \u2550\u2550\u2550");for(let i of r.definitionSites)console.log(` ${i.file}:${
|
|
872
|
-
\u2550\u2550\u2550 USED AT \u2550\u2550\u2550`);for(let i of r.usageSites)console.log(` ${i.file}:${
|
|
908
|
+
`);for(let o=0;o<i.length;o++)console.log(` ${String(xe(r.startLine+o)).padStart(4)} ${i[o]}`)}),P_=ee("dataflow",({db:e,args:t,budget:n})=>{let r=ur(e,O(t,0),{semantic:n.semantic});if(!r)return L.empty("Symbol not found.");if(console.log(`${r.shortName} (${r.relativePath})
|
|
909
|
+
`),r.definitionSites.length>0){console.log(" \u2550\u2550\u2550 DEFINED AT \u2550\u2550\u2550");for(let i of r.definitionSites)console.log(` ${i.file}:${xe(i.line)}`)}if(r.usageSites.length>0){console.log(`
|
|
910
|
+
\u2550\u2550\u2550 USED AT \u2550\u2550\u2550`);for(let i of r.usageSites)console.log(` ${i.file}:${xe(i.line)} in ${i.enclosingShort}`)}if(r.producers.length>0){console.log(`
|
|
873
911
|
\u2550\u2550\u2550 PRODUCERS (feeds into this) \u2550\u2550\u2550`);for(let i of r.producers)console.log(` ${i.file} ${i.shortName}`)}if(r.consumers.length>0){console.log(`
|
|
874
|
-
\u2550\u2550\u2550 CONSUMERS (this feeds into) \u2550\u2550\u2550`);for(let i of r.consumers)console.log(` ${i.file} ${i.shortName}`)}}),
|
|
875
|
-
`),o.connectedSymbols.length===0){console.log(" No connected symbols found.");return}
|
|
912
|
+
\u2550\u2550\u2550 CONSUMERS (this feeds into) \u2550\u2550\u2550`);for(let i of r.consumers)console.log(` ${i.file} ${i.shortName}`)}}),F_=ee("slice",({db:e,args:t,opts:n,budget:r})=>{let i=j(n,"forward")?"forward":"backward",o=Cn(e,O(t,0),{direction:i,maxDepth:C(n,"depth",3),semantic:r.semantic});if(!o)return L.empty("Symbol not found.");if(console.log(`${o.direction} slice of ${o.shortName}
|
|
913
|
+
`),o.connectedSymbols.length===0){console.log(" No connected symbols found.");return}L.list(o.connectedSymbols,s=>` ${s.file} ${s.shortName}
|
|
876
914
|
${s.relationship}`),console.log(`
|
|
877
|
-
${o.connectedSymbols.length} connected symbol(s).`)}),
|
|
878
|
-
${e.length} symbol(s)`)}),
|
|
879
|
-
`).map((o,s)=>` ${String(ye(r.startLine+s)).padStart(4)} ${o}`))}return n.length===0&&n.push(...e.system.symbols.map(r=>` ${ue(r.startLine,r.endLine)} ${r.shortName}`)),ht(n,t).rows}function LN(e,t){let n=e.trace.referencedBy.map(r=>` ${r.relativePath}:${ye(r.line)} in ${r.enclosingShort}`);return Gt(ht(n,t))}function _N(e,t){if(!e.callGraph)return[];let n=e.callGraph.callers.map(i=>` caller ${i.file} ${i.shortName}`),r=e.callGraph.callees.map(i=>` callee ${i.file} ${i.shortName}`);return Gt(ht([...n,...r],t))}function wN(e,t){if(!e.dataflow)return[];let n=e.dataflow.producers.map(o=>` producer ${o.file} ${o.shortName}`),r=e.dataflow.consumers.map(o=>` consumer ${o.file} ${o.shortName}`),i=e.dataflow.usageSites.map(o=>` usage ${o.file}:${ye(o.line)} in ${o.enclosingShort}`);return Gt(ht([...n,...r,...i],t))}function EN(e,t){let n=[...e.deps.map(r=>` file depends on ${r.relativePath}`),...e.rdeps.map(r=>` file depended on by ${r.relativePath}`),...e.system.dependsOn.map(r=>` module depends on ${r}`),...e.system.dependedOnBy.map(r=>` module used by ${r}`)];return Gt(ht(n,t))}function kN(e,t){let n=[...e.system.files.map(r=>` file ${r}`),...e.system.symbols.map(r=>` export ${ue(r.startLine,r.endLine)} ${r.shortName}`),...e.surface.map(r=>` use ${r.consumer} -> ${r.shortName}`)];return Gt(ht(n,t))}function PN(e,t){let n=[],r=-1;for(let i of e.affected)i.depth!==r&&(n.push(` -- Depth ${i.depth} --`),r=i.depth),n.push(` ${i.file} ${i.shortName}`);return Gt(ht(n,t))}function FN(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(r=>{let i=r.riskLevel==="high"?" *** HIGH RISK ***":r.riskLevel==="medium"?" * medium risk *":"";return` ${ue(r.startLine,r.endLine)} ${r.shortName} [${r.externalConsumers} consumers]${i}`}))),e.complexity&&(n.push(` Complexity: ${se(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}`)),Gt(ht(n,t))}function AN(e){let t=e.history;if(!t.available||!t.file)return[];let n=[];if(t.churn){let r=t.churn.fixChanges>0?`, ${t.churn.fixChanges} in fix commits`:"";n.push(` Churn: ${t.churn.changes} change(s) in recent history${r}`)}for(let r of t.coChangePartners)n.push(` Usually changes with: ${r.file} (${r.together}x, ${Math.round(r.confidence*100)}%)`);return t.suppressionsInFile>0&&n.push(` Detector suppressions in file: ${t.suppressionsInFile} (accepted findings \u2014 read the reasons before refactoring)`),n}function TN(e){let t=e.warnings.map(r=>` ${r}`);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(r=>r.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 ht(e,t){let n=Math.max(1,t);return{rows:e.slice(0,n),omitted:Math.max(0,e.length-n)}}function Gt(e){return e.omitted>0?[...e.rows,` ... ${e.omitted} more`]:e.rows}function zs(e){return e?"yes":"no"}var ed=["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","similar-chains","extract-candidates","affected","change-surface","cleanup-plan","co-change","recent-duplicates","doc-drift","unused-params","diff-gate","plan-context","drift","wrapper-candidates","passthrough-candidates","stale-abstractions","complexity-hotspots","self-audit","convergence","code","complexity","dataflow","slice","redundant-reexports","similar-signatures"],MN=[zm,Xm,Qm,Jm,Ym,Zm,Km],td=MN.flat(),nd=new Map(td.map(e=>[e.id,e])),XB=ed.map(e=>{let t=nd.get(e);if(!t)throw new Error(`Missing query command descriptor: ${e}`);return t});for(let e of td)if(!ed.includes(e.id))throw new Error(`Query command descriptor is not ordered: ${e.id}`);function D(e){let t=nd.get(e);if(!t)throw new Error(`Unknown query command descriptor: ${e}`);return t}var rd=[{id:"reindex",command:"reindex",description:"Index the codebase and convert to SQLite",options:[g("-l, --language <lang>","Index only this language (can be repeated)",yu,[]),g("--pnpm-workspaces","Enable pnpm workspace support (TypeScript)"),g("--force","Rebuild even if source inputs are unchanged"),g("--allow-partial","Write an incomplete index when one or more detected languages fail"),g("--indexer-concurrency <n>","Number of language indexers to run at once",ui)],renderShape:"custom",docs:x("Indexing",["scip-query reindex"]),handler:Nm},{id:"augment-sources",command:"augment-sources",description:"Add source files skipped by upstream SCIP indexers to the SQLite documents table",renderShape:"custom",docs:x("Indexing"),handler:Lm},{id:"augment-vue",command:"augment-vue",description:"Add compiler-resolved Vue SFC references to the SQLite index using Volar",options:[g("--project <tsconfig>","Vue tsconfig path",void 0,"frontend/tsconfig.scip.json")],renderShape:"custom",docs:x("Indexing"),handler:_m},D("stats"),D("files"),D("methods"),D("refs"),D("trace"),D("deps"),D("rdeps"),D("system"),D("surface"),D("dead"),D("hotspots"),D("imports"),D("imported-by"),D("unused-imports"),D("outline"),D("members"),D("fan-in"),D("fan-out"),D("coupling"),D("cycles"),D("bottlenecks"),D("isolated"),D("by-kind"),D("kind-counts"),D("deep-chains"),D("hierarchy"),D("call-graph"),D("similar"),D("similar-files"),D("similar-chains"),D("extract-candidates"),D("affected"),D("change-surface"),D("cleanup-plan"),D("co-change"),D("recent-duplicates"),D("doc-drift"),D("unused-params"),D("diff-gate"),D("plan-context"),{id:li,command:li,description:"Internal diff-impact batch worker",hidden:!0,options:[g("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",handler:wm},{id:"diff-impact",command:"diff-impact",description:"Compute changed symbols and downstream consumers from current git diff",options:[g("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",docs:x("Impact"),handler:Em},D("drift"),D("wrapper-candidates"),D("passthrough-candidates"),D("stale-abstractions"),D("complexity-hotspots"),D("self-audit"),{id:ci,command:ci,description:"Internal health phase worker",hidden:!0,arguments:[{name:"<phase>"}],options:[g("-s, --scope <path>","Limit to files matching path"),g("--full","Run unbounded candidate analyses on large indexes")],renderShape:"custom",handler:km},{id:"health",command:"health",description:"Composite codebase health report with prioritized action list",options:[g("-s, --scope <path>","Limit to files matching path"),g("--full","Run unbounded candidate analyses on large indexes"),g("--json","Output as JSON for programmatic consumption"),g("--baseline","Compare findings against the committed baseline; exit 1 on new findings"),g("--write-baseline","Snapshot current finding identities to the baseline file")],renderShape:"custom",docs:x("Health",["scip-query health --json","scip-query health --baseline"]),handler:Pm},D("convergence"),D("code"),D("complexity"),D("dataflow"),D("slice"),{id:"install-skills",command:"install-skills",description:`Install skills (${Ds.join(", ")}) into Claude Code, Codex, and shared agent roots`,renderShape:"custom",docs:x("Maintenance"),handler:Fm},{id:"check-deps",command:"check-deps",description:"Check whether scip-query and the detected language indexers are actually runnable",renderShape:"custom",docs:x("Maintenance"),handler:Am},D("redundant-reexports"),D("similar-signatures"),{id:"init",command:"init",description:"Create a .scipquery.json config file for this project",renderShape:"custom",docs:x("Maintenance"),handler:Tm},{id:"watch",command:"watch",description:"Watch for file changes and reindex automatically",options:[g("--debounce <ms>","Ms to wait after last change (default: 30000)",bs),g("--cooldown <ms>","Min ms between reindexes (default: 60000)",bs)],renderShape:"custom",docs:x("Maintenance"),handler:Mm},{id:"status",command:"status",description:"Show index status for this project",renderShape:"custom",docs:x("Maintenance"),handler:Om}];function id(e,t){return t.map(n=>{let r=n.hidden?e.command(n.command,{hidden:!0}):e.command(n.command);r.description(n.description);for(let i of n.arguments??[])r.argument(i.name);for(let i of n.options??[])i.parser&&Object.hasOwn(i,"defaultValue")?r.option(i.flags,i.description,i.parser,i.defaultValue):i.parser?r.option(i.flags,i.description,i.parser):Object.hasOwn(i,"defaultValue")?r.option(i.flags,i.description,i.defaultValue):r.option(i.flags,i.description);return r.action((...i)=>n.handler(...i)),{descriptor:n,command:r}})}import{existsSync as ON,mkdirSync as $N,readFileSync as jN,writeFileSync as BN}from"fs";import{homedir as HN}from"os";import{join as vi}from"path";var qN=1440*60*1e3,sd="update-check.json",VN="https://registry.npmjs.org/scip-query/latest";async function ad(e={}){let t=e.env??process.env;if(t.SCIP_QUERY_UPDATE_CHECK==="0"||t.NO_UPDATE_NOTIFIER)return;let n=e.cacheDir??GN(t),r=e.now??Date.now(),i=e.currentVersion??ai,o=JN(n),s=o&&r-o.checkedAt<qN?o.latestVersion:await zN(n,e.fetchLatestVersion??KN,r);if(!s||!UN(s,i))return;(e.writeNotice??(c=>console.error(c)))(WN(i,s))}function WN(e,t){return[`scip-query update available: ${e} -> ${t}.`,"Agent: tell your human to update with: npm install -g scip-query@latest",""].join(`
|
|
880
|
-
`)}function
|
|
881
|
-
`)}catch{}}async function
|
|
915
|
+
${o.connectedSymbols.length} connected symbol(s).`)}),Dd=[Je({id:"files",command:"files <pattern>",description:"Find files matching a pattern",docs:v("Navigation",["scip-query files auth"]),query:({db:e,args:t})=>Bi(e,O(t,0)),format:e=>e.relativePath}),Je({id:"methods",command:"methods <className>",description:"List methods of a class (with line ranges)",docs:v("Navigation"),query:({db:e,args:t})=>No(e,O(t,0)),format:e=>` ${de(e.startLine,e.endLine)} ${e.name}`}),{id:"refs",command:"refs <symbol>",description:"Find all files referencing a symbol",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"grouped-by-file",docs:v("Navigation",["scip-query refs login"]),handler:E_},Oi({id:"trace",command:"trace <symbol>",description:"Trace a symbol: definition + all references",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",docs:v("Navigation",["scip-query trace parseSymbol"]),query:({db:e,args:t,budget:n})=>Vn(e,O(t,0),{semantic:n.semantic}),sections:N_}),Je({id:"deps",command:"deps <file>",description:"Files this file depends on (internal)",docs:v("Navigation"),query:({db:e,args:t})=>Wn(e,O(t,0)),format:e=>e.relativePath}),Je({id:"rdeps",command:"rdeps <file>",description:"Files that depend on this file/module",docs:v("Navigation"),query:({db:e,args:t})=>Un(e,O(t,0)),format:e=>e.relativePath}),bd({id:"system",command:"system <module>",description:"Full module map: files, symbols, deps in/out",docs:v("Navigation",["scip-query system queries"]),query:({db:e,args:t})=>Gn(e,O(t,0)),sections:e=>[{title:"FILES",rows:e.files},{title:"EXPORTED SYMBOLS",rows:e.symbols.map(t=>` ${de(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}`)}]}),Je({id:"surface",command:"surface <module>",description:"What symbols consumers actually use from this module",docs:v("Navigation"),query:({db:e,args:t})=>Jn(e,O(t,0)),format:e=>` ${e.consumer} \u2192 ${e.shortName}`}),{id:"imports",command:"imports <file>",description:"What symbols does this file import?",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"list",docs:v("Navigation"),handler:w_},Je({id:"imported-by",command:"imported-by <symbol>",description:"Which files import this symbol?",docs:v("Navigation"),query:({db:e,args:t})=>Ao(e,O(t,0)),format:e=>` ${e.fromFile}`}),{id:"outline",command:"outline <file>",description:"Tree view of symbols in a file, with line ranges",options:[g("--signatures","Show trimmed symbol signatures")],renderShape:"custom",docs:v("Navigation"),handler:__},Je({id:"members",command:"members <symbol>",description:"All children of a symbol (methods, fields, nested types)",docs:v("Navigation"),query:({db:e,args:t})=>$o(e,O(t,0)),format:e=>` ${de(e.startLine,e.endLine)} [${e.kind}] ${e.shortName}`}),Je({id:"by-kind",command:"by-kind <kind>",description:"Find symbols by SCIP kind (class, interface, enum, function, etc.)",options:[g("-s, --scope <path>","Limit to files matching path"),g("-n, --limit <n>","Number of results",I,100)],docs:v("Navigation"),query:({db:e,args:t,opts:n})=>zo(e,O(t,0),{scope:k(n,"scope"),limit:C(n,"limit",100)}),format:e=>` ${ce(e.relativePath,e.startLine,e.endLine)} [${e.kindName}] ${e.shortName}`,emptyMessage:({args:e})=>`No symbols found for kind "${O(e,0)}". Use "kind-counts" to see available kinds.`,after:e=>console.log(`
|
|
916
|
+
${e.length} symbol(s)`)}),Mi({id:"kind-counts",command:"kind-counts",description:"Histogram of symbol kinds in the codebase",options:[g("-s, --scope <path>","Limit to files matching path")],docs:v("Navigation"),headers:["count","kind"],query:({db:e,opts:t})=>Ko(e,{scope:k(t,"scope")}),format:e=>` ${String(e.count).padStart(5)} ${e.kindName} (${e.kind})`}),Je({id:"hierarchy",command:"hierarchy <symbol>",description:"Show a symbol's ancestry chain (method \u2192 class \u2192 module)",docs:v("Navigation"),query:({db:e,args:t})=>Yo(e,O(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:[g("-C, --context <n>","Extra lines of context above/below",I,0)],renderShape:"custom",docs:v("Navigation"),handler:k_},{id:"dataflow",command:"dataflow <symbol>",description:"Reference-level dataflow: definition sites, usage sites, producers, consumers",options:[g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"custom",docs:v("Navigation"),handler:P_},{id:"slice",command:"slice <symbol>",description:"Reference-level program slice: what affects this (backward) or what this affects (forward)",options:[g("--forward","Forward slice (what does this affect). Default is backward."),g("--depth <n>","Max transitive depth for backward slice",I,3),g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"custom",docs:v("Navigation"),handler:F_}];var T_=ee("plan-context",({db:e,args:t,opts:n,budget:r})=>{let i=C(n,"limit",20),o=ys(e,O(t,0),{semantic:r.semantic,impactDepth:C(n,"impactDepth",3),sliceDepth:C(n,"sliceDepth",3),scope:k(n,"scope")});if(o.warnings.length===1&&o.warnings[0]==="No symbol, file, or module matched target.")return L.empty(o.warnings[0]);let s=[{title:"TARGET",rows:A_(o)},{title:"DEFINITIONS",rows:M_(o,i),skipIfEmpty:!0},{title:"REFERENCES",rows:O_(o,i),skipIfEmpty:!0},{title:"CALL GRAPH",rows:$_(o,i),skipIfEmpty:!0},{title:"DATAFLOW",rows:j_(o,i),skipIfEmpty:!0},{title:"DEPENDENCIES",rows:B_(o,i),skipIfEmpty:!0},{title:"SURFACE",rows:H_(o,i),skipIfEmpty:!0},{title:"DOWNSTREAM IMPACT",rows:q_(o,i),skipIfEmpty:!0},{title:"CHANGE RISK",rows:V_(o,i),skipIfEmpty:!0},{title:"HISTORY",rows:W_(o),skipIfEmpty:!0},{title:"PLANNING NOTES",rows:U_(o),skipIfEmpty:!0}];L.sectionedReport(s)}),Nd=[{id:"plan-context",command:"plan-context <target>",description:"Pre-edit planning context for a symbol, file, or module",options:[g("--impact-depth <n>","Maximum affected traversal depth",I,3),g("--slice-depth <n>","Maximum backward slice depth",I,3),g("-s, --scope <path>","Limit downstream impact to files matching path"),g("-n, --limit <n>","Rows per section",I,20),g("--full","Run unbounded semantic analysis on large indexes")],budget:"semantic",renderShape:"custom",docs:v("Planning",["scip-query plan-context parseSymbol"]),handler:T_}];function A_(e){return[`Target: ${e.target}`,`Matched: symbol=${pa(e.matched.symbol)} file=${pa(e.matched.file)} module=${pa(e.matched.module)}`]}function M_(e,t){let n=[];for(let r of e.trace.definitions){let i=r.signature?` -- ${r.signature}`:"";n.push(` ${ce(r.relativePath,r.startLine,r.endLine)}${i}`),r.source&&n.push(...r.source.split(`
|
|
917
|
+
`).map((o,s)=>` ${String(xe(r.startLine+s)).padStart(4)} ${o}`))}return n.length===0&&n.push(...e.system.symbols.map(r=>` ${de(r.startLine,r.endLine)} ${r.shortName}`)),St(n,t).rows}function O_(e,t){let n=e.trace.referencedBy.map(r=>` ${r.relativePath}:${xe(r.line)} in ${r.enclosingShort}`);return Xt(St(n,t))}function $_(e,t){if(!e.callGraph)return[];let n=e.callGraph.callers.map(i=>` caller ${i.file} ${i.shortName}`),r=e.callGraph.callees.map(i=>` callee ${i.file} ${i.shortName}`);return Xt(St([...n,...r],t))}function j_(e,t){if(!e.dataflow)return[];let n=e.dataflow.producers.map(o=>` producer ${o.file} ${o.shortName}`),r=e.dataflow.consumers.map(o=>` consumer ${o.file} ${o.shortName}`),i=e.dataflow.usageSites.map(o=>` usage ${o.file}:${xe(o.line)} in ${o.enclosingShort}`);return Xt(St([...n,...r,...i],t))}function B_(e,t){let n=[...e.deps.map(r=>` file depends on ${r.relativePath}`),...e.rdeps.map(r=>` file depended on by ${r.relativePath}`),...e.system.dependsOn.map(r=>` module depends on ${r}`),...e.system.dependedOnBy.map(r=>` module used by ${r}`)];return Xt(St(n,t))}function H_(e,t){let n=[...e.system.files.map(r=>` file ${r}`),...e.system.symbols.map(r=>` export ${de(r.startLine,r.endLine)} ${r.shortName}`),...e.surface.map(r=>` use ${r.consumer} -> ${r.shortName}`)];return Xt(St(n,t))}function q_(e,t){let n=[],r=-1;for(let i of e.affected)i.depth!==r&&(n.push(` -- Depth ${i.depth} --`),r=i.depth),n.push(` ${i.file} ${i.shortName}`);return Xt(St(n,t))}function V_(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(r=>{let i=r.riskLevel==="high"?" *** HIGH RISK ***":r.riskLevel==="medium"?" * medium risk *":"";return` ${de(r.startLine,r.endLine)} ${r.shortName} [${r.externalConsumers} consumers]${i}`}))),e.complexity&&(n.push(` Complexity: ${ce(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}`)),Xt(St(n,t))}function W_(e){let t=e.history;if(!t.available||!t.file)return[];let n=[];if(t.churn){let r=t.churn.fixChanges>0?`, ${t.churn.fixChanges} in fix commits`:"";n.push(` Churn: ${t.churn.changes} change(s) in recent history${r}`)}for(let r of t.coChangePartners)n.push(` Usually changes with: ${r.file} (${r.together}x, ${Math.round(r.confidence*100)}%)`);return t.suppressionsInFile>0&&n.push(` Detector suppressions in file: ${t.suppressionsInFile} (accepted findings \u2014 read the reasons before refactoring)`),n}function U_(e){let t=e.warnings.map(r=>` ${r}`);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(r=>r.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 St(e,t){let n=Math.max(1,t);return{rows:e.slice(0,n),omitted:Math.max(0,e.length-n)}}function Xt(e){return e.omitted>0?[...e.rows,` ... ${e.omitted} more`]:e.rows}function pa(e){return e?"yes":"no"}var G_=["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","similar-chains","extract-candidates","affected","change-surface","cleanup-plan","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"],J_=[Cd,Dd,Rd,xd,vd,Nd,Id],_d=J_.flat(),z_=new Map(_d.map(e=>[e.id,e]));for(let e of _d)if(!G_.includes(e.id))throw new Error(`Query command descriptor is not ordered: ${e.id}`);function N(e){let t=z_.get(e);if(!t)throw new Error(`Unknown query command descriptor: ${e}`);return t}var Ld=[{id:"reindex",command:"reindex",description:"Index the codebase and convert to SQLite",options:[g("-l, --language <lang>","Index only this language (can be repeated)",Ci,[]),g("--pnpm-workspaces","Enable pnpm workspace support (TypeScript)"),g("--force","Rebuild even if source inputs are unchanged"),g("--allow-partial","Write an incomplete index when one or more detected languages fail"),g("--indexer-concurrency <n>","Number of language indexers to run at once",Ri)],renderShape:"custom",docs:v("Indexing",["scip-query reindex"]),handler:Xm},{id:"augment-sources",command:"augment-sources",description:"Add source files skipped by upstream SCIP indexers to the SQLite documents table",renderShape:"custom",docs:v("Indexing"),handler:Zm},{id:"augment-vue",command:"augment-vue",description:"Add compiler-resolved Vue SFC references to the SQLite index using Volar",options:[g("--project <tsconfig>","Vue tsconfig path",void 0,"frontend/tsconfig.scip.json")],renderShape:"custom",docs:v("Indexing"),handler:ed},N("stats"),N("files"),N("methods"),N("refs"),N("trace"),N("deps"),N("rdeps"),N("system"),N("surface"),N("dead"),N("hotspots"),N("imports"),N("imported-by"),N("unused-imports"),N("outline"),N("members"),N("fan-in"),N("fan-out"),N("coupling"),N("cycles"),N("bottlenecks"),N("isolated"),N("by-kind"),N("kind-counts"),N("deep-chains"),N("hierarchy"),N("call-graph"),N("similar"),N("similar-files"),N("similar-chains"),N("extract-candidates"),N("affected"),N("change-surface"),N("cleanup-plan"),N("co-change"),N("recent-duplicates"),N("doc-drift"),N("unused-params"),N("diff-gate"),N("incomplete-migration"),N("plan-context"),{id:xi,command:xi,description:"Internal diff-impact batch worker",hidden:!0,options:[g("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",handler:td},{id:"diff-impact",command:"diff-impact",description:"Compute changed symbols and downstream consumers from current git diff",options:[g("--base <ref>","Git ref to diff against (default: HEAD)")],renderShape:"custom",docs:v("Impact"),handler:nd},N("drift"),N("wrapper-candidates"),N("passthrough-candidates"),N("stale-abstractions"),N("complexity-hotspots"),N("self-audit"),{id:Si,command:Si,description:"Internal health phase worker",hidden:!0,arguments:[{name:"<phase>"}],options:[g("-s, --scope <path>","Limit to files matching path"),g("--full","Run unbounded candidate analyses on large indexes")],renderShape:"custom",handler:rd},{id:"health",command:"health",description:"Composite codebase health report with prioritized action list",options:[g("-s, --scope <path>","Limit to files matching path"),g("--full","Run unbounded candidate analyses on large indexes"),g("--json","Output as JSON for programmatic consumption"),g("--baseline","Compare findings against the committed baseline; exit 1 on new findings"),g("--write-baseline","Snapshot current finding identities to the baseline file")],renderShape:"custom",docs:v("Health",["scip-query health --json","scip-query health --baseline"]),handler:id},N("convergence"),N("code"),N("complexity"),N("dataflow"),N("slice"),{id:"install-skills",command:"install-skills",description:`Install skills (${Vs.join(", ")}) into Claude Code, Codex, and shared agent roots`,renderShape:"custom",docs:v("Maintenance"),handler:od},{id:"check-deps",command:"check-deps",description:"Check whether scip-query and the detected language indexers are actually runnable",renderShape:"custom",docs:v("Maintenance"),handler:sd},N("redundant-reexports"),N("similar-signatures"),{id:"init",command:"init",description:"Create a .scipquery.json config file for this project",renderShape:"custom",docs:v("Maintenance"),handler:ad},{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:[g("--git-hook","Also install a git pre-commit hook that runs diff-gate")],renderShape:"custom",docs:v("Maintenance",["scip-query setup-agent","scip-query setup-agent --git-hook"]),handler:cd},{id:"watch",command:"watch",description:"Watch for file changes and reindex automatically",options:[g("--debounce <ms>","Ms to wait after last change (default: 30000)",Ms),g("--cooldown <ms>","Min ms between reindexes (default: 60000)",Ms)],renderShape:"custom",docs:v("Maintenance"),handler:ld},{id:"status",command:"status",description:"Show index status for this project",renderShape:"custom",docs:v("Maintenance"),handler:ud}];function wd(e,t){return t.map(n=>{let r=n.hidden?e.command(n.command,{hidden:!0}):e.command(n.command);r.description(n.description);for(let i of n.arguments??[])r.argument(i.name);for(let i of n.options??[])i.parser&&Object.hasOwn(i,"defaultValue")?r.option(i.flags,i.description,i.parser,i.defaultValue):i.parser?r.option(i.flags,i.description,i.parser):Object.hasOwn(i,"defaultValue")?r.option(i.flags,i.description,i.defaultValue):r.option(i.flags,i.description);return r.action((...i)=>n.handler(...i)),{descriptor:n,command:r}})}import{existsSync as K_,mkdirSync as Q_,readFileSync as Y_,writeFileSync as X_}from"fs";import{homedir as Z_}from"os";import{join as $i}from"path";var eL=1440*60*1e3,kd="update-check.json",tL="https://registry.npmjs.org/scip-query/latest";async function Pd(e={}){let t=e.env??process.env;if(t.SCIP_QUERY_UPDATE_CHECK==="0"||t.NO_UPDATE_NOTIFIER)return;let n=e.cacheDir??iL(t),r=e.now??Date.now(),i=e.currentVersion??bi,o=oL(n),s=o&&r-o.checkedAt<eL?o.latestVersion:await sL(n,e.fetchLatestVersion??cL,r);if(!s||!rL(s,i))return;(e.writeNotice??(c=>console.error(c)))(nL(i,s))}function nL(e,t){return[`scip-query update available: ${e} -> ${t}.`,"Agent: tell your human to update with: npm install -g scip-query@latest",""].join(`
|
|
918
|
+
`)}function rL(e,t){let n=Ed(e),r=Ed(t);if(!n||!r)return e!==t;for(let i=0;i<n.length;i++){let o=n[i]-r[i];if(o>0)return!0;if(o<0)return!1}return!1}function iL(e){let t=e.XDG_CACHE_HOME||$i(Z_(),".cache");return $i(t,"scip-query")}function oL(e){let t=$i(e,kd);if(!K_(t))return null;try{let n=JSON.parse(Y_(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 sL(e,t,n){let r;try{r=await t()}catch{r=null}return aL(e,{checkedAt:n,latestVersion:r}),r}function aL(e,t){try{Q_(e,{recursive:!0}),X_($i(e,kd),`${JSON.stringify(t,null,2)}
|
|
919
|
+
`)}catch{}}async function cL(){let e=await fetch(tL,{signal:AbortSignal.timeout(1e3)});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}function Ed(e){let t=/^v?(\d+)\.(\d+)\.(\d+)(?:[-+].*)?$/.exec(e);return t?[Number(t[1]),Number(t[2]),Number(t[3])]:null}ji.name("scip-query").description("Language-agnostic code intelligence CLI powered by SCIP indexes").version(bi);wd(ji,Ld);ji.hook("preAction",async()=>{await Pd()});uL()&&await ji.parseAsync();function uL(){if(!process.argv[1])return!1;let e=lL(import.meta.url);try{return Fd(e)===Fd(process.argv[1])}catch{return e===process.argv[1]}}export{ji as program,pr as renderHeuristicNotice};
|
|
882
920
|
//# sourceMappingURL=cli.js.map
|