toolnet-memory 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/toolnet-memory +44 -111
- package/bundle/graph-cli.js +1 -0
- package/bundle/graph-ui.js +3 -0
- package/bundle/help-cli.js +4 -0
- package/bundle/model-cli.js +2 -0
- package/bundle/public/index.html +2987 -0
- package/bundle/public/vendor/3d-force-graph.min.js +5 -0
- package/bundle/status-cli.js +4 -0
- package/package.json +1 -1
package/bin/toolnet-memory
CHANGED
|
@@ -595,119 +595,52 @@ case "$COMMAND" in
|
|
|
595
595
|
;;
|
|
596
596
|
|
|
597
597
|
help|--help|-h)
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
GUARD (Architecture & Rule Checking):
|
|
631
|
-
toolnet-memory guard:check Check project rules and evidence
|
|
632
|
-
toolnet-memory guard:check --file <path> Check if file violates rules
|
|
633
|
-
toolnet-memory guard:check --command "<cmd>" Check if command is dangerous
|
|
634
|
-
toolnet-memory guard:explain Show rules and evidence
|
|
635
|
-
toolnet-memory guard:json Output guard result as JSON
|
|
636
|
-
|
|
637
|
-
NOTE: Raw transcripts are not injected into prompts.
|
|
638
|
-
Durable memory is promoted selectively based on importance scoring.
|
|
639
|
-
Guard mode: warn (default), strict, or off (TOOLNET_GUARD_MODE)
|
|
640
|
-
|
|
641
|
-
PROJECT MANUAL:
|
|
642
|
-
toolnet-memory project:manual-init [--project PATH]
|
|
643
|
-
toolnet-memory project:manual-show [--project PATH]
|
|
644
|
-
toolnet-memory project:manual-sync [--project PATH]
|
|
645
|
-
|
|
646
|
-
MEMORY AGENT QUERY:
|
|
647
|
-
toolnet-memory ask "<question>" Ask concise project-memory questions
|
|
648
|
-
|
|
649
|
-
WORK CONTINUITY:
|
|
650
|
-
toolnet-memory work:status [--project PATH]
|
|
651
|
-
toolnet-memory work:json [--project PATH]
|
|
652
|
-
toolnet-memory work:reconcile [--project PATH]
|
|
653
|
-
|
|
654
|
-
CODE INTELLIGENCE:
|
|
655
|
-
toolnet-memory index
|
|
656
|
-
toolnet-memory index:graph
|
|
657
|
-
toolnet-memory incremental
|
|
658
|
-
toolnet-memory semantic "query"
|
|
659
|
-
toolnet-memory impact [file]
|
|
660
|
-
|
|
661
|
-
SETUP & INTEGRATION:
|
|
662
|
-
toolnet-memory --version
|
|
663
|
-
toolnet-memory doctor
|
|
664
|
-
toolnet-memory provider:list
|
|
665
|
-
toolnet-memory provider:status
|
|
666
|
-
toolnet-memory provider:test [llm|embedding]
|
|
667
|
-
toolnet-memory setup
|
|
668
|
-
toolnet-memory update
|
|
669
|
-
toolnet-memory config get KEY
|
|
670
|
-
toolnet-memory config set KEY VALUE
|
|
671
|
-
toolnet-memory config open
|
|
672
|
-
toolnet-memory integrate:auto
|
|
673
|
-
toolnet-memory integrate:opencode
|
|
674
|
-
toolnet-memory integrate:agy
|
|
675
|
-
toolnet-memory integrate:codex
|
|
676
|
-
toolnet-memory mcp
|
|
677
|
-
toolnet-memory api
|
|
678
|
-
|
|
679
|
-
OPTIONAL BACKGROUND SERVICE:
|
|
680
|
-
toolnet-memory service:install Install/start daemon in PM2
|
|
681
|
-
toolnet-memory service:start Start installed daemon
|
|
682
|
-
toolnet-memory service:stop Stop daemon
|
|
683
|
-
toolnet-memory service:restart Restart daemon after ToolNet updates
|
|
684
|
-
toolnet-memory service:status Show daemon/cache status
|
|
685
|
-
toolnet-memory service:remove Remove daemon from PM2
|
|
686
|
-
toolnet-memory service Run daemon in foreground
|
|
687
|
-
|
|
688
|
-
PRODUCTION:
|
|
689
|
-
toolnet-memory production:certify Verify packaged production runtime
|
|
690
|
-
|
|
691
|
-
SNAPSHOTS:
|
|
692
|
-
toolnet-memory snapshot:list
|
|
693
|
-
toolnet-memory snapshot:create "reason"
|
|
694
|
-
toolnet-memory snapshot:restore <id>
|
|
695
|
-
toolnet-memory recover
|
|
696
|
-
|
|
697
|
-
SESSION SYNC (manual):
|
|
698
|
-
toolnet-memory session:agy-sync <conversation-id> --transcript <path>
|
|
699
|
-
toolnet-memory session:codex-sync <thread-id>
|
|
700
|
-
toolnet-memory session:opencode-sync <session-id>
|
|
701
|
-
|
|
702
|
-
IMPORTANT:
|
|
703
|
-
Deep recovery commands (brief, handoff:latest, session:*-recover) are manual only.
|
|
704
|
-
Do not run them automatically at startup. Use fast context commands instead.
|
|
705
|
-
HELP
|
|
598
|
+
shift
|
|
599
|
+
run bundle/help-cli.js src/production/help-cli.ts "$@"
|
|
600
|
+
;;
|
|
601
|
+
|
|
602
|
+
# Aliases
|
|
603
|
+
context)
|
|
604
|
+
shift
|
|
605
|
+
run bundle/context-runtime.js src/work-continuity/context-runtime-cli.ts print "$@"
|
|
606
|
+
;;
|
|
607
|
+
|
|
608
|
+
work)
|
|
609
|
+
shift
|
|
610
|
+
if [ -f "$ROOT/bundle/work-continuity.js" ]; then
|
|
611
|
+
exec node "$ROOT/bundle/work-continuity.js" status "$@"
|
|
612
|
+
fi
|
|
613
|
+
exec "$TSX" "$ROOT/src/work-continuity/cli.ts" status "$@"
|
|
614
|
+
;;
|
|
615
|
+
|
|
616
|
+
graph)
|
|
617
|
+
shift
|
|
618
|
+
run bundle/graph-cli.js src/production/graph-cli.ts "$@"
|
|
619
|
+
;;
|
|
620
|
+
|
|
621
|
+
graph:ui)
|
|
622
|
+
shift
|
|
623
|
+
run bundle/graph-cli.js src/production/graph-cli.ts "$@"
|
|
624
|
+
;;
|
|
625
|
+
|
|
626
|
+
model)
|
|
627
|
+
shift
|
|
628
|
+
run bundle/model-cli.js src/production/model-cli.ts "$@"
|
|
706
629
|
;;
|
|
707
630
|
|
|
631
|
+
provider)
|
|
632
|
+
shift
|
|
633
|
+
run bundle/provider.js src/ai/provider-cli.ts status "$@"
|
|
634
|
+
;;
|
|
635
|
+
|
|
636
|
+
status)
|
|
637
|
+
shift
|
|
638
|
+
run bundle/status-cli.js src/production/status-cli.ts "$@"
|
|
639
|
+
;;
|
|
640
|
+
|
|
641
|
+
|
|
708
642
|
*)
|
|
709
|
-
|
|
710
|
-
echo "Run: toolnet-memory help"
|
|
711
|
-
exit 1
|
|
643
|
+
run bundle/help-cli.js src/production/help-cli.ts --unknown "$COMMAND"
|
|
712
644
|
;;
|
|
645
|
+
|
|
713
646
|
esac
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{spawn as U}from"node:child_process";import{dirname as T,resolve as v}from"node:path";import{fileURLToPath as E}from"node:url";var h={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},C={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function b(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let n=process.env.TERM_PROGRAM,r=process.env.WT_SESSION,e=process.env.VSCODE_PID,t=process.env.ConEmuPID;return!!(r||e||t||n==="vscode")}return process.env.TERM!=="linux"}var u;function a(){return u||(u=b()?h:C),u}var i={reset:"\x1B[0m",green:"\x1B[32m",cyan:"\x1B[36m",red:"\x1B[31m",yellow:"\x1B[33m",amber:"\x1B[38;5;214m",white:"\x1B[97m",dim:"\x1B[2m",bold:"\x1B[1m"};function x(n){return n.noColor||process.env.NO_COLOR?!1:n.tty??process.stdout.isTTY??!1}function l(n,r,e){return x(e)?`${r}${n}${i.reset}`:n}function c(n,r){return l(n,i.dim,r)}function g(n,r){return l(n,i.cyan,r)}function G(n,r){return l(n,i.green,r)}function y(n,r){return l(n,i.red,r)}function m(n,r,e){let t=a(),s=r?` ${c(`v${r}`,e)}`:"";return`${g(t.phaseDone,e)} ${n}${s}`}function d(n){let r=a();return G(r.phaseDone,n)}function O(n){return y("\u2717",n)}function S(n){return{tty:n.tty,noColor:n.noColor}}async function R(n){let r=S(n);console.log(""),console.log(m("Code Graph",void 0,r)),console.log("");let e=T(E(import.meta.url)),t=v(e,"graph-ui.js"),s=process.env.TOOLNET_GRAPH_PORT??"9749",f=process.env.TOOLNET_GRAPH_HOST??"127.0.0.1";console.log(c(" Starting visualization server...",r)),console.log("");let p=U(process.execPath,[t],{stdio:"inherit",env:{...process.env,TOOLNET_GRAPH_PORT:s,TOOLNET_GRAPH_HOST:f}});await new Promise(o=>setTimeout(o,1e3)),console.log(d(r)+" Graph UI started"),console.log(""),console.log(` ${g(`http://${f}:${s}`,r)}`),console.log(""),console.log(c(" Press Ctrl+C to stop",r)),console.log(""),process.on("SIGINT",()=>{p.kill("SIGTERM"),process.exit(0)}),process.on("SIGTERM",()=>{p.kill("SIGTERM"),process.exit(0)}),p.on("exit",o=>{o!==0&&o!==null&&(console.log(""),console.log(O(r)+" Graph UI stopped unexpectedly"),console.log(""),process.exit(o))})}async function $(){let n=process.argv.slice(2),r={tty:process.stdout.isTTY,noColor:process.env.NO_COLOR!==void 0||n.includes("--no-color")};await R(r)}$().catch(n=>{console.error(""),console.error(n instanceof Error?n.message:String(n)),console.error(""),process.exitCode=1});
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import"dotenv/config";import{createReadStream as ue}from"node:fs";import{createServer as ut}from"node:http";import{dirname as mt,resolve as Q}from"node:path";import{fileURLToPath as ft}from"node:url";import{existsSync as ge,readFileSync as he}from"node:fs";import{homedir as ye}from"node:os";import{join as Se}from"node:path";function be(n){let t=n.trim();return t.length>=2&&t.startsWith('"')&&t.endsWith('"')?(t=t.slice(1,-1),t.replace(/\\n/g,`
|
|
2
|
+
`).replace(/\\r/g,"\r").replace(/\\t/g," ").replace(/\\"/g,'"').replace(/\\\\/g,"\\")):t.length>=2&&t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function xe(){let n=process.env.TOOLNET_GLOBAL_ENV??Se(ye(),".config","toolnet-memory",".env");if(!ge(n))return;let t=he(n,"utf8");for(let e of t.split(/\r?\n/)){let s=e.trim();if(!s||s.startsWith("#"))continue;s.startsWith("export ")&&(s=s.slice(7));let a=s.indexOf("=");if(a<=0)continue;let c=s.slice(0,a).trim();/^[A-Za-z_][A-Za-z0-9_]*$/.test(c)&&process.env[c]===void 0&&(process.env[c]=be(s.slice(a+1)))}}xe();function N(n,t){return n===void 0?t:["1","true","yes","on"].includes(n.toLowerCase())}function L(n,t){if(!n)return t;let e=Number(n);return Number.isFinite(e)?e:t}function te(){return{memory:{autoCapture:N(process.env.MEMORY_AUTO_CAPTURE,!0),autoRetrieve:N(process.env.MEMORY_AUTO_RETRIEVE,!0),autoSummarize:N(process.env.MEMORY_AUTO_SUMMARIZE,!0),autoSync:N(process.env.MEMORY_AUTO_SYNC,!0)},retrieval:{maxCandidates:L(process.env.MEMORY_MAX_CANDIDATES,50),rerankTop:L(process.env.MEMORY_RERANK_TOP,10),finalContext:L(process.env.MEMORY_FINAL_CONTEXT,5),tokenBudget:L(process.env.MEMORY_TOKEN_BUDGET,2e3)},storage:{provider:process.env.MEMORY_STORAGE_PROVIDER??"huggingface",r2:{accountId:process.env.R2_ACCOUNT_ID,bucket:process.env.R2_BUCKET,accessKeyId:process.env.R2_ACCESS_KEY_ID,secretAccessKey:process.env.R2_SECRET_ACCESS_KEY},s3:{endpoint:process.env.S3_ENDPOINT,region:process.env.S3_REGION,bucket:process.env.S3_BUCKET,accessKeyId:process.env.S3_ACCESS_KEY_ID,secretAccessKey:process.env.S3_SECRET_ACCESS_KEY,forcePathStyle:N(process.env.S3_FORCE_PATH_STYLE,!1)},huggingface:{namespace:process.env.HF_NAMESPACE,bucket:process.env.HF_BUCKET,accessKeyId:process.env.HF_S3_ACCESS_KEY_ID,secretAccessKey:process.env.HF_S3_SECRET_ACCESS_KEY},localRoot:process.env.MEMORY_LOCAL_STORAGE_PATH},cache:{maxMb:L(process.env.MEMORY_LOCAL_CACHE_MB,200)}}}import{createHash as Ce}from"node:crypto";import{existsSync as J,mkdirSync as we,readFileSync as Ee,renameSync as ve,writeFileSync as Pe}from"node:fs";import{basename as ke,dirname as K,join as B,parse as oe,resolve as I}from"node:path";var ne=".toolnet",je="project.json";function Re(n){return Ce("sha256").update(n).digest("hex").slice(0,16)}function Y(n){return B(n,ne,je)}function Te(n){return J(Y(n))}function Ae(n,t){let e=I(n),s=oe(e).root;for(;;){if(Te(e))return e;if(e===s||t&&e===I(t))break;let a=K(e);if(a===e)break;e=a}return null}function Me(n){let t=I(n),e=oe(t).root,s=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"];for(;;){if(s.some(c=>J(B(t,c))))return t;if(t===e)break;let a=K(t);if(a===t)break;t=a}return I(n)}function Ne(n){let t;try{t=JSON.parse(Ee(n,"utf8"))}catch(a){throw new Error(`Invalid ToolNet project manifest: ${n}: ${a instanceof Error?a.message:String(a)}`)}if(!t||typeof t!="object")throw new Error(`Invalid ToolNet project manifest: ${n}`);let e=t;if(typeof e.id!="string"||!e.id.trim())throw new Error(`ToolNet project manifest is missing id: ${n}`);if(typeof e.name!="string"||!e.name.trim())throw new Error(`ToolNet project manifest is missing name: ${n}`);let s=new Date().toISOString();return{version:1,id:e.id,name:e.name,remote:typeof e.remote=="string"&&e.remote.trim()?e.remote:e.name,rootPath:typeof e.rootPath=="string"?e.rootPath:K(K(n)),createdAt:typeof e.createdAt=="string"?e.createdAt:s,updatedAt:typeof e.updatedAt=="string"?e.updatedAt:s,graphVersion:typeof e.graphVersion=="number"?e.graphVersion:0,memoryVersion:typeof e.memoryVersion=="number"?e.memoryVersion:0,metadata:e.metadata&&typeof e.metadata=="object"?e.metadata:void 0}}function re(n,t){let e=B(n,ne);we(e,{recursive:!0});let s=Y(n),a=`${s}.tmp-${process.pid}`;Pe(a,JSON.stringify(t,null,2)+`
|
|
3
|
+
`,{encoding:"utf8",mode:384}),ve(a,s)}function se(n,t){return{id:n.id,name:n.name,remote:n.remote,rootPath:t,createdAt:n.createdAt,updatedAt:n.updatedAt,graphVersion:n.graphVersion,memoryVersion:n.memoryVersion,metadata:n.metadata}}var z=class{detect(t=process.cwd()){let e=I(t),s=Me(e),c=[".git","package.json","pyproject.toml","Cargo.toml","go.mod","composer.json"].some(v=>J(B(s,v))),p=Ae(e,c?s:void 0);if(p){let v=Y(p),j=Ne(v);return j.rootPath!==p&&(j.rootPath=p,j.updatedAt=new Date().toISOString(),re(p,j)),se(j,p)}let k=new Date().toISOString(),b=ke(s),E={version:1,id:Re(s),name:b,remote:b,rootPath:s,createdAt:k,updatedAt:k,graphVersion:0,memoryVersion:0};return re(s,E),se(E,s)}};import*as w from"typescript";var A=class{symbols=new Map;edges=new Map;addSymbol(t){this.symbols.set(t.id,t)}addEdge(t){this.edges.set(t.id,t)}getSymbol(t){return this.symbols.get(t)}findByName(t,e){return[...this.symbols.values()].filter(s=>s.projectId===t&&(s.name===e||s.qualifiedName===e))}allSymbols(t){return[...this.symbols.values()].filter(e=>e.projectId===t)}allEdges(t){return[...this.edges.values()].filter(e=>e.projectId===t)}import(t,e){for(let s of t)this.addSymbol(s);for(let s of e)this.addEdge(s)}clearProject(t){for(let[e,s]of this.symbols)s.projectId===t&&this.symbols.delete(e);for(let[e,s]of this.edges)s.projectId===t&&this.edges.delete(e)}};import{execFile as $e}from"node:child_process";import{promisify as Fe}from"node:util";var kr=Fe($e);import*as P from"typescript";import*as m from"typescript";var Gs=new Set([m.SyntaxKind.EqualsToken,m.SyntaxKind.PlusEqualsToken,m.SyntaxKind.MinusEqualsToken,m.SyntaxKind.AsteriskEqualsToken,m.SyntaxKind.SlashEqualsToken,m.SyntaxKind.PercentEqualsToken,m.SyntaxKind.QuestionQuestionEqualsToken,m.SyntaxKind.AmpersandAmpersandEqualsToken,m.SyntaxKind.BarBarEqualsToken]);var H=class{constructor(t){this.graph=t}graph;build(t,e,s,a){let c=this.graph.allSymbols(t),p=this.graph.allEdges(t),k=new Map(e?.layers.map(o=>[o.filePath,o.layer])??[]),b=new Map;for(let o of e?.clusters??[])for(let r of o.files)b.set(r,{id:o.id,label:o.label});let E=new Map(e?.hotspots.map(o=>[o.filePath,o.score])??[]),v=new Map(s?.deadCode.map(o=>[o.symbolId,{confidence:o.confidence,score:o.score}])??[]),j=new Map,M=new Map;for(let o of p)M.set(o.from,(M.get(o.from)??0)+1),j.set(o.to,(j.get(o.to)??0)+1);let R=[];for(let o=0;o<c.length;o++){let r=c[o],l=b.get(r.filePath);R.push({id:r.id,name:r.name,qualifiedName:r.qualifiedName,type:r.type,filePath:r.filePath,layer:k.get(r.filePath),cluster:l?.id,clusterLabel:l?.label,hotspotScore:E.get(r.filePath),deadCode:v.get(r.id),incoming:j.get(r.id)??0,outgoing:M.get(r.id)??0}),((o+1)%100===0||o===c.length-1)&&a?.({current:o+1,total:c.length,phase:"nodes"})}let F=new Set(R.map(o=>o.id)),T=p.filter(o=>F.has(o.from)&&F.has(o.to)),D=[];for(let o=0;o<T.length;o++){let r=T[o];D.push({source:r.from,target:r.to,type:r.type,confidence:typeof r.metadata?.confidence=="string"?r.metadata.confidence:void 0,resolver:typeof r.metadata?.resolver=="string"?r.metadata.resolver:void 0}),((o+1)%100===0||o===T.length-1)&&a?.({current:o+1,total:T.length,phase:"links"})}return{version:1,projectId:t,generatedAt:new Date().toISOString(),summary:{nodes:R.length,links:D.length,files:new Set(R.map(o=>o.filePath)).size,clusters:new Set(R.map(o=>o.cluster).filter(Boolean)).size},nodes:R,links:D}}};import{homedir as ct}from"node:os";import{join as lt}from"node:path";import{DeleteObjectCommand as Ge,GetObjectCommand as Ke,HeadObjectCommand as ze,ListObjectsV2Command as Be,PutObjectCommand as He,S3Client as Ve}from"@aws-sdk/client-s3";import{getSignedUrl as Ue}from"@aws-sdk/s3-request-presigner";var V=class{name="huggingface";client;bucket;constructor(t){this.bucket=t.bucket,this.client=new Ve({region:"us-east-1",endpoint:`https://s3.hf.co/${t.namespace}`,forcePathStyle:!0,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}})}async put(t,e,s="application/octet-stream"){let a=typeof e=="string"?Buffer.from(e,"utf8"):e;await this.client.send(new He({Bucket:this.bucket,Key:t,Body:a,ContentType:s}))}async get(t){let e=await Ue(this.client,new Ke({Bucket:this.bucket,Key:t}),{expiresIn:60}),s=await fetch(e,{redirect:"follow"});if(s.status===404)return null;if(!s.ok)throw new Error(`HF download failed: ${s.status} ${s.statusText}`);return new Uint8Array(await s.arrayBuffer())}async getText(t){let e=await this.get(t);return e?Buffer.from(e).toString("utf8"):null}async exists(t){try{return await this.client.send(new ze({Bucket:this.bucket,Key:t})),!0}catch(e){if(typeof e=="object"&&e!==null&&"$metadata"in e&&e.$metadata?.httpStatusCode===404)return!1;throw e}}async delete(t){await this.client.send(new Ge({Bucket:this.bucket,Key:t}))}async list(t=""){let e=[],s;do{let a=await this.client.send(new Be({Bucket:this.bucket,Prefix:t||void 0,ContinuationToken:s}));for(let c of a.Contents??[])c.Key&&e.push({key:c.Key,size:c.Size,updatedAt:c.LastModified?.toISOString()});s=a.IsTruncated?a.NextContinuationToken:void 0}while(s);return e}};import{access as ie,mkdir as We,readFile as Je,readdir as Ye,rm as qe,stat as ae,writeFile as Qe}from"node:fs/promises";import{dirname as Xe,join as Ze,relative as ce,resolve as et}from"node:path";var O=class{constructor(t){this.root=t}root;name="local";path(t){let e=t.replace(/^\/+/,"");return et(this.root,e)}async put(t,e){let s=this.path(t);await We(Xe(s),{recursive:!0}),await Qe(s,e)}async get(t){try{return await Je(this.path(t))}catch(e){if(typeof e=="object"&&e!==null&&"code"in e&&e.code==="ENOENT")return null;throw e}}async getText(t){let e=await this.get(t);return e?Buffer.from(e).toString("utf8"):null}async exists(t){try{return await ie(this.path(t)),!0}catch{return!1}}async delete(t){await qe(this.path(t),{force:!0})}async list(t=""){let e=this.path(t),s=[];try{await ie(e)}catch{return s}let a=async p=>{let k=await Ye(p,{withFileTypes:!0});for(let b of k){let E=Ze(p,b.name);if(b.isDirectory()){await a(E);continue}let v=await ae(E);s.push({key:ce(this.root,E),size:v.size,updatedAt:v.mtime.toISOString()})}},c=await ae(e);return c.isDirectory()?await a(e):s.push({key:ce(this.root,e),size:c.size,updatedAt:c.mtime.toISOString()}),s}};import{DeleteObjectCommand as tt,GetObjectCommand as rt,HeadObjectCommand as st,ListObjectsV2Command as ot,PutObjectCommand as nt,S3Client as it}from"@aws-sdk/client-s3";import{getSignedUrl as at}from"@aws-sdk/s3-request-presigner";var _=class{name;client;bucket;constructor(t){this.name=t.name??"s3",this.bucket=t.bucket,this.client=new it({region:t.region??"us-east-1",endpoint:t.endpoint||void 0,forcePathStyle:t.forcePathStyle??!1,requestChecksumCalculation:"WHEN_REQUIRED",responseChecksumValidation:"WHEN_REQUIRED",credentials:{accessKeyId:t.accessKeyId,secretAccessKey:t.secretAccessKey}})}async put(t,e,s="application/octet-stream"){let a=typeof e=="string"?Buffer.from(e,"utf8"):e;await this.client.send(new nt({Bucket:this.bucket,Key:t,Body:a,ContentType:s}))}async get(t){let e=await at(this.client,new rt({Bucket:this.bucket,Key:t}),{expiresIn:60}),s=await fetch(e,{redirect:"follow"});if(s.status===404)return null;if(!s.ok)throw new Error(`${this.name} download failed: ${s.status} ${s.statusText}`);return new Uint8Array(await s.arrayBuffer())}async getText(t){let e=await this.get(t);return e?Buffer.from(e).toString("utf8"):null}async exists(t){try{return await this.client.send(new st({Bucket:this.bucket,Key:t})),!0}catch(e){if(typeof e=="object"&&e!==null&&"$metadata"in e&&e.$metadata?.httpStatusCode===404)return!1;throw e}}async delete(t){await this.client.send(new tt({Bucket:this.bucket,Key:t}))}async list(t=""){let e=[],s;do{let a=await this.client.send(new ot({Bucket:this.bucket,Prefix:t||void 0,ContinuationToken:s}));for(let c of a.Contents??[])c.Key&&e.push({key:c.Key,size:c.Size,updatedAt:c.LastModified?.toISOString()});s=a.IsTruncated?a.NextContinuationToken:void 0}while(s);return e}};function q(n,t){return console.warn(t),new O(n)}function le(n){let t=n.localRoot??lt(ct(),".toolnet-memory","storage");if(n.provider==="r2"){let e=n.r2;return e?.accountId&&e.bucket&&e.accessKeyId&&e.secretAccessKey?new _({name:"r2",endpoint:`https://${e.accountId}.r2.cloudflarestorage.com`,region:"auto",bucket:e.bucket,forcePathStyle:!0,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}):q(t,"[storage] Cloudflare R2 credentials missing. Using local fallback.")}if(n.provider==="s3"){let e=n.s3;return e?.bucket&&e.accessKeyId&&e.secretAccessKey?new _({name:"s3",endpoint:e.endpoint,region:e.region??"us-east-1",bucket:e.bucket,forcePathStyle:e.forcePathStyle??!1,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}):q(t,"[storage] S3 credentials missing. Using local fallback.")}if(n.provider==="huggingface"){let e=n.huggingface;return e?.namespace&&e.bucket&&e.accessKeyId&&e.secretAccessKey?new V({namespace:e.namespace,bucket:e.bucket,accessKeyId:e.accessKeyId,secretAccessKey:e.secretAccessKey}):q(t,"[storage] Hugging Face credentials missing. Using local fallback.")}return new O(t)}function dt(n){return new Promise(t=>setTimeout(t,n))}async function de(n,t={}){let e=Math.max(1,t.attempts??3),s=t.baseDelayMs??150,a=t.maxDelayMs??2e3,c;for(let p=1;p<=e;p++)try{return await n()}catch(k){if(c=k,p>=e)break;let b=Math.min(a,s*2**(p-1)),E=Math.floor(Math.random()*Math.max(1,b*.2));await dt(b+E)}throw c}var pt=new Set(["put","get","getText","delete","list"]);function pe(n,t={}){return new Proxy(n,{get(e,s){let a=Reflect.get(e,s,e);return typeof a!="function"?a:pt.has(s)?(...c)=>de(()=>Promise.resolve(a.apply(e,c)),t):a.bind(e)}})}var me=Number(process.env.TOOLNET_GRAPH_PORT??9749),fe=process.env.TOOLNET_GRAPH_HOST??"127.0.0.1";function gt(n){if(typeof n=="string")return n;if(!n||typeof n!="object")return null;let t=n;for(let e of["key","Key","path","name"])if(typeof t[e]=="string")return t[e];return null}async function ht(n,t){return(await n.list(t)).map(gt).filter(s=>!!s)}async function $(n,t){let e=await n.getText(t);if(!e)return null;try{return JSON.parse(e)}catch{return null}}async function yt(n){let t=await ht(n,"projects/"),e=[...new Set(t.filter(c=>/^projects\/[^/]+\/project\.json$/.test(c)).map(c=>c.split("/")[1]))],s=new Set(t),a=[];for(let c of e){let p=await $(n,`projects/${c}/project.json`);!p||typeof p.id!="string"||a.push({id:p.id,name:typeof p.name=="string"?p.name:c,remote:c,hasGraph:s.has(`projects/${c}/code/graph/current.json`),hasArchitecture:s.has(`projects/${c}/code/architecture/current.json`),hasAnalysis:s.has(`projects/${c}/code/analysis/current.json`),hasVisualization:s.has(`projects/${c}/code/visualization/graph.json`)})}return a.sort((c,p)=>c.name.localeCompare(p.name))}async function St(){let n=te(),t=new z().detect(),e=pe(le({provider:n.storage.provider,huggingface:n.storage.huggingface,localRoot:n.storage.localRoot}),{attempts:3});e.name!=="huggingface"&&console.warn("[graph-ui] Remote Hugging Face storage is not active.");let s=mt(ft(import.meta.url)),a=Q(s,"public"),c=Q(a,"vendor","3d-force-graph.min.js");async function p(){let o=await yt(e),r=t.remote??t.name,l=o.find(f=>f.remote===r&&f.hasGraph),S=o.find(f=>f.hasGraph);return{projects:o,defaultProject:l?.remote??S?.remote??null}}let k=new Map;function b(o){return String(typeof o=="object"&&o!==null?o.id:o)}function E(o){return o.clusterLabel||o.cluster||o.layer||"Unclustered"}function v(o,r={}){return{id:o.id,name:o.name,remote:o.remote,hasArchitecture:o.hasArchitecture,hasAnalysis:o.hasAnalysis,...r}}async function j(o){let r=`projects/${o.remote}`,l=await $(e,`${r}/code/graph/current.json`);if(!l||!Array.isArray(l.symbols)||!Array.isArray(l.edges))throw new Error(`Code graph missing for project ${o.name}`);let S=await $(e,`${r}/code/architecture/current.json`),f=await $(e,`${r}/code/analysis/current.json`),y=new A;y.import(l.symbols,l.edges);let x=new H(y).build(o.id,S,f);return await e.put(`${r}/code/visualization/graph.json`,JSON.stringify(x),"application/json"),{...x,dashboard:v(o)}}async function M(o,r=!1){r&&k.delete(o.remote);let l=k.get(o.remote);if(l)return l;let S=`projects/${o.remote}`,f=await $(e,`${S}/code/visualization/graph.json`);if(f&&Array.isArray(f.nodes)&&Array.isArray(f.links)){let x={...f,dashboard:v(o)};return k.set(o.remote,x),x}let y=await j(o);return k.set(o.remote,y),y}function R(o,r){let l=new Map,S=new Map;for(let d of r.nodes){let u=E(d),g=`cluster:${u}`;S.set(d.id,g);let i=l.get(g);i||(i={id:g,name:u,qualifiedName:u,type:"subsystem",filePath:"",clusterLabel:u,incoming:0,outgoing:0,memberCount:0,files:new Set,viewKind:"cluster"},l.set(g,i)),i.memberCount+=1,d.filePath&&i.files.add(d.filePath)}let f=new Map;for(let d of r.links){let u=S.get(b(d.source)),g=S.get(b(d.target));if(!u||!g||u===g)continue;let i=`${u}\0${g}`,h=f.get(i);h||(h={source:u,target:g,type:"SUBSYSTEM_DEPENDENCY",count:0},f.set(i,h)),h.count+=1}for(let d of f.values()){let u=l.get(d.source),g=l.get(d.target);u&&(u.outgoing+=d.count),g&&(g.incoming+=d.count)}let y=[...l.values()].map(d=>({...d,filePath:`${d.files.size} files \xB7 ${d.memberCount} symbols`,files:void 0})),x=[...f.values()];return{version:2,projectId:r.projectId,generatedAt:r.generatedAt,summary:{nodes:y.length,links:x.length,files:r.summary?.files??0,clusters:y.length},nodes:y,links:x,dashboard:v(o,{viewMode:"overview",totalNodes:r.nodes.length,totalLinks:r.links.length})}}function F(o,r,l){let S=r.nodes.filter(i=>!l||E(i)===l),f=new Set(S.map(i=>i.id)),y=new Map,x=new Map;for(let i of S){let h=i.filePath||"(unknown)";y.set(i.id,h);let C=x.get(h);C||(C={id:`file:${h}`,name:h.split("/").pop()||h,qualifiedName:h,type:"file",filePath:h,clusterLabel:E(i),incoming:0,outgoing:0,memberCount:0,viewKind:"file"},x.set(h,C)),C.memberCount+=1}let d=new Map;for(let i of r.links){let h=b(i.source),C=b(i.target);if(!f.has(h)||!f.has(C))continue;let U=y.get(h),W=y.get(C);if(!U||!W||U===W)continue;let X=`file:${U}`,Z=`file:${W}`,ee=`${X}\0${Z}`,G=d.get(ee);G||(G={source:X,target:Z,type:"FILE_DEPENDENCY",count:0},d.set(ee,G)),G.count+=1}for(let i of d.values()){let h=x.get(String(i.source).slice(5)),C=x.get(String(i.target).slice(5));h&&(h.outgoing+=i.count),C&&(C.incoming+=i.count)}let u=[...x.values()],g=[...d.values()];return{version:2,projectId:r.projectId,generatedAt:r.generatedAt,summary:{nodes:u.length,links:g.length,files:u.length,clusters:l?1:0},nodes:u,links:g,dashboard:v(o,{viewMode:"files",selection:l,totalNodes:r.nodes.length,totalLinks:r.links.length})}}function T(o,r,l){let y=r.nodes.filter(i=>i.filePath===l),x=new Set(y.map(i=>i.id)),d=new Set;for(let i of y.slice(0,1800))d.add(i.id);for(let i of r.links){if(d.size>=1800)break;let h=b(i.source),C=b(i.target);(x.has(h)||x.has(C))&&(d.add(h),d.size<1800&&d.add(C))}let u=r.nodes.filter(i=>d.has(i.id)).map(i=>({...i,viewKind:"symbol"})),g=[];for(let i of r.links){if(g.length>=12e3)break;let h=b(i.source),C=b(i.target);d.has(h)&&d.has(C)&&g.push({...i,source:h,target:C})}return{version:2,projectId:r.projectId,generatedAt:r.generatedAt,summary:{nodes:u.length,links:g.length,files:new Set(u.map(i=>i.filePath)).size,clusters:new Set(u.map(i=>E(i))).size},nodes:u,links:g,dashboard:v(o,{viewMode:"symbols",selection:l,focused:!0,truncated:u.length>=1800||g.length>=12e3,totalNodes:r.nodes.length,totalLinks:r.links.length})}}ut(async(o,r)=>{try{let l=new URL(o.url??"/",`http://${o.headers.host??"localhost"}`);if(l.pathname==="/api/health"){let S=await p();r.setHeader("content-type","application/json; charset=utf-8"),r.setHeader("cache-control","no-store"),r.end(JSON.stringify({ok:!0,mode:"multi-project",projects:S.projects.length,indexedProjects:S.projects.filter(f=>f.hasGraph).length,defaultProject:S.defaultProject}));return}if(l.pathname==="/api/projects"){let S=await p();r.setHeader("content-type","application/json; charset=utf-8"),r.setHeader("cache-control","no-store"),r.end(JSON.stringify(S));return}if(l.pathname==="/api/graph"){let S=await p(),f=l.searchParams.get("project")??S.defaultProject;if(!f){r.statusCode=404,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:"No indexed ToolNet project found."}));return}let y=S.projects.find(i=>i.remote===f);if(!y){r.statusCode=404,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:"Project not found.",project:f}));return}if(!y.hasGraph){r.statusCode=409,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:"Project is registered but has not been indexed yet.",project:y}));return}let x=l.searchParams.get("refresh")==="1",d=await M(y,x),u=l.searchParams.get("mode")??"full",g=d;if(u==="overview")g=R(y,d);else if(u==="files")g=F(y,d,l.searchParams.get("cluster")??"");else if(u==="symbols"){let i=l.searchParams.get("file");if(!i){r.statusCode=400,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:"file is required for symbols mode."}));return}g=T(y,d,i)}else if(u!=="full"){r.statusCode=400,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:`Unknown graph mode: ${u}`}));return}r.setHeader("content-type","application/json; charset=utf-8"),r.setHeader("cache-control","no-store"),r.end(JSON.stringify(g));return}if(l.pathname==="/vendor/3d-force-graph.min.js"){r.setHeader("content-type","application/javascript; charset=utf-8"),ue(c).pipe(r);return}if(l.pathname==="/"||l.pathname==="/index.html"){r.setHeader("content-type","text/html; charset=utf-8"),r.setHeader("cache-control","no-store"),ue(Q(a,"index.html")).pipe(r);return}r.statusCode=404,r.end("Not found")}catch(l){console.error(l),r.statusCode=500,r.setHeader("content-type","application/json; charset=utf-8"),r.end(JSON.stringify({error:l instanceof Error?l.message:String(l)}))}}).listen(me,fe,()=>{console.log("ToolNet Multi-Project 3D Graph"),console.log(`Listening: http://${fe}:${me}`)})}St().catch(n=>{console.error(n),process.exit(1)});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{readFileSync as G}from"node:fs";import{dirname as D,resolve as E}from"node:path";import{fileURLToPath as j}from"node:url";var I={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},U={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function A(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let t=process.env.TERM_PROGRAM,e=process.env.WT_SESSION,o=process.env.VSCODE_PID,n=process.env.ConEmuPID;return!!(e||o||n||t==="vscode")}return process.env.TERM!=="linux"}var h;function v(){return h||(h=A()?I:U),h}var d={reset:"\x1B[0m",green:"\x1B[32m",cyan:"\x1B[36m",red:"\x1B[31m",yellow:"\x1B[33m",amber:"\x1B[38;5;214m",white:"\x1B[97m",dim:"\x1B[2m",bold:"\x1B[1m"};function T(t){return t.noColor||process.env.NO_COLOR?!1:t.tty??process.stdout.isTTY??!1}function f(t,e,o){return T(o)?`${e}${t}${d.reset}`:t}function N(t,e){return f(t,d.dim,e)}function M(t,e){return f(t,d.bold,e)}function O(t,e){return f(t,d.cyan,e)}function u(t,e,o){let n=v(),i=e?` ${N(`v${e}`,o)}`:"";return`${O(n.phaseDone,o)} ${t}${i}`}function a(t,e){return M(t,e)}function l(t,e,o,n){let i=" ".repeat(Math.max(0,o-t.length));return` ${O(t,n)}${i} ${e}`}var m=[{name:"setup",description:"Configure ToolNet",category:"core"},{name:"init",description:"Initialize current project",usage:"toolnet-memory init [path]",category:"core"},{name:"doctor",description:"Check system health",category:"core"},{name:"ask",description:"Ask project memory",usage:"toolnet-memory ask <question>",category:"memory"},{name:"context",description:"Show current project context",category:"memory",aliases:["context:print"]},{name:"work",description:"Show current work state",category:"memory",aliases:["work:status"]},{name:"index",description:"Build code intelligence",category:"code",pipeline:["Scanning files","Parsing code","Type Resolution","Rich Graph","Semantic Code Index","Architecture Intelligence","Graph Analysis","3D Visualization Dataset"]},{name:"semantic",description:"Semantic code search",usage:"toolnet-memory semantic <query>",category:"code"},{name:"impact",description:"Analyze change impact",usage:"toolnet-memory impact <file>",category:"code"},{name:"graph",description:"Open code graph UI",category:"code"},{name:"graph:ui",description:"Open code graph UI",category:"code",hidden:!0},{name:"model",description:"View/change AI model",category:"ai"},{name:"provider",description:"Manage AI providers",category:"ai",aliases:["provider:status"]},{name:"status",description:"Show ToolNet status",category:"system"},{name:"update",description:"Update ToolNet Memory",category:"system"},{name:"context:print",description:"Print fast project context",category:"context",hidden:!0},{name:"context:sync",description:"Show context hash/size",category:"context"},{name:"context:refresh",description:"Rebuild deep startup brief cache",category:"context"},{name:"brief",description:"Show full project brief",category:"context"},{name:"brief:json",description:"Show brief as JSON",category:"context"},{name:"profile:show",description:"Show .toolnet/profile.md",category:"context"},{name:"profile:sync",description:"Sync profile to agent files",category:"context"},{name:"work:status",description:"Show current work state",category:"work",hidden:!0},{name:"work:json",description:"Show work state as JSON",category:"work"},{name:"work:reconcile",description:"Reconcile work continuity",category:"work"},{name:"handoff:latest",description:"Show latest session handoff",category:"work"},{name:"handoff:refresh",description:"Refresh handoff data",category:"work"},{name:"index:graph",description:"Build graph index only",category:"code"},{name:"incremental",description:"Incremental code indexing",category:"code"},{name:"config",description:"Manage configuration",usage:"toolnet-memory config <get|set|list|open>",category:"ai"},{name:"provider:list",description:"List available AI providers",category:"ai"},{name:"provider:status",description:"Show AI provider status",category:"ai",hidden:!0},{name:"provider:test",description:"Test AI provider connection",category:"ai"},{name:"integrate:detect",description:"Detect agent integrations",category:"integration"},{name:"integrate:auto",description:"Auto-enable integrations",category:"integration"},{name:"integrate:agy",description:"Install Agy hooks",category:"integration"},{name:"integrate:codex",description:"Install Codex integration",category:"integration"},{name:"integrate:opencode",description:"Install OpenCode plugin",category:"integration"},{name:"integrate:claude",description:"Install Claude Code integration",category:"integration"},{name:"session:agy-sync",description:"Sync Agy session",category:"session"},{name:"session:agy-recover",description:"Recover Agy sessions",category:"session"},{name:"session:agy-hook",description:"Agy session hook",category:"session",hidden:!0},{name:"session:codex-sync",description:"Sync Codex session",category:"session"},{name:"session:codex-recover",description:"Recover Codex sessions",category:"session"},{name:"session:codex-notify",description:"Codex notification hook",category:"session",hidden:!0},{name:"session:codex-context",description:"Codex context hook",category:"session",hidden:!0},{name:"session:opencode-sync",description:"Sync OpenCode session",category:"session"},{name:"session:opencode-recover",description:"Recover OpenCode sessions",category:"session"},{name:"session:claude-hook",description:"Claude session hook",category:"session",hidden:!0},{name:"memory:review",description:"Review memory entries",category:"session"},{name:"memory:reconcile",description:"Reconcile memory state",category:"session"},{name:"guard:check",description:"Check project rules",category:"guard"},{name:"guard:explain",description:"Show rules and evidence",category:"guard"},{name:"guard:json",description:"Output guard result as JSON",category:"guard",hidden:!0},{name:"project:manual-init",description:"Initialize project manual",category:"project"},{name:"project:manual-show",description:"Show project manual",category:"project"},{name:"project:manual-sync",description:"Sync project manual",category:"project"},{name:"snapshot:list",description:"List snapshots",category:"snapshot"},{name:"snapshot:create",description:"Create snapshot",category:"snapshot"},{name:"snapshot:restore",description:"Restore snapshot",category:"snapshot"},{name:"recover",description:"Recover latest snapshot",category:"snapshot"},{name:"service",description:"Run daemon in foreground",category:"service"},{name:"service:install",description:"Install/start daemon",category:"service"},{name:"service:start",description:"Start daemon",category:"service"},{name:"service:stop",description:"Stop daemon",category:"service"},{name:"service:restart",description:"Restart daemon",category:"service"},{name:"service:status",description:"Show daemon status",category:"service"},{name:"service:remove",description:"Remove daemon",category:"service"},{name:"mcp",description:"Run MCP server",category:"advanced"},{name:"api",description:"Run API server",category:"advanced"},{name:"run",description:"Run ToolNet runtime",category:"advanced",hidden:!0},{name:"production:certify",description:"Verify production runtime",category:"advanced"},{name:"certify:continuity",description:"Certify work continuity",category:"advanced"},{name:"ask-ai",description:"Ask AI agent (advanced)",category:"advanced",hidden:!0}];function x(t){return{tty:t.tty,noColor:t.noColor}}function S(t){let e=[],o=t.version??"0.0.0",n=x(t);e.push(""),e.push(u("ToolNet Memory",o,n)),e.push(" Persistent memory & code intelligence for AI coding agents"),e.push(""),e.push(a("USAGE",n)),e.push(" toolnet-memory <command> [options]"),e.push("");let i=[{key:"core",title:"GET STARTED"},{key:"memory",title:"MEMORY"},{key:"code",title:"CODE"},{key:"ai",title:"AI"},{key:"system",title:"SYSTEM"}];for(let{key:s,title:g}of i){let c=m.filter(r=>r.category===s&&!r.hidden);if(c.length===0)continue;e.push(a(g,n));let y=Math.max(...c.map(r=>r.name.length));for(let r of c)e.push(l(r.name,r.description,y,n));e.push("")}return e.push(a("MORE",n)),e.push(l("help --all","Show all advanced commands",15,n)),e.push(l("help <command>","Show command details",15,n)),e.push(""),e.join(`
|
|
2
|
+
`)}function k(t){let e=[],o=t.version??"0.0.0",n=x(t);e.push(""),e.push(u("ToolNet Memory",o,n)),e.push(" Persistent memory & code intelligence for AI coding agents"),e.push(""),e.push(a("USAGE",n)),e.push(" toolnet-memory <command> [options]"),e.push("");let i=[{key:"core",title:"PROJECT SETUP"},{key:"memory",title:"MEMORY"},{key:"code",title:"CODE INTELLIGENCE"},{key:"ai",title:"AI / PROVIDERS"},{key:"system",title:"SYSTEM"},{key:"context",title:"CONTEXT & MEMORY"},{key:"work",title:"WORK CONTINUITY"},{key:"integration",title:"AGENT INTEGRATIONS"},{key:"session",title:"SESSIONS"},{key:"guard",title:"GUARD"},{key:"project",title:"PROJECT MANUAL"},{key:"snapshot",title:"SNAPSHOTS & RECOVERY"},{key:"service",title:"BACKGROUND SERVICE"},{key:"advanced",title:"DEVELOPER / PRODUCTION"}];for(let{key:s,title:g}of i){let c=m.filter(r=>r.category===s&&!r.hidden);if(c.length===0)continue;e.push(a(g,n));let y=Math.max(...c.map(r=>r.name.length));for(let r of c)e.push(l(r.name,r.description,y,n));e.push("")}return e.join(`
|
|
3
|
+
`)}function w(t,e){let o=m.find(s=>s.name===t||s.aliases?.includes(t));if(!o)return null;let n=[],i=x(e);if(n.push(""),n.push(u(o.name,void 0,i)),n.push(""),n.push(o.description),n.push(""),o.usage&&(n.push(a("USAGE",i)),n.push(` ${o.usage}`),n.push("")),o.aliases&&o.aliases.length>0){n.push(a("ALIASES",i));for(let s of o.aliases)n.push(` ${s}`);n.push("")}if(o.pipeline&&o.pipeline.length>0){n.push(a("PIPELINE",i));for(let s of o.pipeline)n.push(` ${s}`);n.push("")}if(o.examples&&o.examples.length>0){n.push(a("EXAMPLES",i));for(let s of o.examples)n.push(` ${s}`);n.push("")}return n.join(`
|
|
4
|
+
`)}function b(t){return m.flatMap(n=>[n.name,...n.aliases??[]]).filter(n=>n===t?!1:!!(n.startsWith(t)||t.length>=3&&n.includes(t))).slice(0,3)}function $(){let t=D(j(import.meta.url)),e=[E(t,"../package.json"),E(t,"../../package.json")];for(let o of e)try{let n=JSON.parse(G(o,"utf8"));if(n.version)return n.version}catch{}return process.env.npm_package_version??"unknown"}var p=process.argv.slice(2),C={version:$(),tty:!!process.stdout.isTTY};function R(t){let e=b(t);if(console.error(""),console.error(`\u2715 Unknown command: ${t}`),e.length>0){console.error(""),console.error(" Did you mean:");for(let o of e)console.error(` ${o}`)}console.error(""),console.error(" Run `toolnet-memory help` to see available commands."),console.error("")}if(p[0]==="--unknown")R(p[1]??""),process.exitCode=1;else if(p[0]==="--all")console.log(k(C));else if(p[0]){let t=w(p[0],C);t?console.log(t):(R(p[0]),process.exitCode=1)}else console.log(S(C));
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var v=[{id:"openai-compatible",label:"OpenAI-compatible",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"alibaba",label:"Alibaba / DashScope",requiresApiKey:!0,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"openrouter",label:"OpenRouter",defaultBaseUrl:"https://openrouter.ai/api/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"groq",label:"Groq",defaultBaseUrl:"https://api.groq.com/openai/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"deepseek",label:"DeepSeek",defaultBaseUrl:"https://api.deepseek.com",defaultModel:"deepseek-v4-flash",requiresApiKey:!0,transport:"openai-compatible"},{id:"nvidia",label:"NVIDIA NIM",defaultBaseUrl:"https://integrate.api.nvidia.com/v1",defaultModel:"deepseek-ai/deepseek-v4-pro",requiresApiKey:!0,transport:"openai-compatible"},{id:"gemini",label:"Gemini",defaultBaseUrl:"https://generativelanguage.googleapis.com/v1beta",requiresApiKey:!0,transport:"gemini"},{id:"huggingface",label:"Hugging Face",defaultBaseUrl:"https://router.huggingface.co/v1",requiresApiKey:!0,transport:"openai-compatible"},{id:"ollama",label:"Ollama / Local",defaultBaseUrl:"http://127.0.0.1:11434/v1",requiresApiKey:!1,transport:"openai-compatible"},{id:"custom",label:"Custom endpoint",requiresApiKey:!1,requiresBaseUrl:!0,transport:"openai-compatible"},{id:"cloudflare",label:"Cloudflare Workers AI",requiresApiKey:!0,requiresAccountId:!0,transport:"cloudflare"}];function m(e){let r=v.find(n=>n.id===e);if(!r)throw new Error(`Unsupported AI provider: ${e}`);return r}function _(e){return v.some(r=>r.id===e)}function o(e){return process.env[e]?.trim()||void 0}function t(...e){return e.find(r=>!!r?.trim())}function y(){if(o("GROQ_API_KEY"))return"groq";if(o("DEEPSEEK_API_KEY"))return"deepseek";if(o("NVIDIA_API_KEY")||o("NVIDIA_NIM_API_KEY"))return"nvidia";if(o("OPENROUTER_API_KEY"))return"openrouter";if(o("ALIBABA_API_KEY")||o("DASHSCOPE_API_KEY"))return"alibaba";if(o("GEMINI_API_KEY")||o("GOOGLE_API_KEY"))return"gemini";if(o("CLOUDFLARE_API_TOKEN")&&o("CLOUDFLARE_ACCOUNT_ID"))return"cloudflare";if(o("HF_TOKEN"))return"huggingface";if(o("OLLAMA_MODEL")||o("OLLAMA_BASE_URL"))return"ollama"}function K(){let e=o("TOOLNET_LLM_PROVIDER");return e&&_(e)?e:y()??"openai-compatible"}function U(e){let r=m(e);switch(e){case"alibaba":return{provider:e,apiKey:t(o("ALIBABA_API_KEY"),o("DASHSCOPE_API_KEY")),baseUrl:t(o("ALIBABA_BASE_URL"),o("DASHSCOPE_BASE_URL"),r.defaultBaseUrl),model:t(o("ALIBABA_MODEL"),o("DASHSCOPE_MODEL"))};case"openrouter":return{provider:e,apiKey:o("OPENROUTER_API_KEY"),baseUrl:t(o("OPENROUTER_BASE_URL"),r.defaultBaseUrl),model:o("OPENROUTER_MODEL")};case"groq":return{provider:e,apiKey:o("GROQ_API_KEY"),baseUrl:t(o("GROQ_BASE_URL"),r.defaultBaseUrl),model:o("GROQ_MODEL")};case"deepseek":return{provider:e,apiKey:o("DEEPSEEK_API_KEY"),baseUrl:t(o("DEEPSEEK_BASE_URL"),r.defaultBaseUrl),model:t(o("DEEPSEEK_MODEL"),r.defaultModel)};case"nvidia":return{provider:e,apiKey:t(o("NVIDIA_API_KEY"),o("NVIDIA_NIM_API_KEY")),baseUrl:t(o("NVIDIA_BASE_URL"),o("NVIDIA_NIM_BASE_URL"),r.defaultBaseUrl),model:t(o("NVIDIA_MODEL"),o("NVIDIA_NIM_MODEL"),r.defaultModel)};case"gemini":return{provider:e,apiKey:t(o("GEMINI_API_KEY"),o("GOOGLE_API_KEY")),baseUrl:t(o("GEMINI_BASE_URL"),r.defaultBaseUrl),model:o("GEMINI_MODEL")};case"huggingface":return{provider:e,apiKey:o("HF_TOKEN"),baseUrl:t(o("HF_INFERENCE_BASE_URL"),r.defaultBaseUrl),model:t(o("HF_LLM_MODEL"),o("HF_MODEL"))};case"ollama":return{provider:e,apiKey:o("OLLAMA_API_KEY"),baseUrl:t(o("OLLAMA_BASE_URL"),r.defaultBaseUrl),model:o("OLLAMA_MODEL")};case"cloudflare":return{provider:e,accountId:o("CLOUDFLARE_ACCOUNT_ID"),apiKey:o("CLOUDFLARE_API_TOKEN"),baseUrl:o("CLOUDFLARE_AI_BASE_URL"),model:o("CLOUDFLARE_MODEL")};case"custom":return{provider:e,apiKey:o("CUSTOM_AI_API_KEY"),baseUrl:o("CUSTOM_AI_BASE_URL"),model:o("CUSTOM_AI_MODEL")};default:return{provider:"openai-compatible",apiKey:t(o("OPENAI_API_KEY"),o("MODEL_API_KEY")),baseUrl:t(o("OPENAI_BASE_URL"),o("MODEL_BASE_URL")),model:t(o("OPENAI_MODEL"),o("MODEL_NAME"))}}}function B(){let e=o("TOOLNET_LLM_PROVIDER"),r=e&&_(e)?e:K(),n=m(r),i=U(r);return{provider:r,apiKey:t(o("TOOLNET_LLM_API_KEY"),i.apiKey),baseUrl:t(o("TOOLNET_LLM_BASE_URL"),i.baseUrl,n.defaultBaseUrl),model:t(o("TOOLNET_LLM_MODEL"),i.model,n.defaultModel),accountId:t(o("TOOLNET_LLM_ACCOUNT_ID"),i.accountId)}}function S(){let e=o("TOOLNET_EMBEDDING_PROVIDER");return e==="local"?"local":e&&_(e)?e:o("HF_TOKEN")||o("HF_EMBEDDING_MODEL")?"huggingface":"local"}function x(){let e=S();if(e==="local")return{provider:"local",model:t(o("TOOLNET_EMBEDDING_MODEL"),o("LOCAL_EMBEDDING_MODEL"))};let r=m(e),n,i,l,s;switch(e){case"huggingface":n=o("HF_TOKEN"),i=o("HF_INFERENCE_BASE_URL"),l=o("HF_EMBEDDING_MODEL");break;case"openai-compatible":n=o("OPENAI_API_KEY"),i=o("OPENAI_BASE_URL"),l=o("OPENAI_EMBEDDING_MODEL");break;case"cloudflare":n=o("CLOUDFLARE_API_TOKEN"),i=o("CLOUDFLARE_AI_BASE_URL"),l=o("CLOUDFLARE_EMBEDDING_MODEL"),s=o("CLOUDFLARE_ACCOUNT_ID");break;default:n=U(e).apiKey,i=U(e).baseUrl,l=o(`${e.toUpperCase().replace(/-/g,"_")}_EMBEDDING_MODEL`)}let E=t(o("TOOLNET_EMBEDDING_ACCOUNT_ID"),s),N=t(o("TOOLNET_EMBEDDING_BASE_URL"),i,r.defaultBaseUrl),T=e==="cloudflare"&&!N&&E?`https://api.cloudflare.com/client/v4/accounts/${E}/ai/v1`:N;return{provider:e,apiKey:t(o("TOOLNET_EMBEDDING_API_KEY"),n),baseUrl:T,model:t(o("TOOLNET_EMBEDDING_MODEL"),l),accountId:E}}function O(){let e=B(),r=x();return{llm:e,embedding:r,legacy:{llm:!o("TOOLNET_LLM_PROVIDER")&&!!y(),embedding:!o("TOOLNET_EMBEDDING_PROVIDER")&&!!(o("HF_TOKEN")||o("HF_EMBEDDING_MODEL"))}}}import u from"node:fs";import k from"node:os";import R from"node:path";var G={spinner:["\xB7","\u2722","\u2733","\u2736","\u273B","\u273D"],barFilled:"\u2588",barEmpty:"\u2591",phaseDone:"\u25C6",phaseActive:"\u25C7",rail:"\u2502",branch:"\u251C",corner:"\u2514",dash:"\u2014"},F={spinner:[".","*","+","x","*","+"],barFilled:"#",barEmpty:"-",phaseDone:"[OK]",phaseActive:"[>>]",rail:"|",branch:"|",corner:"\\",dash:"-"};function w(){if(process.env.TOOLNET_ASCII==="1")return!1;if(process.env.TOOLNET_UNICODE==="1")return!0;if(process.platform==="win32"){let e=process.env.TERM_PROGRAM,r=process.env.WT_SESSION,n=process.env.VSCODE_PID,i=process.env.ConEmuPID;return!!(r||n||i||e==="vscode")}return process.env.TERM!=="linux"}var M;function D(){return M||(M=w()?G:F),M}var a={reset:"\x1B[0m",green:"\x1B[32m",cyan:"\x1B[36m",red:"\x1B[31m",yellow:"\x1B[33m",amber:"\x1B[38;5;214m",white:"\x1B[97m",dim:"\x1B[2m",bold:"\x1B[1m"};function $(e){return e.noColor||process.env.NO_COLOR?!1:e.tty??process.stdout.isTTY??!1}function c(e,r,n){return $(n)?`${r}${e}${a.reset}`:e}function d(e,r){return c(e,a.dim,r)}function Y(e,r){return c(e,a.bold,r)}function A(e,r){return c(e,a.cyan,r)}function H(e,r){return c(e,a.green,r)}function V(e,r){return c(e,a.red,r)}function q(e,r){return c(e,a.white,r)}function L(e,r,n){let i=D(),l=r?` ${d(`v${r}`,n)}`:"";return`${A(i.phaseDone,n)} ${e}${l}`}function I(e,r){return Y(e,r)}function b(e,r,n,i){let l=" ".repeat(Math.max(0,n-e.length));return` ${A(e,i)}${l} ${r}`}function p(e,r,n,i){let l=" ".repeat(Math.max(0,n-e.length));return` ${d(e,i)}${l} ${q(r,i)}`}function P(e){let r=D();return H(r.phaseDone,e)}function C(e){return V("\u2717",e)}function f(e){return{tty:e.tty,noColor:e.noColor}}var h=R.join(k.homedir(),".config","toolnet-memory"),g=R.join(h,".env");function j(){u.mkdirSync(h,{recursive:!0,mode:448}),u.existsSync(g)||u.writeFileSync(g,"",{encoding:"utf8",mode:384})}function W(){return j(),u.readFileSync(g,"utf8").split(/\r?\n/)}function Q(e,r){let n=W(),i=!1,l=n.map(s=>s.trim().startsWith(`${e}=`)?(i=!0,`${e}=${r}`):s);i||(l.length&&l[l.length-1]!==""&&l.push(""),l.push(`${e}=${r}`)),u.writeFileSync(g,l.join(`
|
|
2
|
+
`),{encoding:"utf8",mode:384}),u.chmodSync(g,384)}async function X(e){let r=O(),n=f(e);console.log(""),console.log(L("AI Model",void 0,n)),console.log(""),console.log(I("CURRENT",n)),console.log(p("Provider",r.llm.provider,8,n)),console.log(p("Model",r.llm.model??"not set",8,n)),console.log(""),console.log(I("COMMANDS",n)),console.log(b("model list","List available models",15,n)),console.log(b("model set <model>","Change model",15,n)),console.log(b("model status","Show current model",15,n)),console.log("")}async function z(e){let r=O(),n=f(e);console.log(""),console.log(L("Available Models",void 0,n)),console.log(""),console.log(I("CURRENT MODEL",n)),console.log(` ${A("\u25CF",n)} ${r.llm.model??"not set"}`),console.log(""),console.log(d(" Model discovery not available.",n)),console.log(d(" Use `model set <model>` to change the model.",n)),console.log("")}async function J(e,r){let n=O(),i=f(r);console.log(""),console.log(L("Change Model",void 0,i)),console.log("");try{Q("TOOLNET_LLM_MODEL",e),console.log(P(i)+" Model updated"),console.log(""),console.log(p("Provider",n.llm.provider,8,i)),console.log(p("Model",e,8,i)),console.log("")}catch(l){console.log(C(i)+" Failed to update model"),console.log(""),console.log(d(` ${l instanceof Error?l.message:String(l)}`,i)),console.log(""),process.exitCode=1}}async function Z(){let e=process.argv.slice(2),r=e[0],n={tty:process.stdout.isTTY,noColor:process.env.NO_COLOR!==void 0||e.includes("--no-color")};if(!r||r==="status"){await X(n);return}if(r==="list"){await z(n);return}if(r==="set"){let l=e[1];if(!l){let s=f(n);console.log(""),console.log(C(s)+" Missing model name"),console.log(""),console.log("Usage: toolnet-memory model set <model>"),console.log(""),process.exitCode=1;return}await J(l,n);return}let i=f(n);console.log(""),console.log(C(i)+` Unknown subcommand: ${r}`),console.log(""),console.log("Available commands:"),console.log(" model"),console.log(" model status"),console.log(" model list"),console.log(" model set <model>"),console.log(""),process.exitCode=1}Z().catch(e=>{console.error(""),console.error(e instanceof Error?e.message:String(e)),console.error(""),process.exitCode=1});
|