toolnet-memory 0.2.14 → 0.2.16

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.
@@ -1,8 +1,8 @@
1
- import{closeSync as Yr,mkdirSync as qr,openSync as Qr,rmSync as Zr,writeFileSync as Xr}from"node:fs";import{join as ze}from"node:path";import{existsSync as mt,readFileSync as ut}from"node:fs";import{homedir as ft}from"node:os";import{join as gt}from"node:path";function ht(n){let e=n.trim();return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?(e=e.slice(1,-1),e.replace(/\\n/g,`
2
- `).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\"/g,'"').replace(/\\\\/g,"\\")):e.length>=2&&e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function yt(){let n=process.env.TOOLNET_GLOBAL_ENV??gt(ft(),".config","toolnet-memory",".env");if(!mt(n))return;let e=ut(n,"utf8");for(let t of e.split(/\r?\n/)){let r=t.trim();if(!r||r.startsWith("#"))continue;r.startsWith("export ")&&(r=r.slice(7));let s=r.indexOf("=");if(s<=0)continue;let i=r.slice(0,s).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(i)&&process.env[i]===void 0&&(process.env[i]=ht(r.slice(s+1)))}}yt();function O(n,e){return n===void 0?e:["1","true","yes","on"].includes(n.toLowerCase())}function _(n,e){if(!n)return e;let t=Number(n);return Number.isFinite(t)?t:e}function Be(){return{memory:{autoCapture:O(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:O(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:O(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:O(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:_(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:_(process.env.MEMORY_RERANK_TOP,10),finalContext:_(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:_(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",r2:{accountId:process.env.R2_ACCOUNT_ID,bucket:process.env.R2_BUCKET,accessKeyId:process.env.R2_ACCESS_KEY_ID,secretAccessKey:process.env.R2_SECRET_ACCESS_KEY},s3:{endpoint:process.env.S3_ENDPOINT,region:process.env.S3_REGION,bucket:process.env.S3_BUCKET,accessKeyId:process.env.S3_ACCESS_KEY_ID,secretAccessKey:process.env.S3_SECRET_ACCESS_KEY,forcePathStyle:O(process.env.S3_FORCE_PATH_STYLE,!1)},huggingface:{namespace:process.env.HF_NAMESPACE,bucket:process.env.HF_BUCKET,accessKeyId:process.env.HF_S3_ACCESS_KEY_ID,secretAccessKey:process.env.HF_S3_SECRET_ACCESS_KEY},localRoot:process.env.MEMORY_LOCAL_STORAGE_PATH},cache:{maxMb:_(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as St}from"node:crypto";import{existsSync as Re,mkdirSync as bt,readFileSync as xt,renameSync as wt,writeFileSync as Et}from"node:fs";import{basename as Ct,dirname as Y,join as Q,parse as Ue,resolve as F}from"node:path";var Ve=".toolnet",vt="project.json";function Pt(n){return St("sha256").update(n).digest("hex").slice(0,16)}function Ae(n){return Q(n,Ve,vt)}function kt(n){return Re(Ae(n))}function Tt(n,e){let t=F(n),r=Ue(t).root;for(;;){if(kt(t))return t;if(t===r||e&&t===F(e))break;let s=Y(t);if(s===t)break;t=s}return null}function Rt(n){let e=F(n),t=Ue(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>Re(Q(e,i))))return e;if(e===t)break;let s=Y(e);if(s===e)break;e=s}return F(n)}function At(n){let e;try{e=JSON.parse(xt(n,"utf8"))}catch(s){throw new Error(`Invalid ToolNet project manifest: ${n}: ${s instanceof Error?s.message:String(s)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${n}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${n}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${n}`);let r=new Date().toISOString();return{version:1,id:t.id,name:t.name,remote:typeof t.remote=="string"&&t.remote.trim()?t.remote:t.name,rootPath:typeof t.rootPath=="string"?t.rootPath:Y(Y(n)),createdAt:typeof t.createdAt=="string"?t.createdAt:r,updatedAt:typeof t.updatedAt=="string"?t.updatedAt:r,graphVersion:typeof t.graphVersion=="number"?t.graphVersion:0,memoryVersion:typeof t.memoryVersion=="number"?t.memoryVersion:0,metadata:t.metadata&&typeof t.metadata=="object"?t.metadata:void 0}}function He(n,e){let t=Q(n,Ve);bt(t,{recursive:!0});let r=Ae(n),s=`${r}.tmp-${process.pid}`;Et(s,JSON.stringify(e,null,2)+`
3
- `,{encoding:"utf8",mode:384}),wt(s,r)}function We(n,e){return{id:n.id,name:n.name,remote:n.remote,rootPath:e,createdAt:n.createdAt,updatedAt:n.updatedAt,graphVersion:n.graphVersion,memoryVersion:n.memoryVersion,metadata:n.metadata}}var q=class{detect(e=process.cwd()){let t=F(e),r=Rt(t),i=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>Re(Q(r,l))),o=Tt(t,i?r:void 0);if(o){let l=Ae(o),u=At(l);return u.rootPath!==o&&(u.rootPath=o,u.updatedAt=new Date().toISOString(),He(o,u)),We(u,o)}let a=new Date().toISOString(),m=Ct(r),c={version:1,id:Pt(r),name:m,remote:m,rootPath:r,createdAt:a,updatedAt:a,graphVersion:0,memoryVersion:0};return He(r,c),We(c,r)}};var Lt=[{type:"openai_key",regex:/\bsk-[A-Za-z0-9_\-]{20,}\b/g},{type:"huggingface_token",regex:/\bhf_[A-Za-z0-9]{20,}\b/g},{type:"hf_s3_access_key",regex:/\bHFAK[A-Za-z0-9]{8,}\b/g},{type:"bearer_token",regex:/\bBearer\s+[A-Za-z0-9._\-]{16,}\b/gi},{type:"jwt",regex:/\beyJ[A-Za-z0-9_\-]{8,}\.[A-Za-z0-9_\-]{8,}\.[A-Za-z0-9_\-]{8,}\b/g},{type:"private_key",regex:/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/g},{type:"password_assignment",regex:/\b(password|passwd|pwd)\s*[:=]\s*["']?[^"'\s]{6,}["']?/gi},{type:"secret_assignment",regex:/\b(secret|api[_-]?key|access[_-]?token|refresh[_-]?token)\s*[:=]\s*["']?[^"'\s]{8,}["']?/gi},{type:"cookie",regex:/\b(cookie|set-cookie)\s*[:=]\s*[^;\n]{8,}/gi}],Z=class{scan(e){let t=[];for(let r of Lt){let s=new RegExp(r.regex.source,r.regex.flags);for(let i of e.matchAll(s))t.push({type:r.type,value:i[0]})}return t}hasSecrets(e){return this.scan(e).length>0}};var $=class{scanner=new Z;sanitize(e){let t=e,r=this.scanner.scan(e),s=new Set;for(let i of r)s.add(i.type),t=t.split(i.value).join(`[REDACTED:${i.type}]`);return{text:t,redacted:r.length,secretTypes:[...s]}}sanitizeValue(e){if(typeof e=="string")return this.sanitize(e).text;if(Array.isArray(e))return e.map(t=>this.sanitizeValue(t));if(e&&typeof e=="object"){let t={};for(let[r,s]of Object.entries(e)){let i=r.toLowerCase();i.includes("password")||i.includes("secret")||i.includes("token")||i.includes("cookie")||i.includes("authorization")?t[r]="[REDACTED]":t[r]=this.sanitizeValue(s)}return t}return e}};var X=class{constructor(e){this.options=e}options;name="huggingface";dimensions=384;async embed(e){let[t]=await this.embedMany([e]);return t}async embedMany(e){if(e.length===0)return[];let t=`https://router.huggingface.co/hf-inference/models/${this.options.model}/pipeline/feature-extraction`,r=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"},body:JSON.stringify({inputs:e,options:{wait_for_model:!0}})});if(!r.ok)throw new Error(`HF embedding failed: ${r.status} ${await r.text()}`);let s=await r.json();if(!Array.isArray(s))throw new Error("HF embedding returned invalid response");return s.map(i=>jt(i))}};function jt(n){if(!Array.isArray(n))throw new Error("Invalid embedding");if(n.length>0&&typeof n[0]=="number")return n;if(n.length>0&&Array.isArray(n[0])){let e=n;if(e.length===0)return[];let t=e[0].length,r=new Array(t).fill(0);for(let s of e)for(let i=0;i<t;i++)r[i]+=s[i]??0;for(let s=0;s<t;s++)r[s]/=e.length;return r}throw new Error("Unsupported embedding shape")}import{createHash as It}from"node:crypto";var ee=class{name="hash-fallback";dimensions=128;async embed(e){let t=new Array(this.dimensions).fill(0),r=e.toLowerCase().split(/\s+/).filter(Boolean);for(let s of r){let o=It("sha256").update(s).digest().readUInt32BE(0)%this.dimensions;t[o]+=1}return Nt(t)}async embedMany(e){return Promise.all(e.map(t=>this.embed(t)))}};function Nt(n){let e=Math.sqrt(n.reduce((t,r)=>t+r*r,0));return e===0?n:n.map(t=>t/e)}var Le=class{constructor(e,t=new ee){this.primary=e;this.fallback=t}primary;fallback;name="resilient";async embed(e){if(this.primary)try{return await this.primary.embed(e)}catch(t){console.warn("[embedding] primary failed, fallback enabled:",t instanceof Error?t.message:t)}return this.fallback.embed(e)}async embedMany(e){if(this.primary)try{return await this.primary.embedMany(e)}catch(t){console.warn("[embedding] primary failed, fallback enabled:",t instanceof Error?t.message:t)}return this.fallback.embedMany(e)}};function Je(){let n=process.env.HF_TOKEN,e=process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",t=n?new X({token:n,model:e}):null;return new Le(t)}import{readdir as Ft}from"node:fs/promises";import{extname as $t,join as Dt,relative as Gt}from"node:path";import{basename as Mt}from"node:path";var Ot=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),_t=new Set([".pem",".key",".p12",".pfx"]);function Ye(n){let e=Mt(n).toLowerCase();if(Ot.has(e))return!0;for(let t of _t)if(e.endsWith(t))return!0;return!1}var zt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Kt=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function je(n){let e=[];async function t(r){let s=await Ft(r,{withFileTypes:!0});for(let i of s){if(Kt.has(i.name))continue;let o=Dt(r,i.name);if(i.isDirectory()){await t(o);continue}zt.has($t(i.name))&&(Ye(o)||e.push(Gt(n,o)))}}return await t(n),e.sort()}import{readFile as Bt}from"node:fs/promises";import{join as Ht}from"node:path";import{createHash as Wt}from"node:crypto";import*as E from"typescript";function qe(n,e){return Wt("sha256").update(`${n}:${e}`).digest("hex").slice(0,24)}function Ie(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}async function Ne(n,e,t){let r=Ht(e,t),s=await Bt(r,"utf8"),i=E.createSourceFile(t,s,E.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?E.ScriptKind.TSX:E.ScriptKind.TS),o=[],a=[],m=[],c=[],l={id:qe(n,`file:${t}`),projectId:n,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:i.getLineAndCharacterOfPosition(i.end).line+1};o.push(l);let u=[],d=[];function f(g,x,y,w){let P=qe(n,`${t}:${y}:${w??x}:${g.pos}`);return o.push({id:P,projectId:n,name:x,qualifiedName:w??x,type:y,filePath:t,startLine:Ie(i,g),endLine:i.getLineAndCharacterOfPosition(g.end).line+1}),P}function h(g){if(!E.isStringLiteral(g.moduleSpecifier))return;let x=[],y=g.importClause;if(y?.name&&x.push({localName:y.name.text,importedName:"default",kind:"default"}),y?.namedBindings&&E.isNamedImports(y.namedBindings))for(let w of y.namedBindings.elements)x.push({localName:w.name.text,importedName:w.propertyName?.text??w.name.text,kind:"named"});y?.namedBindings&&E.isNamespaceImport(y.namedBindings)&&x.push({localName:y.namedBindings.name.text,importedName:"*",kind:"namespace"}),a.push({source:g.moduleSpecifier.text,bindings:x})}function p(g,x){for(let y of g.heritageClauses??[])for(let w of y.types){let P=w.expression.getText(i).split(".").at(-1)??"";P&&c.push({fromId:x,targetName:P,type:y.token===E.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function b(g){let x=!1,y=!1;if(E.isImportDeclaration(g)&&h(g),E.isInterfaceDeclaration(g)&&f(g,g.name.text,"interface",g.name.text),E.isClassDeclaration(g)&&g.name){let w=f(g,g.name.text,"class",g.name.text);p(g,w),d.push({id:w,name:g.name.text}),y=!0}if(E.isFunctionDeclaration(g)&&g.name){let w=f(g,g.name.text,"function",g.name.text);u.push(w),x=!0}if(E.isMethodDeclaration(g)&&g.name){let w=g.name.getText(i),P=d.at(-1)?.name,v=f(g,w,"method",P?`${P}.${w}`:w);u.push(v),x=!0}if(E.isCallExpression(g)&&(E.isIdentifier(g.expression)&&m.push({callerId:u.at(-1),calleeName:g.expression.text,line:Ie(i,g)}),E.isPropertyAccessExpression(g.expression))){let w=g.expression;m.push({callerId:u.at(-1),qualifier:w.expression.getText(i),calleeName:w.name.text,line:Ie(i,g)})}E.forEachChild(g,b),x&&u.pop(),y&&d.pop()}return b(i),{filePath:t,symbols:o,imports:a,calls:m,heritage:c}}import{createHash as Ut}from"node:crypto";import{dirname as Vt,extname as Jt,normalize as Yt,posix as qt}from"node:path";var D=class{symbols=new Map;edges=new Map;addSymbol(e){this.symbols.set(e.id,e)}addEdge(e){this.edges.set(e.id,e)}getSymbol(e){return this.symbols.get(e)}findByName(e,t){return[...this.symbols.values()].filter(r=>r.projectId===e&&(r.name===t||r.qualifiedName===t))}allSymbols(e){return[...this.symbols.values()].filter(t=>t.projectId===e)}allEdges(e){return[...this.edges.values()].filter(t=>t.projectId===e)}import(e,t){for(let r of e)this.addSymbol(r);for(let r of t)this.addEdge(r)}clearProject(e){for(let[t,r]of this.symbols)r.projectId===e&&this.symbols.delete(t);for(let[t,r]of this.edges)r.projectId===e&&this.edges.delete(t)}};function Qt(n,e,t,r){return Ut("sha256").update(`${n}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function L(n){return Yt(n).replaceAll("\\","/")}function Me(n,e,t){if(!e.startsWith("."))return;let r=L(qt.join(Vt(n),e)),s=Jt(r),i;if(s===".js"){let o=r.slice(0,-3);i=[`${o}.ts`,`${o}.tsx`,`${o}.js`,`${o}.jsx`]}else if(s===".mjs"){let o=r.slice(0,-4);i=[`${o}.mts`,`${o}.ts`,`${o}.mjs`]}else if(s===".cjs"){let o=r.slice(0,-4);i=[`${o}.cts`,`${o}.ts`,`${o}.cjs`]}else s?i=[r]:i=[`${r}.ts`,`${r}.tsx`,`${r}.mts`,`${r}.cts`,`${r}.js`,`${r}.jsx`,`${r}.mjs`,`${r}.cjs`,`${r}/index.ts`,`${r}/index.tsx`,`${r}/index.js`,`${r}/index.jsx`];return i.find(o=>t.has(L(o)))}var G=class{build(e,t){let r=new D,s=new Map;for(let o of t)for(let a of o.symbols)r.addSymbol(a),a.type==="file"&&s.set(L(o.filePath),a);let i=new Set(s.keys());for(let o of t){let a=L(o.filePath),m=s.get(a);if(m){for(let c of o.symbols)c.id!==m.id&&r.addEdge(this.edge(e,m.id,"DEFINES",c.id));for(let c of o.imports){let l=Me(a,c.source,i);if(!l)continue;let u=s.get(l);u&&r.addEdge(this.edge(e,m.id,"IMPORTS",u.id,{source:c.source}))}for(let c of o.heritage){let l=r.findByName(e,c.targetName).filter(u=>u.type==="class"||u.type==="interface");for(let u of l)r.addEdge(this.edge(e,c.fromId,c.type,u.id))}for(let c of o.calls){if(!c.callerId)continue;let l=this.resolveCallTargets(e,o,c.calleeName,c.qualifier,t,r,i);for(let u of l)u.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",u.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,s,i,o,a){let m=L(t.filePath),c=o.findByName(e,r).filter(l=>L(l.filePath)===m);if(!s&&c.length)return c;if(s)for(let l of t.imports){if(!l.bindings.find(f=>f.kind==="namespace"&&f.localName===s))continue;let d=Me(m,l.source,a);if(d)return o.findByName(e,r).filter(f=>L(f.filePath)===d)}for(let l of t.imports){let u=l.bindings.find(p=>p.localName===r);if(!u)continue;let d=Me(m,l.source,a);if(!d)continue;let f=u.importedName==="default"?r:u.importedName,h=o.findByName(e,f).filter(p=>L(p.filePath)===d);if(h.length)return h}return o.findByName(e,r).filter(l=>l.type==="function"||l.type==="method")}edge(e,t,r,s,i){return{id:Qt(e,t,r,s),projectId:e,from:t,to:s,type:r,metadata:i}}};var te=class{async index(e,t){let r=await je(t),s=[];for(let o of r)try{s.push(await Ne(e,t,o))}catch(a){console.warn(`[indexer] skipped ${o}:`,a instanceof Error?a.message:a)}let i=new G().build(e,s);return{files:s.length,symbols:i.allSymbols(e).length,edges:i.allEdges(e).length,graph:i}}};import{execFile as Zt}from"node:child_process";import{promisify as Xt}from"node:util";var xo=Xt(Zt);var z=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"graph","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};import{createHash as er}from"node:crypto";import{readFile as tr}from"node:fs/promises";import{join as rr}from"node:path";function Qe(n){return er("sha256").update(n).digest("hex")}var re=class{sanitizer=new $;async build(e,t,r,s={}){let i=s.maxLines??80,o=s.overlapLines??10,a=new Map;for(let c of r){let l=a.get(c.filePath)??[];l.push(c),a.set(c.filePath,l)}let m=[];for(let[c,l]of a){let u;try{u=await tr(rr(t,c),"utf8")}catch{continue}let d=u.split(/\r?\n/),f=l.filter(h=>h.type!=="file"&&typeof h.startLine=="number"&&typeof h.endLine=="number");if(f.length>0)for(let h of f)m.push(...this.chunkRange({projectId:e,filePath:c,lines:d,symbol:h,startLine:h.startLine,endLine:h.endLine,maxLines:i,overlapLines:o}));else m.push(...this.chunkRange({projectId:e,filePath:c,lines:d,startLine:1,endLine:Math.max(1,d.length),maxLines:i,overlapLines:o}))}return m}chunkRange(e){let{projectId:t,filePath:r,lines:s,symbol:i,maxLines:o}=e,a=Math.min(e.overlapLines,Math.max(0,o-1)),m=Math.max(1,e.startLine),c=Math.min(s.length,Math.max(m,e.endLine)),l=[],u=m,d=0;for(;u<=c;){let f=Math.min(c,u+o-1),h=s.slice(u-1,f).join(`
4
- `).trim();if(h){let p=this.sanitizer.sanitize(h).text,b=Qe(p),g=[t,r,i?.id??"file",String(d),b].join(":");l.push({id:Qe(g).slice(0,32),projectId:t,filePath:r,symbolId:i?.id,symbolName:i?.qualifiedName??i?.name,symbolType:i?.type,startLine:u,endLine:f,content:p,contentHash:b})}if(f>=c)break;u=f-a+1,d++}return l}};var se=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","chunks","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var oe=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","vectors","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var ne=class{records=new Map;upsert(e){this.records.set(e.id,e)}get(e){return this.records.get(e)}has(e){return this.records.has(e)}remove(e){return this.records.delete(e)}clearProject(e){let t=0;for(let[r,s]of this.records)s.projectId===e&&(this.records.delete(r),t++);return t}exportProject(e){return[...this.records.values()].filter(t=>t.projectId===e)}importRecords(e){let t=0;for(let r of e)!r?.id||!r?.projectId||!Array.isArray(r.vector)||(this.records.set(r.id,r),t++);return t}search(e,t,r=10){let s=[];for(let i of this.records.values()){if(i.projectId!==e)continue;let o=sr(t,i.vector);s.push({id:i.id,score:o,metadata:i.metadata})}return s.sort((i,o)=>o.score-i.score).slice(0,r)}size(){return this.records.size}};function sr(n,e){if(n.length===0||e.length===0||n.length!==e.length)return 0;let t=0,r=0,s=0;for(let i=0;i<n.length;i++){let o=n[i]??0,a=e[i]??0;t+=o*a,r+=o*o,s+=a*a}return r===0||s===0?0:t/(Math.sqrt(r)*Math.sqrt(s))}function Oe(n){return n.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}_\-./]+/gu," ").split(/\s+/).map(e=>e.trim()).filter(e=>e.length>1)}function Ze(n,e){let t=n.toLowerCase().replaceAll("\\","/"),r=e.toLowerCase(),s=/\b(test|tests|spec|fixture|mock)\b/.test(r);return(t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t))&&!s?.35:t.includes("/generated/")||t.includes(".generated.")?.25:1}var ie=class{constructor(e){this.options=e}options;vectors=new ne;chunks=new Map;async initialize(){let{projectId:e,rootPath:t,storage:r,embeddings:s,graph:i,model:o}=this.options,a=new se(r),m=new oe(r),c=await new re().build(e,t,i.allSymbols(e));this.chunks.clear();for(let v of c)this.chunks.set(v.id,v);let l=await a.load(e),u=!l||l.chunks.length!==c.length||l.chunks.some(v=>!this.chunks.has(v.id));u&&await a.save({version:1,projectId:e,updatedAt:new Date().toISOString(),chunks:c});let d=await m.load(e),f=0;d&&d.model===o&&(f=this.vectors.importRecords(d.records));let h=new Set(c.map(v=>v.id)),p=0;for(let v of this.vectors.exportProject(e))h.has(v.id)||this.vectors.remove(v.id)&&p++;let b=c.filter(v=>{let R=this.vectors.get(v.id);return R?R.metadata?.contentHash!==v.contentHash:!0}),g=0,x=8,y=this.vectors.exportProject(e)[0]?.vector.length;for(let v=0;v<b.length;v+=x){let R=b.slice(v,v+x),dt=R.map(T=>[`file: ${T.filePath}`,T.symbolName?`symbol: ${T.symbolName}`:"",T.symbolType?`type: ${T.symbolType}`:"",T.content].filter(Boolean).join(`
5
- `)),pt=await s.embedMany(dt);for(let T=0;T<R.length;T++){let A=R[T],I=pt[T];if(!(!A||!I||I.length===0)){if(y===void 0&&(y=I.length),I.length!==y){console.warn(`[code-semantic] skip dimension mismatch: ${I.length} != ${y}`);continue}this.vectors.upsert({id:A.id,projectId:e,vector:I,metadata:{contentHash:A.contentHash,filePath:A.filePath,symbolName:A.symbolName,symbolType:A.symbolType,startLine:A.startLine,endLine:A.endLine}}),g++}}}let w=this.vectors.exportProject(e),P=g>0||p>0||!d||d.model!==o;return P&&await m.save({version:1,projectId:e,model:o,dimensions:w[0]?.vector.length??y??0,updatedAt:new Date().toISOString(),records:w}),{chunks:c.length,vectorsLoaded:f,vectorsIndexed:g,vectorsRemoved:p,totalVectors:w.length,savedChunks:u,savedVectors:P}}async search(e,t=8){let r=await this.options.embeddings.embed(e),s=this.vectors.search(this.options.projectId,r,Math.max(t*4,20)),i=new Set(Oe(e)),o=[];for(let a of s){let m=this.chunks.get(a.id);if(!m)continue;let c=new Set(Oe([m.filePath,m.symbolName??"",m.symbolType??"",m.content].join(" "))),l=0;for(let p of i)c.has(p)&&l++;let u=i.size===0?0:l/i.size,d=Math.max(0,a.score),f=Ze(m.filePath,e),h=(d*.75+u*.25)*f;o.push({chunk:m,score:h,vectorScore:d,lexicalScore:u})}return o.sort((a,m)=>m.score-a.score).slice(0,t)}size(){return this.chunks.size}};import{createHash as or}from"node:crypto";import{dirname as nr,relative as ae,resolve as ce}from"node:path";import*as C from"typescript";function N(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function Xe(n){return or("sha256").update(n).digest("hex").slice(0,24)}function K(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}function ir(n){let e=n;if(e.name&&C.isIdentifier(e.name))return e.name.text}var le=class{constructor(e){this.graph=e}graph;async resolveProject(e,t){let r=this.loadConfig(t),s=C.createProgram({rootNames:r.fileNames,options:r.options}),i=s.getTypeChecker(),o=[];for(let a of s.getSourceFiles()){if(a.isDeclarationFile)continue;let m=ce(a.fileName),c=N(ae(t,m));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=u=>{if(C.isCallExpression(u)){let d=this.resolveCall({projectId:e,rootPath:t,source:a,node:u,checker:i});d&&o.push(d)}C.isClassDeclaration(u)&&o.push(...this.resolveHeritage({projectId:e,rootPath:t,source:a,node:u,checker:i})),C.forEachChild(u,l)};l(a)}return{version:1,projectId:e,updatedAt:new Date().toISOString(),total:o.length,exact:o.filter(a=>a.confidence==="exact").length,high:o.filter(a=>a.confidence==="high").length,fallback:o.filter(a=>a.confidence==="fallback").length,resolutions:o}}resolveCall(e){let{projectId:t,rootPath:r,source:s,node:i,checker:o}=e,a;if(a=o.getResolvedSignature(i)?.declaration,!a){let c=o.getSymbolAtLocation(i.expression);a=c?.valueDeclaration??c?.declarations?.[0]}return a?this.fromDeclaration({projectId:t,rootPath:r,source:s,sourceNode:i,declaration:a,expression:i.expression.getText(s),kind:"CALL"}):this.fallbackCall(t,r,s,i)}resolveHeritage(e){let{projectId:t,rootPath:r,source:s,node:i,checker:o}=e,a=[];for(let m of i.heritageClauses??[])for(let c of m.types){let l=o.getSymbolAtLocation(c.expression),u=l?.valueDeclaration??l?.declarations?.[0];if(!u)continue;let d=this.fromDeclaration({projectId:t,rootPath:r,source:s,sourceNode:c,declaration:u,expression:c.getText(s),kind:m.token===C.SyntaxKind.ExtendsKeyword?"EXTENDS":"IMPLEMENTS"});d&&a.push(d)}return a}fromDeclaration(e){let t=e.declaration.getSourceFile();if(t.isDeclarationFile)return null;let r=N(ae(e.rootPath,ce(t.fileName)));if(r.startsWith("../")||r.includes("node_modules/"))return null;let s=K(t,e.declaration),i=ir(e.declaration)??e.expression.split(".").at(-1),o=this.findGraphSymbol(e.projectId,r,s,i),a=N(ae(e.rootPath,ce(e.source.fileName)));return{id:Xe([e.projectId,a,K(e.source,e.sourceNode),e.kind,r,s].join(":")),projectId:e.projectId,kind:e.kind,sourceFile:a,sourceLine:K(e.source,e.sourceNode),expression:e.expression,targetFile:r,targetLine:s,targetName:i,targetQualifiedName:o?.qualifiedName,targetSymbolId:o?.id,confidence:o?"exact":"high",resolver:"typescript-checker"}}fallbackCall(e,t,r,s){let i=s.expression.getText(r).split(".").at(-1);if(!i)return null;let o=this.graph.findByName(e,i).filter(c=>c.type==="function"||c.type==="method");if(o.length!==1)return null;let a=o[0],m=N(ae(t,ce(r.fileName)));return{id:Xe(`${e}:${m}:${K(r,s)}:${a.id}`),projectId:e,kind:"CALL",sourceFile:m,sourceLine:K(r,s),expression:s.expression.getText(r),targetFile:a.filePath,targetLine:a.startLine,targetName:a.name,targetQualifiedName:a.qualifiedName,targetSymbolId:a.id,confidence:"fallback",resolver:"graph-fallback"}}findGraphSymbol(e,t,r,s){let o=this.graph.allSymbols(e).filter(a=>N(a.filePath)===N(t)).filter(a=>typeof a.startLine=="number"&&typeof a.endLine=="number"&&a.startLine<=r&&a.endLine>=r);if(s){let a=o.find(m=>m.name===s||(m.qualifiedName?.endsWith(`.${s}`)??!1));if(a)return a}return o.sort((a,m)=>(a.endLine??0)-(a.startLine??0)-((m.endLine??0)-(m.startLine??0)))[0]}loadConfig(e){let t=C.findConfigFile(e,C.sys.fileExists,"tsconfig.json");if(t){let s=C.readConfigFile(t,C.sys.readFile);if(s.error)throw new Error(C.flattenDiagnosticMessageText(s.error.messageText,`
6
- `));return C.parseJsonConfigFileContent(s.config,C.sys,nr(t))}return{fileNames:C.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,checkJs:!1,target:C.ScriptTarget.ES2022,module:C.ModuleKind.NodeNext,moduleResolution:C.ModuleResolutionKind.NodeNext,skipLibCheck:!0,noEmit:!0}}}};import{createHash as ar}from"node:crypto";import{dirname as cr,relative as B,resolve as H}from"node:path";import*as S from"typescript";function k(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function _e(...n){return ar("sha256").update(n.join(":")).digest("hex").slice(0,24)}function W(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}var lr=new Set(["get","post","put","patch","delete","options","head"]),dr=new Set([S.SyntaxKind.EqualsToken,S.SyntaxKind.PlusEqualsToken,S.SyntaxKind.MinusEqualsToken,S.SyntaxKind.AsteriskEqualsToken,S.SyntaxKind.SlashEqualsToken,S.SyntaxKind.PercentEqualsToken,S.SyntaxKind.QuestionQuestionEqualsToken,S.SyntaxKind.AmpersandAmpersandEqualsToken,S.SyntaxKind.BarBarEqualsToken]),de=class{constructor(e){this.graph=e}graph;enrich(e,t,r){let s={routes:0,tests:0,usesType:0,writes:0,callReferences:0,properties:0},i=this.loadConfig(t),o=S.createProgram({rootNames:i.fileNames,options:i.options}),a=o.getTypeChecker();for(let m of o.getSourceFiles()){if(m.isDeclarationFile)continue;let c=k(B(t,H(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=this.fileNode(e,c);if(!l)continue;let u=d=>{if(S.isCallExpression(d)&&this.addRoute(e,t,m,l,d,a)&&s.routes++,S.isTypeReferenceNode(d)&&this.addTypeUse(e,t,m,d,a)&&s.usesType++,S.isBinaryExpression(d)&&dr.has(d.operatorToken.kind)){let f=this.addWrite(e,t,m,d.left,a);f.added&&(s.writes++,f.propertyCreated&&s.properties++)}if((S.isPrefixUnaryExpression(d)||S.isPostfixUnaryExpression(d))&&(d.operator===S.SyntaxKind.PlusPlusToken||d.operator===S.SyntaxKind.MinusMinusToken)){let f=this.addWrite(e,t,m,d.operand,a);f.added&&(s.writes++,f.propertyCreated&&s.properties++)}S.forEachChild(d,u)};u(m)}return s.tests+=this.addTestEdges(e),r&&(s.callReferences+=this.addResolvedCalls(e,r)),s}addRoute(e,t,r,s,i,o){if(!S.isPropertyAccessExpression(i.expression))return!1;let a=i.expression.name.text.toLowerCase();if(!lr.has(a))return!1;let m=i.arguments[0];if(!m||!(S.isStringLiteral(m)||S.isNoSubstitutionTemplateLiteral(m)))return!1;let c=m.text;if(!c.startsWith("/"))return!1;let l=W(r,i),u=_e(e,r.fileName,l,a,c);this.graph.getSymbol(u)||(this.graph.addSymbol({id:u,projectId:e,name:`${a.toUpperCase()} ${c}`,qualifiedName:`${a.toUpperCase()} ${c}`,type:"route",filePath:s.filePath,startLine:l,endLine:l}),this.graph.addEdge(this.edge(e,s.id,"DEFINES",u)));let d=i.arguments.at(-1);if(d){let f=this.resolveNodeSymbol(e,t,d,o);f&&this.graph.addEdge(this.edge(e,u,"ROUTE",f.id,{method:a.toUpperCase(),path:c}))}return!0}addTypeUse(e,t,r,s,i){let o=this.resolveNodeSymbol(e,t,s.typeName,i);if(!o)return!1;let a=this.containingSymbol(e,k(B(t,H(r.fileName))),W(r,s));return!a||a.id===o.id?!1:(this.graph.addEdge(this.edge(e,a.id,"USES_TYPE",o.id)),!0)}addWrite(e,t,r,s,i){let o=this.resolveTsSymbol(s,i),a=o?.valueDeclaration??o?.declarations?.[0];if(!a)return{added:!1,propertyCreated:!1};let m=a.getSourceFile();if(m.isDeclarationFile)return{added:!1,propertyCreated:!1};let c=k(B(t,H(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))return{added:!1,propertyCreated:!1};let l=W(m,a),u=this.findSymbolAt(e,c,l),d=!1;if(!u||u.type==="file"){let p=o?.getName()??s.getText(r),b=_e(e,c,"property",p,l);if(u=this.graph.getSymbol(b),!u){u={id:b,projectId:e,name:p,qualifiedName:p,type:"property",filePath:c,startLine:l,endLine:l},this.graph.addSymbol(u);let g=this.fileNode(e,c);g&&this.graph.addEdge(this.edge(e,g.id,"DEFINES",u.id)),d=!0}}if(!u)return{added:!1,propertyCreated:d};let f=k(B(t,H(r.fileName))),h=this.containingSymbol(e,f,W(r,s));return!h||h.id===u.id?{added:!1,propertyCreated:d}:(this.graph.addEdge(this.edge(e,h.id,"WRITES",u.id,{expression:s.getText(r)})),{added:!0,propertyCreated:d})}addTestEdges(e){let t=this.graph.allEdges(e),r=0;for(let s of t){if(s.type!=="IMPORTS")continue;let i=this.graph.getSymbol(s.from),o=this.graph.getSymbol(s.to);!i||!o||!this.isTestFile(i.filePath)||this.isTestFile(o.filePath)||(this.graph.addEdge(this.edge(e,i.id,"TESTS",o.id)),r++)}return r}addResolvedCalls(e,t){let r=0;for(let s of t.resolutions){if(s.kind!=="CALL"||!s.targetSymbolId)continue;let i=this.graph.getSymbol(s.targetSymbolId);if(!i)continue;let o=this.containingSymbol(e,s.sourceFile,s.sourceLine);!o||o.id===i.id||this.graph.allEdges(e).some(m=>m.type==="CALLS"&&m.from===o.id&&m.to===i.id)||(this.graph.addEdge(this.edge(e,o.id,"CALL_REFERENCE",i.id,{expression:s.expression,confidence:s.confidence,resolver:s.resolver})),r++)}return r}resolveNodeSymbol(e,t,r,s){let i=this.resolveTsSymbol(r,s),o=i?.valueDeclaration??i?.declarations?.[0];if(!o)return;let a=o.getSourceFile();if(a.isDeclarationFile)return;let m=k(B(t,H(a.fileName)));if(!(m.startsWith("../")||m.includes("node_modules/")))return this.findSymbolAt(e,m,W(a,o),i?.getName())}resolveTsSymbol(e,t){let r=t.getSymbolAtLocation(e);if(r&&r.flags&S.SymbolFlags.Alias)try{r=t.getAliasedSymbol(r)}catch{}return r}containingSymbol(e,t,r){return this.graph.allSymbols(e).filter(s=>k(s.filePath)===k(t)&&typeof s.startLine=="number"&&typeof s.endLine=="number"&&s.startLine<=r&&s.endLine>=r).sort((s,i)=>(s.endLine??0)-(s.startLine??0)-((i.endLine??0)-(i.startLine??0)))[0]}findSymbolAt(e,t,r,s){let i=this.graph.allSymbols(e).filter(o=>k(o.filePath)===k(t)&&typeof o.startLine=="number"&&typeof o.endLine=="number"&&o.startLine<=r&&o.endLine>=r).sort((o,a)=>(o.endLine??0)-(o.startLine??0)-((a.endLine??0)-(a.startLine??0)));if(s){let o=i.find(a=>a.name===s||(a.qualifiedName?.endsWith(`.${s}`)??!1));if(o)return o}return i[0]}fileNode(e,t){return this.graph.allSymbols(e).find(r=>r.type==="file"&&k(r.filePath)===k(t))}isTestFile(e){let t=k(e).toLowerCase();return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)}edge(e,t,r,s,i){return{id:_e(e,t,r,s,JSON.stringify(i??{})),projectId:e,from:t,to:s,type:r,metadata:i}}loadConfig(e){let t=S.findConfigFile(e,S.sys.fileExists,"tsconfig.json");if(t){let r=S.readConfigFile(t,S.sys.readFile);return S.parseJsonConfigFileContent(r.config,S.sys,cr(t))}return{fileNames:S.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,noEmit:!0,skipLibCheck:!0,target:S.ScriptTarget.ES2022,module:S.ModuleKind.NodeNext,moduleResolution:S.ModuleResolutionKind.NodeNext}}}};function pr(n){return n.replaceAll("\\","/").toLowerCase()}var M=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=[];for(let o of t){if(o.type!=="route"&&o.type!=="file")continue;let a=this.classify(o,r);a&&s.push({symbolId:o.id,filePath:o.filePath,name:o.name,kind:a.kind,score:a.score,reasons:a.reasons})}let i=new Map;for(let o of s){let a=o.kind==="route"?o.symbolId:o.filePath,m=i.get(a);(!m||o.score>m.score)&&i.set(a,o)}return[...i.values()].sort((o,a)=>a.score-o.score||o.filePath.localeCompare(a.filePath))}classify(e,t){let r=pr(e.filePath),s=[];if(e.type==="route")return{kind:"route",score:100,reasons:["HTTP route"]};let i=null,o=0;if(r.startsWith("bin/"))i="cli",o=100,s.push("bin executable");else if(/(^|\/)(cli)\.[^.]+$/.test(r))i="cli",o=90,s.push("CLI entry file");else if(/(^|\/)(main|server)\.[^.]+$/.test(r))i="main",o=90,s.push("main/server file");else if(r.includes("/runtime/")&&/(^|\/)(bootstrap|index)\.[^.]+$/.test(r))i="runtime",o=75,s.push("runtime bootstrap");else if(/(^|\/)index\.[^.]+$/.test(r)){let m=t.filter(l=>l.to===e.id&&l.type!=="DEFINES").length,c=t.filter(l=>l.from===e.id&&l.type!=="DEFINES").length;(r.startsWith("packages/")||m===0||c>0)&&(i="package",o=r.startsWith("packages/")?70:55,s.push("package/public index"))}return i?(t.filter(m=>m.to===e.id&&m.type!=="DEFINES").length===0&&(o+=10,s.push("no incoming dependency")),{kind:i,score:o,reasons:s}):null}};var mr={CALL_REFERENCE:6,CALLS:4,IMPORTS:3,USES_TYPE:4,WRITES:5,ROUTE:4,TESTS:1,INHERITS:5,IMPLEMENTS:5,DEFINES:.25},pe=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Map(t.map(c=>[c.id,c])),i=new Map,o=c=>{let l=i.get(c);return l||(l={symbols:0,incoming:0,outgoing:0,weightedIncoming:0,weightedOutgoing:0,writes:0,callReferences:0,crossFile:0},i.set(c,l)),l};for(let c of t)o(c.filePath).symbols++;for(let c of r){let l=s.get(c.from),u=s.get(c.to);if(!l||!u)continue;let d=mr[c.type]??1,f=o(l.filePath),h=o(u.filePath);f.outgoing++,h.incoming++,f.weightedOutgoing+=d,h.weightedIncoming+=d,c.type==="WRITES"&&f.writes++,c.type==="CALL_REFERENCE"&&f.callReferences++,l.filePath!==u.filePath&&(f.crossFile++,h.crossFile++)}let a=[...i.entries()].map(([c,l])=>{let u=Number((l.symbols*.4+l.weightedIncoming*1.75+l.weightedOutgoing*.65+l.crossFile*1.5+l.writes*3+l.callReferences*2).toFixed(2)),d=[];return l.incoming>=10&&d.push("high incoming dependency"),l.crossFile>=10&&d.push("high cross-file coupling"),l.callReferences>=5&&d.push("many exact call references"),l.writes>0&&d.push("contains write relationships"),l.symbols>=10&&d.push("high symbol density"),{filePath:c,score:u,symbols:l.symbols,incoming:l.incoming,outgoing:l.outgoing,reasons:d}}).filter(c=>c.score>0).sort((c,l)=>l.score-c.score||c.filePath.localeCompare(l.filePath));if(a.length===0)return[];let m=Math.max(1,Math.min(30,Math.ceil(a.length*.15)));return a.slice(0,m)}};function ur(n){return n.replaceAll("\\","/").toLowerCase()}var fr={CALL_REFERENCE:6,CALLS:4,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:6,IMPLEMENTS:6,ROUTE:3,TESTS:1},me=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Map(t.map(a=>[a.id,a])),i=[...new Set(t.map(a=>a.filePath))].sort(),o=new Map;for(let a of i)o.set(a,this.classifyPath(a));for(let a=0;a<3;a++){let m=!1;for(let c of i){let l=o.get(c);if(!l||l.layer!=="unknown")continue;let u=new Map;for(let f of r){let h=s.get(f.from),p=s.get(f.to);if(!h||!p||h.filePath===p.filePath)continue;let b=null;if(h.filePath===c?b=p.filePath:p.filePath===c&&(b=h.filePath),!b)continue;let g=o.get(b);if(!g||g.layer==="unknown"||g.layer==="tests")continue;let x=fr[f.type]??1;u.set(g.layer,(u.get(g.layer)??0)+x)}let d=[...u.entries()].sort((f,h)=>h[1]-f[1]||f[0].localeCompare(h[0]))[0];d&&d[1]>=4&&(o.set(c,{filePath:c,layer:d[0],confidence:.65,reasons:[`graph-neighbor vote=${d[1]}`]}),m=!0)}if(!m)break}return i.map(a=>o.get(a))}classifyPath(e){let t=ur(e);return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)?{filePath:e,layer:"tests",confidence:1,reasons:["test path"]}:t.startsWith("bin/")||t.includes("/mcp/")||t.includes("/cli/")||t.includes("/api/")||t.includes("/routes/")||t.includes("/hooks/")?{filePath:e,layer:"interface",confidence:.9,reasons:["interface boundary"]}:t.includes("/runtime/")||t.includes("/processor/")||t.includes("/retrieval/")||t.includes("/snapshot/")||t.includes("/code-intelligence/")?{filePath:e,layer:"application",confidence:.85,reasons:["application orchestration"]}:t.includes("/core/")||t.includes("/memory/")||/(^|\/)types\.[^.]+$/.test(t)?{filePath:e,layer:"domain",confidence:.9,reasons:["domain/core logic"]}:t.includes("/storage/")||t.includes("/production/")||t.includes("/security/")||t.includes("/config/")||t.includes("/utils/")?{filePath:e,layer:"infrastructure",confidence:.85,reasons:["infrastructure boundary"]}:{filePath:e,layer:"unknown",confidence:.35,reasons:[]}}};import{createHash as gr}from"node:crypto";var hr={CALL_REFERENCE:7,CALLS:3,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:7,IMPLEMENTS:7,ROUTE:4,TESTS:1};function yr(n){return gr("sha256").update(n).digest("hex").slice(0,12)}function ue(n){return n.replaceAll("\\","/")}function Sr(n){let t=ue(n).split("/").filter(Boolean);return t[0]==="src"&&t[1]?`src/${t[1]}`:t[0]==="packages"&&t[1]?`packages/${t[1]}`:t[0]==="tests"?"tests":t[0]==="bin"?"bin":t[0]??"root"}function br(n){let e=n.replace(/^src\//,"").replace(/^packages\//,"");return{"code-intelligence":"Code Intelligence",memory:"Memory",storage:"Storage",retrieval:"Retrieval",runtime:"Runtime",mcp:"MCP",hooks:"Hooks",security:"Security",snapshot:"Snapshots",production:"Production",capture:"Capture",processor:"Processor",core:"Core",tests:"Tests",bin:"CLI",sdk:"SDK",cli:"CLI"}[e]??e}var fe=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Map(t.map(d=>[d.id,d])),i=[...new Set(t.map(d=>ue(d.filePath)))].sort(),o=new Map,a=(d,f)=>{let h=[d,f].sort();return`${h[0]}\0${h[1]}`};for(let d of r){let f=s.get(d.from),h=s.get(d.to);if(!f||!h)continue;let p=ue(f.filePath),b=ue(h.filePath);if(p===b)continue;let g=hr[d.type]??0;if(g<=0)continue;let x=a(p,b),y=o.get(x);y?y.weight+=g:o.set(x,{a:[p,b].sort()[0],b:[p,b].sort()[1],weight:g})}let m=new Map;for(let d of i){let f=Sr(d),h=m.get(f)??[];h.push(d),m.set(f,h)}let c=[];for(let[d,f]of m){if(f.sort(),f.length<=30){c.push({subsystem:d,files:f});continue}let h=new Set(f),p=new Map;for(let y of f)p.set(y,new Set);for(let y of o.values())!h.has(y.a)||!h.has(y.b)||y.weight>=8&&(p.get(y.a)?.add(y.b),p.get(y.b)?.add(y.a));let b=new Set,g=[];for(let y of f){if(b.has(y))continue;let w=[y],P=[];for(b.add(y);w.length>0;){let v=w.shift();P.push(v);for(let R of p.get(v)??[])b.has(R)||(b.add(R),w.push(R))}g.push(P.sort())}let x=[];for(let y of g)y.length>=2?c.push({subsystem:d,files:y}):x.push(...y);x.length>0&&c.push({subsystem:`${d}/residual`,files:x.sort()})}let l=c.map(d=>({subsystem:d.subsystem,files:[...d.files]}));for(let d=0;d<3;d++){let f=!1;e:for(let h=0;h<l.length;h++){let p=l[h];if(!(!p||p.files.length>3))for(let b=0;b<l.length;b++){if(h===b)continue;let g=l[b];if(!g)continue;let x=0,y=new Set(p.files),w=new Set(g.files);for(let P of o.values())(y.has(P.a)&&w.has(P.b)||y.has(P.b)&&w.has(P.a))&&(x+=P.weight);if(x>=20){g.files=[...new Set([...g.files,...p.files])].sort(),l.splice(h,1),f=!0;break e}}}if(!f)break}let u=[];for(let d of l){let f=new Set(d.files),h=0,p=0;for(let w of o.values()){let P=f.has(w.a),v=f.has(w.b);P&&v?h+=w.weight:(P||v)&&(p+=w.weight)}let b=h+p,g=d.subsystem.replace(/\/residual$/,""),x=br(g),y=d.subsystem.endsWith("/residual")?`${x} Misc`:x;u.push({id:`cluster-${yr(`${d.subsystem}:${d.files.join("|")}`)}`,label:y,subsystem:g,files:d.files,size:d.files.length,internalWeight:h,externalWeight:p,cohesion:b>0?Number((h/b).toFixed(4)):0})}return u.sort((d,f)=>f.size-d.size||f.cohesion-d.cohesion||d.label.localeCompare(f.label))}};var ge=class{constructor(e){this.graph=e;this.entryPoints=new M(e),this.hotspots=new pe(e),this.layers=new me(e),this.clusters=new fe(e)}graph;entryPoints;hotspots;layers;clusters;analyze(e){let t=this.entryPoints.detect(e),r=this.hotspots.analyze(e),s=this.layers.detect(e),i=this.clusters.detect(e),o=new Set(this.graph.allSymbols(e).map(a=>a.filePath));return{version:1,projectId:e,updatedAt:new Date().toISOString(),summary:{files:o.size,entryPoints:t.length,hotspots:r.length,layers:s.length,clusters:i.length},entryPoints:t,hotspots:r,layers:s,clusters:i}}};var et=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE","TESTS"]);function Fe(n){return n.replaceAll("\\","/").toLowerCase()}function xr(n){let e=Fe(n);return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}function wr(n){let e=Fe(n.filePath);return e.startsWith("bin/")||/(^|\/)index\.[^.]+$/.test(e)||/(^|\/)(main|server|cli)\.[^.]+$/.test(e)}var he=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Set(new M(this.graph).detect(e).map(o=>o.symbolId)),i=[];for(let o of t){if(!["function","method","class","interface","property"].includes(o.type)||xr(o.filePath)||s.has(o.id)||wr(o)||r.filter(f=>f.to===o.id&&et.has(f.type)).length>0)continue;let m=r.filter(f=>f.from===o.id&&et.has(f.type)),c=["no incoming usage edge"],l=50;(o.type==="function"||o.type==="method")&&(l+=20,c.push("callable symbol")),o.type==="property"&&(l-=15),m.length===0&&(l+=10,c.push("no outgoing dependency")),Fe(o.filePath).includes("/internal/")&&(l+=10,c.push("internal implementation")),o.name.startsWith("_")&&(l+=5);let d=l>=75?"high":l>=55?"medium":"low";i.push({symbolId:o.id,name:o.name,qualifiedName:o.qualifiedName,type:o.type,filePath:o.filePath,startLine:o.startLine,confidence:d,score:l,reasons:c})}return i.sort((o,a)=>a.score-o.score||o.filePath.localeCompare(a.filePath)||o.name.localeCompare(a.name))}};var Er=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE"]),ye=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e).filter(o=>Er.has(o.type)),s=new Map(t.map(o=>[o.id,o]));return[...new Set(t.map(o=>o.filePath))].sort().map(o=>{let a=new Set,m=new Set,c=0,l=0;for(let u of r){let d=s.get(u.from),f=s.get(u.to);!d||!f||d.filePath===f.filePath||(d.filePath===o&&(a.add(f.filePath),c++),f.filePath===o&&(m.add(d.filePath),l++))}return{filePath:o,dependencies:[...a].sort(),dependents:[...m].sort(),outgoingEdges:c,incomingEdges:l}})}};var Se=class{constructor(e){this.graph=e}graph;analyze(e){let t=new he(this.graph).analyze(e),r=new ye(this.graph).analyze(e);return{version:1,projectId:e,updatedAt:new Date().toISOString(),summary:{deadCodeCandidates:t.length,highConfidenceDeadCode:t.filter(s=>s.confidence==="high").length,files:r.length},deadCode:t,dependencies:r}}};var be=class{constructor(e){this.graph=e}graph;build(e,t,r){let s=this.graph.allSymbols(e),i=this.graph.allEdges(e),o=new Map(t?.layers.map(p=>[p.filePath,p.layer])??[]),a=new Map;for(let p of t?.clusters??[])for(let b of p.files)a.set(b,{id:p.id,label:p.label});let m=new Map(t?.hotspots.map(p=>[p.filePath,p.score])??[]),c=new Map(r?.deadCode.map(p=>[p.symbolId,{confidence:p.confidence,score:p.score}])??[]),l=new Map,u=new Map;for(let p of i)u.set(p.from,(u.get(p.from)??0)+1),l.set(p.to,(l.get(p.to)??0)+1);let d=s.map(p=>{let b=a.get(p.filePath);return{id:p.id,name:p.name,qualifiedName:p.qualifiedName,type:p.type,filePath:p.filePath,layer:o.get(p.filePath),cluster:b?.id,clusterLabel:b?.label,hotspotScore:m.get(p.filePath),deadCode:c.get(p.id),incoming:l.get(p.id)??0,outgoing:u.get(p.id)??0}}),f=new Set(d.map(p=>p.id)),h=i.filter(p=>f.has(p.from)&&f.has(p.to)).map(p=>({source:p.from,target:p.to,type:p.type,confidence:typeof p.metadata?.confidence=="string"?p.metadata.confidence:void 0,resolver:typeof p.metadata?.resolver=="string"?p.metadata.resolver:void 0}));return{version:1,projectId:e,generatedAt:new Date().toISOString(),summary:{nodes:d.length,links:h.length,files:new Set(d.map(p=>p.filePath)).size,clusters:new Set(d.map(p=>p.cluster).filter(Boolean)).size},nodes:d,links:h}}};import{homedir as Wr}from"node:os";import{join as Ur}from"node:path";import{DeleteObjectCommand as Cr,GetObjectCommand as vr,HeadObjectCommand as Pr,ListObjectsV2Command as kr,PutObjectCommand as Tr,S3Client as Rr}from"@aws-sdk/client-s3";import{getSignedUrl as Ar}from"@aws-sdk/s3-request-presigner";var xe=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Rr({region:"us-east-1",endpoint:`https://s3.hf.co/${e.namespace}`,forcePathStyle:!0,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let s=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new Tr({Bucket:this.bucket,Key:e,Body:s,ContentType:r}))}async get(e){let t=await Ar(this.client,new vr({Bucket:this.bucket,Key:e}),{expiresIn:60}),r=await fetch(t,{redirect:"follow"});if(r.status===404)return null;if(!r.ok)throw new Error(`HF download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new Pr({Bucket:this.bucket,Key:e})),!0}catch(t){if(typeof t=="object"&&t!==null&&"$metadata"in t&&t.$metadata?.httpStatusCode===404)return!1;throw t}}async delete(e){await this.client.send(new Cr({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let s=await this.client.send(new kr({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of s.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=s.IsTruncated?s.NextContinuationToken:void 0}while(r);return t}};import{access as tt,mkdir as Lr,readFile as jr,readdir as Ir,rm as Nr,stat as rt,writeFile as Mr}from"node:fs/promises";import{dirname as Or,join as _r,relative as st,resolve as Fr}from"node:path";var U=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Fr(this.root,t)}async put(e,t){let r=this.path(e);await Lr(Or(r),{recursive:!0}),await Mr(r,t)}async get(e){try{return await jr(this.path(e))}catch(t){if(typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT")return null;throw t}}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await tt(this.path(e)),!0}catch{return!1}}async delete(e){await Nr(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await tt(t)}catch{return r}let s=async o=>{let a=await Ir(o,{withFileTypes:!0});for(let m of a){let c=_r(o,m.name);if(m.isDirectory()){await s(c);continue}let l=await rt(c);r.push({key:st(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await rt(t);return i.isDirectory()?await s(t):r.push({key:st(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};import{DeleteObjectCommand as $r,GetObjectCommand as Dr,HeadObjectCommand as Gr,ListObjectsV2Command as zr,PutObjectCommand as Kr,S3Client as Br}from"@aws-sdk/client-s3";import{getSignedUrl as Hr}from"@aws-sdk/s3-request-presigner";var V=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new Br({region:e.region??"us-east-1",endpoint:e.endpoint||void 0,forcePathStyle:e.forcePathStyle??!1,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let s=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new Kr({Bucket:this.bucket,Key:e,Body:s,ContentType:r}))}async get(e){let t=await Hr(this.client,new Dr({Bucket:this.bucket,Key:e}),{expiresIn:60}),r=await fetch(t,{redirect:"follow"});if(r.status===404)return null;if(!r.ok)throw new Error(`${this.name} download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new Gr({Bucket:this.bucket,Key:e})),!0}catch(t){if(typeof t=="object"&&t!==null&&"$metadata"in t&&t.$metadata?.httpStatusCode===404)return!1;throw t}}async delete(e){await this.client.send(new $r({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let s=await this.client.send(new zr({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of s.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=s.IsTruncated?s.NextContinuationToken:void 0}while(r);return t}};function $e(n,e){return console.warn(e),new U(n)}function ot(n){let e=n.localRoot??Ur(Wr(),".toolnet-memory","storage");if(n.provider==="r2"){let t=n.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new V({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):$e(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(n.provider==="s3"){let t=n.s3;return t?.bucket&&t.accessKeyId&&t.secretAccessKey?new V({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):$e(e,"[storage] S3 credentials missing. Using local fallback.")}if(n.provider==="huggingface"){let t=n.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new xe({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):$e(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new U(e)}function Vr(n){return new Promise(e=>setTimeout(e,n))}async function nt(n,e={}){let t=Math.max(1,e.attempts??3),r=e.baseDelayMs??150,s=e.maxDelayMs??2e3,i;for(let o=1;o<=t;o++)try{return await n()}catch(a){if(i=a,o>=t)break;let m=Math.min(s,r*2**(o-1)),c=Math.floor(Math.random()*Math.max(1,m*.2));await Vr(m+c)}throw i}var Jr=new Set(["put","get","getText","delete","list"]);function it(n,e={}){return new Proxy(n,{get(t,r){let s=Reflect.get(t,r,t);return typeof s!="function"?s:Jr.has(r)?(...i)=>nt(()=>Promise.resolve(s.apply(t,i)),e):s.bind(t)}})}function at(n){let e=n.trim().replace(/\s+/g,"_").replace(/[^A-Za-z0-9._-]/g,"_").replace(/_+/g,"_").replace(/^\.+|\.+$/g,"").slice(0,100);if(!e||e==="."||e==="..")throw new Error("Invalid project storage folder");return e}function ct(n){let e=n.replace(/^\/+/,"");if(e.startsWith("memories/"))return"memory/records/"+e.slice(9);if(e.startsWith("vectors/"))return"memory/vectors/"+e.slice(8);if(e.startsWith("graph/"))return"code/graph/"+e.slice(6);let t=e.match(/^(snapshots\/[^/]+\/)memories\/(.+)$/);if(t)return`${t[1]}memory/records/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)vectors\/(.+)$/),t)return`${t[1]}memory/vectors/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)graph\/(.+)$/),t)return`${t[1]}code/graph/${t[2]}`;let r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(r)return`${r[1]}memory/records/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),r)return`${r[1]}memory/vectors/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),r)return`${r[1]}code/graph/${r[2]}`;let s=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return s?`${s[1]}memory/records/${s[2]}`:(s=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),s?`${s[1]}memory/vectors/${s[2]}`:(s=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),s?`${s[1]}code/graph/${s[2]}`:e))}var we=class{constructor(e,t,r,s){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=at(s??r),this.sourcePrefix=`projects/${t}`,this.targetPrefix=`projects/${this.folder}`}provider;name;folder;sourcePrefix;targetPrefix;projectId;projectName;registryPromise;async registerProject(){let e=`${this.targetPrefix}/project.json`,t=new Date().toISOString(),r=t,s=await this.provider.getText(e);if(s){let o;try{o=JSON.parse(s)}catch(a){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${a instanceof Error?a.message:String(a)}`)}if(typeof o.id=="string"&&o.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${o.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof o.createdAt=="string"&&(r=o.createdAt)}let i={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(i,null,2)+`
7
- `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=ct(e),e===this.sourcePrefix)return this.targetPrefix;if(e.startsWith(`${this.sourcePrefix}/`))return this.targetPrefix+e.slice(this.sourcePrefix.length);if(e===this.targetPrefix||e.startsWith(`${this.targetPrefix}/`))return e;if(e.startsWith("projects/"))throw new Error(["Cross-project storage access denied.",`Current project: ${this.targetPrefix}`,`Requested key: ${e}`].join(" "));return e}async put(e,t,r){return await this.ensureRegistered(),this.provider.put(this.key(e),t,r)}async get(e){return await this.ensureRegistered(),this.provider.get(this.key(e))}async getText(e){return await this.ensureRegistered(),this.provider.getText(this.key(e))}async delete(e){return await this.ensureRegistered(),this.provider.delete(this.key(e))}async exists(e){return await this.ensureRegistered(),this.provider.exists(this.key(e))}async list(e){return await this.ensureRegistered(),this.provider.list(this.key(e))}};var Ee=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"graph","resolution","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var Ce=class{constructor(e){this.storage=e}storage;base(e){return["projects",e,"code","architecture"].join("/")}async load(e){let t=await this.storage.getText(`${this.base(e)}/current.json`);return t?JSON.parse(t):null}async save(e){let t=this.base(e.projectId),r=s=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:s},null,2);await Promise.all([this.storage.put(`${t}/current.json`,JSON.stringify(e,null,2),"application/json"),this.storage.put(`${t}/entry-points.json`,r(e.entryPoints),"application/json"),this.storage.put(`${t}/hotspots.json`,r(e.hotspots),"application/json"),this.storage.put(`${t}/layers.json`,r(e.layers),"application/json"),this.storage.put(`${t}/clusters.json`,r(e.clusters),"application/json")])}};var ve=class{constructor(e){this.storage=e}storage;base(e){return["projects",e,"code","analysis"].join("/")}async load(e){let t=await this.storage.getText(`${this.base(e)}/current.json`);return t?JSON.parse(t):null}async save(e){let t=this.base(e.projectId),r=s=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:s},null,2);await Promise.all([this.storage.put(`${t}/current.json`,JSON.stringify(e,null,2),"application/json"),this.storage.put(`${t}/dead-code.json`,r(e.deadCode),"application/json"),this.storage.put(`${t}/dependencies.json`,r(e.dependencies),"application/json")])}};var Pe=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","visualization","graph.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e,null,2),"application/json")}};async function lt(n,e={}){let t=Date.now();async function r(p,b,g){await e.onStage?.({id:p,title:b,state:"start"});let x=Date.now(),y=await g();return await e.onStage?.({id:p,title:b,state:"complete",durationMs:Date.now()-x}),y}let s=Be(),i=it(ot({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),{attempts:3}),o=new we(i,n.id,n.name,n.remote??n.name),a=new z(o),c=(await r("source-index","Source Index",async()=>{let p=await new te().index(n.id,n.rootPath);return await a.save({version:1,projectId:n.id,updatedAt:new Date().toISOString(),files:p.files,symbols:p.graph.allSymbols(n.id),edges:p.graph.allEdges(n.id)}),p})).graph,l=await r("type-resolution","Type Resolution",async()=>{let p=await new le(c).resolveProject(n.id,n.rootPath);return await new Ee(o).save(p),p});await r("rich-graph","Rich Graph",async()=>{let p=new de(c).enrich(n.id,n.rootPath,l),b=c.allSymbols(n.id),g=c.allEdges(n.id);return await a.save({version:1,projectId:n.id,updatedAt:new Date().toISOString(),files:b.filter(x=>x.type==="file").length,symbols:b,edges:g}),p});let u=await r("semantic-index","Semantic Code Index",async()=>new ie({projectId:n.id,rootPath:n.rootPath,model:process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",storage:o,embeddings:Je(),graph:c}).initialize()),d=await r("architecture","Architecture Intelligence",async()=>{let p=new ge(c).analyze(n.id);return await new Ce(o).save(p),p}),f=await r("analysis","Graph Analysis",async()=>{let p=new Se(c).analyze(n.id);return await new ve(o).save(p),p}),h=await r("visualization","3D Visualization Dataset",async()=>{let p=new be(c).build(n.id,d,f);return await new Pe(o).save(p),p});return{project:{id:n.id,name:n.name,remote:n.remote??n.name},storage:o.name,durationMs:Date.now()-t,graph:{symbols:c.allSymbols(n.id).length,edges:c.allEdges(n.id).length},resolution:{total:l.total,exact:l.exact,high:l.high,fallback:l.fallback},semantic:u,architecture:d.summary,analysis:f.summary,visualization:h.summary}}var j=new q().detect(),Ke=ze(j.rootPath,".toolnet"),De=ze(Ke,"index.lock"),es=ze(Ke,"last-index.json");qr(Ke,{recursive:!0});function ke(n){Xr(es,JSON.stringify(n,null,2)+`
8
- `,{encoding:"utf8",mode:384})}var Ge;try{Ge=Qr(De,"wx",384)}catch{console.error("\u274C Index already running for this project."),console.error(`Lock: ${De}`),process.exit(2)}var Te=new Date().toISOString(),J=[];try{console.log(),console.log("=============================================="),console.log(" ToolNet Production Index"),console.log("=============================================="),console.log(`Project : ${j.name}`),console.log(`Remote : projects/${j.remote??j.name}/`),console.log("Runtime : production/dist"),console.log("Snapshot: disabled"),ke({version:2,state:"running",startedAt:Te,completedStages:J,project:j});let n=await lt(j,{onStage:async e=>{e.state==="start"?(console.log(),console.log(`===== ${e.title} =====`)):(J.push(e.id),console.log(`\u2705 ${e.title} (${((e.durationMs??0)/1e3).toFixed(1)}s)`)),ke({version:2,state:"running",startedAt:Te,currentStage:e.id,completedStages:[...J],project:j})}});ke({version:2,state:"complete",startedAt:Te,finishedAt:new Date().toISOString(),completedStages:J,result:n}),console.log(),console.log("=============================================="),console.log(" FULL INDEX COMPLETE \u2705"),console.log("=============================================="),console.log(JSON.stringify(n,null,2))}catch(n){ke({version:2,state:"failed",startedAt:Te,failedAt:new Date().toISOString(),completedStages:J,error:n instanceof Error?n.message:String(n)}),console.error("FULL INDEX FAILED \u274C"),console.error(n),process.exitCode=1}finally{Ge!==void 0&&Yr(Ge),Zr(De,{force:!0})}
1
+ import{closeSync as ps,mkdirSync as ms,openSync as us,rmSync as fs,writeFileSync as gs}from"node:fs";import{join as Ye}from"node:path";import{existsSync as xt,readFileSync as Ct}from"node:fs";import{homedir as wt}from"node:os";import{join as Pt}from"node:path";function At(s){let e=s.trim();return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?(e=e.slice(1,-1),e.replace(/\\n/g,`
2
+ `).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\"/g,'"').replace(/\\\\/g,"\\")):e.length>=2&&e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function Lt(){let s=process.env.TOOLNET_GLOBAL_ENV??Pt(wt(),".config","toolnet-memory",".env");if(!xt(s))return;let e=Ct(s,"utf8");for(let t of e.split(/\r?\n/)){let r=t.trim();if(!r||r.startsWith("#"))continue;r.startsWith("export ")&&(r=r.slice(7));let o=r.indexOf("=");if(o<=0)continue;let i=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(i)&&process.env[i]===void 0&&(process.env[i]=At(r.slice(o+1)))}}Lt();function D(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function F(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function Je(){return{memory:{autoCapture:D(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:D(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:D(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:D(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:F(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:F(process.env.MEMORY_RERANK_TOP,10),finalContext:F(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:F(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",r2:{accountId:process.env.R2_ACCOUNT_ID,bucket:process.env.R2_BUCKET,accessKeyId:process.env.R2_ACCESS_KEY_ID,secretAccessKey:process.env.R2_SECRET_ACCESS_KEY},s3:{endpoint:process.env.S3_ENDPOINT,region:process.env.S3_REGION,bucket:process.env.S3_BUCKET,accessKeyId:process.env.S3_ACCESS_KEY_ID,secretAccessKey:process.env.S3_SECRET_ACCESS_KEY,forcePathStyle:D(process.env.S3_FORCE_PATH_STYLE,!1)},huggingface:{namespace:process.env.HF_NAMESPACE,bucket:process.env.HF_BUCKET,accessKeyId:process.env.HF_S3_ACCESS_KEY_ID,secretAccessKey:process.env.HF_S3_SECRET_ACCESS_KEY},localRoot:process.env.MEMORY_LOCAL_STORAGE_PATH},cache:{maxMb:F(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as It}from"node:crypto";import{existsSync as Oe,mkdirSync as Rt,readFileSync as Tt,renameSync as _t,writeFileSync as kt}from"node:fs";import{basename as Nt,dirname as Q,join as X,parse as Xe,resolve as K}from"node:path";var et=".toolnet",Ot="project.json";function Mt(s){return It("sha256").update(s).digest("hex").slice(0,16)}function Me(s){return X(s,et,Ot)}function jt(s){return Oe(Me(s))}function Dt(s,e){let t=K(s),r=Xe(t).root;for(;;){if(jt(t))return t;if(t===r||e&&t===K(e))break;let o=Q(t);if(o===t)break;t=o}return null}function Ft(s){let e=K(s),t=Xe(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>Oe(X(e,i))))return e;if(e===t)break;let o=Q(e);if(o===e)break;e=o}return K(s)}function Kt(s){let e;try{e=JSON.parse(Tt(s,"utf8"))}catch(o){throw new Error(`Invalid ToolNet project manifest: ${s}: ${o instanceof Error?o.message:String(o)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${s}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${s}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${s}`);let r=new Date().toISOString();return{version:1,id:t.id,name:t.name,remote:typeof t.remote=="string"&&t.remote.trim()?t.remote:t.name,rootPath:typeof t.rootPath=="string"?t.rootPath:Q(Q(s)),createdAt:typeof t.createdAt=="string"?t.createdAt:r,updatedAt:typeof t.updatedAt=="string"?t.updatedAt:r,graphVersion:typeof t.graphVersion=="number"?t.graphVersion:0,memoryVersion:typeof t.memoryVersion=="number"?t.memoryVersion:0,metadata:t.metadata&&typeof t.metadata=="object"?t.metadata:void 0}}function Qe(s,e){let t=X(s,et);Rt(t,{recursive:!0});let r=Me(s),o=`${r}.tmp-${process.pid}`;kt(o,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),_t(o,r)}function Ze(s,e){return{id:s.id,name:s.name,remote:s.remote,rootPath:e,createdAt:s.createdAt,updatedAt:s.updatedAt,graphVersion:s.graphVersion,memoryVersion:s.memoryVersion,metadata:s.metadata}}var Z=class{detect(e=process.cwd()){let t=K(e),r=Ft(t),i=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>Oe(X(r,l))),n=Dt(t,i?r:void 0);if(n){let l=Me(n),u=Kt(l);return u.rootPath!==n&&(u.rootPath=n,u.updatedAt=new Date().toISOString(),Qe(n,u)),Ze(u,n)}let a=new Date().toISOString(),m=Nt(r),c={version:1,id:Mt(r),name:m,remote:m,rootPath:r,createdAt:a,updatedAt:a,graphVersion:0,memoryVersion:0};return Qe(r,c),Ze(c,r)}};var $t=[{type:"openai_key",regex:/\bsk-[A-Za-z0-9_\-]{20,}\b/g},{type:"huggingface_token",regex:/\bhf_[A-Za-z0-9]{20,}\b/g},{type:"hf_s3_access_key",regex:/\bHFAK[A-Za-z0-9]{8,}\b/g},{type:"bearer_token",regex:/\bBearer\s+[A-Za-z0-9._\-]{16,}\b/gi},{type:"jwt",regex:/\beyJ[A-Za-z0-9_\-]{8,}\.[A-Za-z0-9_\-]{8,}\.[A-Za-z0-9_\-]{8,}\b/g},{type:"private_key",regex:/-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |OPENSSH )?PRIVATE KEY-----/g},{type:"password_assignment",regex:/\b(password|passwd|pwd)\s*[:=]\s*["']?[^"'\s]{6,}["']?/gi},{type:"secret_assignment",regex:/\b(secret|api[_-]?key|access[_-]?token|refresh[_-]?token)\s*[:=]\s*["']?[^"'\s]{8,}["']?/gi},{type:"cookie",regex:/\b(cookie|set-cookie)\s*[:=]\s*[^;\n]{8,}/gi}],ee=class{scan(e){let t=[];for(let r of $t){let o=new RegExp(r.regex.source,r.regex.flags);for(let i of e.matchAll(o))t.push({type:r.type,value:i[0]})}return t}hasSecrets(e){return this.scan(e).length>0}};var $=class{scanner=new ee;sanitize(e){let t=e,r=this.scanner.scan(e),o=new Set;for(let i of r)o.add(i.type),t=t.split(i.value).join(`[REDACTED:${i.type}]`);return{text:t,redacted:r.length,secretTypes:[...o]}}sanitizeValue(e){if(typeof e=="string")return this.sanitize(e).text;if(Array.isArray(e))return e.map(t=>this.sanitizeValue(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e)){let i=r.toLowerCase();i.includes("password")||i.includes("secret")||i.includes("token")||i.includes("cookie")||i.includes("authorization")?t[r]="[REDACTED]":t[r]=this.sanitizeValue(o)}return t}return e}};var tt=[{id:"openai-compatible",label:"OpenAI-compatible",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"alibaba",label:"Alibaba / DashScope",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"openrouter",label:"OpenRouter",defaultBaseUrl:"https://openrouter.ai/api/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"groq",label:"Groq",defaultBaseUrl:"https://api.groq.com/openai/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"deepseek",label:"DeepSeek",defaultBaseUrl:"https://api.deepseek.com",defaultModel:"deepseek-v4-flash",requiresApiKey:!0,transport:"openai-compatible"},{id:"nvidia",label:"NVIDIA NIM",defaultBaseUrl:"https://integrate.api.nvidia.com/v1",defaultModel:"deepseek-ai/deepseek-v4-pro",requiresApiKey:!0,transport:"openai-compatible"},{id:"gemini",label:"Gemini",defaultBaseUrl:"https://generativelanguage.googleapis.com/v1beta",requiresApiKey:!0,transport:"gemini"},{id:"huggingface",label:"Hugging Face",defaultBaseUrl:"https://router.huggingface.co/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"ollama",label:"Ollama / Local",defaultBaseUrl:"http://127.0.0.1:11434/v1",requiresApiKey:!1,transport:"openai-compatible"},{id:"custom",label:"Custom endpoint",requiresApiKey:!1,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"cloudflare",label:"Cloudflare Workers AI",requiresApiKey:!0,requiresAccountId:!0,transport:"cloudflare"}];function te(s){let e=tt.find(t=>t.id===s);if(!e)throw new Error(`Unsupported AI provider: ${s}`);return e}function re(s){return tt.some(e=>e.id===s)}function g(s){return process.env[s]?.trim()||void 0}function P(...s){return s.find(e=>!!e?.trim())}function rt(){if(g("GROQ_API_KEY"))return"groq";if(g("DEEPSEEK_API_KEY"))return"deepseek";if(g("NVIDIA_API_KEY")||g("NVIDIA_NIM_API_KEY"))return"nvidia";if(g("OPENROUTER_API_KEY"))return"openrouter";if(g("ALIBABA_API_KEY")||g("DASHSCOPE_API_KEY"))return"alibaba";if(g("GEMINI_API_KEY")||g("GOOGLE_API_KEY"))return"gemini";if(g("CLOUDFLARE_API_TOKEN")&&g("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(g("HF_TOKEN"))return"huggingface";if(g("OLLAMA_MODEL")||g("OLLAMA_BASE_URL"))return"ollama"}function Gt(){let s=g("TOOLNET_LLM_PROVIDER");return s&&re(s)?s:rt()??"openai-compatible"}function je(s){let e=te(s);switch(s){case"alibaba":return{provider:s,apiKey:P(g("ALIBABA_API_KEY"),g("DASHSCOPE_API_KEY")),baseUrl:P(g("ALIBABA_BASE_URL"),g("DASHSCOPE_BASE_URL"),e.defaultBaseUrl),model:P(g("ALIBABA_MODEL"),g("DASHSCOPE_MODEL"))};case"openrouter":return{provider:s,apiKey:g("OPENROUTER_API_KEY"),baseUrl:P(g("OPENROUTER_BASE_URL"),e.defaultBaseUrl),model:g("OPENROUTER_MODEL")};case"groq":return{provider:s,apiKey:g("GROQ_API_KEY"),baseUrl:P(g("GROQ_BASE_URL"),e.defaultBaseUrl),model:g("GROQ_MODEL")};case"deepseek":return{provider:s,apiKey:g("DEEPSEEK_API_KEY"),baseUrl:P(g("DEEPSEEK_BASE_URL"),e.defaultBaseUrl),model:P(g("DEEPSEEK_MODEL"),e.defaultModel)};case"nvidia":return{provider:s,apiKey:P(g("NVIDIA_API_KEY"),g("NVIDIA_NIM_API_KEY")),baseUrl:P(g("NVIDIA_BASE_URL"),g("NVIDIA_NIM_BASE_URL"),e.defaultBaseUrl),model:P(g("NVIDIA_MODEL"),g("NVIDIA_NIM_MODEL"),e.defaultModel)};case"gemini":return{provider:s,apiKey:P(g("GEMINI_API_KEY"),g("GOOGLE_API_KEY")),baseUrl:P(g("GEMINI_BASE_URL"),e.defaultBaseUrl),model:g("GEMINI_MODEL")};case"huggingface":return{provider:s,apiKey:g("HF_TOKEN"),baseUrl:P(g("HF_INFERENCE_BASE_URL"),e.defaultBaseUrl),model:P(g("HF_LLM_MODEL"),g("HF_MODEL"))};case"ollama":return{provider:s,apiKey:g("OLLAMA_API_KEY"),baseUrl:P(g("OLLAMA_BASE_URL"),e.defaultBaseUrl),model:g("OLLAMA_MODEL")};case"cloudflare":return{provider:s,accountId:g("CLOUDFLARE_ACCOUNT_ID"),apiKey:g("CLOUDFLARE_API_TOKEN"),baseUrl:g("CLOUDFLARE_AI_BASE_URL"),model:g("CLOUDFLARE_MODEL")};case"custom":return{provider:s,apiKey:g("CUSTOM_AI_API_KEY"),baseUrl:g("CUSTOM_AI_BASE_URL"),model:g("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:P(g("OPENAI_API_KEY"),g("MODEL_API_KEY")),baseUrl:P(g("OPENAI_BASE_URL"),g("MODEL_BASE_URL")),model:P(g("OPENAI_MODEL"),g("MODEL_NAME"))}}}function Ut(){let s=g("TOOLNET_LLM_PROVIDER"),e=s&&re(s)?s:Gt(),t=te(e),r=je(e);return{provider:e,apiKey:P(g("TOOLNET_LLM_API_KEY"),r.apiKey),baseUrl:P(g("TOOLNET_LLM_BASE_URL"),r.baseUrl,t.defaultBaseUrl),model:P(g("TOOLNET_LLM_MODEL"),r.model,t.defaultModel),accountId:P(g("TOOLNET_LLM_ACCOUNT_ID"),r.accountId)}}function Bt(){let s=g("TOOLNET_EMBEDDING_PROVIDER");return s==="local"?"local":s&&re(s)?s:g("HF_TOKEN")||g("HF_EMBEDDING_MODEL")?"huggingface":"local"}function zt(){let s=Bt();if(s==="local")return{provider:"local",model:P(g("TOOLNET_EMBEDDING_MODEL"),g("LOCAL_EMBEDDING_MODEL"))};let e=te(s),t,r,o,i;switch(s){case"huggingface":t=g("HF_TOKEN"),r=g("HF_INFERENCE_BASE_URL"),o=g("HF_EMBEDDING_MODEL");break;case"openai-compatible":t=g("OPENAI_API_KEY"),r=g("OPENAI_BASE_URL"),o=g("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":t=g("CLOUDFLARE_API_TOKEN"),r=g("CLOUDFLARE_AI_BASE_URL"),o=g("CLOUDFLARE_EMBEDDING_MODEL"),i=g("CLOUDFLARE_ACCOUNT_ID");break;default:t=je(s).apiKey,r=je(s).baseUrl,o=g(`${s.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let n=P(g("TOOLNET_EMBEDDING_ACCOUNT_ID"),i),a=P(g("TOOLNET_EMBEDDING_BASE_URL"),r,e.defaultBaseUrl),m=s==="cloudflare"&&!a&&n?`https://api.cloudflare.com/client/v4/accounts/${n}/ai/v1`:a;return{provider:s,apiKey:P(g("TOOLNET_EMBEDDING_API_KEY"),t),baseUrl:m,model:P(g("TOOLNET_EMBEDDING_MODEL"),o),accountId:n}}function st(){let s=Ut(),e=zt();return{llm:s,embedding:e,legacy:{llm:!g("TOOLNET_LLM_PROVIDER")&&!!rt(),embedding:!g("TOOLNET_EMBEDDING_PROVIDER")&&!!(g("HF_TOKEN")||g("HF_EMBEDDING_MODEL"))}}}var se=class{constructor(e){this.options=e}options;name="gemini";async embed(e){let t=this.options.model.replace(/^models\//,""),o=`${this.options.baseUrl?.replace(/\/+$/,"")||"https://generativelanguage.googleapis.com/v1beta"}/models/${encodeURIComponent(t)}:embedContent?key=${encodeURIComponent(this.options.apiKey)}`,i=await fetch(o,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({model:`models/${t}`,content:{parts:[{text:e}]}})});if(!i.ok)throw new Error(`Gemini embedding failed: ${i.status} ${await i.text()}`);let a=(await i.json()).embedding?.values;if(!Array.isArray(a)||a.length===0)throw new Error("Gemini embedding returned invalid response");return a}async embedMany(e){let t=[];for(let r of e)t.push(await this.embed(r));return t}};import{createHash as Ht}from"node:crypto";var oe=class{name="hash-fallback";dimensions=128;async embed(e){let t=new Array(this.dimensions).fill(0),r=e.toLowerCase().split(/\s+/).filter(Boolean);for(let o of r){let n=Ht("sha256").update(o).digest().readUInt32BE(0)%this.dimensions;t[n]+=1}return Vt(t)}async embedMany(e){return Promise.all(e.map(t=>this.embed(t)))}};function Vt(s){let e=Math.sqrt(s.reduce((t,r)=>t+r*r,0));return e===0?s:s.map(t=>t/e)}var ne=class{constructor(e){this.options=e;this.dimensions=e.dimensions}options;name="openai-compatible";dimensions;async embed(e){let[t]=await this.embedMany([e]);return t}async embedMany(e){if(e.length===0)return[];let t=this.options.baseUrl.replace(/\/+$/,""),r=await fetch(`${t}/embeddings`,{method:"POST",headers:{"content-type":"application/json",...this.options.apiKey?{authorization:`Bearer ${this.options.apiKey}`}:{}},body:JSON.stringify({model:this.options.model,input:e})});if(!r.ok)throw new Error(`Embedding failed: ${r.status} ${await r.text()}`);let i=(await r.json()).data?.sort((n,a)=>(n.index??0)-(a.index??0)).map(n=>n.embedding);if(!i||i.length!==e.length||i.some(n=>!Array.isArray(n)))throw new Error("Embedding provider returned invalid response");return i}};var ie=class{constructor(e){this.options=e}options;name="huggingface";dimensions=384;async embed(e){let[t]=await this.embedMany([e]);return t}async embedMany(e){if(e.length===0)return[];let t=`https://router.huggingface.co/hf-inference/models/${this.options.model}/pipeline/feature-extraction`,r=await fetch(t,{method:"POST",headers:{Authorization:`Bearer ${this.options.token}`,"Content-Type":"application/json"},body:JSON.stringify({inputs:e,options:{wait_for_model:!0}})});if(!r.ok)throw new Error(`HF embedding failed: ${r.status} ${await r.text()}`);let o=await r.json();if(!Array.isArray(o))throw new Error("HF embedding returned invalid response");return o.map(i=>Wt(i))}};function Wt(s){if(!Array.isArray(s))throw new Error("Invalid embedding");if(s.length>0&&typeof s[0]=="number")return s;if(s.length>0&&Array.isArray(s[0])){let e=s;if(e.length===0)return[];let t=e[0].length,r=new Array(t).fill(0);for(let o of e)for(let i=0;i<t;i++)r[i]+=o[i]??0;for(let o=0;o<t;o++)r[o]/=e.length;return r}throw new Error("Unsupported embedding shape")}var De=class{constructor(e,t=new oe){this.primary=e;this.fallback=t}primary;fallback;name="resilient";async embed(e){if(this.primary)try{return await this.primary.embed(e)}catch(t){console.warn("[embedding] primary failed, fallback enabled:",t instanceof Error?t.message:t)}return this.fallback.embed(e)}async embedMany(e){if(this.primary)try{return await this.primary.embedMany(e)}catch(t){console.warn("[embedding] primary failed, fallback enabled:",t instanceof Error?t.message:t)}return this.fallback.embedMany(e)}};function Yt(s){return`https://api.cloudflare.com/client/v4/accounts/${s}/ai/v1`}function qt(){let s=st().embedding;if(s.provider==="local")return null;if(s.provider==="huggingface")return!s.apiKey||!s.model?null:new ie({token:s.apiKey,model:s.model});if(s.provider==="gemini")return!s.apiKey||!s.model?null:new se({apiKey:s.apiKey,model:s.model,baseUrl:s.baseUrl});let e=s.baseUrl;return s.provider==="cloudflare"&&!e&&s.accountId&&(e=Yt(s.accountId)),e&&s.model?new ne({apiKey:s.apiKey,baseUrl:e,model:s.model}):null}function ot(){return new De(qt())}import{readdir as Xt}from"node:fs/promises";import{extname as er,join as tr,relative as rr}from"node:path";import{basename as Jt}from"node:path";var Qt=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),Zt=new Set([".pem",".key",".p12",".pfx"]);function nt(s){let e=Jt(s).toLowerCase();if(Qt.has(e))return!0;for(let t of Zt)if(e.endsWith(t))return!0;return!1}var sr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),or=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function Fe(s){let e=[];async function t(r){let o=await Xt(r,{withFileTypes:!0});for(let i of o){if(or.has(i.name))continue;let n=tr(r,i.name);if(i.isDirectory()){await t(n);continue}sr.has(er(i.name))&&(nt(n)||e.push(rr(s,n)))}}return await t(s),e.sort()}import{readFile as nr}from"node:fs/promises";import{join as ir}from"node:path";import{createHash as ar}from"node:crypto";import*as C from"typescript";function it(s,e){return ar("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function Ke(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function $e(s,e,t){let r=ir(e,t),o=await nr(r,"utf8"),i=C.createSourceFile(t,o,C.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?C.ScriptKind.TSX:C.ScriptKind.TS),n=[],a=[],m=[],c=[],l={id:it(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:i.getLineAndCharacterOfPosition(i.end).line+1};n.push(l);let u=[],d=[];function f(h,v,S,x){let L=it(s,`${t}:${S}:${x??v}:${h.pos}`);return n.push({id:L,projectId:s,name:v,qualifiedName:x??v,type:S,filePath:t,startLine:Ke(i,h),endLine:i.getLineAndCharacterOfPosition(h.end).line+1}),L}function y(h){if(!C.isStringLiteral(h.moduleSpecifier))return;let v=[],S=h.importClause;if(S?.name&&v.push({localName:S.name.text,importedName:"default",kind:"default"}),S?.namedBindings&&C.isNamedImports(S.namedBindings))for(let x of S.namedBindings.elements)v.push({localName:x.name.text,importedName:x.propertyName?.text??x.name.text,kind:"named"});S?.namedBindings&&C.isNamespaceImport(S.namedBindings)&&v.push({localName:S.namedBindings.name.text,importedName:"*",kind:"namespace"}),a.push({source:h.moduleSpecifier.text,bindings:v})}function p(h,v){for(let S of h.heritageClauses??[])for(let x of S.types){let L=x.expression.getText(i).split(".").at(-1)??"";L&&c.push({fromId:v,targetName:L,type:S.token===C.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function E(h){let v=!1,S=!1;if(C.isImportDeclaration(h)&&y(h),C.isInterfaceDeclaration(h)&&f(h,h.name.text,"interface",h.name.text),C.isClassDeclaration(h)&&h.name){let x=f(h,h.name.text,"class",h.name.text);p(h,x),d.push({id:x,name:h.name.text}),S=!0}if(C.isFunctionDeclaration(h)&&h.name){let x=f(h,h.name.text,"function",h.name.text);u.push(x),v=!0}if(C.isMethodDeclaration(h)&&h.name){let x=h.name.getText(i),L=d.at(-1)?.name,A=f(h,x,"method",L?`${L}.${x}`:x);u.push(A),v=!0}if(C.isCallExpression(h)&&(C.isIdentifier(h.expression)&&m.push({callerId:u.at(-1),calleeName:h.expression.text,line:Ke(i,h)}),C.isPropertyAccessExpression(h.expression))){let x=h.expression;m.push({callerId:u.at(-1),qualifier:x.expression.getText(i),calleeName:x.name.text,line:Ke(i,h)})}C.forEachChild(h,E),v&&u.pop(),S&&d.pop()}return E(i),{filePath:t,symbols:n,imports:a,calls:m,heritage:c}}import{createHash as cr}from"node:crypto";import{dirname as lr,extname as dr,normalize as pr,posix as mr}from"node:path";var G=class{symbols=new Map;edges=new Map;addSymbol(e){this.symbols.set(e.id,e)}addEdge(e){this.edges.set(e.id,e)}getSymbol(e){return this.symbols.get(e)}findByName(e,t){return[...this.symbols.values()].filter(r=>r.projectId===e&&(r.name===t||r.qualifiedName===t))}allSymbols(e){return[...this.symbols.values()].filter(t=>t.projectId===e)}allEdges(e){return[...this.edges.values()].filter(t=>t.projectId===e)}import(e,t){for(let r of e)this.addSymbol(r);for(let r of t)this.addEdge(r)}clearProject(e){for(let[t,r]of this.symbols)r.projectId===e&&this.symbols.delete(t);for(let[t,r]of this.edges)r.projectId===e&&this.edges.delete(t)}};function ur(s,e,t,r){return cr("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function k(s){return pr(s).replaceAll("\\","/")}function Ge(s,e,t){if(!e.startsWith("."))return;let r=k(mr.join(lr(s),e)),o=dr(r),i;if(o===".js"){let n=r.slice(0,-3);i=[`${n}.ts`,`${n}.tsx`,`${n}.js`,`${n}.jsx`]}else if(o===".mjs"){let n=r.slice(0,-4);i=[`${n}.mts`,`${n}.ts`,`${n}.mjs`]}else if(o===".cjs"){let n=r.slice(0,-4);i=[`${n}.cts`,`${n}.ts`,`${n}.cjs`]}else o?i=[r]:i=[`${r}.ts`,`${r}.tsx`,`${r}.mts`,`${r}.cts`,`${r}.js`,`${r}.jsx`,`${r}.mjs`,`${r}.cjs`,`${r}/index.ts`,`${r}/index.tsx`,`${r}/index.js`,`${r}/index.jsx`];return i.find(n=>t.has(k(n)))}var U=class{build(e,t){let r=new G,o=new Map;for(let n of t)for(let a of n.symbols)r.addSymbol(a),a.type==="file"&&o.set(k(n.filePath),a);let i=new Set(o.keys());for(let n of t){let a=k(n.filePath),m=o.get(a);if(m){for(let c of n.symbols)c.id!==m.id&&r.addEdge(this.edge(e,m.id,"DEFINES",c.id));for(let c of n.imports){let l=Ge(a,c.source,i);if(!l)continue;let u=o.get(l);u&&r.addEdge(this.edge(e,m.id,"IMPORTS",u.id,{source:c.source}))}for(let c of n.heritage){let l=r.findByName(e,c.targetName).filter(u=>u.type==="class"||u.type==="interface");for(let u of l)r.addEdge(this.edge(e,c.fromId,c.type,u.id))}for(let c of n.calls){if(!c.callerId)continue;let l=this.resolveCallTargets(e,n,c.calleeName,c.qualifier,t,r,i);for(let u of l)u.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",u.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,o,i,n,a){let m=k(t.filePath),c=n.findByName(e,r).filter(l=>k(l.filePath)===m);if(!o&&c.length)return c;if(o)for(let l of t.imports){if(!l.bindings.find(f=>f.kind==="namespace"&&f.localName===o))continue;let d=Ge(m,l.source,a);if(d)return n.findByName(e,r).filter(f=>k(f.filePath)===d)}for(let l of t.imports){let u=l.bindings.find(p=>p.localName===r);if(!u)continue;let d=Ge(m,l.source,a);if(!d)continue;let f=u.importedName==="default"?r:u.importedName,y=n.findByName(e,f).filter(p=>k(p.filePath)===d);if(y.length)return y}return n.findByName(e,r).filter(l=>l.type==="function"||l.type==="method")}edge(e,t,r,o,i){return{id:ur(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:i}}};var ae=class{async index(e,t){let r=await Fe(t),o=[];for(let n of r)try{o.push(await $e(e,t,n))}catch(a){console.warn(`[indexer] skipped ${n}:`,a instanceof Error?a.message:a)}let i=new U().build(e,o);return{files:o.length,symbols:i.allSymbols(e).length,edges:i.allEdges(e).length,graph:i}}};import{execFile as fr}from"node:child_process";import{promisify as gr}from"node:util";var Vo=gr(fr);var B=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"graph","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};import{createHash as hr}from"node:crypto";import{readFile as yr}from"node:fs/promises";import{join as Sr}from"node:path";function at(s){return hr("sha256").update(s).digest("hex")}var ce=class{sanitizer=new $;async build(e,t,r,o={}){let i=o.maxLines??80,n=o.overlapLines??10,a=new Map;for(let c of r){let l=a.get(c.filePath)??[];l.push(c),a.set(c.filePath,l)}let m=[];for(let[c,l]of a){let u;try{u=await yr(Sr(t,c),"utf8")}catch{continue}let d=u.split(/\r?\n/),f=l.filter(y=>y.type!=="file"&&typeof y.startLine=="number"&&typeof y.endLine=="number");if(f.length>0)for(let y of f)m.push(...this.chunkRange({projectId:e,filePath:c,lines:d,symbol:y,startLine:y.startLine,endLine:y.endLine,maxLines:i,overlapLines:n}));else m.push(...this.chunkRange({projectId:e,filePath:c,lines:d,startLine:1,endLine:Math.max(1,d.length),maxLines:i,overlapLines:n}))}return m}chunkRange(e){let{projectId:t,filePath:r,lines:o,symbol:i,maxLines:n}=e,a=Math.min(e.overlapLines,Math.max(0,n-1)),m=Math.max(1,e.startLine),c=Math.min(o.length,Math.max(m,e.endLine)),l=[],u=m,d=0;for(;u<=c;){let f=Math.min(c,u+n-1),y=o.slice(u-1,f).join(`
4
+ `).trim();if(y){let p=this.sanitizer.sanitize(y).text,E=at(p),h=[t,r,i?.id??"file",String(d),E].join(":");l.push({id:at(h).slice(0,32),projectId:t,filePath:r,symbolId:i?.id,symbolName:i?.qualifiedName??i?.name,symbolType:i?.type,startLine:u,endLine:f,content:p,contentHash:E})}if(f>=c)break;u=f-a+1,d++}return l}};var le=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","chunks","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var de=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","vectors","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var pe=class{records=new Map;upsert(e){this.records.set(e.id,e)}get(e){return this.records.get(e)}has(e){return this.records.has(e)}remove(e){return this.records.delete(e)}clearProject(e){let t=0;for(let[r,o]of this.records)o.projectId===e&&(this.records.delete(r),t++);return t}exportProject(e){return[...this.records.values()].filter(t=>t.projectId===e)}importRecords(e){let t=0;for(let r of e)!r?.id||!r?.projectId||!Array.isArray(r.vector)||(this.records.set(r.id,r),t++);return t}search(e,t,r=10){let o=[];for(let i of this.records.values()){if(i.projectId!==e)continue;let n=br(t,i.vector);o.push({id:i.id,score:n,metadata:i.metadata})}return o.sort((i,n)=>n.score-i.score).slice(0,r)}size(){return this.records.size}};function br(s,e){if(s.length===0||e.length===0||s.length!==e.length)return 0;let t=0,r=0,o=0;for(let i=0;i<s.length;i++){let n=s[i]??0,a=e[i]??0;t+=n*a,r+=n*n,o+=a*a}return r===0||o===0?0:t/(Math.sqrt(r)*Math.sqrt(o))}function Ue(s){return s.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}_\-./]+/gu," ").split(/\s+/).map(e=>e.trim()).filter(e=>e.length>1)}function ct(s,e){let t=s.toLowerCase().replaceAll("\\","/"),r=e.toLowerCase(),o=/\b(test|tests|spec|fixture|mock)\b/.test(r);return(t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t))&&!o?.35:t.includes("/generated/")||t.includes(".generated.")?.25:1}var me=class{constructor(e){this.options=e}options;vectors=new pe;chunks=new Map;async initialize(){let{projectId:e,rootPath:t,storage:r,embeddings:o,graph:i,model:n}=this.options,a=new le(r),m=new de(r),c=await new ce().build(e,t,i.allSymbols(e));this.chunks.clear();for(let A of c)this.chunks.set(A.id,A);let l=await a.load(e),u=!l||l.chunks.length!==c.length||l.chunks.some(A=>!this.chunks.has(A.id));u&&await a.save({version:1,projectId:e,updatedAt:new Date().toISOString(),chunks:c});let d=await m.load(e),f=0;d&&d.model===n&&(f=this.vectors.importRecords(d.records));let y=new Set(c.map(A=>A.id)),p=0;for(let A of this.vectors.exportProject(e))y.has(A.id)||this.vectors.remove(A.id)&&p++;let E=c.filter(A=>{let T=this.vectors.get(A.id);return T?T.metadata?.contentHash!==A.contentHash:!0}),h=0,v=8,S=this.vectors.exportProject(e)[0]?.vector.length;for(let A=0;A<E.length;A+=v){let T=E.slice(A,A+v),Et=T.map(R=>[`file: ${R.filePath}`,R.symbolName?`symbol: ${R.symbolName}`:"",R.symbolType?`type: ${R.symbolType}`:"",R.content].filter(Boolean).join(`
5
+ `)),vt=await o.embedMany(Et);for(let R=0;R<T.length;R++){let _=T[R],O=vt[R];if(!(!_||!O||O.length===0)){if(S===void 0&&(S=O.length),O.length!==S){console.warn(`[code-semantic] skip dimension mismatch: ${O.length} != ${S}`);continue}this.vectors.upsert({id:_.id,projectId:e,vector:O,metadata:{contentHash:_.contentHash,filePath:_.filePath,symbolName:_.symbolName,symbolType:_.symbolType,startLine:_.startLine,endLine:_.endLine}}),h++}}}let x=this.vectors.exportProject(e),L=h>0||p>0||!d||d.model!==n;return L&&await m.save({version:1,projectId:e,model:n,dimensions:x[0]?.vector.length??S??0,updatedAt:new Date().toISOString(),records:x}),{chunks:c.length,vectorsLoaded:f,vectorsIndexed:h,vectorsRemoved:p,totalVectors:x.length,savedChunks:u,savedVectors:L}}async search(e,t=8){let r=await this.options.embeddings.embed(e),o=this.vectors.search(this.options.projectId,r,Math.max(t*4,20)),i=new Set(Ue(e)),n=[];for(let a of o){let m=this.chunks.get(a.id);if(!m)continue;let c=new Set(Ue([m.filePath,m.symbolName??"",m.symbolType??"",m.content].join(" "))),l=0;for(let p of i)c.has(p)&&l++;let u=i.size===0?0:l/i.size,d=Math.max(0,a.score),f=ct(m.filePath,e),y=(d*.75+u*.25)*f;n.push({chunk:m,score:y,vectorScore:d,lexicalScore:u})}return n.sort((a,m)=>m.score-a.score).slice(0,t)}size(){return this.chunks.size}};import{createHash as Er}from"node:crypto";import{dirname as vr,relative as ue,resolve as fe}from"node:path";import*as w from"typescript";function M(s){return s.replaceAll("\\","/").replace(/^\.\//,"")}function lt(s){return Er("sha256").update(s).digest("hex").slice(0,24)}function z(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}function xr(s){let e=s;if(e.name&&w.isIdentifier(e.name))return e.name.text}var ge=class{constructor(e){this.graph=e}graph;async resolveProject(e,t){let r=this.loadConfig(t),o=w.createProgram({rootNames:r.fileNames,options:r.options}),i=o.getTypeChecker(),n=[];for(let a of o.getSourceFiles()){if(a.isDeclarationFile)continue;let m=fe(a.fileName),c=M(ue(t,m));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=u=>{if(w.isCallExpression(u)){let d=this.resolveCall({projectId:e,rootPath:t,source:a,node:u,checker:i});d&&n.push(d)}w.isClassDeclaration(u)&&n.push(...this.resolveHeritage({projectId:e,rootPath:t,source:a,node:u,checker:i})),w.forEachChild(u,l)};l(a)}return{version:1,projectId:e,updatedAt:new Date().toISOString(),total:n.length,exact:n.filter(a=>a.confidence==="exact").length,high:n.filter(a=>a.confidence==="high").length,fallback:n.filter(a=>a.confidence==="fallback").length,resolutions:n}}resolveCall(e){let{projectId:t,rootPath:r,source:o,node:i,checker:n}=e,a;if(a=n.getResolvedSignature(i)?.declaration,!a){let c=n.getSymbolAtLocation(i.expression);a=c?.valueDeclaration??c?.declarations?.[0]}return a?this.fromDeclaration({projectId:t,rootPath:r,source:o,sourceNode:i,declaration:a,expression:i.expression.getText(o),kind:"CALL"}):this.fallbackCall(t,r,o,i)}resolveHeritage(e){let{projectId:t,rootPath:r,source:o,node:i,checker:n}=e,a=[];for(let m of i.heritageClauses??[])for(let c of m.types){let l=n.getSymbolAtLocation(c.expression),u=l?.valueDeclaration??l?.declarations?.[0];if(!u)continue;let d=this.fromDeclaration({projectId:t,rootPath:r,source:o,sourceNode:c,declaration:u,expression:c.getText(o),kind:m.token===w.SyntaxKind.ExtendsKeyword?"EXTENDS":"IMPLEMENTS"});d&&a.push(d)}return a}fromDeclaration(e){let t=e.declaration.getSourceFile();if(t.isDeclarationFile)return null;let r=M(ue(e.rootPath,fe(t.fileName)));if(r.startsWith("../")||r.includes("node_modules/"))return null;let o=z(t,e.declaration),i=xr(e.declaration)??e.expression.split(".").at(-1),n=this.findGraphSymbol(e.projectId,r,o,i),a=M(ue(e.rootPath,fe(e.source.fileName)));return{id:lt([e.projectId,a,z(e.source,e.sourceNode),e.kind,r,o].join(":")),projectId:e.projectId,kind:e.kind,sourceFile:a,sourceLine:z(e.source,e.sourceNode),expression:e.expression,targetFile:r,targetLine:o,targetName:i,targetQualifiedName:n?.qualifiedName,targetSymbolId:n?.id,confidence:n?"exact":"high",resolver:"typescript-checker"}}fallbackCall(e,t,r,o){let i=o.expression.getText(r).split(".").at(-1);if(!i)return null;let n=this.graph.findByName(e,i).filter(c=>c.type==="function"||c.type==="method");if(n.length!==1)return null;let a=n[0],m=M(ue(t,fe(r.fileName)));return{id:lt(`${e}:${m}:${z(r,o)}:${a.id}`),projectId:e,kind:"CALL",sourceFile:m,sourceLine:z(r,o),expression:o.expression.getText(r),targetFile:a.filePath,targetLine:a.startLine,targetName:a.name,targetQualifiedName:a.qualifiedName,targetSymbolId:a.id,confidence:"fallback",resolver:"graph-fallback"}}findGraphSymbol(e,t,r,o){let n=this.graph.allSymbols(e).filter(a=>M(a.filePath)===M(t)).filter(a=>typeof a.startLine=="number"&&typeof a.endLine=="number"&&a.startLine<=r&&a.endLine>=r);if(o){let a=n.find(m=>m.name===o||(m.qualifiedName?.endsWith(`.${o}`)??!1));if(a)return a}return n.sort((a,m)=>(a.endLine??0)-(a.startLine??0)-((m.endLine??0)-(m.startLine??0)))[0]}loadConfig(e){let t=w.findConfigFile(e,w.sys.fileExists,"tsconfig.json");if(t){let o=w.readConfigFile(t,w.sys.readFile);if(o.error)throw new Error(w.flattenDiagnosticMessageText(o.error.messageText,`
6
+ `));return w.parseJsonConfigFileContent(o.config,w.sys,vr(t))}return{fileNames:w.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,checkJs:!1,target:w.ScriptTarget.ES2022,module:w.ModuleKind.NodeNext,moduleResolution:w.ModuleResolutionKind.NodeNext,skipLibCheck:!0,noEmit:!0}}}};import{createHash as Cr}from"node:crypto";import{dirname as wr,relative as H,resolve as V}from"node:path";import*as b from"typescript";function I(s){return s.replaceAll("\\","/").replace(/^\.\//,"")}function Be(...s){return Cr("sha256").update(s.join(":")).digest("hex").slice(0,24)}function W(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}var Pr=new Set(["get","post","put","patch","delete","options","head"]),Ar=new Set([b.SyntaxKind.EqualsToken,b.SyntaxKind.PlusEqualsToken,b.SyntaxKind.MinusEqualsToken,b.SyntaxKind.AsteriskEqualsToken,b.SyntaxKind.SlashEqualsToken,b.SyntaxKind.PercentEqualsToken,b.SyntaxKind.QuestionQuestionEqualsToken,b.SyntaxKind.AmpersandAmpersandEqualsToken,b.SyntaxKind.BarBarEqualsToken]),he=class{constructor(e){this.graph=e}graph;enrich(e,t,r){let o={routes:0,tests:0,usesType:0,writes:0,callReferences:0,properties:0},i=this.loadConfig(t),n=b.createProgram({rootNames:i.fileNames,options:i.options}),a=n.getTypeChecker();for(let m of n.getSourceFiles()){if(m.isDeclarationFile)continue;let c=I(H(t,V(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=this.fileNode(e,c);if(!l)continue;let u=d=>{if(b.isCallExpression(d)&&this.addRoute(e,t,m,l,d,a)&&o.routes++,b.isTypeReferenceNode(d)&&this.addTypeUse(e,t,m,d,a)&&o.usesType++,b.isBinaryExpression(d)&&Ar.has(d.operatorToken.kind)){let f=this.addWrite(e,t,m,d.left,a);f.added&&(o.writes++,f.propertyCreated&&o.properties++)}if((b.isPrefixUnaryExpression(d)||b.isPostfixUnaryExpression(d))&&(d.operator===b.SyntaxKind.PlusPlusToken||d.operator===b.SyntaxKind.MinusMinusToken)){let f=this.addWrite(e,t,m,d.operand,a);f.added&&(o.writes++,f.propertyCreated&&o.properties++)}b.forEachChild(d,u)};u(m)}return o.tests+=this.addTestEdges(e),r&&(o.callReferences+=this.addResolvedCalls(e,r)),o}addRoute(e,t,r,o,i,n){if(!b.isPropertyAccessExpression(i.expression))return!1;let a=i.expression.name.text.toLowerCase();if(!Pr.has(a))return!1;let m=i.arguments[0];if(!m||!(b.isStringLiteral(m)||b.isNoSubstitutionTemplateLiteral(m)))return!1;let c=m.text;if(!c.startsWith("/"))return!1;let l=W(r,i),u=Be(e,r.fileName,l,a,c);this.graph.getSymbol(u)||(this.graph.addSymbol({id:u,projectId:e,name:`${a.toUpperCase()} ${c}`,qualifiedName:`${a.toUpperCase()} ${c}`,type:"route",filePath:o.filePath,startLine:l,endLine:l}),this.graph.addEdge(this.edge(e,o.id,"DEFINES",u)));let d=i.arguments.at(-1);if(d){let f=this.resolveNodeSymbol(e,t,d,n);f&&this.graph.addEdge(this.edge(e,u,"ROUTE",f.id,{method:a.toUpperCase(),path:c}))}return!0}addTypeUse(e,t,r,o,i){let n=this.resolveNodeSymbol(e,t,o.typeName,i);if(!n)return!1;let a=this.containingSymbol(e,I(H(t,V(r.fileName))),W(r,o));return!a||a.id===n.id?!1:(this.graph.addEdge(this.edge(e,a.id,"USES_TYPE",n.id)),!0)}addWrite(e,t,r,o,i){let n=this.resolveTsSymbol(o,i),a=n?.valueDeclaration??n?.declarations?.[0];if(!a)return{added:!1,propertyCreated:!1};let m=a.getSourceFile();if(m.isDeclarationFile)return{added:!1,propertyCreated:!1};let c=I(H(t,V(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))return{added:!1,propertyCreated:!1};let l=W(m,a),u=this.findSymbolAt(e,c,l),d=!1;if(!u||u.type==="file"){let p=n?.getName()??o.getText(r),E=Be(e,c,"property",p,l);if(u=this.graph.getSymbol(E),!u){u={id:E,projectId:e,name:p,qualifiedName:p,type:"property",filePath:c,startLine:l,endLine:l},this.graph.addSymbol(u);let h=this.fileNode(e,c);h&&this.graph.addEdge(this.edge(e,h.id,"DEFINES",u.id)),d=!0}}if(!u)return{added:!1,propertyCreated:d};let f=I(H(t,V(r.fileName))),y=this.containingSymbol(e,f,W(r,o));return!y||y.id===u.id?{added:!1,propertyCreated:d}:(this.graph.addEdge(this.edge(e,y.id,"WRITES",u.id,{expression:o.getText(r)})),{added:!0,propertyCreated:d})}addTestEdges(e){let t=this.graph.allEdges(e),r=0;for(let o of t){if(o.type!=="IMPORTS")continue;let i=this.graph.getSymbol(o.from),n=this.graph.getSymbol(o.to);!i||!n||!this.isTestFile(i.filePath)||this.isTestFile(n.filePath)||(this.graph.addEdge(this.edge(e,i.id,"TESTS",n.id)),r++)}return r}addResolvedCalls(e,t){let r=0;for(let o of t.resolutions){if(o.kind!=="CALL"||!o.targetSymbolId)continue;let i=this.graph.getSymbol(o.targetSymbolId);if(!i)continue;let n=this.containingSymbol(e,o.sourceFile,o.sourceLine);!n||n.id===i.id||this.graph.allEdges(e).some(m=>m.type==="CALLS"&&m.from===n.id&&m.to===i.id)||(this.graph.addEdge(this.edge(e,n.id,"CALL_REFERENCE",i.id,{expression:o.expression,confidence:o.confidence,resolver:o.resolver})),r++)}return r}resolveNodeSymbol(e,t,r,o){let i=this.resolveTsSymbol(r,o),n=i?.valueDeclaration??i?.declarations?.[0];if(!n)return;let a=n.getSourceFile();if(a.isDeclarationFile)return;let m=I(H(t,V(a.fileName)));if(!(m.startsWith("../")||m.includes("node_modules/")))return this.findSymbolAt(e,m,W(a,n),i?.getName())}resolveTsSymbol(e,t){let r=t.getSymbolAtLocation(e);if(r&&r.flags&b.SymbolFlags.Alias)try{r=t.getAliasedSymbol(r)}catch{}return r}containingSymbol(e,t,r){return this.graph.allSymbols(e).filter(o=>I(o.filePath)===I(t)&&typeof o.startLine=="number"&&typeof o.endLine=="number"&&o.startLine<=r&&o.endLine>=r).sort((o,i)=>(o.endLine??0)-(o.startLine??0)-((i.endLine??0)-(i.startLine??0)))[0]}findSymbolAt(e,t,r,o){let i=this.graph.allSymbols(e).filter(n=>I(n.filePath)===I(t)&&typeof n.startLine=="number"&&typeof n.endLine=="number"&&n.startLine<=r&&n.endLine>=r).sort((n,a)=>(n.endLine??0)-(n.startLine??0)-((a.endLine??0)-(a.startLine??0)));if(o){let n=i.find(a=>a.name===o||(a.qualifiedName?.endsWith(`.${o}`)??!1));if(n)return n}return i[0]}fileNode(e,t){return this.graph.allSymbols(e).find(r=>r.type==="file"&&I(r.filePath)===I(t))}isTestFile(e){let t=I(e).toLowerCase();return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)}edge(e,t,r,o,i){return{id:Be(e,t,r,o,JSON.stringify(i??{})),projectId:e,from:t,to:o,type:r,metadata:i}}loadConfig(e){let t=b.findConfigFile(e,b.sys.fileExists,"tsconfig.json");if(t){let r=b.readConfigFile(t,b.sys.readFile);return b.parseJsonConfigFileContent(r.config,b.sys,wr(t))}return{fileNames:b.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,noEmit:!0,skipLibCheck:!0,target:b.ScriptTarget.ES2022,module:b.ModuleKind.NodeNext,moduleResolution:b.ModuleResolutionKind.NodeNext}}}};function Lr(s){return s.replaceAll("\\","/").toLowerCase()}var j=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),o=[];for(let n of t){if(n.type!=="route"&&n.type!=="file")continue;let a=this.classify(n,r);a&&o.push({symbolId:n.id,filePath:n.filePath,name:n.name,kind:a.kind,score:a.score,reasons:a.reasons})}let i=new Map;for(let n of o){let a=n.kind==="route"?n.symbolId:n.filePath,m=i.get(a);(!m||n.score>m.score)&&i.set(a,n)}return[...i.values()].sort((n,a)=>a.score-n.score||n.filePath.localeCompare(a.filePath))}classify(e,t){let r=Lr(e.filePath),o=[];if(e.type==="route")return{kind:"route",score:100,reasons:["HTTP route"]};let i=null,n=0;if(r.startsWith("bin/"))i="cli",n=100,o.push("bin executable");else if(/(^|\/)(cli)\.[^.]+$/.test(r))i="cli",n=90,o.push("CLI entry file");else if(/(^|\/)(main|server)\.[^.]+$/.test(r))i="main",n=90,o.push("main/server file");else if(r.includes("/runtime/")&&/(^|\/)(bootstrap|index)\.[^.]+$/.test(r))i="runtime",n=75,o.push("runtime bootstrap");else if(/(^|\/)index\.[^.]+$/.test(r)){let m=t.filter(l=>l.to===e.id&&l.type!=="DEFINES").length,c=t.filter(l=>l.from===e.id&&l.type!=="DEFINES").length;(r.startsWith("packages/")||m===0||c>0)&&(i="package",n=r.startsWith("packages/")?70:55,o.push("package/public index"))}return i?(t.filter(m=>m.to===e.id&&m.type!=="DEFINES").length===0&&(n+=10,o.push("no incoming dependency")),{kind:i,score:n,reasons:o}):null}};var Ir={CALL_REFERENCE:6,CALLS:4,IMPORTS:3,USES_TYPE:4,WRITES:5,ROUTE:4,TESTS:1,INHERITS:5,IMPLEMENTS:5,DEFINES:.25},ye=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),o=new Map(t.map(c=>[c.id,c])),i=new Map,n=c=>{let l=i.get(c);return l||(l={symbols:0,incoming:0,outgoing:0,weightedIncoming:0,weightedOutgoing:0,writes:0,callReferences:0,crossFile:0},i.set(c,l)),l};for(let c of t)n(c.filePath).symbols++;for(let c of r){let l=o.get(c.from),u=o.get(c.to);if(!l||!u)continue;let d=Ir[c.type]??1,f=n(l.filePath),y=n(u.filePath);f.outgoing++,y.incoming++,f.weightedOutgoing+=d,y.weightedIncoming+=d,c.type==="WRITES"&&f.writes++,c.type==="CALL_REFERENCE"&&f.callReferences++,l.filePath!==u.filePath&&(f.crossFile++,y.crossFile++)}let a=[...i.entries()].map(([c,l])=>{let u=Number((l.symbols*.4+l.weightedIncoming*1.75+l.weightedOutgoing*.65+l.crossFile*1.5+l.writes*3+l.callReferences*2).toFixed(2)),d=[];return l.incoming>=10&&d.push("high incoming dependency"),l.crossFile>=10&&d.push("high cross-file coupling"),l.callReferences>=5&&d.push("many exact call references"),l.writes>0&&d.push("contains write relationships"),l.symbols>=10&&d.push("high symbol density"),{filePath:c,score:u,symbols:l.symbols,incoming:l.incoming,outgoing:l.outgoing,reasons:d}}).filter(c=>c.score>0).sort((c,l)=>l.score-c.score||c.filePath.localeCompare(l.filePath));if(a.length===0)return[];let m=Math.max(1,Math.min(30,Math.ceil(a.length*.15)));return a.slice(0,m)}};function Rr(s){return s.replaceAll("\\","/").toLowerCase()}var Tr={CALL_REFERENCE:6,CALLS:4,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:6,IMPLEMENTS:6,ROUTE:3,TESTS:1},Se=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),o=new Map(t.map(a=>[a.id,a])),i=[...new Set(t.map(a=>a.filePath))].sort(),n=new Map;for(let a of i)n.set(a,this.classifyPath(a));for(let a=0;a<3;a++){let m=!1;for(let c of i){let l=n.get(c);if(!l||l.layer!=="unknown")continue;let u=new Map;for(let f of r){let y=o.get(f.from),p=o.get(f.to);if(!y||!p||y.filePath===p.filePath)continue;let E=null;if(y.filePath===c?E=p.filePath:p.filePath===c&&(E=y.filePath),!E)continue;let h=n.get(E);if(!h||h.layer==="unknown"||h.layer==="tests")continue;let v=Tr[f.type]??1;u.set(h.layer,(u.get(h.layer)??0)+v)}let d=[...u.entries()].sort((f,y)=>y[1]-f[1]||f[0].localeCompare(y[0]))[0];d&&d[1]>=4&&(n.set(c,{filePath:c,layer:d[0],confidence:.65,reasons:[`graph-neighbor vote=${d[1]}`]}),m=!0)}if(!m)break}return i.map(a=>n.get(a))}classifyPath(e){let t=Rr(e);return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)?{filePath:e,layer:"tests",confidence:1,reasons:["test path"]}:t.startsWith("bin/")||t.includes("/mcp/")||t.includes("/cli/")||t.includes("/api/")||t.includes("/routes/")||t.includes("/hooks/")?{filePath:e,layer:"interface",confidence:.9,reasons:["interface boundary"]}:t.includes("/runtime/")||t.includes("/processor/")||t.includes("/retrieval/")||t.includes("/snapshot/")||t.includes("/code-intelligence/")?{filePath:e,layer:"application",confidence:.85,reasons:["application orchestration"]}:t.includes("/core/")||t.includes("/memory/")||/(^|\/)types\.[^.]+$/.test(t)?{filePath:e,layer:"domain",confidence:.9,reasons:["domain/core logic"]}:t.includes("/storage/")||t.includes("/production/")||t.includes("/security/")||t.includes("/config/")||t.includes("/utils/")?{filePath:e,layer:"infrastructure",confidence:.85,reasons:["infrastructure boundary"]}:{filePath:e,layer:"unknown",confidence:.35,reasons:[]}}};import{createHash as _r}from"node:crypto";var kr={CALL_REFERENCE:7,CALLS:3,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:7,IMPLEMENTS:7,ROUTE:4,TESTS:1};function Nr(s){return _r("sha256").update(s).digest("hex").slice(0,12)}function be(s){return s.replaceAll("\\","/")}function Or(s){let t=be(s).split("/").filter(Boolean);return t[0]==="src"&&t[1]?`src/${t[1]}`:t[0]==="packages"&&t[1]?`packages/${t[1]}`:t[0]==="tests"?"tests":t[0]==="bin"?"bin":t[0]??"root"}function Mr(s){let e=s.replace(/^src\//,"").replace(/^packages\//,"");return{"code-intelligence":"Code Intelligence",memory:"Memory",storage:"Storage",retrieval:"Retrieval",runtime:"Runtime",mcp:"MCP",hooks:"Hooks",security:"Security",snapshot:"Snapshots",production:"Production",capture:"Capture",processor:"Processor",core:"Core",tests:"Tests",bin:"CLI",sdk:"SDK",cli:"CLI"}[e]??e}var Ee=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),o=new Map(t.map(d=>[d.id,d])),i=[...new Set(t.map(d=>be(d.filePath)))].sort(),n=new Map,a=(d,f)=>{let y=[d,f].sort();return`${y[0]}\0${y[1]}`};for(let d of r){let f=o.get(d.from),y=o.get(d.to);if(!f||!y)continue;let p=be(f.filePath),E=be(y.filePath);if(p===E)continue;let h=kr[d.type]??0;if(h<=0)continue;let v=a(p,E),S=n.get(v);S?S.weight+=h:n.set(v,{a:[p,E].sort()[0],b:[p,E].sort()[1],weight:h})}let m=new Map;for(let d of i){let f=Or(d),y=m.get(f)??[];y.push(d),m.set(f,y)}let c=[];for(let[d,f]of m){if(f.sort(),f.length<=30){c.push({subsystem:d,files:f});continue}let y=new Set(f),p=new Map;for(let S of f)p.set(S,new Set);for(let S of n.values())!y.has(S.a)||!y.has(S.b)||S.weight>=8&&(p.get(S.a)?.add(S.b),p.get(S.b)?.add(S.a));let E=new Set,h=[];for(let S of f){if(E.has(S))continue;let x=[S],L=[];for(E.add(S);x.length>0;){let A=x.shift();L.push(A);for(let T of p.get(A)??[])E.has(T)||(E.add(T),x.push(T))}h.push(L.sort())}let v=[];for(let S of h)S.length>=2?c.push({subsystem:d,files:S}):v.push(...S);v.length>0&&c.push({subsystem:`${d}/residual`,files:v.sort()})}let l=c.map(d=>({subsystem:d.subsystem,files:[...d.files]}));for(let d=0;d<3;d++){let f=!1;e:for(let y=0;y<l.length;y++){let p=l[y];if(!(!p||p.files.length>3))for(let E=0;E<l.length;E++){if(y===E)continue;let h=l[E];if(!h)continue;let v=0,S=new Set(p.files),x=new Set(h.files);for(let L of n.values())(S.has(L.a)&&x.has(L.b)||S.has(L.b)&&x.has(L.a))&&(v+=L.weight);if(v>=20){h.files=[...new Set([...h.files,...p.files])].sort(),l.splice(y,1),f=!0;break e}}}if(!f)break}let u=[];for(let d of l){let f=new Set(d.files),y=0,p=0;for(let x of n.values()){let L=f.has(x.a),A=f.has(x.b);L&&A?y+=x.weight:(L||A)&&(p+=x.weight)}let E=y+p,h=d.subsystem.replace(/\/residual$/,""),v=Mr(h),S=d.subsystem.endsWith("/residual")?`${v} Misc`:v;u.push({id:`cluster-${Nr(`${d.subsystem}:${d.files.join("|")}`)}`,label:S,subsystem:h,files:d.files,size:d.files.length,internalWeight:y,externalWeight:p,cohesion:E>0?Number((y/E).toFixed(4)):0})}return u.sort((d,f)=>f.size-d.size||f.cohesion-d.cohesion||d.label.localeCompare(f.label))}};var ve=class{constructor(e){this.graph=e;this.entryPoints=new j(e),this.hotspots=new ye(e),this.layers=new Se(e),this.clusters=new Ee(e)}graph;entryPoints;hotspots;layers;clusters;analyze(e){let t=this.entryPoints.detect(e),r=this.hotspots.analyze(e),o=this.layers.detect(e),i=this.clusters.detect(e),n=new Set(this.graph.allSymbols(e).map(a=>a.filePath));return{version:1,projectId:e,updatedAt:new Date().toISOString(),summary:{files:n.size,entryPoints:t.length,hotspots:r.length,layers:o.length,clusters:i.length},entryPoints:t,hotspots:r,layers:o,clusters:i}}};var dt=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE","TESTS"]);function ze(s){return s.replaceAll("\\","/").toLowerCase()}function jr(s){let e=ze(s);return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}function Dr(s){let e=ze(s.filePath);return e.startsWith("bin/")||/(^|\/)index\.[^.]+$/.test(e)||/(^|\/)(main|server|cli)\.[^.]+$/.test(e)}var xe=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),o=new Set(new j(this.graph).detect(e).map(n=>n.symbolId)),i=[];for(let n of t){if(!["function","method","class","interface","property"].includes(n.type)||jr(n.filePath)||o.has(n.id)||Dr(n)||r.filter(f=>f.to===n.id&&dt.has(f.type)).length>0)continue;let m=r.filter(f=>f.from===n.id&&dt.has(f.type)),c=["no incoming usage edge"],l=50;(n.type==="function"||n.type==="method")&&(l+=20,c.push("callable symbol")),n.type==="property"&&(l-=15),m.length===0&&(l+=10,c.push("no outgoing dependency")),ze(n.filePath).includes("/internal/")&&(l+=10,c.push("internal implementation")),n.name.startsWith("_")&&(l+=5);let d=l>=75?"high":l>=55?"medium":"low";i.push({symbolId:n.id,name:n.name,qualifiedName:n.qualifiedName,type:n.type,filePath:n.filePath,startLine:n.startLine,confidence:d,score:l,reasons:c})}return i.sort((n,a)=>a.score-n.score||n.filePath.localeCompare(a.filePath)||n.name.localeCompare(a.name))}};var Fr=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE"]),Ce=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e).filter(n=>Fr.has(n.type)),o=new Map(t.map(n=>[n.id,n]));return[...new Set(t.map(n=>n.filePath))].sort().map(n=>{let a=new Set,m=new Set,c=0,l=0;for(let u of r){let d=o.get(u.from),f=o.get(u.to);!d||!f||d.filePath===f.filePath||(d.filePath===n&&(a.add(f.filePath),c++),f.filePath===n&&(m.add(d.filePath),l++))}return{filePath:n,dependencies:[...a].sort(),dependents:[...m].sort(),outgoingEdges:c,incomingEdges:l}})}};var we=class{constructor(e){this.graph=e}graph;analyze(e){let t=new xe(this.graph).analyze(e),r=new Ce(this.graph).analyze(e);return{version:1,projectId:e,updatedAt:new Date().toISOString(),summary:{deadCodeCandidates:t.length,highConfidenceDeadCode:t.filter(o=>o.confidence==="high").length,files:r.length},deadCode:t,dependencies:r}}};var Pe=class{constructor(e){this.graph=e}graph;build(e,t,r){let o=this.graph.allSymbols(e),i=this.graph.allEdges(e),n=new Map(t?.layers.map(p=>[p.filePath,p.layer])??[]),a=new Map;for(let p of t?.clusters??[])for(let E of p.files)a.set(E,{id:p.id,label:p.label});let m=new Map(t?.hotspots.map(p=>[p.filePath,p.score])??[]),c=new Map(r?.deadCode.map(p=>[p.symbolId,{confidence:p.confidence,score:p.score}])??[]),l=new Map,u=new Map;for(let p of i)u.set(p.from,(u.get(p.from)??0)+1),l.set(p.to,(l.get(p.to)??0)+1);let d=o.map(p=>{let E=a.get(p.filePath);return{id:p.id,name:p.name,qualifiedName:p.qualifiedName,type:p.type,filePath:p.filePath,layer:n.get(p.filePath),cluster:E?.id,clusterLabel:E?.label,hotspotScore:m.get(p.filePath),deadCode:c.get(p.id),incoming:l.get(p.id)??0,outgoing:u.get(p.id)??0}}),f=new Set(d.map(p=>p.id)),y=i.filter(p=>f.has(p.from)&&f.has(p.to)).map(p=>({source:p.from,target:p.to,type:p.type,confidence:typeof p.metadata?.confidence=="string"?p.metadata.confidence:void 0,resolver:typeof p.metadata?.resolver=="string"?p.metadata.resolver:void 0}));return{version:1,projectId:e,generatedAt:new Date().toISOString(),summary:{nodes:d.length,links:y.length,files:new Set(d.map(p=>p.filePath)).size,clusters:new Set(d.map(p=>p.cluster).filter(Boolean)).size},nodes:d,links:y}}};import{homedir as as}from"node:os";import{join as cs}from"node:path";import{DeleteObjectCommand as Kr,GetObjectCommand as $r,HeadObjectCommand as Gr,ListObjectsV2Command as Ur,PutObjectCommand as Br,S3Client as zr}from"@aws-sdk/client-s3";import{getSignedUrl as Hr}from"@aws-sdk/s3-request-presigner";var Ae=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new zr({region:"us-east-1",endpoint:`https://s3.hf.co/${e.namespace}`,forcePathStyle:!0,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let o=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new Br({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await Hr(this.client,new $r({Bucket:this.bucket,Key:e}),{expiresIn:60}),r=await fetch(t,{redirect:"follow"});if(r.status===404)return null;if(!r.ok)throw new Error(`HF download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new Gr({Bucket:this.bucket,Key:e})),!0}catch(t){if(typeof t=="object"&&t!==null&&"$metadata"in t&&t.$metadata?.httpStatusCode===404)return!1;throw t}}async delete(e){await this.client.send(new Kr({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Ur({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of o.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};import{access as pt,mkdir as Vr,readFile as Wr,readdir as Yr,rm as qr,stat as mt,writeFile as Jr}from"node:fs/promises";import{dirname as Qr,join as Zr,relative as ut,resolve as Xr}from"node:path";var Y=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Xr(this.root,t)}async put(e,t){let r=this.path(e);await Vr(Qr(r),{recursive:!0}),await Jr(r,t)}async get(e){try{return await Wr(this.path(e))}catch(t){if(typeof t=="object"&&t!==null&&"code"in t&&t.code==="ENOENT")return null;throw t}}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await pt(this.path(e)),!0}catch{return!1}}async delete(e){await qr(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await pt(t)}catch{return r}let o=async n=>{let a=await Yr(n,{withFileTypes:!0});for(let m of a){let c=Zr(n,m.name);if(m.isDirectory()){await o(c);continue}let l=await mt(c);r.push({key:ut(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await mt(t);return i.isDirectory()?await o(t):r.push({key:ut(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};import{DeleteObjectCommand as es,GetObjectCommand as ts,HeadObjectCommand as rs,ListObjectsV2Command as ss,PutObjectCommand as os,S3Client as ns}from"@aws-sdk/client-s3";import{getSignedUrl as is}from"@aws-sdk/s3-request-presigner";var q=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new ns({region:e.region??"us-east-1",endpoint:e.endpoint||void 0,forcePathStyle:e.forcePathStyle??!1,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let o=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new os({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await is(this.client,new ts({Bucket:this.bucket,Key:e}),{expiresIn:60}),r=await fetch(t,{redirect:"follow"});if(r.status===404)return null;if(!r.ok)throw new Error(`${this.name} download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new rs({Bucket:this.bucket,Key:e})),!0}catch(t){if(typeof t=="object"&&t!==null&&"$metadata"in t&&t.$metadata?.httpStatusCode===404)return!1;throw t}}async delete(e){await this.client.send(new es({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new ss({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of o.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};function He(s,e){return console.warn(e),new Y(s)}function ft(s){let e=s.localRoot??cs(as(),".toolnet-memory","storage");if(s.provider==="r2"){let t=s.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new q({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):He(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(s.provider==="s3"){let t=s.s3;return t?.bucket&&t.accessKeyId&&t.secretAccessKey?new q({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):He(e,"[storage] S3 credentials missing. Using local fallback.")}if(s.provider==="huggingface"){let t=s.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new Ae({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):He(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new Y(e)}function ls(s){return new Promise(e=>setTimeout(e,s))}async function gt(s,e={}){let t=Math.max(1,e.attempts??3),r=e.baseDelayMs??150,o=e.maxDelayMs??2e3,i;for(let n=1;n<=t;n++)try{return await s()}catch(a){if(i=a,n>=t)break;let m=Math.min(o,r*2**(n-1)),c=Math.floor(Math.random()*Math.max(1,m*.2));await ls(m+c)}throw i}var ds=new Set(["put","get","getText","delete","list"]);function ht(s,e={}){return new Proxy(s,{get(t,r){let o=Reflect.get(t,r,t);return typeof o!="function"?o:ds.has(r)?(...i)=>gt(()=>Promise.resolve(o.apply(t,i)),e):o.bind(t)}})}function yt(s){let e=s.trim().replace(/\s+/g,"_").replace(/[^A-Za-z0-9._-]/g,"_").replace(/_+/g,"_").replace(/^\.+|\.+$/g,"").slice(0,100);if(!e||e==="."||e==="..")throw new Error("Invalid project storage folder");return e}function St(s){let e=s.replace(/^\/+/,"");if(e.startsWith("memories/"))return"memory/records/"+e.slice(9);if(e.startsWith("vectors/"))return"memory/vectors/"+e.slice(8);if(e.startsWith("graph/"))return"code/graph/"+e.slice(6);let t=e.match(/^(snapshots\/[^/]+\/)memories\/(.+)$/);if(t)return`${t[1]}memory/records/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)vectors\/(.+)$/),t)return`${t[1]}memory/vectors/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)graph\/(.+)$/),t)return`${t[1]}code/graph/${t[2]}`;let r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(r)return`${r[1]}memory/records/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),r)return`${r[1]}memory/vectors/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),r)return`${r[1]}code/graph/${r[2]}`;let o=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return o?`${o[1]}memory/records/${o[2]}`:(o=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),o?`${o[1]}memory/vectors/${o[2]}`:(o=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),o?`${o[1]}code/graph/${o[2]}`:e))}var Le=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=yt(o??r),this.sourcePrefix=`projects/${t}`,this.targetPrefix=`projects/${this.folder}`}provider;name;folder;sourcePrefix;targetPrefix;projectId;projectName;registryPromise;async registerProject(){let e=`${this.targetPrefix}/project.json`,t=new Date().toISOString(),r=t,o=await this.provider.getText(e);if(o){let n;try{n=JSON.parse(o)}catch(a){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${a instanceof Error?a.message:String(a)}`)}if(typeof n.id=="string"&&n.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${n.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof n.createdAt=="string"&&(r=n.createdAt)}let i={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(i,null,2)+`
7
+ `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=St(e),e===this.sourcePrefix)return this.targetPrefix;if(e.startsWith(`${this.sourcePrefix}/`))return this.targetPrefix+e.slice(this.sourcePrefix.length);if(e===this.targetPrefix||e.startsWith(`${this.targetPrefix}/`))return e;if(e.startsWith("projects/"))throw new Error(["Cross-project storage access denied.",`Current project: ${this.targetPrefix}`,`Requested key: ${e}`].join(" "));return e}async put(e,t,r){return await this.ensureRegistered(),this.provider.put(this.key(e),t,r)}async get(e){return await this.ensureRegistered(),this.provider.get(this.key(e))}async getText(e){return await this.ensureRegistered(),this.provider.getText(this.key(e))}async delete(e){return await this.ensureRegistered(),this.provider.delete(this.key(e))}async exists(e){return await this.ensureRegistered(),this.provider.exists(this.key(e))}async list(e){return await this.ensureRegistered(),this.provider.list(this.key(e))}};var Ie=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"graph","resolution","current.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e),"application/json")}};var Re=class{constructor(e){this.storage=e}storage;base(e){return["projects",e,"code","architecture"].join("/")}async load(e){let t=await this.storage.getText(`${this.base(e)}/current.json`);return t?JSON.parse(t):null}async save(e){let t=this.base(e.projectId),r=o=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:o},null,2);await Promise.all([this.storage.put(`${t}/current.json`,JSON.stringify(e,null,2),"application/json"),this.storage.put(`${t}/entry-points.json`,r(e.entryPoints),"application/json"),this.storage.put(`${t}/hotspots.json`,r(e.hotspots),"application/json"),this.storage.put(`${t}/layers.json`,r(e.layers),"application/json"),this.storage.put(`${t}/clusters.json`,r(e.clusters),"application/json")])}};var Te=class{constructor(e){this.storage=e}storage;base(e){return["projects",e,"code","analysis"].join("/")}async load(e){let t=await this.storage.getText(`${this.base(e)}/current.json`);return t?JSON.parse(t):null}async save(e){let t=this.base(e.projectId),r=o=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:o},null,2);await Promise.all([this.storage.put(`${t}/current.json`,JSON.stringify(e,null,2),"application/json"),this.storage.put(`${t}/dead-code.json`,r(e.deadCode),"application/json"),this.storage.put(`${t}/dependencies.json`,r(e.dependencies),"application/json")])}};var _e=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"code","visualization","graph.json"].join("/")}async load(e){let t=await this.storage.getText(this.key(e));return t?JSON.parse(t):null}async save(e){await this.storage.put(this.key(e.projectId),JSON.stringify(e,null,2),"application/json")}};async function bt(s,e={}){let t=Date.now();async function r(p,E,h){await e.onStage?.({id:p,title:E,state:"start"});let v=Date.now(),S=await h();return await e.onStage?.({id:p,title:E,state:"complete",durationMs:Date.now()-v}),S}let o=Je(),i=ht(ft({provider:o.storage.provider,huggingface:o.storage.huggingface,localRoot:o.storage.localRoot}),{attempts:3}),n=new Le(i,s.id,s.name,s.remote??s.name),a=new B(n),c=(await r("source-index","Source Index",async()=>{let p=await new ae().index(s.id,s.rootPath);return await a.save({version:1,projectId:s.id,updatedAt:new Date().toISOString(),files:p.files,symbols:p.graph.allSymbols(s.id),edges:p.graph.allEdges(s.id)}),p})).graph,l=await r("type-resolution","Type Resolution",async()=>{let p=await new ge(c).resolveProject(s.id,s.rootPath);return await new Ie(n).save(p),p});await r("rich-graph","Rich Graph",async()=>{let p=new he(c).enrich(s.id,s.rootPath,l),E=c.allSymbols(s.id),h=c.allEdges(s.id);return await a.save({version:1,projectId:s.id,updatedAt:new Date().toISOString(),files:E.filter(v=>v.type==="file").length,symbols:E,edges:h}),p});let u=await r("semantic-index","Semantic Code Index",async()=>new me({projectId:s.id,rootPath:s.rootPath,model:process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",storage:n,embeddings:ot(),graph:c}).initialize()),d=await r("architecture","Architecture Intelligence",async()=>{let p=new ve(c).analyze(s.id);return await new Re(n).save(p),p}),f=await r("analysis","Graph Analysis",async()=>{let p=new we(c).analyze(s.id);return await new Te(n).save(p),p}),y=await r("visualization","3D Visualization Dataset",async()=>{let p=new Pe(c).build(s.id,d,f);return await new _e(n).save(p),p});return{project:{id:s.id,name:s.name,remote:s.remote??s.name},storage:n.name,durationMs:Date.now()-t,graph:{symbols:c.allSymbols(s.id).length,edges:c.allEdges(s.id).length},resolution:{total:l.total,exact:l.exact,high:l.high,fallback:l.fallback},semantic:u,architecture:d.summary,analysis:f.summary,visualization:y.summary}}var N=new Z().detect(),qe=Ye(N.rootPath,".toolnet"),Ve=Ye(qe,"index.lock"),hs=Ye(qe,"last-index.json");ms(qe,{recursive:!0});function ke(s){gs(hs,JSON.stringify(s,null,2)+`
8
+ `,{encoding:"utf8",mode:384})}var We;try{We=us(Ve,"wx",384)}catch{console.error("\u274C Index already running for this project."),console.error(`Lock: ${Ve}`),process.exit(2)}var Ne=new Date().toISOString(),J=[];try{console.log(),console.log("=============================================="),console.log(" ToolNet Production Index"),console.log("=============================================="),console.log(`Project : ${N.name}`),console.log(`Remote : projects/${N.remote??N.name}/`),console.log("Runtime : production/dist"),console.log("Snapshot: disabled"),ke({version:2,state:"running",startedAt:Ne,completedStages:J,project:N});let s=await bt(N,{onStage:async e=>{e.state==="start"?(console.log(),console.log(`===== ${e.title} =====`)):(J.push(e.id),console.log(`\u2705 ${e.title} (${((e.durationMs??0)/1e3).toFixed(1)}s)`)),ke({version:2,state:"running",startedAt:Ne,currentStage:e.id,completedStages:[...J],project:N})}});ke({version:2,state:"complete",startedAt:Ne,finishedAt:new Date().toISOString(),completedStages:J,result:s}),console.log(),console.log("=============================================="),console.log(" FULL INDEX COMPLETE \u2705"),console.log("=============================================="),console.log(JSON.stringify(s,null,2))}catch(s){ke({version:2,state:"failed",startedAt:Ne,failedAt:new Date().toISOString(),completedStages:J,error:s instanceof Error?s.message:String(s)}),console.error("FULL INDEX FAILED \u274C"),console.error(s),process.exitCode=1}finally{We!==void 0&&ps(We),fs(Ve,{force:!0})}