toolnet-memory 0.3.14 → 0.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/.env.example +0 -1
  2. package/.release-target +1 -1
  3. package/README.md +182 -6
  4. package/bin/toolnet-memory +5 -0
  5. package/bundle/agy-hook.js +71 -71
  6. package/bundle/agy.js +65 -65
  7. package/bundle/api.js +15 -15
  8. package/bundle/auto-integrate.js +28 -28
  9. package/bundle/background-refresh.js +7 -7
  10. package/bundle/claude-hook.js +51 -50
  11. package/bundle/codex-context.js +29 -28
  12. package/bundle/codex.js +77 -77
  13. package/bundle/context-runtime.js +44 -43
  14. package/bundle/context.js +15 -15
  15. package/bundle/continuity-certify.js +13 -13
  16. package/bundle/copilot-hook.js +88 -86
  17. package/bundle/copilot.js +4 -4
  18. package/bundle/cursor-hook.js +88 -86
  19. package/bundle/cursor.js +4 -4
  20. package/bundle/doctor.js +4 -4
  21. package/bundle/full-index.js +21 -21
  22. package/bundle/gc.js +3 -0
  23. package/bundle/graph-index.js +4 -4
  24. package/bundle/graph-ui.js +3 -3
  25. package/bundle/grok-hook.js +64 -63
  26. package/bundle/grok.js +5 -5
  27. package/bundle/handoff-refresh.js +10 -10
  28. package/bundle/help-cli.js +3 -3
  29. package/bundle/impact.js +4 -4
  30. package/bundle/incremental.js +5 -4
  31. package/bundle/init.js +38 -37
  32. package/bundle/integration-status.js +4 -4
  33. package/bundle/kiro-hook.js +93 -92
  34. package/bundle/learner.js +6 -6
  35. package/bundle/mcp.js +17 -17
  36. package/bundle/memory-agent.js +7 -7
  37. package/bundle/memory-query.js +7 -7
  38. package/bundle/opencode.js +84 -84
  39. package/bundle/project-manual.js +7 -7
  40. package/bundle/recovery-certify.js +15 -15
  41. package/bundle/runtime.js +13 -12
  42. package/bundle/semantic.js +5 -5
  43. package/bundle/snapshot.js +4 -4
  44. package/bundle/status-cli.js +4 -4
  45. package/bundle/toolnet-cli.js +60 -60
  46. package/bundle/work-continuity.js +7 -7
  47. package/package.json +21 -3
  48. package/release-manifest.json +104 -3
@@ -1,4 +1,5 @@
1
- import"dotenv/config";import{existsSync as de,readFileSync as ue}from"node:fs";import{homedir as le}from"node:os";import{join as pe}from"node:path";function me(s){let e=s.trim();return e.length>=2&&e.startsWith('"')&&e.endsWith('"')?(e=e.slice(1,-1),e.replace(/\\n/g,`
2
- `).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\"/g,'"').replace(/\\\\/g,"\\")):e.length>=2&&e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function fe(){let s=process.env.TOOLNET_GLOBAL_ENV??pe(le(),".config","toolnet-memory",".env");if(!de(s))return;let e=ue(s,"utf8");for(let t of e.split(/\r?\n/)){let r=t.trim();if(!r||r.startsWith("#"))continue;r.startsWith("export ")&&(r=r.slice(7));let o=r.indexOf("=");if(o<=0)continue;let i=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(i)&&process.env[i]===void 0&&(process.env[i]=me(r.slice(o+1)))}}fe();function M(s,e){return s===void 0?e:["1","true","yes","on"].includes(s.toLowerCase())}function R(s,e){if(!s)return e;let t=Number(s);return Number.isFinite(t)?t:e}function G(){return{memory:{autoCapture:M(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:M(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:M(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:M(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",r2:{accountId:process.env.R2_ACCOUNT_ID,bucket:process.env.R2_BUCKET,accessKeyId:process.env.R2_ACCESS_KEY_ID,secretAccessKey:process.env.R2_SECRET_ACCESS_KEY},s3:{endpoint:process.env.S3_ENDPOINT,region:process.env.S3_REGION,bucket:process.env.S3_BUCKET,accessKeyId:process.env.S3_ACCESS_KEY_ID,secretAccessKey:process.env.S3_SECRET_ACCESS_KEY,forcePathStyle:M(process.env.S3_FORCE_PATH_STYLE,!1)},huggingface:{namespace:process.env.HF_NAMESPACE,bucket:process.env.HF_BUCKET,accessKeyId:process.env.HF_S3_ACCESS_KEY_ID,secretAccessKey:process.env.HF_S3_SECRET_ACCESS_KEY},localRoot:process.env.MEMORY_LOCAL_STORAGE_PATH},cache:{maxMb:R(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as ge}from"node:crypto";import{existsSync as L,mkdirSync as ye,readFileSync as he,renameSync as Se,writeFileSync as be}from"node:fs";import{basename as ve,dirname as E,join as T,parse as J,resolve as C}from"node:path";var W=".toolnet",xe="project.json";function we(s){return ge("sha256").update(s).digest("hex").slice(0,16)}function F(s){return T(s,W,xe)}function je(s){return L(F(s))}function ke(s,e){let t=C(s),r=J(t).root;for(;;){if(je(t))return t;if(t===r||e&&t===C(e))break;let o=E(t);if(o===t)break;t=o}return null}function Me(s){let e=C(s),t=J(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(i=>L(T(e,i))))return e;if(e===t)break;let o=E(e);if(o===e)break;e=o}return C(s)}function Re(s){let e;try{e=JSON.parse(he(s,"utf8"))}catch(o){throw new Error(`Invalid ToolNet project manifest: ${s}: ${o instanceof Error?o.message:String(o)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${s}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${s}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${s}`);let r=new Date().toISOString();return{version:1,id:t.id,name:t.name,remote:typeof t.remote=="string"&&t.remote.trim()?t.remote:t.name,rootPath:typeof t.rootPath=="string"?t.rootPath:E(E(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 U(s,e){let t=T(s,W);ye(t,{recursive:!0});let r=F(s),o=`${r}.tmp-${process.pid}`;be(o,JSON.stringify(e,null,2)+`
3
- `,{encoding:"utf8",mode:384}),Se(o,r)}function H(s,e){return{id:s.id,name:s.name,remote:s.remote,rootPath:e,createdAt:s.createdAt,updatedAt:s.updatedAt,graphVersion:s.graphVersion,memoryVersion:s.memoryVersion,metadata:s.metadata}}var I=class{detect(e=process.cwd()){let t=C(e),r=Me(t),i=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>L(T(r,l))),n=ke(t,i?r:void 0);if(n){let l=F(n),m=Re(l);return m.rootPath!==n&&(m.rootPath=n,m.updatedAt=new Date().toISOString(),U(n,m)),H(m,n)}let p=new Date().toISOString(),d=ve(r),c={version:1,id:we(r),name:d,remote:d,rootPath:r,createdAt:p,updatedAt:p,graphVersion:0,memoryVersion:0};return U(r,c),H(c,r)}};import{homedir as Ye}from"node:os";import{join as Qe}from"node:path";import{DeleteObjectCommand as Ce,GetObjectCommand as Pe,HeadObjectCommand as Ae,ListObjectsV2Command as Ee,PutObjectCommand as Ie,S3Client as Te}from"@aws-sdk/client-s3";import{getSignedUrl as Oe}from"@aws-sdk/s3-request-presigner";var O=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Te({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 Ie({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await Oe(this.client,new Pe({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 Ae({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 Ce({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Ee({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of o.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};import{access as Y,mkdir as Ne,readFile as $e,readdir as _e,rm as Ke,stat as Q,writeFile as De}from"node:fs/promises";import{dirname as Le,join as Fe,relative as Z,resolve as ze}from"node:path";var P=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return ze(this.root,t)}async put(e,t){let r=this.path(e);await Ne(Le(r),{recursive:!0}),await De(r,t)}async get(e){try{return await $e(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 Y(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 Y(t)}catch{return r}let o=async n=>{let p=await _e(n,{withFileTypes:!0});for(let d of p){let c=Fe(n,d.name);if(d.isDirectory()){await o(c);continue}let l=await Q(c);r.push({key:Z(this.root,c),size:l.size,updatedAt:l.mtime.toISOString()})}},i=await Q(t);return i.isDirectory()?await o(t):r.push({key:Z(this.root,t),size:i.size,updatedAt:i.mtime.toISOString()}),r}};import{DeleteObjectCommand as Be,GetObjectCommand as Ve,HeadObjectCommand as Ge,ListObjectsV2Command as Ue,PutObjectCommand as He,S3Client as Je}from"@aws-sdk/client-s3";import{getSignedUrl as We}from"@aws-sdk/s3-request-presigner";var A=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new Je({region:e.region??"us-east-1",endpoint:e.endpoint||void 0,forcePathStyle:e.forcePathStyle??!1,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let o=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new He({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await We(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(`${this.name} download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new Ge({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 Be({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Ue({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let i of o.Contents??[])i.Key&&t.push({key:i.Key,size:i.Size,updatedAt:i.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};function z(s,e){return console.warn(e),new P(s)}function q(s){let e=s.localRoot??Qe(Ye(),".toolnet-memory","storage");if(s.provider==="r2"){let t=s.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new A({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):z(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(s.provider==="s3"){let t=s.s3;return t?.bucket&&t.accessKeyId&&t.secretAccessKey?new A({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):z(e,"[storage] S3 credentials missing. Using local fallback.")}if(s.provider==="huggingface"){let t=s.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new O({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):z(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new P(e)}var N=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(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 ee(s){let e=s.replace(/^\/+/,"");if(e.startsWith("memories/"))return"memory/records/"+e.slice(9);if(e.startsWith("vectors/"))return"memory/vectors/"+e.slice(8);if(e.startsWith("graph/"))return"code/graph/"+e.slice(6);let t=e.match(/^(snapshots\/[^/]+\/)memories\/(.+)$/);if(t)return`${t[1]}memory/records/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)vectors\/(.+)$/),t)return`${t[1]}memory/vectors/${t[2]}`;if(t=e.match(/^(snapshots\/[^/]+\/)graph\/(.+)$/),t)return`${t[1]}code/graph/${t[2]}`;let r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(r)return`${r[1]}memory/records/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),r)return`${r[1]}memory/vectors/${r[2]}`;if(r=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),r)return`${r[1]}code/graph/${r[2]}`;let o=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return o?`${o[1]}memory/records/${o[2]}`:(o=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),o?`${o[1]}memory/vectors/${o[2]}`:(o=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),o?`${o[1]}code/graph/${o[2]}`:e))}var _=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=X(o??r),this.sourcePrefix=`projects/${t}`,this.targetPrefix=`projects/${this.folder}`}provider;name;folder;sourcePrefix;targetPrefix;projectId;projectName;registryPromise;async registerProject(){let e=`${this.targetPrefix}/project.json`,t=new Date().toISOString(),r=t,o=await this.provider.getText(e);if(o){let n;try{n=JSON.parse(o)}catch(p){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${p instanceof Error?p.message:String(p)}`)}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=ee(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 ct}from"node:path";import{readdir as et}from"node:fs/promises";import{extname as tt,join as rt,relative as st}from"node:path";import{basename as Ze}from"node:path";var qe=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),Xe=new Set([".pem",".key",".p12",".pfx"]);function te(s){let e=Ze(s).toLowerCase();if(qe.has(e))return!0;for(let t of Xe)if(e.endsWith(t))return!0;return!1}var ot=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),nt=new Set(["node_modules",".git","dist","build","coverage",".next",".cache",".toolnet-memory"]);async function re(s){let e=[];async function t(r){let o=await et(r,{withFileTypes:!0});for(let i of o){if(nt.has(i.name))continue;let n=rt(r,i.name);if(i.isDirectory()){await t(n);continue}ot.has(tt(i.name))&&(te(n)||e.push(st(s,n)))}}return await t(s),e.sort()}import{createHash as it}from"node:crypto";import{readFile as at}from"node:fs/promises";async function se(s){let e=await at(s);return it("sha256").update(e).digest("hex")}async function oe(s,e){let t=await re(e),r={};for(let o of t)r[o]={path:o,hash:await se(ct(e,o))};return{version:1,projectId:s,updatedAt:new Date().toISOString(),files:r}}function ne(s,e){let t=s?.files??{},r=e.files,o=[],i=[],n=[],p=[];for(let[d,c]of Object.entries(r)){let l=t[d];l?l.hash!==c.hash?i.push(d):p.push(d):o.push(d)}for(let d of Object.keys(t))r[d]||n.push(d);return{added:o.sort(),modified:i.sort(),deleted:n.sort(),unchanged:p.sort()}}import{readFile as dt}from"node:fs/promises";import{join as ut}from"node:path";import{createHash as lt}from"node:crypto";import*as u from"typescript";function ie(s,e){return lt("sha256").update(`${s}:${e}`).digest("hex").slice(0,24)}function B(s,e){return s.getLineAndCharacterOfPosition(e.getStart(s)).line+1}async function ae(s,e,t){let r=ut(e,t),o=await dt(r,"utf8"),i=u.createSourceFile(t,o,u.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?u.ScriptKind.TSX:u.ScriptKind.TS),n=[],p=[],d=[],c=[],l={id:ie(s,`file:${t}`),projectId:s,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:i.getLineAndCharacterOfPosition(i.end).line+1};n.push(l);let m=[],b=[];function y(a,S,h,g){let x=ie(s,`${t}:${h}:${g??S}:${a.pos}`);return n.push({id:x,projectId:s,name:S,qualifiedName:g??S,type:h,filePath:t,startLine:B(i,a),endLine:i.getLineAndCharacterOfPosition(a.end).line+1}),x}function j(a){if(!u.isStringLiteral(a.moduleSpecifier))return;let S=[],h=a.importClause;if(h?.name&&S.push({localName:h.name.text,importedName:"default",kind:"default"}),h?.namedBindings&&u.isNamedImports(h.namedBindings))for(let g of h.namedBindings.elements)S.push({localName:g.name.text,importedName:g.propertyName?.text??g.name.text,kind:"named"});h?.namedBindings&&u.isNamespaceImport(h.namedBindings)&&S.push({localName:h.namedBindings.name.text,importedName:"*",kind:"namespace"}),p.push({source:a.moduleSpecifier.text,bindings:S})}function v(a,S){for(let h of a.heritageClauses??[])for(let g of h.types){let x=g.expression.getText(i).split(".").at(-1)??"";x&&c.push({fromId:S,targetName:x,type:h.token===u.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function f(a){let S=!1,h=!1;if(u.isImportDeclaration(a)&&j(a),u.isInterfaceDeclaration(a)&&y(a,a.name.text,"interface",a.name.text),u.isClassDeclaration(a)&&a.name){let g=y(a,a.name.text,"class",a.name.text);v(a,g),b.push({id:g,name:a.name.text}),h=!0}if(u.isFunctionDeclaration(a)&&a.name){let g=y(a,a.name.text,"function",a.name.text);m.push(g),S=!0}if(u.isMethodDeclaration(a)&&a.name){let g=a.name.getText(i),x=b.at(-1)?.name,ce=y(a,g,"method",x?`${x}.${g}`:g);m.push(ce),S=!0}if(u.isCallExpression(a)&&(u.isIdentifier(a.expression)&&d.push({callerId:m.at(-1),calleeName:a.expression.text,line:B(i,a)}),u.isPropertyAccessExpression(a.expression))){let g=a.expression;d.push({callerId:m.at(-1),qualifier:g.expression.getText(i),calleeName:g.name.text,line:B(i,a)})}u.forEachChild(a,f),S&&m.pop(),h&&b.pop()}return f(i),{filePath:t,symbols:n,imports:p,calls:d,heritage:c}}import{createHash as pt}from"node:crypto";import{dirname as mt,extname as ft,normalize as gt,posix as yt}from"node:path";var k=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 ht(s,e,t,r){return pt("sha256").update(`${s}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function w(s){return gt(s).replaceAll("\\","/")}function V(s,e,t){if(!e.startsWith("."))return;let r=w(yt.join(mt(s),e)),o=ft(r),i;if(o===".js"){let n=r.slice(0,-3);i=[`${n}.ts`,`${n}.tsx`,`${n}.js`,`${n}.jsx`]}else if(o===".mjs"){let n=r.slice(0,-4);i=[`${n}.mts`,`${n}.ts`,`${n}.mjs`]}else if(o===".cjs"){let n=r.slice(0,-4);i=[`${n}.cts`,`${n}.ts`,`${n}.cjs`]}else o?i=[r]:i=[`${r}.ts`,`${r}.tsx`,`${r}.mts`,`${r}.cts`,`${r}.js`,`${r}.jsx`,`${r}.mjs`,`${r}.cjs`,`${r}/index.ts`,`${r}/index.tsx`,`${r}/index.js`,`${r}/index.jsx`];return i.find(n=>t.has(w(n)))}var K=class{build(e,t){let r=new k,o=new Map;for(let n of t)for(let p of n.symbols)r.addSymbol(p),p.type==="file"&&o.set(w(n.filePath),p);let i=new Set(o.keys());for(let n of t){let p=w(n.filePath),d=o.get(p);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 l=V(p,c.source,i);if(!l)continue;let m=o.get(l);m&&r.addEdge(this.edge(e,d.id,"IMPORTS",m.id,{source:c.source}))}for(let c of n.heritage){let l=r.findByName(e,c.targetName).filter(m=>m.type==="class"||m.type==="interface");for(let m of l)r.addEdge(this.edge(e,c.fromId,c.type,m.id))}for(let c of n.calls){if(!c.callerId)continue;let l=this.resolveCallTargets(e,n,c.calleeName,c.qualifier,t,r,i);for(let m of l)m.id!==c.callerId&&r.addEdge(this.edge(e,c.callerId,"CALLS",m.id,{line:c.line,qualifier:c.qualifier}))}}}return r}resolveCallTargets(e,t,r,o,i,n,p){let d=w(t.filePath),c=n.findByName(e,r).filter(l=>w(l.filePath)===d);if(!o&&c.length)return c;if(o)for(let l of t.imports){if(!l.bindings.find(y=>y.kind==="namespace"&&y.localName===o))continue;let b=V(d,l.source,p);if(b)return n.findByName(e,r).filter(y=>w(y.filePath)===b)}for(let l of t.imports){let m=l.bindings.find(v=>v.localName===r);if(!m)continue;let b=V(d,l.source,p);if(!b)continue;let y=m.importedName==="default"?r:m.importedName,j=n.findByName(e,y).filter(v=>w(v.filePath)===b);if(j.length)return j}return n.findByName(e,r).filter(l=>l.type==="function"||l.type==="method")}edge(e,t,r,o,i){return{id:ht(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:i}}};var D=class{constructor(e){this.storage=e}storage;async index(e,t){let r=new $(this.storage),o=new N(this.storage),i=await r.load(e),n=await o.load(e),p=await oe(e,t),d=ne(i,p),c=[...d.added,...d.modified];if(i&&n&&c.length===0&&d.deleted.length===0)return{firstRun:!1,scanned:Object.keys(p.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 l=n?.symbols.filter(f=>d.unchanged.includes(f.filePath))??[],m=[];for(let f of c)m.push(await ae(e,t,f));let b=new K().build(e,m),y=new k;for(let f of l)y.addSymbol(f);for(let f of b.allSymbols(e))y.addSymbol(f);let j=new Set(y.allSymbols(e).map(f=>f.id));for(let f of n?.edges??[])j.has(f.from)&&j.has(f.to)&&!c.includes(n.symbols.find(a=>a.id===f.from)?.filePath??"")&&!c.includes(n.symbols.find(a=>a.id===f.to)?.filePath??"")&&y.addEdge(f);for(let f of b.allEdges(e))y.addEdge(f);let v={version:1,projectId:e,updatedAt:new Date().toISOString(),files:Object.keys(p.files).length,symbols:y.allSymbols(e),edges:y.allEdges(e)};return await o.save(v),await r.save(p),{firstRun:i===null,scanned:Object.keys(p.files).length,parsed:c.length,added:d.added.length,modified:d.modified.length,deleted:d.deleted.length,unchanged:d.unchanged.length,symbols:v.symbols.length,edges:v.edges.length,saved:!0}}};async function St(){let s=G(),e=new I().detect(),t=q({provider:s.storage.provider,huggingface:s.storage.huggingface,localRoot:s.storage.localRoot}),r=new _(t,e.id,e.name,e.remote??e.name),o=await new D(r).index(e.id,e.rootPath);console.log({ok:!0,storage:r.name,...o})}St().catch(s=>{console.error(s),process.exit(1)});
1
+ import"dotenv/config";import{existsSync as Ze,readFileSync as Qe}from"node:fs";import{homedir as Xe}from"node:os";import{join as et}from"node:path";function tt(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 rt(){let n=process.env.TOOLNET_GLOBAL_ENV??et(Xe(),".config","toolnet-memory",".env");if(!Ze(n))return;let e=Qe(n,"utf8");for(let t of e.split(/\r?\n/)){let r=t.trim();if(!r||r.startsWith("#"))continue;r.startsWith("export ")&&(r=r.slice(7));let o=r.indexOf("=");if(o<=0)continue;let s=r.slice(0,o).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(s)&&process.env[s]===void 0&&(process.env[s]=tt(r.slice(o+1)))}}rt();function I(n,e){return n===void 0?e:["1","true","yes","on"].includes(n.toLowerCase())}function T(n,e){if(!n)return e;let t=Number(n);return Number.isFinite(t)?t:e}function pe(){return{memory:{autoCapture:I(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:I(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:I(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:I(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:T(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:T(process.env.MEMORY_RERANK_TOP,10),finalContext:T(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:T(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",r2:{accountId:process.env.R2_ACCOUNT_ID,bucket:process.env.R2_BUCKET,accessKeyId:process.env.R2_ACCESS_KEY_ID,secretAccessKey:process.env.R2_SECRET_ACCESS_KEY},s3:{endpoint:process.env.S3_ENDPOINT,region:process.env.S3_REGION,bucket:process.env.S3_BUCKET,accessKeyId:process.env.S3_ACCESS_KEY_ID,secretAccessKey:process.env.S3_SECRET_ACCESS_KEY,forcePathStyle:I(process.env.S3_FORCE_PATH_STYLE,!1)},huggingface:{namespace:process.env.HF_NAMESPACE,bucket:process.env.HF_BUCKET,accessKeyId:process.env.HF_S3_ACCESS_KEY_ID,secretAccessKey:process.env.HF_S3_SECRET_ACCESS_KEY},localRoot:process.env.MEMORY_LOCAL_STORAGE_PATH},cache:{maxMb:T(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as dt}from"node:crypto";import{existsSync as B,mkdirSync as lt,readFileSync as ut,renameSync as pt,writeFileSync as mt}from"node:fs";import{basename as ft,dirname as G,join as _,parse as xe,resolve as j}from"node:path";import{createHash as ge}from"node:crypto";import{spawnSync as nt}from"node:child_process";var O="git-remote-v1",ot=new Set(["github.com","gitlab.com","bitbucket.org"]);function ye(n,e){let t=e.replaceAll("\\","/").replace(/^\/+/u,"").replace(/\/+$/u,"").replace(/\.git$/iu,"").replace(/\/+/gu,"/");return!t||t==="."||t===".."||t.split("/").some(r=>!r||r==="."||r==="..")?null:(ot.has(n)&&(t=t.toLowerCase()),t)}function st(n){let e;try{e=new URL(n)}catch{return null}if(!["https:","http:","ssh:","git:"].includes(e.protocol))return null;let t=e.hostname.trim().toLowerCase();if(!t)return null;let r=e.protocol==="https:"&&e.port==="443"||e.protocol==="http:"&&e.port==="80"||e.protocol==="ssh:"&&e.port==="22",o=e.port&&!r?`${t}:${e.port}`:t,s=ye(t,e.pathname);return s?`${o}/${s}`:null}function it(n){let e=n.match(/^(?:[^@\s/:]+@)?([^:/\s]+):(.+)$/u);if(!e)return null;let t=e[1]?.trim().toLowerCase();if(!t||t.length===1)return null;let r=ye(t,e[2]??"");return r?`${t}/${r}`:null}function me(n){let e=n.trim();return e?e.includes("://")?st(e):it(e):null}function at(n){return ge("sha256").update(`${O}:${n}`).digest("hex")}function he(n){return ge("sha256").update(`toolnet-project:${O}:${n}`).digest("hex").slice(0,16)}function ct(n){return n.split("/").filter(Boolean).at(-1)?.trim()||null}function te(n,e){let t=nt("git",["-C",n,...e],{encoding:"utf8",windowsHide:!0,stdio:["ignore","pipe","ignore"]});return t.error||t.status!==0?null:t.stdout?.trim()||null}function fe(n,e){let t=ct(n);return t?{scheme:O,canonicalRemote:n,fingerprint:at(n),repositoryName:t,source:e}:null}function Se(n){let e=te(n,["remote","get-url","origin"]);if(e){let o=me(e);if(o)return fe(o,"origin")}let t=te(n,["remote"]);if(!t)return null;let r=new Set;for(let o of t.split(/\r?\n/u).map(s=>s.trim()).filter(Boolean)){let s=te(n,["remote","get-url",o]);if(!s)continue;let a=me(s);a&&r.add(a)}return r.size!==1?null:fe([...r][0],"unique-remote")}var ve=".toolnet",gt="project.json";function yt(n){return dt("sha256").update(n).digest("hex").slice(0,16)}function E(n){return _(n,ve,gt)}function we(n){return B(E(n))}function be(n,e){let t=j(n),r=xe(t).root;for(;;){if(we(t))return t;if(t===r||e&&t===j(e))break;let o=G(t);if(o===t)break;t=o}return null}function re(n){let e=j(n),t=xe(e).root,r=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(r.some(s=>B(_(e,s))))return e;if(e===t)break;let o=G(e);if(o===e)break;e=o}return j(n)}function L(n){let e;try{e=JSON.parse(ut(n,"utf8"))}catch(o){throw new Error(`Invalid ToolNet project manifest: ${n}: ${o instanceof Error?o.message:String(o)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${n}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${n}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${n}`);let r=new Date().toISOString();return{version:1,id:t.id,name:t.name,remote:typeof t.remote=="string"&&t.remote.trim()?t.remote:t.name,rootPath:typeof t.rootPath=="string"?t.rootPath:G(G(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 z(n,e){let t=_(n,ve);lt(t,{recursive:!0});let r=E(n),o=`${r}.tmp-${process.pid}`;mt(o,JSON.stringify(e,null,2)+`
3
+ `,{encoding:"utf8",mode:384}),pt(o,r)}function P(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}}function ne(n){return{version:1,scheme:O,canonicalRemote:n.canonicalRemote,fingerprint:n.fingerprint,repositoryName:n.repositoryName}}function ht(n){let e=n.metadata?.toolnetIdentity;if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e;return typeof t.fingerprint=="string"?t.fingerprint:null}var V=class{adopt(e,t){let r=re(j(e));if(!t.id.trim())throw new Error("PROJECT_ADOPTION_INVALID_ID");if(!t.name.trim())throw new Error("PROJECT_ADOPTION_INVALID_NAME");if(!t.remote.trim())throw new Error("PROJECT_ADOPTION_INVALID_REMOTE");if(we(r)){let i=L(E(r));if(i.id!==t.id)throw new Error(["PROJECT_IDENTITY_ALREADY_EXISTS",`existing=${i.id}`,`requested=${t.id}`].join(" "));return P(i,r)}let o=new Date().toISOString(),s={...t.metadata};t.gitIdentity&&(s.toolnetIdentity=ne(t.gitIdentity));let a={version:1,id:t.id.trim(),name:t.name.trim(),remote:t.remote.trim(),rootPath:r,createdAt:t.createdAt??o,updatedAt:o,graphVersion:t.graphVersion??0,memoryVersion:t.memoryVersion??0,metadata:Object.keys(s).length?s:void 0};return z(r,a),P(a,r)}recordGitIdentity(e,t,r={}){let o=this.requireExisting(e),s=E(o.rootPath),a=L(s),i=ht(a);if(i&&i!==t.fingerprint&&!r.allowRebind)throw new Error(["PROJECT_GIT_REMOTE_CHANGED",`existing=${i}`,`current=${t.fingerprint}`,"Use explicit rebind only when this repository identity change is intentional."].join(" "));let d=a.metadata?.toolnetIdentity;return d&&typeof d=="object"&&!Array.isArray(d)&&d.fingerprint===t.fingerprint||(a.metadata={...a.metadata,toolnetIdentity:ne(t)},a.updatedAt=new Date().toISOString(),z(o.rootPath,a)),P(a,o.rootPath)}findExisting(e=process.cwd()){let t=j(e),r=re(t),s=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(d=>B(_(r,d))),a=be(t,s?r:void 0);if(!a)return null;let i=L(E(a));return P(i,a)}requireExisting(e=process.cwd()){let t=this.findExisting(e);if(!t)throw new Error("PROJECT_NOT_INITIALIZED");return t}detect(e=process.cwd()){let t=j(e),r=re(t),s=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(l=>B(_(r,l))),a=be(t,s?r:void 0);if(a){let l=E(a),m=L(l);return m.rootPath!==a&&(m.rootPath=a,m.updatedAt=new Date().toISOString(),z(a,m)),P(m,a)}let i=new Date().toISOString(),d=ft(r),c=Se(r),u={version:1,id:c?he(c.canonicalRemote):yt(r),name:d,remote:c?.repositoryName??d,rootPath:r,createdAt:i,updatedAt:i,graphVersion:0,memoryVersion:0,metadata:c?{toolnetIdentity:ne(c)}:void 0};return z(r,u),P(u,r)}};var St=[{type:"openai_key",regex:/\bsk-[A-Za-z0-9_-]{20,}\b/g,confidence:"exact"},{type:"huggingface_token",regex:/\bhf_[A-Za-z0-9]{20,}\b/g,confidence:"exact"},{type:"hf_s3_access_key",regex:/\bHFAK[A-Za-z0-9]{8,}\b/g,confidence:"exact"},{type:"aws_access_key",regex:/\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/g,confidence:"exact"},{type:"github_token",regex:/\b(?:gh[pousr]_[A-Za-z0-9]{30,255}|github_pat_[A-Za-z0-9_]{40,255})\b/g,confidence:"exact"},{type:"stripe_secret_key",regex:/\b(?:sk|rk)_(?:live|test)_[A-Za-z0-9]{16,}\b/g,confidence:"exact"},{type:"google_api_key",regex:/\bAIza[A-Za-z0-9_-]{30,}\b/g,confidence:"exact"},{type:"slack_token",regex:/\bxox[baprs]-[A-Za-z0-9-]{16,}\b/g,confidence:"exact"},{type:"npm_token",regex:/\bnpm_[A-Za-z0-9]{20,}\b/g,confidence:"exact"},{type:"bearer_token",regex:/\bBearer\s+[A-Za-z0-9._~+/=-]{16,}\b/gi,confidence:"high"},{type:"jwt",regex:/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g,confidence:"exact"},{type:"private_key",regex:/-----BEGIN (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----[\s\S]*?-----END (?:RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----/g,confidence:"exact"},{type:"password_assignment",regex:/\b(?:password|passwd|pwd)\s*[:=]\s*["']?[^"' \t\r\n]{6,}["']?/gi,confidence:"high"},{type:"secret_assignment",regex:/\b(?:secret|api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key)\s*[:=]\s*["']?[^"' \t\r\n]{8,}["']?/gi,confidence:"high"},{type:"cookie",regex:/\b(?:cookie|set-cookie)\s*[:=]\s*[^;\n]{8,}/gi,confidence:"high"},{type:"url_credentials",regex:/\bhttps?:\/\/[^:/@\s]+:[^/@\s]{4,}@[^/\s]+/gi,confidence:"high"}],bt=new Set(["example","example-key","example-token","changeme","change-me","password","secret","your-api-key","your-token","<token>","<secret>","<password>","[redacted]"]);function ke(n){return n.normalize("NFKC").trim().toLowerCase()}function xt(n){if(n.length===0)return 0;let e=new Map;for(let r of n)e.set(r,(e.get(r)??0)+1);let t=0;for(let r of e.values()){let o=r/n.length;t-=o*Math.log2(o)}return t}function vt(n){return/^[a-f0-9]{32}$/iu.test(n)||/^[a-f0-9]{40}$/iu.test(n)||/^[a-f0-9]{64}$/iu.test(n)}function wt(n,e,t){let r=n.slice(Math.max(0,e-48),e),o=n.slice(t,Math.min(n.length,t+16));return/\b(?:token|secret|key|credential|authorization|password|passwd|apikey|api_key|access[_-]?key)\b/iu.test(`${r} ${o}`)}function kt(n,e){return n.start<e.end&&e.start<n.end}function Re(n){return n.sort((e,t)=>e.start!==t.start?e.start-t.start:t.end-t.start-(e.end-e.start))}var H=class{allowValues=new Set;enableEntropyHeuristic;constructor(e={}){for(let t of e.allowValues??[]){let r=ke(t);r&&this.allowValues.add(r)}this.enableEntropyHeuristic=e.enableEntropyHeuristic??!0}scan(e){let t=[];for(let s of St){let a=new RegExp(s.regex.source,s.regex.flags);for(let i of e.matchAll(a))i.index===void 0||!i[0]||this.allowed(i[0])||t.push({type:s.type,value:i[0],start:i.index,end:i.index+i[0].length,confidence:s.confidence})}this.enableEntropyHeuristic&&t.push(...this.entropyMatches(e));let r=Re(t),o=[];for(let s of r)o.some(a=>kt(a,s))||o.push(s);return Re(o)}hasSecrets(e){return this.scan(e).length>0}allowed(e){let t=ke(e);return bt.has(t)?!0:this.allowValues.has(t)}entropyMatches(e){let t=[],r=/[A-Za-z0-9_+/=-]{32,160}/g;for(let o of e.matchAll(r)){if(o.index===void 0||!o[0])continue;let s=o[0];this.allowed(s)||vt(s)||!/[A-Za-z]/u.test(s)||!/[0-9]/u.test(s)||wt(e,o.index,o.index+s.length)&&(xt(s)<3.7||t.push({type:"high_entropy_secret",value:s,start:o.index,end:o.index+s.length,confidence:"heuristic"}))}return t}};var U=class{scanner;constructor(e={}){this.scanner=new H(e)}sanitize(e){let t=this.scanner.scan(e);if(t.length===0)return{text:e,redacted:0,secretTypes:[]};let r=e,o=[...t].sort((a,i)=>i.start-a.start),s=new Set;for(let a of o)s.add(a.type),r=r.slice(0,a.start)+`[REDACTED:${a.type}]`+r.slice(a.end);return{text:r,redacted:t.length,secretTypes:[...s].sort()}}sanitizeValue(e){if(typeof e=="string")return this.sanitize(e).text;if(Array.isArray(e))return e.map(t=>this.sanitizeValue(t));if(e&&typeof e=="object"){let t={};for(let[r,o]of Object.entries(e)){let s=r.normalize("NFKC").toLowerCase().replace(/[^a-z0-9]+/g,"");if(s.includes("password")||s.includes("passwd")||s==="pwd"||s.includes("secret")||s.includes("token")||s.includes("cookie")||s.includes("authorization")||s.includes("apikey")||s.includes("accesskey")||s.includes("privatekey")||s.includes("clientsecret")||s.includes("credential")){t[r]="[REDACTED]";continue}t[r]=this.sanitizeValue(o)}return t}return e}};var pn=new U;import{homedir as Ut}from"node:os";import{join as Wt}from"node:path";import{DeleteObjectCommand as Rt,GetObjectCommand as Ct,HeadObjectCommand as Mt,ListObjectsV2Command as Pt,PutObjectCommand as jt,S3Client as Et}from"@aws-sdk/client-s3";import{getSignedUrl as At}from"@aws-sdk/s3-request-presigner";var W=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Et({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 jt({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await At(this.client,new Ct({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 Mt({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 Rt({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Pt({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let s of o.Contents??[])s.Key&&t.push({key:s.Key,size:s.Size,updatedAt:s.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};import{access as Ce,mkdir as It,readFile as Tt,readdir as Ot,rm as _t,stat as Me,writeFile as Nt}from"node:fs/promises";import{dirname as $t,join as Dt,relative as Pe,resolve as Ft}from"node:path";var N=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Ft(this.root,t)}async put(e,t){let r=this.path(e);await It($t(r),{recursive:!0}),await Nt(r,t)}async get(e){try{return await Tt(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 Ce(this.path(e)),!0}catch{return!1}}async delete(e){await _t(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),r=[];try{await Ce(t)}catch{return r}let o=async a=>{let i=await Ot(a,{withFileTypes:!0});for(let d of i){let c=Dt(a,d.name);if(d.isDirectory()){await o(c);continue}let u=await Me(c);r.push({key:Pe(this.root,c),size:u.size,updatedAt:u.mtime.toISOString()})}},s=await Me(t);return s.isDirectory()?await o(t):r.push({key:Pe(this.root,t),size:s.size,updatedAt:s.mtime.toISOString()}),r}};import{DeleteObjectCommand as Kt,GetObjectCommand as Lt,HeadObjectCommand as zt,ListObjectsV2Command as Bt,PutObjectCommand as Gt,S3Client as Vt}from"@aws-sdk/client-s3";import{getSignedUrl as Ht}from"@aws-sdk/s3-request-presigner";var $=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new Vt({region:e.region??"us-east-1",endpoint:e.endpoint||void 0,forcePathStyle:e.forcePathStyle??!1,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}})}async put(e,t,r="application/octet-stream"){let o=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new Gt({Bucket:this.bucket,Key:e,Body:o,ContentType:r}))}async get(e){let t=await Ht(this.client,new Lt({Bucket:this.bucket,Key:e}),{expiresIn:60}),r=await fetch(t,{redirect:"follow"});if(r.status===404)return null;if(!r.ok)throw new Error(`${this.name} download failed: ${r.status} ${r.statusText}`);return new Uint8Array(await r.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new zt({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 Kt({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],r;do{let o=await this.client.send(new Bt({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:r}));for(let s of o.Contents??[])s.Key&&t.push({key:s.Key,size:s.Size,updatedAt:s.LastModified?.toISOString()});r=o.IsTruncated?o.NextContinuationToken:void 0}while(r);return t}};function oe(n,e){return console.warn(e),new N(n)}function je(n){let e=n.localRoot??Wt(Ut(),".toolnet-memory","storage");if(n.provider==="r2"){let t=n.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new $({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):oe(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(n.provider==="s3"){let t=n.s3;return t?.bucket&&t.accessKeyId&&t.secretAccessKey?new $({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):oe(e,"[storage] S3 credentials missing. Using local fallback.")}if(n.provider==="huggingface"){let t=n.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new W({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):oe(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new N(e)}var Y=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 J=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 Ee(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 Ae(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 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 q=class{constructor(e,t,r,o){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=r,this.folder=Ee(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 a;try{a=JSON.parse(o)}catch(i){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${i instanceof Error?i.message:String(i)}`)}if(typeof a.id=="string"&&a.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${a.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof a.createdAt=="string"&&(r=a.createdAt)}let s={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:r,updatedAt:t};await this.provider.put(e,JSON.stringify(s,null,2)+`
4
+ `,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=Ae(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{createHash as Yt}from"node:crypto";import{dirname as Jt,extname as qt,normalize as Zt,posix as Qt}from"node:path";var Z=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 Xt(n,e,t,r){return Yt("sha256").update(`${n}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function C(n){return Zt(n).replaceAll("\\","/")}function er(n,e,t){if(!e.startsWith("."))return;let r=C(Qt.join(Jt(n),e)),o=qt(r),s;if(o===".js"){let a=r.slice(0,-3);s=[`${a}.ts`,`${a}.tsx`,`${a}.js`,`${a}.jsx`]}else if(o===".mjs"){let a=r.slice(0,-4);s=[`${a}.mts`,`${a}.ts`,`${a}.mjs`]}else if(o===".cjs"){let a=r.slice(0,-4);s=[`${a}.cts`,`${a}.ts`,`${a}.cjs`]}else o?s=[r]:s=[`${r}.ts`,`${r}.tsx`,`${r}.mts`,`${r}.cts`,`${r}.js`,`${r}.jsx`,`${r}.mjs`,`${r}.cjs`,`${r}/index.ts`,`${r}/index.tsx`,`${r}/index.mts`,`${r}/index.cts`,`${r}/index.js`,`${r}/index.jsx`,`${r}/index.mjs`,`${r}/index.cjs`];return s.find(a=>t.has(C(a)))}function se(n,e,t,r){let o=r?.(n,e,t);if(o){let s=C(o);if(t.has(s))return s}return er(n,e,t)}var D=class{build(e,t,r={}){let o=new Z;for(let i of r.seedSymbols??[])o.addSymbol(i);for(let i of t)for(let d of i.symbols)o.addSymbol(d);let s=new Map;for(let i of o.allSymbols(e))i.type==="file"&&s.set(C(i.filePath),i);let a=new Set(s.keys());for(let i of t){let d=C(i.filePath),c=s.get(d);if(c){for(let u of i.symbols)u.id!==c.id&&o.addEdge(this.edge(e,c.id,"DEFINES",u.id));for(let u of i.imports){let l=se(d,u.source,a,r.resolveModule);if(!l)continue;let m=s.get(l);m&&o.addEdge(this.edge(e,c.id,"IMPORTS",m.id,{source:u.source,resolvedFile:l}))}for(let u of i.heritage){let l=o.findByName(e,u.targetName).filter(m=>m.type==="class"||m.type==="interface");for(let m of l)o.addEdge(this.edge(e,u.fromId,u.type,m.id))}for(let u of i.calls){if(!u.callerId)continue;let l=this.resolveCallTargets(e,i,u.calleeName,u.qualifier,o,a,r.resolveModule);for(let m of l)m.id!==u.callerId&&o.addEdge(this.edge(e,u.callerId,"CALLS",m.id,{line:u.line,qualifier:u.qualifier}))}}}return o}resolveCallTargets(e,t,r,o,s,a,i){let d=C(t.filePath),c=s.findByName(e,r).filter(u=>C(u.filePath)===d);if(!o&&c.length)return c;if(o)for(let u of t.imports){if(!u.bindings.find(g=>g.kind==="namespace"&&g.localName===o))continue;let m=se(d,u.source,a,i);if(m)return s.findByName(e,r).filter(g=>C(g.filePath)===m)}for(let u of t.imports){let l=u.bindings.find(v=>v.localName===r);if(!l)continue;let m=se(d,u.source,a,i);if(!m)continue;let g=l.importedName==="default"?r:l.importedName,w=s.findByName(e,g).filter(v=>C(v.filePath)===m);if(w.length)return w}return s.findByName(e,r).filter(u=>u.type==="function"||u.type==="method")}edge(e,t,r,o,s){return{id:Xt(e,t,r,o),projectId:e,from:t,to:o,type:r,metadata:s}}};import{createHash as tr}from"node:crypto";function ie(n){return n.replaceAll("\\","/")}function rr(n,e,t,r){return tr("sha256").update(`${n}:${e}:${t}:${r}`).digest("hex").slice(0,24)}function nr(n){return[ie(n.filePath),n.type,n.qualifiedName??n.name].join("\0")}function Ie(n){let e=new Map;for(let r of n){let o=nr(r),s=e.get(o)??[];s.push(r),e.set(o,s)}let t=new Map;for(let[r,o]of e)o.length===1&&t.set(r,o[0]);return t}function or(n,e){let t=Ie(n),r=Ie(e),o=new Map;for(let[s,a]of t){let i=r.get(s);i&&o.set(a.id,i.id)}return o}function Te(n){let e=new Map(n.previousSymbols.map(s=>[s.id,s])),t=new Set(n.currentSymbols.map(s=>s.id)),r=or(n.previousSymbols,n.currentSymbols),o=[];for(let s of n.previousEdges){let a=e.get(s.from),i=e.get(s.to);if(!a||!i)continue;let d=ie(a.filePath),c=ie(i.filePath);if(n.rebuiltSourceFiles.has(d)||n.removedFiles.has(d)||n.removedFiles.has(c))continue;let u=t.has(s.from)?s.from:r.get(s.from),l=t.has(s.to)?s.to:r.get(s.to);!u||!l||!t.has(u)||!t.has(l)||o.push({...s,id:rr(n.projectId,u,s.type,l),from:u,to:l})}return o}import{readFile as sr}from"node:fs/promises";import{join as ir}from"node:path";import{createHash as ar}from"node:crypto";import*as f from"typescript";function Oe(n,e){return ar("sha256").update(`${n}:${e}`).digest("hex").slice(0,24)}function ae(n,e){return n.getLineAndCharacterOfPosition(e.getStart(n)).line+1}async function _e(n,e,t){let r=ir(e,t),o=await sr(r,"utf8"),s=f.createSourceFile(t,o,f.ScriptTarget.Latest,!0,t.endsWith(".tsx")||t.endsWith(".jsx")?f.ScriptKind.TSX:f.ScriptKind.TS),a=[],i=[],d=[],c=[],u={id:Oe(n,`file:${t}`),projectId:n,name:t,qualifiedName:t,type:"file",filePath:t,startLine:1,endLine:s.getLineAndCharacterOfPosition(s.end).line+1};a.push(u);let l=[],m=[];function g(p,x,S,y){let h=Oe(n,`${t}:${S}:${y??x}:${p.pos}`);return a.push({id:h,projectId:n,name:x,qualifiedName:y??x,type:S,filePath:t,startLine:ae(s,p),endLine:s.getLineAndCharacterOfPosition(p.end).line+1}),h}function w(p){if(!f.isStringLiteral(p.moduleSpecifier))return;let x=[],S=p.importClause;if(S?.name&&x.push({localName:S.name.text,importedName:"default",kind:"default"}),S?.namedBindings&&f.isNamedImports(S.namedBindings))for(let y of S.namedBindings.elements)x.push({localName:y.name.text,importedName:y.propertyName?.text??y.name.text,kind:"named"});S?.namedBindings&&f.isNamespaceImport(S.namedBindings)&&x.push({localName:S.namedBindings.name.text,importedName:"*",kind:"namespace"}),i.push({source:p.moduleSpecifier.text,bindings:x})}function v(p,x){for(let S of p.heritageClauses??[])for(let y of S.types){let h=y.expression.getText(s).split(".").at(-1)??"";h&&c.push({fromId:x,targetName:h,type:S.token===f.SyntaxKind.ExtendsKeyword?"INHERITS":"IMPLEMENTS"})}}function k(p){let x=!1,S=!1;if(f.isImportDeclaration(p)&&w(p),f.isInterfaceDeclaration(p)&&g(p,p.name.text,"interface",p.name.text),f.isClassDeclaration(p)&&p.name){let y=g(p,p.name.text,"class",p.name.text);v(p,y),m.push({id:y,name:p.name.text}),S=!0}if(f.isFunctionDeclaration(p)&&p.name){let y=g(p,p.name.text,"function",p.name.text);l.push(y),x=!0}if(f.isMethodDeclaration(p)&&p.name){let y=p.name.getText(s),h=m.at(-1)?.name,R=g(p,y,"method",h?`${h}.${y}`:y);l.push(R),x=!0}if(f.isCallExpression(p)&&(f.isIdentifier(p.expression)&&d.push({callerId:l.at(-1),calleeName:p.expression.text,line:ae(s,p)}),f.isPropertyAccessExpression(p.expression))){let y=p.expression;d.push({callerId:l.at(-1),qualifier:y.expression.getText(s),calleeName:y.name.text,line:ae(s,p)})}f.forEachChild(p,k),x&&l.pop(),S&&m.pop()}return k(s),{filePath:t,symbols:a,imports:i,calls:d,heritage:c}}import{existsSync as cr,readFileSync as dr,readdirSync as lr,realpathSync as ur}from"node:fs";import{dirname as le,extname as pr,join as ce,parse as mr,relative as de,resolve as F}from"node:path";import*as b from"typescript";var fr="tsconfig.json",gr=new Set(["node_modules",".git",".toolnet","dist","build","out","coverage",".next",".nuxt",".cache",".turbo","target","vendor"]),Ne=[".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"];function K(n){return n.replaceAll("\\","/").replace(/^\.\/+/u,"")}function Fe(n,e){let t=K(de(n,e));return t!==".."&&!t.startsWith("../")&&!t.startsWith("/")}function $e(n){try{return ur.native(n)}catch{return F(n)}}function yr(n,e){let t=F(e),r=F(n);for(;;){let o=ce(r,fr);if(cr(o))return o;if(r===t)return;let s=mr(r).root;if(r===s)return;let a=le(r);if(a===r||!Fe(t,a)&&a!==t)return;r=a}}function hr(n){let e=b.readConfigFile(n,b.sys.readFile);if(e.error)throw new Error(b.flattenDiagnosticMessageText(e.error.messageText,`
5
+ `));return b.parseJsonConfigFileContent(e.config,b.sys,le(n))}function Sr(){return{allowJs:!0,checkJs:!1,noEmit:!0,skipLibCheck:!0,target:b.ScriptTarget.ES2022,module:b.ModuleKind.NodeNext,moduleResolution:b.ModuleResolutionKind.NodeNext,resolveJsonModule:!0}}function br(n){let e=K(n),t=pr(e);if(t){let o=[e];if(t===".js"){let s=e.slice(0,-3);o.push(`${s}.ts`,`${s}.tsx`)}if(t===".mjs"){let s=e.slice(0,-4);o.push(`${s}.mts`,`${s}.ts`)}if(t===".cjs"){let s=e.slice(0,-4);o.push(`${s}.cts`,`${s}.ts`)}return e.endsWith(".d.ts")&&o.push(e.slice(0,-5)+".ts"),o}let r=[e];for(let o of Ne)r.push(`${e}${o}`);for(let o of Ne)r.push(`${e}/index${o}`);return r}function De(n,e){for(let t of br(n)){let r=K(t);if(e.has(r))return r}}function Ke(n,e){if(typeof n=="string"){e.push(n);return}if(!(!n||typeof n!="object"||Array.isArray(n)))for(let t of Object.values(n))Ke(t,e)}function xr(n){let e=[];for(let t of["source","types","module","main"]){let r=n[t];typeof r=="string"&&e.push(r)}return Ke(n.exports,e),[...new Set(e)]}function vr(n){let t=[F(n)],r=[];for(;t.length>0;){let o=t.pop(),s;try{s=lr(o,{withFileTypes:!0})}catch{continue}if(s.find(i=>i.isFile()&&i.name==="package.json"))try{let i=JSON.parse(dr(ce(o,"package.json"),"utf8"));typeof i.name=="string"&&i.name.trim()&&r.push({name:i.name.trim(),directory:o,entries:xr(i)})}catch{}for(let i of s)i.isDirectory()&&(gr.has(i.name)||t.push(ce(o,i.name)))}return r.sort((o,s)=>s.name.length-o.name.length)}var Q=class{rootPath;configCache=new Map;workspacePackages;constructor(e){this.rootPath=$e(e)}resolve(e,t,r){let o=F(this.rootPath,e),s=yr(le(o),this.rootPath),a=s?this.config(s).options:Sr(),i=b.resolveModuleName(t,o,a,b.sys).resolvedModule;if(i){let d=this.matchResolvedFile(i.resolvedFileName,r);if(d)return d}return this.resolveWorkspacePackage(t,r)}config(e){let t=this.configCache.get(e);if(t)return t;let r=hr(e);return this.configCache.set(e,r),r}matchResolvedFile(e,t){let r=$e(e);if(!Fe(this.rootPath,r))return;let o=K(de(this.rootPath,r));return De(o,t)}packages(){return this.workspacePackages?this.workspacePackages:(this.workspacePackages=vr(this.rootPath),this.workspacePackages)}resolveWorkspacePackage(e,t){let r=this.packages().find(i=>e===i.name||e.startsWith(`${i.name}/`));if(!r)return;let o=K(de(this.rootPath,r.directory)),s=e===r.name?"":e.slice(r.name.length+1),a=[];if(s)a.push(`${o}/${s}`,`${o}/src/${s}`);else{for(let i of r.entries)a.push(`${o}/${i.replace(/^\.\//u,"")}`);a.push(`${o}/src/index`,`${o}/index`)}for(let i of a){let d=De(i,t);if(d)return d}}};function wr(n){let e=n??4;if(!Number.isSafeInteger(e)||e<1||e>64)throw new Error("concurrency must be an integer between 1 and 64");return e}function kr(n){if(n?.aborted)throw new Error("Operation aborted")}async function X(n,e,t={}){if(n.length===0)return[];let r=Math.min(wr(t.concurrency),n.length),o=new Array(n.length),s=0,a=0,i=async()=>{for(;;){kr(t.signal);let c=s;if(s+=1,c>=n.length)return;o[c]=await e(n[c],c),a+=1,t.onProgress?.({completed:a,total:n.length,index:c})}},d=Array.from({length:r},()=>i());return await Promise.all(d),o}import{join as Br}from"node:path";import{lstat as Pr,readdir as jr}from"node:fs/promises";import{extname as Er,join as Ar,relative as Ir,resolve as Tr}from"node:path";import{basename as Rr}from"node:path";var Cr=new Set([".env",".env.local",".env.production",".env.development","id_rsa","id_ed25519","credentials","credentials.json","service-account.json"]),Mr=new Set([".pem",".key",".p12",".pfx"]);function Le(n){let e=Rr(n).toLowerCase();if(Cr.has(e))return!0;for(let t of Mr)if(e.endsWith(t))return!0;return!1}var Or=2*1024*1024,_r=new Set([".ts",".tsx",".js",".jsx",".mjs",".cjs",".mts",".cts"]),Nr=new Set(["node_modules",".git",".toolnet",".toolnet-memory","dist","build","out","coverage",".next",".nuxt",".cache",".parcel-cache",".turbo","vendor","target"]);function ze(n,e){if(!Number.isSafeInteger(n)||n<1)throw new Error(`${e} must be a positive integer`);return n}function Be(n){if(n?.aborted)throw new Error("Repository scan aborted")}function $r(n){let e=n.trim().toLowerCase();if(!e)throw new Error("Repository scan extension cannot be empty");return e.startsWith(".")?e:`.${e}`}function Dr(n){let e=n.toLowerCase();return/\.min\.(?:js|mjs|cjs)$/u.test(e)||/\.bundle\.(?:js|mjs|cjs)$/u.test(e)}function Fr(n){return n.replaceAll("\\","/")}async function Kr(n,e={}){let t=Tr(n),r=e.maxFileBytes??Or;if(!Number.isSafeInteger(r)||r<1)throw new Error("maxFileBytes must be a positive integer");let o=e.maxFiles??Number.MAX_SAFE_INTEGER;ze(o,"maxFiles");let s=e.progressInterval??1e3;ze(s,"progressInterval");let a=new Set(e.extensions?[...e.extensions].map($r):_r),i=new Set(Nr);for(let l of e.extraIgnoredDirectories??[]){let m=l.trim();m&&i.add(m)}let d=[],c={directories:0,entries:0,accepted:0,skippedIgnoredDirectories:0,skippedSymlinks:0,skippedGenerated:0,skippedSensitive:0,skippedOversized:0,skippedUnreadable:0},u=[t];for(;u.length>0;){Be(e.signal);let l=u.pop(),m;try{m=await jr(l,{withFileTypes:!0})}catch{c.skippedUnreadable+=1;continue}c.directories+=1;for(let g of m){Be(e.signal),c.entries+=1,c.entries%s===0&&e.onProgress?.({directories:c.directories,entries:c.entries,accepted:c.accepted});let w=Ar(l,g.name);if(g.isSymbolicLink()){c.skippedSymlinks+=1;continue}if(g.isDirectory()){if(i.has(g.name)){c.skippedIgnoredDirectories+=1;continue}u.push(w);continue}if(!g.isFile())continue;let v=Er(g.name).toLowerCase();if(!a.has(v))continue;if(Dr(g.name)){c.skippedGenerated+=1;continue}if(Le(w)){c.skippedSensitive+=1;continue}let k;try{k=await Pr(w)}catch{c.skippedUnreadable+=1;continue}if(k.isSymbolicLink()){c.skippedSymlinks+=1;continue}if(k.isFile()){if(k.size>r){c.skippedOversized+=1;continue}if(d.length>=o)throw new Error(`Repository scan file limit exceeded: ${o}`);d.push(Fr(Ir(t,w))),c.accepted+=1}}}return d.sort(),e.onProgress?.({directories:c.directories,entries:c.entries,accepted:c.accepted}),{files:d,stats:c}}async function Ge(n,e={}){return(await Kr(n,e)).files}import{createHash as Lr}from"node:crypto";import{readFile as zr}from"node:fs/promises";async function Ve(n){let e=await zr(n);return Lr("sha256").update(e).digest("hex")}async function He(n,e,t={}){let r={...t.scan};t.signal&&(r.signal=t.signal);let o=await Ge(e,r),s=await X(o,async i=>({path:i,hash:await Ve(Br(e,i))}),{concurrency:t.concurrency??8,signal:t.signal,onProgress:({completed:i,total:d,index:c})=>{t.onProgress?.({completed:i,total:d,file:o[c]})}}),a={};for(let i of s)a[i.path]={path:i.path,hash:i.hash};return{version:1,projectId:n,updatedAt:new Date().toISOString(),files:a}}function Ue(n,e){let t=new Map;for(let r of n){let o=e[r];if(!o)continue;let s=t.get(o.hash)??[];s.push(r),t.set(o.hash,s)}return t}function Gr(n,e,t,r){let o=Ue(e,t),s=Ue(n,r),a=[];for(let[i,d]of o){let c=s.get(i);d.length!==1||!c||c.length!==1||a.push({from:d[0],to:c[0],hash:i})}return a.sort((i,d)=>i.from.localeCompare(d.from))}function We(n,e){let t=n?.files??{},r=e.files,o=[],s=[],a=[],i=[];for(let[l,m]of Object.entries(r)){let g=t[l];if(!g){o.push(l);continue}if(g.hash!==m.hash){s.push(l);continue}i.push(l)}for(let l of Object.keys(t))r[l]||a.push(l);let d=Gr(o,a,t,r),c=new Set(d.map(l=>l.from)),u=new Set(d.map(l=>l.to));return{added:o.filter(l=>!u.has(l)).sort(),modified:s.sort(),deleted:a.filter(l=>!c.has(l)).sort(),unchanged:i.sort(),renamed:d}}function Ye(n){return n.replaceAll("\\","/")}var ee=class{constructor(e){this.storage=e}storage;async index(e,t,r={}){let o=new J(this.storage),s=new Y(this.storage),a=await o.load(e),i=await s.load(e),d=await He(e,t,{concurrency:r.hashConcurrency??8,scan:r.scan,signal:r.signal,onProgress:({completed:h,total:R,file:M})=>{r.onProgress?.({phase:"hash",current:h,total:R,file:M})}}),c=We(a,d),u=c.added.length>0||c.deleted.length>0||c.renamed.length>0,l=i===null||u,m=l?Object.keys(d.files).sort():[...c.modified];if(a&&i&&m.length===0)return{firstRun:!1,scanned:Object.keys(d.files).length,parsed:0,added:0,modified:0,deleted:0,renamed:0,unchanged:c.unchanged.length,symbols:i.symbols.length,edges:i.edges.length,repairedEdges:0,fullRebuild:!1,saved:!1};let g=await X(m,async h=>_e(e,t,h),{concurrency:r.parseConcurrency??4,signal:r.signal,onProgress:({completed:h,total:R,index:M})=>{r.onProgress?.({phase:"parse",current:h,total:R,file:m[M]})}}),w=new Q(t),v,k=0;if(l||!i)v=new D().build(e,g,{resolveModule:(h,R,M)=>w.resolve(h,R,M)});else{let h=new Set(c.modified.map(Ye)),R=i.symbols.filter(A=>!h.has(Ye(A.filePath)));v=new D().build(e,g,{seedSymbols:R,resolveModule:(A,Je,qe)=>w.resolve(A,Je,qe)}),r.onProgress?.({phase:"repair",current:0,total:i.edges.length});let M=Te({projectId:e,previousSymbols:i.symbols,previousEdges:i.edges,currentSymbols:v.allSymbols(e),rebuiltSourceFiles:h,removedFiles:new Set});for(let A of M)v.addEdge(A);k=M.length,r.onProgress?.({phase:"repair",current:i.edges.length,total:i.edges.length})}let p=v.allSymbols(e),x=new Set(p.map(h=>h.id)),S=v.allEdges(e).filter(h=>x.has(h.from)&&x.has(h.to)),y={version:1,projectId:e,updatedAt:new Date().toISOString(),files:Object.keys(d.files).length,symbols:p,edges:S};return r.onProgress?.({phase:"save",current:0,total:2}),await s.save(y),r.onProgress?.({phase:"save",current:1,total:2}),await o.save(d),r.onProgress?.({phase:"save",current:2,total:2}),{firstRun:a===null,scanned:Object.keys(d.files).length,parsed:m.length,added:c.added.length,modified:c.modified.length,deleted:c.deleted.length,renamed:c.renamed.length,unchanged:c.unchanged.length,symbols:y.symbols.length,edges:y.edges.length,repairedEdges:k,fullRebuild:l,saved:!0}}};async function Hr(){let n=pe(),e=new V().detect(),t=je({provider:n.storage.provider,huggingface:n.storage.huggingface,localRoot:n.storage.localRoot}),r=new q(t,e.id,e.name,e.remote??e.name),o=await new ee(r).index(e.id,e.rootPath);console.log({ok:!0,storage:r.name,...o})}Hr().catch(n=>{console.error(n),process.exit(1)});