toolnet-memory 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
- import{closeSync as Gr,mkdirSync as zr,openSync as Br,rmSync as Hr,writeFileSync as Kr}from"node:fs";import{join as $e}from"node:path";import{existsSync as dt,readFileSync as pt}from"node:fs";import{homedir as mt}from"node:os";import{join as ut}from"node:path";function ft(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 gt(){let n=process.env.TOOLNET_GLOBAL_ENV??ut(mt(),".config","toolnet-memory",".env");if(!dt(n))return;let e=pt(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]=ft(r.slice(s+1)))}}gt();function V(n,e){return n===void 0?e:["1","true","yes","on"].includes(n.toLowerCase())}function O(n,e){if(!n)return e;let t=Number(n);return Number.isFinite(t)?t:e}function Ge(){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:O(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:O(process.env.MEMORY_RERANK_TOP,10),finalContext:O(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:O(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",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:O(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as ht}from"node:crypto";import{existsSync as He,mkdirSync as yt,readFileSync as St,renameSync as bt,writeFileSync as xt}from"node:fs";import{basename as wt,dirname as U,join as Te,parse as Ke,resolve as J}from"node:path";var We=".toolnet",Et="project.json";function Ct(n){return ht("sha256").update(n).digest("hex").slice(0,16)}function Re(n){return Te(n,We,Et)}function vt(n){return He(Re(n))}function Pt(n){let e=J(n),t=Ke(e).root;for(;;){if(vt(e))return e;if(e===t)break;let r=U(e);if(r===e)break;e=r}return null}function Tt(n){let e=J(n),t=Ke(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>He(Te(e,i))))return e;if(e===t)break;let s=U(e);if(s===e)break;e=s}return J(n)}function Rt(n){let e;try{e=JSON.parse(St(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:U(U(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 ze(n,e){let t=Te(n,We);yt(t,{recursive:!0});let r=Re(n),s=`${r}.tmp-${process.pid}`;xt(s,JSON.stringify(e,null,2)+`
3
- `,{encoding:"utf8",mode:384}),bt(s,r)}function Be(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=J(e),r=Pt(t);if(r){let m=Re(r),c=Rt(m);return c.rootPath!==r&&(c.rootPath=r,c.updatedAt=new Date().toISOString(),ze(r,c)),Be(c,r)}let s=Tt(t),i=new Date().toISOString(),o=wt(s),a={version:1,id:Ct(s),name:o,remote:o,rootPath:s,createdAt:i,updatedAt:i,graphVersion:0,memoryVersion:0};return ze(s,a),Be(a,s)}};var kt=[{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}],Y=class{scan(e){let t=[];for(let r of kt){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 F=class{scanner=new Y;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 Z=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=>Lt(i))}};function Lt(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 At}from"node:crypto";var Q=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=At("sha256").update(s).digest().readUInt32BE(0)%this.dimensions;t[o]+=1}return jt(t)}async embedMany(e){return Promise.all(e.map(t=>this.embed(t)))}};function jt(n){let e=Math.sqrt(n.reduce((t,r)=>t+r*r,0));return e===0?n:n.map(t=>t/e)}var ke=class{constructor(e,t=new Q){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 Ve(){let n=process.env.HF_TOKEN,e=process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",t=n?new Z({token:n,model:e}):null;return new ke(t)}import{readdir as Ot}from"node:fs/promises";import{extname as Ft,join as _t,relative as $t}from"node:path";import{basename as Nt}from"node:path";var Mt=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),It=new Set([".pem",".key",".p12",".pfx"]);function Ue(n){let e=Nt(n).toLowerCase();if(Mt.has(e))return!0;for(let t of It)if(e.endsWith(t))return!0;return!1}var Dt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Gt=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function Le(n){let e=[];async function t(r){let s=await Ot(r,{withFileTypes:!0});for(let i of s){if(Gt.has(i.name))continue;let o=_t(r,i.name);if(i.isDirectory()){await t(o);continue}Dt.has(Ft(i.name))&&(Ue(o)||e.push($t(n,o)))}}return await t(n),e.sort()}import{readFile as zt}from"node:fs/promises";import{join as Bt}from"node:path";import{createHash as Ht}from"node:crypto";import v from"typescript";function Je(n,e){return Ht("sha256").update(`${n}:${e}`).digest("hex").slice(0,24)}function Ae(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}async function je(n,e,t){let r=Bt(e,t),s=await zt(r,"utf8"),i=v.createSourceFile(t,s,v.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?v.ScriptKind.TSX:v.ScriptKind.TS),o=[],a=[],m=[],c=[],l={id:Je(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 f=[],d=[];function u(g,b,y,x){let C=Je(n,`${t}:${y}:${x??b}:${g.pos}`);return o.push({id:C,projectId:n,name:b,qualifiedName:x??b,type:y,filePath:t,startLine:Ae(i,g),endLine:i.getLineAndCharacterOfPosition(g.end).line+1}),C}function h(g){if(!v.isStringLiteral(g.moduleSpecifier))return;let b=[],y=g.importClause;if(y?.name&&b.push({localName:y.name.text,importedName:"default",kind:"default"}),y?.namedBindings&&v.isNamedImports(y.namedBindings))for(let x of y.namedBindings.elements)b.push({localName:x.name.text,importedName:x.propertyName?.text??x.name.text,kind:"named"});y?.namedBindings&&v.isNamespaceImport(y.namedBindings)&&b.push({localName:y.namedBindings.name.text,importedName:"*",kind:"namespace"}),a.push({source:g.moduleSpecifier.text,bindings:b})}function p(g,b){for(let y of g.heritageClauses??[])for(let x of y.types){let C=x.expression.getText(i).split(".").at(-1)??"";C&&c.push({fromId:b,targetName:C,type:y.token===v.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function S(g){let b=!1,y=!1;if(v.isImportDeclaration(g)&&h(g),v.isInterfaceDeclaration(g)&&u(g,g.name.text,"interface",g.name.text),v.isClassDeclaration(g)&&g.name){let x=u(g,g.name.text,"class",g.name.text);p(g,x),d.push({id:x,name:g.name.text}),y=!0}if(v.isFunctionDeclaration(g)&&g.name){let x=u(g,g.name.text,"function",g.name.text);f.push(x),b=!0}if(v.isMethodDeclaration(g)&&g.name){let x=g.name.getText(i),C=d.at(-1)?.name,E=u(g,x,"method",C?`${C}.${x}`:x);f.push(E),b=!0}if(v.isCallExpression(g)&&(v.isIdentifier(g.expression)&&m.push({callerId:f.at(-1),calleeName:g.expression.text,line:Ae(i,g)}),v.isPropertyAccessExpression(g.expression))){let x=g.expression;m.push({callerId:f.at(-1),qualifier:x.expression.getText(i),calleeName:x.name.text,line:Ae(i,g)})}v.forEachChild(g,S),b&&f.pop(),y&&d.pop()}return S(i),{filePath:t,symbols:o,imports:a,calls:m,heritage:c}}import{createHash as Kt}from"node:crypto";import{dirname as Wt,extname as Vt,normalize as Ut,posix as Jt}from"node:path";var _=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 Kt("sha256").update(`${n}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function A(n){return Ut(n).replaceAll("\\","/")}function Ne(n,e,t){if(!e.startsWith("."))return;let r=A(Jt.join(Wt(n),e)),s=Vt(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(A(o)))}var $=class{build(e,t){let r=new _,s=new Map;for(let o of t)for(let a of o.symbols)r.addSymbol(a),a.type==="file"&&s.set(A(o.filePath),a);let i=new Set(s.keys());for(let o of t){let a=A(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=Ne(a,c.source,i);if(!l)continue;let f=s.get(l);f&&r.addEdge(this.edge(e,m.id,"IMPORTS",f.id,{source:c.source}))}for(let c of o.heritage){let l=r.findByName(e,c.targetName).filter(f=>f.type==="class"||f.type==="interface");for(let f of l)r.addEdge(this.edge(e,c.fromId,c.type,f.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 f of l)f.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",f.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,s,i,o,a){let m=A(t.filePath),c=o.findByName(e,r).filter(l=>A(l.filePath)===m);if(!s&&c.length)return c;if(s)for(let l of t.imports){if(!l.bindings.find(u=>u.kind==="namespace"&&u.localName===s))continue;let d=Ne(m,l.source,a);if(d)return o.findByName(e,r).filter(u=>A(u.filePath)===d)}for(let l of t.imports){let f=l.bindings.find(p=>p.localName===r);if(!f)continue;let d=Ne(m,l.source,a);if(!d)continue;let u=f.importedName==="default"?r:f.importedName,h=o.findByName(e,u).filter(p=>A(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 X=class{async index(e,t){let r=await Le(t),s=[];for(let o of r)try{s.push(await je(e,t,o))}catch(a){console.warn(`[indexer] skipped ${o}:`,a instanceof Error?a.message:a)}let i=new $().build(e,s);return{files:s.length,symbols:i.allSymbols(e).length,edges:i.allEdges(e).length,graph:i}}};import{execFile as Yt}from"node:child_process";import{promisify as Zt}from"node:util";var mo=Zt(Yt);var D=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 Qt}from"node:crypto";import{readFile as Xt}from"node:fs/promises";import{join as er}from"node:path";function qe(n){return Qt("sha256").update(n).digest("hex")}var ee=class{sanitizer=new F;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 f;try{f=await Xt(er(t,c),"utf8")}catch{continue}let d=f.split(/\r?\n/),u=l.filter(h=>h.type!=="file"&&typeof h.startLine=="number"&&typeof h.endLine=="number");if(u.length>0)for(let h of u)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=[],f=m,d=0;for(;f<=c;){let u=Math.min(c,f+o-1),h=s.slice(f-1,u).join(`
4
- `).trim();if(h){let p=this.sanitizer.sanitize(h).text,S=qe(p),g=[t,r,i?.id??"file",String(d),S].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:f,endLine:u,content:p,contentHash:S})}if(u>=c)break;f=u-a+1,d++}return l}};var te=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 re=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 se=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=tr(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 tr(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 Me(n){return n.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}_\-./]+/gu," ").split(/\s+/).map(e=>e.trim()).filter(e=>e.length>1)}function Ye(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 oe=class{constructor(e){this.options=e}options;vectors=new se;chunks=new Map;async initialize(){let{projectId:e,rootPath:t,storage:r,embeddings:s,graph:i,model:o}=this.options,a=new te(r),m=new re(r),c=await new ee().build(e,t,i.allSymbols(e));this.chunks.clear();for(let E of c)this.chunks.set(E.id,E);let l=await a.load(e),f=!l||l.chunks.length!==c.length||l.chunks.some(E=>!this.chunks.has(E.id));f&&await a.save({version:1,projectId:e,updatedAt:new Date().toISOString(),chunks:c});let d=await m.load(e),u=0;d&&d.model===o&&(u=this.vectors.importRecords(d.records));let h=new Set(c.map(E=>E.id)),p=0;for(let E of this.vectors.exportProject(e))h.has(E.id)||this.vectors.remove(E.id)&&p++;let S=c.filter(E=>{let k=this.vectors.get(E.id);return k?k.metadata?.contentHash!==E.contentHash:!0}),g=0,b=8,y=this.vectors.exportProject(e)[0]?.vector.length;for(let E=0;E<S.length;E+=b){let k=S.slice(E,E+b),ct=k.map(R=>[`file: ${R.filePath}`,R.symbolName?`symbol: ${R.symbolName}`:"",R.symbolType?`type: ${R.symbolType}`:"",R.content].filter(Boolean).join(`
5
- `)),lt=await s.embedMany(ct);for(let R=0;R<k.length;R++){let L=k[R],N=lt[R];if(!(!L||!N||N.length===0)){if(y===void 0&&(y=N.length),N.length!==y){console.warn(`[code-semantic] skip dimension mismatch: ${N.length} != ${y}`);continue}this.vectors.upsert({id:L.id,projectId:e,vector:N,metadata:{contentHash:L.contentHash,filePath:L.filePath,symbolName:L.symbolName,symbolType:L.symbolType,startLine:L.startLine,endLine:L.endLine}}),g++}}}let x=this.vectors.exportProject(e),C=g>0||p>0||!d||d.model!==o;return C&&await m.save({version:1,projectId:e,model:o,dimensions:x[0]?.vector.length??y??0,updatedAt:new Date().toISOString(),records:x}),{chunks:c.length,vectorsLoaded:u,vectorsIndexed:g,vectorsRemoved:p,totalVectors:x.length,savedChunks:f,savedVectors:C}}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(Me(e)),o=[];for(let a of s){let m=this.chunks.get(a.id);if(!m)continue;let c=new Set(Me([m.filePath,m.symbolName??"",m.symbolType??"",m.content].join(" "))),l=0;for(let p of i)c.has(p)&&l++;let f=i.size===0?0:l/i.size,d=Math.max(0,a.score),u=Ye(m.filePath,e),h=(d*.75+f*.25)*u;o.push({chunk:m,score:h,vectorScore:d,lexicalScore:f})}return o.sort((a,m)=>m.score-a.score).slice(0,t)}size(){return this.chunks.size}};import{createHash as rr}from"node:crypto";import{dirname as sr,relative as ne,resolve as ie}from"node:path";import P from"typescript";function M(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function Ze(n){return rr("sha256").update(n).digest("hex").slice(0,24)}function G(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}function or(n){let e=n;if(e.name&&P.isIdentifier(e.name))return e.name.text}var ae=class{constructor(e){this.graph=e}graph;async resolveProject(e,t){let r=this.loadConfig(t),s=P.createProgram({rootNames:r.fileNames,options:r.options}),i=s.getTypeChecker(),o=[];for(let a of s.getSourceFiles()){if(a.isDeclarationFile)continue;let m=ie(a.fileName),c=M(ne(t,m));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=f=>{if(P.isCallExpression(f)){let d=this.resolveCall({projectId:e,rootPath:t,source:a,node:f,checker:i});d&&o.push(d)}P.isClassDeclaration(f)&&o.push(...this.resolveHeritage({projectId:e,rootPath:t,source:a,node:f,checker:i})),P.forEachChild(f,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),f=l?.valueDeclaration??l?.declarations?.[0];if(!f)continue;let d=this.fromDeclaration({projectId:t,rootPath:r,source:s,sourceNode:c,declaration:f,expression:c.getText(s),kind:m.token===P.SyntaxKind.ExtendsKeyword?"EXTENDS":"IMPLEMENTS"});d&&a.push(d)}return a}fromDeclaration(e){let t=e.declaration.getSourceFile();if(t.isDeclarationFile)return null;let r=M(ne(e.rootPath,ie(t.fileName)));if(r.startsWith("../")||r.includes("node_modules/"))return null;let s=G(t,e.declaration),i=or(e.declaration)??e.expression.split(".").at(-1),o=this.findGraphSymbol(e.projectId,r,s,i),a=M(ne(e.rootPath,ie(e.source.fileName)));return{id:Ze([e.projectId,a,G(e.source,e.sourceNode),e.kind,r,s].join(":")),projectId:e.projectId,kind:e.kind,sourceFile:a,sourceLine:G(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=M(ne(t,ie(r.fileName)));return{id:Ze(`${e}:${m}:${G(r,s)}:${a.id}`),projectId:e,kind:"CALL",sourceFile:m,sourceLine:G(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=>M(a.filePath)===M(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=P.findConfigFile(e,P.sys.fileExists,"tsconfig.json");if(t){let s=P.readConfigFile(t,P.sys.readFile);if(s.error)throw new Error(P.flattenDiagnosticMessageText(s.error.messageText,`
6
- `));return P.parseJsonConfigFileContent(s.config,P.sys,sr(t))}return{fileNames:P.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,checkJs:!1,target:P.ScriptTarget.ES2022,module:P.ModuleKind.NodeNext,moduleResolution:P.ModuleResolutionKind.NodeNext,skipLibCheck:!0,noEmit:!0}}}};import{createHash as nr}from"node:crypto";import{dirname as ir,relative as z,resolve as B}from"node:path";import w from"typescript";function T(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function Ie(...n){return nr("sha256").update(n.join(":")).digest("hex").slice(0,24)}function H(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}var ar=new Set(["get","post","put","patch","delete","options","head"]),cr=new Set([w.SyntaxKind.EqualsToken,w.SyntaxKind.PlusEqualsToken,w.SyntaxKind.MinusEqualsToken,w.SyntaxKind.AsteriskEqualsToken,w.SyntaxKind.SlashEqualsToken,w.SyntaxKind.PercentEqualsToken,w.SyntaxKind.QuestionQuestionEqualsToken,w.SyntaxKind.AmpersandAmpersandEqualsToken,w.SyntaxKind.BarBarEqualsToken]),ce=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=w.createProgram({rootNames:i.fileNames,options:i.options}),a=o.getTypeChecker();for(let m of o.getSourceFiles()){if(m.isDeclarationFile)continue;let c=T(z(t,B(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=this.fileNode(e,c);if(!l)continue;let f=d=>{if(w.isCallExpression(d)&&this.addRoute(e,t,m,l,d,a)&&s.routes++,w.isTypeReferenceNode(d)&&this.addTypeUse(e,t,m,d,a)&&s.usesType++,w.isBinaryExpression(d)&&cr.has(d.operatorToken.kind)){let u=this.addWrite(e,t,m,d.left,a);u.added&&(s.writes++,u.propertyCreated&&s.properties++)}if((w.isPrefixUnaryExpression(d)||w.isPostfixUnaryExpression(d))&&(d.operator===w.SyntaxKind.PlusPlusToken||d.operator===w.SyntaxKind.MinusMinusToken)){let u=this.addWrite(e,t,m,d.operand,a);u.added&&(s.writes++,u.propertyCreated&&s.properties++)}w.forEachChild(d,f)};f(m)}return s.tests+=this.addTestEdges(e),r&&(s.callReferences+=this.addResolvedCalls(e,r)),s}addRoute(e,t,r,s,i,o){if(!w.isPropertyAccessExpression(i.expression))return!1;let a=i.expression.name.text.toLowerCase();if(!ar.has(a))return!1;let m=i.arguments[0];if(!m||!(w.isStringLiteral(m)||w.isNoSubstitutionTemplateLiteral(m)))return!1;let c=m.text;if(!c.startsWith("/"))return!1;let l=H(r,i),f=Ie(e,r.fileName,l,a,c);this.graph.getSymbol(f)||(this.graph.addSymbol({id:f,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",f)));let d=i.arguments.at(-1);if(d){let u=this.resolveNodeSymbol(e,t,d,o);u&&this.graph.addEdge(this.edge(e,f,"ROUTE",u.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,T(z(t,B(r.fileName))),H(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=T(z(t,B(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))return{added:!1,propertyCreated:!1};let l=H(m,a),f=this.findSymbolAt(e,c,l),d=!1;if(!f||f.type==="file"){let p=o?.getName()??s.getText(r),S=Ie(e,c,"property",p,l);if(f=this.graph.getSymbol(S),!f){f={id:S,projectId:e,name:p,qualifiedName:p,type:"property",filePath:c,startLine:l,endLine:l},this.graph.addSymbol(f);let g=this.fileNode(e,c);g&&this.graph.addEdge(this.edge(e,g.id,"DEFINES",f.id)),d=!0}}if(!f)return{added:!1,propertyCreated:d};let u=T(z(t,B(r.fileName))),h=this.containingSymbol(e,u,H(r,s));return!h||h.id===f.id?{added:!1,propertyCreated:d}:(this.graph.addEdge(this.edge(e,h.id,"WRITES",f.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=T(z(t,B(a.fileName)));if(!(m.startsWith("../")||m.includes("node_modules/")))return this.findSymbolAt(e,m,H(a,o),i?.getName())}resolveTsSymbol(e,t){let r=t.getSymbolAtLocation(e);if(r&&r.flags&w.SymbolFlags.Alias)try{r=t.getAliasedSymbol(r)}catch{}return r}containingSymbol(e,t,r){return this.graph.allSymbols(e).filter(s=>T(s.filePath)===T(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=>T(o.filePath)===T(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"&&T(r.filePath)===T(t))}isTestFile(e){let t=T(e).toLowerCase();return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)}edge(e,t,r,s,i){return{id:Ie(e,t,r,s,JSON.stringify(i??{})),projectId:e,from:t,to:s,type:r,metadata:i}}loadConfig(e){let t=w.findConfigFile(e,w.sys.fileExists,"tsconfig.json");if(t){let r=w.readConfigFile(t,w.sys.readFile);return w.parseJsonConfigFileContent(r.config,w.sys,ir(t))}return{fileNames:w.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:w.ScriptTarget.ES2022,module:w.ModuleKind.NodeNext,moduleResolution:w.ModuleResolutionKind.NodeNext}}}};function lr(n){return n.replaceAll("\\","/").toLowerCase()}var I=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=lr(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 dr={CALL_REFERENCE:6,CALLS:4,IMPORTS:3,USES_TYPE:4,WRITES:5,ROUTE:4,TESTS:1,INHERITS:5,IMPLEMENTS:5,DEFINES:.25},le=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),f=s.get(c.to);if(!l||!f)continue;let d=dr[c.type]??1,u=o(l.filePath),h=o(f.filePath);u.outgoing++,h.incoming++,u.weightedOutgoing+=d,h.weightedIncoming+=d,c.type==="WRITES"&&u.writes++,c.type==="CALL_REFERENCE"&&u.callReferences++,l.filePath!==f.filePath&&(u.crossFile++,h.crossFile++)}let a=[...i.entries()].map(([c,l])=>{let f=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:f,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 pr(n){return n.replaceAll("\\","/").toLowerCase()}var mr={CALL_REFERENCE:6,CALLS:4,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:6,IMPLEMENTS:6,ROUTE:3,TESTS:1},de=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 f=new Map;for(let u of r){let h=s.get(u.from),p=s.get(u.to);if(!h||!p||h.filePath===p.filePath)continue;let S=null;if(h.filePath===c?S=p.filePath:p.filePath===c&&(S=h.filePath),!S)continue;let g=o.get(S);if(!g||g.layer==="unknown"||g.layer==="tests")continue;let b=mr[u.type]??1;f.set(g.layer,(f.get(g.layer)??0)+b)}let d=[...f.entries()].sort((u,h)=>h[1]-u[1]||u[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=pr(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 ur}from"node:crypto";var fr={CALL_REFERENCE:7,CALLS:3,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:7,IMPLEMENTS:7,ROUTE:4,TESTS:1};function gr(n){return ur("sha256").update(n).digest("hex").slice(0,12)}function pe(n){return n.replaceAll("\\","/")}function hr(n){let t=pe(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 yr(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 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(d=>[d.id,d])),i=[...new Set(t.map(d=>pe(d.filePath)))].sort(),o=new Map,a=(d,u)=>{let h=[d,u].sort();return`${h[0]}\0${h[1]}`};for(let d of r){let u=s.get(d.from),h=s.get(d.to);if(!u||!h)continue;let p=pe(u.filePath),S=pe(h.filePath);if(p===S)continue;let g=fr[d.type]??0;if(g<=0)continue;let b=a(p,S),y=o.get(b);y?y.weight+=g:o.set(b,{a:[p,S].sort()[0],b:[p,S].sort()[1],weight:g})}let m=new Map;for(let d of i){let u=hr(d),h=m.get(u)??[];h.push(d),m.set(u,h)}let c=[];for(let[d,u]of m){if(u.sort(),u.length<=30){c.push({subsystem:d,files:u});continue}let h=new Set(u),p=new Map;for(let y of u)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 S=new Set,g=[];for(let y of u){if(S.has(y))continue;let x=[y],C=[];for(S.add(y);x.length>0;){let E=x.shift();C.push(E);for(let k of p.get(E)??[])S.has(k)||(S.add(k),x.push(k))}g.push(C.sort())}let b=[];for(let y of g)y.length>=2?c.push({subsystem:d,files:y}):b.push(...y);b.length>0&&c.push({subsystem:`${d}/residual`,files:b.sort()})}let l=c.map(d=>({subsystem:d.subsystem,files:[...d.files]}));for(let d=0;d<3;d++){let u=!1;e:for(let h=0;h<l.length;h++){let p=l[h];if(!(!p||p.files.length>3))for(let S=0;S<l.length;S++){if(h===S)continue;let g=l[S];if(!g)continue;let b=0,y=new Set(p.files),x=new Set(g.files);for(let C of o.values())(y.has(C.a)&&x.has(C.b)||y.has(C.b)&&x.has(C.a))&&(b+=C.weight);if(b>=20){g.files=[...new Set([...g.files,...p.files])].sort(),l.splice(h,1),u=!0;break e}}}if(!u)break}let f=[];for(let d of l){let u=new Set(d.files),h=0,p=0;for(let x of o.values()){let C=u.has(x.a),E=u.has(x.b);C&&E?h+=x.weight:(C||E)&&(p+=x.weight)}let S=h+p,g=d.subsystem.replace(/\/residual$/,""),b=yr(g),y=d.subsystem.endsWith("/residual")?`${b} Misc`:b;f.push({id:`cluster-${gr(`${d.subsystem}:${d.files.join("|")}`)}`,label:y,subsystem:g,files:d.files,size:d.files.length,internalWeight:h,externalWeight:p,cohesion:S>0?Number((h/S).toFixed(4)):0})}return f.sort((d,u)=>u.size-d.size||u.cohesion-d.cohesion||d.label.localeCompare(u.label))}};var ue=class{constructor(e){this.graph=e;this.entryPoints=new I(e),this.hotspots=new le(e),this.layers=new de(e),this.clusters=new me(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 Qe=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE","TESTS"]);function Oe(n){return n.replaceAll("\\","/").toLowerCase()}function Sr(n){let e=Oe(n);return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}function br(n){let e=Oe(n.filePath);return e.startsWith("bin/")||/(^|\/)index\.[^.]+$/.test(e)||/(^|\/)(main|server|cli)\.[^.]+$/.test(e)}var fe=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Set(new I(this.graph).detect(e).map(o=>o.symbolId)),i=[];for(let o of t){if(!["function","method","class","interface","property"].includes(o.type)||Sr(o.filePath)||s.has(o.id)||br(o)||r.filter(u=>u.to===o.id&&Qe.has(u.type)).length>0)continue;let m=r.filter(u=>u.from===o.id&&Qe.has(u.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")),Oe(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 xr=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE"]),ge=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e).filter(o=>xr.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 f of r){let d=s.get(f.from),u=s.get(f.to);!d||!u||d.filePath===u.filePath||(d.filePath===o&&(a.add(u.filePath),c++),u.filePath===o&&(m.add(d.filePath),l++))}return{filePath:o,dependencies:[...a].sort(),dependents:[...m].sort(),outgoingEdges:c,incomingEdges:l}})}};var he=class{constructor(e){this.graph=e}graph;analyze(e){let t=new fe(this.graph).analyze(e),r=new ge(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 ye=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 S of p.files)a.set(S,{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,f=new Map;for(let p of i)f.set(p.from,(f.get(p.from)??0)+1),l.set(p.to,(l.get(p.to)??0)+1);let d=s.map(p=>{let S=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:S?.id,clusterLabel:S?.label,hotspotScore:m.get(p.filePath),deadCode:c.get(p.id),incoming:l.get(p.id)??0,outgoing:f.get(p.id)??0}}),u=new Set(d.map(p=>p.id)),h=i.filter(p=>u.has(p.from)&&u.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 Fr}from"node:os";import{join as _r}from"node:path";import{DeleteObjectCommand as wr,GetObjectCommand as Er,HeadObjectCommand as Cr,ListObjectsV2Command as vr,PutObjectCommand as Pr,S3Client as Tr}from"@aws-sdk/client-s3";import{getSignedUrl as Rr}from"@aws-sdk/s3-request-presigner";var Se=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Tr({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 Pr({Bucket:this.bucket,Key:e,Body:s,ContentType:r}))}async get(e){let t=await Rr(this.client,new Er({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 Cr({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 wr({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let s=await this.client.send(new vr({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 Xe,mkdir as kr,readFile as Lr,readdir as Ar,rm as jr,stat as et,writeFile as Nr}from"node:fs/promises";import{dirname as Mr,join as Ir,relative as tt,resolve as Or}from"node:path";var K=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Or(this.root,t)}async put(e,t){let r=this.path(e);await kr(Mr(r),{recursive:!0}),await Nr(r,t)}async get(e){try{return await Lr(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 Xe(this.path(e)),!0}catch{return!1}}async delete(e){await jr(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await Xe(t)}catch{return r}let s=async o=>{let a=await Ar(o,{withFileTypes:!0});for(let m of a){let c=Ir(o,m.name);if(m.isDirectory()){await s(c);continue}let l=await et(c);r.push({key:tt(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await et(t);return i.isDirectory()?await s(t):r.push({key:tt(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};function rt(n){let e=n.localRoot??_r(Fr(),".toolnet-memory","storage");if(n.provider==="huggingface"){let t=n.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new Se({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):(console.warn("[storage] Hugging Face credentials missing. Using local fallback."),new K(e))}return new K(e)}function $r(n){return new Promise(e=>setTimeout(e,n))}async function st(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 $r(m+c)}throw i}var Dr=new Set(["put","get","getText","delete","list"]);function ot(n,e={}){return new Proxy(n,{get(t,r){let s=Reflect.get(t,r,t);return typeof s!="function"?s:Dr.has(r)?(...i)=>st(()=>Promise.resolve(s.apply(t,i)),e):s.bind(t)}})}function nt(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 it(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 be=class{constructor(e,t,r,s){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=nt(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=it(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 xe=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 we=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 Ee=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 Ce=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(n,e={}){let t=Date.now();async function r(p,S,g){await e.onStage?.({id:p,title:S,state:"start"});let b=Date.now(),y=await g();return await e.onStage?.({id:p,title:S,state:"complete",durationMs:Date.now()-b}),y}let s=Ge(),i=ot(rt({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),{attempts:3}),o=new be(i,n.id,n.name,n.remote??n.name),a=new D(o),c=(await r("source-index","Source Index",async()=>{let p=await new X().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 ae(c).resolveProject(n.id,n.rootPath);return await new xe(o).save(p),p});await r("rich-graph","Rich Graph",async()=>{let p=new ce(c).enrich(n.id,n.rootPath,l),S=c.allSymbols(n.id),g=c.allEdges(n.id);return await a.save({version:1,projectId:n.id,updatedAt:new Date().toISOString(),files:S.filter(b=>b.type==="file").length,symbols:S,edges:g}),p});let f=await r("semantic-index","Semantic Code Index",async()=>new oe({projectId:n.id,rootPath:n.rootPath,model:process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",storage:o,embeddings:Ve(),graph:c}).initialize()),d=await r("architecture","Architecture Intelligence",async()=>{let p=new ue(c).analyze(n.id);return await new we(o).save(p),p}),u=await r("analysis","Graph Analysis",async()=>{let p=new he(c).analyze(n.id);return await new Ee(o).save(p),p}),h=await r("visualization","3D Visualization Dataset",async()=>{let p=new ye(c).build(n.id,d,u);return await new Ce(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:f,architecture:d.summary,analysis:u.summary,visualization:h.summary}}var j=new q().detect(),De=$e(j.rootPath,".toolnet"),Fe=$e(De,"index.lock"),Wr=$e(De,"last-index.json");zr(De,{recursive:!0});function ve(n){Kr(Wr,JSON.stringify(n,null,2)+`
8
- `,{encoding:"utf8",mode:384})}var _e;try{_e=Br(Fe,"wx",384)}catch{console.error("\u274C Index already running for this project."),console.error(`Lock: ${Fe}`),process.exit(2)}var Pe=new Date().toISOString(),W=[];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"),ve({version:2,state:"running",startedAt:Pe,completedStages:W,project:j});let n=await at(j,{onStage:async e=>{e.state==="start"?(console.log(),console.log(`===== ${e.title} =====`)):(W.push(e.id),console.log(`\u2705 ${e.title} (${((e.durationMs??0)/1e3).toFixed(1)}s)`)),ve({version:2,state:"running",startedAt:Pe,currentStage:e.id,completedStages:[...W],project:j})}});ve({version:2,state:"complete",startedAt:Pe,finishedAt:new Date().toISOString(),completedStages:W,result:n}),console.log(),console.log("=============================================="),console.log(" FULL INDEX COMPLETE \u2705"),console.log("=============================================="),console.log(JSON.stringify(n,null,2))}catch(n){ve({version:2,state:"failed",startedAt:Pe,failedAt:new Date().toISOString(),completedStages:W,error:n instanceof Error?n.message:String(n)}),console.error("FULL INDEX FAILED \u274C"),console.error(n),process.exitCode=1}finally{_e!==void 0&&Gr(_e),Hr(Fe,{force:!0})}
1
+ import{closeSync as Gr,mkdirSync as zr,openSync as Br,rmSync as Hr,writeFileSync as Kr}from"node:fs";import{join as De}from"node:path";import{existsSync as dt,readFileSync as pt}from"node:fs";import{homedir as mt}from"node:os";import{join as ut}from"node:path";function ft(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 gt(){let n=process.env.TOOLNET_GLOBAL_ENV??ut(mt(),".config","toolnet-memory",".env");if(!dt(n))return;let e=pt(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]=ft(r.slice(s+1)))}}gt();function U(n,e){return n===void 0?e:["1","true","yes","on"].includes(n.toLowerCase())}function O(n,e){if(!n)return e;let t=Number(n);return Number.isFinite(t)?t:e}function ze(){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:O(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:O(process.env.MEMORY_RERANK_TOP,10),finalContext:O(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:O(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",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:O(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as ht}from"node:crypto";import{existsSync as Te,mkdirSync as yt,readFileSync as St,renameSync as bt,writeFileSync as xt}from"node:fs";import{basename as wt,dirname as J,join as Y,parse as Ke,resolve as F}from"node:path";var We=".toolnet",Et="project.json";function Ct(n){return ht("sha256").update(n).digest("hex").slice(0,16)}function ke(n){return Y(n,We,Et)}function vt(n){return Te(ke(n))}function Pt(n,e){let t=F(n),r=Ke(t).root;for(;;){if(vt(t))return t;if(t===r||e&&t===F(e))break;let s=J(t);if(s===t)break;t=s}return null}function Rt(n){let e=F(n),t=Ke(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>Te(Y(e,i))))return e;if(e===t)break;let s=J(e);if(s===e)break;e=s}return F(n)}function Tt(n){let e;try{e=JSON.parse(St(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:J(J(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 Be(n,e){let t=Y(n,We);yt(t,{recursive:!0});let r=ke(n),s=`${r}.tmp-${process.pid}`;xt(s,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),bt(s,r)}function He(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=>Te(Y(r,l))),o=Pt(t,i?r:void 0);if(o){let l=ke(o),u=Tt(l);return u.rootPath!==o&&(u.rootPath=o,u.updatedAt=new Date().toISOString(),Be(o,u)),He(u,o)}let a=new Date().toISOString(),m=wt(r),c={version:1,id:Ct(r),name:m,remote:m,rootPath:r,createdAt:a,updatedAt:a,graphVersion:0,memoryVersion:0};return Be(r,c),He(c,r)}};var kt=[{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 kt){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 Q=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=>Lt(i))}};function Lt(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 jt}from"node:crypto";var X=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=jt("sha256").update(s).digest().readUInt32BE(0)%this.dimensions;t[o]+=1}return At(t)}async embedMany(e){return Promise.all(e.map(t=>this.embed(t)))}};function At(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 X){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 Ve(){let n=process.env.HF_TOKEN,e=process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",t=n?new Q({token:n,model:e}):null;return new Le(t)}import{readdir as Ot}from"node:fs/promises";import{extname as Ft,join as _t,relative as $t}from"node:path";import{basename as Nt}from"node:path";var Mt=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),It=new Set([".pem",".key",".p12",".pfx"]);function Ue(n){let e=Nt(n).toLowerCase();if(Mt.has(e))return!0;for(let t of It)if(e.endsWith(t))return!0;return!1}var Dt=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Gt=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 Ot(r,{withFileTypes:!0});for(let i of s){if(Gt.has(i.name))continue;let o=_t(r,i.name);if(i.isDirectory()){await t(o);continue}Dt.has(Ft(i.name))&&(Ue(o)||e.push($t(n,o)))}}return await t(n),e.sort()}import{readFile as zt}from"node:fs/promises";import{join as Bt}from"node:path";import{createHash as Ht}from"node:crypto";import v from"typescript";function Je(n,e){return Ht("sha256").update(`${n}:${e}`).digest("hex").slice(0,24)}function Ae(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}async function Ne(n,e,t){let r=Bt(e,t),s=await zt(r,"utf8"),i=v.createSourceFile(t,s,v.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?v.ScriptKind.TSX:v.ScriptKind.TS),o=[],a=[],m=[],c=[],l={id:Je(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,b,y,x){let C=Je(n,`${t}:${y}:${x??b}:${g.pos}`);return o.push({id:C,projectId:n,name:b,qualifiedName:x??b,type:y,filePath:t,startLine:Ae(i,g),endLine:i.getLineAndCharacterOfPosition(g.end).line+1}),C}function h(g){if(!v.isStringLiteral(g.moduleSpecifier))return;let b=[],y=g.importClause;if(y?.name&&b.push({localName:y.name.text,importedName:"default",kind:"default"}),y?.namedBindings&&v.isNamedImports(y.namedBindings))for(let x of y.namedBindings.elements)b.push({localName:x.name.text,importedName:x.propertyName?.text??x.name.text,kind:"named"});y?.namedBindings&&v.isNamespaceImport(y.namedBindings)&&b.push({localName:y.namedBindings.name.text,importedName:"*",kind:"namespace"}),a.push({source:g.moduleSpecifier.text,bindings:b})}function p(g,b){for(let y of g.heritageClauses??[])for(let x of y.types){let C=x.expression.getText(i).split(".").at(-1)??"";C&&c.push({fromId:b,targetName:C,type:y.token===v.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function S(g){let b=!1,y=!1;if(v.isImportDeclaration(g)&&h(g),v.isInterfaceDeclaration(g)&&f(g,g.name.text,"interface",g.name.text),v.isClassDeclaration(g)&&g.name){let x=f(g,g.name.text,"class",g.name.text);p(g,x),d.push({id:x,name:g.name.text}),y=!0}if(v.isFunctionDeclaration(g)&&g.name){let x=f(g,g.name.text,"function",g.name.text);u.push(x),b=!0}if(v.isMethodDeclaration(g)&&g.name){let x=g.name.getText(i),C=d.at(-1)?.name,E=f(g,x,"method",C?`${C}.${x}`:x);u.push(E),b=!0}if(v.isCallExpression(g)&&(v.isIdentifier(g.expression)&&m.push({callerId:u.at(-1),calleeName:g.expression.text,line:Ae(i,g)}),v.isPropertyAccessExpression(g.expression))){let x=g.expression;m.push({callerId:u.at(-1),qualifier:x.expression.getText(i),calleeName:x.name.text,line:Ae(i,g)})}v.forEachChild(g,S),b&&u.pop(),y&&d.pop()}return S(i),{filePath:t,symbols:o,imports:a,calls:m,heritage:c}}import{createHash as Kt}from"node:crypto";import{dirname as Wt,extname as Vt,normalize as Ut,posix as Jt}from"node:path";var $=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 Kt("sha256").update(`${n}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function j(n){return Ut(n).replaceAll("\\","/")}function Me(n,e,t){if(!e.startsWith("."))return;let r=j(Jt.join(Wt(n),e)),s=Vt(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(j(o)))}var D=class{build(e,t){let r=new $,s=new Map;for(let o of t)for(let a of o.symbols)r.addSymbol(a),a.type==="file"&&s.set(j(o.filePath),a);let i=new Set(s.keys());for(let o of t){let a=j(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=j(t.filePath),c=o.findByName(e,r).filter(l=>j(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=>j(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=>j(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 ee=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 D().build(e,s);return{files:s.length,symbols:i.allSymbols(e).length,edges:i.allEdges(e).length,graph:i}}};import{execFile as Yt}from"node:child_process";import{promisify as Zt}from"node:util";var mo=Zt(Yt);var G=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 Qt}from"node:crypto";import{readFile as Xt}from"node:fs/promises";import{join as er}from"node:path";function qe(n){return Qt("sha256").update(n).digest("hex")}var te=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 Xt(er(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,S=qe(p),g=[t,r,i?.id??"file",String(d),S].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:S})}if(f>=c)break;u=f-a+1,d++}return l}};var re=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 se=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 oe=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=tr(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 tr(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 Ie(n){return n.toLowerCase().normalize("NFKC").replace(/[^\p{L}\p{N}_\-./]+/gu," ").split(/\s+/).map(e=>e.trim()).filter(e=>e.length>1)}function Ye(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 ne=class{constructor(e){this.options=e}options;vectors=new oe;chunks=new Map;async initialize(){let{projectId:e,rootPath:t,storage:r,embeddings:s,graph:i,model:o}=this.options,a=new re(r),m=new se(r),c=await new te().build(e,t,i.allSymbols(e));this.chunks.clear();for(let E of c)this.chunks.set(E.id,E);let l=await a.load(e),u=!l||l.chunks.length!==c.length||l.chunks.some(E=>!this.chunks.has(E.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(E=>E.id)),p=0;for(let E of this.vectors.exportProject(e))h.has(E.id)||this.vectors.remove(E.id)&&p++;let S=c.filter(E=>{let k=this.vectors.get(E.id);return k?k.metadata?.contentHash!==E.contentHash:!0}),g=0,b=8,y=this.vectors.exportProject(e)[0]?.vector.length;for(let E=0;E<S.length;E+=b){let k=S.slice(E,E+b),ct=k.map(T=>[`file: ${T.filePath}`,T.symbolName?`symbol: ${T.symbolName}`:"",T.symbolType?`type: ${T.symbolType}`:"",T.content].filter(Boolean).join(`
5
+ `)),lt=await s.embedMany(ct);for(let T=0;T<k.length;T++){let L=k[T],N=lt[T];if(!(!L||!N||N.length===0)){if(y===void 0&&(y=N.length),N.length!==y){console.warn(`[code-semantic] skip dimension mismatch: ${N.length} != ${y}`);continue}this.vectors.upsert({id:L.id,projectId:e,vector:N,metadata:{contentHash:L.contentHash,filePath:L.filePath,symbolName:L.symbolName,symbolType:L.symbolType,startLine:L.startLine,endLine:L.endLine}}),g++}}}let x=this.vectors.exportProject(e),C=g>0||p>0||!d||d.model!==o;return C&&await m.save({version:1,projectId:e,model:o,dimensions:x[0]?.vector.length??y??0,updatedAt:new Date().toISOString(),records:x}),{chunks:c.length,vectorsLoaded:f,vectorsIndexed:g,vectorsRemoved:p,totalVectors:x.length,savedChunks:u,savedVectors:C}}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(Ie(e)),o=[];for(let a of s){let m=this.chunks.get(a.id);if(!m)continue;let c=new Set(Ie([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=Ye(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 rr}from"node:crypto";import{dirname as sr,relative as ie,resolve as ae}from"node:path";import P from"typescript";function M(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function Ze(n){return rr("sha256").update(n).digest("hex").slice(0,24)}function z(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}function or(n){let e=n;if(e.name&&P.isIdentifier(e.name))return e.name.text}var ce=class{constructor(e){this.graph=e}graph;async resolveProject(e,t){let r=this.loadConfig(t),s=P.createProgram({rootNames:r.fileNames,options:r.options}),i=s.getTypeChecker(),o=[];for(let a of s.getSourceFiles()){if(a.isDeclarationFile)continue;let m=ae(a.fileName),c=M(ie(t,m));if(c.startsWith("../")||c.includes("node_modules/"))continue;let l=u=>{if(P.isCallExpression(u)){let d=this.resolveCall({projectId:e,rootPath:t,source:a,node:u,checker:i});d&&o.push(d)}P.isClassDeclaration(u)&&o.push(...this.resolveHeritage({projectId:e,rootPath:t,source:a,node:u,checker:i})),P.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===P.SyntaxKind.ExtendsKeyword?"EXTENDS":"IMPLEMENTS"});d&&a.push(d)}return a}fromDeclaration(e){let t=e.declaration.getSourceFile();if(t.isDeclarationFile)return null;let r=M(ie(e.rootPath,ae(t.fileName)));if(r.startsWith("../")||r.includes("node_modules/"))return null;let s=z(t,e.declaration),i=or(e.declaration)??e.expression.split(".").at(-1),o=this.findGraphSymbol(e.projectId,r,s,i),a=M(ie(e.rootPath,ae(e.source.fileName)));return{id:Ze([e.projectId,a,z(e.source,e.sourceNode),e.kind,r,s].join(":")),projectId:e.projectId,kind:e.kind,sourceFile:a,sourceLine:z(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=M(ie(t,ae(r.fileName)));return{id:Ze(`${e}:${m}:${z(r,s)}:${a.id}`),projectId:e,kind:"CALL",sourceFile:m,sourceLine:z(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=>M(a.filePath)===M(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=P.findConfigFile(e,P.sys.fileExists,"tsconfig.json");if(t){let s=P.readConfigFile(t,P.sys.readFile);if(s.error)throw new Error(P.flattenDiagnosticMessageText(s.error.messageText,`
6
+ `));return P.parseJsonConfigFileContent(s.config,P.sys,sr(t))}return{fileNames:P.sys.readDirectory(e,[".ts",".tsx",".js",".jsx",".mts",".cts",".mjs",".cjs"],["node_modules",".git","dist","build","coverage"]),options:{allowJs:!0,checkJs:!1,target:P.ScriptTarget.ES2022,module:P.ModuleKind.NodeNext,moduleResolution:P.ModuleResolutionKind.NodeNext,skipLibCheck:!0,noEmit:!0}}}};import{createHash as nr}from"node:crypto";import{dirname as ir,relative as B,resolve as H}from"node:path";import w from"typescript";function R(n){return n.replaceAll("\\","/").replace(/^\.\//,"")}function Oe(...n){return nr("sha256").update(n.join(":")).digest("hex").slice(0,24)}function K(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}var ar=new Set(["get","post","put","patch","delete","options","head"]),cr=new Set([w.SyntaxKind.EqualsToken,w.SyntaxKind.PlusEqualsToken,w.SyntaxKind.MinusEqualsToken,w.SyntaxKind.AsteriskEqualsToken,w.SyntaxKind.SlashEqualsToken,w.SyntaxKind.PercentEqualsToken,w.SyntaxKind.QuestionQuestionEqualsToken,w.SyntaxKind.AmpersandAmpersandEqualsToken,w.SyntaxKind.BarBarEqualsToken]),le=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=w.createProgram({rootNames:i.fileNames,options:i.options}),a=o.getTypeChecker();for(let m of o.getSourceFiles()){if(m.isDeclarationFile)continue;let c=R(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(w.isCallExpression(d)&&this.addRoute(e,t,m,l,d,a)&&s.routes++,w.isTypeReferenceNode(d)&&this.addTypeUse(e,t,m,d,a)&&s.usesType++,w.isBinaryExpression(d)&&cr.has(d.operatorToken.kind)){let f=this.addWrite(e,t,m,d.left,a);f.added&&(s.writes++,f.propertyCreated&&s.properties++)}if((w.isPrefixUnaryExpression(d)||w.isPostfixUnaryExpression(d))&&(d.operator===w.SyntaxKind.PlusPlusToken||d.operator===w.SyntaxKind.MinusMinusToken)){let f=this.addWrite(e,t,m,d.operand,a);f.added&&(s.writes++,f.propertyCreated&&s.properties++)}w.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(!w.isPropertyAccessExpression(i.expression))return!1;let a=i.expression.name.text.toLowerCase();if(!ar.has(a))return!1;let m=i.arguments[0];if(!m||!(w.isStringLiteral(m)||w.isNoSubstitutionTemplateLiteral(m)))return!1;let c=m.text;if(!c.startsWith("/"))return!1;let l=K(r,i),u=Oe(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,R(B(t,H(r.fileName))),K(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=R(B(t,H(m.fileName)));if(c.startsWith("../")||c.includes("node_modules/"))return{added:!1,propertyCreated:!1};let l=K(m,a),u=this.findSymbolAt(e,c,l),d=!1;if(!u||u.type==="file"){let p=o?.getName()??s.getText(r),S=Oe(e,c,"property",p,l);if(u=this.graph.getSymbol(S),!u){u={id:S,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=R(B(t,H(r.fileName))),h=this.containingSymbol(e,f,K(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=R(B(t,H(a.fileName)));if(!(m.startsWith("../")||m.includes("node_modules/")))return this.findSymbolAt(e,m,K(a,o),i?.getName())}resolveTsSymbol(e,t){let r=t.getSymbolAtLocation(e);if(r&&r.flags&w.SymbolFlags.Alias)try{r=t.getAliasedSymbol(r)}catch{}return r}containingSymbol(e,t,r){return this.graph.allSymbols(e).filter(s=>R(s.filePath)===R(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=>R(o.filePath)===R(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"&&R(r.filePath)===R(t))}isTestFile(e){let t=R(e).toLowerCase();return t.startsWith("tests/")||t.includes("/tests/")||t.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(t)}edge(e,t,r,s,i){return{id:Oe(e,t,r,s,JSON.stringify(i??{})),projectId:e,from:t,to:s,type:r,metadata:i}}loadConfig(e){let t=w.findConfigFile(e,w.sys.fileExists,"tsconfig.json");if(t){let r=w.readConfigFile(t,w.sys.readFile);return w.parseJsonConfigFileContent(r.config,w.sys,ir(t))}return{fileNames:w.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:w.ScriptTarget.ES2022,module:w.ModuleKind.NodeNext,moduleResolution:w.ModuleResolutionKind.NodeNext}}}};function lr(n){return n.replaceAll("\\","/").toLowerCase()}var I=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=lr(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 dr={CALL_REFERENCE:6,CALLS:4,IMPORTS:3,USES_TYPE:4,WRITES:5,ROUTE:4,TESTS:1,INHERITS:5,IMPLEMENTS:5,DEFINES:.25},de=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=dr[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 pr(n){return n.replaceAll("\\","/").toLowerCase()}var mr={CALL_REFERENCE:6,CALLS:4,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:6,IMPLEMENTS:6,ROUTE:3,TESTS:1},pe=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 S=null;if(h.filePath===c?S=p.filePath:p.filePath===c&&(S=h.filePath),!S)continue;let g=o.get(S);if(!g||g.layer==="unknown"||g.layer==="tests")continue;let b=mr[f.type]??1;u.set(g.layer,(u.get(g.layer)??0)+b)}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=pr(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 ur}from"node:crypto";var fr={CALL_REFERENCE:7,CALLS:3,IMPORTS:4,USES_TYPE:4,WRITES:5,INHERITS:7,IMPLEMENTS:7,ROUTE:4,TESTS:1};function gr(n){return ur("sha256").update(n).digest("hex").slice(0,12)}function me(n){return n.replaceAll("\\","/")}function hr(n){let t=me(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 yr(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 ue=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=>me(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=me(f.filePath),S=me(h.filePath);if(p===S)continue;let g=fr[d.type]??0;if(g<=0)continue;let b=a(p,S),y=o.get(b);y?y.weight+=g:o.set(b,{a:[p,S].sort()[0],b:[p,S].sort()[1],weight:g})}let m=new Map;for(let d of i){let f=hr(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 S=new Set,g=[];for(let y of f){if(S.has(y))continue;let x=[y],C=[];for(S.add(y);x.length>0;){let E=x.shift();C.push(E);for(let k of p.get(E)??[])S.has(k)||(S.add(k),x.push(k))}g.push(C.sort())}let b=[];for(let y of g)y.length>=2?c.push({subsystem:d,files:y}):b.push(...y);b.length>0&&c.push({subsystem:`${d}/residual`,files:b.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 S=0;S<l.length;S++){if(h===S)continue;let g=l[S];if(!g)continue;let b=0,y=new Set(p.files),x=new Set(g.files);for(let C of o.values())(y.has(C.a)&&x.has(C.b)||y.has(C.b)&&x.has(C.a))&&(b+=C.weight);if(b>=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 x of o.values()){let C=f.has(x.a),E=f.has(x.b);C&&E?h+=x.weight:(C||E)&&(p+=x.weight)}let S=h+p,g=d.subsystem.replace(/\/residual$/,""),b=yr(g),y=d.subsystem.endsWith("/residual")?`${b} Misc`:b;u.push({id:`cluster-${gr(`${d.subsystem}:${d.files.join("|")}`)}`,label:y,subsystem:g,files:d.files,size:d.files.length,internalWeight:h,externalWeight:p,cohesion:S>0?Number((h/S).toFixed(4)):0})}return u.sort((d,f)=>f.size-d.size||f.cohesion-d.cohesion||d.label.localeCompare(f.label))}};var fe=class{constructor(e){this.graph=e;this.entryPoints=new I(e),this.hotspots=new de(e),this.layers=new pe(e),this.clusters=new ue(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 Qe=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE","TESTS"]);function Fe(n){return n.replaceAll("\\","/").toLowerCase()}function Sr(n){let e=Fe(n);return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}function br(n){let e=Fe(n.filePath);return e.startsWith("bin/")||/(^|\/)index\.[^.]+$/.test(e)||/(^|\/)(main|server|cli)\.[^.]+$/.test(e)}var ge=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e),s=new Set(new I(this.graph).detect(e).map(o=>o.symbolId)),i=[];for(let o of t){if(!["function","method","class","interface","property"].includes(o.type)||Sr(o.filePath)||s.has(o.id)||br(o)||r.filter(f=>f.to===o.id&&Qe.has(f.type)).length>0)continue;let m=r.filter(f=>f.from===o.id&&Qe.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 xr=new Set(["CALLS","CALL_REFERENCE","IMPORTS","USES_TYPE","WRITES","INHERITS","IMPLEMENTS","ROUTE"]),he=class{constructor(e){this.graph=e}graph;analyze(e){let t=this.graph.allSymbols(e),r=this.graph.allEdges(e).filter(o=>xr.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 ye=class{constructor(e){this.graph=e}graph;analyze(e){let t=new ge(this.graph).analyze(e),r=new he(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 Se=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 S of p.files)a.set(S,{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 S=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:S?.id,clusterLabel:S?.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 Fr}from"node:os";import{join as _r}from"node:path";import{DeleteObjectCommand as wr,GetObjectCommand as Er,HeadObjectCommand as Cr,ListObjectsV2Command as vr,PutObjectCommand as Pr,S3Client as Rr}from"@aws-sdk/client-s3";import{getSignedUrl as Tr}from"@aws-sdk/s3-request-presigner";var be=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 Pr({Bucket:this.bucket,Key:e,Body:s,ContentType:r}))}async get(e){let t=await Tr(this.client,new Er({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 Cr({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 wr({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let s=await this.client.send(new vr({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 Xe,mkdir as kr,readFile as Lr,readdir as jr,rm as Ar,stat as et,writeFile as Nr}from"node:fs/promises";import{dirname as Mr,join as Ir,relative as tt,resolve as Or}from"node:path";var W=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Or(this.root,t)}async put(e,t){let r=this.path(e);await kr(Mr(r),{recursive:!0}),await Nr(r,t)}async get(e){try{return await Lr(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 Xe(this.path(e)),!0}catch{return!1}}async delete(e){await Ar(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await Xe(t)}catch{return r}let s=async o=>{let a=await jr(o,{withFileTypes:!0});for(let m of a){let c=Ir(o,m.name);if(m.isDirectory()){await s(c);continue}let l=await et(c);r.push({key:tt(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await et(t);return i.isDirectory()?await s(t):r.push({key:tt(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};function rt(n){let e=n.localRoot??_r(Fr(),".toolnet-memory","storage");if(n.provider==="huggingface"){let t=n.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new be({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):(console.warn("[storage] Hugging Face credentials missing. Using local fallback."),new W(e))}return new W(e)}function $r(n){return new Promise(e=>setTimeout(e,n))}async function st(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 $r(m+c)}throw i}var Dr=new Set(["put","get","getText","delete","list"]);function ot(n,e={}){return new Proxy(n,{get(t,r){let s=Reflect.get(t,r,t);return typeof s!="function"?s:Dr.has(r)?(...i)=>st(()=>Promise.resolve(s.apply(t,i)),e):s.bind(t)}})}function nt(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 it(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 xe=class{constructor(e,t,r,s){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=nt(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=it(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 we=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 Ee=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 Ce=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 ve=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(n,e={}){let t=Date.now();async function r(p,S,g){await e.onStage?.({id:p,title:S,state:"start"});let b=Date.now(),y=await g();return await e.onStage?.({id:p,title:S,state:"complete",durationMs:Date.now()-b}),y}let s=ze(),i=ot(rt({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),{attempts:3}),o=new xe(i,n.id,n.name,n.remote??n.name),a=new G(o),c=(await r("source-index","Source Index",async()=>{let p=await new ee().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 ce(c).resolveProject(n.id,n.rootPath);return await new we(o).save(p),p});await r("rich-graph","Rich Graph",async()=>{let p=new le(c).enrich(n.id,n.rootPath,l),S=c.allSymbols(n.id),g=c.allEdges(n.id);return await a.save({version:1,projectId:n.id,updatedAt:new Date().toISOString(),files:S.filter(b=>b.type==="file").length,symbols:S,edges:g}),p});let u=await r("semantic-index","Semantic Code Index",async()=>new ne({projectId:n.id,rootPath:n.rootPath,model:process.env.HF_EMBEDDING_MODEL??"sentence-transformers/all-MiniLM-L6-v2",storage:o,embeddings:Ve(),graph:c}).initialize()),d=await r("architecture","Architecture Intelligence",async()=>{let p=new fe(c).analyze(n.id);return await new Ee(o).save(p),p}),f=await r("analysis","Graph Analysis",async()=>{let p=new ye(c).analyze(n.id);return await new Ce(o).save(p),p}),h=await r("visualization","3D Visualization Dataset",async()=>{let p=new Se(c).build(n.id,d,f);return await new ve(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 A=new q().detect(),Ge=De(A.rootPath,".toolnet"),_e=De(Ge,"index.lock"),Wr=De(Ge,"last-index.json");zr(Ge,{recursive:!0});function Pe(n){Kr(Wr,JSON.stringify(n,null,2)+`
8
+ `,{encoding:"utf8",mode:384})}var $e;try{$e=Br(_e,"wx",384)}catch{console.error("\u274C Index already running for this project."),console.error(`Lock: ${_e}`),process.exit(2)}var Re=new Date().toISOString(),V=[];try{console.log(),console.log("=============================================="),console.log(" ToolNet Production Index"),console.log("=============================================="),console.log(`Project : ${A.name}`),console.log(`Remote : projects/${A.remote??A.name}/`),console.log("Runtime : production/dist"),console.log("Snapshot: disabled"),Pe({version:2,state:"running",startedAt:Re,completedStages:V,project:A});let n=await at(A,{onStage:async e=>{e.state==="start"?(console.log(),console.log(`===== ${e.title} =====`)):(V.push(e.id),console.log(`\u2705 ${e.title} (${((e.durationMs??0)/1e3).toFixed(1)}s)`)),Pe({version:2,state:"running",startedAt:Re,currentStage:e.id,completedStages:[...V],project:A})}});Pe({version:2,state:"complete",startedAt:Re,finishedAt:new Date().toISOString(),completedStages:V,result:n}),console.log(),console.log("=============================================="),console.log(" FULL INDEX COMPLETE \u2705"),console.log("=============================================="),console.log(JSON.stringify(n,null,2))}catch(n){Pe({version:2,state:"failed",startedAt:Re,failedAt:new Date().toISOString(),completedStages:V,error:n instanceof Error?n.message:String(n)}),console.error("FULL INDEX FAILED \u274C"),console.error(n),process.exitCode=1}finally{$e!==void 0&&Gr($e),Hr(_e,{force:!0})}
@@ -0,0 +1,4 @@
1
+ import"dotenv/config";import{existsSync as ne,readFileSync as ie}from"node:fs";import{homedir as ae}from"node:os";import{join as ce}from"node:path";function le(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 de(){let s=process.env.TOOLNET_GLOBAL_ENV??ce(ae(),".config","toolnet-memory",".env");if(!ne(s))return;let e=ie(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]=le(r.slice(o+1)))}}de();function L(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function v(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function W(){return{memory:{autoCapture:L(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:L(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:L(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:L(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:v(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:v(process.env.MEMORY_RERANK_TOP,10),finalContext:v(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:v(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",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:v(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as pe}from"node:crypto";import{existsSync as _,mkdirSync as me,readFileSync as fe,renameSync as ue,writeFileSync as ge}from"node:fs";import{basename as he,dirname as N,join as M,parse as U,resolve as w}from"node:path";var J=".toolnet",ye="project.json";function Se(s){return pe("sha256").update(s).digest("hex").slice(0,16)}function $(s){return M(s,J,ye)}function be(s){return _($(s))}function xe(s,e){let t=w(s),r=U(t).root;for(;;){if(be(t))return t;if(t===r||e&&t===w(e))break;let o=N(t);if(o===t)break;t=o}return null}function Ce(s){let e=w(s),t=U(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(n=>_(M(e,n))))return e;if(e===t)break;let o=N(e);if(o===e)break;e=o}return w(s)}function Ee(s){let e;try{e=JSON.parse(fe(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 H(s,e){let t=M(s,J);me(t,{recursive:!0});let r=$(s),o=`${r}.tmp-${process.pid}`;ge(o,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),ue(o,r)}function V(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 A=class{detect(e=process.cwd()){let t=w(e),r=Ce(t),n=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(p=>_(M(r,p))),i=xe(t,n?r:void 0);if(i){let p=$(i),d=Ee(p);return d.rootPath!==i&&(d.rootPath=i,d.updatedAt=new Date().toISOString(),H(i,d)),V(d,i)}let l=new Date().toISOString(),f=he(r),c={version:1,id:Se(r),name:f,remote:f,rootPath:r,createdAt:l,updatedAt:l,graphVersion:0,memoryVersion:0};return H(r,c),V(c,r)}};import{readdir as Te}from"node:fs/promises";import{extname as ke,join as je,relative as Le}from"node:path";import{basename as we}from"node:path";var Pe=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),Re=new Set([".pem",".key",".p12",".pfx"]);function q(s){let e=we(s).toLowerCase();if(Pe.has(e))return!0;for(let t of Re)if(e.endsWith(t))return!0;return!1}var Ne=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Ae=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function G(s){let e=[];async function t(r){let o=await Te(r,{withFileTypes:!0});for(let n of o){if(Ae.has(n.name))continue;let i=je(r,n.name);if(n.isDirectory()){await t(i);continue}Ne.has(ke(n.name))&&(q(i)||e.push(Le(s,i)))}}return await t(s),e.sort()}import{readFile as Me}from"node:fs/promises";import{join as Ie}from"node:path";import{createHash as Oe}from"node:crypto";import g from"typescript";function Y(s,e){return Oe("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function D(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function z(s,e,t){let r=Ie(e,t),o=await Me(r,"utf8"),n=g.createSourceFile(t,o,g.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?g.ScriptKind.TSX:g.ScriptKind.TS),i=[],l=[],f=[],c=[],p={id:Y(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:n.getLineAndCharacterOfPosition(n.end).line+1};i.push(p);let d=[],S=[];function y(a,h,u,m){let x=Y(s,`${t}:${u}:${m??h}:${a.pos}`);return i.push({id:x,projectId:s,name:h,qualifiedName:m??h,type:u,filePath:t,startLine:D(n,a),endLine:n.getLineAndCharacterOfPosition(a.end).line+1}),x}function j(a){if(!g.isStringLiteral(a.moduleSpecifier))return;let h=[],u=a.importClause;if(u?.name&&h.push({localName:u.name.text,importedName:"default",kind:"default"}),u?.namedBindings&&g.isNamedImports(u.namedBindings))for(let m of u.namedBindings.elements)h.push({localName:m.name.text,importedName:m.propertyName?.text??m.name.text,kind:"named"});u?.namedBindings&&g.isNamespaceImport(u.namedBindings)&&h.push({localName:u.namedBindings.name.text,importedName:"*",kind:"namespace"}),l.push({source:a.moduleSpecifier.text,bindings:h})}function E(a,h){for(let u of a.heritageClauses??[])for(let m of u.types){let x=m.expression.getText(n).split(".").at(-1)??"";x&&c.push({fromId:h,targetName:x,type:u.token===g.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function K(a){let h=!1,u=!1;if(g.isImportDeclaration(a)&&j(a),g.isInterfaceDeclaration(a)&&y(a,a.name.text,"interface",a.name.text),g.isClassDeclaration(a)&&a.name){let m=y(a,a.name.text,"class",a.name.text);E(a,m),S.push({id:m,name:a.name.text}),u=!0}if(g.isFunctionDeclaration(a)&&a.name){let m=y(a,a.name.text,"function",a.name.text);d.push(m),h=!0}if(g.isMethodDeclaration(a)&&a.name){let m=a.name.getText(n),x=S.at(-1)?.name,oe=y(a,m,"method",x?`${x}.${m}`:m);d.push(oe),h=!0}if(g.isCallExpression(a)&&(g.isIdentifier(a.expression)&&f.push({callerId:d.at(-1),calleeName:a.expression.text,line:D(n,a)}),g.isPropertyAccessExpression(a.expression))){let m=a.expression;f.push({callerId:d.at(-1),qualifier:m.expression.getText(n),calleeName:m.name.text,line:D(n,a)})}g.forEachChild(a,K),h&&d.pop(),u&&S.pop()}return K(n),{filePath:t,symbols:i,imports:l,calls:f,heritage:c}}import{createHash as Fe}from"node:crypto";import{dirname as _e,extname as $e,normalize as Ge,posix as De}from"node:path";var P=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 ze(s,e,t,r){return Fe("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function C(s){return Ge(s).replaceAll("\\","/")}function B(s,e,t){if(!e.startsWith("."))return;let r=C(De.join(_e(s),e)),o=$e(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(C(i)))}var R=class{build(e,t){let r=new P,o=new Map;for(let i of t)for(let l of i.symbols)r.addSymbol(l),l.type==="file"&&o.set(C(i.filePath),l);let n=new Set(o.keys());for(let i of t){let l=C(i.filePath),f=o.get(l);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 p=B(l,c.source,n);if(!p)continue;let d=o.get(p);d&&r.addEdge(this.edge(e,f.id,"IMPORTS",d.id,{source:c.source}))}for(let c of i.heritage){let p=r.findByName(e,c.targetName).filter(d=>d.type==="class"||d.type==="interface");for(let d of p)r.addEdge(this.edge(e,c.fromId,c.type,d.id))}for(let c of i.calls){if(!c.callerId)continue;let p=this.resolveCallTargets(e,i,c.calleeName,c.qualifier,t,r,n);for(let d of p)d.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",d.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,o,n,i,l){let f=C(t.filePath),c=i.findByName(e,r).filter(p=>C(p.filePath)===f);if(!o&&c.length)return c;if(o)for(let p of t.imports){if(!p.bindings.find(y=>y.kind==="namespace"&&y.localName===o))continue;let S=B(f,p.source,l);if(S)return i.findByName(e,r).filter(y=>C(y.filePath)===S)}for(let p of t.imports){let d=p.bindings.find(E=>E.localName===r);if(!d)continue;let S=B(f,p.source,l);if(!S)continue;let y=d.importedName==="default"?r:d.importedName,j=i.findByName(e,y).filter(E=>C(E.filePath)===S);if(j.length)return j}return i.findByName(e,r).filter(p=>p.type==="function"||p.type==="method")}edge(e,t,r,o,n){return{id:ze(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:n}}};var I=class{async index(e,t){let r=await G(t),o=[];for(let i of r)try{o.push(await z(e,t,i))}catch(l){console.warn(`[indexer] skipped ${i}:`,l instanceof Error?l.message:l)}let n=new R().build(e,o);return{files:o.length,symbols:n.allSymbols(e).length,edges:n.allEdges(e).length,graph:n}}};function Z(s,e){let t=s.allSymbols(e),r=s.allEdges(e),o=i=>t.filter(l=>l.type===i).length,n=i=>r.filter(l=>l.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 Be}from"node:child_process";import{promisify as Ke}from"node:util";var Sr=Ke(Be);var T=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 ks from"typescript";import b from"typescript";var Is=new Set([b.SyntaxKind.EqualsToken,b.SyntaxKind.PlusEqualsToken,b.SyntaxKind.MinusEqualsToken,b.SyntaxKind.AsteriskEqualsToken,b.SyntaxKind.SlashEqualsToken,b.SyntaxKind.PercentEqualsToken,b.SyntaxKind.QuestionQuestionEqualsToken,b.SyntaxKind.AmpersandAmpersandEqualsToken,b.SyntaxKind.BarBarEqualsToken]);import{homedir as it}from"node:os";import{join as at}from"node:path";import{DeleteObjectCommand as He,GetObjectCommand as Ve,HeadObjectCommand as Ue,ListObjectsV2Command as Je,PutObjectCommand as qe,S3Client as Ye}from"@aws-sdk/client-s3";import{getSignedUrl as Ze}from"@aws-sdk/s3-request-presigner";var O=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Ye({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 qe({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await Ze(this.client,new Ve({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 Ue({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 He({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Je({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 Q,mkdir as Qe,readFile as Xe,readdir as et,rm as tt,stat as X,writeFile as rt}from"node:fs/promises";import{dirname as st,join as ot,relative as ee,resolve as nt}from"node:path";var k=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return nt(this.root,t)}async put(e,t){let r=this.path(e);await Qe(st(r),{recursive:!0}),await rt(r,t)}async get(e){try{return await Xe(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 Q(this.path(e)),!0}catch{return!1}}async delete(e){await tt(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await Q(t)}catch{return r}let o=async i=>{let l=await et(i,{withFileTypes:!0});for(let f of l){let c=ot(i,f.name);if(f.isDirectory()){await o(c);continue}let p=await X(c);r.push({key:ee(this.root,c),size:p.size,updatedAt:p.mtime.toISOString()})}},n=await X(t);return n.isDirectory()?await o(t):r.push({key:ee(this.root,t),size:n.size,updatedAt:n.mtime.toISOString()}),r}};function te(s){let e=s.localRoot??at(it(),".toolnet-memory","storage");if(s.provider==="huggingface"){let t=s.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new O({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):(console.warn("[storage] Hugging Face credentials missing. Using local fallback."),new k(e))}return new k(e)}function re(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 se(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 F=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=re(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(l){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${l instanceof Error?l.message:String(l)}`)}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=se(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 ct(){let s=W(),e=new A().detect(),t=te({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),r=new F(t,e.id,e.name,e.remote??e.name),o=await new I().index(e.id,e.rootPath),n=Z(o.graph,e.id);await new T(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})}ct().catch(s=>{console.error(s),process.exit(1)});
@@ -0,0 +1,4 @@
1
+ import"dotenv/config";import{existsSync as X,readFileSync as ee}from"node:fs";import{homedir as te}from"node:os";import{join as re}from"node:path";function se(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 oe(){let s=process.env.TOOLNET_GLOBAL_ENV??re(te(),".config","toolnet-memory",".env");if(!X(s))return;let e=ee(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]=se(r.slice(o+1)))}}oe();function x(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 F(){return{memory:{autoCapture:x(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:x(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:x(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:x(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",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 ne}from"node:crypto";import{existsSync as A,mkdirSync as ie,readFileSync as ae,renameSync as ce,writeFileSync as le}from"node:fs";import{basename as de,dirname as C,join as v,parse as $,resolve as h}from"node:path";var G=".toolnet",pe="project.json";function me(s){return ne("sha256").update(s).digest("hex").slice(0,16)}function M(s){return v(s,G,pe)}function fe(s){return A(M(s))}function ue(s,e){let t=h(s),r=$(t).root;for(;;){if(fe(t))return t;if(t===r||e&&t===h(e))break;let o=C(t);if(o===t)break;t=o}return null}function ge(s){let e=h(s),t=$(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(n=>A(v(e,n))))return e;if(e===t)break;let o=C(e);if(o===e)break;e=o}return h(s)}function he(s){let e;try{e=JSON.parse(ae(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:C(C(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 O(s,e){let t=v(s,G);ie(t,{recursive:!0});let r=M(s),o=`${r}.tmp-${process.pid}`;le(o,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),ce(o,r)}function _(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 E=class{detect(e=process.cwd()){let t=h(e),r=ge(t),n=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>A(v(r,l))),i=ue(t,n?r:void 0);if(i){let l=M(i),p=he(l);return p.rootPath!==i&&(p.rootPath=i,p.updatedAt=new Date().toISOString(),O(i,p)),_(p,i)}let d=new Date().toISOString(),c=de(r),a={version:1,id:me(r),name:c,remote:c,rootPath:r,createdAt:d,updatedAt:d,graphVersion:0,memoryVersion:0};return O(r,a),_(a,r)}};import{homedir as Me}from"node:os";import{join as Ie}from"node:path";import{DeleteObjectCommand as Se,GetObjectCommand as be,HeadObjectCommand as xe,ListObjectsV2Command as Ce,PutObjectCommand as Ee,S3Client as ve}from"@aws-sdk/client-s3";import{getSignedUrl as we}from"@aws-sdk/s3-request-presigner";var w=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new ve({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 Ee({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await we(this.client,new be({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 xe({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 Se({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Ce({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 D,mkdir as Pe,readFile as Re,readdir as Te,rm as ke,stat as z,writeFile as je}from"node:fs/promises";import{dirname as Le,join as Ne,relative as B,resolve as Ae}from"node:path";var y=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Ae(this.root,t)}async put(e,t){let r=this.path(e);await Pe(Le(r),{recursive:!0}),await je(r,t)}async get(e){try{return await Re(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 D(this.path(e)),!0}catch{return!1}}async delete(e){await ke(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await D(t)}catch{return r}let o=async i=>{let d=await Te(i,{withFileTypes:!0});for(let c of d){let a=Ne(i,c.name);if(c.isDirectory()){await o(a);continue}let l=await z(a);r.push({key:B(this.root,a),size:l.size,updatedAt:l.mtime.toISOString()})}},n=await z(t);return n.isDirectory()?await o(t):r.push({key:B(this.root,t),size:n.size,updatedAt:n.mtime.toISOString()}),r}};function K(s){let e=s.localRoot??Ie(Me(),".toolnet-memory","storage");if(s.provider==="huggingface"){let t=s.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new w({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):(console.warn("[storage] Hugging Face credentials missing. Using local fallback."),new y(e))}return new y(e)}var S=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")}};function Fe(s){return new Promise(e=>setTimeout(e,s))}async function W(s,e={}){let t=Math.max(1,e.attempts??3),r=e.baseDelayMs??150,o=e.maxDelayMs??2e3,n;for(let i=1;i<=t;i++)try{return await s()}catch(d){if(n=d,i>=t)break;let c=Math.min(o,r*2**(i-1)),a=Math.floor(Math.random()*Math.max(1,c*.2));await Fe(c+a)}throw n}var Oe=new Set(["put","get","getText","delete","list"]);function H(s,e={}){return new Proxy(s,{get(t,r){let o=Reflect.get(t,r,t);return typeof o!="function"?o:Oe.has(r)?(...n)=>W(()=>Promise.resolve(o.apply(t,n)),e):o.bind(t)}})}function V(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 U(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 P=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=V(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=U(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))}};import Fr from"typescript";var u=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 De(s,e){return e.ranges.length===0?!0:typeof s.startLine!="number"||typeof s.endLine!="number"?!1:e.ranges.some(t=>s.startLine<=t.endLine&&s.endLine>=t.startLine)}var R=class{constructor(e){this.graph=e}graph;map(e,t){let r=this.graph.allSymbols(e),o=[];for(let n of t){let i=r.filter(a=>a.filePath===n.filePath),c=i.filter(a=>a.type!=="file").filter(a=>De(a,n));if(c.length===0){let a=i.find(l=>l.type==="file");a&&o.push({symbol:a,fileStatus:n.status,direct:!0});continue}for(let a of c)o.push({symbol:a,fileStatus:n.status,direct:!0})}return o}mapFile(e,t){return this.map(e,[{filePath:t,status:"modified",ranges:[]}])}};var ze={CALLS:4,CALL_REFERENCE:6,USES_TYPE:4,TESTS:2,ROUTE:4,WRITES:3,IMPORTS:3,INHERITS:5,IMPLEMENTS:5,DEFINES:1};function Be(s){return s>=30?"CRITICAL":s>=16?"HIGH":s>=6?"MEDIUM":"LOW"}function J(s){let e=s.toLowerCase().replaceAll("\\","/");return e.startsWith("tests/")||e.includes("/tests/")||e.includes("__tests__")||/\.(test|spec)\.[^.]+$/.test(e)}var T=class{constructor(e){this.graph=e}graph;analyze(e,t,r=4){let o=this.graph.allEdges(e),n=new Map,i=0;for(let l of t){l.fileStatus==="deleted"?i+=8:l.fileStatus==="renamed"?i+=5:i+=2,l.symbol.type==="interface"&&(i+=5),l.symbol.type==="class"&&(i+=3);let p=new Set([l.symbol.id]),j=[{id:l.symbol.id,depth:0}];for(;j.length;){let L=j.shift();if(L.depth>=r)continue;let Y=o.filter(f=>f.to===L.id&&["CALLS","CALL_REFERENCE","USES_TYPE","TESTS","ROUTE","WRITES","IMPORTS","INHERITS","IMPLEMENTS","DEFINES"].includes(f.type));for(let f of Y){if(p.has(f.from))continue;p.add(f.from);let b=this.graph.getSymbol(f.from);if(!b)continue;let N=L.depth+1,Z=`${l.symbol.id}:${b.id}`;n.set(Z,{symbol:b,relation:f.type,depth:N,sourceSymbolId:l.symbol.id});let Q=ze[f.type]??1;i+=Math.max(1,Q-(N-1)),j.push({id:b.id,depth:N})}}}let d=[...n.values()].sort((l,p)=>l.depth-p.depth),c=[...new Set(d.map(l=>l.symbol.filePath))],a=c.filter(J);return a.length===0&&a.push(...c.filter(l=>!J(l)).slice(0,10)),{risk:Be(i),riskScore:i,changedSymbols:t,impacted:d,impactedFiles:c,suggestedTests:a}}};import{execFile as Ke}from"node:child_process";import{promisify as We}from"node:util";var I=We(Ke);function He(s){let e=[],t=/^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@/gm;for(let r of s.matchAll(t)){let o=Number(r[1]),n=Number(r[2]??1);e.push({startLine:o,endLine:Math.max(o,o+n-1)})}return e}function Ve(s){return s.startsWith("A")?"added":s.startsWith("D")?"deleted":s.startsWith("R")?"renamed":"modified"}async function q(s){let e="";try{e=(await I("git",["diff","HEAD","--name-status","--no-renames"],{cwd:s,maxBuffer:10485760})).stdout}catch{return[]}let t=[];for(let r of e.split(/\r?\n/).filter(Boolean)){let[o,...n]=r.split(" "),i=n.at(-1);if(!i)continue;let d="";try{d=(await I("git",["diff","HEAD","--unified=0","--",i],{cwd:s,maxBuffer:20971520})).stdout}catch{d=""}t.push({filePath:i,status:Ve(o),ranges:He(d)})}try{let r=await I("git",["ls-files","--others","--exclude-standard"],{cwd:s});for(let o of r.stdout.split(/\r?\n/).filter(Boolean))t.some(n=>n.filePath===o)||t.push({filePath:o,status:"added",ranges:[]})}catch{}return t}var k=class{constructor(e){this.graph=e;this.mapper=new R(e),this.blast=new T(e)}graph;mapper;blast;async analyzeGitDiff(e,t,r={}){let o=await q(t),n=this.mapper.map(e,o),i=this.blast.analyze(e,n,r.maxDepth??4);return{mode:"git_diff",changes:o,...i}}analyzeFile(e,t,r={}){let o=this.mapper.mapFile(e,t);return{mode:"planned_file",filePath:t,...this.blast.analyze(e,o,r.maxDepth??4)}}};import eo from"typescript";import m from"typescript";var io=new Set([m.SyntaxKind.EqualsToken,m.SyntaxKind.PlusEqualsToken,m.SyntaxKind.MinusEqualsToken,m.SyntaxKind.AsteriskEqualsToken,m.SyntaxKind.SlashEqualsToken,m.SyntaxKind.PercentEqualsToken,m.SyntaxKind.QuestionQuestionEqualsToken,m.SyntaxKind.AmpersandAmpersandEqualsToken,m.SyntaxKind.BarBarEqualsToken]);async function Je(){let s=F(),e=new E().detect(),t=H(K({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),{attempts:3}),r=new P(t,e.id,e.name,e.remote??e.name),o=await new S(r).load(e.id);if(!o)throw new Error("Code graph missing");let n=new u;n.import(o.symbols,o.edges);let i=new k(n),d=process.argv[2],c=d?i.analyzeFile(e.id,d):await i.analyzeGitDiff(e.id,e.rootPath);console.log({risk:c.risk,riskScore:c.riskScore,changedSymbols:c.changedSymbols.map(a=>({symbol:a.symbol.qualifiedName,file:a.symbol.filePath,type:a.symbol.type})),impactedFiles:c.impactedFiles,suggestedTests:c.suggestedTests,impactedCount:c.impacted.length})}Je().catch(s=>{console.error(s),process.exit(1)});
@@ -0,0 +1,4 @@
1
+ import"dotenv/config";import{existsSync as ae,readFileSync as ce}from"node:fs";import{homedir as de}from"node:os";import{join as pe}from"node:path";function me(o){let e=o.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 le(){let o=process.env.TOOLNET_GLOBAL_ENV??pe(de(),".config","toolnet-memory",".env");if(!ae(o))return;let e=ce(o,"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]=me(r.slice(s+1)))}}le();function C(o,e){return o===void 0?e:["1","true","yes","on"].includes(o.toLowerCase())}function R(o,e){if(!o)return e;let t=Number(o);return Number.isFinite(t)?t:e}function K(){return{memory:{autoCapture:C(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:C(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:C(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:C(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:R(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:R(process.env.MEMORY_RERANK_TOP,10),finalContext:R(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:R(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",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:R(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as ge}from"node:crypto";import{existsSync as F,mkdirSync as ue,readFileSync as fe,renameSync as ye,writeFileSync as he}from"node:fs";import{basename as Se,dirname as E,join as T,parse as J,resolve as k}from"node:path";var H=".toolnet",ve="project.json";function xe(o){return ge("sha256").update(o).digest("hex").slice(0,16)}function L(o){return T(o,H,ve)}function je(o){return F(L(o))}function be(o,e){let t=k(o),r=J(t).root;for(;;){if(je(t))return t;if(t===r||e&&t===k(e))break;let s=E(t);if(s===t)break;t=s}return null}function we(o){let e=k(o),t=J(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>F(T(e,i))))return e;if(e===t)break;let s=E(e);if(s===e)break;e=s}return k(o)}function Pe(o){let e;try{e=JSON.parse(fe(o,"utf8"))}catch(s){throw new Error(`Invalid ToolNet project manifest: ${o}: ${s instanceof Error?s.message:String(s)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${o}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${o}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${o}`);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:E(E(o)),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 V(o,e){let t=T(o,H);ue(t,{recursive:!0});let r=L(o),s=`${r}.tmp-${process.pid}`;he(s,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),ye(s,r)}function G(o,e){return{id:o.id,name:o.name,remote:o.remote,rootPath:e,createdAt:o.createdAt,updatedAt:o.updatedAt,graphVersion:o.graphVersion,memoryVersion:o.memoryVersion,metadata:o.metadata}}var A=class{detect(e=process.cwd()){let t=k(e),r=we(t),i=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(p=>F(T(r,p))),n=be(t,i?r:void 0);if(n){let p=L(n),l=Pe(p);return l.rootPath!==n&&(l.rootPath=n,l.updatedAt=new Date().toISOString(),V(n,l)),G(l,n)}let m=new Date().toISOString(),d=Se(r),c={version:1,id:xe(r),name:d,remote:d,rootPath:r,createdAt:m,updatedAt:m,graphVersion:0,memoryVersion:0};return V(r,c),G(c,r)}};import{homedir as ze}from"node:os";import{join as Be}from"node:path";import{DeleteObjectCommand as Re,GetObjectCommand as ke,HeadObjectCommand as Me,ListObjectsV2Command as Ce,PutObjectCommand as Ee,S3Client as Ae}from"@aws-sdk/client-s3";import{getSignedUrl as Te}from"@aws-sdk/s3-request-presigner";var I=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Ae({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 Ee({Bucket:this.bucket,Key:e,Body:s,ContentType:r}))}async get(e){let t=await Te(this.client,new ke({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 Me({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 Re({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let s=await this.client.send(new Ce({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 U,mkdir as Ie,readFile as Oe,readdir as $e,rm as Ne,stat as W,writeFile as _e}from"node:fs/promises";import{dirname as De,join as Fe,relative as Y,resolve as Le}from"node:path";var M=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Le(this.root,t)}async put(e,t){let r=this.path(e);await Ie(De(r),{recursive:!0}),await _e(r,t)}async get(e){try{return await Oe(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 U(this.path(e)),!0}catch{return!1}}async delete(e){await Ne(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await U(t)}catch{return r}let s=async n=>{let m=await $e(n,{withFileTypes:!0});for(let d of m){let c=Fe(n,d.name);if(d.isDirectory()){await s(c);continue}let p=await W(c);r.push({key:Y(this.root,c),size:p.size,updatedAt:p.mtime.toISOString()})}},i=await W(t);return i.isDirectory()?await s(t):r.push({key:Y(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};function Z(o){let e=o.localRoot??Be(ze(),".toolnet-memory","storage");if(o.provider==="huggingface"){let t=o.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new I({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):(console.warn("[storage] Hugging Face credentials missing. Using local fallback."),new M(e))}return new M(e)}var O=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")}};var $=class{constructor(e){this.storage=e}storage;key(e){return["projects",e,"graph","manifest.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")}};function X(o){let e=o.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 Q(o){let e=o.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 N=class{constructor(e,t,r,s){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=X(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 n;try{n=JSON.parse(s)}catch(m){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${m instanceof Error?m.message:String(m)}`)}if(typeof n.id=="string"&&n.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${n.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof n.createdAt=="string"&&(r=n.createdAt)}let i={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(i,null,2)+`
4
+ `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=Q(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))}};import{join as qe}from"node:path";import{readdir as Je}from"node:fs/promises";import{extname as He,join as Ue,relative as We}from"node:path";import{basename as Ke}from"node:path";var Ve=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),Ge=new Set([".pem",".key",".p12",".pfx"]);function q(o){let e=Ke(o).toLowerCase();if(Ve.has(e))return!0;for(let t of Ge)if(e.endsWith(t))return!0;return!1}var Ye=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Ze=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function ee(o){let e=[];async function t(r){let s=await Je(r,{withFileTypes:!0});for(let i of s){if(Ze.has(i.name))continue;let n=Ue(r,i.name);if(i.isDirectory()){await t(n);continue}Ye.has(He(i.name))&&(q(n)||e.push(We(o,n)))}}return await t(o),e.sort()}import{createHash as Xe}from"node:crypto";import{readFile as Qe}from"node:fs/promises";async function te(o){let e=await Qe(o);return Xe("sha256").update(e).digest("hex")}async function re(o,e){let t=await ee(e),r={};for(let s of t)r[s]={path:s,hash:await te(qe(e,s))};return{version:1,projectId:o,updatedAt:new Date().toISOString(),files:r}}function oe(o,e){let t=o?.files??{},r=e.files,s=[],i=[],n=[],m=[];for(let[d,c]of Object.entries(r)){let p=t[d];p?p.hash!==c.hash?i.push(d):m.push(d):s.push(d)}for(let d of Object.keys(t))r[d]||n.push(d);return{added:s.sort(),modified:i.sort(),deleted:n.sort(),unchanged:m.sort()}}import{readFile as et}from"node:fs/promises";import{join as tt}from"node:path";import{createHash as rt}from"node:crypto";import h from"typescript";function se(o,e){return rt("sha256").update(`${o}:${e}`).digest("hex").slice(0,24)}function z(o,e){return o.getLineAndCharacterOfPosition(e.getStart(o)).line+1}async function ne(o,e,t){let r=tt(e,t),s=await et(r,"utf8"),i=h.createSourceFile(t,s,h.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?h.ScriptKind.TSX:h.ScriptKind.TS),n=[],m=[],d=[],c=[],p={id:se(o,`file:${t}`),projectId:o,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:i.getLineAndCharacterOfPosition(i.end).line+1};n.push(p);let l=[],v=[];function f(a,S,y,u){let j=se(o,`${t}:${y}:${u??S}:${a.pos}`);return n.push({id:j,projectId:o,name:S,qualifiedName:u??S,type:y,filePath:t,startLine:z(i,a),endLine:i.getLineAndCharacterOfPosition(a.end).line+1}),j}function w(a){if(!h.isStringLiteral(a.moduleSpecifier))return;let S=[],y=a.importClause;if(y?.name&&S.push({localName:y.name.text,importedName:"default",kind:"default"}),y?.namedBindings&&h.isNamedImports(y.namedBindings))for(let u of y.namedBindings.elements)S.push({localName:u.name.text,importedName:u.propertyName?.text??u.name.text,kind:"named"});y?.namedBindings&&h.isNamespaceImport(y.namedBindings)&&S.push({localName:y.namedBindings.name.text,importedName:"*",kind:"namespace"}),m.push({source:a.moduleSpecifier.text,bindings:S})}function x(a,S){for(let y of a.heritageClauses??[])for(let u of y.types){let j=u.expression.getText(i).split(".").at(-1)??"";j&&c.push({fromId:S,targetName:j,type:y.token===h.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function g(a){let S=!1,y=!1;if(h.isImportDeclaration(a)&&w(a),h.isInterfaceDeclaration(a)&&f(a,a.name.text,"interface",a.name.text),h.isClassDeclaration(a)&&a.name){let u=f(a,a.name.text,"class",a.name.text);x(a,u),v.push({id:u,name:a.name.text}),y=!0}if(h.isFunctionDeclaration(a)&&a.name){let u=f(a,a.name.text,"function",a.name.text);l.push(u),S=!0}if(h.isMethodDeclaration(a)&&a.name){let u=a.name.getText(i),j=v.at(-1)?.name,ie=f(a,u,"method",j?`${j}.${u}`:u);l.push(ie),S=!0}if(h.isCallExpression(a)&&(h.isIdentifier(a.expression)&&d.push({callerId:l.at(-1),calleeName:a.expression.text,line:z(i,a)}),h.isPropertyAccessExpression(a.expression))){let u=a.expression;d.push({callerId:l.at(-1),qualifier:u.expression.getText(i),calleeName:u.name.text,line:z(i,a)})}h.forEachChild(a,g),S&&l.pop(),y&&v.pop()}return g(i),{filePath:t,symbols:n,imports:m,calls:d,heritage:c}}import{createHash as ot}from"node:crypto";import{dirname as st,extname as nt,normalize as it,posix as at}from"node:path";var P=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 ct(o,e,t,r){return ot("sha256").update(`${o}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function b(o){return it(o).replaceAll("\\","/")}function B(o,e,t){if(!e.startsWith("."))return;let r=b(at.join(st(o),e)),s=nt(r),i;if(s===".js"){let n=r.slice(0,-3);i=[`${n}.ts`,`${n}.tsx`,`${n}.js`,`${n}.jsx`]}else if(s===".mjs"){let n=r.slice(0,-4);i=[`${n}.mts`,`${n}.ts`,`${n}.mjs`]}else if(s===".cjs"){let n=r.slice(0,-4);i=[`${n}.cts`,`${n}.ts`,`${n}.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(n=>t.has(b(n)))}var _=class{build(e,t){let r=new P,s=new Map;for(let n of t)for(let m of n.symbols)r.addSymbol(m),m.type==="file"&&s.set(b(n.filePath),m);let i=new Set(s.keys());for(let n of t){let m=b(n.filePath),d=s.get(m);if(d){for(let c of n.symbols)c.id!==d.id&&r.addEdge(this.edge(e,d.id,"DEFINES",c.id));for(let c of n.imports){let p=B(m,c.source,i);if(!p)continue;let l=s.get(p);l&&r.addEdge(this.edge(e,d.id,"IMPORTS",l.id,{source:c.source}))}for(let c of n.heritage){let p=r.findByName(e,c.targetName).filter(l=>l.type==="class"||l.type==="interface");for(let l of p)r.addEdge(this.edge(e,c.fromId,c.type,l.id))}for(let c of n.calls){if(!c.callerId)continue;let p=this.resolveCallTargets(e,n,c.calleeName,c.qualifier,t,r,i);for(let l of p)l.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",l.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,s,i,n,m){let d=b(t.filePath),c=n.findByName(e,r).filter(p=>b(p.filePath)===d);if(!s&&c.length)return c;if(s)for(let p of t.imports){if(!p.bindings.find(f=>f.kind==="namespace"&&f.localName===s))continue;let v=B(d,p.source,m);if(v)return n.findByName(e,r).filter(f=>b(f.filePath)===v)}for(let p of t.imports){let l=p.bindings.find(x=>x.localName===r);if(!l)continue;let v=B(d,p.source,m);if(!v)continue;let f=l.importedName==="default"?r:l.importedName,w=n.findByName(e,f).filter(x=>b(x.filePath)===v);if(w.length)return w}return n.findByName(e,r).filter(p=>p.type==="function"||p.type==="method")}edge(e,t,r,s,i){return{id:ct(e,t,r,s),projectId:e,from:t,to:s,type:r,metadata:i}}};var D=class{constructor(e){this.storage=e}storage;async index(e,t){let r=new $(this.storage),s=new O(this.storage),i=await r.load(e),n=await s.load(e),m=await re(e,t),d=oe(i,m),c=[...d.added,...d.modified];if(i&&n&&c.length===0&&d.deleted.length===0)return{firstRun:!1,scanned:Object.keys(m.files).length,parsed:0,added:0,modified:0,deleted:0,unchanged:d.unchanged.length,symbols:n.symbols.length,edges:n.edges.length,saved:!1};let p=n?.symbols.filter(g=>d.unchanged.includes(g.filePath))??[],l=[];for(let g of c)l.push(await ne(e,t,g));let v=new _().build(e,l),f=new P;for(let g of p)f.addSymbol(g);for(let g of v.allSymbols(e))f.addSymbol(g);let w=new Set(f.allSymbols(e).map(g=>g.id));for(let g of n?.edges??[])w.has(g.from)&&w.has(g.to)&&!c.includes(n.symbols.find(a=>a.id===g.from)?.filePath??"")&&!c.includes(n.symbols.find(a=>a.id===g.to)?.filePath??"")&&f.addEdge(g);for(let g of v.allEdges(e))f.addEdge(g);let x={version:1,projectId:e,updatedAt:new Date().toISOString(),files:Object.keys(m.files).length,symbols:f.allSymbols(e),edges:f.allEdges(e)};return await s.save(x),await r.save(m),{firstRun:i===null,scanned:Object.keys(m.files).length,parsed:c.length,added:d.added.length,modified:d.modified.length,deleted:d.deleted.length,unchanged:d.unchanged.length,symbols:x.symbols.length,edges:x.edges.length,saved:!0}}};async function dt(){let o=K(),e=new A().detect(),t=Z({provider:o.storage.provider,huggingface:o.storage.huggingface,localRoot:o.storage.localRoot}),r=new N(t,e.id,e.name,e.remote??e.name),s=await new D(r).index(e.id,e.rootPath);console.log({ok:!0,storage:r.name,...s})}dt().catch(o=>{console.error(o),process.exit(1)});