toolnet-memory 0.2.4 → 0.2.6

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/setup.js CHANGED
@@ -1,31 +1,212 @@
1
- import g from"node:fs";import T from"node:os";import R from"node:path";import O from"node:readline/promises";import{stdin as s,stdout as l}from"node:process";var u=R.join(T.homedir(),".config","toolnet-memory"),E=R.join(u,".env");function Y(o){let e=new Map;for(let n of o.split(/\r?\n/)){let i=n.trim();if(!i||i.startsWith("#"))continue;let t=i.indexOf("=");t!==-1&&e.set(i.slice(0,t).trim(),i.slice(t+1).trim())}return e}function a(o){g.mkdirSync(u,{recursive:!0,mode:448});let e=`# ==========================================================
1
+ import f from"node:fs";import Ee from"node:os";import K from"node:path";import Se from"node:readline/promises";import{stdin as g,stdout as y}from"node:process";import{existsSync as h}from"node:fs";import{homedir as C}from"node:os";import{join as x}from"node:path";import{spawnSync as ge}from"node:child_process";import{existsSync as U,mkdirSync as L,readFileSync as J,writeFileSync as q}from"node:fs";import{homedir as G}from"node:os";import{dirname as X,join as V}from"node:path";function W(t){return`'${t.replace(/'/g,"'\\''")}'`}function F(t={}){let e=t.hooksFile??V(G(),".gemini","config","hooks.json");L(X(e),{recursive:!0});let o={};if(U(e))try{o=JSON.parse(J(e,"utf8"))}catch(a){throw new Error(`Invalid existing Agy hooks.json: ${a instanceof Error?a.message:String(a)}`)}let r=t.binary??"toolnet-memory",n=`${W(r)} session:agy-hook`;return o["toolnet-memory"]={enabled:!0,PreInvocation:[{type:"command",command:`${n} pre`,timeout:15}],PostInvocation:[{type:"command",command:`${n} post`,timeout:15}],Stop:[{type:"command",command:`${n} stop`,timeout:30}]},q(e,JSON.stringify(o,null,2)+`
2
+ `,{encoding:"utf8",mode:384}),e}import{existsSync as Z,mkdirSync as k,readFileSync as Q,writeFileSync as v}from"node:fs";import{homedir as _}from"node:os";import{join as E}from"node:path";var I="<!-- TOOLNET_MEMORY_BOOTSTRAP_START -->",S="<!-- TOOLNET_MEMORY_BOOTSTRAP_END -->";function z(){let t=E(_(),".config","opencode","AGENTS.md");k(E(_(),".config","opencode"),{recursive:!0});let e=`${I}
3
+ ## ToolNet Memory \u2014 Project Continuity
4
+
5
+ When the current workspace belongs to a ToolNet project, identified by a nearest ancestor containing \`.toolnet/project.json\`:
6
+
7
+ 1. Before planning, editing, or running implementation commands, read that project root's \`.toolnet/context/startup.md\`.
8
+ 2. Treat its PROJECT RULES, MISSION, CURRENT OBJECTIVE, rationale, current phase/task, Definition of Done, blockers and next actions as project continuity context.
9
+ 3. Do not restart work already marked completed unless repository evidence proves it must be revisited.
10
+ 4. Verify current repository state before continuing old work.
11
+ 5. If \`.toolnet/context/startup.md\` is missing, run \`toolnet-memory context:sync --project <project-root>\`, then read it.
12
+ 6. Never invent missing rationale. If ToolNet says a reason was not explicitly recorded, inspect the implementation or ask rather than guessing.
13
+
14
+ This applies automatically to every ToolNet-managed project.
15
+ ${S}`,o=Z(t)?Q(t,"utf8"):"",r=o.indexOf(I),n=o.indexOf(S);return r>=0&&n>=r?o=o.slice(0,r)+e+o.slice(n+S.length):(o=o.trimEnd(),o&&(o+=`
16
+
17
+ `),o+=e),v(t,o.trimEnd()+`
18
+ `,{encoding:"utf8",mode:384}),t}function w(t={}){let e=t.directory??E(_(),".config","opencode","plugins");k(e,{recursive:!0}),z();let o=E(e,"toolnet-memory.js"),r=t.binary??process.env.TOOLNET_MEMORY_BIN??"toolnet-memory",n=`// Generated by ToolNet Memory.
19
+ // OpenCode session capture + continuity bootstrap.
20
+
21
+ function getSessionId(event) {
22
+ const p = event?.properties ?? {}
23
+
24
+ const candidates = [
25
+ p.sessionID,
26
+ p.sessionId,
27
+ p.info?.id,
28
+ p.session?.id,
29
+ ]
30
+
31
+ return candidates.find(
32
+ value => typeof value === "string" && value.length > 0
33
+ ) ?? null
34
+ }
35
+
36
+ export const ToolNetMemoryPlugin = async ({ directory }) => {
37
+ const binary = ${JSON.stringify(r)}
38
+
39
+ async function refreshContext() {
40
+ try {
41
+ const child = Bun.spawn(
42
+ [
43
+ binary,
44
+ "context:sync",
45
+ "--project",
46
+ directory,
47
+ ],
48
+ {
49
+ stdin: "ignore",
50
+ stdout: "ignore",
51
+ stderr: "ignore",
52
+ }
53
+ )
54
+
55
+ await child.exited
56
+ } catch {
57
+ // Context sync must never break OpenCode startup.
58
+ }
59
+ }
60
+
61
+ async function readContext() {
62
+ try {
63
+ const child = Bun.spawn(
64
+ [
65
+ binary,
66
+ "context:print",
67
+ "--project",
68
+ directory,
69
+ "--tokens",
70
+ "900",
71
+ ],
72
+ {
73
+ stdin: "ignore",
74
+ stdout: "pipe",
75
+ stderr: "ignore",
76
+ }
77
+ )
78
+
79
+ const text =
80
+ await new Response(
81
+ child.stdout
82
+ ).text()
83
+
84
+ await child.exited
85
+
86
+ return text.trim()
87
+ } catch {
88
+ return ""
89
+ }
90
+ }
91
+
92
+ function sync(sessionId, flag) {
93
+ if (!sessionId) return
94
+
95
+ try {
96
+ const args = [
97
+ binary,
98
+ "session:opencode-sync",
99
+ sessionId,
100
+ "--project",
101
+ directory,
102
+ ]
103
+
104
+ if (flag) {
105
+ args.push(flag)
106
+ }
107
+
108
+ const child = Bun.spawn(args, {
109
+ stdin: "ignore",
110
+ stdout: "ignore",
111
+ stderr: "ignore",
112
+ })
113
+
114
+ if (
115
+ typeof child.unref === "function"
116
+ ) {
117
+ child.unref()
118
+ }
119
+ } catch {
120
+ // Memory capture must never break OpenCode.
121
+ }
122
+ }
123
+
124
+ /*
125
+ * Pull the latest project brief from ToolNet remote storage
126
+ * before the new OpenCode session starts doing work.
127
+ */
128
+ await refreshContext()
129
+
130
+ return {
131
+ event: async ({ event }) => {
132
+ const sessionId =
133
+ getSessionId(event)
134
+
135
+ if (!sessionId) {
136
+ return
137
+ }
138
+
139
+ if (event.type === "session.idle") {
140
+ sync(sessionId, "--idle")
141
+ return
142
+ }
143
+
144
+ if (event.type === "session.compacted") {
145
+ sync(sessionId, "--compacted")
146
+ return
147
+ }
148
+
149
+ if (event.type === "session.error") {
150
+ sync(sessionId, "--error")
151
+ }
152
+ },
153
+
154
+ /*
155
+ * Official OpenCode compaction hook.
156
+ * Preserve ToolNet's semantic state after context compaction.
157
+ */
158
+ "experimental.session.compacting": async (_input, output) => {
159
+ const context =
160
+ await readContext()
161
+
162
+ if (
163
+ context &&
164
+ Array.isArray(
165
+ output.context
166
+ )
167
+ ) {
168
+ output.context.push(
169
+ context
170
+ )
171
+ }
172
+ },
173
+ }
174
+ }
175
+ `;return v(o,n,{encoding:"utf8",mode:384}),o}import{existsSync as ee,mkdirSync as b,readFileSync as te,writeFileSync as Y}from"node:fs";import{homedir as H}from"node:os";import{dirname as $,join as O}from"node:path";function oe(t){let e=[],o=/"((?:\\.|[^"\\])*)"|'([^']*)'/g,r;for(;r=o.exec(t);){let n=r[1]??r[2]??"";try{e.push(r[1]!==void 0?JSON.parse(`"${n}"`):n)}catch{e.push(n)}}return e}function j(t={}){let e=t.configFile??O(process.env.CODEX_HOME??O(H(),".codex"),"config.toml"),o=t.previousFile??O(H(),".config","toolnet-memory","codex-notify-previous.json");b($(e),{recursive:!0}),b($(o),{recursive:!0});let r=ee(e)?te(e,"utf8"):"",n=t.binary??"toolnet-memory",a=`notify = [${JSON.stringify(n)}, "session:codex-notify"]`,s=r.split(`
176
+ `),c=s.findIndex(i=>/^\s*\[/.test(i));c<0&&(c=s.length);let u=-1,d=-1;for(let i=0;i<c;i+=1)if(/^\s*notify\s*=/.test(s[i])){if(u=i,d=i,s[i].includes("[")&&!s[i].includes("]"))for(;d+1<c&&(d+=1,!s[d].includes("]")););break}let l=[];if(u>=0){let i=s.slice(u,d+1).join(`
177
+ `);l=oe(i),s.splice(u,d-u+1,a)}else c=s.findIndex(i=>/^\s*\[/.test(i)),c<0&&(c=s.length),s.splice(c,0,a);let p=l.length>=2&&l[l.length-1]==="session:codex-notify";return l.length>0&&!p&&Y(o,JSON.stringify(l,null,2)+`
178
+ `,{encoding:"utf8",mode:384}),r=s.join(`
179
+ `),r.endsWith(`
180
+ `)||(r+=`
181
+ `),Y(e,r,{encoding:"utf8",mode:384}),{configFile:e,previousFile:o,preservedPrevious:l.length>0&&!p}}import{existsSync as ne,mkdirSync as re,readFileSync as se,writeFileSync as ie}from"node:fs";import{homedir as ce}from"node:os";import{dirname as ae,join as P}from"node:path";function le(t){return`'${t.replace(/'/g,"'\\''")}'`}function B(t={}){let e=t.hooksFile??P(process.env.CODEX_HOME??P(ce(),".codex"),"hooks.json");re(ae(e),{recursive:!0});let o={};if(ne(e))try{o=JSON.parse(se(e,"utf8"))}catch(c){throw new Error(`Invalid existing Codex hooks.json: ${c instanceof Error?c.message:String(c)}`)}let r=o.hooks&&typeof o.hooks=="object"&&!Array.isArray(o.hooks)?o.hooks:{};o.hooks=r;let a=(Array.isArray(r.SessionStart)?r.SessionStart:[]).filter(c=>{try{return!JSON.stringify(c).includes("session:codex-context")}catch{return!0}}),s=t.binary??"toolnet-memory";return a.push({matcher:"startup|resume|clear|compact",hooks:[{type:"command",command:`${le(s)} session:codex-context`,timeout:15,additionalContextLimit:1e3,statusMessage:"Loading ToolNet project continuity"}]}),r.SessionStart=a,ie(e,JSON.stringify(o,null,2)+`
182
+ `,{encoding:"utf8",mode:384}),e}function A(t){return ge("sh",["-lc",`command -v ${JSON.stringify(t)} >/dev/null 2>&1`],{stdio:"ignore"}).status===0}function de(){return A("agy")||h(x(C(),".gemini"))}function ue(){return A("opencode")||h(x(C(),".config","opencode"))}function fe(){return A("codex")||h(process.env.CODEX_HOME??x(C(),".codex"))}function T(t={}){let e=t.binary??process.env.TOOLNET_MEMORY_BIN??"toolnet-memory",o=[];if(!(t.force===!0||de()))o.push({agent:"agy",detected:!1,installed:!1,targets:[]});else try{let n=F({binary:e});o.push({agent:"agy",detected:!0,installed:!0,targets:[n]})}catch(n){o.push({agent:"agy",detected:!0,installed:!1,targets:[],error:n instanceof Error?n.message:String(n)})}if(!(t.force===!0||ue()))o.push({agent:"opencode",detected:!1,installed:!1,targets:[]});else try{let n=w({binary:e});o.push({agent:"opencode",detected:!0,installed:!0,targets:[n]})}catch(n){o.push({agent:"opencode",detected:!0,installed:!1,targets:[],error:n instanceof Error?n.message:String(n)})}if(!(t.force===!0||fe()))o.push({agent:"codex",detected:!1,installed:!1,targets:[]});else try{let n=j({binary:e}),a=B({binary:e}),s=[n.configFile,a];n.preservedPrevious&&s.push(n.previousFile),o.push({agent:"codex",detected:!0,installed:!0,targets:s})}catch(n){o.push({agent:"codex",detected:!0,installed:!1,targets:[],error:n instanceof Error?n.message:String(n)})}return o}function me(t){console.log(""),console.log("ToolNet Memory AI Integrations"),console.log("=============================="),console.log("");for(let e of t){let o=e.agent==="agy"?"Agy / Antigravity":e.agent==="opencode"?"OpenCode":"Codex";if(!e.detected){console.log(`- ${o}: not detected`);continue}if(e.installed){console.log(`\u2713 ${o}: automatic memory enabled`);continue}console.log(`\u2717 ${o}: integration failed`),e.error&&console.log(` ${e.error}`)}console.log("")}async function pe(){let t=process.argv.slice(2),e=t.includes("--all"),o=t.includes("--json"),r=T({force:e});if(o){console.log(JSON.stringify(r,null,2));return}me(r)}var ye=process.argv[1]&&(process.argv[1].endsWith("auto-integrate.js")||process.argv[1].endsWith("auto-integrate.ts"));ye&&pe().catch(t=>{console.error(t instanceof Error?t.message:String(t)),process.exitCode=1});var N=K.join(Ee.homedir(),".config","toolnet-memory"),m=K.join(N,".env");function _e(t){let e=new Map;for(let o of t.split(/\r?\n/)){let r=o.trim();if(!r||r.startsWith("#"))continue;let n=r.indexOf("=");n!==-1&&e.set(r.slice(0,n).trim(),r.slice(n+1).trim())}return e}function M(t){f.mkdirSync(N,{recursive:!0,mode:448});let e=`# ==========================================================
2
183
  # TOOLNET MEMORY
3
184
  # ==========================================================
4
185
 
5
186
  MEMORY_STORAGE_PROVIDER=huggingface
6
187
 
7
188
  # Hugging Face
8
- HF_NAMESPACE=${o.get("HF_NAMESPACE")??""}
9
- HF_BUCKET=${o.get("HF_BUCKET")??"toolnet-memory"}
10
- HF_S3_ACCESS_KEY_ID=${o.get("HF_S3_ACCESS_KEY_ID")??""}
11
- HF_S3_SECRET_ACCESS_KEY=${o.get("HF_S3_SECRET_ACCESS_KEY")??""}
189
+ HF_NAMESPACE=${t.get("HF_NAMESPACE")??""}
190
+ HF_BUCKET=${t.get("HF_BUCKET")??"toolnet-memory"}
191
+ HF_S3_ACCESS_KEY_ID=${t.get("HF_S3_ACCESS_KEY_ID")??""}
192
+ HF_S3_SECRET_ACCESS_KEY=${t.get("HF_S3_SECRET_ACCESS_KEY")??""}
12
193
 
13
194
  # Local cache
14
- MEMORY_LOCAL_STORAGE_PATH=${o.get("MEMORY_LOCAL_STORAGE_PATH")??""}
15
- MEMORY_LOCAL_CACHE_MB=${o.get("MEMORY_LOCAL_CACHE_MB")??"200"}
195
+ MEMORY_LOCAL_STORAGE_PATH=${t.get("MEMORY_LOCAL_STORAGE_PATH")??""}
196
+ MEMORY_LOCAL_CACHE_MB=${t.get("MEMORY_LOCAL_CACHE_MB")??"200"}
16
197
 
17
198
  # Automation
18
- MEMORY_AUTO_CAPTURE=${o.get("MEMORY_AUTO_CAPTURE")??"true"}
19
- MEMORY_AUTO_RETRIEVE=${o.get("MEMORY_AUTO_RETRIEVE")??"true"}
20
- MEMORY_AUTO_SUMMARIZE=${o.get("MEMORY_AUTO_SUMMARIZE")??"true"}
21
- MEMORY_AUTO_SYNC=${o.get("MEMORY_AUTO_SYNC")??"true"}
199
+ MEMORY_AUTO_CAPTURE=${t.get("MEMORY_AUTO_CAPTURE")??"true"}
200
+ MEMORY_AUTO_RETRIEVE=${t.get("MEMORY_AUTO_RETRIEVE")??"true"}
201
+ MEMORY_AUTO_SUMMARIZE=${t.get("MEMORY_AUTO_SUMMARIZE")??"true"}
202
+ MEMORY_AUTO_SYNC=${t.get("MEMORY_AUTO_SYNC")??"true"}
22
203
 
23
204
  # Retrieval
24
- MEMORY_MAX_CANDIDATES=${o.get("MEMORY_MAX_CANDIDATES")??"50"}
25
- MEMORY_RERANK_TOP=${o.get("MEMORY_RERANK_TOP")??"10"}
26
- MEMORY_FINAL_CONTEXT=${o.get("MEMORY_FINAL_CONTEXT")??"5"}
27
- MEMORY_TOKEN_BUDGET=${o.get("MEMORY_TOKEN_BUDGET")??"2000"}
28
- `;g.writeFileSync(E,e,{encoding:"utf8",mode:384}),g.chmodSync(u,448),g.chmodSync(E,384)}function A(o,e=!0){let n=o.trim().toLowerCase();return n?n==="y"||n==="yes":e}async function F(o){return s.isTTY?(l.write(o),new Promise(e=>{let n="",i=()=>{s.off("data",t),s.setRawMode?.(!1),s.pause(),l.write(`
29
- `),e(n)},t=_=>{for(let r of _.toString("utf8")){if(r==="\r"||r===`
30
- `){i();return}if(r===""&&(s.setRawMode?.(!1),l.write(`
31
- `),process.exit(130)),r==="\x7F"){n=n.slice(0,-1);continue}n+=r}};s.resume(),s.setRawMode?.(!0),s.on("data",t)})):""}async function d(){let o=g.existsSync(E),e=o?Y(g.readFileSync(E,"utf8")):new Map,n=["HF_NAMESPACE","HF_BUCKET","HF_S3_ACCESS_KEY_ID","HF_S3_SECRET_ACCESS_KEY"],i=n.every(c=>!!e.get(c)?.trim());if(console.log(""),console.log("TOOLNET MEMORY SETUP"),console.log("===================="),console.log(""),console.log(`Config: ${E}`),console.log(""),!s.isTTY||!l.isTTY){o||a(e),i?console.log("\u2713 Hugging Face storage already configured"):(console.log("Configuration pending."),console.log("Run:"),console.log(" toolnet-memory setup"));return}let t=O.createInterface({input:s,output:l});if(i){console.log("\u2713 Hugging Face storage already configured"),console.log("");let c=await t.question("Use existing configuration? (Y/n) [Y]: ");if(A(c)){t.close(),console.log(""),console.log("\u2713 Existing Hugging Face configuration kept"),console.log(""),console.log("Next:"),console.log(" toolnet-memory doctor");return}console.log("")}else{let c=await t.question("Configure Hugging Face storage now? (Y/n) [Y]: ");if(!A(c)){t.close(),o||a(e),console.log(""),console.log("Configuration pending."),console.log("Run later:"),console.log(" toolnet-memory setup");return}console.log("")}let _=e.get("HF_NAMESPACE")||"",r=e.get("HF_BUCKET")||"toolnet-memory",f=await t.question(_?`Hugging Face namespace [${_}]: `:"Hugging Face namespace: "),M=await t.question(`Bucket [${r}]: `),S=await t.question(e.get("HF_S3_ACCESS_KEY_ID")?"S3 Access Key ID [configured]: ":"S3 Access Key ID: ");t.close();let m=await F(e.get("HF_S3_SECRET_ACCESS_KEY")?"S3 Secret Access Key [configured]: ":"S3 Secret Access Key: ");f.trim()&&e.set("HF_NAMESPACE",f.trim()),M.trim()?e.set("HF_BUCKET",M.trim()):e.get("HF_BUCKET")||e.set("HF_BUCKET","toolnet-memory"),S.trim()&&e.set("HF_S3_ACCESS_KEY_ID",S.trim()),m.trim()&&e.set("HF_S3_SECRET_ACCESS_KEY",m.trim()),a(e);let C=n.filter(c=>!e.get(c)?.trim());if(console.log(""),console.log("\u2713 Configuration saved"),console.log(` ${E}`),console.log(""),C.length){console.log("Missing configuration:");for(let c of C)console.log(` - ${c}`);console.log(""),console.log("Run setup again:"),console.log(" toolnet-memory setup");return}console.log("\u2713 Hugging Face configuration complete"),console.log(""),console.log("Next:"),console.log(" toolnet-memory doctor")}d().catch(o=>{console.error(o instanceof Error?o.message:String(o)),process.exit(1)});
205
+ MEMORY_MAX_CANDIDATES=${t.get("MEMORY_MAX_CANDIDATES")??"50"}
206
+ MEMORY_RERANK_TOP=${t.get("MEMORY_RERANK_TOP")??"10"}
207
+ MEMORY_FINAL_CONTEXT=${t.get("MEMORY_FINAL_CONTEXT")??"5"}
208
+ MEMORY_TOKEN_BUDGET=${t.get("MEMORY_TOKEN_BUDGET")??"2000"}
209
+ `;f.writeFileSync(m,e,{encoding:"utf8",mode:384}),f.chmodSync(N,448),f.chmodSync(m,384)}function D(t,e=!0){let o=t.trim().toLowerCase();return o?o==="y"||o==="yes":e}async function Oe(t){return g.isTTY?(y.write(t),new Promise(e=>{let o="",r=()=>{g.off("data",n),g.setRawMode?.(!1),g.pause(),y.write(`
210
+ `),e(o)},n=a=>{for(let s of a.toString("utf8")){if(s==="\r"||s===`
211
+ `){r();return}if(s===""&&(g.setRawMode?.(!1),y.write(`
212
+ `),process.exit(130)),s==="\x7F"){o=o.slice(0,-1);continue}o+=s}};g.resume(),g.setRawMode?.(!0),g.on("data",n)})):""}function R(){try{let e=T().filter(o=>o.installed);if(e.length>0){console.log(""),console.log("Automatic AI memory:");for(let o of e){let r=o.agent==="agy"?"Agy / Antigravity":o.agent==="opencode"?"OpenCode":"Codex";console.log(` \u2713 ${r}`)}}}catch{}}async function he(){let t=f.existsSync(m),e=t?_e(f.readFileSync(m,"utf8")):new Map,o=["HF_NAMESPACE","HF_BUCKET","HF_S3_ACCESS_KEY_ID","HF_S3_SECRET_ACCESS_KEY"],r=o.every(i=>!!e.get(i)?.trim());if(console.log(""),console.log("TOOLNET MEMORY SETUP"),console.log("===================="),console.log(""),console.log(`Config: ${m}`),console.log(""),!g.isTTY||!y.isTTY){t||M(e),r?console.log("\u2713 Hugging Face storage already configured"):(console.log("Configuration pending."),console.log("Run:"),console.log(" toolnet-memory setup")),R();return}let n=Se.createInterface({input:g,output:y});if(r){console.log("\u2713 Hugging Face storage already configured"),console.log("");let i=await n.question("Use existing configuration? (Y/n) [Y]: ");if(D(i)){n.close(),console.log(""),console.log("\u2713 Existing Hugging Face configuration kept"),console.log(""),R(),console.log("Next:"),console.log(" toolnet-memory doctor");return}console.log("")}else{let i=await n.question("Configure Hugging Face storage now? (Y/n) [Y]: ");if(!D(i)){n.close(),t||M(e),console.log(""),console.log("Configuration pending."),console.log("Run later:"),console.log(" toolnet-memory setup");return}console.log("")}let a=e.get("HF_NAMESPACE")||"",s=e.get("HF_BUCKET")||"toolnet-memory",c=await n.question(a?`Hugging Face namespace [${a}]: `:"Hugging Face namespace: "),u=await n.question(`Bucket [${s}]: `),d=await n.question(e.get("HF_S3_ACCESS_KEY_ID")?"S3 Access Key ID [configured]: ":"S3 Access Key ID: ");n.close();let l=await Oe(e.get("HF_S3_SECRET_ACCESS_KEY")?"S3 Secret Access Key [configured]: ":"S3 Secret Access Key: ");c.trim()&&e.set("HF_NAMESPACE",c.trim()),u.trim()?e.set("HF_BUCKET",u.trim()):e.get("HF_BUCKET")||e.set("HF_BUCKET","toolnet-memory"),d.trim()&&e.set("HF_S3_ACCESS_KEY_ID",d.trim()),l.trim()&&e.set("HF_S3_SECRET_ACCESS_KEY",l.trim()),M(e);let p=o.filter(i=>!e.get(i)?.trim());if(console.log(""),console.log("\u2713 Configuration saved"),console.log(` ${m}`),console.log(""),p.length){console.log("Missing configuration:");for(let i of p)console.log(` - ${i}`);console.log(""),console.log("Run setup again:"),console.log(" toolnet-memory setup");return}console.log("\u2713 Hugging Face configuration complete"),console.log(""),R(),console.log("Next:"),console.log(" toolnet-memory doctor")}he().catch(t=>{console.error(t instanceof Error?t.message:String(t)),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "toolnet-memory",
3
- "version": "0.2.4",
3
+ "version": "0.2.6",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "tsx src/index.ts",
@@ -50,6 +50,7 @@
50
50
  "@aws-sdk/s3-request-presigner": "^3.1102.0",
51
51
  "@modelcontextprotocol/sdk": "^1.30.0",
52
52
  "dotenv": "^17.4.2",
53
+ "typescript": "^5.9.3",
53
54
  "zod": "^4.4.3"
54
55
  },
55
56
  "devDependencies": {
@@ -57,7 +58,6 @@
57
58
  "3d-force-graph": "^1.80.0",
58
59
  "esbuild": "^0.28.1",
59
60
  "tsx": "^4.20.0",
60
- "typescript": "^5.9.0",
61
61
  "vitest": "^3.2.0"
62
62
  },
63
63
  "bin": {