toolnet-memory 0.2.14 → 0.2.15
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/bundle/doctor.js +3 -3
- package/bundle/full-index.js +8 -8
- package/bundle/mcp.js +7 -7
- package/bundle/runtime.js +11 -11
- package/bundle/semantic.js +6 -6
- package/bundle/setup.js +22 -69
- package/package.json +1 -1
package/bundle/setup.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
1
|
+
import m from"node:fs";import j from"node:os";import R from"node:path";import ze from"node:readline/promises";import{stdin as f,stdout as I}from"node:process";import{HeadBucketCommand as Ze,S3Client as Qe}from"@aws-sdk/client-s3";var W=[{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 A(e){let t=W.find(o=>o.id===e);if(!t)throw new Error(`Unsupported AI provider: ${e}`);return t}function N(e){return W.some(t=>t.id===e)}function i(e){return process.env[e]?.trim()||void 0}function g(...e){return e.find(t=>!!t?.trim())}function X(){if(i("GROQ_API_KEY"))return"groq";if(i("DEEPSEEK_API_KEY"))return"deepseek";if(i("NVIDIA_API_KEY")||i("NVIDIA_NIM_API_KEY"))return"nvidia";if(i("OPENROUTER_API_KEY"))return"openrouter";if(i("ALIBABA_API_KEY")||i("DASHSCOPE_API_KEY"))return"alibaba";if(i("GEMINI_API_KEY")||i("GOOGLE_API_KEY"))return"gemini";if(i("CLOUDFLARE_API_TOKEN")&&i("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(i("HF_TOKEN"))return"huggingface";if(i("OLLAMA_MODEL")||i("OLLAMA_BASE_URL"))return"ollama"}function z(){let e=i("TOOLNET_LLM_PROVIDER");return e&&N(e)?e:X()??"openai-compatible"}function h(e){let t=A(e);switch(e){case"alibaba":return{provider:e,apiKey:g(i("ALIBABA_API_KEY"),i("DASHSCOPE_API_KEY")),baseUrl:g(i("ALIBABA_BASE_URL"),i("DASHSCOPE_BASE_URL"),t.defaultBaseUrl),model:g(i("ALIBABA_MODEL"),i("DASHSCOPE_MODEL"))};case"openrouter":return{provider:e,apiKey:i("OPENROUTER_API_KEY"),baseUrl:g(i("OPENROUTER_BASE_URL"),t.defaultBaseUrl),model:i("OPENROUTER_MODEL")};case"groq":return{provider:e,apiKey:i("GROQ_API_KEY"),baseUrl:g(i("GROQ_BASE_URL"),t.defaultBaseUrl),model:i("GROQ_MODEL")};case"deepseek":return{provider:e,apiKey:i("DEEPSEEK_API_KEY"),baseUrl:g(i("DEEPSEEK_BASE_URL"),t.defaultBaseUrl),model:g(i("DEEPSEEK_MODEL"),t.defaultModel)};case"nvidia":return{provider:e,apiKey:g(i("NVIDIA_API_KEY"),i("NVIDIA_NIM_API_KEY")),baseUrl:g(i("NVIDIA_BASE_URL"),i("NVIDIA_NIM_BASE_URL"),t.defaultBaseUrl),model:g(i("NVIDIA_MODEL"),i("NVIDIA_NIM_MODEL"),t.defaultModel)};case"gemini":return{provider:e,apiKey:g(i("GEMINI_API_KEY"),i("GOOGLE_API_KEY")),baseUrl:g(i("GEMINI_BASE_URL"),t.defaultBaseUrl),model:i("GEMINI_MODEL")};case"huggingface":return{provider:e,apiKey:i("HF_TOKEN"),baseUrl:g(i("HF_INFERENCE_BASE_URL"),t.defaultBaseUrl),model:g(i("HF_LLM_MODEL"),i("HF_MODEL"))};case"ollama":return{provider:e,apiKey:i("OLLAMA_API_KEY"),baseUrl:g(i("OLLAMA_BASE_URL"),t.defaultBaseUrl),model:i("OLLAMA_MODEL")};case"cloudflare":return{provider:e,accountId:i("CLOUDFLARE_ACCOUNT_ID"),apiKey:i("CLOUDFLARE_API_TOKEN"),baseUrl:i("CLOUDFLARE_AI_BASE_URL"),model:i("CLOUDFLARE_MODEL")};case"custom":return{provider:e,apiKey:i("CUSTOM_AI_API_KEY"),baseUrl:i("CUSTOM_AI_BASE_URL"),model:i("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:g(i("OPENAI_API_KEY"),i("MODEL_API_KEY")),baseUrl:g(i("OPENAI_BASE_URL"),i("MODEL_BASE_URL")),model:g(i("OPENAI_MODEL"),i("MODEL_NAME"))}}}function Te(){let e=i("TOOLNET_LLM_PROVIDER"),t=e&&N(e)?e:z(),o=A(t),n=h(t);return{provider:t,apiKey:g(i("TOOLNET_LLM_API_KEY"),n.apiKey),baseUrl:g(i("TOOLNET_LLM_BASE_URL"),n.baseUrl,o.defaultBaseUrl),model:g(i("TOOLNET_LLM_MODEL"),n.model,o.defaultModel),accountId:g(i("TOOLNET_LLM_ACCOUNT_ID"),n.accountId)}}function Ae(){let e=i("TOOLNET_EMBEDDING_PROVIDER");return e==="local"?"local":e&&N(e)?e:i("HF_TOKEN")||i("HF_EMBEDDING_MODEL")?"huggingface":"local"}function Se(){let e=Ae();if(e==="local")return{provider:"local",model:g(i("TOOLNET_EMBEDDING_MODEL"),i("LOCAL_EMBEDDING_MODEL"))};let t=A(e),o,n,r,s;switch(e){case"huggingface":o=i("HF_TOKEN"),n=i("HF_INFERENCE_BASE_URL"),r=i("HF_EMBEDDING_MODEL");break;case"openai-compatible":o=i("OPENAI_API_KEY"),n=i("OPENAI_BASE_URL"),r=i("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":o=i("CLOUDFLARE_API_TOKEN"),n=i("CLOUDFLARE_AI_BASE_URL"),r=i("CLOUDFLARE_EMBEDDING_MODEL"),s=i("CLOUDFLARE_ACCOUNT_ID");break;default:o=h(e).apiKey,n=h(e).baseUrl,r=i(`${e.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}return{provider:e,apiKey:g(i("TOOLNET_EMBEDDING_API_KEY"),o),baseUrl:g(i("TOOLNET_EMBEDDING_BASE_URL"),n,t.defaultBaseUrl),model:g(i("TOOLNET_EMBEDDING_MODEL"),r),accountId:g(i("TOOLNET_EMBEDDING_ACCOUNT_ID"),s)}}function Ce(){let e=Te(),t=Se();return{llm:e,embedding:t,legacy:{llm:!i("TOOLNET_LLM_PROVIDER")&&!!X(),embedding:!i("TOOLNET_EMBEDDING_PROVIDER")&&!!(i("HF_TOKEN")||i("HF_EMBEDDING_MODEL"))}}}function Z(e=z()){let t=Ce().llm;if(e===t.provider)return{id:e,apiKey:t.apiKey,baseUrl:t.baseUrl,model:t.model,accountId:t.accountId};let o=h(e);return{id:e,apiKey:o.apiKey,baseUrl:o.baseUrl,model:o.model,accountId:o.accountId}}var w=class extends Error{status;constructor(t,o){super(t),this.name="AiHttpError",this.status=o}};async function S(e,t,o=3e4){let n=new AbortController,r=setTimeout(()=>n.abort(),o);r.unref?.();try{let s=await fetch(e,{...t,signal:n.signal}),a=await s.text();if(!s.ok){let l=a;try{let c=JSON.parse(a);l=c.error?.message??c.message??a}catch{}throw new w(l||`HTTP ${s.status}`,s.status)}return a.trim()?JSON.parse(a):{}}finally{clearTimeout(r)}}function D(e,t){return`${e.replace(/\/+$/,"")}/${t.replace(/^\/+/,"")}`}var P=class{constructor(t){this.config=t}config;id="cloudflare";model(){let t=this.config.model?.trim();if(!t)throw new Error("cloudflare: MODEL is not configured");return t}async generate(t){let o=this.config.accountId?.trim(),n=this.config.apiKey?.trim();if(!o)throw new Error("cloudflare: ACCOUNT ID is not configured");if(!n)throw new Error("cloudflare: API TOKEN is not configured");let r=this.model(),a=`${(this.config.baseUrl?.trim()||`https://api.cloudflare.com/client/v4/accounts/${o}/ai/run`).replace(/\/+$/,"")}/${r}`,l=await S(a,{method:"POST",headers:{authorization:`Bearer ${n}`,"content-type":"application/json",...this.config.headers},body:JSON.stringify({messages:t.messages,temperature:t.temperature,max_tokens:t.maxTokens})}),c=l.result?.response?.trim();if(!c)throw new Error(l.errors?.[0]?.message??"cloudflare: empty model response");return{text:c,provider:"cloudflare",model:r}}async healthCheck(){let t=Date.now();try{return{ok:!0,provider:"cloudflare",model:(await this.generate({messages:[{role:"user",content:"Reply exactly: OK"}],temperature:0,maxTokens:8})).model,message:"Provider reachable",latencyMs:Date.now()-t}}catch(o){return{ok:!1,provider:"cloudflare",model:this.config.model,message:o instanceof Error?o.message:String(o),latencyMs:Date.now()-t}}}};var U=class{constructor(t){this.config=t}config;id="gemini";model(){let t=this.config.model?.trim();if(!t)throw new Error("gemini: MODEL is not configured");return t.replace(/^models\//,"")}async generate(t){let o=this.config.apiKey?.trim();if(!o)throw new Error("gemini: API KEY is not configured");let n=this.config.baseUrl?.trim()||"https://generativelanguage.googleapis.com/v1beta",r=this.model(),s=t.messages.filter(E=>E.role==="system"),a=t.messages.filter(E=>E.role!=="system").map(E=>({role:E.role==="assistant"?"model":"user",parts:[{text:E.content}]})),l=`${D(n,`models/${encodeURIComponent(r)}:generateContent`)}?key=${encodeURIComponent(o)}`,c=await S(l,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({...s.length?{systemInstruction:{parts:[{text:s.map(E=>E.content).join(`
|
|
2
|
+
|
|
3
|
+
`)}]}}:{},contents:a,generationConfig:{temperature:t.temperature,maxOutputTokens:t.maxTokens}})}),d=c.candidates?.[0]?.content?.parts?.map(E=>E.text??"").join("").trim();if(!d)throw new Error("gemini: empty model response");return{text:d,provider:"gemini",model:r,usage:c.usageMetadata?{inputTokens:c.usageMetadata.promptTokenCount,outputTokens:c.usageMetadata.candidatesTokenCount,totalTokens:c.usageMetadata.totalTokenCount}:void 0}}async healthCheck(){let t=Date.now();try{return{ok:!0,provider:"gemini",model:(await this.generate({messages:[{role:"user",content:"Reply exactly: OK"}],temperature:0,maxTokens:8})).model,message:"Provider reachable",latencyMs:Date.now()-t}}catch(o){return{ok:!1,provider:"gemini",model:this.config.model,message:o instanceof Error?o.message:String(o),latencyMs:Date.now()-t}}}};var K=class{constructor(t){this.config=t;this.id=t.id}config;id;baseUrl(){let t=this.config.baseUrl?.trim();if(!t)throw new Error(`${this.id}: BASE URL is not configured`);return t}model(){let t=this.config.model?.trim();if(!t)throw new Error(`${this.id}: MODEL is not configured`);return t}headers(){let t={"content-type":"application/json",...this.config.headers};return this.config.apiKey&&(t.authorization=`Bearer ${this.config.apiKey}`),t}async generate(t){let o=this.model(),n=await S(D(this.baseUrl(),"chat/completions"),{method:"POST",headers:this.headers(),body:JSON.stringify({model:o,messages:t.messages,temperature:t.temperature,max_tokens:t.maxTokens})}),r=n.choices?.[0]?.message?.content?.trim();if(!r)throw new Error(`${this.id}: empty model response`);return{text:r,provider:this.id,model:o,usage:n.usage?{inputTokens:n.usage.prompt_tokens,outputTokens:n.usage.completion_tokens,totalTokens:n.usage.total_tokens}:void 0}}async healthCheck(){let t=Date.now();try{let o=await this.generate({messages:[{role:"user",content:"Reply exactly: OK"}],temperature:0,maxTokens:8});return{ok:!0,provider:this.id,model:o.model,message:"Provider reachable",latencyMs:Date.now()-t}}catch(o){return{ok:!1,provider:this.id,model:this.config.model,message:o instanceof Error?o.message:String(o),latencyMs:Date.now()-t}}}};function Q(e=Z()){switch(A(e.id).transport){case"gemini":return new U(e);case"cloudflare":return new P(e);default:return new K(e)}}import{existsSync as $}from"node:fs";import{homedir as F}from"node:os";import{join as v}from"node:path";import{spawnSync as Ge}from"node:child_process";import{existsSync as ye,mkdirSync as Ie,readFileSync as Re,writeFileSync as Me}from"node:fs";import{homedir as Le}from"node:os";import{dirname as Ne,join as he}from"node:path";function De(e){return`'${e.replace(/'/g,"'\\''")}'`}function ee(e={}){let t=e.hooksFile??he(Le(),".gemini","config","hooks.json");Ie(Ne(t),{recursive:!0});let o={};if(ye(t))try{o=JSON.parse(Re(t,"utf8"))}catch(s){throw new Error(`Invalid existing Agy hooks.json: ${s instanceof Error?s.message:String(s)}`)}let n=e.binary??"toolnet-memory",r=`${De(n)} session:agy-hook`;return o["toolnet-memory"]={enabled:!0,PreInvocation:[{type:"command",command:`${r} pre`,timeout:15}],PostInvocation:[{type:"command",command:`${r} post`,timeout:15}],Stop:[{type:"command",command:`${r} stop`,timeout:30}]},Me(t,JSON.stringify(o,null,2)+`
|
|
4
|
+
`,{encoding:"utf8",mode:384}),t}import{existsSync as Pe,mkdirSync as oe,readFileSync as Ue,writeFileSync as ne}from"node:fs";import{homedir as B}from"node:os";import{join as b}from"node:path";var te="<!-- TOOLNET_MEMORY_BOOTSTRAP_START -->",k="<!-- TOOLNET_MEMORY_BOOTSTRAP_END -->";function Ke(){let e=b(B(),".config","opencode","AGENTS.md");oe(b(B(),".config","opencode"),{recursive:!0});let t=`${te}
|
|
3
5
|
## ToolNet Memory
|
|
4
6
|
|
|
5
7
|
ToolNet Memory is available for projects that already contain a valid \`.toolnet/project.json\`.
|
|
@@ -14,10 +16,10 @@ Rules:
|
|
|
14
16
|
6. Raw transcripts must not be injected into prompts.
|
|
15
17
|
7. Current repository evidence has priority over stale memory when they conflict.
|
|
16
18
|
|
|
17
|
-
${
|
|
19
|
+
${k}`,o=Pe(e)?Ue(e,"utf8"):"",n=o.indexOf(te),r=o.indexOf(k);return n>=0&&r>=n?o=o.slice(0,n)+t+o.slice(r+k.length):(o=o.trimEnd(),o&&(o+=`
|
|
18
20
|
|
|
19
|
-
`),o+=t)
|
|
20
|
-
`,{encoding:"utf8",mode:384}),e}function
|
|
21
|
+
`),o+=t),ne(e,o.trimEnd()+`
|
|
22
|
+
`,{encoding:"utf8",mode:384}),e}function re(e={}){let t=e.directory??b(B(),".config","opencode","plugins");oe(t,{recursive:!0}),Ke();let o=b(t,"toolnet-memory.js"),n=e.binary??process.env.TOOLNET_MEMORY_BIN??"toolnet-memory",r=`
|
|
21
23
|
// Generated by ToolNet Memory.
|
|
22
24
|
// OpenCode integration:
|
|
23
25
|
// - project gated
|
|
@@ -31,7 +33,7 @@ import path from "node:path"
|
|
|
31
33
|
import os from "node:os"
|
|
32
34
|
|
|
33
35
|
const TOOLNET_BINARY =
|
|
34
|
-
${JSON.stringify(
|
|
36
|
+
${JSON.stringify(n)}
|
|
35
37
|
|
|
36
38
|
const CONTEXT_MAX_TOKENS = 700
|
|
37
39
|
|
|
@@ -645,66 +647,17 @@ export const ToolNetMemoryPlugin =
|
|
|
645
647
|
},
|
|
646
648
|
}
|
|
647
649
|
}
|
|
648
|
-
`;return
|
|
649
|
-
`),a
|
|
650
|
-
`);
|
|
651
|
-
`,{encoding:"utf8",mode:384}),
|
|
652
|
-
`),
|
|
653
|
-
`)||(
|
|
654
|
-
`),
|
|
655
|
-
`,{encoding:"utf8",mode:384}),t}function
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
# Cloudflare R2
|
|
662
|
-
R2_ACCOUNT_ID=${e.get("R2_ACCOUNT_ID")??""}
|
|
663
|
-
R2_BUCKET=${e.get("R2_BUCKET")??"toolnet-memory"}
|
|
664
|
-
R2_ACCESS_KEY_ID=${e.get("R2_ACCESS_KEY_ID")??""}
|
|
665
|
-
R2_SECRET_ACCESS_KEY=${e.get("R2_SECRET_ACCESS_KEY")??""}
|
|
666
|
-
|
|
667
|
-
# Generic S3 / S3-compatible storage
|
|
668
|
-
# Leave S3_ENDPOINT empty for AWS S3.
|
|
669
|
-
S3_ENDPOINT=${e.get("S3_ENDPOINT")??""}
|
|
670
|
-
S3_REGION=${e.get("S3_REGION")??"us-east-1"}
|
|
671
|
-
S3_BUCKET=${e.get("S3_BUCKET")??"toolnet-memory"}
|
|
672
|
-
S3_ACCESS_KEY_ID=${e.get("S3_ACCESS_KEY_ID")??""}
|
|
673
|
-
S3_SECRET_ACCESS_KEY=${e.get("S3_SECRET_ACCESS_KEY")??""}
|
|
674
|
-
S3_FORCE_PATH_STYLE=${e.get("S3_FORCE_PATH_STYLE")??"false"}
|
|
675
|
-
|
|
676
|
-
# Hugging Face S3 (legacy compatibility)
|
|
677
|
-
HF_NAMESPACE=${e.get("HF_NAMESPACE")??""}
|
|
678
|
-
HF_BUCKET=${e.get("HF_BUCKET")??"toolnet-memory"}
|
|
679
|
-
HF_S3_ACCESS_KEY_ID=${e.get("HF_S3_ACCESS_KEY_ID")??""}
|
|
680
|
-
HF_S3_SECRET_ACCESS_KEY=${e.get("HF_S3_SECRET_ACCESS_KEY")??""}
|
|
681
|
-
|
|
682
|
-
# Embedding
|
|
683
|
-
HF_TOKEN=${e.get("HF_TOKEN")??""}
|
|
684
|
-
HF_EMBEDDING_MODEL=${e.get("HF_EMBEDDING_MODEL")??"sentence-transformers/all-MiniLM-L6-v2"}
|
|
685
|
-
|
|
686
|
-
# Local cache
|
|
687
|
-
MEMORY_LOCAL_STORAGE_PATH=${e.get("MEMORY_LOCAL_STORAGE_PATH")??""}
|
|
688
|
-
MEMORY_LOCAL_CACHE_MB=${e.get("MEMORY_LOCAL_CACHE_MB")??"200"}
|
|
689
|
-
|
|
690
|
-
# Automation
|
|
691
|
-
MEMORY_AUTO_CAPTURE=${e.get("MEMORY_AUTO_CAPTURE")??"true"}
|
|
692
|
-
MEMORY_AUTO_RETRIEVE=${e.get("MEMORY_AUTO_RETRIEVE")??"true"}
|
|
693
|
-
MEMORY_AUTO_SUMMARIZE=${e.get("MEMORY_AUTO_SUMMARIZE")??"true"}
|
|
694
|
-
MEMORY_AUTO_SYNC=${e.get("MEMORY_AUTO_SYNC")??"true"}
|
|
695
|
-
|
|
696
|
-
# Retrieval
|
|
697
|
-
MEMORY_MAX_CANDIDATES=${e.get("MEMORY_MAX_CANDIDATES")??"50"}
|
|
698
|
-
MEMORY_RERANK_TOP=${e.get("MEMORY_RERANK_TOP")??"10"}
|
|
699
|
-
MEMORY_FINAL_CONTEXT=${e.get("MEMORY_FINAL_CONTEXT")??"5"}
|
|
700
|
-
MEMORY_TOKEN_BUDGET=${e.get("MEMORY_TOKEN_BUDGET")??"2000"}
|
|
701
|
-
|
|
702
|
-
# Automatic Session Memory
|
|
703
|
-
TOOLNET_SESSION_LEARNING=${e.get("TOOLNET_SESSION_LEARNING")??"1"}
|
|
704
|
-
TOOLNET_WORK_CONTINUITY=${e.get("TOOLNET_WORK_CONTINUITY")??"1"}
|
|
705
|
-
TOOLNET_SEMANTIC_CONTINUITY=${e.get("TOOLNET_SEMANTIC_CONTINUITY")??"1"}
|
|
706
|
-
TOOLNET_SMART_HANDOFF=${e.get("TOOLNET_SMART_HANDOFF")??"1"}
|
|
707
|
-
`;S.writeFileSync(p,o,{encoding:"utf8",mode:384}),S.chmodSync(x,448),S.chmodSync(p,384)}function q(e,t=!0){let o=e.trim().toLowerCase();return o?o==="y"||o==="yes":t}async function Re(e){return g.isTTY?(E.write(e),new Promise(t=>{let o="",r=()=>{g.off("data",n),g.setRawMode?.(!1),g.pause(),E.write(`
|
|
708
|
-
`),t(o)},n=i=>{for(let s of i.toString("utf8")){if(s==="\r"||s===`
|
|
709
|
-
`){r();return}if(s===""&&(g.setRawMode?.(!1),E.write(`
|
|
710
|
-
`),process.exit(130)),s==="\x7F"){o=o.slice(0,-1);continue}o+=s}};g.resume(),g.setRawMode?.(!0),g.on("data",n)})):""}function M(){try{let t=N().filter(o=>o.installed);if(t.length>0){console.log(""),console.log("Automatic AI memory:");for(let o of t){let r=o.agent==="agy"?"Agy / Antigravity":o.agent==="opencode"?"OpenCode":"Codex";console.log(` \u2713 ${r}`)}}}catch{}}function d(e,t,o,r){o.trim()?e.set(t,o.trim()):!e.get(t)&&r!==void 0&&e.set(t,r)}async function Ie(e,t){console.log("Storage provider:"),console.log(" 1. Cloudflare R2 (recommended)"),console.log(" 2. S3 / S3-compatible"),console.log(" 3. Local"),console.log(" 4. Hugging Face S3 (legacy)"),console.log("");let o=t==="s3"?"2":t==="local"?"3":t==="huggingface"?"4":"1",n=(await e.question(`Choose [${o}]: `)).trim()||o;return n==="2"?"s3":n==="3"?"local":n==="4"?"huggingface":"r2"}async function Ne(){let e=S.existsSync(p),t=e?he(S.readFileSync(p,"utf8")):new Map,o=J(t),r=U(o),n=r.every(c=>!!t.get(c)?.trim());if(console.log(""),console.log("TOOLNET MEMORY SETUP"),console.log("===================="),console.log(""),console.log(`Config: ${p}`),console.log(""),!g.isTTY||!E.isTTY){e||(t.set("MEMORY_STORAGE_PROVIDER",o),B(t)),n?console.log(`\u2713 ${y(o)} already configured`):(console.log("Configuration pending."),console.log("Run:"),console.log(" toolnet-memory setup")),M();return}let i=Ae.createInterface({input:g,output:E});if(n){console.log(`\u2713 ${y(o)} already configured`),console.log("");let c=await i.question("Use existing storage configuration? (Y/n) [Y]: ");if(q(c)){i.close(),console.log(""),console.log(`\u2713 Existing ${y(o)} configuration kept`),console.log(""),M(),console.log("Next:"),console.log(" toolnet-memory doctor");return}console.log("")}o=await Ie(i,o),t.set("MEMORY_STORAGE_PROVIDER",o),console.log("");let s="",a="";if(o==="r2"){let c=await i.question(t.get("R2_ACCOUNT_ID")?`Cloudflare Account ID [${t.get("R2_ACCOUNT_ID")}]: `:"Cloudflare Account ID: "),u=await i.question(`R2 Bucket [${t.get("R2_BUCKET")||"toolnet-memory"}]: `),m=await i.question(t.get("R2_ACCESS_KEY_ID")?"R2 Access Key ID [configured]: ":"R2 Access Key ID: ");d(t,"R2_ACCOUNT_ID",c),d(t,"R2_BUCKET",u,"toolnet-memory"),d(t,"R2_ACCESS_KEY_ID",m),s="R2_SECRET_ACCESS_KEY",a=t.get(s)?"R2 Secret Access Key [configured]: ":"R2 Secret Access Key: "}else if(o==="s3"){let c=await i.question(t.get("S3_ENDPOINT")?`S3 Endpoint [${t.get("S3_ENDPOINT")}]: `:"S3 Endpoint [blank = AWS S3]: "),u=await i.question(`S3 Region [${t.get("S3_REGION")||"us-east-1"}]: `),m=await i.question(`S3 Bucket [${t.get("S3_BUCKET")||"toolnet-memory"}]: `),l=await i.question(t.get("S3_ACCESS_KEY_ID")?"S3 Access Key ID [configured]: ":"S3 Access Key ID: "),w=await i.question(`Force path-style? (y/N) [${t.get("S3_FORCE_PATH_STYLE")==="true"?"Y":"N"}]: `);c.trim()&&t.set("S3_ENDPOINT",c.trim()),d(t,"S3_REGION",u,"us-east-1"),d(t,"S3_BUCKET",m,"toolnet-memory"),d(t,"S3_ACCESS_KEY_ID",l),w.trim()?t.set("S3_FORCE_PATH_STYLE",q(w,!1)?"true":"false"):t.get("S3_FORCE_PATH_STYLE")||t.set("S3_FORCE_PATH_STYLE","false"),s="S3_SECRET_ACCESS_KEY",a=t.get(s)?"S3 Secret Access Key [configured]: ":"S3 Secret Access Key: "}else if(o==="huggingface"){let c=await i.question(t.get("HF_NAMESPACE")?`Hugging Face namespace [${t.get("HF_NAMESPACE")}]: `:"Hugging Face namespace: "),u=await i.question(`Bucket [${t.get("HF_BUCKET")||"toolnet-memory"}]: `),m=await i.question(t.get("HF_S3_ACCESS_KEY_ID")?"S3 Access Key ID [configured]: ":"S3 Access Key ID: ");d(t,"HF_NAMESPACE",c),d(t,"HF_BUCKET",u,"toolnet-memory"),d(t,"HF_S3_ACCESS_KEY_ID",m),s="HF_S3_SECRET_ACCESS_KEY",a=t.get(s)?"S3 Secret Access Key [configured]: ":"S3 Secret Access Key: "}if(i.close(),s){let c=await Re(a);c.trim()&&t.set(s,c.trim())}B(t),r=U(o);let f=r.filter(c=>!t.get(c)?.trim());if(console.log(""),console.log("\u2713 Configuration saved"),console.log(` ${p}`),console.log(""),f.length){console.log("Missing configuration:");for(let c of f)console.log(` - ${c}`);console.log(""),console.log("Run setup again:"),console.log(" toolnet-memory setup");return}console.log(`\u2713 ${y(o)} configuration complete`),console.log(""),M(),console.log("Next:"),console.log(" toolnet-memory doctor")}Ne().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|
|
650
|
+
`;return ne(o,r.trimStart(),{encoding:"utf8",mode:384}),o}import{existsSync as be,mkdirSync as ie,readFileSync as Ye,writeFileSync as se}from"node:fs";import{homedir as ae}from"node:os";import{dirname as ce,join as x}from"node:path";function we(e){let t=[],o=/"((?:\\.|[^"\\])*)"|'([^']*)'/g,n;for(;n=o.exec(e);){let r=n[1]??n[2]??"";try{t.push(n[1]!==void 0?JSON.parse(`"${r}"`):r)}catch{t.push(r)}}return t}function le(e={}){let t=e.configFile??x(process.env.CODEX_HOME??x(ae(),".codex"),"config.toml"),o=e.previousFile??x(ae(),".config","toolnet-memory","codex-notify-previous.json");ie(ce(t),{recursive:!0}),ie(ce(o),{recursive:!0});let n=be(t)?Ye(t,"utf8"):"",r=e.binary??"toolnet-memory",s=`notify = [${JSON.stringify(r)}, "session:codex-notify"]`,a=n.split(`
|
|
651
|
+
`),l=a.findIndex(u=>/^\s*\[/.test(u));l<0&&(l=a.length);let c=-1,d=-1;for(let u=0;u<l;u+=1)if(/^\s*notify\s*=/.test(a[u])){if(c=u,d=u,a[u].includes("[")&&!a[u].includes("]"))for(;d+1<l&&(d+=1,!a[d].includes("]")););break}let E=[];if(c>=0){let u=a.slice(c,d+1).join(`
|
|
652
|
+
`);E=we(u),a.splice(c,d-c+1,s)}else l=a.findIndex(u=>/^\s*\[/.test(u)),l<0&&(l=a.length),a.splice(l,0,s);let y=E.length>=2&&E[E.length-1]==="session:codex-notify";return E.length>0&&!y&&se(o,JSON.stringify(E,null,2)+`
|
|
653
|
+
`,{encoding:"utf8",mode:384}),n=a.join(`
|
|
654
|
+
`),n.endsWith(`
|
|
655
|
+
`)||(n+=`
|
|
656
|
+
`),se(t,n,{encoding:"utf8",mode:384}),{configFile:t,previousFile:o,preservedPrevious:E.length>0&&!y}}import{existsSync as ke,mkdirSync as Be,readFileSync as xe,writeFileSync as $e}from"node:fs";import{homedir as Fe}from"node:os";import{dirname as ve,join as de}from"node:path";function He(e){return`'${e.replace(/'/g,"'\\''")}'`}function ge(e={}){let t=e.hooksFile??de(process.env.CODEX_HOME??de(Fe(),".codex"),"hooks.json");Be(ve(t),{recursive:!0});let o={};if(ke(t))try{o=JSON.parse(xe(t,"utf8"))}catch(l){throw new Error(`Invalid existing Codex hooks.json: ${l instanceof Error?l.message:String(l)}`)}let n=o.hooks&&typeof o.hooks=="object"&&!Array.isArray(o.hooks)?o.hooks:{};o.hooks=n;let s=(Array.isArray(n.SessionStart)?n.SessionStart:[]).filter(l=>{try{return!JSON.stringify(l).includes("session:codex-context")}catch{return!0}}),a=e.binary??"toolnet-memory";return s.push({matcher:"startup|resume|clear|compact",hooks:[{type:"command",command:`${He(a)} session:codex-context`,timeout:15,additionalContextLimit:1e3,statusMessage:"Loading ToolNet project continuity"}]}),n.SessionStart=s,$e(t,JSON.stringify(o,null,2)+`
|
|
657
|
+
`,{encoding:"utf8",mode:384}),t}function H(e){return Ge("sh",["-lc",`command -v ${JSON.stringify(e)} >/dev/null 2>&1`],{stdio:"ignore"}).status===0}function qe(){return H("agy")||$(v(F(),".gemini"))}function je(){return H("opencode")||$(v(F(),".config","opencode"))}function Ve(){return H("codex")||$(process.env.CODEX_HOME??v(F(),".codex"))}function G(e={}){let t=e.binary??process.env.TOOLNET_MEMORY_BIN??"toolnet-memory",o=[];if(!(e.force===!0||qe()))o.push({agent:"agy",detected:!1,installed:!1,targets:[]});else try{let r=ee({binary:t});o.push({agent:"agy",detected:!0,installed:!0,targets:[r]})}catch(r){o.push({agent:"agy",detected:!0,installed:!1,targets:[],error:r instanceof Error?r.message:String(r)})}if(!(e.force===!0||je()))o.push({agent:"opencode",detected:!1,installed:!1,targets:[]});else try{let r=re({binary:t});o.push({agent:"opencode",detected:!0,installed:!0,targets:[r]})}catch(r){o.push({agent:"opencode",detected:!0,installed:!1,targets:[],error:r instanceof Error?r.message:String(r)})}if(!(e.force===!0||Ve()))o.push({agent:"codex",detected:!1,installed:!1,targets:[]});else try{let r=le({binary:t}),s=ge({binary:t}),a=[r.configFile,s];r.preservedPrevious&&a.push(r.previousFile),o.push({agent:"codex",detected:!0,installed:!0,targets:a})}catch(r){o.push({agent:"codex",detected:!0,installed:!1,targets:[],error:r instanceof Error?r.message:String(r)})}return o}function Je(e){console.log(""),console.log("ToolNet Memory AI Integrations"),console.log("=============================="),console.log("");for(let t of e){let o=t.agent==="agy"?"Agy / Antigravity":t.agent==="opencode"?"OpenCode":"Codex";if(!t.detected){console.log(`- ${o}: not detected`);continue}if(t.installed){console.log(`\u2713 ${o}: automatic memory enabled`);continue}console.log(`\u2717 ${o}: integration failed`),t.error&&console.log(` ${t.error}`)}console.log("")}async function We(){let e=process.argv.slice(2),t=e.includes("--all"),o=e.includes("--json"),n=G({force:t});if(o){console.log(JSON.stringify(n,null,2));return}Je(n)}var Xe=process.argv[1]&&(process.argv[1].endsWith("auto-integrate.js")||process.argv[1].endsWith("auto-integrate.ts"));Xe&&We().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exitCode=1});var q=R.join(j.homedir(),".config","toolnet-memory"),_=R.join(q,".env"),et=new Set(["MEMORY_STORAGE_PROVIDER","R2_ACCOUNT_ID","R2_BUCKET","R2_ACCESS_KEY_ID","R2_SECRET_ACCESS_KEY","S3_ENDPOINT","S3_REGION","S3_BUCKET","S3_ACCESS_KEY_ID","S3_SECRET_ACCESS_KEY","S3_FORCE_PATH_STYLE","HF_NAMESPACE","HF_BUCKET","HF_S3_ACCESS_KEY_ID","HF_S3_SECRET_ACCESS_KEY","HF_URL","HF_TOKEN","HF_EMBEDDING_MODEL","TOOLNET_LLM_PROVIDER","TOOLNET_LLM_API_KEY","TOOLNET_LLM_BASE_URL","TOOLNET_LLM_MODEL","TOOLNET_LLM_ACCOUNT_ID","TOOLNET_EMBEDDING_PROVIDER","TOOLNET_EMBEDDING_API_KEY","TOOLNET_EMBEDDING_BASE_URL","TOOLNET_EMBEDDING_MODEL","TOOLNET_EMBEDDING_ACCOUNT_ID","MEMORY_LOCAL_STORAGE_PATH","MEMORY_LOCAL_CACHE_MB","MEMORY_AUTO_CAPTURE","MEMORY_AUTO_RETRIEVE","MEMORY_AUTO_SUMMARIZE","MEMORY_AUTO_SYNC","MEMORY_MAX_CANDIDATES","MEMORY_RERANK_TOP","MEMORY_FINAL_CONTEXT","MEMORY_TOKEN_BUDGET","TOOLNET_SESSION_LEARNING","TOOLNET_WORK_CONTINUITY","TOOLNET_SEMANTIC_CONTINUITY","TOOLNET_SMART_HANDOFF"]);function tt(e){let t=new Map;for(let o of e.split(/\r?\n/)){let n=o.trim();if(!n||n.startsWith("#"))continue;let r=n.indexOf("=");if(r===-1)continue;let s=n.slice(0,r).trim(),a=n.slice(r+1).trim();s&&t.set(s,a)}return t}function T(e){let t=e.get("MEMORY_STORAGE_PROVIDER")?.trim();return t==="r2"||t==="s3"||t==="local"||t==="huggingface"?t:e.get("R2_ACCOUNT_ID")&&e.get("R2_BUCKET")?"r2":e.get("S3_BUCKET")?"s3":e.get("HF_BUCKET")&&e.get("HF_S3_ACCESS_KEY_ID")?"huggingface":e.get("MEMORY_LOCAL_STORAGE_PATH")?"local":"r2"}function M(e){switch(e){case"r2":return"Cloudflare R2";case"s3":return"S3 / S3-compatible";case"huggingface":return"Hugging Face S3";case"local":return"Local";default:return e}}function Ee(e){switch(e){case"r2":return["R2_ACCOUNT_ID","R2_BUCKET","R2_ACCESS_KEY_ID","R2_SECRET_ACCESS_KEY"];case"s3":return["S3_BUCKET","S3_ACCESS_KEY_ID","S3_SECRET_ACCESS_KEY"];case"huggingface":return["HF_BUCKET","HF_S3_ACCESS_KEY_ID","HF_S3_SECRET_ACCESS_KEY"];case"local":return[];default:return[]}}function ue(e){let t=T(e);return t==="local"?!0:Ee(t).every(o=>!!e.get(o)?.trim())}function V(e){return e?e.length<=8?"configured":`${e.slice(0,4)}\u2022\u2022\u2022\u2022${e.slice(-3)}`:"not configured"}function ot(e){let o=["# ==========================================================","# TOOLNET MEMORY","# Generated by: toolnet-memory setup","# Do not commit this file.","# ==========================================================","",`MEMORY_STORAGE_PROVIDER=${T(e)}`,"","# ----------------------------------------------------------","# Cloudflare R2","# ----------------------------------------------------------",`R2_ACCOUNT_ID=${e.get("R2_ACCOUNT_ID")??""}`,`R2_BUCKET=${e.get("R2_BUCKET")??"toolnet-memory"}`,`R2_ACCESS_KEY_ID=${e.get("R2_ACCESS_KEY_ID")??""}`,`R2_SECRET_ACCESS_KEY=${e.get("R2_SECRET_ACCESS_KEY")??""}`,"","# ----------------------------------------------------------","# Generic S3 / S3-compatible","# ----------------------------------------------------------",`S3_ENDPOINT=${e.get("S3_ENDPOINT")??""}`,`S3_REGION=${e.get("S3_REGION")??"us-east-1"}`,`S3_BUCKET=${e.get("S3_BUCKET")??"toolnet-memory"}`,`S3_ACCESS_KEY_ID=${e.get("S3_ACCESS_KEY_ID")??""}`,`S3_SECRET_ACCESS_KEY=${e.get("S3_SECRET_ACCESS_KEY")??""}`,`S3_FORCE_PATH_STYLE=${e.get("S3_FORCE_PATH_STYLE")??"false"}`,"","# ----------------------------------------------------------","# Hugging Face S3","# ----------------------------------------------------------",`HF_NAMESPACE=${e.get("HF_NAMESPACE")??""}`,`HF_BUCKET=${e.get("HF_BUCKET")??"toolnet-memory"}`,`HF_S3_ACCESS_KEY_ID=${e.get("HF_S3_ACCESS_KEY_ID")??""}`,`HF_S3_SECRET_ACCESS_KEY=${e.get("HF_S3_SECRET_ACCESS_KEY")??""}`,`HF_URL=${e.get("HF_URL")??""}`,"","# ----------------------------------------------------------","# AI / LLM - canonical ToolNet configuration","# ----------------------------------------------------------",`TOOLNET_LLM_PROVIDER=${e.get("TOOLNET_LLM_PROVIDER")??""}`,`TOOLNET_LLM_API_KEY=${e.get("TOOLNET_LLM_API_KEY")??""}`,`TOOLNET_LLM_BASE_URL=${e.get("TOOLNET_LLM_BASE_URL")??""}`,`TOOLNET_LLM_MODEL=${e.get("TOOLNET_LLM_MODEL")??""}`,`TOOLNET_LLM_ACCOUNT_ID=${e.get("TOOLNET_LLM_ACCOUNT_ID")??""}`,"","# ----------------------------------------------------------","# Embedding - canonical ToolNet configuration","# ----------------------------------------------------------",`TOOLNET_EMBEDDING_PROVIDER=${e.get("TOOLNET_EMBEDDING_PROVIDER")??""}`,`TOOLNET_EMBEDDING_API_KEY=${e.get("TOOLNET_EMBEDDING_API_KEY")??""}`,`TOOLNET_EMBEDDING_BASE_URL=${e.get("TOOLNET_EMBEDDING_BASE_URL")??""}`,`TOOLNET_EMBEDDING_MODEL=${e.get("TOOLNET_EMBEDDING_MODEL")??""}`,`TOOLNET_EMBEDDING_ACCOUNT_ID=${e.get("TOOLNET_EMBEDDING_ACCOUNT_ID")??""}`,"","# ----------------------------------------------------------","# Embedding - legacy/current compatibility","# ----------------------------------------------------------",`HF_TOKEN=${e.get("HF_TOKEN")??""}`,`HF_EMBEDDING_MODEL=${e.get("HF_EMBEDDING_MODEL")??"sentence-transformers/all-MiniLM-L6-v2"}`,"","# ----------------------------------------------------------","# Local storage/cache","# ----------------------------------------------------------",`MEMORY_LOCAL_STORAGE_PATH=${e.get("MEMORY_LOCAL_STORAGE_PATH")??""}`,`MEMORY_LOCAL_CACHE_MB=${e.get("MEMORY_LOCAL_CACHE_MB")??"200"}`,"","# ----------------------------------------------------------","# Automation","# ----------------------------------------------------------",`MEMORY_AUTO_CAPTURE=${e.get("MEMORY_AUTO_CAPTURE")??"true"}`,`MEMORY_AUTO_RETRIEVE=${e.get("MEMORY_AUTO_RETRIEVE")??"true"}`,`MEMORY_AUTO_SUMMARIZE=${e.get("MEMORY_AUTO_SUMMARIZE")??"true"}`,`MEMORY_AUTO_SYNC=${e.get("MEMORY_AUTO_SYNC")??"true"}`,"","# ----------------------------------------------------------","# Retrieval","# ----------------------------------------------------------",`MEMORY_MAX_CANDIDATES=${e.get("MEMORY_MAX_CANDIDATES")??"50"}`,`MEMORY_RERANK_TOP=${e.get("MEMORY_RERANK_TOP")??"10"}`,`MEMORY_FINAL_CONTEXT=${e.get("MEMORY_FINAL_CONTEXT")??"5"}`,`MEMORY_TOKEN_BUDGET=${e.get("MEMORY_TOKEN_BUDGET")??"2000"}`,"","# ----------------------------------------------------------","# Automatic Session Memory","# ----------------------------------------------------------",`TOOLNET_SESSION_LEARNING=${e.get("TOOLNET_SESSION_LEARNING")??"1"}`,`TOOLNET_WORK_CONTINUITY=${e.get("TOOLNET_WORK_CONTINUITY")??"1"}`,`TOOLNET_SEMANTIC_CONTINUITY=${e.get("TOOLNET_SEMANTIC_CONTINUITY")??"1"}`,`TOOLNET_SMART_HANDOFF=${e.get("TOOLNET_SMART_HANDOFF")??"1"}`],n=[...e.entries()].filter(([r])=>!et.has(r));if(n.length>0){o.push("","# ----------------------------------------------------------","# Preserved settings","# ----------------------------------------------------------");for(let[r,s]of n)o.push(`${r}=${s}`)}return`${o.join(`
|
|
658
|
+
`)}
|
|
659
|
+
`}function O(e){m.mkdirSync(q,{recursive:!0,mode:448});let t=`${_}.tmp-${process.pid}`;m.writeFileSync(t,ot(e),{encoding:"utf8",mode:384}),m.renameSync(t,_),m.chmodSync(q,448),m.chmodSync(_,384)}function p(e,t,o,n){let r=o.trim();if(r){e.set(t,r);return}!e.get(t)&&n!==void 0&&e.set(t,n)}async function Y(e,t){return f.isTTY?(e.pause(),I.write(t),new Promise(o=>{let n="",r=!1,s=()=>{r||(r=!0,f.off("data",a),f.setRawMode?.(!1),f.pause(),I.write(`
|
|
660
|
+
`),e.resume(),o(n))},a=l=>{for(let c of l.toString("utf8")){if(c==="\r"||c===`
|
|
661
|
+
`){s();return}if(c===""&&(f.off("data",a),f.setRawMode?.(!1),I.write(`
|
|
662
|
+
`),process.exit(130)),c==="\x7F"){n=n.slice(0,-1);continue}n+=c}};f.resume(),f.setRawMode?.(!0),f.on("data",a)})):""}function L(e){return e.trim().replace(/\/+$/,"")}function _e(e){return`https://${e}.r2.cloudflarestorage.com`}async function J(e){let t=new AbortController,o=setTimeout(()=>t.abort(),15e3);o.unref?.();let n=new Qe({region:e.region,endpoint:e.endpoint||void 0,forcePathStyle:e.forcePathStyle??!1,credentials:{accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}});try{return await n.send(new Ze({Bucket:e.bucket}),{abortSignal:t.signal}),{ok:!0,message:`Bucket "${e.bucket}" reachable`}}catch(r){return{ok:!1,message:r instanceof Error?r.message:String(r)}}finally{clearTimeout(o),n.destroy()}}async function nt(e){let t=e.get("R2_ACCOUNT_ID")?.trim()??"",o=e.get("R2_BUCKET")?.trim()??"",n=e.get("R2_ACCESS_KEY_ID")?.trim()??"",r=e.get("R2_SECRET_ACCESS_KEY")?.trim()??"";return!t||!o||!n||!r?{ok:!1,message:"R2 configuration is incomplete"}:J({endpoint:_e(t),region:"auto",bucket:o,accessKeyId:n,secretAccessKey:r})}async function rt(e){let t=L(e.get("S3_ENDPOINT")??""),o=e.get("S3_REGION")?.trim()||"us-east-1",n=e.get("S3_BUCKET")?.trim()??"",r=e.get("S3_ACCESS_KEY_ID")?.trim()??"",s=e.get("S3_SECRET_ACCESS_KEY")?.trim()??"";return!n||!r||!s?{ok:!1,message:"S3 configuration is incomplete"}:J({endpoint:t||void 0,region:o,bucket:n,accessKeyId:r,secretAccessKey:s,forcePathStyle:e.get("S3_FORCE_PATH_STYLE")==="true"})}async function it(e){let t=L(e.get("HF_URL")??""),o=e.get("HF_BUCKET")?.trim()??"",n=e.get("HF_S3_ACCESS_KEY_ID")?.trim()??"",r=e.get("HF_S3_SECRET_ACCESS_KEY")?.trim()??"";return t?!o||!n||!r?{ok:!1,message:"Hugging Face S3 configuration is incomplete"}:J({endpoint:t,region:"us-east-1",bucket:o,accessKeyId:n,secretAccessKey:r,forcePathStyle:!0}):{ok:!1,message:"HF_URL / S3 endpoint is required for connection test"}}async function st(e){let t=e.get("MEMORY_LOCAL_STORAGE_PATH")?.trim()||R.join(j.homedir(),".local","share","toolnet-memory"),o=R.join(t,`.toolnet-test-${process.pid}-${Date.now()}`);try{return m.mkdirSync(t,{recursive:!0,mode:448}),m.writeFileSync(o,`toolnet-memory
|
|
663
|
+
`,{encoding:"utf8",mode:384}),m.unlinkSync(o),{ok:!0,message:`Writable: ${t}`}}catch(n){return{ok:!1,message:n instanceof Error?n.message:String(n)}}}async function at(e,t){switch(e){case"r2":return nt(t);case"s3":return rt(t);case"huggingface":return it(t);case"local":return st(t)}}async function ct(e,t){console.log(""),console.log(`Testing ${M(e)}...`);let o=await at(e,t);return o.ok?console.log(`\u2713 ${o.message}`):(console.log("\u2717 Connection test failed"),console.log(` ${o.message}`)),console.log(""),o}function lt(){console.log(""),console.log("\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557"),console.log("\u2551 TOOLNET MEMORY SETUP \u2551"),console.log("\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D"),console.log("")}function dt(e){let t=T(e);console.log("Current configuration"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(`Storage : ${M(t)} ${ue(e)?"\u2713":"\u26A0 incomplete"}`);let o=e.get("TOOLNET_LLM_PROVIDER"),n=e.get("TOOLNET_LLM_MODEL"),r=e.get("TOOLNET_EMBEDDING_PROVIDER");console.log(`LLM : ${o?`${fe(o)}${n?` / ${n}`:""}`:"not configured"}`),console.log(`Embedding: ${r||"legacy/default"}`),console.log("")}async function gt(e){console.log("Setup"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(" 1. Storage"),console.log(" 2. AI Model"),console.log(" 3. Finish & Save"),console.log(" 0. Exit without saving"),console.log("");let t=(await e.question("Choose [1-3]: ")).trim();return t==="1"?"storage":t==="2"?"ai":t==="0"?"exit":"finish"}async function Et(e,t){console.log(""),console.log("Storage"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),console.log(` 1. Cloudflare R2${t==="r2"?" \u2713 current":""}`),console.log(` 2. S3 / S3-compatible${t==="s3"?" \u2713 current":""}`),console.log(` 3. Hugging Face S3${t==="huggingface"?" \u2713 current":""}`),console.log(` 4. Local${t==="local"?" \u2713 current":""}`),console.log(""),console.log(" 0. Back"),console.log("");let o=(await e.question("Choose storage: ")).trim();return o==="0"?"back":o==="2"?"s3":o==="3"?"huggingface":o==="4"?"local":"r2"}async function ut(e,t){console.log(""),console.log("Cloudflare R2"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let o=await e.question(t.get("R2_ACCOUNT_ID")?`ACCOUNT ID [${t.get("R2_ACCOUNT_ID")}]: `:"ACCOUNT ID: "),n=await e.question(t.get("R2_ACCESS_KEY_ID")?`ACCESS KEY ID [${V(t.get("R2_ACCESS_KEY_ID"))}]: `:"ACCESS KEY ID: "),r=await e.question(`BUCKET [${t.get("R2_BUCKET")||"toolnet-memory"}]: `);p(t,"R2_ACCOUNT_ID",o),p(t,"R2_ACCESS_KEY_ID",n),p(t,"R2_BUCKET",r,"toolnet-memory");let s=t.get("R2_ACCOUNT_ID")?.trim();s&&console.log(`URL: ${_e(s)}`);let a=await Y(e,t.get("R2_SECRET_ACCESS_KEY")?"SECRET ACCESS KEY [configured, Enter = keep]: ":"SECRET ACCESS KEY: ");a.trim()&&t.set("R2_SECRET_ACCESS_KEY",a.trim())}async function _t(e,t){console.log(""),console.log("S3 / S3-compatible"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let o=await e.question(t.get("S3_ENDPOINT")?`URL / ENDPOINT [${t.get("S3_ENDPOINT")}]: `:"URL / ENDPOINT [blank = AWS S3]: "),n=await e.question(`REGION [${t.get("S3_REGION")||"us-east-1"}]: `),r=await e.question(t.get("S3_ACCESS_KEY_ID")?`ACCESS KEY ID [${V(t.get("S3_ACCESS_KEY_ID"))}]: `:"ACCESS KEY ID: "),s=await e.question(`BUCKET [${t.get("S3_BUCKET")||"toolnet-memory"}]: `),a=t.get("S3_FORCE_PATH_STYLE")==="true",l=await e.question(`FORCE PATH STYLE [${a?"Y":"N"}] (y/n): `);if(o.trim()&&t.set("S3_ENDPOINT",L(o)),p(t,"S3_REGION",n,"us-east-1"),p(t,"S3_ACCESS_KEY_ID",r),p(t,"S3_BUCKET",s,"toolnet-memory"),l.trim()){let d=l.trim().toLowerCase();t.set("S3_FORCE_PATH_STYLE",d==="y"||d==="yes"?"true":"false")}else t.has("S3_FORCE_PATH_STYLE")||t.set("S3_FORCE_PATH_STYLE","false");let c=await Y(e,t.get("S3_SECRET_ACCESS_KEY")?"SECRET ACCESS KEY [configured, Enter = keep]: ":"SECRET ACCESS KEY: ");c.trim()&&t.set("S3_SECRET_ACCESS_KEY",c.trim())}async function ft(e,t){console.log(""),console.log("Hugging Face S3"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let o=await e.question(t.get("HF_NAMESPACE")?`NAMESPACE [${t.get("HF_NAMESPACE")}]: `:"NAMESPACE [optional]: "),n=await e.question(t.get("HF_S3_ACCESS_KEY_ID")?`ACCESS KEY ID [${V(t.get("HF_S3_ACCESS_KEY_ID"))}]: `:"ACCESS KEY ID: "),r=await e.question(`BUCKET [${t.get("HF_BUCKET")||"toolnet-memory"}]: `),s=await e.question(t.get("HF_URL")?`URL [${t.get("HF_URL")}]: `:"URL / S3 ENDPOINT: ");p(t,"HF_NAMESPACE",o),p(t,"HF_S3_ACCESS_KEY_ID",n),p(t,"HF_BUCKET",r,"toolnet-memory"),s.trim()&&t.set("HF_URL",L(s));let a=await Y(e,t.get("HF_S3_SECRET_ACCESS_KEY")?"SECRET ACCESS KEY [configured, Enter = keep]: ":"SECRET ACCESS KEY: ");a.trim()&&t.set("HF_S3_SECRET_ACCESS_KEY",a.trim())}async function mt(e,t){console.log(""),console.log("Local Storage"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let o=t.get("MEMORY_LOCAL_STORAGE_PATH")??R.join(j.homedir(),".local","share","toolnet-memory"),n=await e.question(`LOCAL PATH [${o}]: `);p(t,"MEMORY_LOCAL_STORAGE_PATH",n,o)}async function pt(e,t){let o=new Map(t);for(;;){let n=await Et(e,T(t));if(n==="back")return;let r=new Map(t);t.set("MEMORY_STORAGE_PROVIDER",n),n==="r2"?await ut(e,t):n==="s3"?await _t(e,t):n==="huggingface"?await ft(e,t):await mt(e,t);let s=Ee(n).filter(c=>!t.get(c)?.trim());if(s.length){console.log(""),console.log("\u26A0 Missing required fields:");for(let d of s)console.log(` - ${d}`);console.log(""),console.log(" 1. Retry"),console.log(" 2. Save anyway"),console.log(" 3. Choose another provider"),console.log(" 4. Cancel"),console.log("");let c=(await e.question("Choose [1]: ")).trim()||"1";if(c==="2"){O(t),console.log(""),console.log("\u26A0 Saved with incomplete configuration"),console.log("");return}if(c==="3"){t.clear();for(let[d,E]of r)t.set(d,E);continue}if(c==="4"){t.clear();for(let[d,E]of o)t.set(d,E);console.log(""),console.log("Storage changes cancelled."),console.log("");return}continue}if((await ct(n,t)).ok){O(t),console.log(`\u2713 ${M(n)} configuration saved`),console.log(` ${_}`),console.log("");return}console.log(" 1. Retry"),console.log(" 2. Save anyway"),console.log(" 3. Choose another provider"),console.log(" 4. Cancel"),console.log("");let l=(await e.question("Choose [1]: ")).trim()||"1";if(l==="2"){O(t),console.log(""),console.log("\u26A0 Saved even though connection test failed"),console.log("");return}if(l==="3"){t.clear();for(let[c,d]of r)t.set(c,d);continue}if(l==="4"){t.clear();for(let[c,d]of o)t.set(c,d);console.log(""),console.log("Storage changes cancelled."),console.log("");return}}}var C=[{id:"openai-compatible",label:"OpenAI-compatible",apiKeyRequired:!0,baseUrlRequired:!0},{id:"alibaba",label:"Alibaba / DashScope",baseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",suggestedModel:"qwen3.6-flash",apiKeyRequired:!0},{id:"openrouter",label:"OpenRouter",baseUrl:"https://openrouter.ai/api/v1",apiKeyRequired:!0},{id:"groq",label:"Groq",baseUrl:"https://api.groq.com/openai/v1",apiKeyRequired:!0},{id:"deepseek",label:"DeepSeek",baseUrl:"https://api.deepseek.com",suggestedModel:"deepseek-v4-flash",apiKeyRequired:!0},{id:"nvidia",label:"NVIDIA NIM",baseUrl:"https://integrate.api.nvidia.com/v1",suggestedModel:"deepseek-ai/deepseek-v4-pro",apiKeyRequired:!0},{id:"gemini",label:"Gemini",baseUrl:"https://generativelanguage.googleapis.com/v1beta",suggestedModel:"gemini-3.6-flash",apiKeyRequired:!0},{id:"huggingface",label:"Hugging Face",baseUrl:"https://router.huggingface.co/v1",apiKeyRequired:!0},{id:"ollama",label:"Ollama / Local",baseUrl:"http://127.0.0.1:11434/v1",apiKeyRequired:!1},{id:"custom",label:"Custom endpoint",apiKeyRequired:!1,baseUrlRequired:!0},{id:"cloudflare",label:"Cloudflare Workers AI",suggestedModel:"@cf/meta/llama-3.1-8b-instruct",apiKeyRequired:!0,accountIdRequired:!0}];function Ot(e){return C.find(t=>t.id===e)}function fe(e){return Ot(e)?.label??e??"not configured"}function me(e){let t=e.get("TOOLNET_LLM_PROVIDER")?.trim();return C.some(o=>o.id===t)?t:void 0}async function pe(e,t){console.log(""),console.log("AI Model"),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"),C.forEach((r,s)=>{console.log(` ${s+1}. ${r.label}${t===r.id?" \u2713 current":""}`)}),console.log(""),console.log(" 0. Back"),console.log("");let o=(await e.question("Choose provider: ")).trim();if(o==="0")return"back";let n=Number(o)-1;return Number.isInteger(n)&&n>=0&&n<C.length?C[n].id:(console.log(""),console.log("\u26A0 Invalid provider selection"),pe(e,t))}function Tt(e,t){return!(!e.get("TOOLNET_LLM_MODEL")?.trim()||t.apiKeyRequired&&!e.get("TOOLNET_LLM_API_KEY")?.trim()||t.accountIdRequired&&!e.get("TOOLNET_LLM_ACCOUNT_ID")?.trim()||t.baseUrlRequired&&!e.get("TOOLNET_LLM_BASE_URL")?.trim())}function At(e){e.delete("TOOLNET_LLM_API_KEY"),e.delete("TOOLNET_LLM_BASE_URL"),e.delete("TOOLNET_LLM_MODEL"),e.delete("TOOLNET_LLM_ACCOUNT_ID")}async function St(e,t,o){console.log(""),console.log(o.label),console.log("\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let n=t.get("TOOLNET_LLM_PROVIDER");if(n&&n!==o.id&&At(t),t.set("TOOLNET_LLM_PROVIDER",o.id),o.accountIdRequired){let c=t.get("TOOLNET_LLM_ACCOUNT_ID"),d=await e.question(c?`ACCOUNT ID [${c}]: `:"ACCOUNT ID: ");p(t,"TOOLNET_LLM_ACCOUNT_ID",d)}else t.delete("TOOLNET_LLM_ACCOUNT_ID");if(o.apiKeyRequired||o.id==="custom"){let c=t.get("TOOLNET_LLM_API_KEY"),d=await Y(e,c?"API KEY [configured, Enter = keep]: ":o.apiKeyRequired?"API KEY: ":"API KEY [optional]: ");d.trim()&&t.set("TOOLNET_LLM_API_KEY",d.trim())}else t.delete("TOOLNET_LLM_API_KEY");if(o.id!=="cloudflare"){let d=t.get("TOOLNET_LLM_BASE_URL")||o.baseUrl||"",y=(await e.question(d?`BASE URL [${d}]: `:o.baseUrlRequired?"BASE URL: ":"BASE URL [optional]: ")).trim()||d;y?t.set("TOOLNET_LLM_BASE_URL",L(y)):t.delete("TOOLNET_LLM_BASE_URL")}else t.delete("TOOLNET_LLM_BASE_URL");let s=t.get("TOOLNET_LLM_MODEL")||o.suggestedModel||"",l=(await e.question(s?`MODEL [${s}]: `:"MODEL: ")).trim()||s;l&&t.set("TOOLNET_LLM_MODEL",l)}function Ct(e){let t=me(e);if(!t)throw new Error("AI provider is not configured");return{id:t,apiKey:e.get("TOOLNET_LLM_API_KEY")?.trim()||void 0,baseUrl:e.get("TOOLNET_LLM_BASE_URL")?.trim()||void 0,model:e.get("TOOLNET_LLM_MODEL")?.trim()||void 0,accountId:e.get("TOOLNET_LLM_ACCOUNT_ID")?.trim()||void 0}}async function yt(e){let t=Ct(e);console.log(""),console.log(`Testing ${fe(t.id)}...`);try{let n=await Q(t).healthCheck();return n.ok?(console.log(`\u2713 Provider reachable${n.latencyMs?` (${n.latencyMs} ms)`:""}`),console.log(`\u2713 Model: ${n.model??t.model??"configured"}`),console.log(""),{ok:!0,message:n.message}):(console.log("\u2717 AI provider test failed"),console.log(` ${n.message}`),console.log(""),{ok:!1,message:n.message})}catch(o){let n=o instanceof Error?o.message:String(o);return console.log("\u2717 AI provider test failed"),console.log(` ${n}`),console.log(""),{ok:!1,message:n}}}async function It(e,t){let o=new Map(t);for(;;){let n=await pe(e,me(t));if(n==="back")return;let r=C.find(l=>l.id===n);if(!r)continue;if(await St(e,t,r),!Tt(t,r)){console.log(""),console.log("\u26A0 AI configuration is incomplete."),console.log(""),console.log(" 1. Retry"),console.log(" 2. Save anyway"),console.log(" 3. Choose another provider"),console.log(" 4. Cancel"),console.log("");let l=(await e.question("Choose [1]: ")).trim()||"1";if(l==="2"){O(t),console.log(""),console.log("\u26A0 AI configuration saved without validation"),console.log(` ${_}`),console.log("");return}if(l==="3")continue;if(l==="4"){t.clear();for(let[c,d]of o)t.set(c,d);console.log(""),console.log("AI changes cancelled."),console.log("");return}continue}if((await yt(t)).ok){O(t),console.log(`\u2713 ${r.label} configuration saved`),console.log(` ${_}`),console.log("");return}console.log(" 1. Retry"),console.log(" 2. Save anyway"),console.log(" 3. Choose another provider"),console.log(" 4. Cancel"),console.log("");let a=(await e.question("Choose [1]: ")).trim()||"1";if(a==="2"){O(t),console.log(""),console.log("\u26A0 AI configuration saved even though provider test failed"),console.log(` ${_}`),console.log("");return}if(a!=="3"&&a==="4"){t.clear();for(let[l,c]of o)t.set(l,c);console.log(""),console.log("AI changes cancelled."),console.log("");return}}}function Rt(){try{let t=G().filter(o=>o.installed);if(t.length===0)return;console.log(""),console.log("Automatic AI memory");for(let o of t){let n=o.agent==="agy"?"Agy / Antigravity":o.agent==="opencode"?"OpenCode":o.agent==="codex"?"Codex":o.agent;console.log(` \u2713 ${n}`)}}catch{}}function Oe(e){e.has("MEMORY_STORAGE_PROVIDER")||e.set("MEMORY_STORAGE_PROVIDER",T(e)),e.has("MEMORY_LOCAL_CACHE_MB")||e.set("MEMORY_LOCAL_CACHE_MB","200"),e.has("MEMORY_AUTO_CAPTURE")||e.set("MEMORY_AUTO_CAPTURE","true"),e.has("MEMORY_AUTO_RETRIEVE")||e.set("MEMORY_AUTO_RETRIEVE","true"),e.has("MEMORY_AUTO_SUMMARIZE")||e.set("MEMORY_AUTO_SUMMARIZE","true"),e.has("MEMORY_AUTO_SYNC")||e.set("MEMORY_AUTO_SYNC","true"),e.has("MEMORY_MAX_CANDIDATES")||e.set("MEMORY_MAX_CANDIDATES","50"),e.has("MEMORY_RERANK_TOP")||e.set("MEMORY_RERANK_TOP","10"),e.has("MEMORY_FINAL_CONTEXT")||e.set("MEMORY_FINAL_CONTEXT","5"),e.has("MEMORY_TOKEN_BUDGET")||e.set("MEMORY_TOKEN_BUDGET","2000"),e.has("TOOLNET_SESSION_LEARNING")||e.set("TOOLNET_SESSION_LEARNING","1"),e.has("TOOLNET_WORK_CONTINUITY")||e.set("TOOLNET_WORK_CONTINUITY","1"),e.has("TOOLNET_SEMANTIC_CONTINUITY")||e.set("TOOLNET_SEMANTIC_CONTINUITY","1"),e.has("TOOLNET_SMART_HANDOFF")||e.set("TOOLNET_SMART_HANDOFF","1")}async function Mt(e,t){Oe(e),t||O(e),console.log("TOOLNET MEMORY SETUP"),console.log(""),console.log("Interactive terminal not detected."),console.log(`Config: ${_}`),console.log(`Storage: ${M(T(e))}`),console.log(""),console.log("Run from an interactive terminal to configure providers:"),console.log(" toolnet-memory setup")}async function Lt(){let e=m.existsSync(_),t=e?tt(m.readFileSync(_,"utf8")):new Map,o=new Map(t);if(Oe(o),!f.isTTY||!I.isTTY){await Mt(o,e);return}let n=ze.createInterface({input:f,output:I}),r=!1;try{for(;;){lt(),dt(o);let s=await gt(n);if(s==="storage"){let a=JSON.stringify([...o.entries()]);await pt(n,o),r=r||a!==JSON.stringify([...o.entries()]);continue}if(s==="ai"){let a=JSON.stringify([...o.entries()]);await It(n,o),r=r||a!==JSON.stringify([...o.entries()]);continue}if(s==="exit"){if(!r){console.log(""),console.log("No changes made.");return}console.log("");let a=(await n.question("Discard unsaved changes? (y/N): ")).trim().toLowerCase();if(a==="y"||a==="yes"){console.log(""),console.log("Changes discarded.");return}continue}O(o),console.log(""),console.log("\u2713 Configuration saved"),console.log(` ${_}`),console.log(""),console.log(`\u2713 Permissions: ${m.statSync(_).mode.toString(8).slice(-3)}`),console.log(`\u2713 Storage: ${M(T(o))}`),ue(o)||console.log("\u26A0 Storage configuration is incomplete."),Rt(),console.log(""),console.log("Next:"),console.log(" toolnet-memory doctor"),console.log("");return}}finally{n.close()}}Lt().catch(e=>{console.error(e instanceof Error?e.message:String(e)),process.exit(1)});
|