toolnet-memory 0.3.5 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/toolnet-memory +44 -111
- package/bundle/full-index.js +23 -22
- package/bundle/graph-cli.js +1 -0
- package/bundle/graph-index.js +1 -1
- package/bundle/graph-ui.js +3 -0
- package/bundle/help-cli.js +4 -0
- package/bundle/impact.js +2 -2
- package/bundle/mcp.js +20 -20
- package/bundle/model-cli.js +2 -0
- package/bundle/public/index.html +2987 -0
- package/bundle/public/vendor/3d-force-graph.min.js +5 -0
- package/bundle/runtime.js +6 -6
- package/bundle/semantic.js +6 -6
- package/bundle/shimmer-worker.js +1 -0
- package/bundle/status-cli.js +4 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{parentPort as v,workerData as G}from"worker_threads";import{writeSync as w}from"fs";var O={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},P={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function D(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let e=process.env.TERM_PROGRAM,r=process.env.WT_SESSION,n=process.env.VSCODE_PID,t=process.env.ConEmuPID;return!!(r||n||t||e==="vscode")}return process.env.TERM!=="linux"}function N(){return process.platform==="win32"?!1:D()}var $;function g(){return $||($=N()?O:P),$}function S(e){w(1,e)}var i=g(),d=i.spinner,L=150,T=3,f=G.colors!==!1,s=f?"\x1B[0m":"",l=f?"\x1B[2m":"",E=f?"\x1B[1m":"",W=G.startTime;function _(){return Math.floor((Date.now()-W)/L)}function p(e,r,n){return Math.round(e+(r-e)*n)}function C(e){if(!f)return"";let r=(Math.sin(e*2*Math.PI/13)+1)/2,n=p(160,251,r),t=p(100,191,r),o=p(9,36,r);return`\x1B[38;2;${n};${t};${o}m${E}`}function A(e){return e.toLocaleString()}function F(e,r,n){if(r===0)return`${l}${i.barEmpty.repeat(n)}${s}`;let t=24,o=e%t/t*(r+6)-3,y=3,c="";for(let u=0;u<r;u++){if(!f){c+=i.barFilled;continue}let M=Math.abs(u-o),b=Math.max(0,1-M/y),I=p(160,251,b),x=p(100,191,b),R=p(9,36,b);c+=`\x1B[38;2;${I};${x};${R}m${E}${i.barFilled}`}return c+=`${s}${l}${i.barEmpty.repeat(n)}${s}`,c}var a="",m=-1,h=0;function k(){if(!a)return;let e=_(),r=Math.floor(e/T)%d.length,n=d[r]??d[0]??".",t=C(e),o;if(m>=0){let c=Math.round(25*m/100),u=25-c;o=`${l}${i.rail}${s} ${t}${n}${s} ${a} ${F(e,c,u)} ${m}%`}else h>0?o=`${l}${i.rail}${s} ${t}${n}${s} ${a}... ${A(h)} found`:o=`${l}${i.rail}${s} ${t}${n}${s} ${a}...`;S(`\r\x1B[K${o}`)}function H(){a&&(S("\r\x1B[K"),a="",m=-1,h=0)}var U=setInterval(k,50);v.on("message",e=>{e.type==="update"?(a=e.phaseName??"",m=e.percent??-1,h=e.count??0):e.type==="stop"&&(clearInterval(U),H(),v.postMessage({type:"stopped"}))});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{existsSync as le,readFileSync as ue}from"node:fs";import{homedir as de}from"node:os";import{join as pe}from"node:path";function me(r){let e=r.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 ge(){let r=process.env.TOOLNET_GLOBAL_ENV??pe(de(),".config","toolnet-memory",".env");if(!le(r))return;let e=ue(r,"utf8");for(let t of e.split(/\r?\n/)){let n=t.trim();if(!n||n.startsWith("#"))continue;n.startsWith("export ")&&(n=n.slice(7));let s=n.indexOf("=");if(s<=0)continue;let a=n.slice(0,s).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(a)&&process.env[a]===void 0&&(process.env[a]=me(n.slice(s+1)))}}ge();function h(r,e){return r===void 0?e:["1","true","yes","on"].includes(r.toLowerCase())}function S(r,e){if(!r)return e;let t=Number(r);return Number.isFinite(t)?t:e}function K(){return{memory:{autoCapture:h(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:h(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:h(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:h(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:S(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:S(process.env.MEMORY_RERANK_TOP,10),finalContext:S(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:S(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:h(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:S(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as fe}from"node:crypto";import{existsSync as j,mkdirSync as ye,readFileSync as he,renameSync as Se,writeFileSync as Ae}from"node:fs";import{basename as Ee,dirname as I,join as _,parse as $,resolve as A}from"node:path";var F=".toolnet",be="project.json";function ve(r){return fe("sha256").update(r).digest("hex").slice(0,16)}function T(r){return _(r,F,be)}function Ie(r){return j(T(r))}function ke(r,e){let t=A(r),n=$(t).root;for(;;){if(Ie(t))return t;if(t===n||e&&t===A(e))break;let s=I(t);if(s===t)break;t=s}return null}function _e(r){let e=A(r),t=$(e).root,n=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(n.some(a=>j(_(e,a))))return e;if(e===t)break;let s=I(e);if(s===e)break;e=s}return A(r)}function Oe(r){let e;try{e=JSON.parse(he(r,"utf8"))}catch(s){throw new Error(`Invalid ToolNet project manifest: ${r}: ${s instanceof Error?s.message:String(s)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${r}`);let t=e;if(typeof t.id!="string"||!t.id.trim())throw new Error(`ToolNet project manifest is missing id: ${r}`);if(typeof t.name!="string"||!t.name.trim())throw new Error(`ToolNet project manifest is missing name: ${r}`);let n=new Date().toISOString();return{version:1,id:t.id,name:t.name,remote:typeof t.remote=="string"&&t.remote.trim()?t.remote:t.name,rootPath:typeof t.rootPath=="string"?t.rootPath:I(I(r)),createdAt:typeof t.createdAt=="string"?t.createdAt:n,updatedAt:typeof t.updatedAt=="string"?t.updatedAt:n,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(r,e){let t=_(r,F);ye(t,{recursive:!0});let n=T(r),s=`${n}.tmp-${process.pid}`;Ae(s,JSON.stringify(e,null,2)+`
|
|
3
|
+
`,{encoding:"utf8",mode:384}),Se(s,n)}function B(r,e){return{id:r.id,name:r.name,remote:r.remote,rootPath:e,createdAt:r.createdAt,updatedAt:r.updatedAt,graphVersion:r.graphVersion,memoryVersion:r.memoryVersion,metadata:r.metadata}}var k=class{detect(e=process.cwd()){let t=A(e),n=_e(t),a=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(m=>j(_(n,m))),i=ke(t,a?n:void 0);if(i){let m=T(i),d=Oe(m);return d.rootPath!==i&&(d.rootPath=i,d.updatedAt=new Date().toISOString(),U(i,d)),B(d,i)}let l=new Date().toISOString(),p=Ee(n),u={version:1,id:ve(n),name:p,remote:p,rootPath:n,createdAt:l,updatedAt:l,graphVersion:0,memoryVersion:0};return U(n,u),B(u,n)}};var G=[{id:"openai-compatible",label:"OpenAI-compatible",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"alibaba",label:"Alibaba / DashScope",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"openrouter",label:"OpenRouter",defaultBaseUrl:"https://openrouter.ai/api/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"groq",label:"Groq",defaultBaseUrl:"https://api.groq.com/openai/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"deepseek",label:"DeepSeek",defaultBaseUrl:"https://api.deepseek.com",defaultModel:"deepseek-v4-flash",requiresApiKey:!0,transport:"openai-compatible"},{id:"nvidia",label:"NVIDIA NIM",defaultBaseUrl:"https://integrate.api.nvidia.com/v1",defaultModel:"deepseek-ai/deepseek-v4-pro",requiresApiKey:!0,transport:"openai-compatible"},{id:"gemini",label:"Gemini",defaultBaseUrl:"https://generativelanguage.googleapis.com/v1beta",requiresApiKey:!0,transport:"gemini"},{id:"huggingface",label:"Hugging Face",defaultBaseUrl:"https://router.huggingface.co/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"ollama",label:"Ollama / Local",defaultBaseUrl:"http://127.0.0.1:11434/v1",requiresApiKey:!1,transport:"openai-compatible"},{id:"custom",label:"Custom endpoint",requiresApiKey:!1,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"cloudflare",label:"Cloudflare Workers AI",requiresApiKey:!0,requiresAccountId:!0,transport:"cloudflare"}];function O(r){let e=G.find(t=>t.id===r);if(!e)throw new Error(`Unsupported AI provider: ${r}`);return e}function x(r){return G.some(e=>e.id===r)}function o(r){return process.env[r]?.trim()||void 0}function c(...r){return r.find(e=>!!e?.trim())}function V(){if(o("GROQ_API_KEY"))return"groq";if(o("DEEPSEEK_API_KEY"))return"deepseek";if(o("NVIDIA_API_KEY")||o("NVIDIA_NIM_API_KEY"))return"nvidia";if(o("OPENROUTER_API_KEY"))return"openrouter";if(o("ALIBABA_API_KEY")||o("DASHSCOPE_API_KEY"))return"alibaba";if(o("GEMINI_API_KEY")||o("GOOGLE_API_KEY"))return"gemini";if(o("CLOUDFLARE_API_TOKEN")&&o("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(o("HF_TOKEN"))return"huggingface";if(o("OLLAMA_MODEL")||o("OLLAMA_BASE_URL"))return"ollama"}function xe(){let r=o("TOOLNET_LLM_PROVIDER");return r&&x(r)?r:V()??"openai-compatible"}function L(r){let e=O(r);switch(r){case"alibaba":return{provider:r,apiKey:c(o("ALIBABA_API_KEY"),o("DASHSCOPE_API_KEY")),baseUrl:c(o("ALIBABA_BASE_URL"),o("DASHSCOPE_BASE_URL"),e.defaultBaseUrl),model:c(o("ALIBABA_MODEL"),o("DASHSCOPE_MODEL"))};case"openrouter":return{provider:r,apiKey:o("OPENROUTER_API_KEY"),baseUrl:c(o("OPENROUTER_BASE_URL"),e.defaultBaseUrl),model:o("OPENROUTER_MODEL")};case"groq":return{provider:r,apiKey:o("GROQ_API_KEY"),baseUrl:c(o("GROQ_BASE_URL"),e.defaultBaseUrl),model:o("GROQ_MODEL")};case"deepseek":return{provider:r,apiKey:o("DEEPSEEK_API_KEY"),baseUrl:c(o("DEEPSEEK_BASE_URL"),e.defaultBaseUrl),model:c(o("DEEPSEEK_MODEL"),e.defaultModel)};case"nvidia":return{provider:r,apiKey:c(o("NVIDIA_API_KEY"),o("NVIDIA_NIM_API_KEY")),baseUrl:c(o("NVIDIA_BASE_URL"),o("NVIDIA_NIM_BASE_URL"),e.defaultBaseUrl),model:c(o("NVIDIA_MODEL"),o("NVIDIA_NIM_MODEL"),e.defaultModel)};case"gemini":return{provider:r,apiKey:c(o("GEMINI_API_KEY"),o("GOOGLE_API_KEY")),baseUrl:c(o("GEMINI_BASE_URL"),e.defaultBaseUrl),model:o("GEMINI_MODEL")};case"huggingface":return{provider:r,apiKey:o("HF_TOKEN"),baseUrl:c(o("HF_INFERENCE_BASE_URL"),e.defaultBaseUrl),model:c(o("HF_LLM_MODEL"),o("HF_MODEL"))};case"ollama":return{provider:r,apiKey:o("OLLAMA_API_KEY"),baseUrl:c(o("OLLAMA_BASE_URL"),e.defaultBaseUrl),model:o("OLLAMA_MODEL")};case"cloudflare":return{provider:r,accountId:o("CLOUDFLARE_ACCOUNT_ID"),apiKey:o("CLOUDFLARE_API_TOKEN"),baseUrl:o("CLOUDFLARE_AI_BASE_URL"),model:o("CLOUDFLARE_MODEL")};case"custom":return{provider:r,apiKey:o("CUSTOM_AI_API_KEY"),baseUrl:o("CUSTOM_AI_BASE_URL"),model:o("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:c(o("OPENAI_API_KEY"),o("MODEL_API_KEY")),baseUrl:c(o("OPENAI_BASE_URL"),o("MODEL_BASE_URL")),model:c(o("OPENAI_MODEL"),o("MODEL_NAME"))}}}function Ce(){let r=o("TOOLNET_LLM_PROVIDER"),e=r&&x(r)?r:xe(),t=O(e),n=L(e);return{provider:e,apiKey:c(o("TOOLNET_LLM_API_KEY"),n.apiKey),baseUrl:c(o("TOOLNET_LLM_BASE_URL"),n.baseUrl,t.defaultBaseUrl),model:c(o("TOOLNET_LLM_MODEL"),n.model,t.defaultModel),accountId:c(o("TOOLNET_LLM_ACCOUNT_ID"),n.accountId)}}function we(){let r=o("TOOLNET_EMBEDDING_PROVIDER");return r==="local"?"local":r&&x(r)?r:o("HF_TOKEN")||o("HF_EMBEDDING_MODEL")?"huggingface":"local"}function Me(){let r=we();if(r==="local")return{provider:"local",model:c(o("TOOLNET_EMBEDDING_MODEL"),o("LOCAL_EMBEDDING_MODEL"))};let e=O(r),t,n,s,a;switch(r){case"huggingface":t=o("HF_TOKEN"),n=o("HF_INFERENCE_BASE_URL"),s=o("HF_EMBEDDING_MODEL");break;case"openai-compatible":t=o("OPENAI_API_KEY"),n=o("OPENAI_BASE_URL"),s=o("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":t=o("CLOUDFLARE_API_TOKEN"),n=o("CLOUDFLARE_AI_BASE_URL"),s=o("CLOUDFLARE_EMBEDDING_MODEL"),a=o("CLOUDFLARE_ACCOUNT_ID");break;default:t=L(r).apiKey,n=L(r).baseUrl,s=o(`${r.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let i=c(o("TOOLNET_EMBEDDING_ACCOUNT_ID"),a),l=c(o("TOOLNET_EMBEDDING_BASE_URL"),n,e.defaultBaseUrl),p=r==="cloudflare"&&!l&&i?`https://api.cloudflare.com/client/v4/accounts/${i}/ai/v1`:l;return{provider:r,apiKey:c(o("TOOLNET_EMBEDDING_API_KEY"),t),baseUrl:p,model:c(o("TOOLNET_EMBEDDING_MODEL"),s),accountId:i}}function Y(){let r=Ce(),e=Me();return{llm:r,embedding:e,legacy:{llm:!o("TOOLNET_LLM_PROVIDER")&&!!V(),embedding:!o("TOOLNET_EMBEDDING_PROVIDER")&&!!(o("HF_TOKEN")||o("HF_EMBEDDING_MODEL"))}}}import{homedir as Xe}from"node:os";import{join as et}from"node:path";import{DeleteObjectCommand as Pe,GetObjectCommand as Re,HeadObjectCommand as je,ListObjectsV2Command as Te,PutObjectCommand as Le,S3Client as Ne}from"@aws-sdk/client-s3";import{getSignedUrl as De}from"@aws-sdk/s3-request-presigner";var C=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new Ne({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,n="application/octet-stream"){let s=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new Le({Bucket:this.bucket,Key:e,Body:s,ContentType:n}))}async get(e){let t=await De(this.client,new Re({Bucket:this.bucket,Key:e}),{expiresIn:60}),n=await fetch(t,{redirect:"follow"});if(n.status===404)return null;if(!n.ok)throw new Error(`HF download failed: ${n.status} ${n.statusText}`);return new Uint8Array(await n.arrayBuffer())}async getText(e){let t=await this.get(e);return t?Buffer.from(t).toString("utf8"):null}async exists(e){try{return await this.client.send(new je({Bucket:this.bucket,Key:e})),!0}catch(t){if(typeof t=="object"&&t!==null&&"$metadata"in t&&t.$metadata?.httpStatusCode===404)return!1;throw t}}async delete(e){await this.client.send(new Pe({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],n;do{let s=await this.client.send(new Te({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:n}));for(let a of s.Contents??[])a.Key&&t.push({key:a.Key,size:a.Size,updatedAt:a.LastModified?.toISOString()});n=s.IsTruncated?s.NextContinuationToken:void 0}while(n);return t}};import{access as z,mkdir as Ke,readFile as Ue,readdir as Be,rm as $e,stat as H,writeFile as Fe}from"node:fs/promises";import{dirname as Ge,join as Ve,relative as W,resolve as Ye}from"node:path";var E=class{constructor(e){this.root=e}root;name="local";path(e){let t=e.replace(/^\/+/,"");return Ye(this.root,t)}async put(e,t){let n=this.path(e);await Ke(Ge(n),{recursive:!0}),await Fe(n,t)}async get(e){try{return await Ue(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 z(this.path(e)),!0}catch{return!1}}async delete(e){await $e(this.path(e),{force:!0})}async list(e=""){let t=this.path(e),n=[];try{await z(t)}catch{return n}let s=async i=>{let l=await Be(i,{withFileTypes:!0});for(let p of l){let u=Ve(i,p.name);if(p.isDirectory()){await s(u);continue}let m=await H(u);n.push({key:W(this.root,u),size:m.size,updatedAt:m.mtime.toISOString()})}},a=await H(t);return a.isDirectory()?await s(t):n.push({key:W(this.root,t),size:a.size,updatedAt:a.mtime.toISOString()}),n}};import{DeleteObjectCommand as ze,GetObjectCommand as He,HeadObjectCommand as We,ListObjectsV2Command as Je,PutObjectCommand as qe,S3Client as Qe}from"@aws-sdk/client-s3";import{getSignedUrl as Ze}from"@aws-sdk/s3-request-presigner";var b=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new Qe({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,n="application/octet-stream"){let s=typeof t=="string"?Buffer.from(t,"utf8"):t;await this.client.send(new qe({Bucket:this.bucket,Key:e,Body:s,ContentType:n}))}async get(e){let t=await Ze(this.client,new He({Bucket:this.bucket,Key:e}),{expiresIn:60}),n=await fetch(t,{redirect:"follow"});if(n.status===404)return null;if(!n.ok)throw new Error(`${this.name} download failed: ${n.status} ${n.statusText}`);return new Uint8Array(await n.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 We({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 ze({Bucket:this.bucket,Key:e}))}async list(e=""){let t=[],n;do{let s=await this.client.send(new Je({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:n}));for(let a of s.Contents??[])a.Key&&t.push({key:a.Key,size:a.Size,updatedAt:a.LastModified?.toISOString()});n=s.IsTruncated?s.NextContinuationToken:void 0}while(n);return t}};function N(r,e){return console.warn(e),new E(r)}function J(r){let e=r.localRoot??et(Xe(),".toolnet-memory","storage");if(r.provider==="r2"){let t=r.r2;return t?.accountId&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new b({name:"r2",endpoint:`https://${t.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:t.bucket,forcePathStyle:!0,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):N(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(r.provider==="s3"){let t=r.s3;return t?.bucket&&t.accessKeyId&&t.secretAccessKey?new b({name:"s3",endpoint:t.endpoint,region:t.region??"us-east-1",bucket:t.bucket,forcePathStyle:t.forcePathStyle??!1,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):N(e,"[storage] S3 credentials missing. Using local fallback.")}if(r.provider==="huggingface"){let t=r.huggingface;return t?.namespace&&t.bucket&&t.accessKeyId&&t.secretAccessKey?new C({namespace:t.namespace,bucket:t.bucket,accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}):N(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new E(e)}function tt(r){return new Promise(e=>setTimeout(e,r))}async function q(r,e={}){let t=Math.max(1,e.attempts??3),n=e.baseDelayMs??150,s=e.maxDelayMs??2e3,a;for(let i=1;i<=t;i++)try{return await r()}catch(l){if(a=l,i>=t)break;let p=Math.min(s,n*2**(i-1)),u=Math.floor(Math.random()*Math.max(1,p*.2));await tt(p+u)}throw a}var rt=new Set(["put","get","getText","delete","list"]);function Q(r,e={}){return new Proxy(r,{get(t,n){let s=Reflect.get(t,n,t);return typeof s!="function"?s:rt.has(n)?(...a)=>q(()=>Promise.resolve(s.apply(t,a)),e):s.bind(t)}})}function Z(r){let e=r.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 X(r){let e=r.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 n=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(n)return`${n[1]}memory/records/${n[2]}`;if(n=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),n)return`${n[1]}memory/vectors/${n[2]}`;if(n=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),n)return`${n[1]}code/graph/${n[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 w=class{constructor(e,t,n,s){this.provider=e;this.name=e.name,this.projectId=t,this.projectName=n,this.folder=Z(s??n),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(),n=t,s=await this.provider.getText(e);if(s){let i;try{i=JSON.parse(s)}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"&&(n=i.createdAt)}let a={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:n,updatedAt:t};await this.provider.put(e,JSON.stringify(a,null,2)+`
|
|
4
|
+
`,"application/json")}async ensureRegistered(){return this.registryPromise||(this.registryPromise=this.registerProject()),this.registryPromise}key(e){if(e=X(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,n){return await this.ensureRegistered(),this.provider.put(this.key(e),t,n)}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{existsSync as ne,readFileSync as at,readdirSync as te}from"node:fs";import{join as M}from"node:path";import{existsSync as nt,mkdirSync as bn,readFileSync as ot,renameSync as vn,writeFileSync as In}from"node:fs";import{dirname as _n,join as st}from"node:path";function it(r){return st(r.rootPath,".toolnet","work","current.json")}function ee(r){let e=it(r);if(!nt(e))return null;try{let t=JSON.parse(ot(e,"utf8"));return t.version!==1||t.projectId!==r.id?null:t}catch{return null}}function oe(r){if(!ne(r))return null;try{return JSON.parse(at(r,"utf8"))}catch{return null}}function ct(r){let e=M(r.rootPath,".toolnet","sessions");if(!ne(e))return[];let t=[];for(let n of te(e,{withFileTypes:!0})){if(!n.isDirectory())continue;let s=M(e,n.name);for(let a of te(s,{withFileTypes:!0})){if(!a.isDirectory())continue;let i=oe(M(s,a.name,"state.json"));!i||i.version!==1||i.projectId!==r.id||t.push(i)}}return t}function re(r){return r.filter(e=>!!e).sort().at(-1)}function lt(r){let e=oe(M(r.rootPath,".toolnet","runtime","opencode-status.json"));return!e||e.projectRoot&&e.projectRoot!==r.rootPath?null:e}function se(r){let e=ct(r),n=[...e].sort((d,y)=>(d.lastLocalEventAt??d.updatedAt).localeCompare(y.lastLocalEventAt??y.updatedAt)).at(-1),s=Array.from(new Set(e.map(d=>d.agent))).sort(),a=e.reduce((d,y)=>d+Math.max(0,y.lastSequence-y.lastRemoteSequence),0),i=lt(r),l=i?.state==="capture-failed",p=i?.state==="sync-failed",u;l?u="degraded":a>0||p?u="pending":e.length>0?u="healthy":u="unknown";let m=ee(r);return{ok:u!=="degraded",agents:s,sessions:e.length,latestAgent:n?.agent,latestSessionId:n?.nativeSessionId,lastCaptureAt:re(e.map(d=>d.lastLocalEventAt??d.updatedAt)),lastFlushAt:re(e.map(d=>d.lastRemoteAt)),pendingWal:a,currentTask:m?.currentTask?.title,currentFile:m?.activeFiles?.at(-1)??m?.filesTouched.at(-1),syncHealth:u,opencode:i?{state:i.state,reason:i.reason,timestamp:i.timestamp,error:i.error}:void 0}}var ut={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},dt={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function pt(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let r=process.env.TERM_PROGRAM,e=process.env.WT_SESSION,t=process.env.VSCODE_PID,n=process.env.ConEmuPID;return!!(e||t||n||r==="vscode")}return process.env.TERM!=="linux"}var D;function ie(){return D||(D=pt()?ut:dt),D}var f={reset:"\x1B[0m",green:"\x1B[32m",cyan:"\x1B[36m",red:"\x1B[31m",yellow:"\x1B[33m",amber:"\x1B[38;5;214m",white:"\x1B[97m",dim:"\x1B[2m",bold:"\x1B[1m"};function mt(r){return r.noColor||process.env.NO_COLOR?!1:r.tty??process.stdout.isTTY??!1}function v(r,e,t){return mt(t)?`${e}${r}${f.reset}`:r}function P(r,e){return v(r,f.dim,e)}function gt(r,e){return v(r,f.bold,e)}function ft(r,e){return v(r,f.cyan,e)}function yt(r,e){return v(r,f.red,e)}function ht(r,e){return v(r,f.white,e)}function ae(r,e,t){let n=ie(),s=e?` ${P(`v${e}`,t)}`:"";return`${ft(n.phaseDone,t)} ${r}${s}`}function R(r,e){return gt(r,e)}function g(r,e,t,n){let s=" ".repeat(Math.max(0,t-r.length));return` ${P(r,n)}${s} ${ht(e,n)}`}function ce(r){return yt("\u2717",r)}function St(r){return{tty:r.tty,noColor:r.noColor}}async function At(r){let e=St(r);console.log(""),console.log(ae("ToolNet Status",void 0,e)),console.log("");try{let t=new k().detect(),n=K(),s=Y();console.log(R("PROJECT",e)),console.log(g("Name",t.name,8,e));let a=Q(J({provider:n.storage.provider,r2:n.storage.r2,s3:n.storage.s3,huggingface:n.storage.huggingface,localRoot:n.storage.localRoot}),{attempts:3}),i=new w(a,t.id,t.name,t.remote??t.name),l="unknown",p="unknown";try{l=await i.exists(`${t.id}/memory.json`)?"ready":"not initialized"}catch{l="error"}try{p=await i.exists(`${t.id}/code-graph.json`)?"ready":"not built"}catch{p="error"}console.log(g("Memory",l,8,e)),console.log(g("Index",p,8,e)),console.log(""),console.log(R("AI",e)),console.log(g("Provider",s.llm.provider,8,e)),console.log(g("Model",s.llm.model??"not set",8,e)),console.log("");let u=se(t);if(u.agents.length>0){console.log(R("SERVICE",e));let m=u.syncHealth==="healthy"?"running":u.syncHealth==="degraded"?"degraded":"stopped";console.log(g("Daemon",m,8,e)),console.log("")}}catch(t){console.log(ce(e)+" Failed to get status"),console.log(""),console.log(P(` ${t instanceof Error?t.message:String(t)}`,e)),console.log(""),process.exitCode=1}}async function Et(){let r=process.argv.slice(2),e={tty:process.stdout.isTTY,noColor:process.env.NO_COLOR!==void 0||r.includes("--no-color")};await At(e)}Et().catch(r=>{console.error(""),console.error(r instanceof Error?r.message:String(r)),console.error(""),process.exitCode=1});
|