toolnet-memory 0.3.10 → 0.3.12
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/README.md +432 -163
- package/bin/toolnet-memory +5 -0
- package/bundle/agy-hook.js +38 -38
- package/bundle/agy.js +23 -23
- package/bundle/api.js +19 -16
- package/bundle/auto-integrate.js +84 -31
- package/bundle/claude-hook.js +9 -9
- package/bundle/codex.js +28 -28
- package/bundle/context-runtime.js +4 -4
- package/bundle/context.js +12 -12
- package/bundle/continuity-certify.js +16 -13
- package/bundle/copilot-hook.js +66 -66
- package/bundle/copilot.js +23 -27
- package/bundle/cursor-hook.js +66 -66
- package/bundle/cursor.js +24 -27
- package/bundle/grok-hook.js +46 -46
- package/bundle/grok.js +6 -7
- package/bundle/help-cli.js +4 -4
- package/bundle/init.js +92 -39
- package/bundle/integration-status.js +55 -0
- package/bundle/kiro-hook.js +14 -14
- package/bundle/mcp.js +21 -18
- package/bundle/opencode.js +27 -27
- package/bundle/setup.js +90 -37
- package/bundle/status-cli.js +4 -4
- package/package.json +12 -2
package/bundle/status-cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{existsSync as Re,readFileSync as
|
|
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
|
|
3
|
-
`,{encoding:"utf8",mode:384}),$e(i,o)}function z(t,e){return{id:t.id,name:t.name,remote:t.remote,rootPath:e,createdAt:t.createdAt,updatedAt:t.updatedAt,graphVersion:t.graphVersion,memoryVersion:t.memoryVersion,metadata:t.metadata}}var _=class{detect(e=process.cwd()){let r=A(e),o=We(r),s=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(m=>N(M(o,m))),a=ze(r,s?o:void 0);if(a){let m=K(a),u=Je(m);return u.rootPath!==a&&(u.rootPath=a,u.updatedAt=new Date().toISOString(),Y(a,u)),z(u,a)}let l=new Date().toISOString(),p=He(o),d={version:1,id:Ve(o),name:p,remote:p,rootPath:o,createdAt:l,updatedAt:l,graphVersion:0,memoryVersion:0};return Y(o,d),z(d,o)}};var q=[{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 w(t){let e=q.find(r=>r.id===t);if(!e)throw new Error(`Unsupported AI provider: ${t}`);return e}function R(t){return q.some(e=>e.id===t)}function n(t){return process.env[t]?.trim()||void 0}function c(...t){return t.find(e=>!!e?.trim())}function Q(){if(n("GROQ_API_KEY"))return"groq";if(n("DEEPSEEK_API_KEY"))return"deepseek";if(n("NVIDIA_API_KEY")||n("NVIDIA_NIM_API_KEY"))return"nvidia";if(n("OPENROUTER_API_KEY"))return"openrouter";if(n("ALIBABA_API_KEY")||n("DASHSCOPE_API_KEY"))return"alibaba";if(n("GEMINI_API_KEY")||n("GOOGLE_API_KEY"))return"gemini";if(n("CLOUDFLARE_API_TOKEN")&&n("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(n("HF_TOKEN"))return"huggingface";if(n("OLLAMA_MODEL")||n("OLLAMA_BASE_URL"))return"ollama"}function qe(){let t=n("TOOLNET_LLM_PROVIDER");return t&&R(t)?t:Q()??"openai-compatible"}function U(t){let e=w(t);switch(t){case"alibaba":return{provider:t,apiKey:c(n("ALIBABA_API_KEY"),n("DASHSCOPE_API_KEY")),baseUrl:c(n("ALIBABA_BASE_URL"),n("DASHSCOPE_BASE_URL"),e.defaultBaseUrl),model:c(n("ALIBABA_MODEL"),n("DASHSCOPE_MODEL"))};case"openrouter":return{provider:t,apiKey:n("OPENROUTER_API_KEY"),baseUrl:c(n("OPENROUTER_BASE_URL"),e.defaultBaseUrl),model:n("OPENROUTER_MODEL")};case"groq":return{provider:t,apiKey:n("GROQ_API_KEY"),baseUrl:c(n("GROQ_BASE_URL"),e.defaultBaseUrl),model:n("GROQ_MODEL")};case"deepseek":return{provider:t,apiKey:n("DEEPSEEK_API_KEY"),baseUrl:c(n("DEEPSEEK_BASE_URL"),e.defaultBaseUrl),model:c(n("DEEPSEEK_MODEL"),e.defaultModel)};case"nvidia":return{provider:t,apiKey:c(n("NVIDIA_API_KEY"),n("NVIDIA_NIM_API_KEY")),baseUrl:c(n("NVIDIA_BASE_URL"),n("NVIDIA_NIM_BASE_URL"),e.defaultBaseUrl),model:c(n("NVIDIA_MODEL"),n("NVIDIA_NIM_MODEL"),e.defaultModel)};case"gemini":return{provider:t,apiKey:c(n("GEMINI_API_KEY"),n("GOOGLE_API_KEY")),baseUrl:c(n("GEMINI_BASE_URL"),e.defaultBaseUrl),model:n("GEMINI_MODEL")};case"huggingface":return{provider:t,apiKey:n("HF_TOKEN"),baseUrl:c(n("HF_INFERENCE_BASE_URL"),e.defaultBaseUrl),model:c(n("HF_LLM_MODEL"),n("HF_MODEL"))};case"ollama":return{provider:t,apiKey:n("OLLAMA_API_KEY"),baseUrl:c(n("OLLAMA_BASE_URL"),e.defaultBaseUrl),model:n("OLLAMA_MODEL")};case"cloudflare":return{provider:t,accountId:n("CLOUDFLARE_ACCOUNT_ID"),apiKey:n("CLOUDFLARE_API_TOKEN"),baseUrl:n("CLOUDFLARE_AI_BASE_URL"),model:n("CLOUDFLARE_MODEL")};case"custom":return{provider:t,apiKey:n("CUSTOM_AI_API_KEY"),baseUrl:n("CUSTOM_AI_BASE_URL"),model:n("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:c(n("OPENAI_API_KEY"),n("MODEL_API_KEY")),baseUrl:c(n("OPENAI_BASE_URL"),n("MODEL_BASE_URL")),model:c(n("OPENAI_MODEL"),n("MODEL_NAME"))}}}function Qe(){let t=n("TOOLNET_LLM_PROVIDER"),e=t&&R(t)?t:qe(),r=w(e),o=U(e);return{provider:e,apiKey:c(n("TOOLNET_LLM_API_KEY"),o.apiKey),baseUrl:c(n("TOOLNET_LLM_BASE_URL"),o.baseUrl,r.defaultBaseUrl),model:c(n("TOOLNET_LLM_MODEL"),o.model,r.defaultModel),accountId:c(n("TOOLNET_LLM_ACCOUNT_ID"),o.accountId)}}function Ze(){let t=n("TOOLNET_EMBEDDING_PROVIDER");return t==="local"?"local":t&&R(t)?t:n("HF_TOKEN")||n("HF_EMBEDDING_MODEL")?"huggingface":"local"}function Xe(){let t=Ze();if(t==="local")return{provider:"local",model:c(n("TOOLNET_EMBEDDING_MODEL"),n("LOCAL_EMBEDDING_MODEL"))};let e=w(t),r,o,i,s;switch(t){case"huggingface":r=n("HF_TOKEN"),o=n("HF_INFERENCE_BASE_URL"),i=n("HF_EMBEDDING_MODEL");break;case"openai-compatible":r=n("OPENAI_API_KEY"),o=n("OPENAI_BASE_URL"),i=n("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":r=n("CLOUDFLARE_API_TOKEN"),o=n("CLOUDFLARE_AI_BASE_URL"),i=n("CLOUDFLARE_EMBEDDING_MODEL"),s=n("CLOUDFLARE_ACCOUNT_ID");break;default:r=U(t).apiKey,o=U(t).baseUrl,i=n(`${t.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let a=c(n("TOOLNET_EMBEDDING_ACCOUNT_ID"),s),l=c(n("TOOLNET_EMBEDDING_BASE_URL"),o,e.defaultBaseUrl),p=t==="cloudflare"&&!l&&a?`https://api.cloudflare.com/client/v4/accounts/${a}/ai/v1`:l;return{provider:t,apiKey:c(n("TOOLNET_EMBEDDING_API_KEY"),r),baseUrl:p,model:c(n("TOOLNET_EMBEDDING_MODEL"),i),accountId:a}}function Z(){let t=Qe(),e=Xe();return{llm:t,embedding:e,legacy:{llm:!n("TOOLNET_LLM_PROVIDER")&&!!Q(),embedding:!n("TOOLNET_EMBEDDING_PROVIDER")&&!!(n("HF_TOKEN")||n("HF_EMBEDDING_MODEL"))}}}import{homedir as Ot}from"node:os";import{join as Et}from"node:path";import{DeleteObjectCommand as et,GetObjectCommand as tt,HeadObjectCommand as rt,ListObjectsV2Command as ot,PutObjectCommand as nt,S3Client as it}from"@aws-sdk/client-s3";import{getSignedUrl as st}from"@aws-sdk/s3-request-presigner";var j=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new it({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,r,o="application/octet-stream"){let i=typeof r=="string"?Buffer.from(r,"utf8"):r;await this.client.send(new nt({Bucket:this.bucket,Key:e,Body:i,ContentType:o}))}async get(e){let r=await st(this.client,new tt({Bucket:this.bucket,Key:e}),{expiresIn:60}),o=await fetch(r,{redirect:"follow"});if(o.status===404)return null;if(!o.ok)throw new Error(`HF download failed: ${o.status} ${o.statusText}`);return new Uint8Array(await o.arrayBuffer())}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await this.client.send(new rt({Bucket:this.bucket,Key:e})),!0}catch(r){if(typeof r=="object"&&r!==null&&"$metadata"in r&&r.$metadata?.httpStatusCode===404)return!1;throw r}}async delete(e){await this.client.send(new et({Bucket:this.bucket,Key:e}))}async list(e=""){let r=[],o;do{let i=await this.client.send(new ot({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:o}));for(let s of i.Contents??[])s.Key&&r.push({key:s.Key,size:s.Size,updatedAt:s.LastModified?.toISOString()});o=i.IsTruncated?i.NextContinuationToken:void 0}while(o);return r}};import{access as X,mkdir as at,readFile as ct,readdir as ut,rm as lt,stat as ee,writeFile as pt}from"node:fs/promises";import{dirname as dt,join as gt,relative as te,resolve as mt}from"node:path";var O=class{constructor(e){this.root=e}root;name="local";path(e){let r=e.replace(/^\/+/,"");return mt(this.root,r)}async put(e,r){let o=this.path(e);await at(dt(o),{recursive:!0}),await pt(o,r)}async get(e){try{return await ct(this.path(e))}catch(r){if(typeof r=="object"&&r!==null&&"code"in r&&r.code==="ENOENT")return null;throw r}}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await X(this.path(e)),!0}catch{return!1}}async delete(e){await lt(this.path(e),{force:!0})}async list(e=""){let r=this.path(e),o=[];try{await X(r)}catch{return o}let i=async a=>{let l=await ut(a,{withFileTypes:!0});for(let p of l){let d=gt(a,p.name);if(p.isDirectory()){await i(d);continue}let m=await ee(d);o.push({key:te(this.root,d),size:m.size,updatedAt:m.mtime.toISOString()})}},s=await ee(r);return s.isDirectory()?await i(r):o.push({key:te(this.root,r),size:s.size,updatedAt:s.mtime.toISOString()}),o}};import{DeleteObjectCommand as ft,GetObjectCommand as yt,HeadObjectCommand as ht,ListObjectsV2Command as St,PutObjectCommand as Ct,S3Client as kt}from"@aws-sdk/client-s3";import{getSignedUrl as At}from"@aws-sdk/s3-request-presigner";var E=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new kt({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,r,o="application/octet-stream"){let i=typeof r=="string"?Buffer.from(r,"utf8"):r;await this.client.send(new Ct({Bucket:this.bucket,Key:e,Body:i,ContentType:o}))}async get(e){let r=await At(this.client,new yt({Bucket:this.bucket,Key:e}),{expiresIn:60}),o=await fetch(r,{redirect:"follow"});if(o.status===404)return null;if(!o.ok)throw new Error(`${this.name} download failed: ${o.status} ${o.statusText}`);return new Uint8Array(await o.arrayBuffer())}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await this.client.send(new ht({Bucket:this.bucket,Key:e})),!0}catch(r){if(typeof r=="object"&&r!==null&&"$metadata"in r&&r.$metadata?.httpStatusCode===404)return!1;throw r}}async delete(e){await this.client.send(new ft({Bucket:this.bucket,Key:e}))}async list(e=""){let r=[],o;do{let i=await this.client.send(new St({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:o}));for(let s of i.Contents??[])s.Key&&r.push({key:s.Key,size:s.Size,updatedAt:s.LastModified?.toISOString()});o=i.IsTruncated?i.NextContinuationToken:void 0}while(o);return r}};function F(t,e){return console.warn(e),new O(t)}function re(t){let e=t.localRoot??Et(Ot(),".toolnet-memory","storage");if(t.provider==="r2"){let r=t.r2;return r?.accountId&&r.bucket&&r.accessKeyId&&r.secretAccessKey?new E({name:"r2",endpoint:`https://${r.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:r.bucket,forcePathStyle:!0,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(t.provider==="s3"){let r=t.s3;return r?.bucket&&r.accessKeyId&&r.secretAccessKey?new E({name:"s3",endpoint:r.endpoint,region:r.region??"us-east-1",bucket:r.bucket,forcePathStyle:r.forcePathStyle??!1,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] S3 credentials missing. Using local fallback.")}if(t.provider==="huggingface"){let r=t.huggingface;return r?.namespace&&r.bucket&&r.accessKeyId&&r.secretAccessKey?new j({namespace:r.namespace,bucket:r.bucket,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new O(e)}function bt(t){return new Promise(e=>setTimeout(e,t))}async function oe(t,e={}){let r=Math.max(1,e.attempts??3),o=e.baseDelayMs??150,i=e.maxDelayMs??2e3,s;for(let a=1;a<=r;a++)try{return await t()}catch(l){if(s=l,a>=r)break;let p=Math.min(i,o*2**(a-1)),d=Math.floor(Math.random()*Math.max(1,p*.2));await bt(p+d)}throw s}var xt=new Set(["put","get","getText","delete","list"]);function ne(t,e={}){return new Proxy(t,{get(r,o){let i=Reflect.get(r,o,r);return typeof i!="function"?i:xt.has(o)?(...s)=>oe(()=>Promise.resolve(i.apply(r,s)),e):i.bind(r)}})}function ie(t){let e=t.trim().replace(/\s+/g,"_").replace(/[^A-Za-z0-9._-]/g,"_").replace(/_+/g,"_").replace(/^\.+|\.+$/g,"").slice(0,100);if(!e||e==="."||e==="..")throw new Error("Invalid project storage folder");return e}function se(t){let e=t.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 r=e.match(/^(snapshots\/[^/]+\/)memories\/(.+)$/);if(r)return`${r[1]}memory/records/${r[2]}`;if(r=e.match(/^(snapshots\/[^/]+\/)vectors\/(.+)$/),r)return`${r[1]}memory/vectors/${r[2]}`;if(r=e.match(/^(snapshots\/[^/]+\/)graph\/(.+)$/),r)return`${r[1]}code/graph/${r[2]}`;let o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(o)return`${o[1]}memory/records/${o[2]}`;if(o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),o)return`${o[1]}memory/vectors/${o[2]}`;if(o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),o)return`${o[1]}code/graph/${o[2]}`;let i=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return i?`${i[1]}memory/records/${i[2]}`:(i=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),i?`${i[1]}memory/vectors/${i[2]}`:(i=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),i?`${i[1]}code/graph/${i[2]}`:e))}var D=class{constructor(e,r,o,i){this.provider=e;this.name=e.name,this.projectId=r,this.projectName=o,this.folder=ie(i??o),this.sourcePrefix=`projects/${r}`,this.targetPrefix=`projects/${this.folder}`}provider;name;folder;sourcePrefix;targetPrefix;projectId;projectName;registryPromise;async registerProject(){let e=`${this.targetPrefix}/project.json`,r=new Date().toISOString(),o=r,i=await this.provider.getText(e);if(i){let a;try{a=JSON.parse(i)}catch(l){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${l instanceof Error?l.message:String(l)}`)}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"&&(o=a.createdAt)}let s={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:o,updatedAt:r};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=se(e),e===this.sourcePrefix)return this.targetPrefix;if(e.startsWith(`${this.sourcePrefix}/`))return this.targetPrefix+e.slice(this.sourcePrefix.length);if(e===this.targetPrefix||e.startsWith(`${this.targetPrefix}/`))return e;if(e.startsWith("projects/"))throw new Error(["Cross-project storage access denied.",`Current project: ${this.targetPrefix}`,`Requested key: ${e}`].join(" "));return e}async put(e,r,o){return await this.ensureRegistered(),this.provider.put(this.key(e),r,o)}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 le,readFileSync as Mt,readdirSync as ce}from"node:fs";import{join as T}from"node:path";import{existsSync as vt,mkdirSync as Cn,readFileSync as It,renameSync as kn,writeFileSync as An}from"node:fs";import{dirname as En,join as Pt}from"node:path";function _t(t){return Pt(t.rootPath,".toolnet","work","current.json")}function ae(t){let e=_t(t);if(!vt(e))return null;try{let r=JSON.parse(It(e,"utf8"));return r.version!==1||r.projectId!==t.id?null:r}catch{return null}}function pe(t){if(!le(t))return null;try{return JSON.parse(Mt(t,"utf8"))}catch{return null}}function wt(t){let e=T(t.rootPath,".toolnet","sessions");if(!le(e))return[];let r=[];for(let o of ce(e,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=T(e,o.name);for(let s of ce(i,{withFileTypes:!0})){if(!s.isDirectory())continue;let a=pe(T(i,s.name,"state.json"));!a||a.version!==1||a.projectId!==t.id||r.push(a)}}return r}function ue(t){return t.filter(e=>!!e).sort().at(-1)}function Rt(t){let e=pe(T(t.rootPath,".toolnet","runtime","opencode-status.json"));return!e||e.projectRoot&&e.projectRoot!==t.rootPath?null:e}function de(t){let e=wt(t),o=[...e].sort((u,g)=>(u.lastLocalEventAt??u.updatedAt).localeCompare(g.lastLocalEventAt??g.updatedAt)).at(-1),i=Array.from(new Set(e.map(u=>u.agent))).sort(),s=e.reduce((u,g)=>u+Math.max(0,g.lastSequence-g.lastRemoteSequence),0),a=Rt(t),l=a?.state==="capture-failed",p=a?.state==="sync-failed",d;l?d="degraded":s>0||p?d="pending":e.length>0?d="healthy":d="unknown";let m=ae(t);return{ok:d!=="degraded",agents:i,sessions:e.length,latestAgent:o?.agent,latestSessionId:o?.nativeSessionId,lastCaptureAt:ue(e.map(u=>u.lastLocalEventAt??u.updatedAt)),lastFlushAt:ue(e.map(u=>u.lastRemoteAt)),pendingWal:s,currentTask:m?.currentTask?.title,currentFile:m?.activeFiles?.at(-1)??m?.filesTouched.at(-1),syncHealth:d,opencode:a?{state:a.state,reason:a.reason,timestamp:a.timestamp,error:a.error}:void 0}}import{existsSync as qt}from"node:fs";import{homedir as Qt}from"node:os";import{join as Zt}from"node:path";import{spawnSync as Xt}from"node:child_process";import{homedir as jt}from"node:os";import{join as $}from"node:path";function ge(t={}){return $(t.home??jt(),".gemini")}function Dt(t={}){return $(ge(t),"config")}function Tt(t={}){return $(ge(t),"antigravity-cli")}function me(t={}){return[Tt(t),Dt(t)]}import{homedir as Lt}from"node:os";import{join as fe}from"node:path";function ye(t={}){let e=t.xdgConfigHome??process.env.XDG_CONFIG_HOME?.trim();return e?fe(e,"opencode"):fe(t.home??Lt(),".config","opencode")}import{homedir as Nt}from"node:os";import{join as Kt}from"node:path";function he(t={}){return Kt(t.home??Nt(),".claude")}import{homedir as Ut}from"node:os";import{join as b}from"node:path";function B(t={}){return t.kiroHome??process.env.KIRO_HOME??b(t.home??Ut(),".kiro")}function Ft(t={}){return b(B(t),"settings")}function Se(t={}){return b(Ft(t),"mcp.json")}function $t(t={}){return b(B(t),"hooks")}function Ce(t={}){return b($t(t),"toolnet-memory.json")}function ke(t={}){return[B(t)]}import{homedir as Bt}from"node:os";import{join as Ae}from"node:path";function Oe(t={}){return t.cursorHome??Ae(t.home??Bt(),".cursor")}function Ht(t={}){return t.cursorConfigDir??process.env.CURSOR_CONFIG_DIR??(t.xdgConfigHome??process.env.XDG_CONFIG_HOME?Ae(t.xdgConfigHome??process.env.XDG_CONFIG_HOME,"cursor"):void 0)??Oe(t)}function Ee(t={}){return Array.from(new Set([Oe(t),Ht(t)]))}import{homedir as Gt}from"node:os";import{join as Vt}from"node:path";function Yt(t={}){return t.copilotHome??process.env.COPILOT_HOME??Vt(t.home??Gt(),".copilot")}function be(t={}){return[Yt(t)]}import{homedir as zt}from"node:os";import{join as Wt}from"node:path";function Jt(t={}){return t.grokHome??process.env.GROK_HOME??Wt(t.home??zt(),".grok")}function xe(t={}){return[Jt(t)]}function er(t){return Xt("sh",["-lc",`command -v ${JSON.stringify(t)} >/dev/null 2>&1`],{stdio:"ignore"}).status===0}function y(t){let e=t.commandExists(t.command),r=t.configPaths.filter(s=>qt(s)),o=r.length>0,i=[];e&&i.push(`command:${t.command}`);for(let s of r)i.push(`config:${s}`);return{agent:t.agent,detected:e||o,commandDetected:e,configDetected:o,evidence:i}}function ve(t={}){let e=t.home??Qt(),r=t.commandExists??er,o=t.codexHome??process.env.CODEX_HOME??Zt(e,".codex");return[y({agent:"agy",command:"agy",commandExists:r,configPaths:me({home:e})}),y({agent:"opencode",command:"opencode",commandExists:r,configPaths:[ye({home:e,xdgConfigHome:t.xdgConfigHome})]}),y({agent:"claude",command:"claude",commandExists:r,configPaths:[he({home:e})]}),y({agent:"kiro",command:"kiro-cli",commandExists:r,configPaths:ke({home:e,kiroHome:t.kiroHome})}),y({agent:"cursor",command:"agent",commandExists:r,configPaths:Ee({home:e,cursorHome:t.cursorHome,cursorConfigDir:t.cursorConfigDir,xdgConfigHome:t.xdgConfigHome})}),y({agent:"copilot",command:"copilot",commandExists:r,configPaths:be({home:e,copilotHome:t.copilotHome})}),y({agent:"grok",command:"grok",commandExists:r,configPaths:xe({home:e,grokHome:t.grokHome})}),y({agent:"codex",command:"codex",commandExists:r,configPaths:[o]})]}import{existsSync as H,readFileSync as tr}from"node:fs";var rr="ToolNet Memory - ",or=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop"];function h(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Ie(t){if(!H(t))return{};let e;try{e=JSON.parse(tr(t,"utf8"))}catch(r){return{error:r instanceof Error?r.message:String(r)}}return h(e)?{value:e}:{error:"root must be a JSON object"}}function nr(t){if(!t||!h(t.mcpServers))return!1;let e=t.mcpServers["toolnet-memory"];return h(e)?typeof e.command=="string"&&e.command.trim().length>0&&Array.isArray(e.args)&&e.args.length===1&&e.args[0]==="mcp"&&e.disabled!==!0:!1}function ir(t){if(!(!h(t)||!h(t.action)))return typeof t.action.command=="string"?t.action.command:void 0}function sr(t){if(!t||t.version!=="v1"||!Array.isArray(t.hooks))return[];let e=new Set;for(let r of t.hooks){if(!h(r)||typeof r.name!="string"||!r.name.startsWith(rr))continue;let o=ir(r);!o||!o.includes("session:kiro-hook")||r.enabled!==!1&&typeof r.trigger=="string"&&e.add(r.trigger)}return[...e]}function Pe(t={}){let e=t.configFile??Se(),r=t.hooksFile??Ce(),o=Ie(e),i=Ie(r),s=!o.error&&nr(o.value),a=i.error?[]:sr(i.value),l=or.every(g=>a.includes(g)),p=[];o.error&&p.push(`MCP config: ${o.error}`),i.error&&p.push(`Hooks config: ${i.error}`);let d=s&&l,m=H(e)||H(r),u=p.length>0?"invalid":d?"ready":m?"partial":"not-installed";return{installed:d,state:u,mcp:{configured:s,configFile:e,error:o.error},hooks:{configured:l,hooksFile:r,triggers:a,error:i.error},errors:p}}var ar={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},cr={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function ur(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let t=process.env.TERM_PROGRAM,e=process.env.WT_SESSION,r=process.env.VSCODE_PID,o=process.env.ConEmuPID;return!!(e||r||o||t==="vscode")}return process.env.TERM!=="linux"}var G;function _e(){return G||(G=ur()?ar:cr),G}var S={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 lr(t){return t.noColor||process.env.NO_COLOR?!1:t.tty??process.stdout.isTTY??!1}function x(t,e,r){return lr(r)?`${e}${t}${S.reset}`:t}function L(t,e){return x(t,S.dim,e)}function pr(t,e){return x(t,S.bold,e)}function dr(t,e){return x(t,S.cyan,e)}function gr(t,e){return x(t,S.red,e)}function mr(t,e){return x(t,S.white,e)}function Me(t,e,r){let o=_e(),i=e?` ${L(`v${e}`,r)}`:"";return`${dr(o.phaseDone,r)} ${t}${i}`}function v(t,e){return pr(t,e)}function f(t,e,r,o){let i=" ".repeat(Math.max(0,r-t.length));return` ${L(t,o)}${i} ${mr(e,o)}`}function we(t){return gr("\u2717",t)}function fr(t){return{tty:t.tty,noColor:t.noColor}}async function yr(t){let e=fr(t);console.log(""),console.log(Me("ToolNet Status",void 0,e)),console.log("");try{let r=new _().detect(),o=V(),i=Z();console.log(v("PROJECT",e)),console.log(f("Name",r.name,8,e));let s=ne(re({provider:o.storage.provider,r2:o.storage.r2,s3:o.storage.s3,huggingface:o.storage.huggingface,localRoot:o.storage.localRoot}),{attempts:3}),a=new D(s,r.id,r.name,r.remote??r.name),l="unknown",p="unknown";try{l=await a.exists(`${r.id}/memory.json`)?"ready":"not initialized"}catch{l="error"}try{p=await a.exists(`${r.id}/code-graph.json`)?"ready":"not built"}catch{p="error"}console.log(f("Memory",l,8,e)),console.log(f("Index",p,8,e)),console.log(""),console.log(v("AI",e)),console.log(f("Provider",i.llm.provider,8,e)),console.log(f("Model",i.llm.model??"not set",8,e)),console.log("");let d=ve(),m=d.filter(g=>g.detected).map(g=>g.agent);if(m.length>0){if(console.log(v("INTEGRATIONS",e)),console.log(f("Detected",m.join(", "),8,e)),d.find(I=>I.agent==="kiro")?.detected){let I=Pe();console.log(f("Kiro",I.installed?"ready":I.state,8,e))}console.log("")}let u=de(r);if(u.agents.length>0){console.log(v("SERVICE",e));let g=u.syncHealth==="healthy"?"running":u.syncHealth==="degraded"?"degraded":"stopped";console.log(f("Daemon",g,8,e)),console.log("")}}catch(r){console.log(we(e)+" Failed to get status"),console.log(""),console.log(L(` ${r instanceof Error?r.message:String(r)}`,e)),console.log(""),process.exitCode=1}}async function hr(){let t=process.argv.slice(2),e={tty:process.stdout.isTTY,noColor:process.env.NO_COLOR!==void 0||t.includes("--no-color")};await yr(e)}hr().catch(t=>{console.error(""),console.error(t instanceof Error?t.message:String(t)),console.error(""),process.exitCode=1});
|
|
1
|
+
import{existsSync as Re,readFileSync as De}from"node:fs";import{homedir as Te}from"node:os";import{join as Le}from"node:path";function Ne(t){let e=t.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 Ke(){let t=process.env.TOOLNET_GLOBAL_ENV??Le(Te(),".config","toolnet-memory",".env");if(!Re(t))return;let e=De(t,"utf8");for(let r of e.split(/\r?\n/)){let o=r.trim();if(!o||o.startsWith("#"))continue;o.startsWith("export ")&&(o=o.slice(7));let i=o.indexOf("=");if(i<=0)continue;let a=o.slice(0,i).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(a)&&process.env[a]===void 0&&(process.env[a]=Ne(o.slice(i+1)))}}Ke();function k(t,e){return t===void 0?e:["1","true","yes","on"].includes(t.toLowerCase())}function C(t,e){if(!t)return e;let r=Number(t);return Number.isFinite(r)?r:e}function V(){return{memory:{autoCapture:k(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:k(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:k(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:k(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:C(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:C(process.env.MEMORY_RERANK_TOP,10),finalContext:C(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:C(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:k(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:C(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as Ue}from"node:crypto";import{existsSync as N,mkdirSync as Fe,readFileSync as $e,renameSync as Be,writeFileSync as He}from"node:fs";import{basename as Ge,dirname as I,join as j,parse as z,resolve as A}from"node:path";var J=".toolnet",Ve="project.json";function We(t){return Ue("sha256").update(t).digest("hex").slice(0,16)}function K(t){return j(t,J,Ve)}function Ye(t){return N(K(t))}function ze(t,e){let r=A(t),o=z(r).root;for(;;){if(Ye(r))return r;if(r===o||e&&r===A(e))break;let i=I(r);if(i===r)break;r=i}return null}function Je(t){let e=A(t),r=z(e).root,o=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(o.some(a=>N(j(e,a))))return e;if(e===r)break;let i=I(e);if(i===e)break;e=i}return A(t)}function qe(t){let e;try{e=JSON.parse($e(t,"utf8"))}catch(i){throw new Error(`Invalid ToolNet project manifest: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(!e||typeof e!="object")throw new Error(`Invalid ToolNet project manifest: ${t}`);let r=e;if(typeof r.id!="string"||!r.id.trim())throw new Error(`ToolNet project manifest is missing id: ${t}`);if(typeof r.name!="string"||!r.name.trim())throw new Error(`ToolNet project manifest is missing name: ${t}`);let o=new Date().toISOString();return{version:1,id:r.id,name:r.name,remote:typeof r.remote=="string"&&r.remote.trim()?r.remote:r.name,rootPath:typeof r.rootPath=="string"?r.rootPath:I(I(t)),createdAt:typeof r.createdAt=="string"?r.createdAt:o,updatedAt:typeof r.updatedAt=="string"?r.updatedAt:o,graphVersion:typeof r.graphVersion=="number"?r.graphVersion:0,memoryVersion:typeof r.memoryVersion=="number"?r.memoryVersion:0,metadata:r.metadata&&typeof r.metadata=="object"?r.metadata:void 0}}function W(t,e){let r=j(t,J);Fe(r,{recursive:!0});let o=K(t),i=`${o}.tmp-${process.pid}`;He(i,JSON.stringify(e,null,2)+`
|
|
3
|
+
`,{encoding:"utf8",mode:384}),Be(i,o)}function Y(t,e){return{id:t.id,name:t.name,remote:t.remote,rootPath:e,createdAt:t.createdAt,updatedAt:t.updatedAt,graphVersion:t.graphVersion,memoryVersion:t.memoryVersion,metadata:t.metadata}}var _=class{detect(e=process.cwd()){let r=A(e),o=Je(r),a=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(m=>N(j(o,m))),s=ze(r,a?o:void 0);if(s){let m=K(s),u=qe(m);return u.rootPath!==s&&(u.rootPath=s,u.updatedAt=new Date().toISOString(),W(s,u)),Y(u,s)}let l=new Date().toISOString(),p=Ge(o),d={version:1,id:We(o),name:p,remote:p,rootPath:o,createdAt:l,updatedAt:l,graphVersion:0,memoryVersion:0};return W(o,d),Y(d,o)}};var q=[{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 M(t){let e=q.find(r=>r.id===t);if(!e)throw new Error(`Unsupported AI provider: ${t}`);return e}function w(t){return q.some(e=>e.id===t)}function n(t){return process.env[t]?.trim()||void 0}function c(...t){return t.find(e=>!!e?.trim())}function Q(){if(n("GROQ_API_KEY"))return"groq";if(n("DEEPSEEK_API_KEY"))return"deepseek";if(n("NVIDIA_API_KEY")||n("NVIDIA_NIM_API_KEY"))return"nvidia";if(n("OPENROUTER_API_KEY"))return"openrouter";if(n("ALIBABA_API_KEY")||n("DASHSCOPE_API_KEY"))return"alibaba";if(n("GEMINI_API_KEY")||n("GOOGLE_API_KEY"))return"gemini";if(n("CLOUDFLARE_API_TOKEN")&&n("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(n("HF_TOKEN"))return"huggingface";if(n("OLLAMA_MODEL")||n("OLLAMA_BASE_URL"))return"ollama"}function Qe(){let t=n("TOOLNET_LLM_PROVIDER");return t&&w(t)?t:Q()??"openai-compatible"}function U(t){let e=M(t);switch(t){case"alibaba":return{provider:t,apiKey:c(n("ALIBABA_API_KEY"),n("DASHSCOPE_API_KEY")),baseUrl:c(n("ALIBABA_BASE_URL"),n("DASHSCOPE_BASE_URL"),e.defaultBaseUrl),model:c(n("ALIBABA_MODEL"),n("DASHSCOPE_MODEL"))};case"openrouter":return{provider:t,apiKey:n("OPENROUTER_API_KEY"),baseUrl:c(n("OPENROUTER_BASE_URL"),e.defaultBaseUrl),model:n("OPENROUTER_MODEL")};case"groq":return{provider:t,apiKey:n("GROQ_API_KEY"),baseUrl:c(n("GROQ_BASE_URL"),e.defaultBaseUrl),model:n("GROQ_MODEL")};case"deepseek":return{provider:t,apiKey:n("DEEPSEEK_API_KEY"),baseUrl:c(n("DEEPSEEK_BASE_URL"),e.defaultBaseUrl),model:c(n("DEEPSEEK_MODEL"),e.defaultModel)};case"nvidia":return{provider:t,apiKey:c(n("NVIDIA_API_KEY"),n("NVIDIA_NIM_API_KEY")),baseUrl:c(n("NVIDIA_BASE_URL"),n("NVIDIA_NIM_BASE_URL"),e.defaultBaseUrl),model:c(n("NVIDIA_MODEL"),n("NVIDIA_NIM_MODEL"),e.defaultModel)};case"gemini":return{provider:t,apiKey:c(n("GEMINI_API_KEY"),n("GOOGLE_API_KEY")),baseUrl:c(n("GEMINI_BASE_URL"),e.defaultBaseUrl),model:n("GEMINI_MODEL")};case"huggingface":return{provider:t,apiKey:n("HF_TOKEN"),baseUrl:c(n("HF_INFERENCE_BASE_URL"),e.defaultBaseUrl),model:c(n("HF_LLM_MODEL"),n("HF_MODEL"))};case"ollama":return{provider:t,apiKey:n("OLLAMA_API_KEY"),baseUrl:c(n("OLLAMA_BASE_URL"),e.defaultBaseUrl),model:n("OLLAMA_MODEL")};case"cloudflare":return{provider:t,accountId:n("CLOUDFLARE_ACCOUNT_ID"),apiKey:n("CLOUDFLARE_API_TOKEN"),baseUrl:n("CLOUDFLARE_AI_BASE_URL"),model:n("CLOUDFLARE_MODEL")};case"custom":return{provider:t,apiKey:n("CUSTOM_AI_API_KEY"),baseUrl:n("CUSTOM_AI_BASE_URL"),model:n("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:c(n("OPENAI_API_KEY"),n("MODEL_API_KEY")),baseUrl:c(n("OPENAI_BASE_URL"),n("MODEL_BASE_URL")),model:c(n("OPENAI_MODEL"),n("MODEL_NAME"))}}}function Ze(){let t=n("TOOLNET_LLM_PROVIDER"),e=t&&w(t)?t:Qe(),r=M(e),o=U(e);return{provider:e,apiKey:c(n("TOOLNET_LLM_API_KEY"),o.apiKey),baseUrl:c(n("TOOLNET_LLM_BASE_URL"),o.baseUrl,r.defaultBaseUrl),model:c(n("TOOLNET_LLM_MODEL"),o.model,r.defaultModel),accountId:c(n("TOOLNET_LLM_ACCOUNT_ID"),o.accountId)}}function Xe(){let t=n("TOOLNET_EMBEDDING_PROVIDER");return t==="local"?"local":t&&w(t)?t:n("HF_TOKEN")||n("HF_EMBEDDING_MODEL")?"huggingface":"local"}function et(){let t=Xe();if(t==="local")return{provider:"local",model:c(n("TOOLNET_EMBEDDING_MODEL"),n("LOCAL_EMBEDDING_MODEL"))};let e=M(t),r,o,i,a;switch(t){case"huggingface":r=n("HF_TOKEN"),o=n("HF_INFERENCE_BASE_URL"),i=n("HF_EMBEDDING_MODEL");break;case"openai-compatible":r=n("OPENAI_API_KEY"),o=n("OPENAI_BASE_URL"),i=n("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":r=n("CLOUDFLARE_API_TOKEN"),o=n("CLOUDFLARE_AI_BASE_URL"),i=n("CLOUDFLARE_EMBEDDING_MODEL"),a=n("CLOUDFLARE_ACCOUNT_ID");break;default:r=U(t).apiKey,o=U(t).baseUrl,i=n(`${t.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let s=c(n("TOOLNET_EMBEDDING_ACCOUNT_ID"),a),l=c(n("TOOLNET_EMBEDDING_BASE_URL"),o,e.defaultBaseUrl),p=t==="cloudflare"&&!l&&s?`https://api.cloudflare.com/client/v4/accounts/${s}/ai/v1`:l;return{provider:t,apiKey:c(n("TOOLNET_EMBEDDING_API_KEY"),r),baseUrl:p,model:c(n("TOOLNET_EMBEDDING_MODEL"),i),accountId:s}}function Z(){let t=Ze(),e=et();return{llm:t,embedding:e,legacy:{llm:!n("TOOLNET_LLM_PROVIDER")&&!!Q(),embedding:!n("TOOLNET_EMBEDDING_PROVIDER")&&!!(n("HF_TOKEN")||n("HF_EMBEDDING_MODEL"))}}}import{homedir as xt}from"node:os";import{join as Et}from"node:path";import{DeleteObjectCommand as tt,GetObjectCommand as rt,HeadObjectCommand as ot,ListObjectsV2Command as nt,PutObjectCommand as it,S3Client as st}from"@aws-sdk/client-s3";import{getSignedUrl as at}from"@aws-sdk/s3-request-presigner";var R=class{name="huggingface";client;bucket;constructor(e){this.bucket=e.bucket,this.client=new st({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,r,o="application/octet-stream"){let i=typeof r=="string"?Buffer.from(r,"utf8"):r;await this.client.send(new it({Bucket:this.bucket,Key:e,Body:i,ContentType:o}))}async get(e){let r=await at(this.client,new rt({Bucket:this.bucket,Key:e}),{expiresIn:60}),o=await fetch(r,{redirect:"follow"});if(o.status===404)return null;if(!o.ok)throw new Error(`HF download failed: ${o.status} ${o.statusText}`);return new Uint8Array(await o.arrayBuffer())}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await this.client.send(new ot({Bucket:this.bucket,Key:e})),!0}catch(r){if(typeof r=="object"&&r!==null&&"$metadata"in r&&r.$metadata?.httpStatusCode===404)return!1;throw r}}async delete(e){await this.client.send(new tt({Bucket:this.bucket,Key:e}))}async list(e=""){let r=[],o;do{let i=await this.client.send(new nt({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:o}));for(let a of i.Contents??[])a.Key&&r.push({key:a.Key,size:a.Size,updatedAt:a.LastModified?.toISOString()});o=i.IsTruncated?i.NextContinuationToken:void 0}while(o);return r}};import{access as X,mkdir as ct,readFile as ut,readdir as lt,rm as pt,stat as ee,writeFile as dt}from"node:fs/promises";import{dirname as gt,join as mt,relative as te,resolve as ft}from"node:path";var O=class{constructor(e){this.root=e}root;name="local";path(e){let r=e.replace(/^\/+/,"");return ft(this.root,r)}async put(e,r){let o=this.path(e);await ct(gt(o),{recursive:!0}),await dt(o,r)}async get(e){try{return await ut(this.path(e))}catch(r){if(typeof r=="object"&&r!==null&&"code"in r&&r.code==="ENOENT")return null;throw r}}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await X(this.path(e)),!0}catch{return!1}}async delete(e){await pt(this.path(e),{force:!0})}async list(e=""){let r=this.path(e),o=[];try{await X(r)}catch{return o}let i=async s=>{let l=await lt(s,{withFileTypes:!0});for(let p of l){let d=mt(s,p.name);if(p.isDirectory()){await i(d);continue}let m=await ee(d);o.push({key:te(this.root,d),size:m.size,updatedAt:m.mtime.toISOString()})}},a=await ee(r);return a.isDirectory()?await i(r):o.push({key:te(this.root,r),size:a.size,updatedAt:a.mtime.toISOString()}),o}};import{DeleteObjectCommand as yt,GetObjectCommand as ht,HeadObjectCommand as St,ListObjectsV2Command as kt,PutObjectCommand as Ct,S3Client as At}from"@aws-sdk/client-s3";import{getSignedUrl as Ot}from"@aws-sdk/s3-request-presigner";var x=class{name;client;bucket;constructor(e){this.name=e.name??"s3",this.bucket=e.bucket,this.client=new At({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,r,o="application/octet-stream"){let i=typeof r=="string"?Buffer.from(r,"utf8"):r;await this.client.send(new Ct({Bucket:this.bucket,Key:e,Body:i,ContentType:o}))}async get(e){let r=await Ot(this.client,new ht({Bucket:this.bucket,Key:e}),{expiresIn:60}),o=await fetch(r,{redirect:"follow"});if(o.status===404)return null;if(!o.ok)throw new Error(`${this.name} download failed: ${o.status} ${o.statusText}`);return new Uint8Array(await o.arrayBuffer())}async getText(e){let r=await this.get(e);return r?Buffer.from(r).toString("utf8"):null}async exists(e){try{return await this.client.send(new St({Bucket:this.bucket,Key:e})),!0}catch(r){if(typeof r=="object"&&r!==null&&"$metadata"in r&&r.$metadata?.httpStatusCode===404)return!1;throw r}}async delete(e){await this.client.send(new yt({Bucket:this.bucket,Key:e}))}async list(e=""){let r=[],o;do{let i=await this.client.send(new kt({Bucket:this.bucket,Prefix:e||void 0,ContinuationToken:o}));for(let a of i.Contents??[])a.Key&&r.push({key:a.Key,size:a.Size,updatedAt:a.LastModified?.toISOString()});o=i.IsTruncated?i.NextContinuationToken:void 0}while(o);return r}};function F(t,e){return console.warn(e),new O(t)}function re(t){let e=t.localRoot??Et(xt(),".toolnet-memory","storage");if(t.provider==="r2"){let r=t.r2;return r?.accountId&&r.bucket&&r.accessKeyId&&r.secretAccessKey?new x({name:"r2",endpoint:`https://${r.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:r.bucket,forcePathStyle:!0,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(t.provider==="s3"){let r=t.s3;return r?.bucket&&r.accessKeyId&&r.secretAccessKey?new x({name:"s3",endpoint:r.endpoint,region:r.region??"us-east-1",bucket:r.bucket,forcePathStyle:r.forcePathStyle??!1,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] S3 credentials missing. Using local fallback.")}if(t.provider==="huggingface"){let r=t.huggingface;return r?.namespace&&r.bucket&&r.accessKeyId&&r.secretAccessKey?new R({namespace:r.namespace,bucket:r.bucket,accessKeyId:r.accessKeyId,secretAccessKey:r.secretAccessKey}):F(e,"[storage] Hugging Face credentials missing. Using local fallback.")}return new O(e)}function bt(t){return new Promise(e=>setTimeout(e,t))}async function oe(t,e={}){let r=Math.max(1,e.attempts??3),o=e.baseDelayMs??150,i=e.maxDelayMs??2e3,a;for(let s=1;s<=r;s++)try{return await t()}catch(l){if(a=l,s>=r)break;let p=Math.min(i,o*2**(s-1)),d=Math.floor(Math.random()*Math.max(1,p*.2));await bt(p+d)}throw a}var vt=new Set(["put","get","getText","delete","list"]);function ne(t,e={}){return new Proxy(t,{get(r,o){let i=Reflect.get(r,o,r);return typeof i!="function"?i:vt.has(o)?(...a)=>oe(()=>Promise.resolve(i.apply(r,a)),e):i.bind(r)}})}function ie(t){let e=t.trim().replace(/\s+/g,"_").replace(/[^A-Za-z0-9._-]/g,"_").replace(/_+/g,"_").replace(/^\.+|\.+$/g,"").slice(0,100);if(!e||e==="."||e==="..")throw new Error("Invalid project storage folder");return e}function se(t){let e=t.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 r=e.match(/^(snapshots\/[^/]+\/)memories\/(.+)$/);if(r)return`${r[1]}memory/records/${r[2]}`;if(r=e.match(/^(snapshots\/[^/]+\/)vectors\/(.+)$/),r)return`${r[1]}memory/vectors/${r[2]}`;if(r=e.match(/^(snapshots\/[^/]+\/)graph\/(.+)$/),r)return`${r[1]}code/graph/${r[2]}`;let o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)memories\/(.+)$/);if(o)return`${o[1]}memory/records/${o[2]}`;if(o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)vectors\/(.+)$/),o)return`${o[1]}memory/vectors/${o[2]}`;if(o=e.match(/^(projects\/[^/]+\/snapshots\/[^/]+\/)graph\/(.+)$/),o)return`${o[1]}code/graph/${o[2]}`;let i=e.match(/^(projects\/[^/]+\/)memories\/(.+)$/);return i?`${i[1]}memory/records/${i[2]}`:(i=e.match(/^(projects\/[^/]+\/)vectors\/(.+)$/),i?`${i[1]}memory/vectors/${i[2]}`:(i=e.match(/^(projects\/[^/]+\/)graph\/(.+)$/),i?`${i[1]}code/graph/${i[2]}`:e))}var D=class{constructor(e,r,o,i){this.provider=e;this.name=e.name,this.projectId=r,this.projectName=o,this.folder=ie(i??o),this.sourcePrefix=`projects/${r}`,this.targetPrefix=`projects/${this.folder}`}provider;name;folder;sourcePrefix;targetPrefix;projectId;projectName;registryPromise;async registerProject(){let e=`${this.targetPrefix}/project.json`,r=new Date().toISOString(),o=r,i=await this.provider.getText(e);if(i){let s;try{s=JSON.parse(i)}catch(l){throw new Error(`Invalid remote ToolNet project manifest at ${e}: ${l instanceof Error?l.message:String(l)}`)}if(typeof s.id=="string"&&s.id!==this.projectId)throw new Error(["ToolNet remote project namespace collision.",`Remote folder: ${this.targetPrefix}`,`Existing project id: ${s.id}`,`Current project id: ${this.projectId}`,"Refusing to mix data from two projects."].join(" "));typeof s.createdAt=="string"&&(o=s.createdAt)}let a={version:1,id:this.projectId,name:this.projectName,remote:this.folder,createdAt:o,updatedAt:r};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=se(e),e===this.sourcePrefix)return this.targetPrefix;if(e.startsWith(`${this.sourcePrefix}/`))return this.targetPrefix+e.slice(this.sourcePrefix.length);if(e===this.targetPrefix||e.startsWith(`${this.targetPrefix}/`))return e;if(e.startsWith("projects/"))throw new Error(["Cross-project storage access denied.",`Current project: ${this.targetPrefix}`,`Requested key: ${e}`].join(" "));return e}async put(e,r,o){return await this.ensureRegistered(),this.provider.put(this.key(e),r,o)}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 le,readFileSync as Mt,readdirSync as ce}from"node:fs";import{join as T}from"node:path";import{existsSync as Pt,mkdirSync as Cn,readFileSync as It,renameSync as An,writeFileSync as On}from"node:fs";import{dirname as En,join as _t}from"node:path";function jt(t){return _t(t.rootPath,".toolnet","work","current.json")}function ae(t){let e=jt(t);if(!Pt(e))return null;try{let r=JSON.parse(It(e,"utf8"));return r.version!==1||r.projectId!==t.id?null:r}catch{return null}}function pe(t){if(!le(t))return null;try{return JSON.parse(Mt(t,"utf8"))}catch{return null}}function wt(t){let e=T(t.rootPath,".toolnet","sessions");if(!le(e))return[];let r=[];for(let o of ce(e,{withFileTypes:!0})){if(!o.isDirectory())continue;let i=T(e,o.name);for(let a of ce(i,{withFileTypes:!0})){if(!a.isDirectory())continue;let s=pe(T(i,a.name,"state.json"));!s||s.version!==1||s.projectId!==t.id||r.push(s)}}return r}function ue(t){return t.filter(e=>!!e).sort().at(-1)}function Rt(t){let e=pe(T(t.rootPath,".toolnet","runtime","opencode-status.json"));return!e||e.projectRoot&&e.projectRoot!==t.rootPath?null:e}function de(t){let e=wt(t),o=[...e].sort((u,g)=>(u.lastLocalEventAt??u.updatedAt).localeCompare(g.lastLocalEventAt??g.updatedAt)).at(-1),i=Array.from(new Set(e.map(u=>u.agent))).sort(),a=e.reduce((u,g)=>u+Math.max(0,g.lastSequence-g.lastRemoteSequence),0),s=Rt(t),l=s?.state==="capture-failed",p=s?.state==="sync-failed",d;l?d="degraded":a>0||p?d="pending":e.length>0?d="healthy":d="unknown";let m=ae(t);return{ok:d!=="degraded",agents:i,sessions:e.length,latestAgent:o?.agent,latestSessionId:o?.nativeSessionId,lastCaptureAt:ue(e.map(u=>u.lastLocalEventAt??u.updatedAt)),lastFlushAt:ue(e.map(u=>u.lastRemoteAt)),pendingWal:a,currentTask:m?.currentTask?.title,currentFile:m?.activeFiles?.at(-1)??m?.filesTouched.at(-1),syncHealth:d,opencode:s?{state:s.state,reason:s.reason,timestamp:s.timestamp,error:s.error}:void 0}}import{existsSync as ve}from"node:fs";import{homedir as Qt}from"node:os";import{join as Zt}from"node:path";import{spawnSync as Xt}from"node:child_process";import{homedir as Dt}from"node:os";import{join as $}from"node:path";function ge(t={}){return $(t.home??Dt(),".gemini")}function Tt(t={}){return $(ge(t),"config")}function Lt(t={}){return $(ge(t),"antigravity-cli")}function me(t={}){return[Lt(t),Tt(t)]}import{homedir as Nt}from"node:os";import{join as fe}from"node:path";function ye(t={}){let e=t.xdgConfigHome??process.env.XDG_CONFIG_HOME?.trim();return e?fe(e,"opencode"):fe(t.home??Nt(),".config","opencode")}import{homedir as Kt}from"node:os";import{join as Ut}from"node:path";function he(t={}){return Ut(t.home??Kt(),".claude")}import{homedir as Ft}from"node:os";import{join as E}from"node:path";function B(t={}){return t.kiroHome??process.env.KIRO_HOME??E(t.home??Ft(),".kiro")}function $t(t={}){return E(B(t),"settings")}function Se(t={}){return E($t(t),"mcp.json")}function Bt(t={}){return E(B(t),"hooks")}function ke(t={}){return E(Bt(t),"toolnet-memory.json")}function Ce(t={}){return[B(t)]}import{homedir as Ht}from"node:os";import{join as Ae,resolve as Gn}from"node:path";function Oe(t={}){return t.cursorHome??Ae(t.home??Ht(),".cursor")}function Gt(t={}){return t.cursorConfigDir??process.env.CURSOR_CONFIG_DIR??(t.xdgConfigHome??process.env.XDG_CONFIG_HOME?Ae(t.xdgConfigHome??process.env.XDG_CONFIG_HOME,"cursor"):void 0)??Oe(t)}function xe(t={}){return Array.from(new Set([Oe(t),Gt(t)]))}import{homedir as Vt}from"node:os";import{join as Wt,resolve as zn}from"node:path";function Yt(t={}){return t.copilotHome??process.env.COPILOT_HOME??Wt(t.home??Vt(),".copilot")}function Ee(t={}){return[Yt(t)]}import{homedir as zt}from"node:os";import{join as Jt,resolve as Zn}from"node:path";function qt(t={}){return t.grokHome??process.env.GROK_HOME??Jt(t.home??zt(),".grok")}function be(t={}){return[qt(t)]}function er(t){return Xt("sh",["-lc",`command -v ${JSON.stringify(t)} >/dev/null 2>&1`],{stdio:"ignore"}).status===0}function y(t){let e=t.commandExists(t.command),r=t.configPaths.filter(a=>ve(a)),o=r.length>0,i=[];e&&i.push(`command:${t.command}`);for(let a of r)i.push(`config:${a}`);return{agent:t.agent,detected:e||o,commandDetected:e,configDetected:o,evidence:i}}function tr(t){let e=t.commands.filter(s=>t.commandExists(s)),r=t.configPaths.filter(s=>ve(s)),o=e.length>0,i=r.length>0,a=[...e.map(s=>`command:${s}`),...r.map(s=>`config:${s}`)];return{agent:t.agent,detected:o||i,commandDetected:o,configDetected:i,evidence:a}}function Pe(t={}){let e=t.home??Qt(),r=t.commandExists??er,o=t.codexHome??process.env.CODEX_HOME??Zt(e,".codex");return[y({agent:"agy",command:"agy",commandExists:r,configPaths:me({home:e})}),y({agent:"opencode",command:"opencode",commandExists:r,configPaths:[ye({home:e,xdgConfigHome:t.xdgConfigHome})]}),y({agent:"claude",command:"claude",commandExists:r,configPaths:[he({home:e})]}),y({agent:"kiro",command:"kiro-cli",commandExists:r,configPaths:Ce({home:e,kiroHome:t.kiroHome})}),tr({agent:"cursor",commands:["agent","cursor-agent"],commandExists:r,configPaths:xe({home:e,cursorHome:t.cursorHome,cursorConfigDir:t.cursorConfigDir,xdgConfigHome:t.xdgConfigHome})}),y({agent:"copilot",command:"copilot",commandExists:r,configPaths:Ee({home:e,copilotHome:t.copilotHome})}),y({agent:"grok",command:"grok",commandExists:r,configPaths:be({home:e,grokHome:t.grokHome})}),y({agent:"codex",command:"codex",commandExists:r,configPaths:[o]})]}import{existsSync as H,readFileSync as rr}from"node:fs";var or="ToolNet Memory - ",nr=["SessionStart","UserPromptSubmit","PreToolUse","PostToolUse","Stop"];function h(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Ie(t){if(!H(t))return{};let e;try{e=JSON.parse(rr(t,"utf8"))}catch(r){return{error:r instanceof Error?r.message:String(r)}}return h(e)?{value:e}:{error:"root must be a JSON object"}}function ir(t){if(!t||!h(t.mcpServers))return!1;let e=t.mcpServers["toolnet-memory"];return h(e)?typeof e.command=="string"&&e.command.trim().length>0&&Array.isArray(e.args)&&e.args.length===1&&e.args[0]==="mcp"&&e.disabled!==!0:!1}function sr(t){if(!(!h(t)||!h(t.action)))return typeof t.action.command=="string"?t.action.command:void 0}function ar(t){if(!t||t.version!=="v1"||!Array.isArray(t.hooks))return[];let e=new Set;for(let r of t.hooks){if(!h(r)||typeof r.name!="string"||!r.name.startsWith(or))continue;let o=sr(r);!o||!o.includes("session:kiro-hook")||r.enabled!==!1&&typeof r.trigger=="string"&&e.add(r.trigger)}return[...e]}function _e(t={}){let e=t.configFile??Se(),r=t.hooksFile??ke(),o=Ie(e),i=Ie(r),a=!o.error&&ir(o.value),s=i.error?[]:ar(i.value),l=nr.every(g=>s.includes(g)),p=[];o.error&&p.push(`MCP config: ${o.error}`),i.error&&p.push(`Hooks config: ${i.error}`);let d=a&&l,m=H(e)||H(r),u=p.length>0?"invalid":d?"ready":m?"partial":"not-installed";return{installed:d,state:u,mcp:{configured:a,configFile:e,error:o.error},hooks:{configured:l,hooksFile:r,triggers:s,error:i.error},errors:p}}var cr={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},ur={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function lr(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let t=process.env.TERM_PROGRAM,e=process.env.WT_SESSION,r=process.env.VSCODE_PID,o=process.env.ConEmuPID;return!!(e||r||o||t==="vscode")}return process.env.TERM!=="linux"}var G;function je(){return G||(G=lr()?cr:ur),G}var S={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 pr(t){return t.noColor||process.env.NO_COLOR?!1:t.tty??process.stdout.isTTY??!1}function b(t,e,r){return pr(r)?`${e}${t}${S.reset}`:t}function L(t,e){return b(t,S.dim,e)}function dr(t,e){return b(t,S.bold,e)}function gr(t,e){return b(t,S.cyan,e)}function mr(t,e){return b(t,S.red,e)}function fr(t,e){return b(t,S.white,e)}function Me(t,e,r){let o=je(),i=e?` ${L(`v${e}`,r)}`:"";return`${gr(o.phaseDone,r)} ${t}${i}`}function v(t,e){return dr(t,e)}function f(t,e,r,o){let i=" ".repeat(Math.max(0,r-t.length));return` ${L(t,o)}${i} ${fr(e,o)}`}function we(t){return mr("\u2717",t)}function yr(t){return{tty:t.tty,noColor:t.noColor}}async function hr(t){let e=yr(t);console.log(""),console.log(Me("ToolNet Status",void 0,e)),console.log("");try{let r=new _().detect(),o=V(),i=Z();console.log(v("PROJECT",e)),console.log(f("Name",r.name,8,e));let a=ne(re({provider:o.storage.provider,r2:o.storage.r2,s3:o.storage.s3,huggingface:o.storage.huggingface,localRoot:o.storage.localRoot}),{attempts:3}),s=new D(a,r.id,r.name,r.remote??r.name),l="unknown",p="unknown";try{l=await s.exists(`${r.id}/memory.json`)?"ready":"not initialized"}catch{l="error"}try{p=await s.exists(`${r.id}/code-graph.json`)?"ready":"not built"}catch{p="error"}console.log(f("Memory",l,8,e)),console.log(f("Index",p,8,e)),console.log(""),console.log(v("AI",e)),console.log(f("Provider",i.llm.provider,8,e)),console.log(f("Model",i.llm.model??"not set",8,e)),console.log("");let d=Pe(),m=d.filter(g=>g.detected).map(g=>g.agent);if(m.length>0){if(console.log(v("INTEGRATIONS",e)),console.log(f("Detected",m.join(", "),8,e)),d.find(P=>P.agent==="kiro")?.detected){let P=_e();console.log(f("Kiro",P.installed?"ready":P.state,8,e))}console.log("")}let u=de(r);if(u.agents.length>0){console.log(v("SERVICE",e));let g=u.syncHealth==="healthy"?"running":u.syncHealth==="degraded"?"degraded":"stopped";console.log(f("Daemon",g,8,e)),console.log("")}}catch(r){console.log(we(e)+" Failed to get status"),console.log(""),console.log(L(` ${r instanceof Error?r.message:String(r)}`,e)),console.log(""),process.exitCode=1}}async function Sr(){let t=process.argv.slice(2),e={tty:process.stdout.isTTY,noColor:process.env.NO_COLOR!==void 0||t.includes("--no-color")};await hr(e)}Sr().catch(t=>{console.error(""),console.error(t instanceof Error?t.message:String(t)),console.error(""),process.exitCode=1});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "toolnet-memory",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.12",
|
|
4
4
|
"description": "Persistent project memory, work continuity, and code intelligence for AI coding agents.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -91,7 +91,17 @@
|
|
|
91
91
|
"session:new-agents:test": "vitest run tests/session/new-agent-event-mappers.test.ts tests/session/new-agent-hook-installers.test.ts tests/session/new-agent-runtime.test.ts",
|
|
92
92
|
"session:new-agents-continuity:test": "vitest run tests/session/new-agent-continuity.test.ts tests/session/new-agent-continuity-installers.test.ts",
|
|
93
93
|
"session:new-agents-integration:test": "vitest run tests/session/new-agent-integrations.test.ts tests/production/new-agent-auto-integrate.test.ts tests/production/new-agent-production-wiring.test.ts",
|
|
94
|
-
"release:certify:8": "vitest run tests/integration/cross-agent-continuity.test.ts tests/production/eight-agent-release-contract.test.ts"
|
|
94
|
+
"release:certify:8": "vitest run tests/integration/cross-agent-continuity.test.ts tests/production/eight-agent-release-contract.test.ts",
|
|
95
|
+
"session:integration-scope:test": "vitest run tests/session/integration-scope.test.ts tests/session/hook-event-dedupe.test.ts",
|
|
96
|
+
"session:cursor-dual-scope:test": "vitest run tests/session/cursor-dual-scope.test.ts tests/session/cursor-dual-scope-wiring.test.ts",
|
|
97
|
+
"session:copilot-dual-scope:test": "vitest run tests/session/copilot-dual-scope.test.ts tests/session/copilot-dual-scope-wiring.test.ts",
|
|
98
|
+
"session:grok-dual-scope:test": "vitest run tests/session/grok-dual-scope.test.ts tests/session/grok-dual-scope-wiring.test.ts",
|
|
99
|
+
"session:scoped-status:test": "vitest run tests/session/unified-scoped-status.test.ts tests/session/unified-scoped-status-wiring.test.ts",
|
|
100
|
+
"production:auto-scope:test": "vitest run tests/production/auto-integration-scope.test.ts tests/production/auto-integrate-scoped-new-agents.test.ts tests/production/auto-integrate-scoped-wiring.test.ts",
|
|
101
|
+
"production:native-e2e-wiring:test": "vitest run tests/production/native-e2e-certification-wiring.test.ts tests/production/integration-detection-new-agents.test.ts",
|
|
102
|
+
"release:certify:native:optional": "bash scripts/native-e2e-certify.sh",
|
|
103
|
+
"release:certify:phase07": "npm run production:auto-scope:test && npm run session:scoped-status:test && npm run session:grok-dual-scope:test && npm run session:copilot-dual-scope:test && npm run session:cursor-dual-scope:test && npm run session:integration-scope:test && npm run release:certify:8 && npm run typecheck && npm run lint && npm run format:check",
|
|
104
|
+
"production:phase07-final:test": "vitest run tests/production/final-phase07-release.test.ts"
|
|
95
105
|
},
|
|
96
106
|
"dependencies": {
|
|
97
107
|
"@aws-sdk/client-s3": "^3.1102.0",
|