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/.env.example +9 -0
- package/bin/toolnet-memory +12 -6
- package/bundle/agy-hook.js +78 -0
- package/bundle/auto-integrate.js +182 -0
- package/bundle/codex-context.js +55 -0
- package/bundle/full-index.js +5 -5
- package/bundle/graph-index.js +4 -4
- package/bundle/impact.js +4 -4
- package/bundle/incremental.js +4 -4
- package/bundle/mcp.js +7 -7
- package/bundle/runtime.js +11 -11
- package/bundle/semantic.js +6 -6
- package/bundle/setup.js +200 -19
- package/package.json +2 -2
package/bundle/setup.js
CHANGED
|
@@ -1,31 +1,212 @@
|
|
|
1
|
-
import
|
|
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=${
|
|
9
|
-
HF_BUCKET=${
|
|
10
|
-
HF_S3_ACCESS_KEY_ID=${
|
|
11
|
-
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=${
|
|
15
|
-
MEMORY_LOCAL_CACHE_MB=${
|
|
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=${
|
|
19
|
-
MEMORY_AUTO_RETRIEVE=${
|
|
20
|
-
MEMORY_AUTO_SUMMARIZE=${
|
|
21
|
-
MEMORY_AUTO_SYNC=${
|
|
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=${
|
|
25
|
-
MEMORY_RERANK_TOP=${
|
|
26
|
-
MEMORY_FINAL_CONTEXT=${
|
|
27
|
-
MEMORY_TOKEN_BUDGET=${
|
|
28
|
-
`;
|
|
29
|
-
`),e(
|
|
30
|
-
`){
|
|
31
|
-
`),process.exit(130)),
|
|
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.
|
|
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": {
|