toolnet-memory 0.3.4 → 0.3.5

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,24 @@
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 Ts,mkdirSync as Ls,openSync as Rs,rmSync as ks,writeFileSync as Ms}from"node:fs";import{join as tt}from"node:path";import{existsSync as Nt,readFileSync as _t}from"node:fs";import{homedir as Ot}from"node:os";import{join as jt}from"node:path";function Dt(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 $t(){let s=process.env.TOOLNET_GLOBAL_ENV??jt(Ot(),".config","toolnet-memory",".env");if(!Nt(s))return;let e=_t(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 n=r.indexOf("=");if(n<=0)continue;let i=r.slice(0,n).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(i)&&process.env[i]===void 0&&(process.env[i]=Dt(r.slice(n+1)))}}$t();function U(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function G(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function st(){return{memory:{autoCapture:U(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:U(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:U(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:U(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:G(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:G(process.env.MEMORY_RERANK_TOP,10),finalContext:G(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:G(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:U(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:G(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as Ft}from"node:crypto";import{existsSync as Ke,mkdirSync as Kt,readFileSync as Ut,renameSync as Gt,writeFileSync as Bt}from"node:fs";import{basename as zt,dirname as re,join as ne,parse as it,resolve as B}from"node:path";var at=".toolnet",Ht="project.json";function Vt(s){return Ft("sha256").update(s).digest("hex").slice(0,16)}function Ue(s){return ne(s,at,Ht)}function Wt(s){return Ke(Ue(s))}function Yt(s,e){let t=B(s),r=it(t).root;for(;;){if(Wt(t))return t;if(t===r||e&&t===B(e))break;let n=re(t);if(n===t)break;t=n}return null}function qt(s){let e=B(s),t=it(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>Ke(ne(e,i))))return e;if(e===t)break;let n=re(e);if(n===e)break;e=n}return B(s)}function Jt(s){let e;try{e=JSON.parse(Ut(s,"utf8"))}catch(n){throw new Error(`Invalid ToolNet project manifest: ${s}: ${n instanceof Error?n.message:String(n)}`)}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:re(re(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 nt(s,e){let t=ne(s,at);Kt(t,{recursive:!0});let r=Ue(s),n=`${r}.tmp-${process.pid}`;Bt(n,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),Gt(n,r)}function ot(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 se=class{detect(e=process.cwd()){let t=B(e),r=qt(t),i=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>Ke(ne(r,l))),o=Yt(t,i?r:void 0);if(o){let l=Ue(o),m=Jt(l);return m.rootPath!==o&&(m.rootPath=o,m.updatedAt=new Date().toISOString(),nt(o,m)),ot(m,o)}let a=new Date().toISOString(),p=zt(r),c={version:1,id:Vt(r),name:p,remote:p,rootPath:r,createdAt:a,updatedAt:a,graphVersion:0,memoryVersion:0};return nt(r,c),ot(c,r)}};var Qt=[{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}],oe=class{scan(e){let t=[];for(let r of Qt){let n=new RegExp(r.regex.source,r.regex.flags);for(let i of e.matchAll(n))t.push({type:r.type,value:i[0]})}return t}hasSecrets(e){return this.scan(e).length>0}};var z=class{scanner=new oe;sanitize(e){let t=e,r=this.scanner.scan(e),n=new Set;for(let i of r)n.add(i.type),t=t.split(i.value).join(`[REDACTED:${i.type}]`);return{text:t,redacted:r.length,secretTypes:[...n]}}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,n]of Object.entries(e)){let i=r.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g,"");i.includes("password")||i.includes("passwd")||i==="pwd"||i.includes("secret")||i.includes("token")||i.includes("cookie")||i.includes("authorization")||i.includes("apikey")||i.includes("accesskey")||i.includes("privatekey")||i.includes("clientsecret")||i.includes("credential")?t[r]="[REDACTED]":t[r]=this.sanitizeValue(n)}return t}return e}};var ct=[{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 ie(s){let e=ct.find(t=>t.id===s);if(!e)throw new Error(`Unsupported AI provider: ${s}`);return e}function ae(s){return ct.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 lt(){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 Zt(){let s=g("TOOLNET_LLM_PROVIDER");return s&&ae(s)?s:lt()??"openai-compatible"}function Ge(s){let e=ie(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 Xt(){let s=g("TOOLNET_LLM_PROVIDER"),e=s&&ae(s)?s:Zt(),t=ie(e),r=Ge(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 er(){let s=g("TOOLNET_EMBEDDING_PROVIDER");return s==="local"?"local":s&&ae(s)?s:g("HF_TOKEN")||g("HF_EMBEDDING_MODEL")?"huggingface":"local"}function tr(){let s=er();if(s==="local")return{provider:"local",model:P(g("TOOLNET_EMBEDDING_MODEL"),g("LOCAL_EMBEDDING_MODEL"))};let e=ie(s),t,r,n,i;switch(s){case"huggingface":t=g("HF_TOKEN"),r=g("HF_INFERENCE_BASE_URL"),n=g("HF_EMBEDDING_MODEL");break;case"openai-compatible":t=g("OPENAI_API_KEY"),r=g("OPENAI_BASE_URL"),n=g("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":t=g("CLOUDFLARE_API_TOKEN"),r=g("CLOUDFLARE_AI_BASE_URL"),n=g("CLOUDFLARE_EMBEDDING_MODEL"),i=g("CLOUDFLARE_ACCOUNT_ID");break;default:t=Ge(s).apiKey,r=Ge(s).baseUrl,n=g(`${s.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let o=P(g("TOOLNET_EMBEDDING_ACCOUNT_ID"),i),a=P(g("TOOLNET_EMBEDDING_BASE_URL"),r,e.defaultBaseUrl),p=s==="cloudflare"&&!a&&o?`https://api.cloudflare.com/client/v4/accounts/${o}/ai/v1`:a;return{provider:s,apiKey:P(g("TOOLNET_EMBEDDING_API_KEY"),t),baseUrl:p,model:P(g("TOOLNET_EMBEDDING_MODEL"),n),accountId:o}}function dt(){let s=Xt(),e=tr();return{llm:s,embedding:e,legacy:{llm:!g("TOOLNET_LLM_PROVIDER")&&!!lt(),embedding:!g("TOOLNET_EMBEDDING_PROVIDER")&&!!(g("HF_TOKEN")||g("HF_EMBEDDING_MODEL"))}}}var ce=class{constructor(e){this.options=e}options;name="gemini";async embed(e){let t=this.options.model.replace(/^models\//,""),n=`${this.options.baseUrl?.replace(/\/+$/,"")||"https://generativelanguage.googleapis.com/v1beta"}/models/${encodeURIComponent(t)}:embedContent?key=${encodeURIComponent(this.options.apiKey)}`,i=await fetch(n,{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 rr}from"node:crypto";var le=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 n of r){let o=rr("sha256").update(n).digest().readUInt32BE(0)%this.dimensions;t[o]+=1}return sr(t)}async embedMany(e){return Promise.all(e.map(t=>this.embed(t)))}};function sr(s){let e=Math.sqrt(s.reduce((t,r)=>t+r*r,0));return e===0?s:s.map(t=>t/e)}var de=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((o,a)=>(o.index??0)-(a.index??0)).map(o=>o.embedding);if(!i||i.length!==e.length||i.some(o=>!Array.isArray(o)))throw new Error("Embedding provider returned invalid response");return i}};var pe=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 n=await r.json();if(!Array.isArray(n))throw new Error("HF embedding returned invalid response");return n.map(i=>nr(i))}};function nr(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 n of e)for(let i=0;i<t;i++)r[i]+=n[i]??0;for(let n=0;n<t;n++)r[n]/=e.length;return r}throw new Error("Unsupported embedding shape")}var Be=class{constructor(e,t=new le){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 or(s){return`https://api.cloudflare.com/client/v4/accounts/${s}/ai/v1`}function ir(){let s=dt().embedding;if(s.provider==="local")return null;if(s.provider==="huggingface")return!s.apiKey||!s.model?null:new pe({token:s.apiKey,model:s.model});if(s.provider==="gemini")return!s.apiKey||!s.model?null:new ce({apiKey:s.apiKey,model:s.model,baseUrl:s.baseUrl});let e=s.baseUrl;return s.provider==="cloudflare"&&!e&&s.accountId&&(e=or(s.accountId)),e&&s.model?new de({apiKey:s.apiKey,baseUrl:e,model:s.model}):null}function pt(){return new Be(ir())}import{readdir as dr}from"node:fs/promises";import{extname as pr,join as ur,relative as mr}from"node:path";import{basename as ar}from"node:path";var cr=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),lr=new Set([".pem",".key",".p12",".pfx"]);function ut(s){let e=ar(s).toLowerCase();if(cr.has(e))return!0;for(let t of lr)if(e.endsWith(t))return!0;return!1}var fr=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),gr=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function ze(s){let e=[];async function t(r){let n=await dr(r,{withFileTypes:!0});for(let i of n){if(gr.has(i.name))continue;let o=ur(r,i.name);if(i.isDirectory()){await t(o);continue}fr.has(pr(i.name))&&(ut(o)||e.push(mr(s,o)))}}return await t(s),e.sort()}import{readFile as hr}from"node:fs/promises";import{join as yr}from"node:path";import{createHash as br}from"node:crypto";import*as w from"typescript";function mt(s,e){return br("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function He(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function Ve(s,e,t){let r=yr(e,t),n=await hr(r,"utf8"),i=w.createSourceFile(t,n,w.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?w.ScriptKind.TSX:w.ScriptKind.TS),o=[],a=[],p=[],c=[],l={id:mt(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:i.getLineAndCharacterOfPosition(i.end).line+1};o.push(l);let m=[],d=[];function f(h,v,b,x){let I=mt(s,`${t}:${b}:${x??v}:${h.pos}`);return o.push({id:I,projectId:s,name:v,qualifiedName:x??v,type:b,filePath:t,startLine:He(i,h),endLine:i.getLineAndCharacterOfPosition(h.end).line+1}),I}function y(h){if(!w.isStringLiteral(h.moduleSpecifier))return;let v=[],b=h.importClause;if(b?.name&&v.push({localName:b.name.text,importedName:"default",kind:"default"}),b?.namedBindings&&w.isNamedImports(b.namedBindings))for(let x of b.namedBindings.elements)v.push({localName:x.name.text,importedName:x.propertyName?.text??x.name.text,kind:"named"});b?.namedBindings&&w.isNamespaceImport(b.namedBindings)&&v.push({localName:b.namedBindings.name.text,importedName:"*",kind:"namespace"}),a.push({source:h.moduleSpecifier.text,bindings:v})}function u(h,v){for(let b of h.heritageClauses??[])for(let x of b.types){let I=x.expression.getText(i).split(".").at(-1)??"";I&&c.push({fromId:v,targetName:I,type:b.token===w.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function E(h){let v=!1,b=!1;if(w.isImportDeclaration(h)&&y(h),w.isInterfaceDeclaration(h)&&f(h,h.name.text,"interface",h.name.text),w.isClassDeclaration(h)&&h.name){let x=f(h,h.name.text,"class",h.name.text);u(h,x),d.push({id:x,name:h.name.text}),b=!0}if(w.isFunctionDeclaration(h)&&h.name){let x=f(h,h.name.text,"function",h.name.text);m.push(x),v=!0}if(w.isMethodDeclaration(h)&&h.name){let x=h.name.getText(i),I=d.at(-1)?.name,A=f(h,x,"method",I?`${I}.${x}`:x);m.push(A),v=!0}if(w.isCallExpression(h)&&(w.isIdentifier(h.expression)&&p.push({callerId:m.at(-1),calleeName:h.expression.text,line:He(i,h)}),w.isPropertyAccessExpression(h.expression))){let x=h.expression;p.push({callerId:m.at(-1),qualifier:x.expression.getText(i),calleeName:x.name.text,line:He(i,h)})}w.forEachChild(h,E),v&&m.pop(),b&&d.pop()}return E(i),{filePath:t,symbols:o,imports:a,calls:p,heritage:c}}import{createHash as Sr}from"node:crypto";import{dirname as Er,extname as vr,normalize as xr,posix as wr}from"node:path";var H=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 Cr(s,e,t,r){return Sr("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function N(s){return xr(s).replaceAll("\\","/")}function We(s,e,t){if(!e.startsWith("."))return;let r=N(wr.join(Er(s),e)),n=vr(r),i;if(n===".js"){let o=r.slice(0,-3);i=[`${o}.ts`,`${o}.tsx`,`${o}.js`,`${o}.jsx`]}else if(n===".mjs"){let o=r.slice(0,-4);i=[`${o}.mts`,`${o}.ts`,`${o}.mjs`]}else if(n===".cjs"){let o=r.slice(0,-4);i=[`${o}.cts`,`${o}.ts`,`${o}.cjs`]}else n?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(N(o)))}var V=class{build(e,t){let r=new H,n=new Map;for(let o of t)for(let a of o.symbols)r.addSymbol(a),a.type==="file"&&n.set(N(o.filePath),a);let i=new Set(n.keys());for(let o of t){let a=N(o.filePath),p=n.get(a);if(p){for(let c of o.symbols)c.id!==p.id&&r.addEdge(this.edge(e,p.id,"DEFINES",c.id));for(let c of o.imports){let l=We(a,c.source,i);if(!l)continue;let m=n.get(l);m&&r.addEdge(this.edge(e,p.id,"IMPORTS",m.id,{source:c.source}))}for(let c of o.heritage){let l=r.findByName(e,c.targetName).filter(m=>m.type==="class"||m.type==="interface");for(let m of l)r.addEdge(this.edge(e,c.fromId,c.type,m.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 m of l)m.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",m.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,n,i,o,a){let p=N(t.filePath),c=o.findByName(e,r).filter(l=>N(l.filePath)===p);if(!n&&c.length)return c;if(n)for(let l of t.imports){if(!l.bindings.find(f=>f.kind==="namespace"&&f.localName===n))continue;let d=We(p,l.source,a);if(d)return o.findByName(e,r).filter(f=>N(f.filePath)===d)}for(let l of t.imports){let m=l.bindings.find(u=>u.localName===r);if(!m)continue;let d=We(p,l.source,a);if(!d)continue;let f=m.importedName==="default"?r:m.importedName,y=o.findByName(e,f).filter(u=>N(u.filePath)===d);if(y.length)return y}return o.findByName(e,r).filter(l=>l.type==="function"||l.type==="method")}edge(e,t,r,n,i){return{id:Cr(e,t,r,n),projectId:e,from:t,to:n,type:r,metadata:i}}};var ue=class{async index(e,t,r={}){let n=await ze(t);r.onProgress?.({phase:"scan",current:n.length,total:n.length});let i=[],o=0;for(let p of n)try{i.push(await Ve(e,t,p))}catch(c){console.warn(`[indexer] skipped ${p}:`,c instanceof Error?c.message:c)}finally{o+=1,r.onProgress?.({phase:"parse",current:o,total:n.length,file:p})}let a=new V().build(e,i);return{files:i.length,symbols:a.allSymbols(e).length,edges:a.allEdges(e).length,graph:a}}};import{execFile as Pr}from"node:child_process";import{promisify as Ar}from"node:util";var yo=Ar(Pr);var W=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 Ir}from"node:crypto";import{readFile as Tr}from"node:fs/promises";import{join as Lr}from"node:path";function ft(s){return Ir("sha256").update(s).digest("hex")}var me=class{sanitizer=new z;async build(e,t,r,n={}){let i=n.maxLines??80,o=n.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 p=[];for(let[c,l]of a){let m;try{m=await Tr(Lr(t,c),"utf8")}catch{continue}let d=m.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)p.push(...this.chunkRange({projectId:e,filePath:c,lines:d,symbol:y,startLine:y.startLine,endLine:y.endLine,maxLines:i,overlapLines:o}));else p.push(...this.chunkRange({projectId:e,filePath:c,lines:d,startLine:1,endLine:Math.max(1,d.length),maxLines:i,overlapLines:o}))}return p}chunkRange(e){let{projectId:t,filePath:r,lines:n,symbol:i,maxLines:o}=e,a=Math.min(e.overlapLines,Math.max(0,o-1)),p=Math.max(1,e.startLine),c=Math.min(n.length,Math.max(p,e.endLine)),l=[],m=p,d=0;for(;m<=c;){let f=Math.min(c,m+o-1),y=n.slice(m-1,f).join(`
4
+ `).trim();if(y){let u=this.sanitizer.sanitize(y).text,E=ft(u),h=[t,r,i?.id??"file",String(d),E].join(":");l.push({id:ft(h).slice(0,32),projectId:t,filePath:r,symbolId:i?.id,symbolName:i?.qualifiedName??i?.name,symbolType:i?.type,startLine:m,endLine:f,content:u,contentHash:E})}if(f>=c)break;m=f-a+1,d++}return l}};var fe=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 ge=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 he=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,n]of this.records)n.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 n=[];for(let i of this.records.values()){if(i.projectId!==e)continue;let o=Rr(t,i.vector);n.push({id:i.id,score:o,metadata:i.metadata})}return n.sort((i,o)=>o.score-i.score).slice(0,r)}size(){return this.records.size}};function Rr(s,e){if(s.length===0||e.length===0||s.length!==e.length)return 0;let t=0,r=0,n=0;for(let i=0;i<s.length;i++){let o=s[i]??0,a=e[i]??0;t+=o*a,r+=o*o,n+=a*a}return r===0||n===0?0:t/(Math.sqrt(r)*Math.sqrt(n))}function Ye(s){return s.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}_\-./]+/gu," ").split(/\s+/).map(e=>e.trim()).filter(e=>e.length>1)}function gt(s,e){let t=s.toLowerCase().replaceAll("\\","/"),r=e.toLowerCase(),n=/\b(test|tests|spec|fixture|mock)\b/.test(r);return(t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t))&&!n?.35:t.includes("/generated/")||t.includes(".generated.")?.25:1}var ye=class{constructor(e){this.options=e}options;vectors=new he;chunks=new Map;async initialize(){let{projectId:e,rootPath:t,storage:r,embeddings:n,graph:i,model:o}=this.options,a=new fe(r),p=new ge(r),c=await new me().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),m=!l||l.chunks.length!==c.length||l.chunks.some(A=>!this.chunks.has(A.id));m&&await a.save({version:1,projectId:e,updatedAt:new Date().toISOString(),chunks:c});let d=await p.load(e),f=0;d&&d.model===o&&(f=this.vectors.importRecords(d.records));let y=new Set(c.map(A=>A.id)),u=0;for(let A of this.vectors.exportProject(e))y.has(A.id)||this.vectors.remove(A.id)&&u++;let E=c.filter(A=>{let k=this.vectors.get(A.id);return k?k.metadata?.contentHash!==A.contentHash:!0}),h=0,v=8,b=this.vectors.exportProject(e)[0]?.vector.length;for(let A=0;A<E.length;A+=v){let k=E.slice(A,A+v),kt=k.map(R=>[`file: ${R.filePath}`,R.symbolName?`symbol: ${R.symbolName}`:"",R.symbolType?`type: ${R.symbolType}`:"",R.content].filter(Boolean).join(`
5
+ `)),Mt=await n.embedMany(kt);for(let R=0;R<k.length;R++){let M=k[R],D=Mt[R];if(!(!M||!D||D.length===0)){if(b===void 0&&(b=D.length),D.length!==b){console.warn(`[code-semantic] skip dimension mismatch: ${D.length} != ${b}`);continue}this.vectors.upsert({id:M.id,projectId:e,vector:D,metadata:{contentHash:M.contentHash,filePath:M.filePath,symbolName:M.symbolName,symbolType:M.symbolType,startLine:M.startLine,endLine:M.endLine}}),h++}}}let x=this.vectors.exportProject(e),I=h>0||u>0||!d||d.model!==o;return I&&await p.save({version:1,projectId:e,model:o,dimensions:x[0]?.vector.length??b??0,updatedAt:new Date().toISOString(),records:x}),{chunks:c.length,vectorsLoaded:f,vectorsIndexed:h,vectorsRemoved:u,totalVectors:x.length,savedChunks:m,savedVectors:I}}async search(e,t=8){let r=await this.options.embeddings.embed(e),n=this.vectors.search(this.options.projectId,r,Math.max(t*4,20)),i=new Set(Ye(e)),o=[];for(let a of n){let p=this.chunks.get(a.id);if(!p)continue;let c=new Set(Ye([p.filePath,p.symbolName??"",p.symbolType??"",p.content].join(" "))),l=0;for(let u of i)c.has(u)&&l++;let m=i.size===0?0:l/i.size,d=Math.max(0,a.score),f=gt(p.filePath,e),y=(d*.75+m*.25)*f;o.push({chunk:p,score:y,vectorScore:d,lexicalScore:m})}return o.sort((a,p)=>p.score-a.score).slice(0,t)}size(){return this.chunks.size}};import{createHash as kr}from"node:crypto";import{dirname as Mr,relative as be,resolve as Se}from"node:path";import*as C from"typescript";function $(s){return s.replaceAll("\\","/").replace(/^\.\//,"")}function ht(s){return kr("sha256").update(s).digest("hex").slice(0,24)}function Y(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}function Nr(s){let e=s;if(e.name&&C.isIdentifier(e.name))return e.name.text}var Ee=class{constructor(e){this.graph=e}graph;async resolveProject(e,t){let r=this.loadConfig(t),n=C.createProgram({rootNames:r.fileNames,options:r.options}),i=n.getTypeChecker(),o=[];for(let a of n.getSourceFiles()){if(a.isDeclarationFile)continue;let p=Se(a.fileName),c=$(be(t,p));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=m=>{if(C.isCallExpression(m)){let d=this.resolveCall({projectId:e,rootPath:t,source:a,node:m,checker:i});d&&o.push(d)}C.isClassDeclaration(m)&&o.push(...this.resolveHeritage({projectId:e,rootPath:t,source:a,node:m,checker:i})),C.forEachChild(m,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:n,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:n,sourceNode:i,declaration:a,expression:i.expression.getText(n),kind:"CALL"}):this.fallbackCall(t,r,n,i)}resolveHeritage(e){let{projectId:t,rootPath:r,source:n,node:i,checker:o}=e,a=[];for(let p of i.heritageClauses??[])for(let c of p.types){let l=o.getSymbolAtLocation(c.expression),m=l?.valueDeclaration??l?.declarations?.[0];if(!m)continue;let d=this.fromDeclaration({projectId:t,rootPath:r,source:n,sourceNode:c,declaration:m,expression:c.getText(n),kind:p.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=$(be(e.rootPath,Se(t.fileName)));if(r.startsWith("../")||r.includes("node_modules/"))return null;let n=Y(t,e.declaration),i=Nr(e.declaration)??e.expression.split(".").at(-1),o=this.findGraphSymbol(e.projectId,r,n,i),a=$(be(e.rootPath,Se(e.source.fileName)));return{id:ht([e.projectId,a,Y(e.source,e.sourceNode),e.kind,r,n].join(":")),projectId:e.projectId,kind:e.kind,sourceFile:a,sourceLine:Y(e.source,e.sourceNode),expression:e.expression,targetFile:r,targetLine:n,targetName:i,targetQualifiedName:o?.qualifiedName,targetSymbolId:o?.id,confidence:o?"exact":"high",resolver:"typescript-checker"}}fallbackCall(e,t,r,n){let i=n.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],p=$(be(t,Se(r.fileName)));return{id:ht(`${e}:${p}:${Y(r,n)}:${a.id}`),projectId:e,kind:"CALL",sourceFile:p,sourceLine:Y(r,n),expression:n.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,n){let o=this.graph.allSymbols(e).filter(a=>$(a.filePath)===$(t)).filter(a=>typeof a.startLine=="number"&&typeof a.endLine=="number"&&a.startLine<=r&&a.endLine>=r);if(n){let a=o.find(p=>p.name===n||(p.qualifiedName?.endsWith(`.${n}`)??!1));if(a)return a}return o.sort((a,p)=>(a.endLine??0)-(a.startLine??0)-((p.endLine??0)-(p.startLine??0)))[0]}loadConfig(e){let t=C.findConfigFile(e,C.sys.fileExists,"tsconfig.json");if(t){let n=C.readConfigFile(t,C.sys.readFile);if(n.error)throw new Error(C.flattenDiagnosticMessageText(n.error.messageText,`
6
+ `));return C.parseJsonConfigFileContent(n.config,C.sys,Mr(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 _r}from"node:crypto";import{dirname as Or,relative as q,resolve as J}from"node:path";import*as S from"typescript";function L(s){return s.replaceAll("\\","/").replace(/^\.\//,"")}function qe(...s){return _r("sha256").update(s.join(":")).digest("hex").slice(0,24)}function Q(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}var jr=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]),ve=class{constructor(e){this.graph=e}graph;enrich(e,t,r){let n={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 p of o.getSourceFiles()){if(p.isDeclarationFile)continue;let c=L(q(t,J(p.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=this.fileNode(e,c);if(!l)continue;let m=d=>{if(S.isCallExpression(d)&&this.addRoute(e,t,p,l,d,a)&&n.routes++,S.isTypeReferenceNode(d)&&this.addTypeUse(e,t,p,d,a)&&n.usesType++,S.isBinaryExpression(d)&&Dr.has(d.operatorToken.kind)){let f=this.addWrite(e,t,p,d.left,a);f.added&&(n.writes++,f.propertyCreated&&n.properties++)}if((S.isPrefixUnaryExpression(d)||S.isPostfixUnaryExpression(d))&&(d.operator===S.SyntaxKind.PlusPlusToken||d.operator===S.SyntaxKind.MinusMinusToken)){let f=this.addWrite(e,t,p,d.operand,a);f.added&&(n.writes++,f.propertyCreated&&n.properties++)}S.forEachChild(d,m)};m(p)}return n.tests+=this.addTestEdges(e),r&&(n.callReferences+=this.addResolvedCalls(e,r)),n}addRoute(e,t,r,n,i,o){if(!S.isPropertyAccessExpression(i.expression))return!1;let a=i.expression.name.text.toLowerCase();if(!jr.has(a))return!1;let p=i.arguments[0];if(!p||!(S.isStringLiteral(p)||S.isNoSubstitutionTemplateLiteral(p)))return!1;let c=p.text;if(!c.startsWith("/"))return!1;let l=Q(r,i),m=qe(e,r.fileName,l,a,c);this.graph.getSymbol(m)||(this.graph.addSymbol({id:m,projectId:e,name:`${a.toUpperCase()} ${c}`,qualifiedName:`${a.toUpperCase()} ${c}`,type:"route",filePath:n.filePath,startLine:l,endLine:l}),this.graph.addEdge(this.edge(e,n.id,"DEFINES",m)));let d=i.arguments.at(-1);if(d){let f=this.resolveNodeSymbol(e,t,d,o);f&&this.graph.addEdge(this.edge(e,m,"ROUTE",f.id,{method:a.toUpperCase(),path:c}))}return!0}addTypeUse(e,t,r,n,i){let o=this.resolveNodeSymbol(e,t,n.typeName,i);if(!o)return!1;let a=this.containingSymbol(e,L(q(t,J(r.fileName))),Q(r,n));return!a||a.id===o.id?!1:(this.graph.addEdge(this.edge(e,a.id,"USES_TYPE",o.id)),!0)}addWrite(e,t,r,n,i){let o=this.resolveTsSymbol(n,i),a=o?.valueDeclaration??o?.declarations?.[0];if(!a)return{added:!1,propertyCreated:!1};let p=a.getSourceFile();if(p.isDeclarationFile)return{added:!1,propertyCreated:!1};let c=L(q(t,J(p.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))return{added:!1,propertyCreated:!1};let l=Q(p,a),m=this.findSymbolAt(e,c,l),d=!1;if(!m||m.type==="file"){let u=o?.getName()??n.getText(r),E=qe(e,c,"property",u,l);if(m=this.graph.getSymbol(E),!m){m={id:E,projectId:e,name:u,qualifiedName:u,type:"property",filePath:c,startLine:l,endLine:l},this.graph.addSymbol(m);let h=this.fileNode(e,c);h&&this.graph.addEdge(this.edge(e,h.id,"DEFINES",m.id)),d=!0}}if(!m)return{added:!1,propertyCreated:d};let f=L(q(t,J(r.fileName))),y=this.containingSymbol(e,f,Q(r,n));return!y||y.id===m.id?{added:!1,propertyCreated:d}:(this.graph.addEdge(this.edge(e,y.id,"WRITES",m.id,{expression:n.getText(r)})),{added:!0,propertyCreated:d})}addTestEdges(e){let t=this.graph.allEdges(e),r=0;for(let n of t){if(n.type!=="IMPORTS")continue;let i=this.graph.getSymbol(n.from),o=this.graph.getSymbol(n.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 n of t.resolutions){if(n.kind!=="CALL"||!n.targetSymbolId)continue;let i=this.graph.getSymbol(n.targetSymbolId);if(!i)continue;let o=this.containingSymbol(e,n.sourceFile,n.sourceLine);!o||o.id===i.id||this.graph.allEdges(e).some(p=>p.type==="CALLS"&&p.from===o.id&&p.to===i.id)||(this.graph.addEdge(this.edge(e,o.id,"CALL_REFERENCE",i.id,{expression:n.expression,confidence:n.confidence,resolver:n.resolver})),r++)}return r}resolveNodeSymbol(e,t,r,n){let i=this.resolveTsSymbol(r,n),o=i?.valueDeclaration??i?.declarations?.[0];if(!o)return;let a=o.getSourceFile();if(a.isDeclarationFile)return;let p=L(q(t,J(a.fileName)));if(!(p.startsWith("../")||p.includes("node_modules/")))return this.findSymbolAt(e,p,Q(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(n=>L(n.filePath)===L(t)&&typeof n.startLine=="number"&&typeof n.endLine=="number"&&n.startLine<=r&&n.endLine>=r).sort((n,i)=>(n.endLine??0)-(n.startLine??0)-((i.endLine??0)-(i.startLine??0)))[0]}findSymbolAt(e,t,r,n){let i=this.graph.allSymbols(e).filter(o=>L(o.filePath)===L(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(n){let o=i.find(a=>a.name===n||(a.qualifiedName?.endsWith(`.${n}`)??!1));if(o)return o}return i[0]}fileNode(e,t){return this.graph.allSymbols(e).find(r=>r.type==="file"&&L(r.filePath)===L(t))}isTestFile(e){let t=L(e).toLowerCase();return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)}edge(e,t,r,n,i){return{id:qe(e,t,r,n,JSON.stringify(i??{})),projectId:e,from:t,to:n,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,Or(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 $r(s){return s.replaceAll("\\","/").toLowerCase()}var F=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),n=[];for(let o of t){if(o.type!=="route"&&o.type!=="file")continue;let a=this.classify(o,r);a&&n.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 n){let a=o.kind==="route"?o.symbolId:o.filePath,p=i.get(a);(!p||o.score>p.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=$r(e.filePath),n=[];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,n.push("bin executable");else if(/(^|\/)(cli)\.[^.]+$/.test(r))i="cli",o=90,n.push("CLI entry file");else if(/(^|\/)(main|server)\.[^.]+$/.test(r))i="main",o=90,n.push("main/server file");else if(r.includes("/runtime/")&&/(^|\/)(bootstrap|index)\.[^.]+$/.test(r))i="runtime",o=75,n.push("runtime bootstrap");else if(/(^|\/)index\.[^.]+$/.test(r)){let p=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/")||p===0||c>0)&&(i="package",o=r.startsWith("packages/")?70:55,n.push("package/public index"))}return i?(t.filter(p=>p.to===e.id&&p.type!=="DEFINES").length===0&&(o+=10,n.push("no incoming dependency")),{kind:i,score:o,reasons:n}):null}};var Fr={CALL_REFERENCE:6,CALLS:4,IMPORTS:3,USES_TYPE:4,WRITES:5,ROUTE:4,TESTS:1,INHERITS:5,IMPLEMENTS:5,DEFINES:.25},xe=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),n=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=n.get(c.from),m=n.get(c.to);if(!l||!m)continue;let d=Fr[c.type]??1,f=o(l.filePath),y=o(m.filePath);f.outgoing++,y.incoming++,f.weightedOutgoing+=d,y.weightedIncoming+=d,c.type==="WRITES"&&f.writes++,c.type==="CALL_REFERENCE"&&f.callReferences++,l.filePath!==m.filePath&&(f.crossFile++,y.crossFile++)}let a=[...i.entries()].map(([c,l])=>{let m=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:m,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 p=Math.max(1,Math.min(30,Math.ceil(a.length*.15)));return a.slice(0,p)}};function Kr(s){return s.replaceAll("\\","/").toLowerCase()}var Ur={CALL_REFERENCE:6,CALLS:4,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:6,IMPLEMENTS:6,ROUTE:3,TESTS:1},we=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),n=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 p=!1;for(let c of i){let l=o.get(c);if(!l||l.layer!=="unknown")continue;let m=new Map;for(let f of r){let y=n.get(f.from),u=n.get(f.to);if(!y||!u||y.filePath===u.filePath)continue;let E=null;if(y.filePath===c?E=u.filePath:u.filePath===c&&(E=y.filePath),!E)continue;let h=o.get(E);if(!h||h.layer==="unknown"||h.layer==="tests")continue;let v=Ur[f.type]??1;m.set(h.layer,(m.get(h.layer)??0)+v)}let d=[...m.entries()].sort((f,y)=>y[1]-f[1]||f[0].localeCompare(y[0]))[0];d&&d[1]>=4&&(o.set(c,{filePath:c,layer:d[0],confidence:.65,reasons:[`graph-neighbor vote=${d[1]}`]}),p=!0)}if(!p)break}return i.map(a=>o.get(a))}classifyPath(e){let t=Kr(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 Br={CALL_REFERENCE:7,CALLS:3,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:7,IMPLEMENTS:7,ROUTE:4,TESTS:1};function zr(s){return Gr("sha256").update(s).digest("hex").slice(0,12)}function Ce(s){return s.replaceAll("\\","/")}function Hr(s){let t=Ce(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 Vr(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 Pe=class{constructor(e){this.graph=e}graph;detect(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),n=new Map(t.map(d=>[d.id,d])),i=[...new Set(t.map(d=>Ce(d.filePath)))].sort(),o=new Map,a=(d,f)=>{let y=[d,f].sort();return`${y[0]}\0${y[1]}`};for(let d of r){let f=n.get(d.from),y=n.get(d.to);if(!f||!y)continue;let u=Ce(f.filePath),E=Ce(y.filePath);if(u===E)continue;let h=Br[d.type]??0;if(h<=0)continue;let v=a(u,E),b=o.get(v);b?b.weight+=h:o.set(v,{a:[u,E].sort()[0],b:[u,E].sort()[1],weight:h})}let p=new Map;for(let d of i){let f=Hr(d),y=p.get(f)??[];y.push(d),p.set(f,y)}let c=[];for(let[d,f]of p){if(f.sort(),f.length<=30){c.push({subsystem:d,files:f});continue}let y=new Set(f),u=new Map;for(let b of f)u.set(b,new Set);for(let b of o.values())!y.has(b.a)||!y.has(b.b)||b.weight>=8&&(u.get(b.a)?.add(b.b),u.get(b.b)?.add(b.a));let E=new Set,h=[];for(let b of f){if(E.has(b))continue;let x=[b],I=[];for(E.add(b);x.length>0;){let A=x.shift();I.push(A);for(let k of u.get(A)??[])E.has(k)||(E.add(k),x.push(k))}h.push(I.sort())}let v=[];for(let b of h)b.length>=2?c.push({subsystem:d,files:b}):v.push(...b);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 u=l[y];if(!(!u||u.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,b=new Set(u.files),x=new Set(h.files);for(let I of o.values())(b.has(I.a)&&x.has(I.b)||b.has(I.b)&&x.has(I.a))&&(v+=I.weight);if(v>=20){h.files=[...new Set([...h.files,...u.files])].sort(),l.splice(y,1),f=!0;break e}}}if(!f)break}let m=[];for(let d of l){let f=new Set(d.files),y=0,u=0;for(let x of o.values()){let I=f.has(x.a),A=f.has(x.b);I&&A?y+=x.weight:(I||A)&&(u+=x.weight)}let E=y+u,h=d.subsystem.replace(/\/residual$/,""),v=Vr(h),b=d.subsystem.endsWith("/residual")?`${v} Misc`:v;m.push({id:`cluster-${zr(`${d.subsystem}:${d.files.join("|")}`)}`,label:b,subsystem:h,files:d.files,size:d.files.length,internalWeight:y,externalWeight:u,cohesion:E>0?Number((y/E).toFixed(4)):0})}return m.sort((d,f)=>f.size-d.size||f.cohesion-d.cohesion||d.label.localeCompare(f.label))}};var Ae=class{constructor(e){this.graph=e;this.entryPoints=new F(e),this.hotspots=new xe(e),this.layers=new we(e),this.clusters=new Pe(e)}graph;entryPoints;hotspots;layers;clusters;analyze(e){let t=this.entryPoints.detect(e),r=this.hotspots.analyze(e),n=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:n.length,clusters:i.length},entryPoints:t,hotspots:r,layers:n,clusters:i}}};var yt=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE","TESTS"]);function Je(s){return s.replaceAll("\\","/").toLowerCase()}function Wr(s){let e=Je(s);return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}function Yr(s){let e=Je(s.filePath);return e.startsWith("bin/")||/(^|\/)index\.[^.]+$/.test(e)||/(^|\/)(main|server|cli)\.[^.]+$/.test(e)}var Ie=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),n=new Set(new F(this.graph).detect(e).map(o=>o.symbolId)),i=[];for(let o of t){if(!["function","method","class","interface","property"].includes(o.type)||Wr(o.filePath)||n.has(o.id)||Yr(o)||r.filter(f=>f.to===o.id&&yt.has(f.type)).length>0)continue;let p=r.filter(f=>f.from===o.id&&yt.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),p.length===0&&(l+=10,c.push("no outgoing dependency")),Je(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 qr=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE"]),Te=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e).filter(o=>qr.has(o.type)),n=new Map(t.map(o=>[o.id,o]));return[...new Set(t.map(o=>o.filePath))].sort().map(o=>{let a=new Set,p=new Set,c=0,l=0;for(let m of r){let d=n.get(m.from),f=n.get(m.to);!d||!f||d.filePath===f.filePath||(d.filePath===o&&(a.add(f.filePath),c++),f.filePath===o&&(p.add(d.filePath),l++))}return{filePath:o,dependencies:[...a].sort(),dependents:[...p].sort(),outgoingEdges:c,incomingEdges:l}})}};var Le=class{constructor(e){this.graph=e}graph;analyze(e){let t=new Ie(this.graph).analyze(e),r=new Te(this.graph).analyze(e);return{version:1,projectId:e,updatedAt:new Date().toISOString(),summary:{deadCodeCandidates:t.length,highConfidenceDeadCode:t.filter(n=>n.confidence==="high").length,files:r.length},deadCode:t,dependencies:r}}};var Re=class{constructor(e){this.graph=e}graph;build(e,t,r){let n=this.graph.allSymbols(e),i=this.graph.allEdges(e),o=new Map(t?.layers.map(u=>[u.filePath,u.layer])??[]),a=new Map;for(let u of t?.clusters??[])for(let E of u.files)a.set(E,{id:u.id,label:u.label});let p=new Map(t?.hotspots.map(u=>[u.filePath,u.score])??[]),c=new Map(r?.deadCode.map(u=>[u.symbolId,{confidence:u.confidence,score:u.score}])??[]),l=new Map,m=new Map;for(let u of i)m.set(u.from,(m.get(u.from)??0)+1),l.set(u.to,(l.get(u.to)??0)+1);let d=n.map(u=>{let E=a.get(u.filePath);return{id:u.id,name:u.name,qualifiedName:u.qualifiedName,type:u.type,filePath:u.filePath,layer:o.get(u.filePath),cluster:E?.id,clusterLabel:E?.label,hotspotScore:p.get(u.filePath),deadCode:c.get(u.id),incoming:l.get(u.id)??0,outgoing:m.get(u.id)??0}}),f=new Set(d.map(u=>u.id)),y=i.filter(u=>f.has(u.from)&&f.has(u.to)).map(u=>({source:u.from,target:u.to,type:u.type,confidence:typeof u.metadata?.confidence=="string"?u.metadata.confidence:void 0,resolver:typeof u.metadata?.resolver=="string"?u.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(u=>u.filePath)).size,clusters:new Set(d.map(u=>u.cluster).filter(Boolean)).size},nodes:d,links:y}}};import{homedir as bs}from"node:os";import{join as Ss}from"node:path";import{DeleteObjectCommand as Jr,GetObjectCommand as Qr,HeadObjectCommand as Zr,ListObjectsV2Command as Xr,PutObjectCommand as es,S3Client as ts}from"@aws-sdk/client-s3";import{getSignedUrl as rs}from"@aws-sdk/s3-request-presigner";var ke=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new ts({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 n=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new es({Bucket:this.bucket,Key:e,Body:n,ContentType:r}))}async get(e){let t=await rs(this.client,new Qr({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 Zr({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 Jr({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let n=await this.client.send(new Xr({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of n.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=n.IsTruncated?n.NextContinuationToken:void 0}while(r);return t}};import{access as bt,mkdir as ss,readFile as ns,readdir as os,rm as is,stat as St,writeFile as as}from"node:fs/promises";import{dirname as cs,join as ls,relative as Et,resolve as ds}from"node:path";var Z=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return ds(this.root,t)}async put(e,t){let r=this.path(e);await ss(cs(r),{recursive:!0}),await as(r,t)}async get(e){try{return await ns(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 bt(this.path(e)),!0}catch{return!1}}async delete(e){await is(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await bt(t)}catch{return r}let n=async o=>{let a=await os(o,{withFileTypes:!0});for(let p of a){let c=ls(o,p.name);if(p.isDirectory()){await n(c);continue}let l=await St(c);r.push({key:Et(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await St(t);return i.isDirectory()?await n(t):r.push({key:Et(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};import{DeleteObjectCommand as ps,GetObjectCommand as us,HeadObjectCommand as ms,ListObjectsV2Command as fs,PutObjectCommand as gs,S3Client as hs}from"@aws-sdk/client-s3";import{getSignedUrl as ys}from"@aws-sdk/s3-request-presigner";var X=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new hs({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 n=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new gs({Bucket:this.bucket,Key:e,Body:n,ContentType:r}))}async get(e){let t=await ys(this.client,new us({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 ms({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 ps({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let n=await this.client.send(new fs({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of n.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=n.IsTruncated?n.NextContinuationToken:void 0}while(r);return t}};function Qe(s,e){return console.warn(e),new Z(s)}function vt(s){let e=s.localRoot??Ss(bs(),".toolnet-memory","storage");if(s.provider==="r2"){let t=s.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new X({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):Qe(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 X({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):Qe(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 ke({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):Qe(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new Z(e)}function Es(s){return new Promise(e=>setTimeout(e,s))}async function xt(s,e={}){let t=Math.max(1,e.attempts??3),r=e.baseDelayMs??150,n=e.maxDelayMs??2e3,i;for(let o=1;o<=t;o++)try{return await s()}catch(a){if(i=a,o>=t)break;let p=Math.min(n,r*2**(o-1)),c=Math.floor(Math.random()*Math.max(1,p*.2));await Es(p+c)}throw i}var vs=new Set(["put","get","getText","delete","list"]);function wt(s,e={}){return new Proxy(s,{get(t,r){let n=Reflect.get(t,r,t);return typeof n!="function"?n:vs.has(r)?(...i)=>xt(()=>Promise.resolve(n.apply(t,i)),e):n.bind(t)}})}function Ct(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 Pt(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 n=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return n?`${n[1]}memory/records/${n[2]}`:(n=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),n?`${n[1]}memory/vectors/${n[2]}`:(n=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),n?`${n[1]}code/graph/${n[2]}`:e))}var Me=class{constructor(e,t,r,n){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=Ct(n??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,n=await this.provider.getText(e);if(n){let o;try{o=JSON.parse(n)}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=Pt(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 Ne=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 _e=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=n=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:n},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 Oe=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=n=>JSON.stringify({version:e.version,projectId:e.projectId,updatedAt:e.updatedAt,data:n},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 je=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 At(s,e={}){let t=Date.now();async function r(u,E,h){await e.onStage?.({id:u,title:E,state:"start"});let v=Date.now(),b=await h();return await e.onStage?.({id:u,title:E,state:"complete",durationMs:Date.now()-v}),b}let n=st(),i=wt(vt({provider:n.storage.provider,huggingface:n.storage.huggingface,localRoot:n.storage.localRoot}),{attempts:3}),o=new Me(i,s.id,s.name,s.remote??s.name),a=new W(o),p=await r("source-index","Source Index",async()=>{let u=await new ue().index(s.id,s.rootPath,{onProgress:E=>{e.onSourceProgress?.(E)}});return await a.save({version:1,projectId:s.id,updatedAt:new Date().toISOString(),files:u.files,symbols:u.graph.allSymbols(s.id),edges:u.graph.allEdges(s.id)}),u}),c=p.graph,l=await r("type-resolution","Type Resolution",async()=>{let u=await new Ee(c).resolveProject(s.id,s.rootPath);return await new Ne(o).save(u),u});await r("rich-graph","Rich Graph",async()=>{let u=new ve(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}),u});let m=await r("semantic-index","Semantic Code Index",async()=>new ye({projectId:s.id,rootPath:s.rootPath,model:process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",storage:o,embeddings:pt(),graph:c}).initialize()),d=await r("architecture","Architecture Intelligence",async()=>{let u=new Ae(c).analyze(s.id);return await new _e(o).save(u),u}),f=await r("analysis","Graph Analysis",async()=>{let u=new Le(c).analyze(s.id);return await new Oe(o).save(u),u}),y=await r("visualization","3D Visualization Dataset",async()=>{let u=new Re(c).build(s.id,d,f);return await new je(o).save(u),u});return{files:p.files,project:{id:s.id,name:s.name,remote:s.remote??s.name},storage:o.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:m,architecture:d.summary,analysis:f.summary,visualization:y.summary}}var It=["\u25C7","\u25C6"],T={clearLine:"\r\x1B[2K",reset:"\x1B[0m",green:"\x1B[32m",gray:"\x1B[90m",white:"\x1B[97m",amber:"\x1B[38;5;214m",cyan:"\x1B[36m",red:"\x1B[31m"};function _(s){return new Intl.NumberFormat("en-US").format(s)}function ee(s){return s<1e3?`${s}ms`:`${(s/1e3).toFixed(1)}s`}function O(s,e,t){return Math.max(e,Math.min(t,s))}function Tt(s,e){return e<=0?"":s.length<=e?s:e<=3?s.slice(0,e):`${s.slice(0,e-1)}\u2026`}function xs(s,e,t){let r=e>0?O(s/e,0,1):0,n=Math.round(r*t);return"\u2501".repeat(n)+"\u2500".repeat(Math.max(0,t-n))}function ws(s,e){let t=Math.max(4,e),r=Math.min(4,t),n=Math.max(1,t-r+1),i=s%n;return"\u2500".repeat(i)+"\u2501".repeat(r)+"\u2500".repeat(Math.max(0,t-i-r))}var De=class{stream;interactive;enabled;colorEnabled;rootPath;stages;intervalMs;timer;spinnerFrame=0;startedAt=Date.now();scanTotal;parseCurrent=0;parseTotal=0;active;lastPlainParseBucket=-1;lastInteractiveParsePercent=-1;finished=!1;constructor(e){this.stream=e.stream??process.stdout,this.enabled=e.enabled??!0;let t=e.interactive??this.stream.isTTY===!0;this.interactive=t&&process.env.TERM!=="dumb",this.colorEnabled=this.interactive&&process.env.NO_COLOR===void 0,this.rootPath=e.rootPath,this.intervalMs=O(e.intervalMs??180,80,1e3),this.stages=e.stages.map(r=>({...r,state:"pending"}))}start(){if(!this.enabled)return;if(this.startedAt=Date.now(),!this.interactive){this.stream.write(`\u25C7 Initializing ToolNet Index
8
+ `),this.stream.write(`\u25C7 Initialized in ${this.rootPath}
9
+ `);return}this.writeStatic(this.color("\u25C7 Initializing ToolNet Index",T.white)),this.stream.write(`
10
+ `);let e=Math.max(16,this.terminalWidth()-18);this.writeStatic(`${this.color("\u25C6",T.green)} Initialized in ${Tt(this.rootPath,e)}`),this.writeStatic(this.color("\u2502",T.gray)),this.active={type:"scan"},this.renderActive(),this.timer=setInterval(()=>{this.spinnerFrame=(this.spinnerFrame+1)%1e4,this.renderActive()},this.intervalMs),this.timer.unref?.()}scanningComplete(e){if(this.scanTotal=e,this.parseTotal=e,!!this.enabled){if(!this.interactive){this.stream.write(`\u25C6 Scanning files \u2014 ${_(e)} found
11
+ `);return}this.commitActive(`${this.tree()} ${this.doneSymbol()} Scanning files \u2014 ${_(e)} found`),this.active={type:"parse"},this.renderActive()}}parsingProgress(e,t){if(this.parseCurrent=e,this.parseTotal=t,!this.enabled)return;let r=t>0?Math.floor(e/t*100):100;if(!this.interactive){let n=r>=100?100:Math.floor(r/25)*25;n!==this.lastPlainParseBucket&&(this.lastPlainParseBucket=n,this.stream.write(`\u2192 Parsing code \u2014 ${r}%
12
+ `));return}r===this.lastInteractiveParsePercent&&e<t||(this.lastInteractiveParsePercent=r,this.active?.type!=="parse"&&(this.active={type:"parse"}),this.renderActive())}startStage(e,t){let r=this.stages.find(n=>n.id===e);if(r&&(r.state="active",r.title=t,r.startedAt=Date.now()),!!this.enabled&&e!=="source-index"){if(!this.interactive){this.stream.write(`\u2192 ${t}
13
+ `);return}this.active={type:"stage",id:e},this.renderActive()}}completeStage(e,t,r=0){let n=this.stages.find(i=>i.id===e);if(n&&(n.state="done",n.title=t,n.durationMs=r),!!this.enabled){if(!this.interactive){e==="source-index"?this.stream.write(`\u2713 Parsing code \u2014 done
14
+ `):this.stream.write(`\u2713 ${t} (${ee(r)})
15
+ `);return}if(e==="source-index"){this.commitActive(`${this.tree()} ${this.doneSymbol()} Parsing code \u2014 done`);return}this.commitActive(`${this.tree()} ${this.doneSymbol()} ${t} \u2014 done ${this.color(ee(r),T.gray)}`)}}finish(e){if(this.finished=!0,this.stopTimer(),!this.enabled)return;if(this.interactive&&this.active&&(this.clearActive(),this.active=void 0),this.interactive){this.writeStatic(this.color("\u2502",T.gray)),this.writeStatic(`${this.color("\u25C6",T.green)} Indexed ${_(e.files)} files`),this.writeStatic(this.color("\u2502",T.gray)),this.writeStatic(`${this.color("\u25C7",T.cyan)} ${_(e.symbols)} symbols, ${_(e.edges)} edges in ${ee(e.durationMs)}`),this.writeStatic(`${this.color("\u25C7",T.cyan)} Storage: ${e.storage}`),this.writeStatic(this.color("\u2502",T.gray)),this.writeStatic(`${this.color("\u2514",T.gray)} ${this.color("\u25C6",T.green)} Done`),this.stream.write(`
16
+ `);return}let t=["",`\u25C6 Indexed ${_(e.files)} files`,"",`\u25C7 ${_(e.symbols)} symbols, ${_(e.edges)} edges in ${ee(e.durationMs)}`,`\u25C7 Storage: ${e.storage}`,"","Done",""];this.stream.write(t.join(`
17
+ `))}fail(e){if(this.finished=!0,this.stopTimer(),!!this.enabled){if(this.interactive){this.clearActive(),this.active=void 0,this.stream.write(`${this.color("\u2717",T.red)} ${e}
18
+ `);return}this.stream.write(`\u2717 ${e}
19
+ `)}}terminalWidth(){let e=this.stream.columns;if(typeof e=="number"&&Number.isFinite(e))return O(Math.floor(e),32,240);let t=process.stdout.columns;return typeof t=="number"&&Number.isFinite(t)?O(Math.floor(t),32,240):80}tree(){return this.color("\u251C",T.gray)}doneSymbol(){return this.color("\u25C6",T.green)}activeSymbol(){return this.color(It[this.spinnerFrame%It.length],T.amber)}color(e,t){return this.colorEnabled?`${t}${e}${T.reset}`:e}activeLine(){if(!this.active)return;if(this.active.type==="scan")return`${this.tree()} ${this.activeSymbol()} Scanning files`;if(this.active.type==="parse"){let a=this.parseTotal>0?O(Math.floor(this.parseCurrent/this.parseTotal*100),0,100):0,p=O(this.terminalWidth()-34,8,24),c=xs(this.parseCurrent,this.parseTotal,p);return`${this.tree()} ${this.activeSymbol()} Parsing code ${this.color(c,T.amber)} ${String(a).padStart(3)}%`}let e=this.active;if(e.type!=="stage")return;let t=this.stages.find(a=>a.id===e.id);if(!t)return;let r=ee(Date.now()-(t.startedAt??Date.now())),n=O(this.terminalWidth()-44,6,18),i=ws(this.spinnerFrame,n),o=O(this.terminalWidth()-n-18,10,36);return`${this.tree()} ${this.activeSymbol()} ${Tt(t.title,o)} ${this.color(i,T.amber)} ${this.color(r,T.gray)}`}renderActive(){if(!this.enabled||!this.interactive||this.finished)return;let e=this.activeLine();e&&this.stream.write(`${T.clearLine}${e}`)}clearActive(){this.interactive&&this.stream.write(T.clearLine)}commitActive(e){this.interactive&&(this.stream.write(`${T.clearLine}${e}
20
+ `),this.active=void 0)}writeStatic(e){this.stream.write(`${e}
21
+ `)}stopTimer(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}};import{createConnection as As}from"node:net";import{homedir as Cs}from"node:os";import{join as Ps}from"node:path";function Lt(){return process.env.TOOLNET_SERVICE_SOCKET??Ps(Cs(),".toolnet","run","service.sock")}function Is(s,e={}){let t=e.socketPath??Lt(),r=e.timeoutMs??1e3;return new Promise((n,i)=>{let o=As({path:t}),a="",p=!1,c=m=>{p||(p=!0,clearTimeout(l),o.destroy(),m())},l=setTimeout(()=>{c(()=>{i(new Error(`ToolNet service timeout after ${r}ms`))})},r);o.setEncoding("utf8"),o.once("connect",()=>{o.write(`${JSON.stringify(s)}
22
+ `)}),o.on("data",m=>{a+=m;let d=a.indexOf(`
23
+ `);if(d===-1)return;let f=a.slice(0,d).trim();c(()=>{try{n(JSON.parse(f))}catch(y){i(y instanceof Error?y:new Error(String(y)))}})}),o.once("error",m=>{c(()=>{i(m)})}),o.once("end",()=>{p||c(()=>{i(new Error("ToolNet service closed without response"))})})})}async function Rt(s,e={}){try{let t=await Is({type:"invalidate",project:s},{timeoutMs:250,...e});return t.ok&&t.type==="invalidate"}catch{return!1}}var K=new se().detect(),rt=tt(K.rootPath,".toolnet"),Ze=tt(rt,"index.lock"),Ns=tt(rt,"last-index.json"),Xe=process.argv.includes("--json"),_s=[{id:"source-index",title:"Source Index"},{id:"type-resolution",title:"Resolving refs"},{id:"rich-graph",title:"Building rich graph"},{id:"semantic-index",title:"Semantic index"},{id:"architecture",title:"Architecture intelligence"},{id:"analysis",title:"Graph analysis"},{id:"visualization",title:"Visualization dataset"}],j=new De({rootPath:K.rootPath,stages:_s,enabled:!Xe});Ls(rt,{recursive:!0});function $e(s){Ms(Ns,JSON.stringify(s,null,2)+`
24
+ `,{encoding:"utf8",mode:384})}var et;try{et=Rs(Ze,"wx",384)}catch{console.error("\u274C Index already running for this project."),console.error(`Lock: ${Ze}`),process.exit(2)}var Fe=new Date().toISOString(),te=[];try{j.start(),$e({version:2,state:"running",startedAt:Fe,completedStages:te,project:K});let s=await At(K,{onSourceProgress:e=>{if(e.phase==="scan"){j.scanningComplete(e.total);return}j.parsingProgress(e.current,e.total)},onStage:async e=>{e.state==="start"?j.startStage(e.id,e.title):(te.push(e.id),j.completeStage(e.id,e.title,e.durationMs??0)),$e({version:2,state:"running",startedAt:Fe,currentStage:e.id,completedStages:[...te],project:K})}});$e({version:2,state:"complete",startedAt:Fe,finishedAt:new Date().toISOString(),completedStages:te,result:s}),await Rt(K),Xe?console.log(JSON.stringify(s,null,2)):j.finish({files:s.files,symbols:s.graph.symbols,edges:s.graph.edges,durationMs:s.durationMs,storage:s.storage})}catch(s){let e=s instanceof Error?s.message:String(s);$e({version:2,state:"failed",startedAt:Fe,failedAt:new Date().toISOString(),completedStages:te,error:e}),j.fail(`Full index failed: ${e}`),Xe&&console.error(e),process.exitCode=1}finally{et!==void 0&&Ts(et),ks(Ze,{force:!0})}
@@ -1,4 +1,4 @@
1
- import"dotenv/config";import{existsSync as ce,readFileSync as le}from"node:fs";import{homedir as de}from"node:os";import{join as pe}from"node:path";function me(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 fe(){let s=process.env.TOOLNET_GLOBAL_ENV??pe(de(),".config","toolnet-memory",".env");if(!ce(s))return;let e=le(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 n=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)&&process.env[n]===void 0&&(process.env[n]=me(r.slice(o+1)))}}fe();function w(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function P(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function V(){return{memory:{autoCapture:w(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:w(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:w(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:w(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:P(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:P(process.env.MEMORY_RERANK_TOP,10),finalContext:P(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:P(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:w(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:P(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as ue}from"node:crypto";import{existsSync as D,mkdirSync as ge,readFileSync as he,renameSync as ye,writeFileSync as Se}from"node:fs";import{basename as be,dirname as I,join as O,parse as q,resolve as k}from"node:path";var Q=".toolnet",xe="project.json";function Ce(s){return ue("sha256").update(s).digest("hex").slice(0,16)}function G(s){return O(s,Q,xe)}function Ee(s){return D(G(s))}function ve(s,e){let t=k(s),r=q(t).root;for(;;){if(Ee(t))return t;if(t===r||e&&t===k(e))break;let o=I(t);if(o===t)break;t=o}return null}function we(s){let e=k(s),t=q(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(n=>D(O(e,n))))return e;if(e===t)break;let o=I(e);if(o===e)break;e=o}return k(s)}function Pe(s){let e;try{e=JSON.parse(he(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:I(I(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 Y(s,e){let t=O(s,Q);ge(t,{recursive:!0});let r=G(s),o=`${r}.tmp-${process.pid}`;Se(o,JSON.stringify(e,null,2)+`
3
- `,{encoding:"utf8",mode:384}),ye(o,r)}function J(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 M=class{detect(e=process.cwd()){let t=k(e),r=we(t),n=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(f=>D(O(r,f))),i=ve(t,n?r:void 0);if(i){let f=G(i),m=Pe(f);return m.rootPath!==i&&(m.rootPath=i,m.updatedAt=new Date().toISOString(),Y(i,m)),J(m,i)}let d=new Date().toISOString(),g=be(r),l={version:1,id:Ce(r),name:g,remote:g,rootPath:r,createdAt:d,updatedAt:d,graphVersion:0,memoryVersion:0};return Y(r,l),J(l,r)}};import{readdir as Ae}from"node:fs/promises";import{extname as Le,join as Ne,relative as Ie}from"node:path";import{basename as Re}from"node:path";var Te=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),je=new Set([".pem",".key",".p12",".pfx"]);function Z(s){let e=Re(s).toLowerCase();if(Te.has(e))return!0;for(let t of je)if(e.endsWith(t))return!0;return!1}var Me=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Oe=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function K(s){let e=[];async function t(r){let o=await Ae(r,{withFileTypes:!0});for(let n of o){if(Oe.has(n.name))continue;let i=Ne(r,n.name);if(n.isDirectory()){await t(i);continue}Me.has(Le(n.name))&&(Z(i)||e.push(Ie(s,i)))}}return await t(s),e.sort()}import{readFile as _e}from"node:fs/promises";import{join as Fe}from"node:path";import{createHash as $e}from"node:crypto";import*as c from"typescript";function X(s,e){return $e("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function z(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function B(s,e,t){let r=Fe(e,t),o=await _e(r,"utf8"),n=c.createSourceFile(t,o,c.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?c.ScriptKind.TSX:c.ScriptKind.TS),i=[],d=[],g=[],l=[],f={id:X(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:n.getLineAndCharacterOfPosition(n.end).line+1};i.push(f);let m=[],x=[];function b(a,y,h,u){let C=X(s,`${t}:${h}:${u??y}:${a.pos}`);return i.push({id:C,projectId:s,name:y,qualifiedName:u??y,type:h,filePath:t,startLine:z(n,a),endLine:n.getLineAndCharacterOfPosition(a.end).line+1}),C}function N(a){if(!c.isStringLiteral(a.moduleSpecifier))return;let y=[],h=a.importClause;if(h?.name&&y.push({localName:h.name.text,importedName:"default",kind:"default"}),h?.namedBindings&&c.isNamedImports(h.namedBindings))for(let u of h.namedBindings.elements)y.push({localName:u.name.text,importedName:u.propertyName?.text??u.name.text,kind:"named"});h?.namedBindings&&c.isNamespaceImport(h.namedBindings)&&y.push({localName:h.namedBindings.name.text,importedName:"*",kind:"namespace"}),d.push({source:a.moduleSpecifier.text,bindings:y})}function v(a,y){for(let h of a.heritageClauses??[])for(let u of h.types){let C=u.expression.getText(n).split(".").at(-1)??"";C&&l.push({fromId:y,targetName:C,type:h.token===c.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function U(a){let y=!1,h=!1;if(c.isImportDeclaration(a)&&N(a),c.isInterfaceDeclaration(a)&&b(a,a.name.text,"interface",a.name.text),c.isClassDeclaration(a)&&a.name){let u=b(a,a.name.text,"class",a.name.text);v(a,u),x.push({id:u,name:a.name.text}),h=!0}if(c.isFunctionDeclaration(a)&&a.name){let u=b(a,a.name.text,"function",a.name.text);m.push(u),y=!0}if(c.isMethodDeclaration(a)&&a.name){let u=a.name.getText(n),C=x.at(-1)?.name,ae=b(a,u,"method",C?`${C}.${u}`:u);m.push(ae),y=!0}if(c.isCallExpression(a)&&(c.isIdentifier(a.expression)&&g.push({callerId:m.at(-1),calleeName:a.expression.text,line:z(n,a)}),c.isPropertyAccessExpression(a.expression))){let u=a.expression;g.push({callerId:m.at(-1),qualifier:u.expression.getText(n),calleeName:u.name.text,line:z(n,a)})}c.forEachChild(a,U),y&&m.pop(),h&&x.pop()}return U(n),{filePath:t,symbols:i,imports:d,calls:g,heritage:l}}import{createHash as De}from"node:crypto";import{dirname as Ge,extname as Ke,normalize as ze,posix as Be}from"node:path";var R=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 We(s,e,t,r){return De("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function E(s){return ze(s).replaceAll("\\","/")}function W(s,e,t){if(!e.startsWith("."))return;let r=E(Be.join(Ge(s),e)),o=Ke(r),n;if(o===".js"){let i=r.slice(0,-3);n=[`${i}.ts`,`${i}.tsx`,`${i}.js`,`${i}.jsx`]}else if(o===".mjs"){let i=r.slice(0,-4);n=[`${i}.mts`,`${i}.ts`,`${i}.mjs`]}else if(o===".cjs"){let i=r.slice(0,-4);n=[`${i}.cts`,`${i}.ts`,`${i}.cjs`]}else o?n=[r]:n=[`${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 n.find(i=>t.has(E(i)))}var T=class{build(e,t){let r=new R,o=new Map;for(let i of t)for(let d of i.symbols)r.addSymbol(d),d.type==="file"&&o.set(E(i.filePath),d);let n=new Set(o.keys());for(let i of t){let d=E(i.filePath),g=o.get(d);if(g){for(let l of i.symbols)l.id!==g.id&&r.addEdge(this.edge(e,g.id,"DEFINES",l.id));for(let l of i.imports){let f=W(d,l.source,n);if(!f)continue;let m=o.get(f);m&&r.addEdge(this.edge(e,g.id,"IMPORTS",m.id,{source:l.source}))}for(let l of i.heritage){let f=r.findByName(e,l.targetName).filter(m=>m.type==="class"||m.type==="interface");for(let m of f)r.addEdge(this.edge(e,l.fromId,l.type,m.id))}for(let l of i.calls){if(!l.callerId)continue;let f=this.resolveCallTargets(e,i,l.calleeName,l.qualifier,t,r,n);for(let m of f)m.id!==l.callerId&&r.addEdge(this.edge(e,l.callerId,"CALLS",m.id,{line:l.line,qualifier:l.qualifier}))}}}return r}resolveCallTargets(e,t,r,o,n,i,d){let g=E(t.filePath),l=i.findByName(e,r).filter(f=>E(f.filePath)===g);if(!o&&l.length)return l;if(o)for(let f of t.imports){if(!f.bindings.find(b=>b.kind==="namespace"&&b.localName===o))continue;let x=W(g,f.source,d);if(x)return i.findByName(e,r).filter(b=>E(b.filePath)===x)}for(let f of t.imports){let m=f.bindings.find(v=>v.localName===r);if(!m)continue;let x=W(g,f.source,d);if(!x)continue;let b=m.importedName==="default"?r:m.importedName,N=i.findByName(e,b).filter(v=>E(v.filePath)===x);if(N.length)return N}return i.findByName(e,r).filter(f=>f.type==="function"||f.type==="method")}edge(e,t,r,o,n){return{id:We(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:n}}};var _=class{async index(e,t){let r=await K(t),o=[];for(let i of r)try{o.push(await B(e,t,i))}catch(d){console.warn(`[indexer] skipped ${i}:`,d instanceof Error?d.message:d)}let n=new T().build(e,o);return{files:o.length,symbols:n.allSymbols(e).length,edges:n.allEdges(e).length,graph:n}}};function ee(s,e){let t=s.allSymbols(e),r=s.allEdges(e),o=i=>t.filter(d=>d.type===i).length,n=i=>r.filter(d=>d.type===i).length;return{files:o("file"),classes:o("class"),interfaces:o("interface"),functions:o("function"),methods:o("method"),properties:o("property"),routes:o("route"),symbols:t.length,edges:r.length,calls:n("CALLS"),callReferences:n("CALL_REFERENCE"),imports:n("IMPORTS"),inherits:n("INHERITS"),implements:n("IMPLEMENTS"),usesType:n("USES_TYPE"),tests:n("TESTS"),routeEdges:n("ROUTE"),writes:n("WRITES")}}import{execFile as He}from"node:child_process";import{promisify as Ue}from"node:util";var Rr=Ue(He);var j=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*as S from"typescript";import*as p from"typescript";var Gs=new Set([p.SyntaxKind.EqualsToken,p.SyntaxKind.PlusEqualsToken,p.SyntaxKind.MinusEqualsToken,p.SyntaxKind.AsteriskEqualsToken,p.SyntaxKind.SlashEqualsToken,p.SyntaxKind.PercentEqualsToken,p.SyntaxKind.QuestionQuestionEqualsToken,p.SyntaxKind.AmpersandAmpersandEqualsToken,p.SyntaxKind.BarBarEqualsToken]);import{homedir as ht}from"node:os";import{join as yt}from"node:path";import{DeleteObjectCommand as Ye,GetObjectCommand as Je,HeadObjectCommand as qe,ListObjectsV2Command as Qe,PutObjectCommand as Ze,S3Client as Xe}from"@aws-sdk/client-s3";import{getSignedUrl as et}from"@aws-sdk/s3-request-presigner";var F=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Xe({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 Ze({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await et(this.client,new Je({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 qe({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 Ye({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Qe({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let n of o.Contents??[])n.Key&&t.push({key:n.Key,size:n.Size,updatedAt:n.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};import{access as te,mkdir as tt,readFile as rt,readdir as st,rm as ot,stat as re,writeFile as nt}from"node:fs/promises";import{dirname as it,join as at,relative as se,resolve as ct}from"node:path";var A=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return ct(this.root,t)}async put(e,t){let r=this.path(e);await tt(it(r),{recursive:!0}),await nt(r,t)}async get(e){try{return await rt(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 te(this.path(e)),!0}catch{return!1}}async delete(e){await ot(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await te(t)}catch{return r}let o=async i=>{let d=await st(i,{withFileTypes:!0});for(let g of d){let l=at(i,g.name);if(g.isDirectory()){await o(l);continue}let f=await re(l);r.push({key:se(this.root,l),size:f.size,updatedAt:f.mtime.toISOString()})}},n=await re(t);return n.isDirectory()?await o(t):r.push({key:se(this.root,t),size:n.size,updatedAt:n.mtime.toISOString()}),r}};import{DeleteObjectCommand as lt,GetObjectCommand as dt,HeadObjectCommand as pt,ListObjectsV2Command as mt,PutObjectCommand as ft,S3Client as ut}from"@aws-sdk/client-s3";import{getSignedUrl as gt}from"@aws-sdk/s3-request-presigner";var L=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new ut({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 ft({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await gt(this.client,new dt({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 pt({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 lt({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new mt({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let n of o.Contents??[])n.Key&&t.push({key:n.Key,size:n.Size,updatedAt:n.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};function H(s,e){return console.warn(e),new A(s)}function oe(s){let e=s.localRoot??yt(ht(),".toolnet-memory","storage");if(s.provider==="r2"){let t=s.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new L({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(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 L({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(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 F({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new A(e)}function ne(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 ie(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 $=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=ne(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 i;try{i=JSON.parse(o)}catch(d){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${d instanceof Error?d.message:String(d)}`)}if(typeof i.id=="string"&&i.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${i.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof i.createdAt=="string"&&(r=i.createdAt)}let n={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(n,null,2)+`
4
- `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=ie(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))}};async function St(){let s=V(),e=new M().detect(),t=oe({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),r=new $(t,e.id,e.name,e.remote??e.name),o=await new _().index(e.id,e.rootPath),n=ee(o.graph,e.id);await new j(r).save({version:1,projectId:e.id,updatedAt:new Date().toISOString(),files:o.files,symbols:o.graph.allSymbols(e.id),edges:o.graph.allEdges(e.id)}),console.log({ok:!0,storage:r.name,...n})}St().catch(s=>{console.error(s),process.exit(1)});
1
+ import"dotenv/config";import{existsSync as ce,readFileSync as le}from"node:fs";import{homedir as de}from"node:os";import{join as pe}from"node:path";function ue(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 me(){let s=process.env.TOOLNET_GLOBAL_ENV??pe(de(),".config","toolnet-memory",".env");if(!ce(s))return;let e=le(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 n=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(n)&&process.env[n]===void 0&&(process.env[n]=ue(r.slice(o+1)))}}me();function v(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function P(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function V(){return{memory:{autoCapture:v(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:v(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:v(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:v(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:P(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:P(process.env.MEMORY_RERANK_TOP,10),finalContext:P(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:P(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:v(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:P(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as fe}from"node:crypto";import{existsSync as D,mkdirSync as ge,readFileSync as he,renameSync as ye,writeFileSync as Se}from"node:fs";import{basename as be,dirname as N,join as O,parse as J,resolve as k}from"node:path";var Q=".toolnet",xe="project.json";function Ce(s){return fe("sha256").update(s).digest("hex").slice(0,16)}function G(s){return O(s,Q,xe)}function we(s){return D(G(s))}function Ee(s,e){let t=k(s),r=J(t).root;for(;;){if(we(t))return t;if(t===r||e&&t===k(e))break;let o=N(t);if(o===t)break;t=o}return null}function ve(s){let e=k(s),t=J(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(n=>D(O(e,n))))return e;if(e===t)break;let o=N(e);if(o===e)break;e=o}return k(s)}function Pe(s){let e;try{e=JSON.parse(he(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:N(N(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 Y(s,e){let t=O(s,Q);ge(t,{recursive:!0});let r=G(s),o=`${r}.tmp-${process.pid}`;Se(o,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),ye(o,r)}function q(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 I=class{detect(e=process.cwd()){let t=k(e),r=ve(t),n=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(m=>D(O(r,m))),i=Ee(t,n?r:void 0);if(i){let m=G(i),u=Pe(m);return u.rootPath!==i&&(u.rootPath=i,u.updatedAt=new Date().toISOString(),Y(i,u)),q(u,i)}let d=new Date().toISOString(),f=be(r),c={version:1,id:Ce(r),name:f,remote:f,rootPath:r,createdAt:d,updatedAt:d,graphVersion:0,memoryVersion:0};return Y(r,c),q(c,r)}};import{readdir as Ae}from"node:fs/promises";import{extname as Le,join as Me,relative as Ne}from"node:path";import{basename as Re}from"node:path";var Te=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),je=new Set([".pem",".key",".p12",".pfx"]);function Z(s){let e=Re(s).toLowerCase();if(Te.has(e))return!0;for(let t of je)if(e.endsWith(t))return!0;return!1}var Ie=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Oe=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function K(s){let e=[];async function t(r){let o=await Ae(r,{withFileTypes:!0});for(let n of o){if(Oe.has(n.name))continue;let i=Me(r,n.name);if(n.isDirectory()){await t(i);continue}Ie.has(Le(n.name))&&(Z(i)||e.push(Ne(s,i)))}}return await t(s),e.sort()}import{readFile as _e}from"node:fs/promises";import{join as Fe}from"node:path";import{createHash as $e}from"node:crypto";import*as l from"typescript";function X(s,e){return $e("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function z(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function B(s,e,t){let r=Fe(e,t),o=await _e(r,"utf8"),n=l.createSourceFile(t,o,l.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?l.ScriptKind.TSX:l.ScriptKind.TS),i=[],d=[],f=[],c=[],m={id:X(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:n.getLineAndCharacterOfPosition(n.end).line+1};i.push(m);let u=[],x=[];function b(a,y,h,g){let C=X(s,`${t}:${h}:${g??y}:${a.pos}`);return i.push({id:C,projectId:s,name:y,qualifiedName:g??y,type:h,filePath:t,startLine:z(n,a),endLine:n.getLineAndCharacterOfPosition(a.end).line+1}),C}function M(a){if(!l.isStringLiteral(a.moduleSpecifier))return;let y=[],h=a.importClause;if(h?.name&&y.push({localName:h.name.text,importedName:"default",kind:"default"}),h?.namedBindings&&l.isNamedImports(h.namedBindings))for(let g of h.namedBindings.elements)y.push({localName:g.name.text,importedName:g.propertyName?.text??g.name.text,kind:"named"});h?.namedBindings&&l.isNamespaceImport(h.namedBindings)&&y.push({localName:h.namedBindings.name.text,importedName:"*",kind:"namespace"}),d.push({source:a.moduleSpecifier.text,bindings:y})}function E(a,y){for(let h of a.heritageClauses??[])for(let g of h.types){let C=g.expression.getText(n).split(".").at(-1)??"";C&&c.push({fromId:y,targetName:C,type:h.token===l.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function U(a){let y=!1,h=!1;if(l.isImportDeclaration(a)&&M(a),l.isInterfaceDeclaration(a)&&b(a,a.name.text,"interface",a.name.text),l.isClassDeclaration(a)&&a.name){let g=b(a,a.name.text,"class",a.name.text);E(a,g),x.push({id:g,name:a.name.text}),h=!0}if(l.isFunctionDeclaration(a)&&a.name){let g=b(a,a.name.text,"function",a.name.text);u.push(g),y=!0}if(l.isMethodDeclaration(a)&&a.name){let g=a.name.getText(n),C=x.at(-1)?.name,ae=b(a,g,"method",C?`${C}.${g}`:g);u.push(ae),y=!0}if(l.isCallExpression(a)&&(l.isIdentifier(a.expression)&&f.push({callerId:u.at(-1),calleeName:a.expression.text,line:z(n,a)}),l.isPropertyAccessExpression(a.expression))){let g=a.expression;f.push({callerId:u.at(-1),qualifier:g.expression.getText(n),calleeName:g.name.text,line:z(n,a)})}l.forEachChild(a,U),y&&u.pop(),h&&x.pop()}return U(n),{filePath:t,symbols:i,imports:d,calls:f,heritage:c}}import{createHash as De}from"node:crypto";import{dirname as Ge,extname as Ke,normalize as ze,posix as Be}from"node:path";var R=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 We(s,e,t,r){return De("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function w(s){return ze(s).replaceAll("\\","/")}function W(s,e,t){if(!e.startsWith("."))return;let r=w(Be.join(Ge(s),e)),o=Ke(r),n;if(o===".js"){let i=r.slice(0,-3);n=[`${i}.ts`,`${i}.tsx`,`${i}.js`,`${i}.jsx`]}else if(o===".mjs"){let i=r.slice(0,-4);n=[`${i}.mts`,`${i}.ts`,`${i}.mjs`]}else if(o===".cjs"){let i=r.slice(0,-4);n=[`${i}.cts`,`${i}.ts`,`${i}.cjs`]}else o?n=[r]:n=[`${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 n.find(i=>t.has(w(i)))}var T=class{build(e,t){let r=new R,o=new Map;for(let i of t)for(let d of i.symbols)r.addSymbol(d),d.type==="file"&&o.set(w(i.filePath),d);let n=new Set(o.keys());for(let i of t){let d=w(i.filePath),f=o.get(d);if(f){for(let c of i.symbols)c.id!==f.id&&r.addEdge(this.edge(e,f.id,"DEFINES",c.id));for(let c of i.imports){let m=W(d,c.source,n);if(!m)continue;let u=o.get(m);u&&r.addEdge(this.edge(e,f.id,"IMPORTS",u.id,{source:c.source}))}for(let c of i.heritage){let m=r.findByName(e,c.targetName).filter(u=>u.type==="class"||u.type==="interface");for(let u of m)r.addEdge(this.edge(e,c.fromId,c.type,u.id))}for(let c of i.calls){if(!c.callerId)continue;let m=this.resolveCallTargets(e,i,c.calleeName,c.qualifier,t,r,n);for(let u of m)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,n,i,d){let f=w(t.filePath),c=i.findByName(e,r).filter(m=>w(m.filePath)===f);if(!o&&c.length)return c;if(o)for(let m of t.imports){if(!m.bindings.find(b=>b.kind==="namespace"&&b.localName===o))continue;let x=W(f,m.source,d);if(x)return i.findByName(e,r).filter(b=>w(b.filePath)===x)}for(let m of t.imports){let u=m.bindings.find(E=>E.localName===r);if(!u)continue;let x=W(f,m.source,d);if(!x)continue;let b=u.importedName==="default"?r:u.importedName,M=i.findByName(e,b).filter(E=>w(E.filePath)===x);if(M.length)return M}return i.findByName(e,r).filter(m=>m.type==="function"||m.type==="method")}edge(e,t,r,o,n){return{id:We(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:n}}};var _=class{async index(e,t,r={}){let o=await K(t);r.onProgress?.({phase:"scan",current:o.length,total:o.length});let n=[],i=0;for(let f of o)try{n.push(await B(e,t,f))}catch(c){console.warn(`[indexer] skipped ${f}:`,c instanceof Error?c.message:c)}finally{i+=1,r.onProgress?.({phase:"parse",current:i,total:o.length,file:f})}let d=new T().build(e,n);return{files:n.length,symbols:d.allSymbols(e).length,edges:d.allEdges(e).length,graph:d}}};function ee(s,e){let t=s.allSymbols(e),r=s.allEdges(e),o=i=>t.filter(d=>d.type===i).length,n=i=>r.filter(d=>d.type===i).length;return{files:o("file"),classes:o("class"),interfaces:o("interface"),functions:o("function"),methods:o("method"),properties:o("property"),routes:o("route"),symbols:t.length,edges:r.length,calls:n("CALLS"),callReferences:n("CALL_REFERENCE"),imports:n("IMPORTS"),inherits:n("INHERITS"),implements:n("IMPLEMENTS"),usesType:n("USES_TYPE"),tests:n("TESTS"),routeEdges:n("ROUTE"),writes:n("WRITES")}}import{execFile as He}from"node:child_process";import{promisify as Ue}from"node:util";var Nr=Ue(He);var j=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*as S from"typescript";import*as p from"typescript";var Us=new Set([p.SyntaxKind.EqualsToken,p.SyntaxKind.PlusEqualsToken,p.SyntaxKind.MinusEqualsToken,p.SyntaxKind.AsteriskEqualsToken,p.SyntaxKind.SlashEqualsToken,p.SyntaxKind.PercentEqualsToken,p.SyntaxKind.QuestionQuestionEqualsToken,p.SyntaxKind.AmpersandAmpersandEqualsToken,p.SyntaxKind.BarBarEqualsToken]);import{homedir as ht}from"node:os";import{join as yt}from"node:path";import{DeleteObjectCommand as Ye,GetObjectCommand as qe,HeadObjectCommand as Je,ListObjectsV2Command as Qe,PutObjectCommand as Ze,S3Client as Xe}from"@aws-sdk/client-s3";import{getSignedUrl as et}from"@aws-sdk/s3-request-presigner";var F=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Xe({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 Ze({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await et(this.client,new qe({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 Je({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 Ye({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Qe({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let n of o.Contents??[])n.Key&&t.push({key:n.Key,size:n.Size,updatedAt:n.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};import{access as te,mkdir as tt,readFile as rt,readdir as st,rm as ot,stat as re,writeFile as nt}from"node:fs/promises";import{dirname as it,join as at,relative as se,resolve as ct}from"node:path";var A=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return ct(this.root,t)}async put(e,t){let r=this.path(e);await tt(it(r),{recursive:!0}),await nt(r,t)}async get(e){try{return await rt(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 te(this.path(e)),!0}catch{return!1}}async delete(e){await ot(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await te(t)}catch{return r}let o=async i=>{let d=await st(i,{withFileTypes:!0});for(let f of d){let c=at(i,f.name);if(f.isDirectory()){await o(c);continue}let m=await re(c);r.push({key:se(this.root,c),size:m.size,updatedAt:m.mtime.toISOString()})}},n=await re(t);return n.isDirectory()?await o(t):r.push({key:se(this.root,t),size:n.size,updatedAt:n.mtime.toISOString()}),r}};import{DeleteObjectCommand as lt,GetObjectCommand as dt,HeadObjectCommand as pt,ListObjectsV2Command as ut,PutObjectCommand as mt,S3Client as ft}from"@aws-sdk/client-s3";import{getSignedUrl as gt}from"@aws-sdk/s3-request-presigner";var L=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new ft({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 mt({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await gt(this.client,new dt({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 pt({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 lt({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new ut({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let n of o.Contents??[])n.Key&&t.push({key:n.Key,size:n.Size,updatedAt:n.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};function H(s,e){return console.warn(e),new A(s)}function oe(s){let e=s.localRoot??yt(ht(),".toolnet-memory","storage");if(s.provider==="r2"){let t=s.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new L({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(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 L({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(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 F({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):H(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new A(e)}function ne(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 ie(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 $=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=ne(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 i;try{i=JSON.parse(o)}catch(d){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${d instanceof Error?d.message:String(d)}`)}if(typeof i.id=="string"&&i.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${i.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof i.createdAt=="string"&&(r=i.createdAt)}let n={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(n,null,2)+`
4
+ `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=ie(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))}};async function St(){let s=V(),e=new I().detect(),t=oe({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),r=new $(t,e.id,e.name,e.remote??e.name),o=await new _().index(e.id,e.rootPath),n=ee(o.graph,e.id);await new j(r).save({version:1,projectId:e.id,updatedAt:new Date().toISOString(),files:o.files,symbols:o.graph.allSymbols(e.id),edges:o.graph.allEdges(e.id)}),console.log({ok:!0,storage:r.name,...n})}St().catch(s=>{console.error(s),process.exit(1)});
@@ -0,0 +1,12 @@
1
+ import*as c from"fs";import*as i from"path";import{existsSync as w,mkdirSync as D,readFileSync as b,renameSync as $,writeFileSync as L}from"node:fs";import{dirname as z,join as v}from"node:path";import{createHash as F}from"node:crypto";function g(n){return F("sha256").update(n).digest("hex")}function A(n){return v(n.rootPath,".toolnet","context","handoff.md")}function C(n){return v(n.rootPath,".toolnet","context","handoff.json")}function M(n,e){D(z(n),{recursive:!0});let t=`${n}.tmp-${process.pid}-${Date.now()}`;L(t,e.endsWith(`
2
+ `)?e:`${e}
3
+ `,{encoding:"utf8",mode:384}),$(t,n)}function H(n,e){M(n,`${JSON.stringify(e,null,2)}
4
+ `)}function E(n,e){let t=e.replace(/\r\n/g,`
5
+ `).trim();if(!t)return null;let r={version:1,projectId:n.id,projectName:n.name,text:t,digest:g(t),generatedAt:new Date().toISOString()};return M(A(n),t),H(C(n),r),r}function R(n){let e=A(n);if(!w(e))return null;try{let t=b(e,"utf8").trim();if(!t)return null;let r=new Date(0).toISOString(),o=C(n);if(w(o))try{let s=JSON.parse(b(o,"utf8"));typeof s.generatedAt=="string"&&(r=s.generatedAt)}catch{}return{version:1,projectId:n.id,projectName:n.name,text:t,digest:g(t),generatedAt:r}}catch{return null}}function T(n){let e=i.resolve(n),t=i.parse(e).root;for(;e!==t;){let r=i.join(e,".toolnet");if(c.existsSync(r)&&c.statSync(r).isDirectory())return e;e=i.dirname(e)}return null}import{existsSync as W,readFileSync as J}from"node:fs";import{join as U}from"node:path";import{existsSync as V,mkdirSync as De,readFileSync as G,renameSync as $e,writeFileSync as Le}from"node:fs";import{dirname as He,join as B}from"node:path";function K(n){return B(n.rootPath,".toolnet","context","session-origin.json")}function Y(n){let e=K(n);if(!V(e))return null;try{let t=JSON.parse(G(e,"utf8"));return t.version!==1||t.projectId!==n.id?null:t}catch{return null}}function O(n){let e=Y(n);if(!e)return null;let t=["Previous session:",`- Agent: ${e.agent}`,`- Session: ${e.nativeSessionId}`];return e.currentRequest&&t.push(`- Current request: ${e.currentRequest}`),e.currentActivity&&t.push(`- Current activity: ${e.currentActivity}`),e.currentPhase&&t.push(`- Current phase: ${e.currentPhase}`),e.currentTask&&t.push(`- Current task: ${e.currentTask}`),e.lastTouchedFile&&t.push(`- Last touched file: ${e.lastTouchedFile}`),e.latestBlocker&&t.push(`- Blocker: ${e.latestBlocker}`),e.latestNextAction&&t.push(`- Next action: ${e.latestNextAction}`),e.latestDecision&&t.push(`- Important decision: ${e.latestDecision}`),t.join(`
6
+ `)}function q(n){let e=U(n.rootPath,".toolnet","current.md");if(!W(e))return null;try{return J(e,"utf8").trim()}catch{return null}}function Q(n,e){let t=e.replace(/\r\n/g,`
7
+ `).trim(),r=2400,o=t.length>r?`${t.slice(0,r)}
8
+
9
+ [Current work truncated for fast handoff]`:t,s=O(n);return["# ToolNet Fast Handoff","",`Project: ${n.name}`,"",...s?[s,""]:[],o,"","---","","Continuation rule:","- Continue unfinished work; do not redo completed steps.","- Query ToolNet Memory only when deeper history is needed."].join(`
10
+ `)}function I(n){let e=q(n);if(e===null)return{updated:!1,reason:"missing-current",chars:0};if(!e.trim())return{updated:!1,reason:"empty-current",chars:0};let t=Q(n,e);return R(n)?.text.trim()===t.trim()?{updated:!1,reason:"unchanged",chars:t.length}:(E(n,t),{updated:!0,reason:"updated",chars:t.length})}import{existsSync as Z,readFileSync as X}from"node:fs";import{homedir as ee}from"node:os";import{join as te}from"node:path";function ne(n){let e=n.trim();return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?(e=e.slice(1,-1),e.replace(/\\n/g,`
11
+ `).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\"/g,'"').replace(/\\\\/g,"\\")):e.length>=2&&e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function re(){let n=process.env.TOOLNET_GLOBAL_ENV??te(ee(),".config","toolnet-memory",".env");if(!Z(n))return;let e=X(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 o=r.indexOf("=");if(o<=0)continue;let s=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(s)&&process.env[s]===void 0&&(process.env[s]=ne(r.slice(o+1)))}}re();import{createHash as oe}from"node:crypto";import{existsSync as y,mkdirSync as se,readFileSync as ie,renameSync as ae,writeFileSync as ce}from"node:fs";import{basename as ue,dirname as l,join as p,parse as N,resolve as d}from"node:path";var P=".toolnet",de="project.json";function le(n){return oe("sha256").update(n).digest("hex").slice(0,16)}function h(n){return p(n,P,de)}function fe(n){return y(h(n))}function pe(n,e){let t=d(n),r=N(t).root;for(;;){if(fe(t))return t;if(t===r||e&&t===d(e))break;let o=l(t);if(o===t)break;t=o}return null}function me(n){let e=d(n),t=N(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(s=>y(p(e,s))))return e;if(e===t)break;let o=l(e);if(o===e)break;e=o}return d(n)}function ge(n){let e;try{e=JSON.parse(ie(n,"utf8"))}catch(o){throw new Error(`Invalid ToolNet project manifest: ${n}: ${o instanceof Error?o.message:String(o)}`)}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:l(l(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 j(n,e){let t=p(n,P);se(t,{recursive:!0});let r=h(n),o=`${r}.tmp-${process.pid}`;ce(o,JSON.stringify(e,null,2)+`
12
+ `,{encoding:"utf8",mode:384}),ae(o,r)}function _(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 f=class{detect(e=process.cwd()){let t=d(e),r=me(t),s=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(m=>y(p(r,m))),a=pe(t,s?r:void 0);if(a){let m=h(a),u=ge(m);return u.rootPath!==a&&(u.rootPath=a,u.updatedAt=new Date().toISOString(),j(a,u)),_(u,a)}let S=new Date().toISOString(),x=ue(r),k={version:1,id:le(r),name:x,remote:x,rootPath:r,createdAt:S,updatedAt:S,graphVersion:0,memoryVersion:0};return j(r,k),_(k,r)}};function ye(){let n=process.cwd(),e=T(n);if(!e){console.error("Not in a ToolNet project."),process.exitCode=1;return}let t=new f().detect(e);if(!t){console.error("Unable to detect ToolNet project."),process.exitCode=1;return}let r=I(t);console.log(JSON.stringify({project:t.name,...r},null,2))}ye();