From 9b99c6baa9d2d60cc17cbb243f5791ace8e41add Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Sun, 1 Feb 2026 03:02:09 +0530 Subject: [PATCH 01/36] haiku architecture generation with gitnexus MCP test --- ARCHITECTURE.md | 4 ++++ ARCHITECTURE_QUICK_REF.md | 4 ++++ GITNEXUS_ANALYSIS.md | 4 ++++ README.md | 2 +- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 429c0598e..56fb6d643 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -583,3 +583,7 @@ The design cleanly separates concerns across 7 layers, from symbolic math to num + + + + diff --git a/ARCHITECTURE_QUICK_REF.md b/ARCHITECTURE_QUICK_REF.md index f7ea6e372..949a3554e 100644 --- a/ARCHITECTURE_QUICK_REF.md +++ b/ARCHITECTURE_QUICK_REF.md @@ -374,3 +374,7 @@ model = pybamm.lithium_ion.DFN( + + + + diff --git a/GITNEXUS_ANALYSIS.md b/GITNEXUS_ANALYSIS.md index 16d9f29d4..b3a9850ac 100644 --- a/GITNEXUS_ANALYSIS.md +++ b/GITNEXUS_ANALYSIS.md @@ -373,3 +373,7 @@ Expression tree traversal: + + + + diff --git a/README.md b/README.md index 683eb3cea..ff28b13d9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Zero-Server, Graph-Based Code Intelligence Engine** Works fully in-browser through WebAssembly. (DB engine, Embeddings model, AST parsing, all happens inside browser) - +/ https://github.com/user-attachments/assets/abfd0300-0aae-4296-b8d3-8b72ed882433 https://gitnexus.vercel.app From 4357a48faeaae918ae31aff6fc3bd4f5c4c0b5b3 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Mon, 2 Feb 2026 06:08:06 +0530 Subject: [PATCH 02/36] CLI implemented, UI connection to CLI works --- ARCHITECTURE.md | 2 + ARCHITECTURE_QUICK_REF.md | 2 + GITNEXUS_ANALYSIS.md | 2 + gitnexus-cli/package-lock.json | 5012 +++++++++++++++++ gitnexus-cli/package.json | 54 + gitnexus-cli/src/cli/analyze.ts | 76 + gitnexus-cli/src/cli/clean.ts | 90 + gitnexus-cli/src/cli/index.ts | 55 + gitnexus-cli/src/cli/list.ts | 24 + gitnexus-cli/src/cli/mcp.ts | 8 + gitnexus-cli/src/cli/serve.ts | 9 + gitnexus-cli/src/cli/status.ts | 28 + gitnexus-cli/src/config/ignore-service.ts | 239 + .../src/config/supported-languages.ts | 14 + gitnexus-cli/src/core/embeddings/embedder.ts | 243 + .../src/core/embeddings/embedding-pipeline.ts | 401 ++ gitnexus-cli/src/core/embeddings/index.ts | 11 + .../src/core/embeddings/text-generator.ts | 235 + gitnexus-cli/src/core/embeddings/types.ts | 117 + gitnexus-cli/src/core/graph/graph.ts | 41 + gitnexus-cli/src/core/graph/types.ts | 86 + gitnexus-cli/src/core/ingestion/ast-cache.ts | 48 + .../src/core/ingestion/call-processor.ts | 322 ++ .../src/core/ingestion/cluster-enricher.ts | 245 + .../src/core/ingestion/community-processor.ts | 356 ++ .../src/core/ingestion/entry-point-scoring.ts | 281 + .../src/core/ingestion/filesystem-walker.ts | 40 + .../src/core/ingestion/framework-detection.ts | 243 + .../src/core/ingestion/heritage-processor.ts | 162 + .../src/core/ingestion/import-processor.ts | 246 + .../src/core/ingestion/parsing-processor.ts | 266 + gitnexus-cli/src/core/ingestion/pipeline.ts | 267 + .../src/core/ingestion/process-processor.ts | 411 ++ .../src/core/ingestion/structure-processor.ts | 48 + .../src/core/ingestion/symbol-table.ts | 80 + .../src/core/ingestion/tree-sitter-queries.ts | 331 ++ gitnexus-cli/src/core/ingestion/utils.ts | 30 + gitnexus-cli/src/core/kuzu/csv-generator.ts | 320 ++ gitnexus-cli/src/core/kuzu/kuzu-adapter.ts | 243 + gitnexus-cli/src/core/kuzu/schema.ts | 405 ++ gitnexus-cli/src/core/search/bm25-index.ts | 203 + gitnexus-cli/src/core/search/hybrid-search.ts | 164 + .../src/core/tree-sitter/parser-loader.ts | 45 + gitnexus-cli/src/lib/utils.ts | 3 + gitnexus-cli/src/mcp/server.ts | 178 + gitnexus-cli/src/mcp/tools.ts | 47 + gitnexus-cli/src/server/api.ts | 221 + gitnexus-cli/src/storage/git.ts | 29 + gitnexus-cli/src/storage/repo-manager.ts | 101 + gitnexus-cli/src/types/pipeline.ts | 56 + gitnexus-cli/tsconfig.json | 24 + gitnexus/src/App.tsx | 90 +- gitnexus/src/components/SettingsPanel.tsx | 206 +- gitnexus/src/components/ToolCallCard.tsx | 111 +- gitnexus/src/core/llm/agent.ts | 14 +- gitnexus/src/hooks/useAppState.tsx | 13 +- gitnexus/src/workers/ingestion.worker.ts | 28 +- 57 files changed, 12494 insertions(+), 132 deletions(-) create mode 100644 gitnexus-cli/package-lock.json create mode 100644 gitnexus-cli/package.json create mode 100644 gitnexus-cli/src/cli/analyze.ts create mode 100644 gitnexus-cli/src/cli/clean.ts create mode 100644 gitnexus-cli/src/cli/index.ts create mode 100644 gitnexus-cli/src/cli/list.ts create mode 100644 gitnexus-cli/src/cli/mcp.ts create mode 100644 gitnexus-cli/src/cli/serve.ts create mode 100644 gitnexus-cli/src/cli/status.ts create mode 100644 gitnexus-cli/src/config/ignore-service.ts create mode 100644 gitnexus-cli/src/config/supported-languages.ts create mode 100644 gitnexus-cli/src/core/embeddings/embedder.ts create mode 100644 gitnexus-cli/src/core/embeddings/embedding-pipeline.ts create mode 100644 gitnexus-cli/src/core/embeddings/index.ts create mode 100644 gitnexus-cli/src/core/embeddings/text-generator.ts create mode 100644 gitnexus-cli/src/core/embeddings/types.ts create mode 100644 gitnexus-cli/src/core/graph/graph.ts create mode 100644 gitnexus-cli/src/core/graph/types.ts create mode 100644 gitnexus-cli/src/core/ingestion/ast-cache.ts create mode 100644 gitnexus-cli/src/core/ingestion/call-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/cluster-enricher.ts create mode 100644 gitnexus-cli/src/core/ingestion/community-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/entry-point-scoring.ts create mode 100644 gitnexus-cli/src/core/ingestion/filesystem-walker.ts create mode 100644 gitnexus-cli/src/core/ingestion/framework-detection.ts create mode 100644 gitnexus-cli/src/core/ingestion/heritage-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/import-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/parsing-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/pipeline.ts create mode 100644 gitnexus-cli/src/core/ingestion/process-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/structure-processor.ts create mode 100644 gitnexus-cli/src/core/ingestion/symbol-table.ts create mode 100644 gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts create mode 100644 gitnexus-cli/src/core/ingestion/utils.ts create mode 100644 gitnexus-cli/src/core/kuzu/csv-generator.ts create mode 100644 gitnexus-cli/src/core/kuzu/kuzu-adapter.ts create mode 100644 gitnexus-cli/src/core/kuzu/schema.ts create mode 100644 gitnexus-cli/src/core/search/bm25-index.ts create mode 100644 gitnexus-cli/src/core/search/hybrid-search.ts create mode 100644 gitnexus-cli/src/core/tree-sitter/parser-loader.ts create mode 100644 gitnexus-cli/src/lib/utils.ts create mode 100644 gitnexus-cli/src/mcp/server.ts create mode 100644 gitnexus-cli/src/mcp/tools.ts create mode 100644 gitnexus-cli/src/server/api.ts create mode 100644 gitnexus-cli/src/storage/git.ts create mode 100644 gitnexus-cli/src/storage/repo-manager.ts create mode 100644 gitnexus-cli/src/types/pipeline.ts create mode 100644 gitnexus-cli/tsconfig.json diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 56fb6d643..56cabebca 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -587,3 +587,5 @@ The design cleanly separates concerns across 7 layers, from symbolic math to num + + diff --git a/ARCHITECTURE_QUICK_REF.md b/ARCHITECTURE_QUICK_REF.md index 949a3554e..bdd27a239 100644 --- a/ARCHITECTURE_QUICK_REF.md +++ b/ARCHITECTURE_QUICK_REF.md @@ -378,3 +378,5 @@ model = pybamm.lithium_ion.DFN( + + diff --git a/GITNEXUS_ANALYSIS.md b/GITNEXUS_ANALYSIS.md index b3a9850ac..c9cd0b58e 100644 --- a/GITNEXUS_ANALYSIS.md +++ b/GITNEXUS_ANALYSIS.md @@ -377,3 +377,5 @@ Expression tree traversal: + + diff --git a/gitnexus-cli/package-lock.json b/gitnexus-cli/package-lock.json new file mode 100644 index 000000000..71809a7e3 --- /dev/null +++ b/gitnexus-cli/package-lock.json @@ -0,0 +1,5012 @@ +{ + "name": "gitnexus", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gitnexus", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@huggingface/transformers": "^3.0.0", + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^12.0.0", + "cors": "^2.8.5", + "express": "^4.19.2", + "glob": "^11.0.0", + "graphology": "^0.25.4", + "graphology-communities-louvain": "^2.0.1", + "kuzu": "^0.11.3", + "lru-cache": "^11.0.0", + "minisearch": "^7.2.0", + "ora": "^8.0.0", + "tree-sitter": "^0.21.0", + "tree-sitter-c": "^0.21.0", + "tree-sitter-c-sharp": "^0.21.0", + "tree-sitter-cpp": "^0.22.0", + "tree-sitter-go": "^0.21.0", + "tree-sitter-java": "^0.20.0", + "tree-sitter-javascript": "^0.21.0", + "tree-sitter-python": "^0.21.0", + "tree-sitter-rust": "^0.21.0", + "tree-sitter-typescript": "^0.21.0", + "uuid": "^13.0.0" + }, + "bin": { + "gitnexus": "dist/cli/index.js" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/uuid": "^10.0.0", + "tsx": "^4.0.0", + "typescript": "^5.4.5" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@huggingface/jinja": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.4.tgz", + "integrity": "sha512-VoQJywjpjy2D88Oj0BTHRuS8JCbUgoOg5t1UGgbtGh2fRia9Dx/k6Wf8FqrEWIvWK9fAkfJeeLB9fcSpCNPCpw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", + "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.5.3", + "onnxruntime-node": "1.21.0", + "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", + "sharp": "^0.34.1" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", + "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", + "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cmake-js": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", + "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.5", + "debug": "^4", + "fs-extra": "^11.2.0", + "memory-stream": "^1.0.0", + "node-api-headers": "^1.1.0", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.5.4", + "tar": "^6.2.0", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/cmake-js/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/cmake-js/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "license": "ISC" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphology": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz", + "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0", + "obliterator": "^2.0.2" + }, + "peerDependencies": { + "graphology-types": ">=0.24.0" + } + }, + "node_modules/graphology-communities-louvain": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/graphology-communities-louvain/-/graphology-communities-louvain-2.0.2.tgz", + "integrity": "sha512-zt+2hHVPYxjEquyecxWXoUoIuN/UvYzsvI7boDdMNz0rRvpESQ7+e+Ejv6wK7AThycbZXuQ6DkG8NPMCq6XwoA==", + "license": "MIT", + "dependencies": { + "graphology-indices": "^0.17.0", + "graphology-utils": "^2.4.4", + "mnemonist": "^0.39.0", + "pandemonium": "^2.4.1" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-indices": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", + "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.4.2", + "mnemonist": "^0.39.0" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" + } + }, + "node_modules/graphology-types": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", + "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", + "license": "MIT", + "peer": true + }, + "node_modules/graphology-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", + "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", + "license": "MIT", + "peerDependencies": { + "graphology-types": ">=0.23.0" + } + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", + "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kuzu": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/kuzu/-/kuzu-0.11.3.tgz", + "integrity": "sha512-4+hD3Y+YMV3e0uiqTv1/GUal47D04l8qluw1WFWg8Nx3k7rLsHG1Pmq9WHIOlf1742svxQvTYQiuY6oS1qxAZA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cmake-js": "^7.3.0", + "node-addon-api": "^6.0.0" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "license": "MIT" + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mnemonist": { + "version": "0.39.8", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", + "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "license": "MIT" + }, + "node_modules/node-api-headers": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz", + "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==", + "license": "MIT" + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", + "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", + "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "global-agent": "^3.0.0", + "onnxruntime-common": "1.21.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-node/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/onnxruntime-node/node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", + "license": "MIT" + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" + }, + "node_modules/pandemonium": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", + "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", + "license": "MIT", + "dependencies": { + "mnemonist": "^0.39.2" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-sitter": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" + } + }, + "node_modules/tree-sitter-c": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.21.4.tgz", + "integrity": "sha512-IahxFIhXiY15SUlrt2upBiKSBGdOaE1fjKLK1Ik5zxqGHf6T1rvr3IJrovbsE5sXhypx7Hnmf50gshsppaIihA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-c-sharp": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/tree-sitter-c-sharp/-/tree-sitter-c-sharp-0.21.3.tgz", + "integrity": "sha512-TVsl5EhmqetO/mhzDPVnMK6TPFnpNMKP0OTNuAQIprshk5Hx672ODRxoIoG5WqvUUlsnBu8J0zmn35hmJqelsA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-c-sharp/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-c/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-cpp": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.22.3.tgz", + "integrity": "sha512-p7w5903L/koqTQFVDwyyX0vjioxoZu2G4zT2ZHVG8DvLQbWN6OjNAqfMsCi+WdVkfMgU+7j06hS8i3j6Q0sPNQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-cpp/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-go": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.21.2.tgz", + "integrity": "sha512-aMFwjsB948nWhURiIxExK8QX29JYKs96P/IfXVvluVMRJZpL04SREHsdOZHYqJr1whkb7zr3/gWHqqvlkczmvw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.1.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-go/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-java": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.20.2.tgz", + "integrity": "sha512-jc6RCnM+JE2ns1AkpErOp2Dp1jOADPbljsrWup0Vj2qTmG8KGYMSTD7HcrVRyZUC6pRLFySPMOh8x7Dn12aynw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.14.1" + } + }, + "node_modules/tree-sitter-javascript": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.21.4.tgz", + "integrity": "sha512-Lrk8yahebwrwc1sWJE9xPcz1OnnqiEV7Dh5fbN6EN3wNAdu9r06HpTqLqDwUUbnG4EB46Sfk+FJFAOldfoKLOw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-javascript/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-python": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.21.0.tgz", + "integrity": "sha512-IUKx7JcTVbByUx1iHGFS/QsIjx7pqwTMHL9bl/NGyhyyydbfNrpruo2C7W6V4KZrbkkCOlX8QVrCoGOFW5qecg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.1.0", + "node-gyp-build": "^4.8.0" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-python/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/tree-sitter-rust": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.21.0.tgz", + "integrity": "sha512-unVr73YLn3VC4Qa/GF0Nk+Wom6UtI526p5kz9Rn2iZSqwIFedyCZ3e0fKCEmUJLIPGrTb/cIEdu3ZUNGzfZx7A==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.1.0", + "node-gyp-build": "^4.8.0" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-rust/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/tree-sitter-typescript": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.21.2.tgz", + "integrity": "sha512-/RyNK41ZpkA8PuPZimR6pGLvNR1p0ibRUJwwQn4qAjyyLEIQD/BNlwS3NSxWtGsAWZe9gZ44VK1mWx2+eQVldg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-typescript/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zod": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/gitnexus-cli/package.json b/gitnexus-cli/package.json new file mode 100644 index 000000000..43c3c018a --- /dev/null +++ b/gitnexus-cli/package.json @@ -0,0 +1,54 @@ +{ + "name": "gitnexus", + "version": "0.1.0", + "description": "GitNexus local CLI and MCP server", + "author": "Abhigyan Patwari", + "license": "MIT", + "type": "module", + "bin": { + "gitnexus": "./dist/cli/index.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc", + "dev": "tsx watch src/cli/index.ts" + }, + "dependencies": { + "@huggingface/transformers": "^3.0.0", + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^12.0.0", + "cors": "^2.8.5", + "express": "^4.19.2", + "glob": "^11.0.0", + "graphology": "^0.25.4", + "graphology-communities-louvain": "^2.0.1", + "kuzu": "^0.11.3", + "lru-cache": "^11.0.0", + "minisearch": "^7.2.0", + "ora": "^8.0.0", + "tree-sitter": "^0.21.0", + "tree-sitter-c": "^0.21.0", + "tree-sitter-c-sharp": "^0.21.0", + "tree-sitter-cpp": "^0.22.0", + "tree-sitter-go": "^0.21.0", + "tree-sitter-java": "^0.20.0", + "tree-sitter-javascript": "^0.21.0", + "tree-sitter-python": "^0.21.0", + "tree-sitter-rust": "^0.21.0", + "tree-sitter-typescript": "^0.21.0", + "uuid": "^13.0.0" + }, + "devDependencies": { + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/uuid": "^10.0.0", + "tsx": "^4.0.0", + "typescript": "^5.4.5" + }, + "engines": { + "node": ">=18.0.0" + } +} diff --git a/gitnexus-cli/src/cli/analyze.ts b/gitnexus-cli/src/cli/analyze.ts new file mode 100644 index 000000000..902a26bfd --- /dev/null +++ b/gitnexus-cli/src/cli/analyze.ts @@ -0,0 +1,76 @@ +import path from 'path'; +import ora from 'ora'; +import { runPipelineFromRepo } from '../core/ingestion/pipeline.js'; +import { initKuzu, loadGraphToKuzu, getKuzuStats, executeQuery, executeWithReusedStatement } from '../core/kuzu/kuzu-adapter.js'; +import { buildBM25Index, exportBM25Index } from '../core/search/bm25-index.js'; +import { runEmbeddingPipeline } from '../core/embeddings/embedding-pipeline.js'; +import { ensureRepoBase, getRepoStoragePath, saveMeta, loadMeta } from '../storage/repo-manager.js'; +import { getCurrentCommit, isGitRepo } from '../storage/git.js'; + +export const analyzeCommand = async ( + inputPath?: string, + options?: { force?: boolean; skipEmbeddings?: boolean } +) => { + const repoPath = path.resolve(inputPath || '.'); + const spinner = ora('Checking repository...').start(); + + if (!isGitRepo(repoPath)) { + spinner.fail('Not a git repository'); + process.exitCode = 1; + return; + } + + await ensureRepoBase(); + const storagePath = getRepoStoragePath(repoPath); + const kuzuPath = path.join(storagePath, 'kuzu'); + const bm25Path = path.join(storagePath, 'bm25.json'); + + const currentCommit = getCurrentCommit(repoPath); + const existingMeta = await loadMeta(storagePath); + if (existingMeta && !options?.force && existingMeta.lastCommit === currentCommit) { + spinner.succeed('Repository already up to date'); + return; + } + + spinner.text = 'Running ingestion pipeline...'; + const pipelineResult = await runPipelineFromRepo(repoPath, (progress) => { + spinner.text = `${progress.phase}: ${progress.percent}%`; + }); + + spinner.text = 'Loading graph into KuzuDB...'; + await initKuzu(kuzuPath); + await loadGraphToKuzu(pipelineResult.graph, pipelineResult.fileContents, storagePath); + + spinner.text = 'Building BM25 index...'; + buildBM25Index(pipelineResult.fileContents); + await exportBM25Index(bm25Path); + + if (!options?.skipEmbeddings) { + spinner.text = 'Generating embeddings...'; + await runEmbeddingPipeline( + executeQuery, + executeWithReusedStatement, + (progress) => { + spinner.text = `embeddings: ${progress.percent}%`; + } + ); + } + + const stats = await getKuzuStats(); + await saveMeta(storagePath, { + repoPath, + lastCommit: currentCommit, + indexedAt: new Date().toISOString(), + stats: { + files: pipelineResult.fileContents.size, + nodes: stats.nodes, + edges: stats.edges, + communities: pipelineResult.communityResult?.stats.totalCommunities, + processes: pipelineResult.processResult?.stats.totalProcesses, + }, + }); + + spinner.succeed('Repository indexed successfully'); + console.log(`Storage: ${storagePath}`); +}; + diff --git a/gitnexus-cli/src/cli/clean.ts b/gitnexus-cli/src/cli/clean.ts new file mode 100644 index 000000000..a9eb4eb2c --- /dev/null +++ b/gitnexus-cli/src/cli/clean.ts @@ -0,0 +1,90 @@ +import fs from 'fs/promises'; +import { listIndexedRepos, getRepoStoragePath, hashRepoPath } from '../storage/repo-manager.js'; + +export const cleanCommand = async (target?: string, options?: { all?: boolean; force?: boolean }) => { + const repos = await listIndexedRepos(); + + if (repos.length === 0) { + console.log('No indexed repositories found.'); + return; + } + + // Clean all repos + if (options?.all) { + if (!options.force) { + console.log(`⚠️ This will delete ${repos.length} indexed repository(ies):`); + repos.forEach(repo => { + const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath; + console.log(` - ${repoName} (${repo.id})`); + }); + console.log('\nRun with --force to confirm deletion.'); + return; + } + + for (const repo of repos) { + try { + await fs.rm(repo.storagePath, { recursive: true, force: true }); + const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath; + console.log(`🗑️ Deleted: ${repoName} (${repo.id})`); + } catch (err) { + console.error(`Failed to delete ${repo.id}:`, err); + } + } + console.log(`\n✅ Cleaned ${repos.length} indexed repository(ies).`); + return; + } + + // Clean specific repo by ID or path + if (target) { + // Try to match by ID first + let repoToDelete = repos.find(r => r.id === target || r.id.startsWith(target)); + + // If not found by ID, try to match by path + if (!repoToDelete) { + const targetLower = target.toLowerCase(); + repoToDelete = repos.find(r => { + const repoPath = r.meta.repoPath.toLowerCase(); + const repoName = repoPath.split(/[/\\]/).pop() || ''; + return repoPath.includes(targetLower) || repoName === targetLower; + }); + } + + if (!repoToDelete) { + console.log(`❌ No indexed repository found matching: ${target}`); + console.log('\nAvailable repositories:'); + repos.forEach(repo => { + const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath; + console.log(` 📁 ${repoName} (${repo.id})`); + }); + return; + } + + const repoName = repoToDelete.meta.repoPath.split(/[/\\]/).pop() || repoToDelete.meta.repoPath; + + if (!options?.force) { + console.log(`⚠️ This will delete the index for: ${repoName}`); + console.log(` Path: ${repoToDelete.meta.repoPath}`); + console.log(` ID: ${repoToDelete.id}`); + console.log('\nRun with --force to confirm deletion.'); + return; + } + + try { + await fs.rm(repoToDelete.storagePath, { recursive: true, force: true }); + console.log(`🗑️ Deleted: ${repoName} (${repoToDelete.id})`); + } catch (err) { + console.error(`Failed to delete ${repoToDelete.id}:`, err); + } + return; + } + + // No target specified - show usage + console.log('Usage:'); + console.log(' gitnexus clean [--force] Delete a specific repo'); + console.log(' gitnexus clean --all [--force] Delete all indexed repos'); + console.log('\nIndexed repositories:'); + repos.forEach(repo => { + const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath; + console.log(` 📁 ${repoName} (${repo.id})`); + }); +}; diff --git a/gitnexus-cli/src/cli/index.ts b/gitnexus-cli/src/cli/index.ts new file mode 100644 index 000000000..149e0f1b7 --- /dev/null +++ b/gitnexus-cli/src/cli/index.ts @@ -0,0 +1,55 @@ +#!/usr/bin/env node +import { Command } from 'commander'; +import { analyzeCommand } from './analyze.js'; +import { serveCommand } from './serve.js'; +import { listCommand } from './list.js'; +import { statusCommand } from './status.js'; +import { mcpCommand } from './mcp.js'; +import { cleanCommand } from './clean.js'; + +const program = new Command(); + +program + .name('gitnexus') + .description('GitNexus local CLI and MCP server') + .version('0.1.0'); + +program + .command('analyze [path]') + .description('Index a repository (full analysis)') + .option('-f, --force', 'Force full re-index even if up to date') + .option('--skip-embeddings', 'Skip embedding generation (faster)') + .action(analyzeCommand); + +program + .command('serve') + .description('Start local HTTP server for web UI connection') + .option('-p, --port ', 'Port number', '4747') + .action(serveCommand); + +program + .command('mcp') + .description('Start MCP server (stdio)') + .action(mcpCommand); + +program + .command('list') + .description('List indexed repositories') + .action(listCommand); + +program + .command('status') + .description('Show index status for current repo') + .action(statusCommand); + +program + .command('clean [target]') + .description('Delete indexed repository(ies)') + .option('-a, --all', 'Delete all indexed repositories') + .option('-f, --force', 'Skip confirmation prompt') + .action(cleanCommand); + +program.parse(process.argv); + + + diff --git a/gitnexus-cli/src/cli/list.ts b/gitnexus-cli/src/cli/list.ts new file mode 100644 index 000000000..136fa9ff3 --- /dev/null +++ b/gitnexus-cli/src/cli/list.ts @@ -0,0 +1,24 @@ +import { listIndexedRepos } from '../storage/repo-manager.js'; + +export const listCommand = async () => { + const repos = await listIndexedRepos(); + if (repos.length === 0) { + console.log('No indexed repositories found.'); + return; + } + + repos.forEach((repo, index) => { + const stats = repo.meta.stats || {}; + const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath; + const indexedDate = new Date(repo.meta.indexedAt).toLocaleString(); + + console.log(`\n📁 ${repoName}`); + console.log(` Path: ${repo.meta.repoPath}`); + console.log(` Indexed: ${indexedDate}`); + console.log(` Stats: ${stats.files ?? 0} files, ${stats.nodes ?? 0} nodes, ${stats.edges ?? 0} edges`); + console.log(` Commit: ${repo.meta.lastCommit?.slice(0, 7) || 'unknown'} (id: ${repo.id})`); + }); +}; + + + diff --git a/gitnexus-cli/src/cli/mcp.ts b/gitnexus-cli/src/cli/mcp.ts new file mode 100644 index 000000000..4e5acdbf9 --- /dev/null +++ b/gitnexus-cli/src/cli/mcp.ts @@ -0,0 +1,8 @@ +import { startMCPServer } from '../mcp/server.js'; + +export const mcpCommand = async () => { + await startMCPServer(); +}; + + + diff --git a/gitnexus-cli/src/cli/serve.ts b/gitnexus-cli/src/cli/serve.ts new file mode 100644 index 000000000..ef43cf9ae --- /dev/null +++ b/gitnexus-cli/src/cli/serve.ts @@ -0,0 +1,9 @@ +import { createServer } from '../server/api.js'; + +export const serveCommand = async (options?: { port?: string }) => { + const port = Number(options?.port ?? 4747); + await createServer(port); +}; + + + diff --git a/gitnexus-cli/src/cli/status.ts b/gitnexus-cli/src/cli/status.ts new file mode 100644 index 000000000..5c7363530 --- /dev/null +++ b/gitnexus-cli/src/cli/status.ts @@ -0,0 +1,28 @@ +import { detectRepoByCwd } from '../storage/repo-manager.js'; +import { getCurrentCommit, isGitRepo } from '../storage/git.js'; + +export const statusCommand = async () => { + const cwd = process.cwd(); + if (!isGitRepo(cwd)) { + console.log('Not a git repository.'); + return; + } + + const repo = await detectRepoByCwd(cwd); + if (!repo) { + console.log('Repository not indexed. Run: gitnexus analyze'); + return; + } + + const current = getCurrentCommit(repo.meta.repoPath); + const upToDate = current && current === repo.meta.lastCommit; + + console.log(`Repo: ${repo.meta.repoPath}`); + console.log(`Indexed at: ${repo.meta.indexedAt}`); + console.log(`Last commit indexed: ${repo.meta.lastCommit}`); + console.log(`Current commit: ${current}`); + console.log(`Status: ${upToDate ? 'up-to-date' : 'stale'}`); +}; + + + diff --git a/gitnexus-cli/src/config/ignore-service.ts b/gitnexus-cli/src/config/ignore-service.ts new file mode 100644 index 000000000..affd83578 --- /dev/null +++ b/gitnexus-cli/src/config/ignore-service.ts @@ -0,0 +1,239 @@ +const DEFAULT_IGNORE_LIST = new Set([ + // Version Control + '.git', + '.svn', + '.hg', + '.bzr', + + // IDEs & Editors + '.idea', + '.vscode', + '.vs', + '.eclipse', + '.settings', + '.DS_Store', + 'Thumbs.db', + + // Dependencies + 'node_modules', + 'bower_components', + 'jspm_packages', + 'vendor', // PHP/Go + // 'packages' removed - commonly used for monorepo source code (lerna, pnpm, yarn workspaces) + 'venv', + '.venv', + 'env', + '.env', + '__pycache__', + '.pytest_cache', + '.mypy_cache', + 'site-packages', + '.tox', + 'eggs', + '.eggs', + 'lib64', + 'parts', + 'sdist', + 'wheels', + + // Build Outputs + 'dist', + 'build', + 'out', + 'output', + 'bin', + 'obj', + 'target', // Java/Rust + '.next', + '.nuxt', + '.output', + '.vercel', + '.netlify', + '.serverless', + '_build', + 'public/build', + '.parcel-cache', + '.turbo', + '.svelte-kit', + + // Test & Coverage + 'coverage', + '.nyc_output', + 'htmlcov', + '.coverage', + '__tests__', // Often just test files + '__mocks__', + '.jest', + + // Logs & Temp + 'logs', + 'log', + 'tmp', + 'temp', + 'cache', + '.cache', + '.tmp', + '.temp', + + // Generated/Compiled + '.generated', + 'generated', + 'auto-generated', + '.terraform', + '.serverless', + + // Documentation (optional - might want to keep) + // 'docs', + // 'documentation', + + // Misc + '.husky', + '.github', // GitHub config, not code + '.circleci', + '.gitlab', + 'fixtures', // Test fixtures + 'snapshots', // Jest snapshots + '__snapshots__', +]); + +const IGNORED_EXTENSIONS = new Set([ + // Images + '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.webp', '.bmp', '.tiff', '.tif', + '.psd', '.ai', '.sketch', '.fig', '.xd', + + // Archives + '.zip', '.tar', '.gz', '.rar', '.7z', '.bz2', '.xz', '.tgz', + + // Binary/Compiled + '.exe', '.dll', '.so', '.dylib', '.a', '.lib', '.o', '.obj', + '.class', '.jar', '.war', '.ear', + '.pyc', '.pyo', '.pyd', + '.beam', // Erlang + '.wasm', // WebAssembly - important! + '.node', // Native Node addons + + // Documents + '.pdf', '.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', + '.odt', '.ods', '.odp', + + // Media + '.mp4', '.mp3', '.wav', '.mov', '.avi', '.mkv', '.flv', '.wmv', + '.ogg', '.webm', '.flac', '.aac', '.m4a', + + // Fonts + '.woff', '.woff2', '.ttf', '.eot', '.otf', + + // Databases + '.db', '.sqlite', '.sqlite3', '.mdb', '.accdb', + + // Minified/Bundled files + '.min.js', '.min.css', '.bundle.js', '.chunk.js', + + // Source maps (debug files, not source) + '.map', + + // Lock files (handled separately, but also here) + '.lock', + + // Certificates & Keys (security - don't index!) + '.pem', '.key', '.crt', '.cer', '.p12', '.pfx', + + // Data files (often large/binary) + '.csv', '.tsv', '.parquet', '.avro', '.feather', + '.npy', '.npz', '.pkl', '.pickle', '.h5', '.hdf5', + + // Misc binary + '.bin', '.dat', '.data', '.raw', + '.iso', '.img', '.dmg', +]); + +// Files to ignore by exact name +const IGNORED_FILES = new Set([ + 'package-lock.json', + 'yarn.lock', + 'pnpm-lock.yaml', + 'composer.lock', + 'Gemfile.lock', + 'poetry.lock', + 'Cargo.lock', + 'go.sum', + '.gitignore', + '.gitattributes', + '.npmrc', + '.yarnrc', + '.editorconfig', + '.prettierrc', + '.prettierignore', + '.eslintignore', + '.dockerignore', + 'Thumbs.db', + '.DS_Store', + 'LICENSE', + 'LICENSE.md', + 'LICENSE.txt', + 'CHANGELOG.md', + 'CHANGELOG', + 'CONTRIBUTING.md', + 'CODE_OF_CONDUCT.md', + 'SECURITY.md', + '.env', + '.env.local', + '.env.development', + '.env.production', + '.env.test', + '.env.example', +]); + + + +export const shouldIgnorePath = (filePath: string): boolean => { + const normalizedPath = filePath.replace(/\\/g, '/'); + const parts = normalizedPath.split('/'); + const fileName = parts[parts.length - 1]; + const fileNameLower = fileName.toLowerCase(); + + // Check if any path segment is in ignore list + for (const part of parts) { + if (DEFAULT_IGNORE_LIST.has(part)) { + return true; + } + } + + // Check exact filename matches + if (IGNORED_FILES.has(fileName) || IGNORED_FILES.has(fileNameLower)) { + return true; + } + + // Check extension + const lastDotIndex = fileNameLower.lastIndexOf('.'); + if (lastDotIndex !== -1) { + const ext = fileNameLower.substring(lastDotIndex); + if (IGNORED_EXTENSIONS.has(ext)) return true; + + // Handle compound extensions like .min.js, .bundle.js + const secondLastDot = fileNameLower.lastIndexOf('.', lastDotIndex - 1); + if (secondLastDot !== -1) { + const compoundExt = fileNameLower.substring(secondLastDot); + if (IGNORED_EXTENSIONS.has(compoundExt)) return true; + } + } + + // Ignore hidden files (starting with .) + if (fileName.startsWith('.') && fileName !== '.') { + // But allow some important config files + const allowedDotFiles = ['.env', '.gitignore']; // Already in IGNORED_FILES, so this is redundant + // Actually, let's NOT ignore all dot files - many are important configs + // Just rely on the explicit lists above + } + + // Ignore files that look like generated/bundled code + if (fileNameLower.includes('.bundle.') || + fileNameLower.includes('.chunk.') || + fileNameLower.includes('.generated.') || + fileNameLower.endsWith('.d.ts')) { // TypeScript declaration files + return true; + } + + return false; +} + diff --git a/gitnexus-cli/src/config/supported-languages.ts b/gitnexus-cli/src/config/supported-languages.ts new file mode 100644 index 000000000..15df37c54 --- /dev/null +++ b/gitnexus-cli/src/config/supported-languages.ts @@ -0,0 +1,14 @@ +export enum SupportedLanguages { + JavaScript = 'javascript', + TypeScript = 'typescript', + Python = 'python', + Java = 'java', + C = 'c', + CPlusPlus = 'cpp', + CSharp = 'csharp', + Go = 'go', + Rust = 'rust', + // PHP = 'php', + // Ruby = 'ruby', + // Swift = 'swift', +} \ No newline at end of file diff --git a/gitnexus-cli/src/core/embeddings/embedder.ts b/gitnexus-cli/src/core/embeddings/embedder.ts new file mode 100644 index 000000000..f0cdcde45 --- /dev/null +++ b/gitnexus-cli/src/core/embeddings/embedder.ts @@ -0,0 +1,243 @@ +/** + * Embedder Module + * + * Singleton factory for transformers.js embedding pipeline. + * Handles model loading, caching, and both single and batch embedding operations. + * + * Uses snowflake-arctic-embed-xs by default (22M params, 384 dims, ~90MB) + */ + +import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; +import { DEFAULT_EMBEDDING_CONFIG, type EmbeddingConfig, type ModelProgress } from './types.js'; + +// Module-level state for singleton pattern +let embedderInstance: FeatureExtractionPipeline | null = null; +let isInitializing = false; +let initPromise: Promise | null = null; +let currentDevice: 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null = null; + +/** + * Progress callback type for model loading + */ +export type ModelProgressCallback = (progress: ModelProgress) => void; + +/** + * Get the current device being used for inference + */ +export const getCurrentDevice = (): 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null => currentDevice; + +/** + * Initialize the embedding model + * Uses singleton pattern - only loads once, subsequent calls return cached instance + * + * @param onProgress - Optional callback for model download progress + * @param config - Optional configuration override + * @param forceDevice - Force a specific device + * @returns Promise resolving to the embedder pipeline + */ +export const initEmbedder = async ( + onProgress?: ModelProgressCallback, + config: Partial = {}, + forceDevice?: 'webgpu' | 'cuda' | 'cpu' | 'wasm' +): Promise => { + // Return existing instance if available + if (embedderInstance) { + return embedderInstance; + } + + // If already initializing, wait for that promise + if (isInitializing && initPromise) { + return initPromise; + } + + isInitializing = true; + + const finalConfig = { ...DEFAULT_EMBEDDING_CONFIG, ...config }; + // On Windows, use webgpu for GPU acceleration (via DirectX12/DirectML) + // CUDA is only available on Linux with onnxruntime-node + const isWindows = process.platform === 'win32'; + const gpuDevice = isWindows ? 'webgpu' : 'cuda'; + let requestedDevice = forceDevice || (finalConfig.device === 'auto' ? gpuDevice : finalConfig.device); + + initPromise = (async () => { + try { + // Configure transformers.js environment + env.allowLocalModels = false; + + const isDev = process.env.NODE_ENV !== 'production'; + if (isDev) { + console.log(`🧠 Loading embedding model: ${finalConfig.modelId}`); + } + + const progressCallback = onProgress ? (data: any) => { + const progress: ModelProgress = { + status: data.status || 'progress', + file: data.file, + progress: data.progress, + loaded: data.loaded, + total: data.total, + }; + onProgress(progress); + } : undefined; + + // Try GPU first if auto, fall back to CPU + // Windows: webgpu (DirectX12/DirectML), Linux: cuda + const devicesToTry: Array<'webgpu' | 'cuda' | 'cpu' | 'wasm'> = + (requestedDevice === 'webgpu' || requestedDevice === 'cuda') + ? [requestedDevice, 'cpu'] + : [requestedDevice as 'cpu' | 'wasm']; + + for (const device of devicesToTry) { + try { + if (isDev && device === 'webgpu') { + console.log('🔧 Trying WebGPU (DirectX12) backend...'); + } else if (isDev && device === 'cuda') { + console.log('🔧 Trying CUDA GPU backend...'); + } else if (isDev && device === 'cpu') { + console.log('🔧 Using CPU backend...'); + } else if (isDev && device === 'wasm') { + console.log('🔧 Using WASM backend (slower)...'); + } + + embedderInstance = await (pipeline as any)( + 'feature-extraction', + finalConfig.modelId, + { + device: device, + dtype: 'fp32', + progress_callback: progressCallback, + } + ); + currentDevice = device; + + if (isDev) { + const label = device === 'webgpu' ? 'GPU (WebGPU/DirectX12)' + : device === 'cuda' ? 'GPU (CUDA)' + : device.toUpperCase(); + console.log(`✅ Using ${label} backend`); + console.log('✅ Embedding model loaded successfully'); + } + + return embedderInstance!; + } catch (deviceError) { + if (isDev && (device === 'cuda' || device === 'webgpu')) { + const gpuType = device === 'webgpu' ? 'WebGPU' : 'CUDA'; + console.log(`⚠️ ${gpuType} not available, falling back to CPU...`); + } + // Continue to next device in list + if (device === devicesToTry[devicesToTry.length - 1]) { + throw deviceError; // Last device failed, propagate error + } + } + } + + throw new Error('No suitable device found for embedding model'); + } catch (error) { + isInitializing = false; + initPromise = null; + embedderInstance = null; + throw error; + } finally { + isInitializing = false; + } + })(); + + return initPromise; +}; + +/** + * Check if the embedder is initialized and ready + */ +export const isEmbedderReady = (): boolean => { + return embedderInstance !== null; +}; + +/** + * Get the embedder instance (throws if not initialized) + */ +export const getEmbedder = (): FeatureExtractionPipeline => { + if (!embedderInstance) { + throw new Error('Embedder not initialized. Call initEmbedder() first.'); + } + return embedderInstance; +}; + +/** + * Embed a single text string + * + * @param text - Text to embed + * @returns Float32Array of embedding vector (384 dimensions) + */ +export const embedText = async (text: string): Promise => { + const embedder = getEmbedder(); + + const result = await embedder(text, { + pooling: 'mean', + normalize: true, + }); + + // Result is a Tensor, convert to Float32Array + return new Float32Array(result.data as ArrayLike); +}; + +/** + * Embed multiple texts in a single batch + * More efficient than calling embedText multiple times + * + * @param texts - Array of texts to embed + * @returns Array of Float32Array embedding vectors + */ +export const embedBatch = async (texts: string[]): Promise => { + if (texts.length === 0) { + return []; + } + + const embedder = getEmbedder(); + + // Process batch + const result = await embedder(texts, { + pooling: 'mean', + normalize: true, + }); + + // Result shape is [batch_size, dimensions] + // Need to split into individual vectors + const data = result.data as ArrayLike; + const dimensions = DEFAULT_EMBEDDING_CONFIG.dimensions; + const embeddings: Float32Array[] = []; + + for (let i = 0; i < texts.length; i++) { + const start = i * dimensions; + const end = start + dimensions; + embeddings.push(new Float32Array(Array.prototype.slice.call(data, start, end))); + } + + return embeddings; +}; + +/** + * Convert Float32Array to regular number array (for KuzuDB storage) + */ +export const embeddingToArray = (embedding: Float32Array): number[] => { + return Array.from(embedding); +}; + +/** + * Cleanup the embedder (free memory) + * Call this when done with embeddings + */ +export const disposeEmbedder = async (): Promise => { + if (embedderInstance) { + // transformers.js pipelines may have a dispose method + try { + if ('dispose' in embedderInstance && typeof embedderInstance.dispose === 'function') { + await embedderInstance.dispose(); + } + } catch { + // Ignore disposal errors + } + embedderInstance = null; + initPromise = null; + } +}; + diff --git a/gitnexus-cli/src/core/embeddings/embedding-pipeline.ts b/gitnexus-cli/src/core/embeddings/embedding-pipeline.ts new file mode 100644 index 000000000..128e5d937 --- /dev/null +++ b/gitnexus-cli/src/core/embeddings/embedding-pipeline.ts @@ -0,0 +1,401 @@ +/** + * Embedding Pipeline Module + * + * Orchestrates the background embedding process: + * 1. Query embeddable nodes from KuzuDB + * 2. Generate text representations + * 3. Batch embed using transformers.js + * 4. Update KuzuDB with embeddings + * 5. Create vector index for semantic search + */ + +import { initEmbedder, embedBatch, embedText, embeddingToArray, isEmbedderReady } from './embedder.js'; +import { generateBatchEmbeddingTexts, generateEmbeddingText } from './text-generator.js'; +import { + type EmbeddingProgress, + type EmbeddingConfig, + type EmbeddableNode, + type SemanticSearchResult, + type ModelProgress, + DEFAULT_EMBEDDING_CONFIG, + EMBEDDABLE_LABELS, +} from './types.js'; + +const isDev = process.env.NODE_ENV !== 'production'; + +/** + * Progress callback type + */ +export type EmbeddingProgressCallback = (progress: EmbeddingProgress) => void; + +/** + * Query all embeddable nodes from KuzuDB + * Uses table-specific queries (File has different schema than code elements) + */ +const queryEmbeddableNodes = async ( + executeQuery: (cypher: string) => Promise +): Promise => { + const allNodes: EmbeddableNode[] = []; + + // Query each embeddable table with table-specific columns + for (const label of EMBEDDABLE_LABELS) { + try { + let query: string; + + if (label === 'File') { + // File nodes don't have startLine/endLine + query = ` + MATCH (n:File) + RETURN n.id AS id, n.name AS name, 'File' AS label, + n.filePath AS filePath, n.content AS content + `; + } else { + // Code elements have startLine/endLine + query = ` + MATCH (n:${label}) + RETURN n.id AS id, n.name AS name, '${label}' AS label, + n.filePath AS filePath, n.content AS content, + n.startLine AS startLine, n.endLine AS endLine + `; + } + + const rows = await executeQuery(query); + for (const row of rows) { + allNodes.push({ + id: row.id ?? row[0], + name: row.name ?? row[1], + label: row.label ?? row[2], + filePath: row.filePath ?? row[3], + content: row.content ?? row[4] ?? '', + startLine: row.startLine ?? row[5], + endLine: row.endLine ?? row[6], + }); + } + } catch (error) { + // Table might not exist or be empty, continue + if (isDev) { + console.warn(`Query for ${label} nodes failed:`, error); + } + } + } + + return allNodes; +}; + +/** + * Batch INSERT embeddings into separate CodeEmbedding table + * Using a separate lightweight table avoids copy-on-write overhead + * that occurs when UPDATEing nodes with large content fields + */ +const batchInsertEmbeddings = async ( + executeWithReusedStatement: ( + cypher: string, + paramsList: Array> + ) => Promise, + updates: Array<{ id: string; embedding: number[] }> +): Promise => { + // INSERT into separate embedding table - much more memory efficient! + const cypher = `CREATE (e:CodeEmbedding {nodeId: $nodeId, embedding: $embedding})`; + const paramsList = updates.map(u => ({ nodeId: u.id, embedding: u.embedding })); + await executeWithReusedStatement(cypher, paramsList); +}; + +/** + * Create the vector index for semantic search + * Now indexes the separate CodeEmbedding table + */ +const createVectorIndex = async ( + executeQuery: (cypher: string) => Promise +): Promise => { + const cypher = ` + CALL CREATE_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx', 'embedding', metric := 'cosine') + `; + + try { + await executeQuery(cypher); + } catch (error) { + // Index might already exist + if (isDev) { + console.warn('Vector index creation warning:', error); + } + } +}; + +/** + * Run the embedding pipeline + * + * @param executeQuery - Function to execute Cypher queries against KuzuDB + * @param executeWithReusedStatement - Function to execute with reused prepared statement + * @param onProgress - Callback for progress updates + * @param config - Optional configuration override + */ +export const runEmbeddingPipeline = async ( + executeQuery: (cypher: string) => Promise, + executeWithReusedStatement: (cypher: string, paramsList: Array>) => Promise, + onProgress: EmbeddingProgressCallback, + config: Partial = {} +): Promise => { + const finalConfig = { ...DEFAULT_EMBEDDING_CONFIG, ...config }; + + try { + // Phase 1: Load embedding model + onProgress({ + phase: 'loading-model', + percent: 0, + modelDownloadPercent: 0, + }); + + await initEmbedder((modelProgress: ModelProgress) => { + // Report model download progress + const downloadPercent = modelProgress.progress ?? 0; + onProgress({ + phase: 'loading-model', + percent: Math.round(downloadPercent * 0.2), // 0-20% for model loading + modelDownloadPercent: downloadPercent, + }); + }, finalConfig); + + onProgress({ + phase: 'loading-model', + percent: 20, + modelDownloadPercent: 100, + }); + + if (isDev) { + console.log('🔍 Querying embeddable nodes...'); + } + + // Phase 2: Query embeddable nodes + const nodes = await queryEmbeddableNodes(executeQuery); + const totalNodes = nodes.length; + + if (isDev) { + console.log(`📊 Found ${totalNodes} embeddable nodes`); + } + + if (totalNodes === 0) { + onProgress({ + phase: 'ready', + percent: 100, + nodesProcessed: 0, + totalNodes: 0, + }); + return; + } + + // Phase 3: Batch embed nodes + const batchSize = finalConfig.batchSize; + const totalBatches = Math.ceil(totalNodes / batchSize); + let processedNodes = 0; + + onProgress({ + phase: 'embedding', + percent: 20, + nodesProcessed: 0, + totalNodes, + currentBatch: 0, + totalBatches, + }); + + for (let batchIndex = 0; batchIndex < totalBatches; batchIndex++) { + const start = batchIndex * batchSize; + const end = Math.min(start + batchSize, totalNodes); + const batch = nodes.slice(start, end); + + // Generate texts for this batch + const texts = generateBatchEmbeddingTexts(batch, finalConfig); + + // Embed the batch + const embeddings = await embedBatch(texts); + + // Update KuzuDB with embeddings + const updates = batch.map((node, i) => ({ + id: node.id, + embedding: embeddingToArray(embeddings[i]), + })); + + await batchInsertEmbeddings(executeWithReusedStatement, updates); + + processedNodes += batch.length; + + // Report progress (20-90% for embedding phase) + const embeddingProgress = 20 + ((processedNodes / totalNodes) * 70); + onProgress({ + phase: 'embedding', + percent: Math.round(embeddingProgress), + nodesProcessed: processedNodes, + totalNodes, + currentBatch: batchIndex + 1, + totalBatches, + }); + } + + // Phase 4: Create vector index + onProgress({ + phase: 'indexing', + percent: 90, + nodesProcessed: totalNodes, + totalNodes, + }); + + if (isDev) { + console.log('📇 Creating vector index...'); + } + + await createVectorIndex(executeQuery); + + // Complete + onProgress({ + phase: 'ready', + percent: 100, + nodesProcessed: totalNodes, + totalNodes, + }); + + if (isDev) { + console.log('✅ Embedding pipeline complete!'); + } + } catch (error) { + const errorMessage = error instanceof Error ? error.message : 'Unknown error'; + + if (isDev) { + console.error('❌ Embedding pipeline error:', error); + } + + onProgress({ + phase: 'error', + percent: 0, + error: errorMessage, + }); + + throw error; + } +}; + +/** + * Perform semantic search using the vector index + * + * Uses CodeEmbedding table and queries each node table to get metadata + * + * @param executeQuery - Function to execute Cypher queries + * @param query - Search query text + * @param k - Number of results to return (default: 10) + * @param maxDistance - Maximum distance threshold (default: 0.5) + * @returns Array of search results ordered by relevance + */ +export const semanticSearch = async ( + executeQuery: (cypher: string) => Promise, + query: string, + k: number = 10, + maxDistance: number = 0.5 +): Promise => { + if (!isEmbedderReady()) { + throw new Error('Embedding model not initialized. Run embedding pipeline first.'); + } + + // Embed the query + const queryEmbedding = await embedText(query); + const queryVec = embeddingToArray(queryEmbedding); + const queryVecStr = `[${queryVec.join(',')}]`; + + // Query the vector index on CodeEmbedding to get nodeIds and distances + const vectorQuery = ` + CALL QUERY_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx', + CAST(${queryVecStr} AS FLOAT[384]), ${k}) + YIELD node AS emb, distance + WITH emb, distance + WHERE distance < ${maxDistance} + RETURN emb.nodeId AS nodeId, distance + ORDER BY distance + `; + + const embResults = await executeQuery(vectorQuery); + + if (embResults.length === 0) { + return []; + } + + // Get metadata for each result by querying each node table + const results: SemanticSearchResult[] = []; + + for (const embRow of embResults) { + const nodeId = embRow.nodeId ?? embRow[0]; + const distance = embRow.distance ?? embRow[1]; + + // Extract label from node ID (format: Label:path:name) + const labelEndIdx = nodeId.indexOf(':'); + const label = labelEndIdx > 0 ? nodeId.substring(0, labelEndIdx) : 'Unknown'; + + // Query the specific table for this node + // File nodes don't have startLine/endLine + try { + let nodeQuery: string; + if (label === 'File') { + nodeQuery = ` + MATCH (n:File {id: '${nodeId.replace(/'/g, "''")}'}) + RETURN n.name AS name, n.filePath AS filePath + `; + } else { + nodeQuery = ` + MATCH (n:${label} {id: '${nodeId.replace(/'/g, "''")}'}) + RETURN n.name AS name, n.filePath AS filePath, + n.startLine AS startLine, n.endLine AS endLine + `; + } + const nodeRows = await executeQuery(nodeQuery); + if (nodeRows.length > 0) { + const nodeRow = nodeRows[0]; + results.push({ + nodeId, + name: nodeRow.name ?? nodeRow[0] ?? '', + label, + filePath: nodeRow.filePath ?? nodeRow[1] ?? '', + distance, + startLine: label !== 'File' ? (nodeRow.startLine ?? nodeRow[2]) : undefined, + endLine: label !== 'File' ? (nodeRow.endLine ?? nodeRow[3]) : undefined, + }); + } + } catch { + // Table might not exist, skip + } + } + + return results; +}; + +/** + * Semantic search with graph expansion (flattened results) + * + * Note: With multi-table schema, graph traversal is simplified. + * Returns semantic matches with their metadata. + * For full graph traversal, use execute_vector_cypher tool directly. + * + * @param executeQuery - Function to execute Cypher queries + * @param query - Search query text + * @param k - Number of initial semantic matches (default: 5) + * @param _hops - Unused (kept for API compatibility). + * @returns Semantic matches with metadata + */ +export const semanticSearchWithContext = async ( + executeQuery: (cypher: string) => Promise, + query: string, + k: number = 5, + _hops: number = 1 +): Promise => { + // For multi-table schema, just return semantic search results + // Graph traversal is complex with separate tables - use execute_vector_cypher instead + const results = await semanticSearch(executeQuery, query, k, 0.5); + + return results.map(r => ({ + matchId: r.nodeId, + matchName: r.name, + matchLabel: r.label, + matchPath: r.filePath, + distance: r.distance, + connectedId: null, + connectedName: null, + connectedLabel: null, + relationType: null, + })); +}; + diff --git a/gitnexus-cli/src/core/embeddings/index.ts b/gitnexus-cli/src/core/embeddings/index.ts new file mode 100644 index 000000000..4b4f10bb5 --- /dev/null +++ b/gitnexus-cli/src/core/embeddings/index.ts @@ -0,0 +1,11 @@ +/** + * Embeddings Module + * + * Re-exports for the embedding pipeline system. + */ + +export * from './types.js'; +export * from './embedder.js'; +export * from './text-generator.js'; +export * from './embedding-pipeline.js'; + diff --git a/gitnexus-cli/src/core/embeddings/text-generator.ts b/gitnexus-cli/src/core/embeddings/text-generator.ts new file mode 100644 index 000000000..e3a99ff49 --- /dev/null +++ b/gitnexus-cli/src/core/embeddings/text-generator.ts @@ -0,0 +1,235 @@ +/** + * Text Generator Module + * + * Pure functions to generate embedding text from code nodes. + * Combines node metadata with code snippets for semantic matching. + */ + +import type { EmbeddableNode, EmbeddingConfig } from './types.js'; +import { DEFAULT_EMBEDDING_CONFIG } from './types.js'; + +/** + * Extract the filename from a file path + */ +const getFileName = (filePath: string): string => { + const parts = filePath.split('/'); + return parts[parts.length - 1] || filePath; +}; + +/** + * Extract the directory path from a file path + */ +const getDirectory = (filePath: string): string => { + const parts = filePath.split('/'); + parts.pop(); + return parts.join('/') || ''; +}; + +/** + * Truncate content to max length, preserving word boundaries + */ +const truncateContent = (content: string, maxLength: number): string => { + if (content.length <= maxLength) { + return content; + } + + // Find last space before maxLength to avoid cutting words + const truncated = content.slice(0, maxLength); + const lastSpace = truncated.lastIndexOf(' '); + + if (lastSpace > maxLength * 0.8) { + return truncated.slice(0, lastSpace) + '...'; + } + + return truncated + '...'; +}; + +/** + * Clean code content for embedding + * Removes excessive whitespace while preserving structure + */ +const cleanContent = (content: string): string => { + return content + // Normalize line endings + .replace(/\r\n/g, '\n') + // Remove excessive blank lines (more than 2) + .replace(/\n{3,}/g, '\n\n') + // Trim each line + .split('\n') + .map(line => line.trimEnd()) + .join('\n') + .trim(); +}; + +/** + * Generate embedding text for a Function node + */ +const generateFunctionText = ( + node: EmbeddableNode, + maxSnippetLength: number +): string => { + const parts: string[] = [ + `Function: ${node.name}`, + `File: ${getFileName(node.filePath)}`, + ]; + + const dir = getDirectory(node.filePath); + if (dir) { + parts.push(`Directory: ${dir}`); + } + + if (node.content) { + const cleanedContent = cleanContent(node.content); + const snippet = truncateContent(cleanedContent, maxSnippetLength); + parts.push('', snippet); + } + + return parts.join('\n'); +}; + +/** + * Generate embedding text for a Class node + */ +const generateClassText = ( + node: EmbeddableNode, + maxSnippetLength: number +): string => { + const parts: string[] = [ + `Class: ${node.name}`, + `File: ${getFileName(node.filePath)}`, + ]; + + const dir = getDirectory(node.filePath); + if (dir) { + parts.push(`Directory: ${dir}`); + } + + if (node.content) { + const cleanedContent = cleanContent(node.content); + const snippet = truncateContent(cleanedContent, maxSnippetLength); + parts.push('', snippet); + } + + return parts.join('\n'); +}; + +/** + * Generate embedding text for a Method node + */ +const generateMethodText = ( + node: EmbeddableNode, + maxSnippetLength: number +): string => { + const parts: string[] = [ + `Method: ${node.name}`, + `File: ${getFileName(node.filePath)}`, + ]; + + const dir = getDirectory(node.filePath); + if (dir) { + parts.push(`Directory: ${dir}`); + } + + if (node.content) { + const cleanedContent = cleanContent(node.content); + const snippet = truncateContent(cleanedContent, maxSnippetLength); + parts.push('', snippet); + } + + return parts.join('\n'); +}; + +/** + * Generate embedding text for an Interface node + */ +const generateInterfaceText = ( + node: EmbeddableNode, + maxSnippetLength: number +): string => { + const parts: string[] = [ + `Interface: ${node.name}`, + `File: ${getFileName(node.filePath)}`, + ]; + + const dir = getDirectory(node.filePath); + if (dir) { + parts.push(`Directory: ${dir}`); + } + + if (node.content) { + const cleanedContent = cleanContent(node.content); + const snippet = truncateContent(cleanedContent, maxSnippetLength); + parts.push('', snippet); + } + + return parts.join('\n'); +}; + +/** + * Generate embedding text for a File node + * Uses file name and first N characters of content + */ +const generateFileText = ( + node: EmbeddableNode, + maxSnippetLength: number +): string => { + const parts: string[] = [ + `File: ${node.name}`, + `Path: ${node.filePath}`, + ]; + + if (node.content) { + const cleanedContent = cleanContent(node.content); + // For files, use a shorter snippet since they can be very long + const snippet = truncateContent(cleanedContent, Math.min(maxSnippetLength, 300)); + parts.push('', snippet); + } + + return parts.join('\n'); +}; + +/** + * Generate embedding text for any embeddable node + * Dispatches to the appropriate generator based on node label + * + * @param node - The node to generate text for + * @param config - Optional configuration for max snippet length + * @returns Text suitable for embedding + */ +export const generateEmbeddingText = ( + node: EmbeddableNode, + config: Partial = {} +): string => { + const maxSnippetLength = config.maxSnippetLength ?? DEFAULT_EMBEDDING_CONFIG.maxSnippetLength; + + switch (node.label) { + case 'Function': + return generateFunctionText(node, maxSnippetLength); + case 'Class': + return generateClassText(node, maxSnippetLength); + case 'Method': + return generateMethodText(node, maxSnippetLength); + case 'Interface': + return generateInterfaceText(node, maxSnippetLength); + case 'File': + return generateFileText(node, maxSnippetLength); + default: + // Fallback for any other embeddable type + return `${node.label}: ${node.name}\nPath: ${node.filePath}`; + } +}; + +/** + * Generate embedding texts for a batch of nodes + * + * @param nodes - Array of nodes to generate text for + * @param config - Optional configuration + * @returns Array of texts in the same order as input nodes + */ +export const generateBatchEmbeddingTexts = ( + nodes: EmbeddableNode[], + config: Partial = {} +): string[] => { + return nodes.map(node => generateEmbeddingText(node, config)); +}; + diff --git a/gitnexus-cli/src/core/embeddings/types.ts b/gitnexus-cli/src/core/embeddings/types.ts new file mode 100644 index 000000000..b769b950c --- /dev/null +++ b/gitnexus-cli/src/core/embeddings/types.ts @@ -0,0 +1,117 @@ +/** + * Embedding Pipeline Types + * + * Type definitions for the embedding generation and semantic search system. + */ + +/** + * Node labels that should be embedded for semantic search + * These are code elements that benefit from semantic matching + */ +export const EMBEDDABLE_LABELS = [ + 'Function', + 'Class', + 'Method', + 'Interface', + 'File', +] as const; + +export type EmbeddableLabel = typeof EMBEDDABLE_LABELS[number]; + +/** + * Check if a label should be embedded + */ +export const isEmbeddableLabel = (label: string): label is EmbeddableLabel => + EMBEDDABLE_LABELS.includes(label as EmbeddableLabel); + +/** + * Embedding pipeline phases + */ +export type EmbeddingPhase = + | 'idle' + | 'loading-model' + | 'embedding' + | 'indexing' + | 'ready' + | 'error'; + +/** + * Progress information for the embedding pipeline + */ +export interface EmbeddingProgress { + phase: EmbeddingPhase; + percent: number; + modelDownloadPercent?: number; + nodesProcessed?: number; + totalNodes?: number; + currentBatch?: number; + totalBatches?: number; + error?: string; +} + +/** + * Configuration for the embedding pipeline + */ +export interface EmbeddingConfig { + /** Model identifier for transformers.js */ + modelId: string; + /** Number of nodes to embed in each batch */ + batchSize: number; + /** Embedding vector dimensions */ + dimensions: number; + /** Device to use for inference: 'auto' tries GPU first, falls back to CPU */ + device: 'auto' | 'webgpu' | 'cuda' | 'cpu' | 'wasm'; + /** Maximum characters of code snippet to include */ + maxSnippetLength: number; +} + +/** + * Default embedding configuration + * Uses snowflake-arctic-embed-xs for browser efficiency + * Tries WebGPU first (fast), user can choose WASM fallback if unavailable + */ +export const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig = { + modelId: 'Snowflake/snowflake-arctic-embed-xs', + batchSize: 16, + dimensions: 384, + device: 'auto', + maxSnippetLength: 500, +}; + +/** + * Result from semantic search + */ +export interface SemanticSearchResult { + nodeId: string; + name: string; + label: string; + filePath: string; + distance: number; + startLine?: number; + endLine?: number; +} + +/** + * Node data for embedding (minimal structure from KuzuDB query) + */ +export interface EmbeddableNode { + id: string; + name: string; + label: string; + filePath: string; + content: string; + startLine?: number; + endLine?: number; +} + +/** + * Model download progress from transformers.js + */ +export interface ModelProgress { + status: 'initiate' | 'download' | 'progress' | 'done' | 'ready'; + file?: string; + progress?: number; + loaded?: number; + total?: number; +} + diff --git a/gitnexus-cli/src/core/graph/graph.ts b/gitnexus-cli/src/core/graph/graph.ts new file mode 100644 index 000000000..695daf2bf --- /dev/null +++ b/gitnexus-cli/src/core/graph/graph.ts @@ -0,0 +1,41 @@ +import { GraphNode, GraphRelationship, KnowledgeGraph } from './types.js' + +export const createKnowledgeGraph = (): KnowledgeGraph => { + const nodeMap = new Map(); + const relationshipMap = new Map(); + + const addNode = (node: GraphNode) => { + if(!nodeMap.has(node.id)) { + nodeMap.set(node.id, node); + } + }; + + const addRelationship = (relationship: GraphRelationship) => { + if (!relationshipMap.has(relationship.id)) { + relationshipMap.set(relationship.id, relationship); + } + }; + + return{ + get nodes(){ + return Array.from(nodeMap.values()) + }, + + get relationships(){ + return Array.from(relationshipMap.values()) + }, + + // O(1) count getters - avoid creating arrays just for length + get nodeCount() { + return nodeMap.size; + }, + + get relationshipCount() { + return relationshipMap.size; + }, + + addNode, + addRelationship, + + }; +}; \ No newline at end of file diff --git a/gitnexus-cli/src/core/graph/types.ts b/gitnexus-cli/src/core/graph/types.ts new file mode 100644 index 000000000..7bc9a5a95 --- /dev/null +++ b/gitnexus-cli/src/core/graph/types.ts @@ -0,0 +1,86 @@ +export type NodeLabel = + | 'Project' + | 'Package' + | 'Module' + | 'Folder' + | 'File' + | 'Class' + | 'Function' + | 'Method' + | 'Variable' + | 'Interface' + | 'Enum' + | 'Decorator' + | 'Import' + | 'Type' + | 'CodeElement' + | 'Community' + | 'Process'; + + +export type NodeProperties = { + name: string, + filePath: string, + startLine?: number, + endLine?: number, + language?: string, + isExported?: boolean, + // Community-specific properties + heuristicLabel?: string, + cohesion?: number, + symbolCount?: number, + keywords?: string[], + description?: string, + enrichedBy?: 'heuristic' | 'llm', + // Process-specific properties + processType?: 'intra_community' | 'cross_community', + stepCount?: number, + communities?: string[], + entryPointId?: string, + terminalId?: string, + // Entry point scoring (computed by process detection) + entryPointScore?: number, + entryPointReason?: string, +} + +export type RelationshipType = + | 'CONTAINS' + | 'CALLS' + | 'INHERITS' + | 'OVERRIDES' + | 'IMPORTS' + | 'USES' + | 'DEFINES' + | 'DECORATES' + | 'IMPLEMENTS' + | 'EXTENDS' + | 'MEMBER_OF' + | 'STEP_IN_PROCESS' + +export interface GraphNode { + id: string, + label: NodeLabel, + properties: NodeProperties, +} + +export interface GraphRelationship { + id: string, + sourceId: string, + targetId: string, + type: RelationshipType, + /** Confidence score 0-1 (1.0 = certain, lower = uncertain resolution) */ + confidence: number, + /** Resolution reason: 'import-resolved', 'same-file', 'fuzzy-global', or empty for non-CALLS */ + reason: string, + /** Step number for STEP_IN_PROCESS relationships (1-indexed) */ + step?: number, +} + +export interface KnowledgeGraph { + nodes: GraphNode[], + relationships: GraphRelationship[], + nodeCount: number, + relationshipCount: number, + addNode: (node: GraphNode) => void, + addRelationship: (relationship: GraphRelationship) => void, +} \ No newline at end of file diff --git a/gitnexus-cli/src/core/ingestion/ast-cache.ts b/gitnexus-cli/src/core/ingestion/ast-cache.ts new file mode 100644 index 000000000..0ae105120 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/ast-cache.ts @@ -0,0 +1,48 @@ +import { LRUCache } from 'lru-cache'; +import Parser from 'tree-sitter'; + +// Define the interface for the Cache +export interface ASTCache { + get: (filePath: string) => Parser.Tree | undefined; + set: (filePath: string, tree: Parser.Tree) => void; + clear: () => void; + stats: () => { size: number; maxSize: number }; +} + +export const createASTCache = (maxSize: number = 50): ASTCache => { + // Initialize the cache with a 'dispose' handler + // This is the magic: When an item is evicted (dropped), this runs automatically. + const cache = new LRUCache({ + max: maxSize, + dispose: (tree) => { + try { + // NOTE: web-tree-sitter has tree.delete(); native tree-sitter trees are GC-managed. + // Keep this try/catch so we don't crash on either runtime. + (tree as any).delete?.(); + } catch (e) { + console.warn('Failed to delete tree from WASM memory', e); + } + } + }); + + return { + get: (filePath: string) => { + const tree = cache.get(filePath); + return tree; // Returns undefined if not found + }, + + set: (filePath: string, tree: Parser.Tree) => { + cache.set(filePath, tree); + }, + + clear: () => { + cache.clear(); + }, + + stats: () => ({ + size: cache.size, + maxSize: maxSize + }) + }; +}; + diff --git a/gitnexus-cli/src/core/ingestion/call-processor.ts b/gitnexus-cli/src/core/ingestion/call-processor.ts new file mode 100644 index 000000000..895e55352 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/call-processor.ts @@ -0,0 +1,322 @@ +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import { SymbolTable } from './symbol-table.js'; +import { ImportMap } from './import-processor.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; + +/** + * Node types that represent function/method definitions across languages. + * Used to find the enclosing function for a call site. + */ +const FUNCTION_NODE_TYPES = new Set([ + // TypeScript/JavaScript + 'function_declaration', + 'arrow_function', + 'function_expression', + 'method_definition', + 'generator_function_declaration', + // Python + 'function_definition', + // Common async variants + 'async_function_declaration', + 'async_arrow_function', + // Java + 'method_declaration', + 'constructor_declaration', + // C/C++ + // 'function_definition' already included above + // Go + // 'method_declaration' already included from Java + // C# + 'local_function_statement', + // Rust + 'function_item', + 'impl_item', // Methods inside impl blocks +]); + +/** + * Walk up the AST from a node to find the enclosing function/method. + * Returns null if the call is at module/file level (top-level code). + */ +const findEnclosingFunction = ( + node: any, + filePath: string, + symbolTable: SymbolTable +): string | null => { + let current = node.parent; + + while (current) { + if (FUNCTION_NODE_TYPES.has(current.type)) { + // Found enclosing function - try to get its name + let funcName: string | null = null; + let label = 'Function'; + + // Different node types have different name locations + if (current.type === 'function_declaration' || + current.type === 'function_definition' || + current.type === 'async_function_declaration' || + current.type === 'generator_function_declaration' || + current.type === 'function_item') { // Rust function + // Named function: function foo() {} + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'identifier' || c.type === 'property_identifier'); + funcName = nameNode?.text; + } else if (current.type === 'impl_item') { + // Rust method inside impl block: wrapper around function_item or const_item + // We need to look inside for the function_item + const funcItem = current.children?.find((c: any) => c.type === 'function_item'); + if (funcItem) { + const nameNode = funcItem.childForFieldName?.('name') || + funcItem.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + label = 'Method'; + } + } else if (current.type === 'method_definition') { + // Method: foo() {} inside class (JS/TS) + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'property_identifier'); + funcName = nameNode?.text; + label = 'Method'; + } else if (current.type === 'method_declaration') { + // Java method: public void foo() {} + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + label = 'Method'; + } else if (current.type === 'constructor_declaration') { + // Java constructor: public ClassName() {} + const nameNode = current.childForFieldName?.('name') || + current.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + label = 'Method'; // Treat constructors as methods for process detection + } else if (current.type === 'arrow_function' || current.type === 'function_expression') { + // Arrow/expression: const foo = () => {} - check parent variable declarator + const parent = current.parent; + if (parent?.type === 'variable_declarator') { + const nameNode = parent.childForFieldName?.('name') || + parent.children?.find((c: any) => c.type === 'identifier'); + funcName = nameNode?.text; + } + } + + if (funcName) { + // Look up the function in symbol table to get its node ID + // Try exact match first + const nodeId = symbolTable.lookupExact(filePath, funcName); + if (nodeId) return nodeId; + + // Try construct ID manually if lookup fails (common for non-exported internal functions) + // Format should match what parsing-processor generates: "Function:path/to/file:funcName" + // Check if we already have a node with this ID in the symbol table to be safe + const generatedId = generateId(label, `${filePath}:${funcName}`); + + // Ideally we should verify this ID exists, but strictly speaking if we are inside it, + // it SHOULD exist. Returning it is better than falling back to File. + return generatedId; + } + + // Couldn't determine function name - try parent (might be nested) + } + current = current.parent; + } + + return null; // Top-level call (not inside any function) +}; + +export const processCalls = async ( + graph: KnowledgeGraph, + files: { path: string; content: string }[], + astCache: ASTCache, + symbolTable: SymbolTable, + importMap: ImportMap, + onProgress?: (current: number, total: number) => void +) => { + const parser = await loadParser(); + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + onProgress?.(i + 1, files.length); + + // 1. Check language support first + const language = getLanguageFromFilename(file.path); + if (!language) continue; + + const queryStr = LANGUAGE_QUERIES[language]; + if (!queryStr) continue; + + // 2. ALWAYS load the language before querying (parser is stateful) + await loadLanguage(language, file.path); + + // 3. Get AST (Try Cache First) + let tree = astCache.get(file.path); + let wasReparsed = false; + + if (!tree) { + // Cache Miss: Re-parse + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } + wasReparsed = true; + } + + let query; + let matches; + try { + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); + matches = query.matches(tree.rootNode); + } catch (queryError) { + console.warn(`Query error for ${file.path}:`, queryError); + if (wasReparsed) (tree as any).delete?.(); + continue; + } + + // 3. Process each call match + matches.forEach(match => { + const captureMap: Record = {}; + match.captures.forEach(c => captureMap[c.name] = c.node); + + // Only process @call captures + if (!captureMap['call']) return; + + const nameNode = captureMap['call.name']; + if (!nameNode) return; + + const calledName = nameNode.text; + + // Skip common built-ins and noise + if (isBuiltInOrNoise(calledName)) return; + + // 4. Resolve the target using priority strategy (returns confidence) + const resolved = resolveCallTarget( + calledName, + file.path, + symbolTable, + importMap + ); + + if (!resolved) return; + + // 5. Find the enclosing function (caller) + const callNode = captureMap['call']; + const enclosingFuncId = findEnclosingFunction(callNode, file.path, symbolTable); + + // Use enclosing function as source, fallback to file for top-level calls + const sourceId = enclosingFuncId || generateId('File', file.path); + + const relId = generateId('CALLS', `${sourceId}:${calledName}->${resolved.nodeId}`); + + graph.addRelationship({ + id: relId, + sourceId, + targetId: resolved.nodeId, + type: 'CALLS', + confidence: resolved.confidence, + reason: resolved.reason, + }); + }); + + // Cleanup if re-parsed + if (wasReparsed) { + (tree as any).delete?.(); + } + } +}; + +/** + * Resolution result with confidence scoring + */ +interface ResolveResult { + nodeId: string; + confidence: number; // 0-1: how sure are we? + reason: string; // 'import-resolved' | 'same-file' | 'fuzzy-global' +} + +/** + * Resolve a function call to its target node ID using priority strategy: + * A. Check imported files first (highest confidence) + * B. Check local file definitions + * C. Fuzzy global search (lowest confidence) + * + * Returns confidence score so agents know what to trust. + */ +const resolveCallTarget = ( + calledName: string, + currentFile: string, + symbolTable: SymbolTable, + importMap: ImportMap +): ResolveResult | null => { + // Strategy A: Check imported files (HIGH confidence - we know the import chain) + const importedFiles = importMap.get(currentFile); + if (importedFiles) { + for (const importedFile of importedFiles) { + const nodeId = symbolTable.lookupExact(importedFile, calledName); + if (nodeId) { + return { nodeId, confidence: 0.9, reason: 'import-resolved' }; + } + } + } + + // Strategy B: Check local file (HIGH confidence - same file definition) + const localNodeId = symbolTable.lookupExact(currentFile, calledName); + if (localNodeId) { + return { nodeId: localNodeId, confidence: 0.85, reason: 'same-file' }; + } + + // Strategy C: Fuzzy global search (LOW confidence - just matching by name) + const fuzzyMatches = symbolTable.lookupFuzzy(calledName); + if (fuzzyMatches.length > 0) { + // Lower confidence if multiple matches exist (more ambiguous) + const confidence = fuzzyMatches.length === 1 ? 0.5 : 0.3; + return { nodeId: fuzzyMatches[0].nodeId, confidence, reason: 'fuzzy-global' }; + } + + return null; +}; + +/** + * Filter out common built-in functions and noise + * that shouldn't be tracked as calls + */ +const isBuiltInOrNoise = (name: string): boolean => { + const builtIns = new Set([ + // JavaScript/TypeScript built-ins + 'console', 'log', 'warn', 'error', 'info', 'debug', + 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval', + 'parseInt', 'parseFloat', 'isNaN', 'isFinite', + 'encodeURI', 'decodeURI', 'encodeURIComponent', 'decodeURIComponent', + 'JSON', 'parse', 'stringify', + 'Object', 'Array', 'String', 'Number', 'Boolean', 'Symbol', 'BigInt', + 'Map', 'Set', 'WeakMap', 'WeakSet', + 'Promise', 'resolve', 'reject', 'then', 'catch', 'finally', + 'Math', 'Date', 'RegExp', 'Error', + 'require', 'import', 'export', + 'fetch', 'Response', 'Request', + // React hooks and common functions + 'useState', 'useEffect', 'useCallback', 'useMemo', 'useRef', 'useContext', + 'useReducer', 'useLayoutEffect', 'useImperativeHandle', 'useDebugValue', + 'createElement', 'createContext', 'createRef', 'forwardRef', 'memo', 'lazy', + // Common array/object methods + 'map', 'filter', 'reduce', 'forEach', 'find', 'findIndex', 'some', 'every', + 'includes', 'indexOf', 'slice', 'splice', 'concat', 'join', 'split', + 'push', 'pop', 'shift', 'unshift', 'sort', 'reverse', + 'keys', 'values', 'entries', 'assign', 'freeze', 'seal', + 'hasOwnProperty', 'toString', 'valueOf', + // Python built-ins + 'print', 'len', 'range', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', + 'open', 'read', 'write', 'close', 'append', 'extend', 'update', + 'super', 'type', 'isinstance', 'issubclass', 'getattr', 'setattr', 'hasattr', + 'enumerate', 'zip', 'sorted', 'reversed', 'min', 'max', 'sum', 'abs', + ]); + + return builtIns.has(name); +}; + diff --git a/gitnexus-cli/src/core/ingestion/cluster-enricher.ts b/gitnexus-cli/src/core/ingestion/cluster-enricher.ts new file mode 100644 index 000000000..0154e3bf3 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/cluster-enricher.ts @@ -0,0 +1,245 @@ +/** + * Cluster Enricher + * + * LLM-based enrichment for community clusters. + * Generates semantic names, keywords, and descriptions using an LLM. + */ + +import { CommunityNode } from './community-processor.js'; + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface ClusterEnrichment { + name: string; + keywords: string[]; + description: string; +} + +export interface EnrichmentResult { + enrichments: Map; + tokensUsed: number; +} + +export interface LLMClient { + generate: (prompt: string) => Promise; +} + +export interface ClusterMemberInfo { + name: string; + filePath: string; + type: string; // 'Function' | 'Class' | 'Method' | 'Interface' +} + +// ============================================================================ +// PROMPT TEMPLATE +// ============================================================================ + +const buildEnrichmentPrompt = ( + members: ClusterMemberInfo[], + heuristicLabel: string +): string => { + // Limit to first 20 members to control token usage + const limitedMembers = members.slice(0, 20); + + const memberList = limitedMembers + .map(m => `${m.name} (${m.type})`) + .join(', '); + + return `Analyze this code cluster and provide a semantic name and short description. + +Heuristic: "${heuristicLabel}" +Members: ${memberList}${members.length > 20 ? ` (+${members.length - 20} more)` : ''} + +Reply with JSON only: +{"name": "2-4 word semantic name", "description": "One sentence describing purpose"}` +}; + +// ============================================================================ +// PARSE LLM RESPONSE +// ============================================================================ + +const parseEnrichmentResponse = ( + response: string, + fallbackLabel: string +): ClusterEnrichment => { + try { + // Extract JSON from response (handles markdown code blocks) + const jsonMatch = response.match(/\{[\s\S]*\}/); + if (!jsonMatch) { + throw new Error('No JSON found in response'); + } + + const parsed = JSON.parse(jsonMatch[0]); + + return { + name: parsed.name || fallbackLabel, + keywords: Array.isArray(parsed.keywords) ? parsed.keywords : [], + description: parsed.description || '', + }; + } catch { + // Fallback if parsing fails + return { + name: fallbackLabel, + keywords: [], + description: '', + }; + } +}; + +// ============================================================================ +// MAIN ENRICHMENT FUNCTION +// ============================================================================ + +/** + * Enrich clusters with LLM-generated names, keywords, and descriptions + * + * @param communities - Community nodes to enrich + * @param memberMap - Map of communityId -> member info + * @param llmClient - LLM client for generation + * @param onProgress - Progress callback + */ +export const enrichClusters = async ( + communities: CommunityNode[], + memberMap: Map, + llmClient: LLMClient, + onProgress?: (current: number, total: number) => void +): Promise => { + const enrichments = new Map(); + let tokensUsed = 0; + + for (let i = 0; i < communities.length; i++) { + const community = communities[i]; + const members = memberMap.get(community.id) || []; + + onProgress?.(i + 1, communities.length); + + if (members.length === 0) { + // No members, use heuristic + enrichments.set(community.id, { + name: community.heuristicLabel, + keywords: [], + description: '', + }); + continue; + } + + try { + const prompt = buildEnrichmentPrompt(members, community.heuristicLabel); + const response = await llmClient.generate(prompt); + + // Rough token estimate + tokensUsed += prompt.length / 4 + response.length / 4; + + const enrichment = parseEnrichmentResponse(response, community.heuristicLabel); + enrichments.set(community.id, enrichment); + } catch (error) { + // On error, fallback to heuristic + console.warn(`Failed to enrich cluster ${community.id}:`, error); + enrichments.set(community.id, { + name: community.heuristicLabel, + keywords: [], + description: '', + }); + } + } + + return { enrichments, tokensUsed }; +}; + +// ============================================================================ +// BATCH ENRICHMENT (more efficient) +// ============================================================================ + +/** + * Enrich multiple clusters in a single LLM call (batch mode) + * More efficient for token usage but requires larger context window + */ +export const enrichClustersBatch = async ( + communities: CommunityNode[], + memberMap: Map, + llmClient: LLMClient, + batchSize: number = 5, + onProgress?: (current: number, total: number) => void +): Promise => { + const enrichments = new Map(); + let tokensUsed = 0; + + // Process in batches + for (let i = 0; i < communities.length; i += batchSize) { + // Report progress + onProgress?.(Math.min(i + batchSize, communities.length), communities.length); + + const batch = communities.slice(i, i + batchSize); + + const batchPrompt = batch.map((community, idx) => { + const members = memberMap.get(community.id) || []; + const limitedMembers = members.slice(0, 15); + const memberList = limitedMembers + .map(m => `${m.name} (${m.type})`) + .join(', '); + + return `Cluster ${idx + 1} (id: ${community.id}): +Heuristic: "${community.heuristicLabel}" +Members: ${memberList}`; + }).join('\n\n'); + + const prompt = `Analyze these code clusters and generate semantic names, keywords, and descriptions. + +${batchPrompt} + +Output JSON array: +[ + {"id": "comm_X", "name": "...", "keywords": [...], "description": "..."}, + ... +]`; + + try { + const response = await llmClient.generate(prompt); + tokensUsed += prompt.length / 4 + response.length / 4; + + // Parse batch response + const jsonMatch = response.match(/\[[\s\S]*\]/); + if (jsonMatch) { + const parsed = JSON.parse(jsonMatch[0]) as Array<{ + id: string; + name: string; + keywords: string[]; + description: string; + }>; + + for (const item of parsed) { + enrichments.set(item.id, { + name: item.name, + keywords: item.keywords || [], + description: item.description || '', + }); + } + } + } catch (error) { + console.warn('Batch enrichment failed, falling back to heuristics:', error); + // Fallback for this batch + for (const community of batch) { + enrichments.set(community.id, { + name: community.heuristicLabel, + keywords: [], + description: '', + }); + } + } + } + + // Fill in any missing communities + for (const community of communities) { + if (!enrichments.has(community.id)) { + enrichments.set(community.id, { + name: community.heuristicLabel, + keywords: [], + description: '', + }); + } + } + + return { enrichments, tokensUsed }; +}; diff --git a/gitnexus-cli/src/core/ingestion/community-processor.ts b/gitnexus-cli/src/core/ingestion/community-processor.ts new file mode 100644 index 000000000..42194c076 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/community-processor.ts @@ -0,0 +1,356 @@ +/** + * Community Detection Processor + * + * Uses the Leiden algorithm (via graphology-communities-louvain) to detect + * communities/clusters in the code graph based on CALLS relationships. + * + * Communities represent groups of code that work together frequently, + * helping agents navigate the codebase by functional area rather than file structure. + */ + +// NOTE: graphology + louvain typings are a bit inconsistent across versions. +// Keep these as `any` to avoid blocking the CLI build. +import Graph from 'graphology'; +import louvain from 'graphology-communities-louvain'; +import { KnowledgeGraph, NodeLabel } from '../graph/types.js'; + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface CommunityNode { + id: string; + label: string; + heuristicLabel: string; + cohesion: number; + symbolCount: number; +} + +export interface CommunityMembership { + nodeId: string; + communityId: string; +} + +export interface CommunityDetectionResult { + communities: CommunityNode[]; + memberships: CommunityMembership[]; + stats: { + totalCommunities: number; + modularity: number; + nodesProcessed: number; + }; +} + +// ============================================================================ +// COMMUNITY COLORS (for visualization) +// ============================================================================ + +export const COMMUNITY_COLORS = [ + '#ef4444', // red + '#f97316', // orange + '#eab308', // yellow + '#22c55e', // green + '#06b6d4', // cyan + '#3b82f6', // blue + '#8b5cf6', // violet + '#d946ef', // fuchsia + '#ec4899', // pink + '#f43f5e', // rose + '#14b8a6', // teal + '#84cc16', // lime +]; + +export const getCommunityColor = (communityIndex: number): string => { + return COMMUNITY_COLORS[communityIndex % COMMUNITY_COLORS.length]; +}; + +// ============================================================================ +// MAIN PROCESSOR +// ============================================================================ + +/** + * Detect communities in the knowledge graph using Leiden algorithm + * + * This runs AFTER all relationships (CALLS, IMPORTS, etc.) have been built. + * It uses primarily CALLS edges to cluster code that works together. + */ +export const processCommunities = async ( + knowledgeGraph: KnowledgeGraph, + onProgress?: (message: string, progress: number) => void +): Promise => { + onProgress?.('Building graph for community detection...', 0); + + // Step 1: Build a graphology graph from the knowledge graph + // We only include symbol nodes (Function, Class, Method) and CALLS edges + const graph = buildGraphologyGraph(knowledgeGraph); + + if (graph.order === 0) { + // No nodes to cluster + return { + communities: [], + memberships: [], + stats: { totalCommunities: 0, modularity: 0, nodesProcessed: 0 } + }; + } + + onProgress?.(`Running Leiden algorithm on ${graph.order} nodes...`, 30); + + // Step 2: Run Leiden (via Louvain implementation with refinement) + const details = (louvain as any).detailed(graph, { + resolution: 1.0, // Default resolution, can be tuned + randomWalk: true, + }); + + onProgress?.(`Found ${details.count} communities...`, 60); + + // Step 3: Create community nodes with heuristic labels + const communityNodes = createCommunityNodes( + details.communities as Record, + details.count, + graph, + knowledgeGraph + ); + + onProgress?.('Creating membership edges...', 80); + + // Step 4: Create membership mappings + const memberships: CommunityMembership[] = []; + Object.entries(details.communities).forEach(([nodeId, communityNum]) => { + memberships.push({ + nodeId, + communityId: `comm_${communityNum}`, + }); + }); + + onProgress?.('Community detection complete!', 100); + + return { + communities: communityNodes, + memberships, + stats: { + totalCommunities: details.count, + modularity: details.modularity, + nodesProcessed: graph.order, + } + }; +}; + +// ============================================================================ +// HELPER: Build graphology graph from knowledge graph +// ============================================================================ + +/** + * Build a graphology graph containing only symbol nodes and CALLS edges + * This is what the Leiden algorithm will cluster + */ +const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): any => { + // Use undirected graph for Leiden - it looks at edge density, not direction + const graph = new (Graph as any)({ type: 'undirected', allowSelfLoops: false }); + + // Symbol types that should be clustered + const symbolTypes = new Set(['Function', 'Class', 'Method', 'Interface']); + + // Add symbol nodes + knowledgeGraph.nodes.forEach(node => { + if (symbolTypes.has(node.label)) { + graph.addNode(node.id, { + name: node.properties.name, + filePath: node.properties.filePath, + type: node.label, + }); + } + }); + + // Add CALLS edges (primary clustering signal) + // We can also include EXTENDS/IMPLEMENTS for OOP clustering + const clusteringRelTypes = new Set(['CALLS', 'EXTENDS', 'IMPLEMENTS']); + + knowledgeGraph.relationships.forEach(rel => { + if (clusteringRelTypes.has(rel.type)) { + // Only add edge if both nodes exist in our symbol graph + // Also skip self-loops (recursive calls) - not allowed in undirected graph + if (graph.hasNode(rel.sourceId) && graph.hasNode(rel.targetId) && rel.sourceId !== rel.targetId) { + // Avoid duplicate edges + if (!graph.hasEdge(rel.sourceId, rel.targetId)) { + graph.addEdge(rel.sourceId, rel.targetId); + } + } + } + }); + + return graph; +}; + +// ============================================================================ +// HELPER: Create community nodes with heuristic labels +// ============================================================================ + +/** + * Create Community nodes with auto-generated labels based on member file paths + */ +const createCommunityNodes = ( + communities: Record, + communityCount: number, + graph: any, + knowledgeGraph: KnowledgeGraph +): CommunityNode[] => { + // Group node IDs by community + const communityMembers = new Map(); + + Object.entries(communities).forEach(([nodeId, commNum]) => { + if (!communityMembers.has(commNum)) { + communityMembers.set(commNum, []); + } + communityMembers.get(commNum)!.push(nodeId); + }); + + // Build node lookup for file paths + const nodePathMap = new Map(); + knowledgeGraph.nodes.forEach(node => { + if (node.properties.filePath) { + nodePathMap.set(node.id, node.properties.filePath); + } + }); + + // Create community nodes - SKIP SINGLETONS (isolated nodes) + const communityNodes: CommunityNode[] = []; + + communityMembers.forEach((memberIds, commNum) => { + // Skip singleton communities - they're just isolated nodes + if (memberIds.length < 2) return; + + const heuristicLabel = generateHeuristicLabel(memberIds, nodePathMap, graph, commNum); + + communityNodes.push({ + id: `comm_${commNum}`, + label: heuristicLabel, + heuristicLabel, + cohesion: calculateCohesion(memberIds, graph), + symbolCount: memberIds.length, + }); + }); + + // Sort by size descending + communityNodes.sort((a, b) => b.symbolCount - a.symbolCount); + + return communityNodes; +}; + +// ============================================================================ +// HELPER: Generate heuristic label from folder patterns +// ============================================================================ + +/** + * Generate a human-readable label from the most common folder name in the community + */ +const generateHeuristicLabel = ( + memberIds: string[], + nodePathMap: Map, + graph: any, + commNum: number +): string => { + // Collect folder names from file paths + const folderCounts = new Map(); + + memberIds.forEach(nodeId => { + const filePath = nodePathMap.get(nodeId) || ''; + const parts = filePath.split('/').filter(Boolean); + + // Get the most specific folder (parent directory) + if (parts.length >= 2) { + const folder = parts[parts.length - 2]; + // Skip generic folder names + if (!['src', 'lib', 'core', 'utils', 'common', 'shared', 'helpers'].includes(folder.toLowerCase())) { + folderCounts.set(folder, (folderCounts.get(folder) || 0) + 1); + } + } + }); + + // Find most common folder + let maxCount = 0; + let bestFolder = ''; + + folderCounts.forEach((count, folder) => { + if (count > maxCount) { + maxCount = count; + bestFolder = folder; + } + }); + + if (bestFolder) { + // Capitalize first letter + return bestFolder.charAt(0).toUpperCase() + bestFolder.slice(1); + } + + // Fallback: use function names to detect patterns + const names: string[] = []; + memberIds.forEach(nodeId => { + const name = graph.getNodeAttribute(nodeId, 'name'); + if (name) names.push(name); + }); + + // Look for common prefixes + if (names.length > 2) { + const commonPrefix = findCommonPrefix(names); + if (commonPrefix.length > 2) { + return commonPrefix.charAt(0).toUpperCase() + commonPrefix.slice(1); + } + } + + // Last resort: generic name with community ID for uniqueness + return `Cluster_${commNum}`; +}; + +/** + * Find common prefix among strings + */ +const findCommonPrefix = (strings: string[]): string => { + if (strings.length === 0) return ''; + + const sorted = strings.slice().sort(); + const first = sorted[0]; + const last = sorted[sorted.length - 1]; + + let i = 0; + while (i < first.length && first[i] === last[i]) { + i++; + } + + return first.substring(0, i); +}; + +// ============================================================================ +// HELPER: Calculate community cohesion +// ============================================================================ + +/** + * Calculate cohesion score (0-1) based on internal edge density + * Higher cohesion = more internal connections relative to size + */ +const calculateCohesion = (memberIds: string[], graph: any): number => { + if (memberIds.length <= 1) return 1.0; + + const memberSet = new Set(memberIds); + let internalEdges = 0; + + // Count edges within the community + memberIds.forEach(nodeId => { + if (graph.hasNode(nodeId)) { + graph.forEachNeighbor(nodeId, neighbor => { + if (memberSet.has(neighbor)) { + internalEdges++; + } + }); + } + }); + + // Each edge is counted twice (once from each end), so divide by 2 + internalEdges = internalEdges / 2; + + // Maximum possible internal edges for n nodes: n*(n-1)/2 + const maxPossibleEdges = (memberIds.length * (memberIds.length - 1)) / 2; + + if (maxPossibleEdges === 0) return 1.0; + + return Math.min(1.0, internalEdges / maxPossibleEdges); +}; diff --git a/gitnexus-cli/src/core/ingestion/entry-point-scoring.ts b/gitnexus-cli/src/core/ingestion/entry-point-scoring.ts new file mode 100644 index 000000000..55d0b1035 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/entry-point-scoring.ts @@ -0,0 +1,281 @@ +/** + * Entry Point Scoring + * + * Calculates entry point scores for process detection based on: + * 1. Call ratio (existing algorithm - callees / (callers + 1)) + * 2. Export status (exported functions get higher priority) + * 3. Name patterns (functions matching entry point patterns like handle*, on*, *Controller) + * 4. Framework detection (path-based detection for Next.js, Express, Django, etc.) + * + * This module is language-agnostic - language-specific patterns are defined per language. + */ + +import { detectFrameworkFromPath } from './framework-detection.js'; + +// ============================================================================ +// NAME PATTERNS - All 9 supported languages +// ============================================================================ + +/** + * Common entry point naming patterns by language + * These patterns indicate functions that are likely feature entry points + */ +const ENTRY_POINT_PATTERNS: Record = { + // Universal patterns (apply to all languages) + '*': [ + /^(main|init|bootstrap|start|run|setup|configure)$/i, + /^handle[A-Z]/, // handleLogin, handleSubmit + /^on[A-Z]/, // onClick, onSubmit + /Handler$/, // RequestHandler + /Controller$/, // UserController + /^process[A-Z]/, // processPayment + /^execute[A-Z]/, // executeQuery + /^perform[A-Z]/, // performAction + /^dispatch[A-Z]/, // dispatchEvent + /^trigger[A-Z]/, // triggerAction + /^fire[A-Z]/, // fireEvent + /^emit[A-Z]/, // emitEvent + ], + + // JavaScript/TypeScript + 'javascript': [ + /^use[A-Z]/, // React hooks (useEffect, etc.) + ], + 'typescript': [ + /^use[A-Z]/, // React hooks + ], + + // Python + 'python': [ + /^app$/, // Flask/FastAPI app + /^(get|post|put|delete|patch)_/i, // REST conventions + /^api_/, // API functions + /^view_/, // Django views + ], + + // Java + 'java': [ + /^do[A-Z]/, // doGet, doPost (Servlets) + /^create[A-Z]/, // Factory patterns + /^build[A-Z]/, // Builder patterns + /Service$/, // UserService + ], + + // C# + 'csharp': [ + /^(Get|Post|Put|Delete)/, // ASP.NET conventions + /Action$/, // MVC actions + /^On[A-Z]/, // Event handlers + /Async$/, // Async entry points + ], + + // Go + 'go': [ + /Handler$/, // http.Handler pattern + /^Serve/, // ServeHTTP + /^New[A-Z]/, // Constructor pattern (returns new instance) + /^Make[A-Z]/, // Make functions + ], + + // Rust + 'rust': [ + /^(get|post|put|delete)_handler$/i, + /^handle_/, // handle_request + /^new$/, // Constructor pattern + /^run$/, // run entry point + /^spawn/, // Async spawn + ], + + // C - explicit main() boost (critical for C programs) + 'c': [ + /^main$/, // THE entry point + /^init_/, // Initialization functions + /^start_/, // Start functions + /^run_/, // Run functions + ], + + // C++ - same as C plus class patterns + 'cpp': [ + /^main$/, // THE entry point + /^init_/, + /^Create[A-Z]/, // Factory patterns + /^Run$/, // Run methods + /^Start$/, // Start methods + ], +}; + +// ============================================================================ +// UTILITY PATTERNS - Functions that should be penalized +// ============================================================================ + +/** + * Patterns that indicate utility/helper functions (NOT entry points) + * These get penalized in scoring + */ +const UTILITY_PATTERNS: RegExp[] = [ + /^(get|set|is|has|can|should|will|did)[A-Z]/, // Accessors/predicates + /^_/, // Private by convention + /^(format|parse|validate|convert|transform)/i, // Transformation utilities + /^(log|debug|error|warn|info)$/i, // Logging + /^(to|from)[A-Z]/, // Conversions + /^(encode|decode)/i, // Encoding utilities + /^(serialize|deserialize)/i, // Serialization + /^(clone|copy|deep)/i, // Cloning utilities + /^(merge|extend|assign)/i, // Object utilities + /^(filter|map|reduce|sort|find)/i, // Collection utilities (standalone) + /Helper$/, + /Util$/, + /Utils$/, + /^utils?$/i, + /^helpers?$/i, +]; + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface EntryPointScoreResult { + score: number; + reasons: string[]; +} + +// ============================================================================ +// MAIN SCORING FUNCTION +// ============================================================================ + +/** + * Calculate an entry point score for a function/method + * + * Higher scores indicate better entry point candidates. + * Score = baseScore × exportMultiplier × nameMultiplier + * + * @param name - Function/method name + * @param language - Programming language + * @param isExported - Whether the function is exported/public + * @param callerCount - Number of functions that call this function + * @param calleeCount - Number of functions this function calls + * @returns Score and array of reasons explaining the score + */ +export function calculateEntryPointScore( + name: string, + language: string, + isExported: boolean, + callerCount: number, + calleeCount: number, + filePath: string = '' // Optional for backwards compatibility +): EntryPointScoreResult { + const reasons: string[] = []; + + // Must have outgoing calls to be an entry point (we need to trace forward) + if (calleeCount === 0) { + return { score: 0, reasons: ['no-outgoing-calls'] }; + } + + // Base score: call ratio (existing algorithm) + // High ratio = calls many, called by few = likely entry point + const baseScore = calleeCount / (callerCount + 1); + reasons.push(`base:${baseScore.toFixed(2)}`); + + // Export bonus: exported/public functions are more likely entry points + const exportMultiplier = isExported ? 2.0 : 1.0; + if (isExported) { + reasons.push('exported'); + } + + // Name pattern scoring + let nameMultiplier = 1.0; + + // Check negative patterns first (utilities get penalized) + if (UTILITY_PATTERNS.some(p => p.test(name))) { + nameMultiplier = 0.3; // Significant penalty + reasons.push('utility-pattern'); + } else { + // Check positive patterns + const universalPatterns = ENTRY_POINT_PATTERNS['*'] || []; + const langPatterns = ENTRY_POINT_PATTERNS[language] || []; + const allPatterns = [...universalPatterns, ...langPatterns]; + + if (allPatterns.some(p => p.test(name))) { + nameMultiplier = 1.5; // Bonus for matching entry point pattern + reasons.push('entry-pattern'); + } + } + + // Framework detection bonus (Phase 2) + let frameworkMultiplier = 1.0; + if (filePath) { + const frameworkHint = detectFrameworkFromPath(filePath); + if (frameworkHint) { + frameworkMultiplier = frameworkHint.entryPointMultiplier; + reasons.push(`framework:${frameworkHint.reason}`); + } + } + + // Calculate final score + const finalScore = baseScore * exportMultiplier * nameMultiplier * frameworkMultiplier; + + return { + score: finalScore, + reasons, + }; +} + +// ============================================================================ +// HELPER FUNCTIONS +// ============================================================================ + +/** + * Check if a file path is a test file (should be excluded from entry points) + * Covers common test file patterns across all supported languages + */ +export function isTestFile(filePath: string): boolean { + const p = filePath.toLowerCase().replace(/\\/g, '/'); + + return ( + // JavaScript/TypeScript test patterns + p.includes('.test.') || + p.includes('.spec.') || + p.includes('__tests__/') || + p.includes('__mocks__/') || + // Generic test folders + p.includes('/test/') || + p.includes('/tests/') || + p.includes('/testing/') || + // Python test patterns + p.endsWith('_test.py') || + p.includes('/test_') || + // Go test patterns + p.endsWith('_test.go') || + // Java test patterns + p.includes('/src/test/') || + // Rust test patterns (inline tests are different, but test files) + p.includes('/tests/') || + // C# test patterns + p.includes('.tests/') || + p.includes('tests.cs') + ); +} + +/** + * Check if a file path is likely a utility/helper file + * These might still have entry points but should be lower priority + */ +export function isUtilityFile(filePath: string): boolean { + const p = filePath.toLowerCase().replace(/\\/g, '/'); + + return ( + p.includes('/utils/') || + p.includes('/util/') || + p.includes('/helpers/') || + p.includes('/helper/') || + p.includes('/common/') || + p.includes('/shared/') || + p.includes('/lib/') || + p.endsWith('/utils.ts') || + p.endsWith('/utils.js') || + p.endsWith('/helpers.ts') || + p.endsWith('/helpers.js') || + p.endsWith('_utils.py') || + p.endsWith('_helpers.py') + ); +} diff --git a/gitnexus-cli/src/core/ingestion/filesystem-walker.ts b/gitnexus-cli/src/core/ingestion/filesystem-walker.ts new file mode 100644 index 000000000..70712d8e0 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/filesystem-walker.ts @@ -0,0 +1,40 @@ +import fs from 'fs/promises'; +import path from 'path'; +import { glob } from 'glob'; +import { shouldIgnorePath } from '../../config/ignore-service.js'; + +export interface FileEntry { + path: string; + content: string; +} + +export const walkRepository = async ( + repoPath: string, + onProgress?: (current: number, total: number, filePath: string) => void +): Promise => { + const files = await glob('**/*', { + cwd: repoPath, + nodir: true, + dot: false, + }); + + const filtered = files.filter(file => !shouldIgnorePath(file)); + const entries: FileEntry[] = []; + + for (let i = 0; i < filtered.length; i++) { + const relativePath = filtered[i]; + const fullPath = path.join(repoPath, relativePath); + try { + const content = await fs.readFile(fullPath, 'utf-8'); + entries.push({ path: relativePath.replace(/\\/g, '/'), content }); + onProgress?.(i + 1, filtered.length, relativePath); + } catch { + onProgress?.(i + 1, filtered.length, relativePath); + } + } + + return entries; +}; + + + diff --git a/gitnexus-cli/src/core/ingestion/framework-detection.ts b/gitnexus-cli/src/core/ingestion/framework-detection.ts new file mode 100644 index 000000000..d3c75ab87 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/framework-detection.ts @@ -0,0 +1,243 @@ +/** + * Framework Detection + * + * Detects frameworks from file path patterns and provides entry point multipliers. + * This enables framework-aware entry point scoring. + * + * DESIGN: Returns null for unknown frameworks, which causes a 1.0 multiplier + * (no bonus, no penalty) - same behavior as before this feature. + */ + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface FrameworkHint { + framework: string; + entryPointMultiplier: number; + reason: string; +} + +// ============================================================================ +// PATH-BASED FRAMEWORK DETECTION +// ============================================================================ + +/** + * Detect framework from file path patterns + * + * This provides entry point multipliers based on well-known framework conventions. + * Returns null if no framework pattern is detected (falls back to 1.0 multiplier). + */ +export function detectFrameworkFromPath(filePath: string): FrameworkHint | null { + // Normalize path separators and ensure leading slash for consistent matching + let p = filePath.toLowerCase().replace(/\\/g, '/'); + if (!p.startsWith('/')) { + p = '/' + p; // Add leading slash so patterns like '/app/' match 'app/...' + } + + // ========== JAVASCRIPT / TYPESCRIPT FRAMEWORKS ========== + + // Next.js - Pages Router (high confidence) + if (p.includes('/pages/') && !p.includes('/_') && !p.includes('/api/')) { + if (p.endsWith('.tsx') || p.endsWith('.ts') || p.endsWith('.jsx') || p.endsWith('.js')) { + return { framework: 'nextjs-pages', entryPointMultiplier: 3.0, reason: 'nextjs-page' }; + } + } + + // Next.js - App Router (page.tsx files) + if (p.includes('/app/') && ( + p.endsWith('page.tsx') || p.endsWith('page.ts') || + p.endsWith('page.jsx') || p.endsWith('page.js') + )) { + return { framework: 'nextjs-app', entryPointMultiplier: 3.0, reason: 'nextjs-app-page' }; + } + + // Next.js - API Routes + if (p.includes('/pages/api/') || (p.includes('/app/') && p.includes('/api/') && p.endsWith('route.ts'))) { + return { framework: 'nextjs-api', entryPointMultiplier: 3.0, reason: 'nextjs-api-route' }; + } + + // Next.js - Layout files (moderate - they're entry-ish but not the main entry) + if (p.includes('/app/') && (p.endsWith('layout.tsx') || p.endsWith('layout.ts'))) { + return { framework: 'nextjs-app', entryPointMultiplier: 2.0, reason: 'nextjs-layout' }; + } + + // Express / Node.js routes + if (p.includes('/routes/') && (p.endsWith('.ts') || p.endsWith('.js'))) { + return { framework: 'express', entryPointMultiplier: 2.5, reason: 'routes-folder' }; + } + + // Generic controllers (MVC pattern) + if (p.includes('/controllers/') && (p.endsWith('.ts') || p.endsWith('.js'))) { + return { framework: 'mvc', entryPointMultiplier: 2.5, reason: 'controllers-folder' }; + } + + // Generic handlers + if (p.includes('/handlers/') && (p.endsWith('.ts') || p.endsWith('.js'))) { + return { framework: 'handlers', entryPointMultiplier: 2.5, reason: 'handlers-folder' }; + } + + // React components (lower priority - not all are entry points) + if ((p.includes('/components/') || p.includes('/views/')) && + (p.endsWith('.tsx') || p.endsWith('.jsx'))) { + // Only boost if PascalCase filename (likely a component, not util) + const fileName = p.split('/').pop() || ''; + if (/^[A-Z]/.test(fileName)) { + return { framework: 'react', entryPointMultiplier: 1.5, reason: 'react-component' }; + } + } + + // ========== PYTHON FRAMEWORKS ========== + + // Django views (high confidence) + if (p.endsWith('views.py')) { + return { framework: 'django', entryPointMultiplier: 3.0, reason: 'django-views' }; + } + + // Django URL configs + if (p.endsWith('urls.py')) { + return { framework: 'django', entryPointMultiplier: 2.0, reason: 'django-urls' }; + } + + // FastAPI / Flask routers + if ((p.includes('/routers/') || p.includes('/endpoints/') || p.includes('/routes/')) && + p.endsWith('.py')) { + return { framework: 'fastapi', entryPointMultiplier: 2.5, reason: 'api-routers' }; + } + + // Python API folder + if (p.includes('/api/') && p.endsWith('.py') && !p.endsWith('__init__.py')) { + return { framework: 'python-api', entryPointMultiplier: 2.0, reason: 'api-folder' }; + } + + // ========== JAVA FRAMEWORKS ========== + + // Spring Boot controllers + if ((p.includes('/controller/') || p.includes('/controllers/')) && p.endsWith('.java')) { + return { framework: 'spring', entryPointMultiplier: 3.0, reason: 'spring-controller' }; + } + + // Spring Boot - files ending in Controller.java + if (p.endsWith('controller.java')) { + return { framework: 'spring', entryPointMultiplier: 3.0, reason: 'spring-controller-file' }; + } + + // Java service layer (often entry points for business logic) + if ((p.includes('/service/') || p.includes('/services/')) && p.endsWith('.java')) { + return { framework: 'java-service', entryPointMultiplier: 1.8, reason: 'java-service' }; + } + + // ========== C# / .NET FRAMEWORKS ========== + + // ASP.NET Controllers + if (p.includes('/controllers/') && p.endsWith('.cs')) { + return { framework: 'aspnet', entryPointMultiplier: 3.0, reason: 'aspnet-controller' }; + } + + // ASP.NET - files ending in Controller.cs + if (p.endsWith('controller.cs')) { + return { framework: 'aspnet', entryPointMultiplier: 3.0, reason: 'aspnet-controller-file' }; + } + + // Blazor pages + if (p.includes('/pages/') && p.endsWith('.razor')) { + return { framework: 'blazor', entryPointMultiplier: 2.5, reason: 'blazor-page' }; + } + + // ========== GO FRAMEWORKS ========== + + // Go handlers + if ((p.includes('/handlers/') || p.includes('/handler/')) && p.endsWith('.go')) { + return { framework: 'go-http', entryPointMultiplier: 2.5, reason: 'go-handlers' }; + } + + // Go routes + if (p.includes('/routes/') && p.endsWith('.go')) { + return { framework: 'go-http', entryPointMultiplier: 2.5, reason: 'go-routes' }; + } + + // Go controllers + if (p.includes('/controllers/') && p.endsWith('.go')) { + return { framework: 'go-mvc', entryPointMultiplier: 2.5, reason: 'go-controller' }; + } + + // Go main.go files (THE entry point) + if (p.endsWith('/main.go') || p.endsWith('/cmd/') && p.endsWith('.go')) { + return { framework: 'go', entryPointMultiplier: 3.0, reason: 'go-main' }; + } + + // ========== RUST FRAMEWORKS ========== + + // Rust handlers/routes + if ((p.includes('/handlers/') || p.includes('/routes/')) && p.endsWith('.rs')) { + return { framework: 'rust-web', entryPointMultiplier: 2.5, reason: 'rust-handlers' }; + } + + // Rust main.rs (THE entry point) + if (p.endsWith('/main.rs')) { + return { framework: 'rust', entryPointMultiplier: 3.0, reason: 'rust-main' }; + } + + // Rust bin folder (executables) + if (p.includes('/bin/') && p.endsWith('.rs')) { + return { framework: 'rust', entryPointMultiplier: 2.5, reason: 'rust-bin' }; + } + + // ========== C / C++ ========== + + // C/C++ main files + if (p.endsWith('/main.c') || p.endsWith('/main.cpp') || p.endsWith('/main.cc')) { + return { framework: 'c-cpp', entryPointMultiplier: 3.0, reason: 'c-main' }; + } + + // C/C++ src folder entry points (if named specifically) + if ((p.includes('/src/') && (p.endsWith('/app.c') || p.endsWith('/app.cpp')))) { + return { framework: 'c-cpp', entryPointMultiplier: 2.5, reason: 'c-app' }; + } + + // ========== GENERIC PATTERNS ========== + + // Any language: index files in API folders + if (p.includes('/api/') && ( + p.endsWith('/index.ts') || p.endsWith('/index.js') || + p.endsWith('/__init__.py') + )) { + return { framework: 'api', entryPointMultiplier: 1.8, reason: 'api-index' }; + } + + // No framework detected - return null for graceful fallback (1.0 multiplier) + return null; +} + +// ============================================================================ +// FUTURE: AST-BASED PATTERNS (for Phase 3) +// ============================================================================ + +/** + * Patterns that indicate entry points within code (for future AST-based detection) + * These would require parsing decorators/annotations in the code itself. + */ +export const FRAMEWORK_AST_PATTERNS = { + // JavaScript/TypeScript decorators + 'nestjs': ['@Controller', '@Get', '@Post', '@Put', '@Delete', '@Patch'], + 'express': ['app.get', 'app.post', 'app.put', 'app.delete', 'router.get', 'router.post'], + + // Python decorators + 'fastapi': ['@app.get', '@app.post', '@app.put', '@app.delete', '@router.get'], + 'flask': ['@app.route', '@blueprint.route'], + + // Java annotations + 'spring': ['@RestController', '@Controller', '@GetMapping', '@PostMapping', '@RequestMapping'], + 'jaxrs': ['@Path', '@GET', '@POST', '@PUT', '@DELETE'], + + // C# attributes + 'aspnet': ['[ApiController]', '[HttpGet]', '[HttpPost]', '[Route]'], + + // Go patterns (function signatures) + 'go-http': ['http.Handler', 'http.HandlerFunc', 'ServeHTTP'], + + // Rust macros + 'actix': ['#[get', '#[post', '#[put', '#[delete'], + 'axum': ['Router::new'], + 'rocket': ['#[get', '#[post'], +}; diff --git a/gitnexus-cli/src/core/ingestion/heritage-processor.ts b/gitnexus-cli/src/core/ingestion/heritage-processor.ts new file mode 100644 index 000000000..f0143a77d --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/heritage-processor.ts @@ -0,0 +1,162 @@ +/** + * Heritage Processor + * + * Extracts class inheritance relationships: + * - EXTENDS: Class extends another Class (TS, JS, Python) + * - IMPLEMENTS: Class implements an Interface (TS only) + */ + +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import { SymbolTable } from './symbol-table.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; + +export const processHeritage = async ( + graph: KnowledgeGraph, + files: { path: string; content: string }[], + astCache: ASTCache, + symbolTable: SymbolTable, + onProgress?: (current: number, total: number) => void +) => { + const parser = await loadParser(); + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + onProgress?.(i + 1, files.length); + + // 1. Check language support + const language = getLanguageFromFilename(file.path); + if (!language) continue; + + const queryStr = LANGUAGE_QUERIES[language]; + if (!queryStr) continue; + + // 2. Load the language + await loadLanguage(language, file.path); + + // 3. Get AST + let tree = astCache.get(file.path); + let wasReparsed = false; + + if (!tree) { + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } + wasReparsed = true; + } + + let query; + let matches; + try { + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); + matches = query.matches(tree.rootNode); + } catch (queryError) { + console.warn(`Heritage query error for ${file.path}:`, queryError); + if (wasReparsed) (tree as any).delete?.(); + continue; + } + + // 4. Process heritage matches + matches.forEach(match => { + const captureMap: Record = {}; + match.captures.forEach(c => { + captureMap[c.name] = c.node; + }); + + // EXTENDS: Class extends another Class + if (captureMap['heritage.class'] && captureMap['heritage.extends']) { + const className = captureMap['heritage.class'].text; + const parentClassName = captureMap['heritage.extends'].text; + + // Resolve both class IDs + const childId = symbolTable.lookupExact(file.path, className) || + symbolTable.lookupFuzzy(className)[0]?.nodeId || + generateId('Class', `${file.path}:${className}`); + + const parentId = symbolTable.lookupFuzzy(parentClassName)[0]?.nodeId || + generateId('Class', `${parentClassName}`); + + if (childId && parentId && childId !== parentId) { + const relId = generateId('EXTENDS', `${childId}->${parentId}`); + + graph.addRelationship({ + id: relId, + sourceId: childId, + targetId: parentId, + type: 'EXTENDS', + confidence: 1.0, + reason: '', + }); + } + } + + // IMPLEMENTS: Class implements Interface (TypeScript only) + if (captureMap['heritage.class'] && captureMap['heritage.implements']) { + const className = captureMap['heritage.class'].text; + const interfaceName = captureMap['heritage.implements'].text; + + // Resolve class and interface IDs + const classId = symbolTable.lookupExact(file.path, className) || + symbolTable.lookupFuzzy(className)[0]?.nodeId || + generateId('Class', `${file.path}:${className}`); + + const interfaceId = symbolTable.lookupFuzzy(interfaceName)[0]?.nodeId || + generateId('Interface', `${interfaceName}`); + + if (classId && interfaceId) { + const relId = generateId('IMPLEMENTS', `${classId}->${interfaceId}`); + + graph.addRelationship({ + id: relId, + sourceId: classId, + targetId: interfaceId, + type: 'IMPLEMENTS', + confidence: 1.0, + reason: '', + }); + } + } + + // IMPLEMENTS (Rust): impl Trait for Struct + if (captureMap['heritage.trait'] && captureMap['heritage.class']) { + const structName = captureMap['heritage.class'].text; + const traitName = captureMap['heritage.trait'].text; + + // Resolve struct and trait IDs + const structId = symbolTable.lookupExact(file.path, structName) || + symbolTable.lookupFuzzy(structName)[0]?.nodeId || + generateId('Struct', `${file.path}:${structName}`); + + const traitId = symbolTable.lookupFuzzy(traitName)[0]?.nodeId || + generateId('Trait', `${traitName}`); + + if (structId && traitId) { + const relId = generateId('IMPLEMENTS', `${structId}->${traitId}`); + + graph.addRelationship({ + id: relId, + sourceId: structId, + targetId: traitId, + type: 'IMPLEMENTS', + confidence: 1.0, + reason: 'trait-impl', + }); + } + } + }); + + // Cleanup + if (wasReparsed) { + (tree as any).delete?.(); + } + } +}; diff --git a/gitnexus-cli/src/core/ingestion/import-processor.ts b/gitnexus-cli/src/core/ingestion/import-processor.ts new file mode 100644 index 000000000..aeac2162f --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/import-processor.ts @@ -0,0 +1,246 @@ +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; + +const isDev = process.env.NODE_ENV !== 'production'; + +// Type: Map> +// Stores all files that a given file imports from +export type ImportMap = Map>; + +export const createImportMap = (): ImportMap => new Map(); + +// Helper: Resolve import paths (relative and absolute/package-style) +const resolveImportPath = ( + currentFile: string, + importPath: string, + allFiles: Set, + allFileList: string[], + resolveCache: Map +): string | null => { + const cacheKey = `${currentFile}::${importPath}`; + if (resolveCache.has(cacheKey)) return resolveCache.get(cacheKey) ?? null; + + // 1. Resolve '..' and '.' for relative imports + const currentDir = currentFile.split('/').slice(0, -1); + const parts = importPath.split('/'); + + for (const part of parts) { + if (part === '.') continue; + if (part === '..') { + currentDir.pop(); + } else { + currentDir.push(part); + } + } + + const basePath = currentDir.join('/'); + + // 2. Try extensions for all supported languages + const extensions = [ + '', + // TypeScript/JavaScript + '.tsx', '.ts', '.jsx', '.js', '/index.tsx', '/index.ts', '/index.jsx', '/index.js', + // Python + '.py', '/__init__.py', + // Java + '.java', + // C/C++ + '.c', '.h', '.cpp', '.hpp', '.cc', '.cxx', '.hxx', '.hh', + // C# + '.cs', + // Go + '.go', + // Rust + '.rs', '/mod.rs' + ]; + + if (importPath.startsWith('.')) { + for (const ext of extensions) { + const candidate = basePath + ext; + if (allFiles.has(candidate)) { + resolveCache.set(cacheKey, candidate); + return candidate; + } + } + resolveCache.set(cacheKey, null); + return null; + } + + // 3. Handle absolute/package imports (Java, Go, Python, etc.) + if (importPath.endsWith('.*')) { + resolveCache.set(cacheKey, null); + return null; + } + + const pathLike = importPath.includes('/') + ? importPath + : importPath.replace(/\./g, '/'); + const pathParts = pathLike.split('/').filter(Boolean); + + // Normalize all file paths to forward slashes for matching + const normalizedFileList = allFileList.map(p => p.replace(/\\/g, '/')); + + for (let i = 0; i < pathParts.length; i++) { + const suffix = pathParts.slice(i).join('/'); + for (const ext of extensions) { + const suffixWithExt = suffix + ext; + // Require path separator before match to avoid false positives like "View.java" matching "RootView.java" + const suffixPattern = '/' + suffixWithExt; + const matchIdx = normalizedFileList.findIndex(filePath => + filePath.endsWith(suffixPattern) || filePath.toLowerCase().endsWith(suffixPattern.toLowerCase()) + ); + if (matchIdx !== -1) { + const match = allFileList[matchIdx]; + resolveCache.set(cacheKey, match); + return match; + } + } + } + + // Unresolved imports (external packages, SDK imports) are expected - don't log + resolveCache.set(cacheKey, null); + return null; +}; + +export const processImports = async ( + graph: KnowledgeGraph, + files: { path: string; content: string }[], + astCache: ASTCache, + importMap: ImportMap, + onProgress?: (current: number, total: number) => void +) => { + // Create a Set of all file paths for fast lookup during resolution + const allFilePaths = new Set(files.map(f => f.path)); + const parser = await loadParser(); + const resolveCache = new Map(); + const allFileList = files.map(f => f.path); + + // Track import statistics + let totalImportsFound = 0; + let totalImportsResolved = 0; + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + onProgress?.(i + 1, files.length); + + // 1. Check language support first + const language = getLanguageFromFilename(file.path); + if (!language) continue; + + const queryStr = LANGUAGE_QUERIES[language]; + if (!queryStr) continue; + + // 2. ALWAYS load the language before querying (parser is stateful) + await loadLanguage(language, file.path); + + // 3. Get AST (Try Cache First) + let tree = astCache.get(file.path); + let wasReparsed = false; + + if (!tree) { + // Cache Miss: Re-parse (slower, but necessary if evicted) + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } + wasReparsed = true; + } + + let query; + let matches; + try { + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); + matches = query.matches(tree.rootNode); + + // Removed verbose Java import logging + } catch (queryError: any) { + // Detailed debug logging for query failures + console.group(`🔴 Query Error: ${file.path}`); + console.log('Language:', language); + console.log('Query (first 200 chars):', queryStr.substring(0, 200) + '...'); + console.log('Error:', queryError?.message || queryError); + console.log('File content (first 300 chars):', file.content.substring(0, 300)); + console.log('AST root type:', tree.rootNode?.type); + console.log('AST has errors:', tree.rootNode?.hasError); + console.groupEnd(); + + if (wasReparsed) (tree as any).delete?.(); + continue; + } + + matches.forEach(match => { + const captureMap: Record = {}; + match.captures.forEach(c => captureMap[c.name] = c.node); + + if (captureMap['import']) { + const sourceNode = captureMap['import.source']; + if (!sourceNode) { + if (isDev) { + console.log(`⚠️ Import captured but no source node in ${file.path}`); + } + return; + } + + // Clean path (remove quotes) + const rawImportPath = sourceNode.text.replace(/['"]/g, ''); + totalImportsFound++; + + // Removed verbose per-import logging + + // Resolve to actual file in the system + const resolvedPath = resolveImportPath( + file.path, + rawImportPath, + allFilePaths, + allFileList, + resolveCache + ); + + if (resolvedPath) { + // A. Update Graph (File -> IMPORTS -> File) + const sourceId = generateId('File', file.path); + const targetId = generateId('File', resolvedPath); + const relId = generateId('IMPORTS', `${file.path}->${resolvedPath}`); + + totalImportsResolved++; + + graph.addRelationship({ + id: relId, + sourceId, + targetId, + type: 'IMPORTS', + confidence: 1.0, + reason: '', + }); + + // B. Update Import Map (For Pass 4) + // Store all resolved import paths for this file + if (!importMap.has(file.path)) { + importMap.set(file.path, new Set()); + } + importMap.get(file.path)!.add(resolvedPath); + } + } + }); + + // If re-parsed just for this, delete the tree to save memory + if (wasReparsed) { + (tree as any).delete?.(); + } + } + + if (isDev) { + console.log(`📊 Import processing complete: ${totalImportsResolved}/${totalImportsFound} imports resolved to graph edges`); + } +}; + + diff --git a/gitnexus-cli/src/core/ingestion/parsing-processor.ts b/gitnexus-cli/src/core/ingestion/parsing-processor.ts new file mode 100644 index 000000000..cca7098ea --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/parsing-processor.ts @@ -0,0 +1,266 @@ +import { KnowledgeGraph, GraphNode, GraphRelationship } from '../graph/types.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { SymbolTable } from './symbol-table.js'; +import { ASTCache } from './ast-cache.js'; +import { getLanguageFromFilename } from './utils.js'; + +export type FileProgressCallback = (current: number, total: number, filePath: string) => void; + +// ============================================================================ +// EXPORT DETECTION - Language-specific visibility detection +// ============================================================================ + +/** + * Check if a symbol (function, class, etc.) is exported/public + * Handles all 9 supported languages with explicit logic + * + * @param node - The AST node for the symbol name + * @param name - The symbol name + * @param language - The programming language + * @returns true if the symbol is exported/public + */ +const isNodeExported = (node: any, name: string, language: string): boolean => { + let current = node; + + switch (language) { + // JavaScript/TypeScript: Check for export keyword in ancestors + case 'javascript': + case 'typescript': + while (current) { + const type = current.type; + if (type === 'export_statement' || + type === 'export_specifier' || + type === 'lexical_declaration' && current.parent?.type === 'export_statement') { + return true; + } + // Also check if text starts with 'export ' + if (current.text?.startsWith('export ')) { + return true; + } + current = current.parent; + } + return false; + + // Python: Public if no leading underscore (convention) + case 'python': + return !name.startsWith('_'); + + // Java: Check for 'public' modifier + // In tree-sitter Java, modifiers are siblings of the name node, not parents + case 'java': + while (current) { + // Check if this node or any sibling is a 'modifiers' node containing 'public' + if (current.parent) { + const parent = current.parent; + // Check all children of the parent for modifiers + for (let i = 0; i < parent.childCount; i++) { + const child = parent.child(i); + if (child?.type === 'modifiers' && child.text?.includes('public')) { + return true; + } + } + // Also check if the parent's text starts with 'public' (fallback) + if (parent.type === 'method_declaration' || parent.type === 'constructor_declaration') { + if (parent.text?.trimStart().startsWith('public')) { + return true; + } + } + } + current = current.parent; + } + return false; + + // C#: Check for 'public' modifier in ancestors + case 'csharp': + while (current) { + if (current.type === 'modifier' || current.type === 'modifiers') { + if (current.text?.includes('public')) return true; + } + current = current.parent; + } + return false; + + // Go: Uppercase first letter = exported + case 'go': + if (name.length === 0) return false; + const first = name[0]; + // Must be uppercase letter (not a number or symbol) + return first === first.toUpperCase() && first !== first.toLowerCase(); + + // Rust: Check for 'pub' visibility modifier + case 'rust': + while (current) { + if (current.type === 'visibility_modifier') { + if (current.text?.includes('pub')) return true; + } + current = current.parent; + } + return false; + + // C/C++: No native export concept at language level + // Entry points will be detected via name patterns (main, etc.) + case 'c': + case 'cpp': + return false; + + default: + return false; + } +}; + +export const processParsing = async ( + graph: KnowledgeGraph, + files: { path: string; content: string }[], + symbolTable: SymbolTable, + astCache: ASTCache, + onFileProgress?: FileProgressCallback +) => { + + const parser = await loadParser(); + const total = files.length; + + for (let i = 0; i < files.length; i++) { + const file = files[i]; + + // Report progress for each file + onFileProgress?.(i + 1, total, file.path); + + const language = getLanguageFromFilename(file.path); + + if (!language) continue; + + await loadLanguage(language, file.path); + + // 3. Parse the text content into an AST + // Use larger bufferSize for files > 32KB (default limit) + let tree; + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed (binary, encoding issues, etc.) + console.warn(`Skipping unparseable file: ${file.path}`); + continue; + } + + // Store in cache immediately (this might evict an old one) + astCache.set(file.path, tree); + + // 4. Get the specific query string for this language + const queryString = LANGUAGE_QUERIES[language]; + if (!queryString) { + continue; + } + + // 5. Run the query against the AST root node + // This looks for patterns like (function_declaration) + let query; + let matches; + try { + const language = parser.getLanguage(); + query = new Parser.Query(language, queryString); + matches = query.matches(tree.rootNode); + } catch (queryError) { + console.warn(`Query error for ${file.path}:`, queryError); + continue; + } + + // 6. Process every match found + matches.forEach(match => { + const captureMap: Record = {}; + + match.captures.forEach(c => { + captureMap[c.name] = c.node; + }); + + // Skip imports here - they are handled by import-processor.ts + // which creates proper File -> IMPORTS -> File relationships + if (captureMap['import']) { + return; + } + + // Skip call expressions - they are handled by call-processor.ts + if (captureMap['call']) { + return; + } + + const nameNode = captureMap['name']; + if (!nameNode) return; + + const nodeName = nameNode.text; + + let nodeLabel = 'CodeElement'; + + // Core types + if (captureMap['definition.function']) nodeLabel = 'Function'; + else if (captureMap['definition.class']) nodeLabel = 'Class'; + else if (captureMap['definition.interface']) nodeLabel = 'Interface'; + else if (captureMap['definition.method']) nodeLabel = 'Method'; + // Struct types (C, C++, Go, Rust, C#) + else if (captureMap['definition.struct']) nodeLabel = 'Struct'; + // Enum types + else if (captureMap['definition.enum']) nodeLabel = 'Enum'; + // Namespace/Module (C++, C#, Rust) + else if (captureMap['definition.namespace']) nodeLabel = 'Namespace'; + else if (captureMap['definition.module']) nodeLabel = 'Module'; + // Rust-specific + else if (captureMap['definition.trait']) nodeLabel = 'Trait'; + else if (captureMap['definition.impl']) nodeLabel = 'Impl'; + else if (captureMap['definition.type']) nodeLabel = 'TypeAlias'; + else if (captureMap['definition.const']) nodeLabel = 'Const'; + else if (captureMap['definition.static']) nodeLabel = 'Static'; + // C-specific + else if (captureMap['definition.typedef']) nodeLabel = 'Typedef'; + else if (captureMap['definition.macro']) nodeLabel = 'Macro'; + else if (captureMap['definition.union']) nodeLabel = 'Union'; + // C#-specific + else if (captureMap['definition.property']) nodeLabel = 'Property'; + else if (captureMap['definition.record']) nodeLabel = 'Record'; + else if (captureMap['definition.delegate']) nodeLabel = 'Delegate'; + // Java-specific + else if (captureMap['definition.annotation']) nodeLabel = 'Annotation'; + else if (captureMap['definition.constructor']) nodeLabel = 'Constructor'; + // C++ template + else if (captureMap['definition.template']) nodeLabel = 'Template'; + + const nodeId = generateId(nodeLabel, `${file.path}:${nodeName}`); + + const node: GraphNode = { + id: nodeId, + label: nodeLabel as any, + properties: { + name: nodeName, + filePath: file.path, + startLine: nameNode.startPosition.row, + endLine: nameNode.endPosition.row, + language: language, + isExported: isNodeExported(nameNode, nodeName, language), + } + }; + + graph.addNode(node); + + // Register in Symbol Table (only definitions, not imports) + symbolTable.add(file.path, nodeName, nodeId, nodeLabel); + + const fileId = generateId('File', file.path); + + const relId = generateId('DEFINES', `${fileId}->${nodeId}`); + + const relationship: GraphRelationship = { + id: relId, + sourceId: fileId, + targetId: nodeId, + type: 'DEFINES', + confidence: 1.0, + reason: '', + }; + + graph.addRelationship(relationship); + }); + + // Don't delete tree here - LRU cache handles cleanup when evicted + } +}; diff --git a/gitnexus-cli/src/core/ingestion/pipeline.ts b/gitnexus-cli/src/core/ingestion/pipeline.ts new file mode 100644 index 000000000..45b087db7 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/pipeline.ts @@ -0,0 +1,267 @@ +import { createKnowledgeGraph } from '../graph/graph.js'; +import { processStructure } from './structure-processor.js'; +import { processParsing } from './parsing-processor.js'; +import { processImports, createImportMap } from './import-processor.js'; +import { processCalls } from './call-processor.js'; +import { processHeritage } from './heritage-processor.js'; +import { processCommunities } from './community-processor.js'; +import { processProcesses } from './process-processor.js'; +import { createSymbolTable } from './symbol-table.js'; +import { createASTCache } from './ast-cache.js'; +import { PipelineProgress, PipelineResult } from '../../types/pipeline.js'; +import { walkRepository } from './filesystem-walker.js'; + +const isDev = process.env.NODE_ENV !== 'production'; + +export const runPipelineFromRepo = async ( + repoPath: string, + onProgress: (progress: PipelineProgress) => void +): Promise => { + const graph = createKnowledgeGraph(); + const fileContents = new Map(); + const symbolTable = createSymbolTable(); + const astCache = createASTCache(50); + const importMap = createImportMap(); + + const cleanup = () => { + astCache.clear(); + symbolTable.clear(); + }; + + try { + onProgress({ + phase: 'extracting', + percent: 0, + message: 'Scanning repository...', + }); + + const files = await walkRepository(repoPath, (current, total, filePath) => { + const scanProgress = Math.round((current / total) * 15); + onProgress({ + phase: 'extracting', + percent: scanProgress, + message: 'Scanning repository...', + detail: filePath, + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + files.forEach(f => fileContents.set(f.path, f.content)); + + onProgress({ + phase: 'extracting', + percent: 15, + message: 'Repository scanned successfully', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + onProgress({ + phase: 'structure', + percent: 15, + message: 'Analyzing project structure...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const filePaths = files.map(f => f.path); + processStructure(graph, filePaths); + + onProgress({ + phase: 'structure', + percent: 30, + message: 'Project structure analyzed', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + onProgress({ + phase: 'parsing', + percent: 30, + message: 'Parsing code definitions...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processParsing(graph, files, symbolTable, astCache, (current, total, filePath) => { + const parsingProgress = 30 + ((current / total) * 40); + onProgress({ + phase: 'parsing', + percent: Math.round(parsingProgress), + message: 'Parsing code definitions...', + detail: filePath, + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'imports', + percent: 70, + message: 'Resolving imports...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processImports(graph, files, astCache, importMap, (current, total) => { + const importProgress = 70 + ((current / total) * 12); + onProgress({ + phase: 'imports', + percent: Math.round(importProgress), + message: 'Resolving imports...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + if (isDev) { + const importsCount = graph.relationships.filter(r => r.type === 'IMPORTS').length; + console.log(`📊 Pipeline: After import phase, graph has ${importsCount} IMPORTS relationships (total: ${graph.relationshipCount})`); + } + + onProgress({ + phase: 'calls', + percent: 82, + message: 'Tracing function calls...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processCalls(graph, files, astCache, symbolTable, importMap, (current, total) => { + const callProgress = 82 + ((current / total) * 10); + onProgress({ + phase: 'calls', + percent: Math.round(callProgress), + message: 'Tracing function calls...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'heritage', + percent: 92, + message: 'Extracting class inheritance...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processHeritage(graph, files, astCache, symbolTable, (current, total) => { + const heritageProgress = 88 + ((current / total) * 4); + onProgress({ + phase: 'heritage', + percent: Math.round(heritageProgress), + message: 'Extracting class inheritance...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'communities', + percent: 92, + message: 'Detecting code communities...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const communityResult = await processCommunities(graph, (message, progress) => { + const communityProgress = 92 + (progress * 0.06); + onProgress({ + phase: 'communities', + percent: Math.round(communityProgress), + message, + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + }); + + if (isDev) { + console.log(`🏘️ Community detection: ${communityResult.stats.totalCommunities} communities found (modularity: ${communityResult.stats.modularity.toFixed(3)})`); + } + + communityResult.communities.forEach(comm => { + graph.addNode({ + id: comm.id, + label: 'Community' as const, + properties: { + name: comm.label, + filePath: '', + heuristicLabel: comm.heuristicLabel, + cohesion: comm.cohesion, + symbolCount: comm.symbolCount, + } + }); + }); + + communityResult.memberships.forEach(membership => { + graph.addRelationship({ + id: `${membership.nodeId}_member_of_${membership.communityId}`, + type: 'MEMBER_OF', + sourceId: membership.nodeId, + targetId: membership.communityId, + confidence: 1.0, + reason: 'leiden-algorithm', + }); + }); + + onProgress({ + phase: 'processes', + percent: 98, + message: 'Detecting execution flows...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const processResult = await processProcesses( + graph, + communityResult.memberships, + (message, progress) => { + const processProgress = 98 + (progress * 0.01); + onProgress({ + phase: 'processes', + percent: Math.round(processProgress), + message, + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + } + ); + + if (isDev) { + console.log(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`); + } + + processResult.processes.forEach(proc => { + graph.addNode({ + id: proc.id, + label: 'Process' as const, + properties: { + name: proc.label, + filePath: '', + heuristicLabel: proc.heuristicLabel, + processType: proc.processType, + stepCount: proc.stepCount, + communities: proc.communities, + entryPointId: proc.entryPointId, + terminalId: proc.terminalId, + } + }); + }); + + processResult.steps.forEach(step => { + graph.addRelationship({ + id: `${step.nodeId}_step_${step.step}_${step.processId}`, + type: 'STEP_IN_PROCESS', + sourceId: step.nodeId, + targetId: step.processId, + confidence: 1.0, + reason: 'trace-detection', + step: step.step, + }); + }); + + onProgress({ + phase: 'complete', + percent: 100, + message: `Graph complete! ${communityResult.stats.totalCommunities} communities, ${processResult.stats.totalProcesses} processes detected.`, + stats: { + filesProcessed: files.length, + totalFiles: files.length, + nodesCreated: graph.nodeCount + }, + }); + + astCache.clear(); + + return { graph, fileContents, communityResult, processResult }; + } catch (error) { + cleanup(); + throw error; + } +}; diff --git a/gitnexus-cli/src/core/ingestion/process-processor.ts b/gitnexus-cli/src/core/ingestion/process-processor.ts new file mode 100644 index 000000000..ccb1bf1cc --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/process-processor.ts @@ -0,0 +1,411 @@ +/** + * Process Detection Processor + * + * Detects execution flows (Processes) in the code graph by: + * 1. Finding entry points (functions with no internal callers) + * 2. Tracing forward via CALLS edges (BFS) + * 3. Grouping and deduplicating similar paths + * 4. Labeling with heuristic names + * + * Processes help agents understand how features work through the codebase. + */ + +import { KnowledgeGraph, GraphNode, GraphRelationship, NodeLabel } from '../graph/types.js'; +import { CommunityMembership } from './community-processor.js'; +import { calculateEntryPointScore, isTestFile } from './entry-point-scoring.js'; + +const isDev = process.env.NODE_ENV !== 'production'; + +// ============================================================================ +// CONFIGURATION +// ============================================================================ + +export interface ProcessDetectionConfig { + maxTraceDepth: number; // Maximum steps to trace (default: 10) + maxBranching: number; // Max branches to follow per node (default: 3) + maxProcesses: number; // Maximum processes to detect (default: 50) + minSteps: number; // Minimum steps for a valid process (default: 2) +} + +const DEFAULT_CONFIG: ProcessDetectionConfig = { + maxTraceDepth: 10, + maxBranching: 4, + maxProcesses: 75, + minSteps: 2, +}; + +// ============================================================================ +// TYPES +// ============================================================================ + +export interface ProcessNode { + id: string; // "proc_handleLogin_createSession" + label: string; // "HandleLogin → CreateSession" + heuristicLabel: string; + processType: 'intra_community' | 'cross_community'; + stepCount: number; + communities: string[]; // Community IDs touched + entryPointId: string; + terminalId: string; + trace: string[]; // Ordered array of node IDs +} + +export interface ProcessStep { + nodeId: string; + processId: string; + step: number; // 1-indexed position in trace +} + +export interface ProcessDetectionResult { + processes: ProcessNode[]; + steps: ProcessStep[]; + stats: { + totalProcesses: number; + crossCommunityCount: number; + avgStepCount: number; + entryPointsFound: number; + }; +} + +// ============================================================================ +// MAIN PROCESSOR +// ============================================================================ + +/** + * Detect processes (execution flows) in the knowledge graph + * + * This runs AFTER community detection, using CALLS edges to trace flows. + */ +export const processProcesses = async ( + knowledgeGraph: KnowledgeGraph, + memberships: CommunityMembership[], + onProgress?: (message: string, progress: number) => void, + config: Partial = {} +): Promise => { + const cfg = { ...DEFAULT_CONFIG, ...config }; + + onProgress?.('Finding entry points...', 0); + + // Build lookup maps + const membershipMap = new Map(); + memberships.forEach(m => membershipMap.set(m.nodeId, m.communityId)); + + const callsEdges = buildCallsGraph(knowledgeGraph); + const reverseCallsEdges = buildReverseCallsGraph(knowledgeGraph); + const nodeMap = new Map(); + knowledgeGraph.nodes.forEach(n => nodeMap.set(n.id, n)); + + // Step 1: Find entry points (functions that call others but have few callers) + const entryPoints = findEntryPoints(knowledgeGraph, reverseCallsEdges, callsEdges); + + onProgress?.(`Found ${entryPoints.length} entry points, tracing flows...`, 20); + + onProgress?.(`Found ${entryPoints.length} entry points, tracing flows...`, 20); + + // Step 2: Trace processes from each entry point + const allTraces: string[][] = []; + + for (let i = 0; i < entryPoints.length && allTraces.length < cfg.maxProcesses * 2; i++) { + const entryId = entryPoints[i]; + const traces = traceFromEntryPoint(entryId, callsEdges, cfg); + + // Filter out traces that are too short + traces.filter(t => t.length >= cfg.minSteps).forEach(t => allTraces.push(t)); + + if (i % 10 === 0) { + onProgress?.(`Tracing entry point ${i + 1}/${entryPoints.length}...`, 20 + (i / entryPoints.length) * 40); + } + } + + onProgress?.(`Found ${allTraces.length} traces, deduplicating...`, 60); + + // Step 3: Deduplicate similar traces + const uniqueTraces = deduplicateTraces(allTraces); + + // Step 4: Limit to max processes (prioritize longer traces) + const limitedTraces = uniqueTraces + .sort((a, b) => b.length - a.length) + .slice(0, cfg.maxProcesses); + + onProgress?.(`Creating ${limitedTraces.length} process nodes...`, 80); + + // Step 5: Create process nodes + const processes: ProcessNode[] = []; + const steps: ProcessStep[] = []; + + limitedTraces.forEach((trace, idx) => { + const entryPointId = trace[0]; + const terminalId = trace[trace.length - 1]; + + // Get communities touched + const communitiesSet = new Set(); + trace.forEach(nodeId => { + const comm = membershipMap.get(nodeId); + if (comm) communitiesSet.add(comm); + }); + const communities = Array.from(communitiesSet); + + // Determine process type + const processType: 'intra_community' | 'cross_community' = + communities.length > 1 ? 'cross_community' : 'intra_community'; + + // Generate label + const entryNode = nodeMap.get(entryPointId); + const terminalNode = nodeMap.get(terminalId); + const entryName = entryNode?.properties.name || 'Unknown'; + const terminalName = terminalNode?.properties.name || 'Unknown'; + const heuristicLabel = `${capitalize(entryName)} → ${capitalize(terminalName)}`; + + const processId = `proc_${idx}_${sanitizeId(entryName)}`; + + processes.push({ + id: processId, + label: heuristicLabel, + heuristicLabel, + processType, + stepCount: trace.length, + communities, + entryPointId, + terminalId, + trace, + }); + + // Create step relationships + trace.forEach((nodeId, stepIdx) => { + steps.push({ + nodeId, + processId, + step: stepIdx + 1, // 1-indexed + }); + }); + }); + + onProgress?.('Process detection complete!', 100); + + // Calculate stats + const crossCommunityCount = processes.filter(p => p.processType === 'cross_community').length; + const avgStepCount = processes.length > 0 + ? processes.reduce((sum, p) => sum + p.stepCount, 0) / processes.length + : 0; + + return { + processes, + steps, + stats: { + totalProcesses: processes.length, + crossCommunityCount, + avgStepCount: Math.round(avgStepCount * 10) / 10, + entryPointsFound: entryPoints.length, + }, + }; +}; + +// ============================================================================ +// HELPER: Build CALLS adjacency list +// ============================================================================ + +type AdjacencyList = Map; + +const buildCallsGraph = (graph: KnowledgeGraph): AdjacencyList => { + const adj = new Map(); + + graph.relationships.forEach(rel => { + if (rel.type === 'CALLS') { + if (!adj.has(rel.sourceId)) { + adj.set(rel.sourceId, []); + } + adj.get(rel.sourceId)!.push(rel.targetId); + } + }); + + return adj; +}; + +const buildReverseCallsGraph = (graph: KnowledgeGraph): AdjacencyList => { + const adj = new Map(); + + graph.relationships.forEach(rel => { + if (rel.type === 'CALLS') { + if (!adj.has(rel.targetId)) { + adj.set(rel.targetId, []); + } + adj.get(rel.targetId)!.push(rel.sourceId); + } + }); + + return adj; +}; + +/** + * Find functions/methods that are good entry points for tracing. + * + * Entry points are scored based on: + * 1. Call ratio (calls many, called by few) + * 2. Export status (exported/public functions rank higher) + * 3. Name patterns (handle*, on*, *Controller, etc.) + * + * Test files are excluded entirely. + */ +const findEntryPoints = ( + graph: KnowledgeGraph, + reverseCallsEdges: AdjacencyList, + callsEdges: AdjacencyList +): string[] => { + const symbolTypes = new Set(['Function', 'Method']); + const entryPointCandidates: { + id: string; + score: number; + reasons: string[]; + }[] = []; + + graph.nodes.forEach(node => { + if (!symbolTypes.has(node.label)) return; + + const filePath = node.properties.filePath || ''; + + // Skip test files entirely + if (isTestFile(filePath)) return; + + const callers = reverseCallsEdges.get(node.id) || []; + const callees = callsEdges.get(node.id) || []; + + // Must have at least 1 outgoing call to trace forward + if (callees.length === 0) return; + + // Calculate entry point score using new scoring system + const { score, reasons } = calculateEntryPointScore( + node.properties.name, + node.properties.language || 'javascript', + node.properties.isExported ?? false, + callers.length, + callees.length, + filePath // Pass filePath for framework detection + ); + + if (score > 0) { + entryPointCandidates.push({ id: node.id, score, reasons }); + } + }); + + // Sort by score descending and return top candidates + const sorted = entryPointCandidates.sort((a, b) => b.score - a.score); + + // DEBUG: Log top candidates with new scoring details + if (sorted.length > 0 && isDev) { + console.log(`[Process] Top 10 entry point candidates (new scoring):`); + sorted.slice(0, 10).forEach((c, i) => { + const node = graph.nodes.find(n => n.id === c.id); + const exported = node?.properties.isExported ? '✓' : '✗'; + const shortPath = node?.properties.filePath?.split('/').slice(-2).join('/') || ''; + console.log(` ${i+1}. ${node?.properties.name} [exported:${exported}] (${shortPath})`); + console.log(` score: ${c.score.toFixed(2)} = [${c.reasons.join(' × ')}]`); + }); + } + + return sorted + .slice(0, 200) // Limit to prevent explosion + .map(c => c.id); +}; + +// ============================================================================ +// HELPER: Trace from entry point (BFS) +// ============================================================================ + +/** + * Trace forward from an entry point using BFS. + * Returns all distinct paths up to maxDepth. + */ +const traceFromEntryPoint = ( + entryId: string, + callsEdges: AdjacencyList, + config: ProcessDetectionConfig +): string[][] => { + const traces: string[][] = []; + + // BFS with path tracking + // Each queue item: [currentNodeId, pathSoFar] + const queue: [string, string[]][] = [[entryId, [entryId]]]; + const visited = new Set(); + + while (queue.length > 0 && traces.length < config.maxBranching * 3) { + const [currentId, path] = queue.shift()!; + + // Get outgoing calls + const callees = callsEdges.get(currentId) || []; + + if (callees.length === 0) { + // Terminal node - this is a complete trace + if (path.length >= config.minSteps) { + traces.push([...path]); + } + } else if (path.length >= config.maxTraceDepth) { + // Max depth reached - save what we have + if (path.length >= config.minSteps) { + traces.push([...path]); + } + } else { + // Continue tracing - limit branching + const limitedCallees = callees.slice(0, config.maxBranching); + let addedBranch = false; + + for (const calleeId of limitedCallees) { + // Avoid cycles + if (!path.includes(calleeId)) { + queue.push([calleeId, [...path, calleeId]]); + addedBranch = true; + } + } + + // If all branches were cycles, save current path as terminal + if (!addedBranch && path.length >= config.minSteps) { + traces.push([...path]); + } + } + } + + return traces; +}; + +// ============================================================================ +// HELPER: Deduplicate traces +// ============================================================================ + +/** + * Merge traces that are subsets of other traces. + * Keep longer traces, remove redundant shorter ones. + */ +const deduplicateTraces = (traces: string[][]): string[][] => { + if (traces.length === 0) return []; + + // Sort by length descending + const sorted = [...traces].sort((a, b) => b.length - a.length); + const unique: string[][] = []; + + for (const trace of sorted) { + // Check if this trace is a subset of any already-added trace + const traceKey = trace.join('->'); + const isSubset = unique.some(existing => { + const existingKey = existing.join('->'); + return existingKey.includes(traceKey); + }); + + if (!isSubset) { + unique.push(trace); + } + } + + return unique; +}; + +// ============================================================================ +// HELPER: String utilities +// ============================================================================ + +const capitalize = (s: string): string => { + if (!s) return s; + return s.charAt(0).toUpperCase() + s.slice(1); +}; + +const sanitizeId = (s: string): string => { + return s.replace(/[^a-zA-Z0-9]/g, '_').substring(0, 20).toLowerCase(); +}; diff --git a/gitnexus-cli/src/core/ingestion/structure-processor.ts b/gitnexus-cli/src/core/ingestion/structure-processor.ts new file mode 100644 index 000000000..de1a53e49 --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/structure-processor.ts @@ -0,0 +1,48 @@ +import { generateId } from "../../lib/utils.js"; +import { KnowledgeGraph, GraphNode, GraphRelationship } from "../graph/types.js"; + +export const processStructure = ( graph: KnowledgeGraph, paths: string[])=>{ + paths.forEach( path => { + const parts = path.split('/') + let currentPath = '' + let parentId = '' + + parts.forEach( (part, index ) => { + const isFile = index === parts.length - 1 + const label = isFile ? 'File' : 'Folder' + + currentPath = currentPath ? `${currentPath}/${part}` : part + + const nodeId=generateId(label, currentPath) + + const node: GraphNode = { + id: nodeId, + label: label, + properties: { + name: part, + filePath: currentPath + } + } + graph.addNode(node) + + if(parentId){ + const relId = generateId('CONTAINS', `${parentId}->${nodeId}`) + + const relationship: GraphRelationship={ + id: relId, + type: 'CONTAINS', + sourceId: parentId, + targetId: nodeId, + confidence: 1.0, + reason: '', + } + + graph.addRelationship(relationship) + } + + parentId = nodeId + + }) + }) +} + diff --git a/gitnexus-cli/src/core/ingestion/symbol-table.ts b/gitnexus-cli/src/core/ingestion/symbol-table.ts new file mode 100644 index 000000000..c8c35d56f --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/symbol-table.ts @@ -0,0 +1,80 @@ +export interface SymbolDefinition { + nodeId: string; + filePath: string; + type: string; // 'Function', 'Class', etc. +} + +export interface SymbolTable { + /** + * Register a new symbol definition + */ + add: (filePath: string, name: string, nodeId: string, type: string) => void; + + /** + * High Confidence: Look for a symbol specifically inside a file + * Returns the Node ID if found + */ + lookupExact: (filePath: string, name: string) => string | undefined; + + /** + * Low Confidence: Look for a symbol anywhere in the project + * Used when imports are missing or for framework magic + */ + lookupFuzzy: (name: string) => SymbolDefinition[]; + + /** + * Debugging: See how many symbols are tracked + */ + getStats: () => { fileCount: number; globalSymbolCount: number }; + + /** + * Cleanup memory + */ + clear: () => void; +} + +export const createSymbolTable = (): SymbolTable => { + // 1. File-Specific Index (The "Good" one) + // Structure: FilePath -> (SymbolName -> NodeID) + const fileIndex = new Map>(); + + // 2. Global Reverse Index (The "Backup") + // Structure: SymbolName -> [List of Definitions] + const globalIndex = new Map(); + + const add = (filePath: string, name: string, nodeId: string, type: string) => { + // A. Add to File Index + if (!fileIndex.has(filePath)) { + fileIndex.set(filePath, new Map()); + } + fileIndex.get(filePath)!.set(name, nodeId); + + // B. Add to Global Index + if (!globalIndex.has(name)) { + globalIndex.set(name, []); + } + globalIndex.get(name)!.push({ nodeId, filePath, type }); + }; + + const lookupExact = (filePath: string, name: string): string | undefined => { + const fileSymbols = fileIndex.get(filePath); + if (!fileSymbols) return undefined; + return fileSymbols.get(name); + }; + + const lookupFuzzy = (name: string): SymbolDefinition[] => { + return globalIndex.get(name) || []; + }; + + const getStats = () => ({ + fileCount: fileIndex.size, + globalSymbolCount: globalIndex.size + }); + + const clear = () => { + fileIndex.clear(); + globalIndex.clear(); + }; + + return { add, lookupExact, lookupFuzzy, getStats, clear }; +}; \ No newline at end of file diff --git a/gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts b/gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts new file mode 100644 index 000000000..f8bcd7add --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts @@ -0,0 +1,331 @@ +import { SupportedLanguages } from '../../config/supported-languages.js'; + +/* + * Tree-sitter queries for extracting code definitions. + * + * Note: Different grammars (typescript vs tsx vs javascript) may have + * slightly different node types. These queries are designed to be + * compatible with the standard tree-sitter grammars. + */ + +// TypeScript queries - works with tree-sitter-typescript +export const TYPESCRIPT_QUERIES = ` +(class_declaration + name: (type_identifier) @name) @definition.class + +(interface_declaration + name: (type_identifier) @name) @definition.interface + +(function_declaration + name: (identifier) @name) @definition.function + +(method_definition + name: (property_identifier) @name) @definition.method + +(lexical_declaration + (variable_declarator + name: (identifier) @name + value: (arrow_function))) @definition.function + +(lexical_declaration + (variable_declarator + name: (identifier) @name + value: (function_expression))) @definition.function + +(export_statement + declaration: (lexical_declaration + (variable_declarator + name: (identifier) @name + value: (arrow_function)))) @definition.function + +(export_statement + declaration: (lexical_declaration + (variable_declarator + name: (identifier) @name + value: (function_expression)))) @definition.function + +(import_statement + source: (string) @import.source) @import + +(call_expression + function: (identifier) @call.name) @call + +(call_expression + function: (member_expression + property: (property_identifier) @call.name)) @call + +; Heritage queries - class extends +(class_declaration + name: (type_identifier) @heritage.class + (class_heritage + (extends_clause + value: (identifier) @heritage.extends))) @heritage + +; Heritage queries - class implements interface +(class_declaration + name: (type_identifier) @heritage.class + (class_heritage + (implements_clause + (type_identifier) @heritage.implements))) @heritage.impl +`; + +// JavaScript queries - works with tree-sitter-javascript +export const JAVASCRIPT_QUERIES = ` +(class_declaration + name: (identifier) @name) @definition.class + +(function_declaration + name: (identifier) @name) @definition.function + +(method_definition + name: (property_identifier) @name) @definition.method + +(lexical_declaration + (variable_declarator + name: (identifier) @name + value: (arrow_function))) @definition.function + +(lexical_declaration + (variable_declarator + name: (identifier) @name + value: (function_expression))) @definition.function + +(export_statement + declaration: (lexical_declaration + (variable_declarator + name: (identifier) @name + value: (arrow_function)))) @definition.function + +(export_statement + declaration: (lexical_declaration + (variable_declarator + name: (identifier) @name + value: (function_expression)))) @definition.function + +(import_statement + source: (string) @import.source) @import + +(call_expression + function: (identifier) @call.name) @call + +(call_expression + function: (member_expression + property: (property_identifier) @call.name)) @call + +; Heritage queries - class extends (JavaScript uses different AST than TypeScript) +; In tree-sitter-javascript, class_heritage directly contains the parent identifier +(class_declaration + name: (identifier) @heritage.class + (class_heritage + (identifier) @heritage.extends)) @heritage +`; + +// Python queries - works with tree-sitter-python +export const PYTHON_QUERIES = ` +(class_definition + name: (identifier) @name) @definition.class + +(function_definition + name: (identifier) @name) @definition.function + +(import_statement + name: (dotted_name) @import.source) @import + +(import_from_statement + module_name: (dotted_name) @import.source) @import + +(call + function: (identifier) @call.name) @call + +(call + function: (attribute + attribute: (identifier) @call.name)) @call + +; Heritage queries - Python class inheritance +(class_definition + name: (identifier) @heritage.class + superclasses: (argument_list + (identifier) @heritage.extends)) @heritage +`; + +// Java queries - works with tree-sitter-java +export const JAVA_QUERIES = ` +; Classes, Interfaces, Enums, Annotations +(class_declaration name: (identifier) @name) @definition.class +(interface_declaration name: (identifier) @name) @definition.interface +(enum_declaration name: (identifier) @name) @definition.enum +(annotation_type_declaration name: (identifier) @name) @definition.annotation + +; Methods & Constructors +(method_declaration name: (identifier) @name) @definition.method +(constructor_declaration name: (identifier) @name) @definition.constructor + +; Imports - capture any import declaration child as source +(import_declaration (_) @import.source) @import + +; Calls +(method_invocation name: (identifier) @call.name) @call +(method_invocation object: (_) name: (identifier) @call.name) @call + +; Heritage - extends class +(class_declaration name: (identifier) @heritage.class + (superclass (type_identifier) @heritage.extends)) @heritage + +; Heritage - implements interfaces +(class_declaration name: (identifier) @heritage.class + (super_interfaces (type_list (type_identifier) @heritage.implements))) @heritage.impl +`; + +// C queries - works with tree-sitter-c +export const C_QUERIES = ` +; Functions +(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function +(declaration declarator: (function_declarator declarator: (identifier) @name)) @definition.function + +; Structs, Unions, Enums, Typedefs +(struct_specifier name: (type_identifier) @name) @definition.struct +(union_specifier name: (type_identifier) @name) @definition.union +(enum_specifier name: (type_identifier) @name) @definition.enum +(type_definition declarator: (type_identifier) @name) @definition.typedef + +; Macros +(preproc_function_def name: (identifier) @name) @definition.macro +(preproc_def name: (identifier) @name) @definition.macro + +; Includes +(preproc_include path: (_) @import.source) @import + +; Calls +(call_expression function: (identifier) @call.name) @call +(call_expression function: (field_expression field: (field_identifier) @call.name)) @call +`; + +// Go queries - works with tree-sitter-go +export const GO_QUERIES = ` +; Functions & Methods +(function_declaration name: (identifier) @name) @definition.function +(method_declaration name: (field_identifier) @name) @definition.method + +; Types +(type_declaration (type_spec name: (type_identifier) @name type: (struct_type))) @definition.struct +(type_declaration (type_spec name: (type_identifier) @name type: (interface_type))) @definition.interface +(type_declaration (type_spec name: (type_identifier) @name)) @definition.type + +; Imports +(import_declaration (import_spec path: (interpreted_string_literal) @import.source)) @import +(import_declaration (import_spec_list (import_spec path: (interpreted_string_literal) @import.source))) @import + +; Calls +(call_expression function: (identifier) @call.name) @call +(call_expression function: (selector_expression field: (field_identifier) @call.name)) @call +`; + +// C++ queries - works with tree-sitter-cpp +export const CPP_QUERIES = ` +; Classes, Structs, Namespaces +(class_specifier name: (type_identifier) @name) @definition.class +(struct_specifier name: (type_identifier) @name) @definition.struct +(namespace_definition name: (namespace_identifier) @name) @definition.namespace +(enum_specifier name: (type_identifier) @name) @definition.enum + +; Functions & Methods +(function_definition declarator: (function_declarator declarator: (identifier) @name)) @definition.function +(function_definition declarator: (function_declarator declarator: (qualified_identifier name: (identifier) @name))) @definition.method + +; Templates +(template_declaration (class_specifier name: (type_identifier) @name)) @definition.template +(template_declaration (function_definition declarator: (function_declarator declarator: (identifier) @name))) @definition.template + +; Includes +(preproc_include path: (_) @import.source) @import + +; Calls +(call_expression function: (identifier) @call.name) @call +(call_expression function: (field_expression field: (field_identifier) @call.name)) @call +(call_expression function: (qualified_identifier name: (identifier) @call.name)) @call +(call_expression function: (template_function name: (identifier) @call.name)) @call + +; Heritage +(class_specifier name: (type_identifier) @heritage.class + (base_class_clause (type_identifier) @heritage.extends)) @heritage +(class_specifier name: (type_identifier) @heritage.class + (base_class_clause (access_specifier) (type_identifier) @heritage.extends)) @heritage +`; + +// C# queries - works with tree-sitter-c-sharp +export const CSHARP_QUERIES = ` +; Types +(class_declaration name: (identifier) @name) @definition.class +(interface_declaration name: (identifier) @name) @definition.interface +(struct_declaration name: (identifier) @name) @definition.struct +(enum_declaration name: (identifier) @name) @definition.enum +(record_declaration name: (identifier) @name) @definition.record +(delegate_declaration name: (identifier) @name) @definition.delegate + +; Namespaces +(namespace_declaration name: (identifier) @name) @definition.namespace +(namespace_declaration name: (qualified_name) @name) @definition.namespace + +; Methods & Properties +(method_declaration name: (identifier) @name) @definition.method +(local_function_statement name: (identifier) @name) @definition.function +(constructor_declaration name: (identifier) @name) @definition.constructor +(property_declaration name: (identifier) @name) @definition.property + +; Using +(using_directive (qualified_name) @import.source) @import +(using_directive (identifier) @import.source) @import + +; Calls +(invocation_expression function: (identifier) @call.name) @call +(invocation_expression function: (member_access_expression name: (identifier) @call.name)) @call + +; Heritage +(class_declaration name: (identifier) @heritage.class + (base_list (simple_base_type (identifier) @heritage.extends))) @heritage +(class_declaration name: (identifier) @heritage.class + (base_list (simple_base_type (generic_name (identifier) @heritage.extends)))) @heritage +`; + +// Rust queries - works with tree-sitter-rust +export const RUST_QUERIES = ` +; Functions & Items +(function_item name: (identifier) @name) @definition.function +(struct_item name: (type_identifier) @name) @definition.struct +(enum_item name: (type_identifier) @name) @definition.enum +(trait_item name: (type_identifier) @name) @definition.trait +(impl_item type: (type_identifier) @name) @definition.impl +(mod_item name: (identifier) @name) @definition.module + +; Type aliases, const, static, macros +(type_item name: (type_identifier) @name) @definition.type +(const_item name: (identifier) @name) @definition.const +(static_item name: (identifier) @name) @definition.static +(macro_definition name: (identifier) @name) @definition.macro + +; Use statements +(use_declaration argument: (_) @import.source) @import + +; Calls +(call_expression function: (identifier) @call.name) @call +(call_expression function: (field_expression field: (field_identifier) @call.name)) @call +(call_expression function: (scoped_identifier name: (identifier) @call.name)) @call +(call_expression function: (generic_function function: (identifier) @call.name)) @call + +; Heritage (trait implementation) +(impl_item trait: (type_identifier) @heritage.trait type: (type_identifier) @heritage.class) @heritage +(impl_item trait: (generic_type type: (type_identifier) @heritage.trait) type: (type_identifier) @heritage.class) @heritage +`; + +export const LANGUAGE_QUERIES: Record = { + [SupportedLanguages.TypeScript]: TYPESCRIPT_QUERIES, + [SupportedLanguages.JavaScript]: JAVASCRIPT_QUERIES, + [SupportedLanguages.Python]: PYTHON_QUERIES, + [SupportedLanguages.Java]: JAVA_QUERIES, + [SupportedLanguages.C]: C_QUERIES, + [SupportedLanguages.Go]: GO_QUERIES, + [SupportedLanguages.CPlusPlus]: CPP_QUERIES, + [SupportedLanguages.CSharp]: CSHARP_QUERIES, + [SupportedLanguages.Rust]: RUST_QUERIES, +}; + \ No newline at end of file diff --git a/gitnexus-cli/src/core/ingestion/utils.ts b/gitnexus-cli/src/core/ingestion/utils.ts new file mode 100644 index 000000000..5ac12a8be --- /dev/null +++ b/gitnexus-cli/src/core/ingestion/utils.ts @@ -0,0 +1,30 @@ +import { SupportedLanguages } from '../../config/supported-languages.js'; + +/** + * Map file extension to SupportedLanguage enum + */ +export const getLanguageFromFilename = (filename: string): SupportedLanguages | null => { + // TypeScript (including TSX) + if (filename.endsWith('.tsx')) return SupportedLanguages.TypeScript; + if (filename.endsWith('.ts')) return SupportedLanguages.TypeScript; + // JavaScript (including JSX) + if (filename.endsWith('.jsx')) return SupportedLanguages.JavaScript; + if (filename.endsWith('.js')) return SupportedLanguages.JavaScript; + // Python + if (filename.endsWith('.py')) return SupportedLanguages.Python; + // Java + if (filename.endsWith('.java')) return SupportedLanguages.Java; + // C (source and headers) + if (filename.endsWith('.c') || filename.endsWith('.h')) return SupportedLanguages.C; + // C++ (all common extensions) + if (filename.endsWith('.cpp') || filename.endsWith('.cc') || filename.endsWith('.cxx') || + filename.endsWith('.hpp') || filename.endsWith('.hxx') || filename.endsWith('.hh')) return SupportedLanguages.CPlusPlus; + // C# + if (filename.endsWith('.cs')) return SupportedLanguages.CSharp; + // Go + if (filename.endsWith('.go')) return SupportedLanguages.Go; + // Rust + if (filename.endsWith('.rs')) return SupportedLanguages.Rust; + return null; +}; + diff --git a/gitnexus-cli/src/core/kuzu/csv-generator.ts b/gitnexus-cli/src/core/kuzu/csv-generator.ts new file mode 100644 index 000000000..b23471deb --- /dev/null +++ b/gitnexus-cli/src/core/kuzu/csv-generator.ts @@ -0,0 +1,320 @@ +/** + * CSV Generator for KuzuDB Hybrid Schema + * + * Generates separate CSV files for each node table and one relation CSV. + * This enables efficient bulk loading via COPY FROM for hybrid schema. + * + * RFC 4180 Compliant: + * - Fields containing commas, double quotes, or newlines are enclosed in double quotes + * - Double quotes within fields are escaped by doubling them ("") + * - All fields are consistently quoted for safety with code content + */ + +import { KnowledgeGraph, GraphNode, NodeLabel } from '../graph/types.js'; +import { NODE_TABLES, NodeTableName } from './schema.js'; + +// ============================================================================ +// CSV ESCAPE UTILITIES +// ============================================================================ + +/** + * Sanitize string to ensure valid UTF-8 + * Removes or replaces invalid characters that would break CSV parsing + */ +const sanitizeUTF8 = (str: string): string => { + return str + .replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '') // Remove control chars except \t \n \r + .replace(/[\uD800-\uDFFF]/g, '') // Remove surrogate pairs (invalid standalone) + .replace(/[\uFFFE\uFFFF]/g, ''); // Remove BOM and special chars +}; + +/** + * RFC 4180 compliant CSV field escaping + * ALWAYS wraps in double quotes for safety with code content + */ +const escapeCSVField = (value: string | number | undefined | null): string => { + if (value === undefined || value === null) { + return '""'; + } + let str = String(value); + str = sanitizeUTF8(str); + return `"${str.replace(/"/g, '""')}"`; +}; + +/** + * Escape a numeric value (no quotes needed for numbers) + */ +const escapeCSVNumber = (value: number | undefined | null, defaultValue: number = -1): string => { + if (value === undefined || value === null) { + return String(defaultValue); + } + return String(value); +}; + +// ============================================================================ +// CONTENT EXTRACTION +// ============================================================================ + +/** + * Check if content looks like binary data + */ +const isBinaryContent = (content: string): boolean => { + if (!content || content.length === 0) return false; + const sample = content.slice(0, 1000); + let nonPrintable = 0; + for (let i = 0; i < sample.length; i++) { + const code = sample.charCodeAt(i); + if ((code < 9) || (code > 13 && code < 32) || code === 127) { + nonPrintable++; + } + } + return (nonPrintable / sample.length) > 0.1; +}; + +/** + * Extract code content for a node + */ +const extractContent = ( + node: GraphNode, + fileContents: Map +): string => { + const filePath = node.properties.filePath; + const content = fileContents.get(filePath); + + if (!content) return ''; + if (node.label === 'Folder') return ''; + if (isBinaryContent(content)) return '[Binary file - content not stored]'; + + // For File nodes, return content (limited) + if (node.label === 'File') { + const MAX_FILE_CONTENT = 10000; + if (content.length > MAX_FILE_CONTENT) { + return content.slice(0, MAX_FILE_CONTENT) + '\n... [truncated]'; + } + return content; + } + + // For code elements, extract the relevant lines with context + const startLine = node.properties.startLine; + const endLine = node.properties.endLine; + + if (startLine === undefined || endLine === undefined) return ''; + + const lines = content.split('\n'); + const contextLines = 2; + const start = Math.max(0, startLine - contextLines); + const end = Math.min(lines.length - 1, endLine + contextLines); + + const snippet = lines.slice(start, end + 1).join('\n'); + const MAX_SNIPPET = 5000; + if (snippet.length > MAX_SNIPPET) { + return snippet.slice(0, MAX_SNIPPET) + '\n... [truncated]'; + } + return snippet; +}; + +// ============================================================================ +// CSV GENERATION RESULT TYPE +// ============================================================================ + +export interface CSVData { + nodes: Map; + relCSV: string; // Single relation CSV with from,to,type,confidence,reason columns +} + +// ============================================================================ +// NODE CSV GENERATORS +// ============================================================================ + +/** + * Generate CSV for File nodes + * Headers: id,name,filePath,content + */ +const generateFileCSV = (nodes: GraphNode[], fileContents: Map): string => { + const headers = ['id', 'name', 'filePath', 'content']; + const rows: string[] = [headers.join(',')]; + const seenIds = new Set(); + + for (const node of nodes) { + if (node.label !== 'File') continue; + // Skip duplicates + if (seenIds.has(node.id)) continue; + seenIds.add(node.id); + + const content = extractContent(node, fileContents); + rows.push([ + escapeCSVField(node.id), + escapeCSVField(node.properties.name || ''), + escapeCSVField(node.properties.filePath || ''), + escapeCSVField(content), + ].join(',')); + } + + return rows.join('\n'); +}; + +/** + * Generate CSV for Folder nodes + * Headers: id,name,filePath + */ +const generateFolderCSV = (nodes: GraphNode[]): string => { + const headers = ['id', 'name', 'filePath']; + const rows: string[] = [headers.join(',')]; + + for (const node of nodes) { + if (node.label !== 'Folder') continue; + rows.push([ + escapeCSVField(node.id), + escapeCSVField(node.properties.name || ''), + escapeCSVField(node.properties.filePath || ''), + ].join(',')); + } + + return rows.join('\n'); +}; + +/** + * Generate CSV for code element nodes (Function, Class, Interface, Method, CodeElement) + * Headers: id,name,filePath,startLine,endLine,content + */ +const generateCodeElementCSV = ( + nodes: GraphNode[], + label: NodeLabel, + fileContents: Map +): string => { + const headers = ['id', 'name', 'filePath', 'startLine', 'endLine', 'content']; + const rows: string[] = [headers.join(',')]; + + for (const node of nodes) { + if (node.label !== label) continue; + const content = extractContent(node, fileContents); + rows.push([ + escapeCSVField(node.id), + escapeCSVField(node.properties.name || ''), + escapeCSVField(node.properties.filePath || ''), + escapeCSVNumber(node.properties.startLine, -1), + escapeCSVNumber(node.properties.endLine, -1), + escapeCSVField(content), + ].join(',')); + } + + return rows.join('\n'); +}; + +/** + * Generate CSV for Community nodes (from Leiden algorithm) + * Headers: id,label,heuristicLabel,keywords,description,enrichedBy,cohesion,symbolCount + */ +const generateCommunityCSV = (nodes: GraphNode[]): string => { + const headers = ['id', 'label', 'heuristicLabel', 'keywords', 'description', 'enrichedBy', 'cohesion', 'symbolCount']; + const rows: string[] = [headers.join(',')]; + + for (const node of nodes) { + if (node.label !== 'Community') continue; + + // Handle keywords array - convert to KuzuDB array format + const keywords = (node.properties as any).keywords || []; + const keywordsStr = `[${keywords.map((k: string) => `'${k.replace(/'/g, "''")}'`).join(',')}]`; + + rows.push([ + escapeCSVField(node.id), + escapeCSVField(node.properties.name || ''), // label is stored in name + escapeCSVField(node.properties.heuristicLabel || ''), + keywordsStr, // Array format for KuzuDB + escapeCSVField((node.properties as any).description || ''), + escapeCSVField((node.properties as any).enrichedBy || 'heuristic'), + escapeCSVNumber(node.properties.cohesion, 0), + escapeCSVNumber(node.properties.symbolCount, 0), + ].join(',')); + } + + return rows.join('\n'); +}; + +/** + * Generate CSV for Process nodes + * Headers: id,label,heuristicLabel,processType,stepCount,communities,entryPointId,terminalId + */ +const generateProcessCSV = (nodes: GraphNode[]): string => { + const headers = ['id', 'label', 'heuristicLabel', 'processType', 'stepCount', 'communities', 'entryPointId', 'terminalId']; + const rows: string[] = [headers.join(',')]; + + for (const node of nodes) { + if (node.label !== 'Process') continue; + + // Handle communities array (string[]) + const communities = (node.properties as any).communities || []; + const communitiesStr = `[${communities.map((c: string) => `'${c.replace(/'/g, "''")}'`).join(',')}]`; + + rows.push([ + escapeCSVField(node.id), + escapeCSVField(node.properties.name || ''), // label stores name + escapeCSVField((node.properties as any).heuristicLabel || ''), + escapeCSVField((node.properties as any).processType || ''), + escapeCSVNumber((node.properties as any).stepCount, 0), + escapeCSVField(communitiesStr), // Needs CSV escaping because it contains commas! + escapeCSVField((node.properties as any).entryPointId || ''), + escapeCSVField((node.properties as any).terminalId || ''), + ].join(',')); + } + + return rows.join('\n'); +}; + +/** + * Generate CSV for the single CodeRelation table + * Headers: from,to,type,confidence,reason + * + * confidence: 0-1 score for CALLS edges (how sure are we about the target?) + * reason: 'import-resolved' | 'same-file' | 'fuzzy-global' (or empty for non-CALLS) + */ +const generateRelationCSV = (graph: KnowledgeGraph): string => { + const headers = ['from', 'to', 'type', 'confidence', 'reason', 'step']; + const rows: string[] = [headers.join(',')]; + + for (const rel of graph.relationships) { + rows.push([ + escapeCSVField(rel.sourceId), + escapeCSVField(rel.targetId), + escapeCSVField(rel.type), + escapeCSVNumber(rel.confidence, 1.0), + escapeCSVField(rel.reason), + escapeCSVNumber((rel as any).step, 0), + ].join(',')); + } + + return rows.join('\n'); +}; + +// ============================================================================ +// MAIN CSV GENERATION FUNCTION +// ============================================================================ + +/** + * Generate all CSV data for hybrid schema bulk loading + * Returns Maps of node table name -> CSV content, and single relation CSV + */ +export const generateAllCSVs = ( + graph: KnowledgeGraph, + fileContents: Map +): CSVData => { + const nodes = Array.from(graph.nodes); + + // Generate node CSVs + const nodeCSVs = new Map(); + nodeCSVs.set('File', generateFileCSV(nodes, fileContents)); + nodeCSVs.set('Folder', generateFolderCSV(nodes)); + nodeCSVs.set('Function', generateCodeElementCSV(nodes, 'Function', fileContents)); + nodeCSVs.set('Class', generateCodeElementCSV(nodes, 'Class', fileContents)); + nodeCSVs.set('Interface', generateCodeElementCSV(nodes, 'Interface', fileContents)); + nodeCSVs.set('Method', generateCodeElementCSV(nodes, 'Method', fileContents)); + nodeCSVs.set('CodeElement', generateCodeElementCSV(nodes, 'CodeElement', fileContents)); + nodeCSVs.set('Community', generateCommunityCSV(nodes)); + nodeCSVs.set('Process', generateProcessCSV(nodes)); + + // Generate single relation CSV + const relCSV = generateRelationCSV(graph); + + return { nodes: nodeCSVs, relCSV }; +}; + diff --git a/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts b/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts new file mode 100644 index 000000000..e42a6fb7c --- /dev/null +++ b/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts @@ -0,0 +1,243 @@ +import fs from 'fs/promises'; +import path from 'path'; +import kuzu from 'kuzu'; +import { KnowledgeGraph } from '../graph/types.js'; +import { + NODE_TABLES, + REL_TABLE_NAME, + SCHEMA_QUERIES, + EMBEDDING_TABLE_NAME, + NodeTableName, +} from './schema.js'; +import { generateAllCSVs } from './csv-generator.js'; + +let db: kuzu.Database | null = null; +let conn: kuzu.Connection | null = null; + +const normalizeCopyPath = (filePath: string): string => filePath.replace(/\\/g, '/'); + +export const initKuzu = async (dbPath: string) => { + if (conn) return { db, conn }; + + // kuzu v0.11 expects the database path to NOT exist (it will create it) + // or to be an existing valid kuzu database + // If an empty directory exists from a previous clean, remove it + try { + const stat = await fs.stat(dbPath); + if (stat.isDirectory()) { + // Check if it's an empty directory + const files = await fs.readdir(dbPath); + if (files.length === 0) { + // Empty directory - remove it so kuzu can create fresh + await fs.rmdir(dbPath); + } + } + } catch { + // Path doesn't exist, which is what kuzu v0.11 wants for a new database + } + + // Ensure parent directory exists + const parentDir = path.dirname(dbPath); + await fs.mkdir(parentDir, { recursive: true }); + + db = new kuzu.Database(dbPath); + conn = new kuzu.Connection(db); + + for (const schemaQuery of SCHEMA_QUERIES) { + try { + await conn.query(schemaQuery); + } catch { + // Schema may already exist + } + } + + return { db, conn }; +}; + +export const loadGraphToKuzu = async ( + graph: KnowledgeGraph, + fileContents: Map, + storagePath: string +) => { + if (!conn) { + throw new Error('KuzuDB not initialized. Call initKuzu first.'); + } + + const csvData = generateAllCSVs(graph, fileContents); + const csvDir = path.join(storagePath, 'csv'); + await fs.mkdir(csvDir, { recursive: true }); + + const nodeFiles: Array<{ table: NodeTableName; path: string }> = []; + for (const [tableName, csv] of csvData.nodes.entries()) { + if (csv.split('\n').length <= 1) continue; + const filePath = path.join(csvDir, `${tableName.toLowerCase()}.csv`); + await fs.writeFile(filePath, csv, 'utf-8'); + nodeFiles.push({ table: tableName, path: filePath }); + } + + const relLines = csvData.relCSV.split('\n').slice(1).filter(line => line.trim()); + + for (const { table, path: filePath } of nodeFiles) { + const copyQuery = getCopyQuery(table, normalizeCopyPath(filePath)); + await conn.query(copyQuery); + } + + let insertedRels = 0; + let skippedRels = 0; + for (const line of relLines) { + try { + const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)",([0-9-]+)/); + if (!match) continue; + const [, fromId, toId, relType, confidenceStr, reason, stepStr] = match; + const confidence = parseFloat(confidenceStr) || 1.0; + const step = parseInt(stepStr) || 0; + + const getNodeLabel = (nodeId: string): string => { + if (nodeId.startsWith('comm_')) return 'Community'; + if (nodeId.startsWith('proc_')) return 'Process'; + return nodeId.split(':')[0]; + }; + + const RESERVED_LABELS = ['Macro', 'Enum', 'Union', 'Const', 'Module', 'Struct']; + const escapeLabel = (label: string): string => { + return RESERVED_LABELS.includes(label) ? `\`${label}\`` : label; + }; + + const fromLabel = escapeLabel(getNodeLabel(fromId)); + const toLabel = escapeLabel(getNodeLabel(toId)); + + const insertQuery = ` + MATCH (a:${fromLabel} {id: '${fromId.replace(/'/g, "''")}' }), + (b:${toLabel} {id: '${toId.replace(/'/g, "''")}' }) + CREATE (a)-[:${REL_TABLE_NAME} {type: '${relType}', confidence: ${confidence}, reason: '${reason.replace(/'/g, "''")}', step: ${step}}]->(b) + `; + await conn.query(insertQuery); + insertedRels++; + } catch { + skippedRels++; + } + } + + // Cleanup CSVs + for (const { path: filePath } of nodeFiles) { + try { + await fs.unlink(filePath); + } catch { + // ignore + } + } + + return { success: true, insertedRels, skippedRels }; +}; + +const getCopyQuery = (table: NodeTableName, filePath: string): string => { + if (table === 'File') { + return `COPY File(id, name, filePath, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Folder') { + return `COPY Folder(id, name, filePath) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Community') { + return `COPY Community(id, label, heuristicLabel, keywords, description, enrichedBy, cohesion, symbolCount) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Process') { + return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; + } + return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; +}; + +export const executeQuery = async (cypher: string): Promise => { + if (!conn) { + throw new Error('KuzuDB not initialized. Call initKuzu first.'); + } + + const queryResult = await conn.query(cypher); + // kuzu v0.11 uses getAll() instead of hasNext()/getNext() + // Query returns QueryResult for single queries, QueryResult[] for multi-statement + const result = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const rows = await result.getAll(); + return rows; +}; + +export const executeWithReusedStatement = async ( + cypher: string, + paramsList: Array> +): Promise => { + if (!conn) { + throw new Error('KuzuDB not initialized. Call initKuzu first.'); + } + if (paramsList.length === 0) return; + + const SUB_BATCH_SIZE = 4; + for (let i = 0; i < paramsList.length; i += SUB_BATCH_SIZE) { + const subBatch = paramsList.slice(i, i + SUB_BATCH_SIZE); + const stmt = await conn.prepare(cypher); + if (!stmt.isSuccess()) { + const errMsg = await stmt.getErrorMessage(); + throw new Error(`Prepare failed: ${errMsg}`); + } + try { + for (const params of subBatch) { + await conn.execute(stmt, params); + } + } catch (e) { + // Log the error and continue with next batch + console.warn('Batch execution error:', e); + } + // Note: kuzu 0.8.2 PreparedStatement doesn't require explicit close() + } +}; + +export const getKuzuStats = async (): Promise<{ nodes: number; edges: number }> => { + if (!conn) return { nodes: 0, edges: 0 }; + + let totalNodes = 0; + for (const tableName of NODE_TABLES) { + try { + const queryResult = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); + const nodeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const nodeRows = await nodeResult.getAll(); + if (nodeRows.length > 0) { + totalNodes += Number(nodeRows[0]?.cnt ?? nodeRows[0]?.[0] ?? 0); + } + } catch { + // ignore + } + } + + let totalEdges = 0; + try { + const queryResult = await conn.query(`MATCH ()-[r:${REL_TABLE_NAME}]->() RETURN count(r) AS cnt`); + const edgeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const edgeRows = await edgeResult.getAll(); + if (edgeRows.length > 0) { + totalEdges = Number(edgeRows[0]?.cnt ?? edgeRows[0]?.[0] ?? 0); + } + } catch { + // ignore + } + + return { nodes: totalNodes, edges: totalEdges }; +}; + +export const closeKuzu = async (): Promise => { + if (conn) { + try { + await conn.close(); + } catch {} + conn = null; + } + if (db) { + try { + await db.close(); + } catch {} + db = null; + } +}; + +export const isKuzuReady = (): boolean => conn !== null && db !== null; + +export const getEmbeddingTableName = (): string => EMBEDDING_TABLE_NAME; + + + diff --git a/gitnexus-cli/src/core/kuzu/schema.ts b/gitnexus-cli/src/core/kuzu/schema.ts new file mode 100644 index 000000000..6c20b4bd5 --- /dev/null +++ b/gitnexus-cli/src/core/kuzu/schema.ts @@ -0,0 +1,405 @@ +/** + * KuzuDB Schema Definitions + * + * Hybrid Schema: + * - Separate node tables for each code element type (File, Function, Class, etc.) + * - Single CodeRelation table with 'type' property for all relationships + * + * This allows LLMs to write natural Cypher queries like: + * MATCH (f:Function)-[r:CodeRelation {type: 'CALLS'}]->(g:Function) RETURN f, g + */ + +// ============================================================================ +// NODE TABLE NAMES +// ============================================================================ +export const NODE_TABLES = [ + 'File', 'Folder', 'Function', 'Class', 'Interface', 'Method', 'CodeElement', 'Community', 'Process', + // Multi-language support + 'Struct', 'Enum', 'Macro', 'Typedef', 'Union', 'Namespace', 'Trait', 'Impl', + 'TypeAlias', 'Const', 'Static', 'Property', 'Record', 'Delegate', 'Annotation', 'Constructor', 'Template', 'Module' +] as const; +export type NodeTableName = typeof NODE_TABLES[number]; + +// ============================================================================ +// RELATION TABLE +// ============================================================================ +export const REL_TABLE_NAME = 'CodeRelation'; + +// Valid relation types +export const REL_TYPES = ['CONTAINS', 'DEFINES', 'IMPORTS', 'CALLS', 'EXTENDS', 'IMPLEMENTS', 'MEMBER_OF', 'STEP_IN_PROCESS'] as const; +export type RelType = typeof REL_TYPES[number]; + +// ============================================================================ +// EMBEDDING TABLE +// ============================================================================ +export const EMBEDDING_TABLE_NAME = 'CodeEmbedding'; + +// ============================================================================ +// NODE TABLE SCHEMAS +// ============================================================================ + +export const FILE_SCHEMA = ` +CREATE NODE TABLE File ( + id STRING, + name STRING, + filePath STRING, + content STRING, + PRIMARY KEY (id) +)`; + +export const FOLDER_SCHEMA = ` +CREATE NODE TABLE Folder ( + id STRING, + name STRING, + filePath STRING, + PRIMARY KEY (id) +)`; + +export const FUNCTION_SCHEMA = ` +CREATE NODE TABLE Function ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +export const CLASS_SCHEMA = ` +CREATE NODE TABLE Class ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +export const INTERFACE_SCHEMA = ` +CREATE NODE TABLE Interface ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +export const METHOD_SCHEMA = ` +CREATE NODE TABLE Method ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +export const CODE_ELEMENT_SCHEMA = ` +CREATE NODE TABLE CodeElement ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +// ============================================================================ +// COMMUNITY NODE TABLE (for Leiden algorithm clusters) +// ============================================================================ + +export const COMMUNITY_SCHEMA = ` +CREATE NODE TABLE Community ( + id STRING, + label STRING, + heuristicLabel STRING, + keywords STRING[], + description STRING, + enrichedBy STRING, + cohesion DOUBLE, + symbolCount INT32, + PRIMARY KEY (id) +)`; + +// ============================================================================ +// PROCESS NODE TABLE (for execution flow detection) +// ============================================================================ + +export const PROCESS_SCHEMA = ` +CREATE NODE TABLE Process ( + id STRING, + label STRING, + heuristicLabel STRING, + processType STRING, + stepCount INT32, + communities STRING[], + entryPointId STRING, + terminalId STRING, + PRIMARY KEY (id) +)`; + +// ============================================================================ +// MULTI-LANGUAGE NODE TABLE SCHEMAS +// ============================================================================ + +// Generic code element with startLine/endLine for C, C++, Rust, Go, Java, C# +const CODE_ELEMENT_BASE = (name: string) => ` +CREATE NODE TABLE \`${name}\` ( + id STRING, + name STRING, + filePath STRING, + startLine INT64, + endLine INT64, + content STRING, + PRIMARY KEY (id) +)`; + +export const STRUCT_SCHEMA = CODE_ELEMENT_BASE('Struct'); +export const ENUM_SCHEMA = CODE_ELEMENT_BASE('Enum'); +export const MACRO_SCHEMA = CODE_ELEMENT_BASE('Macro'); +export const TYPEDEF_SCHEMA = CODE_ELEMENT_BASE('Typedef'); +export const UNION_SCHEMA = CODE_ELEMENT_BASE('Union'); +export const NAMESPACE_SCHEMA = CODE_ELEMENT_BASE('Namespace'); +export const TRAIT_SCHEMA = CODE_ELEMENT_BASE('Trait'); +export const IMPL_SCHEMA = CODE_ELEMENT_BASE('Impl'); +export const TYPE_ALIAS_SCHEMA = CODE_ELEMENT_BASE('TypeAlias'); +export const CONST_SCHEMA = CODE_ELEMENT_BASE('Const'); +export const STATIC_SCHEMA = CODE_ELEMENT_BASE('Static'); +export const PROPERTY_SCHEMA = CODE_ELEMENT_BASE('Property'); +export const RECORD_SCHEMA = CODE_ELEMENT_BASE('Record'); +export const DELEGATE_SCHEMA = CODE_ELEMENT_BASE('Delegate'); +export const ANNOTATION_SCHEMA = CODE_ELEMENT_BASE('Annotation'); +export const CONSTRUCTOR_SCHEMA = CODE_ELEMENT_BASE('Constructor'); +export const TEMPLATE_SCHEMA = CODE_ELEMENT_BASE('Template'); +export const MODULE_SCHEMA = CODE_ELEMENT_BASE('Module'); + +// ============================================================================ +// RELATION TABLE SCHEMA +// Single table with 'type' property - connects all node tables +// ============================================================================ + +export const RELATION_SCHEMA = ` +CREATE REL TABLE ${REL_TABLE_NAME} ( + FROM File TO File, + FROM File TO Folder, + FROM File TO Function, + FROM File TO Class, + FROM File TO Interface, + FROM File TO Method, + FROM File TO CodeElement, + FROM File TO \`Struct\`, + FROM File TO \`Enum\`, + FROM File TO \`Macro\`, + FROM File TO Typedef, + FROM File TO \`Union\`, + FROM File TO Namespace, + FROM File TO Trait, + FROM File TO Impl, + FROM File TO TypeAlias, + FROM File TO \`Const\`, + FROM File TO Static, + FROM File TO Property, + FROM File TO Record, + FROM File TO Delegate, + FROM File TO Annotation, + FROM File TO Constructor, + FROM File TO Template, + FROM File TO \`Module\`, + FROM Folder TO Folder, + FROM Folder TO File, + FROM Function TO Function, + FROM Function TO Method, + FROM Function TO Class, + FROM Function TO Community, + FROM Function TO \`Macro\`, + FROM Function TO \`Struct\`, + FROM Function TO Template, + FROM Function TO \`Enum\`, + FROM Function TO Namespace, + FROM Function TO TypeAlias, + FROM Function TO \`Module\`, + FROM Function TO Impl, + FROM Function TO Interface, + FROM Function TO Constructor, + FROM Class TO Method, + FROM Class TO Function, + FROM Class TO Class, + FROM Class TO Interface, + FROM Class TO Community, + FROM Class TO Template, + FROM Class TO TypeAlias, + FROM Class TO \`Struct\`, + FROM Class TO \`Enum\`, + FROM Class TO Constructor, + FROM Method TO Function, + FROM Method TO Method, + FROM Method TO Class, + FROM Method TO Community, + FROM Method TO Template, + FROM Method TO \`Struct\`, + FROM Method TO TypeAlias, + FROM Method TO \`Enum\`, + FROM Method TO \`Macro\`, + FROM Method TO Namespace, + FROM Method TO \`Module\`, + FROM Method TO Impl, + FROM Method TO Interface, + FROM Method TO Constructor, + FROM Template TO Template, + FROM Template TO Function, + FROM Template TO Method, + FROM Template TO Class, + FROM Template TO \`Struct\`, + FROM Template TO TypeAlias, + FROM Template TO \`Enum\`, + FROM Template TO \`Macro\`, + FROM Template TO Interface, + FROM Template TO Constructor, + FROM \`Module\` TO \`Module\`, + FROM CodeElement TO Community, + FROM Interface TO Community, + FROM Interface TO Function, + FROM Interface TO Method, + FROM Interface TO Class, + FROM Interface TO Interface, + FROM Interface TO TypeAlias, + FROM Interface TO \`Struct\`, + FROM Interface TO Constructor, + FROM \`Struct\` TO Community, + FROM \`Struct\` TO Trait, + FROM \`Struct\` TO Function, + FROM \`Struct\` TO Method, + FROM \`Enum\` TO Community, + FROM \`Macro\` TO Community, + FROM \`Macro\` TO Function, + FROM \`Macro\` TO Method, + FROM \`Module\` TO Function, + FROM \`Module\` TO Method, + FROM Typedef TO Community, + FROM \`Union\` TO Community, + FROM Namespace TO Community, + FROM Trait TO Community, + FROM Impl TO Community, + FROM Impl TO Trait, + FROM TypeAlias TO Community, + FROM \`Const\` TO Community, + FROM Static TO Community, + FROM Property TO Community, + FROM Record TO Community, + FROM Delegate TO Community, + FROM Annotation TO Community, + FROM Constructor TO Community, + FROM Constructor TO Interface, + FROM Constructor TO Class, + FROM Constructor TO Method, + FROM Constructor TO Function, + FROM Constructor TO Constructor, + FROM Constructor TO \`Struct\`, + FROM Constructor TO \`Macro\`, + FROM Constructor TO Template, + FROM Constructor TO TypeAlias, + FROM Constructor TO \`Enum\`, + FROM Constructor TO Impl, + FROM Constructor TO Namespace, + FROM Template TO Community, + FROM \`Module\` TO Community, + FROM Function TO Process, + FROM Method TO Process, + FROM Class TO Process, + FROM Interface TO Process, + FROM \`Struct\` TO Process, + FROM Constructor TO Process, + FROM \`Module\` TO Process, + FROM \`Macro\` TO Process, + FROM Impl TO Process, + FROM Typedef TO Process, + FROM TypeAlias TO Process, + FROM \`Enum\` TO Process, + FROM \`Union\` TO Process, + FROM Namespace TO Process, + FROM Trait TO Process, + FROM \`Const\` TO Process, + FROM Static TO Process, + FROM Property TO Process, + FROM Record TO Process, + FROM Delegate TO Process, + FROM Annotation TO Process, + FROM Template TO Process, + FROM CodeElement TO Process, + type STRING, + confidence DOUBLE, + reason STRING, + step INT32 +)`; + +// ============================================================================ +// EMBEDDING TABLE SCHEMA +// Separate table for vector storage to avoid copy-on-write overhead +// ============================================================================ + +export const EMBEDDING_SCHEMA = ` +CREATE NODE TABLE ${EMBEDDING_TABLE_NAME} ( + nodeId STRING, + embedding FLOAT[384], + PRIMARY KEY (nodeId) +)`; + +/** + * Create vector index for semantic search + * Uses HNSW (Hierarchical Navigable Small World) algorithm with cosine similarity + */ +export const CREATE_VECTOR_INDEX_QUERY = ` +CALL CREATE_VECTOR_INDEX('${EMBEDDING_TABLE_NAME}', 'code_embedding_idx', 'embedding', metric := 'cosine') +`; + +// ============================================================================ +// ALL SCHEMA QUERIES IN ORDER +// Node tables must be created before relationship tables that reference them +// ============================================================================ + +export const NODE_SCHEMA_QUERIES = [ + FILE_SCHEMA, + FOLDER_SCHEMA, + FUNCTION_SCHEMA, + CLASS_SCHEMA, + INTERFACE_SCHEMA, + METHOD_SCHEMA, + CODE_ELEMENT_SCHEMA, + COMMUNITY_SCHEMA, + PROCESS_SCHEMA, + // Multi-language support + STRUCT_SCHEMA, + ENUM_SCHEMA, + MACRO_SCHEMA, + TYPEDEF_SCHEMA, + UNION_SCHEMA, + NAMESPACE_SCHEMA, + TRAIT_SCHEMA, + IMPL_SCHEMA, + TYPE_ALIAS_SCHEMA, + CONST_SCHEMA, + STATIC_SCHEMA, + PROPERTY_SCHEMA, + RECORD_SCHEMA, + DELEGATE_SCHEMA, + ANNOTATION_SCHEMA, + CONSTRUCTOR_SCHEMA, + TEMPLATE_SCHEMA, + MODULE_SCHEMA, +]; + +export const REL_SCHEMA_QUERIES = [ + RELATION_SCHEMA, +]; + +export const SCHEMA_QUERIES = [ + ...NODE_SCHEMA_QUERIES, + ...REL_SCHEMA_QUERIES, + EMBEDDING_SCHEMA, +]; diff --git a/gitnexus-cli/src/core/search/bm25-index.ts b/gitnexus-cli/src/core/search/bm25-index.ts new file mode 100644 index 000000000..5a64f3c12 --- /dev/null +++ b/gitnexus-cli/src/core/search/bm25-index.ts @@ -0,0 +1,203 @@ +/** + * BM25 Full-Text Search Index + * + * Uses MiniSearch for fast keyword-based search with BM25 ranking. + * Complements semantic search - BM25 finds exact terms, semantic finds concepts. + */ + +import MiniSearch from 'minisearch'; +import fs from 'fs/promises'; + +export interface BM25Document { + id: string; // File path + content: string; // File content + name: string; // File name (boosted in search) +} + +export interface BM25SearchResult { + filePath: string; + score: number; + rank: number; +} + +/** + * BM25 Index singleton + * Stores the MiniSearch instance and provides search methods + */ +let searchIndex: MiniSearch | null = null; +let indexedDocCount = 0; + +/** + * Build the BM25 index from file contents + * Should be called after ingestion completes + * + * @param fileContents - Map of file path to content + * @returns Number of documents indexed + */ +export const buildBM25Index = (fileContents: Map): number => { + // Create new MiniSearch instance with BM25-like scoring + searchIndex = new MiniSearch({ + fields: ['content', 'name'], // Fields to index + storeFields: ['id'], // Fields to return in results + + // Tokenizer: split on non-alphanumeric, camelCase, snake_case + tokenize: (text: string) => { + // Split on whitespace and punctuation + const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); + + // Also split camelCase: "getUserById" -> ["get", "user", "by", "id"] + const expanded: string[] = []; + for (const token of tokens) { + if (token.length === 0) continue; + + // Split camelCase + const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); + expanded.push(...camelParts); + + // Also keep original token for exact matches + if (camelParts.length > 1) { + expanded.push(token); + } + } + + // Filter out very short tokens and common noise + return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); + }, + }); + + // Index all files + const documents: BM25Document[] = []; + + for (const [filePath, content] of fileContents.entries()) { + // Extract filename from path + const name = filePath.split('/').pop() || filePath; + + documents.push({ + id: filePath, + content: content, + name: name, + }); + } + + // Batch add for efficiency + searchIndex.addAll(documents); + indexedDocCount = documents.length; + + const isDev = process.env.NODE_ENV !== 'production'; + if (isDev) { + console.log(`📚 BM25 index built: ${indexedDocCount} documents`); + } + + return indexedDocCount; +}; + +/** + * Search the BM25 index + * + * @param query - Search query (keywords) + * @param limit - Maximum results to return + * @returns Ranked search results with file paths and scores + */ +export const searchBM25 = (query: string, limit: number = 20): BM25SearchResult[] => { + if (!searchIndex) { + return []; + } + + // Search with fuzzy matching and prefix support + const results = searchIndex.search(query, { + fuzzy: 0.2, + prefix: true, + boost: { name: 2 }, // Boost file name matches + }); + + // Limit results and add rank + return results.slice(0, limit).map((r, index) => ({ + filePath: r.id, + score: r.score, + rank: index + 1, + })); +}; + +/** + * Check if the BM25 index is ready + */ +export const isBM25Ready = (): boolean => { + return searchIndex !== null && indexedDocCount > 0; +}; + +/** + * Get index statistics + */ +export const getBM25Stats = (): { documentCount: number; termCount: number } => { + if (!searchIndex) { + return { documentCount: 0, termCount: 0 }; + } + + return { + documentCount: indexedDocCount, + termCount: searchIndex.termCount, + }; +}; + +/** + * Clear the index (for cleanup or re-indexing) + */ +export const clearBM25Index = (): void => { + searchIndex = null; + indexedDocCount = 0; +}; + +/** + * Export the BM25 index to disk + */ +export const exportBM25Index = async (filePath: string): Promise => { + if (!searchIndex) return; + const json = JSON.stringify(searchIndex.toJSON()); + await fs.writeFile(filePath, json, 'utf-8'); +}; + +/** + * Load a BM25 index from disk + */ +export const loadBM25Index = async (filePath: string): Promise => { + try { + const json = await fs.readFile(filePath, 'utf-8'); + const data = JSON.parse(json); + searchIndex = MiniSearch.loadJSON(data, { + fields: ['content', 'name'], + storeFields: ['id'], + tokenize: (text: string) => { + const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); + const expanded: string[] = []; + for (const token of tokens) { + if (token.length === 0) continue; + const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); + expanded.push(...camelParts); + if (camelParts.length > 1) { + expanded.push(token); + } + } + return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); + }, + }); + indexedDocCount = searchIndex.documentCount; + return true; + } catch { + return false; + } +}; + +/** + * Common stop words to filter out (too common to be useful) + */ +const STOP_WORDS = new Set([ + // JavaScript/TypeScript keywords + 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', + 'class', 'new', 'this', 'import', 'export', 'from', 'default', 'async', 'await', + 'try', 'catch', 'throw', 'typeof', 'instanceof', 'true', 'false', 'null', 'undefined', + + // Common English stop words + 'the', 'is', 'at', 'which', 'on', 'a', 'an', 'and', 'or', 'but', 'in', 'with', + 'to', 'of', 'it', 'be', 'as', 'by', 'that', 'for', 'are', 'was', 'were', +]); + diff --git a/gitnexus-cli/src/core/search/hybrid-search.ts b/gitnexus-cli/src/core/search/hybrid-search.ts new file mode 100644 index 000000000..4af6f3700 --- /dev/null +++ b/gitnexus-cli/src/core/search/hybrid-search.ts @@ -0,0 +1,164 @@ +/** + * Hybrid Search with Reciprocal Rank Fusion (RRF) + * + * Combines BM25 (keyword) and semantic (embedding) search results. + * Uses RRF to merge rankings without needing score normalization. + * + * This is the same approach used by Elasticsearch, Pinecone, and other + * production search systems. + */ + +import { searchBM25, isBM25Ready, type BM25SearchResult } from './bm25-index.js'; +import type { SemanticSearchResult } from '../embeddings/types.js'; + +/** + * RRF constant - standard value used in the literature + * Higher values give more weight to lower-ranked results + */ +const RRF_K = 60; + +export interface HybridSearchResult { + filePath: string; + score: number; // RRF score + rank: number; // Final rank + sources: ('bm25' | 'semantic')[]; // Which methods found this + + // Metadata from semantic search (if available) + nodeId?: string; + name?: string; + label?: string; + startLine?: number; + endLine?: number; + + // Original scores for debugging + bm25Score?: number; + semanticScore?: number; +} + +/** + * Perform hybrid search combining BM25 and semantic results + * + * @param bm25Results - Results from BM25 keyword search + * @param semanticResults - Results from semantic/embedding search + * @param limit - Maximum results to return + * @returns Merged and re-ranked results + */ +export const mergeWithRRF = ( + bm25Results: BM25SearchResult[], + semanticResults: SemanticSearchResult[], + limit: number = 10 +): HybridSearchResult[] => { + const merged = new Map(); + + // Process BM25 results + for (let i = 0; i < bm25Results.length; i++) { + const r = bm25Results[i]; + const rrfScore = 1 / (RRF_K + i + 1); // i+1 because rank starts at 1 + + merged.set(r.filePath, { + filePath: r.filePath, + score: rrfScore, + rank: 0, // Will be set after sorting + sources: ['bm25'], + bm25Score: r.score, + }); + } + + // Process semantic results and merge + for (let i = 0; i < semanticResults.length; i++) { + const r = semanticResults[i]; + const rrfScore = 1 / (RRF_K + i + 1); + + const existing = merged.get(r.filePath); + if (existing) { + // Found by both methods - add scores + existing.score += rrfScore; + existing.sources.push('semantic'); + existing.semanticScore = 1 - r.distance; + + // Add semantic metadata + existing.nodeId = r.nodeId; + existing.name = r.name; + existing.label = r.label; + existing.startLine = r.startLine; + existing.endLine = r.endLine; + } else { + // Only found by semantic + merged.set(r.filePath, { + filePath: r.filePath, + score: rrfScore, + rank: 0, + sources: ['semantic'], + semanticScore: 1 - r.distance, + nodeId: r.nodeId, + name: r.name, + label: r.label, + startLine: r.startLine, + endLine: r.endLine, + }); + } + } + + // Sort by RRF score descending + const sorted = Array.from(merged.values()) + .sort((a, b) => b.score - a.score) + .slice(0, limit); + + // Assign final ranks + sorted.forEach((r, i) => { + r.rank = i + 1; + }); + + return sorted; +}; + +/** + * Check if hybrid search is available + * Requires BM25 index to be built + * Note: Semantic search is optional - hybrid works with just BM25 if embeddings aren't ready + */ +export const isHybridSearchReady = (): boolean => { + return isBM25Ready(); +}; + +/** + * Format hybrid results for LLM consumption + */ +export const formatHybridResults = (results: HybridSearchResult[]): string => { + if (results.length === 0) { + return 'No results found.'; + } + + const formatted = results.map((r, i) => { + const sources = r.sources.join(' + '); + const location = r.startLine ? ` (lines ${r.startLine}-${r.endLine})` : ''; + const label = r.label ? `${r.label}: ` : 'File: '; + const name = r.name || r.filePath.split('/').pop() || r.filePath; + + return `[${i + 1}] ${label}${name} + File: ${r.filePath}${location} + Found by: ${sources} + Relevance: ${r.score.toFixed(4)}`; + }); + + return `Found ${results.length} results:\n\n${formatted.join('\n\n')}`; +}; + +/** + * Execute BM25 + semantic search and merge with RRF. + * The semanticSearch function is injected to keep this module environment-agnostic. + */ +export const hybridSearch = async ( + query: string, + limit: number, + executeQuery: (cypher: string) => Promise, + semanticSearch: (executeQuery: (cypher: string) => Promise, query: string, k?: number) => Promise +): Promise => { + const bm25Results = isBM25Ready() ? searchBM25(query, limit) : []; + const semanticResults = await semanticSearch(executeQuery, query, limit); + return mergeWithRRF(bm25Results, semanticResults, limit); +}; + + + + diff --git a/gitnexus-cli/src/core/tree-sitter/parser-loader.ts b/gitnexus-cli/src/core/tree-sitter/parser-loader.ts new file mode 100644 index 000000000..cdca3003d --- /dev/null +++ b/gitnexus-cli/src/core/tree-sitter/parser-loader.ts @@ -0,0 +1,45 @@ +import Parser from 'tree-sitter'; +import JavaScript from 'tree-sitter-javascript'; +import TypeScript from 'tree-sitter-typescript'; +import Python from 'tree-sitter-python'; +import Java from 'tree-sitter-java'; +import C from 'tree-sitter-c'; +import CPP from 'tree-sitter-cpp'; +import CSharp from 'tree-sitter-c-sharp'; +import Go from 'tree-sitter-go'; +import Rust from 'tree-sitter-rust'; +import { SupportedLanguages } from '../../config/supported-languages.js'; + +let parser: Parser | null = null; + +const languageMap: Record = { + [SupportedLanguages.JavaScript]: JavaScript, + [SupportedLanguages.TypeScript]: TypeScript.typescript, + [`${SupportedLanguages.TypeScript}:tsx`]: TypeScript.tsx, + [SupportedLanguages.Python]: Python, + [SupportedLanguages.Java]: Java, + [SupportedLanguages.C]: C, + [SupportedLanguages.CPlusPlus]: CPP, + [SupportedLanguages.CSharp]: CSharp, + [SupportedLanguages.Go]: Go, + [SupportedLanguages.Rust]: Rust, +}; + +export const loadParser = async (): Promise => { + if (parser) return parser; + parser = new Parser(); + return parser; +}; + +export const loadLanguage = async (language: SupportedLanguages, filePath?: string): Promise => { + if (!parser) await loadParser(); + const key = language === SupportedLanguages.TypeScript && filePath?.endsWith('.tsx') + ? `${language}:tsx` + : language; + + const lang = languageMap[key]; + if (!lang) { + throw new Error(`Unsupported language: ${language}`); + } + parser!.setLanguage(lang); +}; diff --git a/gitnexus-cli/src/lib/utils.ts b/gitnexus-cli/src/lib/utils.ts new file mode 100644 index 000000000..857f9c1a8 --- /dev/null +++ b/gitnexus-cli/src/lib/utils.ts @@ -0,0 +1,3 @@ +export const generateId = (label: string, name: string): string => { + return `${label}:${name}` +} \ No newline at end of file diff --git a/gitnexus-cli/src/mcp/server.ts b/gitnexus-cli/src/mcp/server.ts new file mode 100644 index 000000000..fbfbe2a9e --- /dev/null +++ b/gitnexus-cli/src/mcp/server.ts @@ -0,0 +1,178 @@ +import path from 'path'; +import fs from 'fs/promises'; +import { Server } from '@modelcontextprotocol/sdk/server/index.js'; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { + CallToolRequestSchema, + ListToolsRequestSchema, + ListResourcesRequestSchema, + ReadResourceRequestSchema, +} from '@modelcontextprotocol/sdk/types.js'; +import { GITNEXUS_TOOLS } from './tools.js'; +import { detectRepoByCwd, loadMeta } from '../storage/repo-manager.js'; +import { initKuzu, executeQuery } from '../core/kuzu/kuzu-adapter.js'; +import { loadBM25Index, isBM25Ready, searchBM25 } from '../core/search/bm25-index.js'; +import { hybridSearch } from '../core/search/hybrid-search.js'; +import { semanticSearch } from '../core/embeddings/embedding-pipeline.js'; +import { isEmbedderReady } from '../core/embeddings/embedder.js'; + +const notIndexedMessage = (cwd: string) => ` +Repository not indexed. + +Run: + cd ${cwd} + gitnexus analyze +`; + +const formatContext = (meta: { repoPath: string; indexedAt: string; lastCommit: string; stats?: any }) => { + const stats = meta.stats || {}; + return [ + `# GitNexus: ${meta.repoPath}`, + '', + '## Stats', + `- Files: ${stats.files ?? 0}`, + `- Nodes: ${stats.nodes ?? 0}`, + `- Edges: ${stats.edges ?? 0}`, + `- Communities: ${stats.communities ?? 0}`, + `- Processes: ${stats.processes ?? 0}`, + '', + `Indexed at: ${meta.indexedAt}`, + `Last commit: ${meta.lastCommit}`, + '', + '## Available Tools', + '- search, cypher, read, overview', + ].join('\n'); +}; + +export const startMCPServer = async () => { + const server = new Server( + { name: 'gitnexus', version: '0.1.0' }, + { capabilities: { tools: {}, resources: {} } } + ); + + server.setRequestHandler(ListResourcesRequestSchema, async () => { + const repo = await detectRepoByCwd(process.cwd()); + if (!repo) return { resources: [] }; + return { + resources: [ + { + uri: 'gitnexus://context', + name: `GitNexus: ${repo.meta.repoPath}`, + description: 'Indexed repository context', + mimeType: 'text/markdown', + }, + ], + }; + }); + + server.setRequestHandler(ReadResourceRequestSchema, async (request) => { + if (request.params.uri !== 'gitnexus://context') { + throw new Error(`Unknown resource: ${request.params.uri}`); + } + const repo = await detectRepoByCwd(process.cwd()); + if (!repo) { + return { + contents: [ + { + uri: 'gitnexus://context', + mimeType: 'text/plain', + text: notIndexedMessage(process.cwd()), + }, + ], + }; + } + return { + contents: [ + { + uri: 'gitnexus://context', + mimeType: 'text/markdown', + text: formatContext(repo.meta), + }, + ], + }; + }); + + server.setRequestHandler(ListToolsRequestSchema, async () => ({ + tools: GITNEXUS_TOOLS.map((tool) => ({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + })), + })); + + server.setRequestHandler(CallToolRequestSchema, async (request) => { + const repo = await detectRepoByCwd(process.cwd()); + if (!repo) { + return { + content: [{ type: 'text', text: notIndexedMessage(process.cwd()) }], + isError: true, + }; + } + + await initKuzu(repo.kuzuPath); + await loadBM25Index(repo.bm25Path); + + const name = request.params.name; + const args = request.params.arguments || {}; + + if (name === 'search') { + const query = String(args.query || ''); + const limit = Number(args.limit ?? 10); + let results: any[] = []; + if (isBM25Ready() && isEmbedderReady()) { + results = await hybridSearch(query, limit, executeQuery, semanticSearch); + } else if (isBM25Ready()) { + results = searchBM25(query, limit); + } else if (isEmbedderReady()) { + results = await semanticSearch(executeQuery, query, limit); + } + return { + content: [{ type: 'text', text: JSON.stringify(results, null, 2) }], + }; + } + + if (name === 'cypher') { + const query = String(args.query || ''); + const result = await executeQuery(query); + return { + content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], + }; + } + + if (name === 'read') { + const filePath = args.path; + if (!filePath) { + return { + content: [{ type: 'text', text: 'Missing path.' }], + isError: true, + }; + } + const meta = await loadMeta(repo.storagePath); + if (!meta) { + return { + content: [{ type: 'text', text: notIndexedMessage(process.cwd()) }], + isError: true, + }; + } + const fullPath = path.join(meta.repoPath, String(filePath)); + const content = await fs.readFile(fullPath, 'utf-8'); + return { content: [{ type: 'text', text: content }] }; + } + + if (name === 'overview') { + return { + content: [{ type: 'text', text: JSON.stringify(repo.meta, null, 2) }], + }; + } + + return { + content: [{ type: 'text', text: `Unknown tool: ${name}` }], + isError: true, + }; + }); + + const transport = new StdioServerTransport(); + await server.connect(transport); +}; + + diff --git a/gitnexus-cli/src/mcp/tools.ts b/gitnexus-cli/src/mcp/tools.ts new file mode 100644 index 000000000..6ce5d1e77 --- /dev/null +++ b/gitnexus-cli/src/mcp/tools.ts @@ -0,0 +1,47 @@ +export const GITNEXUS_TOOLS = [ + { + name: 'search', + description: 'Hybrid search across the indexed repository (BM25 + semantic if available).', + inputSchema: { + type: 'object', + properties: { + query: { type: 'string', description: 'Search query' }, + limit: { type: 'number', description: 'Max results', default: 10 }, + }, + required: ['query'], + }, + }, + { + name: 'cypher', + description: 'Execute a Cypher query on the knowledge graph.', + inputSchema: { + type: 'object', + properties: { + query: { type: 'string', description: 'Cypher query string' }, + }, + required: ['query'], + }, + }, + { + name: 'read', + description: 'Read a file from the repository.', + inputSchema: { + type: 'object', + properties: { + path: { type: 'string', description: 'File path relative to repo root' }, + }, + required: ['path'], + }, + }, + { + name: 'overview', + description: 'Return basic stats for the indexed repository.', + inputSchema: { + type: 'object', + properties: {}, + }, + }, +]; + + + diff --git a/gitnexus-cli/src/server/api.ts b/gitnexus-cli/src/server/api.ts new file mode 100644 index 000000000..cbebcca19 --- /dev/null +++ b/gitnexus-cli/src/server/api.ts @@ -0,0 +1,221 @@ +import express from 'express'; +import cors from 'cors'; +import path from 'path'; +import fs from 'fs/promises'; +import { listIndexedRepos, loadMeta } from '../storage/repo-manager.js'; +import { initKuzu, executeQuery } from '../core/kuzu/kuzu-adapter.js'; +import { NODE_TABLES } from '../core/kuzu/schema.js'; +import { GraphNode, GraphRelationship } from '../core/graph/types.js'; +import { loadBM25Index, searchBM25, isBM25Ready } from '../core/search/bm25-index.js'; +import { hybridSearch } from '../core/search/hybrid-search.js'; +import { semanticSearch } from '../core/embeddings/embedding-pipeline.js'; +import { isEmbedderReady } from '../core/embeddings/embedder.js'; +import { getRepoStoragePath } from '../storage/repo-manager.js'; + +const buildGraph = async (): Promise<{ nodes: GraphNode[]; relationships: GraphRelationship[] }> => { + const nodes: GraphNode[] = []; + for (const table of NODE_TABLES) { + try { + let query = ''; + if (table === 'File') { + query = `MATCH (n:File) RETURN n.id AS id, n.name AS name, n.filePath AS filePath, n.content AS content`; + } else if (table === 'Folder') { + query = `MATCH (n:Folder) RETURN n.id AS id, n.name AS name, n.filePath AS filePath`; + } else if (table === 'Community') { + query = `MATCH (n:Community) RETURN n.id AS id, n.label AS label, n.heuristicLabel AS heuristicLabel, n.cohesion AS cohesion, n.symbolCount AS symbolCount`; + } else if (table === 'Process') { + query = `MATCH (n:Process) RETURN n.id AS id, n.label AS label, n.heuristicLabel AS heuristicLabel, n.processType AS processType, n.stepCount AS stepCount, n.communities AS communities, n.entryPointId AS entryPointId, n.terminalId AS terminalId`; + } else { + query = `MATCH (n:${table}) RETURN n.id AS id, n.name AS name, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine, n.content AS content`; + } + + const rows = await executeQuery(query); + for (const row of rows) { + const id = row.id ?? row[0]; + const name = row.name ?? row.label ?? row[1]; + const filePath = row.filePath ?? row[2]; + const startLine = row.startLine ?? row[3]; + const endLine = row.endLine ?? row[4]; + const content = row.content ?? row[5]; + const heuristicLabel = row.heuristicLabel ?? row[2]; + const cohesion = row.cohesion ?? row[3]; + const symbolCount = row.symbolCount ?? row[4]; + const processType = row.processType ?? row[3]; + const stepCount = row.stepCount ?? row[4]; + const communities = row.communities ?? row[5]; + const entryPointId = row.entryPointId ?? row[6]; + const terminalId = row.terminalId ?? row[7]; + + nodes.push({ + id, + label: table as GraphNode['label'], + properties: { + name, + filePath, + startLine, + endLine, + content, + heuristicLabel, + cohesion, + symbolCount, + processType, + stepCount, + communities, + entryPointId, + terminalId, + } as GraphNode['properties'], + }); + } + } catch { + // ignore empty tables + } + } + + const relationships: GraphRelationship[] = []; + const relRows = await executeQuery( + `MATCH (a)-[r:CodeRelation]->(b) RETURN a.id AS sourceId, b.id AS targetId, r.type AS type, r.confidence AS confidence, r.reason AS reason, r.step AS step` + ); + for (const row of relRows) { + const sourceId = row.sourceId ?? row[0]; + const targetId = row.targetId ?? row[1]; + const type = row.type ?? row[2]; + const confidence = row.confidence ?? row[3]; + const reason = row.reason ?? row[4]; + const step = row.step ?? row[5]; + relationships.push({ + id: `${sourceId}_${type}_${targetId}`, + type, + sourceId, + targetId, + confidence, + reason, + step, + }); + } + + return { nodes, relationships }; +}; + +export const createServer = async (port: number) => { + const app = express(); + app.use(cors()); + app.use(express.json({ limit: '10mb' })); + + app.get('/api/repos', async (_req, res) => { + const repos = await listIndexedRepos(); + res.json({ + repos: repos.map((r) => ({ + id: r.id, + repoPath: r.meta.repoPath, + indexedAt: r.meta.indexedAt, + stats: r.meta.stats || {}, + })), + }); + }); + + app.get('/api/repos/:id/graph', async (req, res) => { + const storagePath = getRepoStoragePath(req.params.id); + const meta = await loadMeta(storagePath); + if (!meta) { + res.status(404).json({ error: 'Repository not indexed' }); + return; + } + await initKuzu(path.join(storagePath, 'kuzu')); + const graph = await buildGraph(); + res.json(graph); + }); + + app.get('/api/repos/:id/serialized', async (req, res) => { + const storagePath = getRepoStoragePath(req.params.id); + const meta = await loadMeta(storagePath); + if (!meta) { + res.status(404).json({ error: 'Repository not indexed' }); + return; + } + await initKuzu(path.join(storagePath, 'kuzu')); + const graph = await buildGraph(); + + const fileRows = await executeQuery(`MATCH (f:File) RETURN f.filePath AS path`); + const fileContents: Record = {}; + for (const row of fileRows) { + const relPath = row.path ?? row[0]; + try { + const fullPath = path.join(meta.repoPath, relPath); + const content = await fs.readFile(fullPath, 'utf-8'); + fileContents[relPath] = content; + } catch { + // ignore missing + } + } + + res.json({ nodes: graph.nodes, relationships: graph.relationships, fileContents }); + }); + + app.post('/api/repos/:id/query', async (req, res) => { + const storagePath = getRepoStoragePath(req.params.id); + const meta = await loadMeta(storagePath); + if (!meta) { + res.status(404).json({ error: 'Repository not indexed' }); + return; + } + await initKuzu(path.join(storagePath, 'kuzu')); + const result = await executeQuery(req.body.cypher); + res.json({ result }); + }); + + app.post('/api/repos/:id/search', async (req, res) => { + const storagePath = getRepoStoragePath(req.params.id); + const meta = await loadMeta(storagePath); + if (!meta) { + res.status(404).json({ error: 'Repository not indexed' }); + return; + } + await initKuzu(path.join(storagePath, 'kuzu')); + await loadBM25Index(path.join(storagePath, 'bm25.json')); + + const query = req.body.query ?? ''; + const limit = req.body.limit ?? 10; + + if (isBM25Ready() && isEmbedderReady()) { + const results = await hybridSearch(query, limit, executeQuery, semanticSearch); + res.json({ results }); + return; + } + + if (isBM25Ready()) { + const results = searchBM25(query, limit); + res.json({ results }); + return; + } + + if (isEmbedderReady()) { + const results = await semanticSearch(executeQuery, query, limit); + res.json({ results }); + return; + } + + res.json({ results: [] }); + }); + + app.get('/api/repos/:id/file', async (req, res) => { + const storagePath = getRepoStoragePath(req.params.id); + const meta = await loadMeta(storagePath); + if (!meta) { + res.status(404).json({ error: 'Repository not indexed' }); + return; + } + const filePath = req.query.path as string; + if (!filePath) { + res.status(400).json({ error: 'Missing path' }); + return; + } + const fullPath = path.join(meta.repoPath, filePath); + const content = await fs.readFile(fullPath, 'utf-8'); + res.json({ content }); + }); + + app.listen(port, () => { + console.log(`GitNexus server running on http://localhost:${port}`); + }); +}; + diff --git a/gitnexus-cli/src/storage/git.ts b/gitnexus-cli/src/storage/git.ts new file mode 100644 index 000000000..817b5717c --- /dev/null +++ b/gitnexus-cli/src/storage/git.ts @@ -0,0 +1,29 @@ +import { execSync } from 'child_process'; + +export const isGitRepo = (repoPath: string): boolean => { + try { + execSync('git rev-parse --is-inside-work-tree', { cwd: repoPath, stdio: 'ignore' }); + return true; + } catch { + return false; + } +}; + +export const getCurrentCommit = (repoPath: string): string => { + try { + return execSync('git rev-parse HEAD', { cwd: repoPath }).toString().trim(); + } catch { + return ''; + } +}; + +export const getStatusPorcelain = (repoPath: string): string => { + try { + return execSync('git status --porcelain', { cwd: repoPath }).toString(); + } catch { + return ''; + } +}; + + + diff --git a/gitnexus-cli/src/storage/repo-manager.ts b/gitnexus-cli/src/storage/repo-manager.ts new file mode 100644 index 000000000..a148c0fca --- /dev/null +++ b/gitnexus-cli/src/storage/repo-manager.ts @@ -0,0 +1,101 @@ +import fs from 'fs/promises'; +import path from 'path'; +import os from 'os'; +import crypto from 'crypto'; + +export interface RepoMeta { + repoPath: string; + lastCommit: string; + indexedAt: string; + stats?: { + files?: number; + nodes?: number; + edges?: number; + communities?: number; + processes?: number; + }; +} + +export interface IndexedRepo { + id: string; + storagePath: string; + kuzuPath: string; + bm25Path: string; + metaPath: string; + meta: RepoMeta; +} + +const getHomeDir = (): string => path.join(os.homedir(), '.gitnexus'); +const getReposDir = (): string => path.join(getHomeDir(), 'repos'); + +export const ensureRepoBase = async (): Promise => { + await fs.mkdir(getReposDir(), { recursive: true }); +}; + +export const hashRepoPath = (repoPath: string): string => { + const resolved = path.resolve(repoPath); + return crypto.createHash('sha256').update(resolved).digest('hex').slice(0, 12); +}; + +export const getRepoStoragePath = (repoPathOrHash: string): string => { + const hash = repoPathOrHash.length === 12 ? repoPathOrHash : hashRepoPath(repoPathOrHash); + return path.join(getReposDir(), hash); +}; + +export const loadMeta = async (storagePath: string): Promise => { + try { + const metaPath = path.join(storagePath, 'meta.json'); + const raw = await fs.readFile(metaPath, 'utf-8'); + return JSON.parse(raw) as RepoMeta; + } catch { + return null; + } +}; + +export const saveMeta = async (storagePath: string, meta: RepoMeta): Promise => { + await fs.mkdir(storagePath, { recursive: true }); + const metaPath = path.join(storagePath, 'meta.json'); + await fs.writeFile(metaPath, JSON.stringify(meta, null, 2), 'utf-8'); +}; + +export const listIndexedRepos = async (): Promise => { + await ensureRepoBase(); + const dirs = await fs.readdir(getReposDir(), { withFileTypes: true }); + const repos: IndexedRepo[] = []; + + for (const dir of dirs) { + if (!dir.isDirectory()) continue; + const id = dir.name; + const storagePath = path.join(getReposDir(), id); + const meta = await loadMeta(storagePath); + if (!meta) continue; + repos.push({ + id, + storagePath, + kuzuPath: path.join(storagePath, 'kuzu'), + bm25Path: path.join(storagePath, 'bm25.json'), + metaPath: path.join(storagePath, 'meta.json'), + meta, + }); + } + + return repos; +}; + +export const detectRepoByCwd = async (cwd: string): Promise => { + const repos = await listIndexedRepos(); + const cwdResolved = path.resolve(cwd); + const cwdLower = cwdResolved.toLowerCase(); + + for (const repo of repos) { + const repoPath = path.resolve(repo.meta.repoPath); + const repoLower = repoPath.toLowerCase(); + if (cwdLower.startsWith(repoLower) || repoLower.startsWith(cwdLower)) { + return repo; + } + } + return null; +}; + + + diff --git a/gitnexus-cli/src/types/pipeline.ts b/gitnexus-cli/src/types/pipeline.ts new file mode 100644 index 000000000..c8848d562 --- /dev/null +++ b/gitnexus-cli/src/types/pipeline.ts @@ -0,0 +1,56 @@ +import { GraphNode, GraphRelationship, KnowledgeGraph } from '../core/graph/types.js'; +import { CommunityDetectionResult } from '../core/ingestion/community-processor.js'; +import { ProcessDetectionResult } from '../core/ingestion/process-processor.js'; + +export type PipelinePhase = 'idle' | 'extracting' | 'structure' | 'parsing' | 'imports' | 'calls' | 'heritage' | 'communities' | 'processes' | 'enriching' | 'complete' | 'error'; + +export interface PipelineProgress { + phase: PipelinePhase; + percent: number; + message: string; + detail?: string; + stats?: { + filesProcessed: number; + totalFiles: number; + nodesCreated: number; + }; +} + +// Original result type (used internally in pipeline) +export interface PipelineResult { + graph: KnowledgeGraph; + fileContents: Map; + communityResult?: CommunityDetectionResult; + processResult?: ProcessDetectionResult; +} + +// Serializable version for Web Worker communication +// Maps and functions cannot be transferred via postMessage +export interface SerializablePipelineResult { + nodes: GraphNode[]; + relationships: GraphRelationship[]; + fileContents: Record; // Object instead of Map +} + +// Helper to convert PipelineResult to serializable format +export const serializePipelineResult = (result: PipelineResult): SerializablePipelineResult => ({ + nodes: result.graph.nodes, + relationships: result.graph.relationships, + fileContents: Object.fromEntries(result.fileContents), +}); + +// Helper to reconstruct from serializable format (used in main thread) +export const deserializePipelineResult = ( + serialized: SerializablePipelineResult, + createGraph: () => KnowledgeGraph +): PipelineResult => { + const graph = createGraph(); + serialized.nodes.forEach(node => graph.addNode(node)); + serialized.relationships.forEach(rel => graph.addRelationship(rel)); + + return { + graph, + fileContents: new Map(Object.entries(serialized.fileContents)), + }; +}; + diff --git a/gitnexus-cli/tsconfig.json b/gitnexus-cli/tsconfig.json new file mode 100644 index 000000000..7fc8c33ce --- /dev/null +++ b/gitnexus-cli/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2022" + ], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "rootDir": "src", + "strict": false, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "types": [ + "node" + ] + }, + "include": [ + "src/**/*" + ] +} \ No newline at end of file diff --git a/gitnexus/src/App.tsx b/gitnexus/src/App.tsx index 1288e502c..646b6c97f 100644 --- a/gitnexus/src/App.tsx +++ b/gitnexus/src/App.tsx @@ -26,6 +26,7 @@ const AppContent = () => { isRightPanelOpen, runPipeline, runPipelineFromFiles, + loadSerializedGraph, isSettingsPanelOpen, setSettingsPanelOpen, refreshLLMSettings, @@ -42,6 +43,8 @@ const AppContent = () => { } = useAppState(); const [showClusteringModal, setShowClusteringModal] = useState(false); + const [localRepos, setLocalRepos] = useState>([]); + const [localAvailable, setLocalAvailable] = useState(false); // Trigger clustering modal after ingestion if not seen yet // DISABLED: Clustering is now in the upload flow @@ -188,6 +191,64 @@ const AppContent = () => { } }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipelineFromFiles, startEmbeddings, initializeAgent, runClusterEnrichment]); + useEffect(() => { + fetch('http://localhost:4747/api/repos') + .then((res) => res.json()) + .then((data) => { + if (data?.repos?.length) { + setLocalAvailable(true); + setLocalRepos(data.repos); + } + }) + .catch(() => { + setLocalAvailable(false); + }); + }, []); + + const handleOpenLocalRepo = useCallback(async (repoId: string, repoPath: string) => { + const project = repoPath.split('/').pop() || repoPath.split('\\').pop() || 'repository'; + setProjectName(project); + setProgress({ phase: 'extracting', percent: 0, message: 'Loading local repository...' }); + setViewMode('loading'); + + try { + const res = await fetch(`http://localhost:4747/api/repos/${repoId}/serialized`); + if (!res.ok) { + throw new Error(`Failed to fetch local repo: ${res.status}`); + } + const serialized = await res.json(); + const result = await loadSerializedGraph(serialized); + + setGraph(result.graph); + setFileContents(result.fileContents); + setViewMode('exploring'); + + if (getActiveProviderConfig()) { + initializeAgent(project); + } + + startEmbeddings().catch((err) => { + if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) { + startEmbeddings('wasm').catch(console.warn); + } else { + console.warn('Embeddings auto-start failed:', err); + } + }); + } catch (error) { + console.error('Local repo load error:', error); + setProgress({ + phase: 'error', + percent: 0, + message: 'Error loading local repository', + detail: error instanceof Error ? error.message : 'Unknown error', + }); + setTimeout(() => { + setViewMode('onboarding'); + setProgress(null); + }, 3000); + } + }, [setProjectName, setProgress, setViewMode, loadSerializedGraph, setGraph, setFileContents, initializeAgent, startEmbeddings]); + const handleFocusNode = useCallback((nodeId: string) => { graphCanvasRef.current?.focusNode(nodeId); }, []); @@ -201,7 +262,34 @@ const AppContent = () => { // Render based on view mode if (viewMode === 'onboarding') { - return ; + return ( +
+ {localAvailable && localRepos.length > 0 && ( +
+
Local GitNexus server detected
+
+ {localRepos.map((repo) => ( +
+
+
{repo.repoPath}
+
Indexed: {repo.indexedAt}
+
+ +
+ ))} +
+
+ )} +
+ +
+
+ ); } if (viewMode === 'loading' && progress) { diff --git a/gitnexus/src/components/SettingsPanel.tsx b/gitnexus/src/components/SettingsPanel.tsx index 85b8c068c..11bdcdb62 100644 --- a/gitnexus/src/components/SettingsPanel.tsx +++ b/gitnexus/src/components/SettingsPanel.tsx @@ -1,5 +1,5 @@ -import { useState, useEffect, useCallback } from 'react'; -import { X, Key, Server, Brain, Check, AlertCircle, Eye, EyeOff, RefreshCw, Sparkles } from 'lucide-react'; +import { useState, useEffect, useCallback, useRef, useMemo } from 'react'; +import { X, Key, Server, Brain, Check, AlertCircle, Eye, EyeOff, RefreshCw, Sparkles, ChevronDown, Loader2, Search } from 'lucide-react'; import { loadSettings, saveSettings, @@ -14,6 +14,175 @@ interface SettingsPanelProps { onSettingsSaved?: () => void; } +/** + * Searchable combobox for OpenRouter model selection + */ +interface OpenRouterModelComboboxProps { + value: string; + onChange: (model: string) => void; + models: Array<{ id: string; name: string }>; + isLoading: boolean; + onLoadModels: () => void; +} + +const OpenRouterModelCombobox = ({ value, onChange, models, isLoading, onLoadModels }: OpenRouterModelComboboxProps) => { + const [isOpen, setIsOpen] = useState(false); + const [searchTerm, setSearchTerm] = useState(''); + const inputRef = useRef(null); + const containerRef = useRef(null); + + // Filter models based on search term + const filteredModels = useMemo(() => { + if (!searchTerm.trim()) return models; + const lower = searchTerm.toLowerCase(); + return models.filter(m => + m.id.toLowerCase().includes(lower) || + m.name.toLowerCase().includes(lower) + ); + }, [models, searchTerm]); + + // Find display name for current value + const displayValue = useMemo(() => { + if (!value) return ''; + const found = models.find(m => m.id === value); + return found ? found.name : value; + }, [value, models]); + + // Close dropdown when clicking outside + useEffect(() => { + const handleClickOutside = (e: MouseEvent) => { + if (containerRef.current && !containerRef.current.contains(e.target as Node)) { + setIsOpen(false); + setSearchTerm(''); + } + }; + document.addEventListener('mousedown', handleClickOutside); + return () => document.removeEventListener('mousedown', handleClickOutside); + }, []); + + // Load models when opening + const handleOpen = () => { + setIsOpen(true); + if (models.length === 0 && !isLoading) { + onLoadModels(); + } + setTimeout(() => inputRef.current?.focus(), 10); + }; + + const handleSelect = (modelId: string) => { + onChange(modelId); + setIsOpen(false); + setSearchTerm(''); + }; + + const handleInputChange = (e: React.ChangeEvent) => { + const val = e.target.value; + setSearchTerm(val); + // Also allow direct typing of model ID + if (val && models.length === 0) { + onChange(val); + } + }; + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && searchTerm) { + // If exact match in filtered, select it; otherwise use raw input + const exact = filteredModels.find(m => m.id.toLowerCase() === searchTerm.toLowerCase()); + if (exact) { + handleSelect(exact.id); + } else if (filteredModels.length === 1) { + handleSelect(filteredModels[0].id); + } else { + // Allow custom model ID input + onChange(searchTerm); + setIsOpen(false); + setSearchTerm(''); + } + } else if (e.key === 'Escape') { + setIsOpen(false); + setSearchTerm(''); + } + }; + + return ( +
+ {/* Main input/button */} +
+ {isOpen ? ( + e.stopPropagation()} + /> + ) : ( + + {displayValue || 'Select or type a model...'} + + )} +
+ {isLoading && } + +
+
+ + {/* Dropdown */} + {isOpen && ( +
+ {isLoading ? ( +
+ + Loading models... +
+ ) : filteredModels.length === 0 ? ( +
+ {models.length === 0 ? ( +
+ +

Type a model ID or press Enter

+

e.g. openai/gpt-4o

+
+ ) : ( +
+

No models match "{searchTerm}"

+

Press Enter to use as custom ID

+
+ )} +
+ ) : ( +
+ {filteredModels.slice(0, 50).map(model => ( + + ))} + {filteredModels.length > 50 && ( +
+ +{filteredModels.length - 50} more • Refine your search +
+ )} +
+ )} +
+ )} +
+ ); +}; + /** * Check connection to local Ollama instance */ @@ -588,35 +757,16 @@ export const SettingsPanel = ({ isOpen, onClose, onSettingsSaved }: SettingsPane
- + models={openRouterModels} + isLoading={isLoadingModels} + onLoadModels={loadOpenRouterModels} + />

Browse all models at{' '} ): string => { } // Special handling for Cypher queries - if ('query' in args && typeof args.query === 'string') { - return args.query; - } if ('cypher' in args && typeof args.cypher === 'string') { - // For execute_vector_cypher, show both the natural language query and cypher let result = ''; - if ('query' in args) { + if ('query' in args && typeof args.query === 'string') { result += `Search: "${args.query}"\n\n`; } result += args.cypher; return result; } + // Special handling for search/grep queries + if ('query' in args && typeof args.query === 'string') { + return args.query; + } + // For other tools, show as formatted JSON return JSON.stringify(args, null, 2); }; @@ -83,81 +83,23 @@ const getStatusDisplay = (status: ToolCallInfo['status']) => { */ const getToolDisplayName = (name: string): string => { const names: Record = { - // New consolidated tools + // Current 7-tool architecture 'search': '🔍 Search Code', - 'cypher': '🔍 Cypher Query', + 'cypher': '🔗 Cypher Query', 'grep': '🔎 Pattern Search', 'read': '📄 Read File', - 'highlight': '✨ Highlight in Graph', - // Legacy names (for backwards compatibility) - 'execute_cypher': '🔍 Cypher Query', - 'execute_vector_cypher': '🧠 Semantic + Graph Query', - 'highlight_in_graph': '✨ Highlight in Graph', - 'grep_code': '🔎 Pattern Search', - 'read_file': '📄 Read File', + 'overview': '🗺️ Codebase Overview', + 'explore': '🔬 Deep Dive', + 'impact': '💥 Impact Analysis', }; return names[name] || name; }; -/** - * Extract node IDs from highlight tool result - */ -const extractHighlightNodeIds = (result: string | undefined): string[] => { - if (!result) return []; - const match = result.match(/\[HIGHLIGHT_NODES:([^\]]+)\]/); - if (match) { - return match[1].split(',').map(id => id.trim()).filter(Boolean); - } - return []; -}; - export const ToolCallCard = ({ toolCall, defaultExpanded = false }: ToolCallCardProps) => { const [isExpanded, setIsExpanded] = useState(defaultExpanded); - const { highlightedNodeIds, setHighlightedNodeIds, graph } = useAppState(); const status = getStatusDisplay(toolCall.status); const formattedArgs = formatArgs(toolCall.args); - // Check if this is a highlight tool and extract node IDs - const isHighlightTool = toolCall.name === 'highlight_in_graph' || toolCall.name === 'highlight'; - const rawHighlightNodeIds = isHighlightTool ? extractHighlightNodeIds(toolCall.result) : []; - - // Resolve raw IDs to actual graph node IDs (handles partial ID matching) - const resolvedNodeIds = useMemo(() => { - if (rawHighlightNodeIds.length === 0 || !graph) return rawHighlightNodeIds; - - const graphNodeIds = graph.nodes.map(n => n.id); - const resolved: string[] = []; - - for (const rawId of rawHighlightNodeIds) { - if (graphNodeIds.includes(rawId)) { - resolved.push(rawId); - } else { - // Try partial match - find node whose ID ends with the raw ID - const found = graphNodeIds.find(gid => - gid.endsWith(rawId) || gid.endsWith(':' + rawId) - ); - if (found) resolved.push(found); - } - } - return resolved; - }, [rawHighlightNodeIds, graph]); - - // Check if these specific nodes are currently highlighted - const isHighlightActive = resolvedNodeIds.length > 0 && - resolvedNodeIds.some(id => highlightedNodeIds.has(id)); - - // Toggle highlight on/off - const toggleHighlight = useCallback((e: React.MouseEvent) => { - e.stopPropagation(); // Don't trigger expand/collapse - if (isHighlightActive) { - // Turn off - clear highlights - setHighlightedNodeIds(new Set()); - } else { - // Turn on - set these nodes as highlighted - setHighlightedNodeIds(new Set(resolvedNodeIds)); - } - }, [isHighlightActive, resolvedNodeIds, setHighlightedNodeIds]); - return (

{/* Header - always visible */} @@ -178,30 +120,6 @@ export const ToolCallCard = ({ toolCall, defaultExpanded = false }: ToolCallCard {getToolDisplayName(toolCall.name)} - {/* Highlight toggle button - only for highlight_in_graph tool with results */} - {isHighlightTool && resolvedNodeIds.length > 0 && ( - - )} - {/* Status indicator */} {status.icon} @@ -216,7 +134,7 @@ export const ToolCallCard = ({ toolCall, defaultExpanded = false }: ToolCallCard {formattedArgs && (
- {toolCall.name.includes('cypher') ? 'Query' : 'Input'} + {toolCall.name === 'cypher' ? 'Query' : 'Input'}
                 {formattedArgs}
@@ -255,4 +173,3 @@ export const ToolCallCard = ({ toolCall, defaultExpanded = false }: ToolCallCard
 };
 
 export default ToolCallCard;
-
diff --git a/gitnexus/src/core/llm/agent.ts b/gitnexus/src/core/llm/agent.ts
index cc0c752db..6649f5742 100644
--- a/gitnexus/src/core/llm/agent.ts
+++ b/gitnexus/src/core/llm/agent.ts
@@ -128,14 +128,20 @@ export const createChatModel = (config: ProviderConfig): BaseChatModel => {
   switch (config.provider) {
     case 'openai': {
       const openaiConfig = config as OpenAIConfig;
+      
+      if (!openaiConfig.apiKey || openaiConfig.apiKey.trim() === '') {
+        throw new Error('OpenAI API key is required but was not provided');
+      }
+      
       return new ChatOpenAI({
-        openAIApiKey: openaiConfig.apiKey,
+        apiKey: openaiConfig.apiKey,
         modelName: openaiConfig.model,
         temperature: openaiConfig.temperature ?? 0.1,
         maxTokens: openaiConfig.maxTokens,
-        configuration: openaiConfig.baseUrl ? {
-          baseURL: openaiConfig.baseUrl,
-        } : undefined,
+        configuration: {
+          apiKey: openaiConfig.apiKey,
+          ...(openaiConfig.baseUrl ? { baseURL: openaiConfig.baseUrl } : {}),
+        },
         streaming: true,
       });
     }
diff --git a/gitnexus/src/hooks/useAppState.tsx b/gitnexus/src/hooks/useAppState.tsx
index 720b92314..278140cc8 100644
--- a/gitnexus/src/hooks/useAppState.tsx
+++ b/gitnexus/src/hooks/useAppState.tsx
@@ -1,7 +1,7 @@
 import { createContext, useContext, useState, useCallback, useRef, useEffect, ReactNode } from 'react';
 import * as Comlink from 'comlink';
 import { KnowledgeGraph, GraphNode, NodeLabel } from '../core/graph/types';
-import { PipelineProgress, PipelineResult, deserializePipelineResult } from '../types/pipeline';
+import { PipelineProgress, PipelineResult, SerializablePipelineResult, deserializePipelineResult } from '../types/pipeline';
 import { createKnowledgeGraph } from '../core/graph/graph';
 import { DEFAULT_VISIBLE_LABELS } from '../lib/constants';
 import type { IngestionWorkerApi } from '../workers/ingestion.worker';
@@ -114,6 +114,7 @@ interface AppState {
   // Worker API (shared across app)
   runPipeline: (file: File, onProgress: (p: PipelineProgress) => void, clusteringConfig?: ProviderConfig) => Promise;
   runPipelineFromFiles: (files: FileEntry[], onProgress: (p: PipelineProgress) => void, clusteringConfig?: ProviderConfig) => Promise;
+  loadSerializedGraph: (serialized: SerializablePipelineResult) => Promise;
   runQuery: (cypher: string) => Promise;
   isDatabaseReady: () => Promise;
 
@@ -460,6 +461,15 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => {
     return deserializePipelineResult(serializedResult, createKnowledgeGraph);
   }, []);
 
+  const loadSerializedGraph = useCallback(async (
+    serialized: SerializablePipelineResult
+  ): Promise => {
+    const api = apiRef.current;
+    if (!api) throw new Error('Worker not initialized');
+    await api.loadSerializedGraph(serialized);
+    return deserializePipelineResult(serialized, createKnowledgeGraph);
+  }, []);
+
   const runQuery = useCallback(async (cypher: string): Promise => {
     const api = apiRef.current;
     if (!api) throw new Error('Worker not initialized');
@@ -1196,6 +1206,7 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => {
     setProjectName,
     runPipeline,
     runPipelineFromFiles,
+    loadSerializedGraph,
     runQuery,
     isDatabaseReady,
     // Embedding state and methods
diff --git a/gitnexus/src/workers/ingestion.worker.ts b/gitnexus/src/workers/ingestion.worker.ts
index c5fb407f2..863e8a699 100644
--- a/gitnexus/src/workers/ingestion.worker.ts
+++ b/gitnexus/src/workers/ingestion.worker.ts
@@ -1,6 +1,6 @@
 import * as Comlink from 'comlink';
 import { runIngestionPipeline, runPipelineFromFiles } from '../core/ingestion/pipeline';
-import { PipelineProgress, SerializablePipelineResult, serializePipelineResult } from '../types/pipeline';
+import { PipelineProgress, SerializablePipelineResult, serializePipelineResult, deserializePipelineResult } from '../types/pipeline';
 import { FileEntry } from '../services/zip';
 import {
   runEmbeddingPipeline,
@@ -25,6 +25,7 @@ import {
   mergeWithRRF,
   type HybridSearchResult,
 } from '../core/search';
+import { createKnowledgeGraph } from '../core/graph/graph';
 
 // Lazy import for Kuzu to avoid breaking worker if SharedArrayBuffer unavailable
 let kuzuAdapter: typeof import('../core/kuzu/kuzu-adapter') | null = null;
@@ -223,6 +224,31 @@ const workerApi = {
     return serializePipelineResult(result);
   },
 
+  /**
+   * Load a serialized graph result into the worker (for local CLI integration)
+   */
+  async loadSerializedGraph(serialized: SerializablePipelineResult): Promise {
+    const result = deserializePipelineResult(serialized, createKnowledgeGraph);
+    currentGraphResult = result;
+    storedFileContents = result.fileContents;
+
+    const bm25DocCount = buildBM25Index(storedFileContents);
+    if (import.meta.env.DEV) {
+      console.log(`🔍 BM25 index built: ${bm25DocCount} documents`);
+    }
+
+    try {
+      const kuzu = await getKuzuAdapter();
+      await kuzu.loadGraphToKuzu(result.graph, result.fileContents);
+      if (import.meta.env.DEV) {
+        const stats = await kuzu.getKuzuStats();
+        console.log('KuzuDB loaded from serialized graph:', stats);
+      }
+    } catch {
+      // KuzuDB is optional
+    }
+  },
+
   // ============================================================
   // Embedding Pipeline Methods
   // ============================================================

From fcbb6f9e92fe15d684594eec522bd01bfe5d0bc4 Mon Sep 17 00:00:00 2001
From: abhigyanpatwari 
Date: Tue, 3 Feb 2026 04:53:10 +0530
Subject: [PATCH 03/36] standalone MCP working

---
 .gitignore                               |   1 +
 ARCHITECTURE.md                          |   2 +
 ARCHITECTURE_QUICK_REF.md                |   2 +
 GITNEXUS_ANALYSIS.md                     |   2 +
 gitnexus-cli/src/cli/analyze.ts          |  45 +-
 gitnexus-cli/src/cli/clean.ts            | 102 +---
 gitnexus-cli/src/cli/list.ts             |  43 +-
 gitnexus-cli/src/cli/status.ts           |  31 +-
 gitnexus-cli/src/mcp/server.ts           |  25 +-
 gitnexus-cli/src/server/api.ts           | 165 ++---
 gitnexus-cli/src/storage/repo-manager.ts | 133 ++--
 gitnexus-mcp/package-lock.json           | 742 ++++++++++++++++++++++-
 gitnexus-mcp/package.json                |   2 +
 gitnexus-mcp/src/commands/serve.ts       |  32 +-
 gitnexus-mcp/src/core/bm25-index.ts      | 120 ++++
 gitnexus-mcp/src/core/kuzu-adapter.ts    |  54 ++
 gitnexus-mcp/src/local/local-backend.ts  | 589 ++++++++++++++++++
 gitnexus-mcp/src/mcp/tools.ts            |  98 +--
 gitnexus/src/App.tsx                     |  90 +--
 gitnexus/src/hooks/useAppState.tsx       |  13 +-
 gitnexus/src/workers/ingestion.worker.ts |  28 +-
 21 files changed, 1826 insertions(+), 493 deletions(-)
 create mode 100644 gitnexus-mcp/src/core/bm25-index.ts
 create mode 100644 gitnexus-mcp/src/core/kuzu-adapter.ts
 create mode 100644 gitnexus-mcp/src/local/local-backend.ts

diff --git a/.gitignore b/.gitignore
index 2f3659245..0d9b76fbb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,3 +40,4 @@ coverage/
 
 
 .env*.local
+.gitnexus
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 56cabebca..6b7f3144b 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -589,3 +589,5 @@ The design cleanly separates concerns across 7 layers, from symbolic math to num
 
 
 
+
+
diff --git a/ARCHITECTURE_QUICK_REF.md b/ARCHITECTURE_QUICK_REF.md
index bdd27a239..52066fcb1 100644
--- a/ARCHITECTURE_QUICK_REF.md
+++ b/ARCHITECTURE_QUICK_REF.md
@@ -380,3 +380,5 @@ model = pybamm.lithium_ion.DFN(
 
 
 
+
+
diff --git a/GITNEXUS_ANALYSIS.md b/GITNEXUS_ANALYSIS.md
index c9cd0b58e..49254ec50 100644
--- a/GITNEXUS_ANALYSIS.md
+++ b/GITNEXUS_ANALYSIS.md
@@ -379,3 +379,5 @@ Expression tree traversal:
 
 
 
+
+
diff --git a/gitnexus-cli/src/cli/analyze.ts b/gitnexus-cli/src/cli/analyze.ts
index 902a26bfd..b79303646 100644
--- a/gitnexus-cli/src/cli/analyze.ts
+++ b/gitnexus-cli/src/cli/analyze.ts
@@ -1,15 +1,26 @@
+/**
+ * Analyze Command
+ * 
+ * Indexes a repository and stores the knowledge graph in .gitnexus/
+ */
+
 import path from 'path';
 import ora from 'ora';
 import { runPipelineFromRepo } from '../core/ingestion/pipeline.js';
-import { initKuzu, loadGraphToKuzu, getKuzuStats, executeQuery, executeWithReusedStatement } from '../core/kuzu/kuzu-adapter.js';
+import { initKuzu, loadGraphToKuzu, getKuzuStats, executeQuery, executeWithReusedStatement, closeKuzu } from '../core/kuzu/kuzu-adapter.js';
 import { buildBM25Index, exportBM25Index } from '../core/search/bm25-index.js';
 import { runEmbeddingPipeline } from '../core/embeddings/embedding-pipeline.js';
-import { ensureRepoBase, getRepoStoragePath, saveMeta, loadMeta } from '../storage/repo-manager.js';
+import { getStoragePaths, saveMeta, loadMeta, addToGitignore } from '../storage/repo-manager.js';
 import { getCurrentCommit, isGitRepo } from '../storage/git.js';
 
+export interface AnalyzeOptions {
+  force?: boolean;
+  skipEmbeddings?: boolean;
+}
+
 export const analyzeCommand = async (
   inputPath?: string,
-  options?: { force?: boolean; skipEmbeddings?: boolean }
+  options?: AnalyzeOptions
 ) => {
   const repoPath = path.resolve(inputPath || '.');
   const spinner = ora('Checking repository...').start();
@@ -20,42 +31,45 @@ export const analyzeCommand = async (
     return;
   }
 
-  await ensureRepoBase();
-  const storagePath = getRepoStoragePath(repoPath);
-  const kuzuPath = path.join(storagePath, 'kuzu');
-  const bm25Path = path.join(storagePath, 'bm25.json');
-
+  const { storagePath, kuzuPath, bm25Path } = getStoragePaths(repoPath);
   const currentCommit = getCurrentCommit(repoPath);
   const existingMeta = await loadMeta(storagePath);
+
+  // Skip if already indexed at same commit
   if (existingMeta && !options?.force && existingMeta.lastCommit === currentCommit) {
     spinner.succeed('Repository already up to date');
     return;
   }
 
+  // Run ingestion pipeline
   spinner.text = 'Running ingestion pipeline...';
   const pipelineResult = await runPipelineFromRepo(repoPath, (progress) => {
     spinner.text = `${progress.phase}: ${progress.percent}%`;
   });
 
+  // Load graph into KuzuDB
   spinner.text = 'Loading graph into KuzuDB...';
   await initKuzu(kuzuPath);
   await loadGraphToKuzu(pipelineResult.graph, pipelineResult.fileContents, storagePath);
 
+  // Build BM25 search index
   spinner.text = 'Building BM25 index...';
   buildBM25Index(pipelineResult.fileContents);
   await exportBM25Index(bm25Path);
 
+  // Generate embeddings
   if (!options?.skipEmbeddings) {
     spinner.text = 'Generating embeddings...';
     await runEmbeddingPipeline(
       executeQuery,
       executeWithReusedStatement,
       (progress) => {
-        spinner.text = `embeddings: ${progress.percent}%`;
+        spinner.text = `Embeddings: ${progress.percent}%`;
       }
     );
   }
 
+  // Save metadata
   const stats = await getKuzuStats();
   await saveMeta(storagePath, {
     repoPath,
@@ -70,7 +84,14 @@ export const analyzeCommand = async (
     },
   });
 
-  spinner.succeed('Repository indexed successfully');
-  console.log(`Storage: ${storagePath}`);
-};
+  // Add .gitnexus to .gitignore
+  await addToGitignore(repoPath);
+  
+  // Close database
+  await closeKuzu();
 
+  spinner.succeed('Repository indexed successfully');
+  console.log(`  Path: ${repoPath}`);
+  console.log(`  Storage: ${storagePath}`);
+  console.log(`  Stats: ${stats.nodes} nodes, ${stats.edges} edges`);
+};
diff --git a/gitnexus-cli/src/cli/clean.ts b/gitnexus-cli/src/cli/clean.ts
index a9eb4eb2c..40214333f 100644
--- a/gitnexus-cli/src/cli/clean.ts
+++ b/gitnexus-cli/src/cli/clean.ts
@@ -1,90 +1,34 @@
+/**
+ * Clean Command
+ * 
+ * Removes the .gitnexus index from the current repository.
+ */
+
 import fs from 'fs/promises';
-import { listIndexedRepos, getRepoStoragePath, hashRepoPath } from '../storage/repo-manager.js';
+import { findRepo, getStoragePath } from '../storage/repo-manager.js';
 
-export const cleanCommand = async (target?: string, options?: { all?: boolean; force?: boolean }) => {
-  const repos = await listIndexedRepos();
-  
-  if (repos.length === 0) {
-    console.log('No indexed repositories found.');
+export const cleanCommand = async (options?: { force?: boolean }) => {
+  const cwd = process.cwd();
+  const repo = await findRepo(cwd);
+
+  if (!repo) {
+    console.log('No indexed repository found in this directory.');
     return;
   }
 
-  // Clean all repos
-  if (options?.all) {
-    if (!options.force) {
-      console.log(`⚠️  This will delete ${repos.length} indexed repository(ies):`);
-      repos.forEach(repo => {
-        const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath;
-        console.log(`   - ${repoName} (${repo.id})`);
-      });
-      console.log('\nRun with --force to confirm deletion.');
-      return;
-    }
+  const repoName = repo.repoPath.split(/[/\\]/).pop() || repo.repoPath;
 
-    for (const repo of repos) {
-      try {
-        await fs.rm(repo.storagePath, { recursive: true, force: true });
-        const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath;
-        console.log(`🗑️  Deleted: ${repoName} (${repo.id})`);
-      } catch (err) {
-        console.error(`Failed to delete ${repo.id}:`, err);
-      }
-    }
-    console.log(`\n✅ Cleaned ${repos.length} indexed repository(ies).`);
+  if (!options?.force) {
+    console.log(`⚠️  This will delete the GitNexus index for: ${repoName}`);
+    console.log(`   Path: ${repo.storagePath}`);
+    console.log('\nRun with --force to confirm deletion.');
     return;
   }
 
-  // Clean specific repo by ID or path
-  if (target) {
-    // Try to match by ID first
-    let repoToDelete = repos.find(r => r.id === target || r.id.startsWith(target));
-    
-    // If not found by ID, try to match by path
-    if (!repoToDelete) {
-      const targetLower = target.toLowerCase();
-      repoToDelete = repos.find(r => {
-        const repoPath = r.meta.repoPath.toLowerCase();
-        const repoName = repoPath.split(/[/\\]/).pop() || '';
-        return repoPath.includes(targetLower) || repoName === targetLower;
-      });
-    }
-
-    if (!repoToDelete) {
-      console.log(`❌ No indexed repository found matching: ${target}`);
-      console.log('\nAvailable repositories:');
-      repos.forEach(repo => {
-        const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath;
-        console.log(`   📁 ${repoName} (${repo.id})`);
-      });
-      return;
-    }
-
-    const repoName = repoToDelete.meta.repoPath.split(/[/\\]/).pop() || repoToDelete.meta.repoPath;
-    
-    if (!options?.force) {
-      console.log(`⚠️  This will delete the index for: ${repoName}`);
-      console.log(`   Path: ${repoToDelete.meta.repoPath}`);
-      console.log(`   ID: ${repoToDelete.id}`);
-      console.log('\nRun with --force to confirm deletion.');
-      return;
-    }
-
-    try {
-      await fs.rm(repoToDelete.storagePath, { recursive: true, force: true });
-      console.log(`🗑️  Deleted: ${repoName} (${repoToDelete.id})`);
-    } catch (err) {
-      console.error(`Failed to delete ${repoToDelete.id}:`, err);
-    }
-    return;
+  try {
+    await fs.rm(repo.storagePath, { recursive: true, force: true });
+    console.log(`🗑️  Deleted: ${repo.storagePath}`);
+  } catch (err) {
+    console.error('Failed to delete:', err);
   }
-
-  // No target specified - show usage
-  console.log('Usage:');
-  console.log('  gitnexus clean  [--force]  Delete a specific repo');
-  console.log('  gitnexus clean --all [--force]         Delete all indexed repos');
-  console.log('\nIndexed repositories:');
-  repos.forEach(repo => {
-    const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath;
-    console.log(`   📁 ${repoName} (${repo.id})`);
-  });
 };
diff --git a/gitnexus-cli/src/cli/list.ts b/gitnexus-cli/src/cli/list.ts
index 136fa9ff3..c034e68cb 100644
--- a/gitnexus-cli/src/cli/list.ts
+++ b/gitnexus-cli/src/cli/list.ts
@@ -1,24 +1,31 @@
-import { listIndexedRepos } from '../storage/repo-manager.js';
+/**
+ * List Command
+ * 
+ * Shows info about the indexed repo in the current directory.
+ */
+
+import path from 'path';
+import { findRepo } from '../storage/repo-manager.js';
 
 export const listCommand = async () => {
-  const repos = await listIndexedRepos();
-  if (repos.length === 0) {
-    console.log('No indexed repositories found.');
+  const cwd = process.cwd();
+  const repo = await findRepo(cwd);
+
+  if (!repo) {
+    console.log('No indexed repository found in this directory.');
+    console.log('Run `gitnexus analyze` to index your codebase.');
     return;
   }
 
-  repos.forEach((repo, index) => {
-    const stats = repo.meta.stats || {};
-    const repoName = repo.meta.repoPath.split(/[/\\]/).pop() || repo.meta.repoPath;
-    const indexedDate = new Date(repo.meta.indexedAt).toLocaleString();
-    
-    console.log(`\n📁 ${repoName}`);
-    console.log(`   Path: ${repo.meta.repoPath}`);
-    console.log(`   Indexed: ${indexedDate}`);
-    console.log(`   Stats: ${stats.files ?? 0} files, ${stats.nodes ?? 0} nodes, ${stats.edges ?? 0} edges`);
-    console.log(`   Commit: ${repo.meta.lastCommit?.slice(0, 7) || 'unknown'}  (id: ${repo.id})`);
-  });
+  const stats = repo.meta.stats || {};
+  const repoName = repo.repoPath.split(/[/\\]/).pop() || repo.repoPath;
+  const indexedDate = new Date(repo.meta.indexedAt).toLocaleString();
+
+  console.log(`\n📁 ${repoName}`);
+  console.log(`   Path: ${repo.repoPath}`);
+  console.log(`   Indexed: ${indexedDate}`);
+  console.log(`   Stats: ${stats.files ?? 0} files, ${stats.nodes ?? 0} nodes, ${stats.edges ?? 0} edges`);
+  console.log(`   Commit: ${repo.meta.lastCommit?.slice(0, 7) || 'unknown'}`);
+  if (stats.communities) console.log(`   Communities: ${stats.communities}`);
+  if (stats.processes) console.log(`   Processes: ${stats.processes}`);
 };
-
-
-
diff --git a/gitnexus-cli/src/cli/status.ts b/gitnexus-cli/src/cli/status.ts
index 5c7363530..314e6f062 100644
--- a/gitnexus-cli/src/cli/status.ts
+++ b/gitnexus-cli/src/cli/status.ts
@@ -1,28 +1,33 @@
-import { detectRepoByCwd } from '../storage/repo-manager.js';
+/**
+ * Status Command
+ * 
+ * Shows the indexing status of the current repository.
+ */
+
+import { findRepo } from '../storage/repo-manager.js';
 import { getCurrentCommit, isGitRepo } from '../storage/git.js';
 
 export const statusCommand = async () => {
   const cwd = process.cwd();
+  
   if (!isGitRepo(cwd)) {
     console.log('Not a git repository.');
     return;
   }
 
-  const repo = await detectRepoByCwd(cwd);
+  const repo = await findRepo(cwd);
   if (!repo) {
-    console.log('Repository not indexed. Run: gitnexus analyze');
+    console.log('Repository not indexed.');
+    console.log('Run: gitnexus analyze');
     return;
   }
 
-  const current = getCurrentCommit(repo.meta.repoPath);
-  const upToDate = current && current === repo.meta.lastCommit;
+  const currentCommit = getCurrentCommit(repo.repoPath);
+  const isUpToDate = currentCommit === repo.meta.lastCommit;
 
-  console.log(`Repo: ${repo.meta.repoPath}`);
-  console.log(`Indexed at: ${repo.meta.indexedAt}`);
-  console.log(`Last commit indexed: ${repo.meta.lastCommit}`);
-  console.log(`Current commit: ${current}`);
-  console.log(`Status: ${upToDate ? 'up-to-date' : 'stale'}`);
+  console.log(`Repository: ${repo.repoPath}`);
+  console.log(`Indexed: ${new Date(repo.meta.indexedAt).toLocaleString()}`);
+  console.log(`Indexed commit: ${repo.meta.lastCommit?.slice(0, 7)}`);
+  console.log(`Current commit: ${currentCommit?.slice(0, 7)}`);
+  console.log(`Status: ${isUpToDate ? '✅ up-to-date' : '⚠️ stale (re-run gitnexus analyze)'}`);
 };
-
-
-
diff --git a/gitnexus-cli/src/mcp/server.ts b/gitnexus-cli/src/mcp/server.ts
index fbfbe2a9e..9c59776ba 100644
--- a/gitnexus-cli/src/mcp/server.ts
+++ b/gitnexus-cli/src/mcp/server.ts
@@ -1,3 +1,9 @@
+/**
+ * CLI MCP Server
+ * 
+ * Standalone MCP server that uses local .gitnexus/ index.
+ */
+
 import path from 'path';
 import fs from 'fs/promises';
 import { Server } from '@modelcontextprotocol/sdk/server/index.js';
@@ -9,7 +15,7 @@ import {
   ReadResourceRequestSchema,
 } from '@modelcontextprotocol/sdk/types.js';
 import { GITNEXUS_TOOLS } from './tools.js';
-import { detectRepoByCwd, loadMeta } from '../storage/repo-manager.js';
+import { findRepo } from '../storage/repo-manager.js';
 import { initKuzu, executeQuery } from '../core/kuzu/kuzu-adapter.js';
 import { loadBM25Index, isBM25Ready, searchBM25 } from '../core/search/bm25-index.js';
 import { hybridSearch } from '../core/search/hybrid-search.js';
@@ -51,7 +57,7 @@ export const startMCPServer = async () => {
   );
 
   server.setRequestHandler(ListResourcesRequestSchema, async () => {
-    const repo = await detectRepoByCwd(process.cwd());
+    const repo = await findRepo(process.cwd());
     if (!repo) return { resources: [] };
     return {
       resources: [
@@ -69,7 +75,7 @@ export const startMCPServer = async () => {
     if (request.params.uri !== 'gitnexus://context') {
       throw new Error(`Unknown resource: ${request.params.uri}`);
     }
-    const repo = await detectRepoByCwd(process.cwd());
+    const repo = await findRepo(process.cwd());
     if (!repo) {
       return {
         contents: [
@@ -101,7 +107,7 @@ export const startMCPServer = async () => {
   }));
 
   server.setRequestHandler(CallToolRequestSchema, async (request) => {
-    const repo = await detectRepoByCwd(process.cwd());
+    const repo = await findRepo(process.cwd());
     if (!repo) {
       return {
         content: [{ type: 'text', text: notIndexedMessage(process.cwd()) }],
@@ -147,14 +153,7 @@ export const startMCPServer = async () => {
           isError: true,
         };
       }
-      const meta = await loadMeta(repo.storagePath);
-      if (!meta) {
-        return {
-          content: [{ type: 'text', text: notIndexedMessage(process.cwd()) }],
-          isError: true,
-        };
-      }
-      const fullPath = path.join(meta.repoPath, String(filePath));
+      const fullPath = path.join(repo.repoPath, String(filePath));
       const content = await fs.readFile(fullPath, 'utf-8');
       return { content: [{ type: 'text', text: content }] };
     }
@@ -174,5 +173,3 @@ export const startMCPServer = async () => {
   const transport = new StdioServerTransport();
   await server.connect(transport);
 };
-
-
diff --git a/gitnexus-cli/src/server/api.ts b/gitnexus-cli/src/server/api.ts
index cbebcca19..caa2c4fb8 100644
--- a/gitnexus-cli/src/server/api.ts
+++ b/gitnexus-cli/src/server/api.ts
@@ -1,8 +1,14 @@
+/**
+ * HTTP API Server
+ * 
+ * REST API for browser-based clients to query the local .gitnexus/ index.
+ */
+
 import express from 'express';
 import cors from 'cors';
 import path from 'path';
 import fs from 'fs/promises';
-import { listIndexedRepos, loadMeta } from '../storage/repo-manager.js';
+import { findRepo, loadMeta } from '../storage/repo-manager.js';
 import { initKuzu, executeQuery } from '../core/kuzu/kuzu-adapter.js';
 import { NODE_TABLES } from '../core/kuzu/schema.js';
 import { GraphNode, GraphRelationship } from '../core/graph/types.js';
@@ -10,7 +16,6 @@ import { loadBM25Index, searchBM25, isBM25Ready } from '../core/search/bm25-inde
 import { hybridSearch } from '../core/search/hybrid-search.js';
 import { semanticSearch } from '../core/embeddings/embedding-pipeline.js';
 import { isEmbedderReady } from '../core/embeddings/embedder.js';
-import { getRepoStoragePath } from '../storage/repo-manager.js';
 
 const buildGraph = async (): Promise<{ nodes: GraphNode[]; relationships: GraphRelationship[] }> => {
   const nodes: GraphNode[] = [];
@@ -31,38 +36,23 @@ const buildGraph = async (): Promise<{ nodes: GraphNode[]; relationships: GraphR
 
       const rows = await executeQuery(query);
       for (const row of rows) {
-        const id = row.id ?? row[0];
-        const name = row.name ?? row.label ?? row[1];
-        const filePath = row.filePath ?? row[2];
-        const startLine = row.startLine ?? row[3];
-        const endLine = row.endLine ?? row[4];
-        const content = row.content ?? row[5];
-        const heuristicLabel = row.heuristicLabel ?? row[2];
-        const cohesion = row.cohesion ?? row[3];
-        const symbolCount = row.symbolCount ?? row[4];
-        const processType = row.processType ?? row[3];
-        const stepCount = row.stepCount ?? row[4];
-        const communities = row.communities ?? row[5];
-        const entryPointId = row.entryPointId ?? row[6];
-        const terminalId = row.terminalId ?? row[7];
-
         nodes.push({
-          id,
+          id: row.id ?? row[0],
           label: table as GraphNode['label'],
           properties: {
-            name,
-            filePath,
-            startLine,
-            endLine,
-            content,
-            heuristicLabel,
-            cohesion,
-            symbolCount,
-            processType,
-            stepCount,
-            communities,
-            entryPointId,
-            terminalId,
+            name: row.name ?? row.label ?? row[1],
+            filePath: row.filePath ?? row[2],
+            startLine: row.startLine,
+            endLine: row.endLine,
+            content: row.content,
+            heuristicLabel: row.heuristicLabel,
+            cohesion: row.cohesion,
+            symbolCount: row.symbolCount,
+            processType: row.processType,
+            stepCount: row.stepCount,
+            communities: row.communities,
+            entryPointId: row.entryPointId,
+            terminalId: row.terminalId,
           } as GraphNode['properties'],
         });
       }
@@ -76,20 +66,14 @@ const buildGraph = async (): Promise<{ nodes: GraphNode[]; relationships: GraphR
     `MATCH (a)-[r:CodeRelation]->(b) RETURN a.id AS sourceId, b.id AS targetId, r.type AS type, r.confidence AS confidence, r.reason AS reason, r.step AS step`
   );
   for (const row of relRows) {
-    const sourceId = row.sourceId ?? row[0];
-    const targetId = row.targetId ?? row[1];
-    const type = row.type ?? row[2];
-    const confidence = row.confidence ?? row[3];
-    const reason = row.reason ?? row[4];
-    const step = row.step ?? row[5];
     relationships.push({
-      id: `${sourceId}_${type}_${targetId}`,
-      type,
-      sourceId,
-      targetId,
-      confidence,
-      reason,
-      step,
+      id: `${row.sourceId}_${row.type}_${row.targetId}`,
+      type: row.type,
+      sourceId: row.sourceId,
+      targetId: row.targetId,
+      confidence: row.confidence,
+      reason: row.reason,
+      step: row.step,
     });
   }
 
@@ -101,77 +85,53 @@ export const createServer = async (port: number) => {
   app.use(cors());
   app.use(express.json({ limit: '10mb' }));
 
-  app.get('/api/repos', async (_req, res) => {
-    const repos = await listIndexedRepos();
+  // Get repo info
+  app.get('/api/repo', async (_req, res) => {
+    const repo = await findRepo(process.cwd());
+    if (!repo) {
+      res.status(404).json({ error: 'Repository not indexed. Run: gitnexus analyze' });
+      return;
+    }
     res.json({
-      repos: repos.map((r) => ({
-        id: r.id,
-        repoPath: r.meta.repoPath,
-        indexedAt: r.meta.indexedAt,
-        stats: r.meta.stats || {},
-      })),
+      repoPath: repo.repoPath,
+      indexedAt: repo.meta.indexedAt,
+      stats: repo.meta.stats || {},
     });
   });
 
-  app.get('/api/repos/:id/graph', async (req, res) => {
-    const storagePath = getRepoStoragePath(req.params.id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) {
+  // Get full graph
+  app.get('/api/graph', async (_req, res) => {
+    const repo = await findRepo(process.cwd());
+    if (!repo) {
       res.status(404).json({ error: 'Repository not indexed' });
       return;
     }
-    await initKuzu(path.join(storagePath, 'kuzu'));
+    await initKuzu(repo.kuzuPath);
     const graph = await buildGraph();
     res.json(graph);
   });
 
-  app.get('/api/repos/:id/serialized', async (req, res) => {
-    const storagePath = getRepoStoragePath(req.params.id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) {
+  // Execute Cypher query
+  app.post('/api/query', async (req, res) => {
+    const repo = await findRepo(process.cwd());
+    if (!repo) {
       res.status(404).json({ error: 'Repository not indexed' });
       return;
     }
-    await initKuzu(path.join(storagePath, 'kuzu'));
-    const graph = await buildGraph();
-
-    const fileRows = await executeQuery(`MATCH (f:File) RETURN f.filePath AS path`);
-    const fileContents: Record = {};
-    for (const row of fileRows) {
-      const relPath = row.path ?? row[0];
-      try {
-        const fullPath = path.join(meta.repoPath, relPath);
-        const content = await fs.readFile(fullPath, 'utf-8');
-        fileContents[relPath] = content;
-      } catch {
-        // ignore missing
-      }
-    }
-
-    res.json({ nodes: graph.nodes, relationships: graph.relationships, fileContents });
-  });
-
-  app.post('/api/repos/:id/query', async (req, res) => {
-    const storagePath = getRepoStoragePath(req.params.id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) {
-      res.status(404).json({ error: 'Repository not indexed' });
-      return;
-    }
-    await initKuzu(path.join(storagePath, 'kuzu'));
+    await initKuzu(repo.kuzuPath);
     const result = await executeQuery(req.body.cypher);
     res.json({ result });
   });
 
-  app.post('/api/repos/:id/search', async (req, res) => {
-    const storagePath = getRepoStoragePath(req.params.id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) {
+  // Search
+  app.post('/api/search', async (req, res) => {
+    const repo = await findRepo(process.cwd());
+    if (!repo) {
       res.status(404).json({ error: 'Repository not indexed' });
       return;
     }
-    await initKuzu(path.join(storagePath, 'kuzu'));
-    await loadBM25Index(path.join(storagePath, 'bm25.json'));
+    await initKuzu(repo.kuzuPath);
+    await loadBM25Index(repo.bm25Path);
 
     const query = req.body.query ?? '';
     const limit = req.body.limit ?? 10;
@@ -183,24 +143,22 @@ export const createServer = async (port: number) => {
     }
 
     if (isBM25Ready()) {
-      const results = searchBM25(query, limit);
-      res.json({ results });
+      res.json({ results: searchBM25(query, limit) });
       return;
     }
 
     if (isEmbedderReady()) {
-      const results = await semanticSearch(executeQuery, query, limit);
-      res.json({ results });
+      res.json({ results: await semanticSearch(executeQuery, query, limit) });
       return;
     }
 
     res.json({ results: [] });
   });
 
-  app.get('/api/repos/:id/file', async (req, res) => {
-    const storagePath = getRepoStoragePath(req.params.id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) {
+  // Read file
+  app.get('/api/file', async (req, res) => {
+    const repo = await findRepo(process.cwd());
+    if (!repo) {
       res.status(404).json({ error: 'Repository not indexed' });
       return;
     }
@@ -209,7 +167,7 @@ export const createServer = async (port: number) => {
       res.status(400).json({ error: 'Missing path' });
       return;
     }
-    const fullPath = path.join(meta.repoPath, filePath);
+    const fullPath = path.join(repo.repoPath, filePath);
     const content = await fs.readFile(fullPath, 'utf-8');
     res.json({ content });
   });
@@ -218,4 +176,3 @@ export const createServer = async (port: number) => {
     console.log(`GitNexus server running on http://localhost:${port}`);
   });
 };
-
diff --git a/gitnexus-cli/src/storage/repo-manager.ts b/gitnexus-cli/src/storage/repo-manager.ts
index a148c0fca..81b47ce3c 100644
--- a/gitnexus-cli/src/storage/repo-manager.ts
+++ b/gitnexus-cli/src/storage/repo-manager.ts
@@ -1,7 +1,11 @@
+/**
+ * Repository Manager
+ * 
+ * Manages GitNexus index storage in .gitnexus/ at repo root.
+ */
+
 import fs from 'fs/promises';
 import path from 'path';
-import os from 'os';
-import crypto from 'crypto';
 
 export interface RepoMeta {
   repoPath: string;
@@ -17,7 +21,7 @@ export interface RepoMeta {
 }
 
 export interface IndexedRepo {
-  id: string;
+  repoPath: string;
   storagePath: string;
   kuzuPath: string;
   bm25Path: string;
@@ -25,23 +29,31 @@ export interface IndexedRepo {
   meta: RepoMeta;
 }
 
-const getHomeDir = (): string => path.join(os.homedir(), '.gitnexus');
-const getReposDir = (): string => path.join(getHomeDir(), 'repos');
+const GITNEXUS_DIR = '.gitnexus';
 
-export const ensureRepoBase = async (): Promise => {
-  await fs.mkdir(getReposDir(), { recursive: true });
+/**
+ * Get the .gitnexus storage path for a repository
+ */
+export const getStoragePath = (repoPath: string): string => {
+  return path.join(path.resolve(repoPath), GITNEXUS_DIR);
 };
 
-export const hashRepoPath = (repoPath: string): string => {
-  const resolved = path.resolve(repoPath);
-  return crypto.createHash('sha256').update(resolved).digest('hex').slice(0, 12);
-};
-
-export const getRepoStoragePath = (repoPathOrHash: string): string => {
-  const hash = repoPathOrHash.length === 12 ? repoPathOrHash : hashRepoPath(repoPathOrHash);
-  return path.join(getReposDir(), hash);
+/**
+ * Get paths to key storage files
+ */
+export const getStoragePaths = (repoPath: string) => {
+  const storagePath = getStoragePath(repoPath);
+  return {
+    storagePath,
+    kuzuPath: path.join(storagePath, 'kuzu'),
+    bm25Path: path.join(storagePath, 'bm25.json'),
+    metaPath: path.join(storagePath, 'meta.json'),
+  };
 };
 
+/**
+ * Load metadata from an indexed repo
+ */
 export const loadMeta = async (storagePath: string): Promise => {
   try {
     const metaPath = path.join(storagePath, 'meta.json');
@@ -52,50 +64,75 @@ export const loadMeta = async (storagePath: string): Promise =>
   }
 };
 
+/**
+ * Save metadata to storage
+ */
 export const saveMeta = async (storagePath: string, meta: RepoMeta): Promise => {
   await fs.mkdir(storagePath, { recursive: true });
   const metaPath = path.join(storagePath, 'meta.json');
   await fs.writeFile(metaPath, JSON.stringify(meta, null, 2), 'utf-8');
 };
 
-export const listIndexedRepos = async (): Promise => {
-  await ensureRepoBase();
-  const dirs = await fs.readdir(getReposDir(), { withFileTypes: true });
-  const repos: IndexedRepo[] = [];
-
-  for (const dir of dirs) {
-    if (!dir.isDirectory()) continue;
-    const id = dir.name;
-    const storagePath = path.join(getReposDir(), id);
-    const meta = await loadMeta(storagePath);
-    if (!meta) continue;
-    repos.push({
-      id,
-      storagePath,
-      kuzuPath: path.join(storagePath, 'kuzu'),
-      bm25Path: path.join(storagePath, 'bm25.json'),
-      metaPath: path.join(storagePath, 'meta.json'),
-      meta,
-    });
+/**
+ * Check if a path has a GitNexus index
+ */
+export const hasIndex = async (repoPath: string): Promise => {
+  const { metaPath } = getStoragePaths(repoPath);
+  try {
+    await fs.access(metaPath);
+    return true;
+  } catch {
+    return false;
   }
-
-  return repos;
 };
 
-export const detectRepoByCwd = async (cwd: string): Promise => {
-  const repos = await listIndexedRepos();
-  const cwdResolved = path.resolve(cwd);
-  const cwdLower = cwdResolved.toLowerCase();
+/**
+ * Load an indexed repo from a path
+ */
+export const loadRepo = async (repoPath: string): Promise => {
+  const paths = getStoragePaths(repoPath);
+  const meta = await loadMeta(paths.storagePath);
+  if (!meta) return null;
+  
+  return {
+    repoPath: path.resolve(repoPath),
+    ...paths,
+    meta,
+  };
+};
 
-  for (const repo of repos) {
-    const repoPath = path.resolve(repo.meta.repoPath);
-    const repoLower = repoPath.toLowerCase();
-    if (cwdLower.startsWith(repoLower) || repoLower.startsWith(cwdLower)) {
-      return repo;
-    }
+/**
+ * Find .gitnexus by walking up from a starting path
+ */
+export const findRepo = async (startPath: string): Promise => {
+  let current = path.resolve(startPath);
+  const root = path.parse(current).root;
+  
+  while (current !== root) {
+    const repo = await loadRepo(current);
+    if (repo) return repo;
+    current = path.dirname(current);
   }
+  
   return null;
 };
 
-
-
+/**
+ * Add .gitnexus to .gitignore if not already present
+ */
+export const addToGitignore = async (repoPath: string): Promise => {
+  const gitignorePath = path.join(repoPath, '.gitignore');
+  
+  try {
+    const content = await fs.readFile(gitignorePath, 'utf-8');
+    if (content.includes(GITNEXUS_DIR)) return;
+    
+    const newContent = content.endsWith('\n') 
+      ? `${content}${GITNEXUS_DIR}\n`
+      : `${content}\n${GITNEXUS_DIR}\n`;
+    await fs.writeFile(gitignorePath, newContent, 'utf-8');
+  } catch {
+    // .gitignore doesn't exist, create it
+    await fs.writeFile(gitignorePath, `${GITNEXUS_DIR}\n`, 'utf-8');
+  }
+};
diff --git a/gitnexus-mcp/package-lock.json b/gitnexus-mcp/package-lock.json
index 9798a4729..07821db63 100644
--- a/gitnexus-mcp/package-lock.json
+++ b/gitnexus-mcp/package-lock.json
@@ -1,15 +1,17 @@
 {
     "name": "gitnexus-mcp",
-    "version": "0.1.1",
+    "version": "0.2.0",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
             "name": "gitnexus-mcp",
-            "version": "0.1.1",
+            "version": "0.2.0",
             "license": "MIT",
             "dependencies": {
                 "@modelcontextprotocol/sdk": "^1.0.0",
+                "kuzu": "^0.11.0",
+                "minisearch": "^7.1.0",
                 "uuid": "^13.0.0",
                 "ws": "^8.16.0"
             },
@@ -593,6 +595,67 @@
                 }
             }
         },
+        "node_modules/ansi-regex": {
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+            "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/ansi-styles": {
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+            "license": "MIT",
+            "dependencies": {
+                "color-convert": "^2.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+            }
+        },
+        "node_modules/aproba": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
+            "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==",
+            "license": "ISC"
+        },
+        "node_modules/are-we-there-yet": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+            "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+            "deprecated": "This package is no longer supported.",
+            "license": "ISC",
+            "dependencies": {
+                "delegates": "^1.0.0",
+                "readable-stream": "^3.6.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/asynckit": {
+            "version": "0.4.0",
+            "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+            "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+            "license": "MIT"
+        },
+        "node_modules/axios": {
+            "version": "1.13.4",
+            "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz",
+            "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==",
+            "license": "MIT",
+            "dependencies": {
+                "follow-redirects": "^1.15.6",
+                "form-data": "^4.0.4",
+                "proxy-from-env": "^1.1.0"
+            }
+        },
         "node_modules/body-parser": {
             "version": "2.2.2",
             "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
@@ -655,6 +718,100 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/chownr": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+            "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+            "license": "ISC",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/cliui": {
+            "version": "8.0.1",
+            "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+            "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+            "license": "ISC",
+            "dependencies": {
+                "string-width": "^4.2.0",
+                "strip-ansi": "^6.0.1",
+                "wrap-ansi": "^7.0.0"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/cmake-js": {
+            "version": "7.4.0",
+            "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz",
+            "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==",
+            "license": "MIT",
+            "dependencies": {
+                "axios": "^1.6.5",
+                "debug": "^4",
+                "fs-extra": "^11.2.0",
+                "memory-stream": "^1.0.0",
+                "node-api-headers": "^1.1.0",
+                "npmlog": "^6.0.2",
+                "rc": "^1.2.7",
+                "semver": "^7.5.4",
+                "tar": "^6.2.0",
+                "url-join": "^4.0.1",
+                "which": "^2.0.2",
+                "yargs": "^17.7.2"
+            },
+            "bin": {
+                "cmake-js": "bin/cmake-js"
+            },
+            "engines": {
+                "node": ">= 14.15.0"
+            }
+        },
+        "node_modules/color-convert": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+            "license": "MIT",
+            "dependencies": {
+                "color-name": "~1.1.4"
+            },
+            "engines": {
+                "node": ">=7.0.0"
+            }
+        },
+        "node_modules/color-name": {
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+            "license": "MIT"
+        },
+        "node_modules/color-support": {
+            "version": "1.1.3",
+            "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+            "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+            "license": "ISC",
+            "bin": {
+                "color-support": "bin.js"
+            }
+        },
+        "node_modules/combined-stream": {
+            "version": "1.0.8",
+            "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+            "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+            "license": "MIT",
+            "dependencies": {
+                "delayed-stream": "~1.0.0"
+            },
+            "engines": {
+                "node": ">= 0.8"
+            }
+        },
+        "node_modules/console-control-strings": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+            "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+            "license": "ISC"
+        },
         "node_modules/content-disposition": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
@@ -739,6 +896,30 @@
                 }
             }
         },
+        "node_modules/deep-extend": {
+            "version": "0.6.0",
+            "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+            "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=4.0.0"
+            }
+        },
+        "node_modules/delayed-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+            "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.4.0"
+            }
+        },
+        "node_modules/delegates": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+            "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+            "license": "MIT"
+        },
         "node_modules/depd": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -768,6 +949,12 @@
             "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
             "license": "MIT"
         },
+        "node_modules/emoji-regex": {
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+            "license": "MIT"
+        },
         "node_modules/encodeurl": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -807,6 +994,21 @@
                 "node": ">= 0.4"
             }
         },
+        "node_modules/es-set-tostringtag": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+            "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+            "license": "MIT",
+            "dependencies": {
+                "es-errors": "^1.3.0",
+                "get-intrinsic": "^1.2.6",
+                "has-tostringtag": "^1.0.2",
+                "hasown": "^2.0.2"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            }
+        },
         "node_modules/esbuild": {
             "version": "0.27.2",
             "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz",
@@ -849,6 +1051,15 @@
                 "@esbuild/win32-x64": "0.27.2"
             }
         },
+        "node_modules/escalade": {
+            "version": "3.2.0",
+            "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+            "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=6"
+            }
+        },
         "node_modules/escape-html": {
             "version": "1.0.3",
             "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -986,6 +1197,63 @@
                 "url": "https://opencollective.com/express"
             }
         },
+        "node_modules/follow-redirects": {
+            "version": "1.15.11",
+            "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
+            "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
+            "funding": [
+                {
+                    "type": "individual",
+                    "url": "https://github.com/sponsors/RubenVerborgh"
+                }
+            ],
+            "license": "MIT",
+            "engines": {
+                "node": ">=4.0"
+            },
+            "peerDependenciesMeta": {
+                "debug": {
+                    "optional": true
+                }
+            }
+        },
+        "node_modules/form-data": {
+            "version": "4.0.5",
+            "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+            "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
+            "license": "MIT",
+            "dependencies": {
+                "asynckit": "^0.4.0",
+                "combined-stream": "^1.0.8",
+                "es-set-tostringtag": "^2.1.0",
+                "hasown": "^2.0.2",
+                "mime-types": "^2.1.12"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/form-data/node_modules/mime-db": {
+            "version": "1.52.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+            "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
+        "node_modules/form-data/node_modules/mime-types": {
+            "version": "2.1.35",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+            "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+            "license": "MIT",
+            "dependencies": {
+                "mime-db": "1.52.0"
+            },
+            "engines": {
+                "node": ">= 0.6"
+            }
+        },
         "node_modules/forwarded": {
             "version": "0.2.0",
             "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -1004,6 +1272,44 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/fs-extra": {
+            "version": "11.3.3",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+            "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
+            "license": "MIT",
+            "dependencies": {
+                "graceful-fs": "^4.2.0",
+                "jsonfile": "^6.0.1",
+                "universalify": "^2.0.0"
+            },
+            "engines": {
+                "node": ">=14.14"
+            }
+        },
+        "node_modules/fs-minipass": {
+            "version": "2.1.0",
+            "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+            "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+            "license": "ISC",
+            "dependencies": {
+                "minipass": "^3.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/fs-minipass/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "license": "ISC",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/fsevents": {
             "version": "2.3.3",
             "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -1028,6 +1334,35 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/gauge": {
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+            "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+            "deprecated": "This package is no longer supported.",
+            "license": "ISC",
+            "dependencies": {
+                "aproba": "^1.0.3 || ^2.0.0",
+                "color-support": "^1.1.3",
+                "console-control-strings": "^1.1.0",
+                "has-unicode": "^2.0.1",
+                "signal-exit": "^3.0.7",
+                "string-width": "^4.2.3",
+                "strip-ansi": "^6.0.1",
+                "wide-align": "^1.1.5"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
+        "node_modules/get-caller-file": {
+            "version": "2.0.5",
+            "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+            "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+            "license": "ISC",
+            "engines": {
+                "node": "6.* || 8.* || >= 10.*"
+            }
+        },
         "node_modules/get-intrinsic": {
             "version": "1.3.0",
             "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -1090,6 +1425,12 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/graceful-fs": {
+            "version": "4.2.11",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+            "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+            "license": "ISC"
+        },
         "node_modules/has-symbols": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
@@ -1102,6 +1443,27 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/has-tostringtag": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+            "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+            "license": "MIT",
+            "dependencies": {
+                "has-symbols": "^1.0.3"
+            },
+            "engines": {
+                "node": ">= 0.4"
+            },
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/has-unicode": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+            "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+            "license": "ISC"
+        },
         "node_modules/hasown": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -1166,6 +1528,12 @@
             "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
             "license": "ISC"
         },
+        "node_modules/ini": {
+            "version": "1.3.8",
+            "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+            "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+            "license": "ISC"
+        },
         "node_modules/ipaddr.js": {
             "version": "1.9.1",
             "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -1175,6 +1543,15 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/is-fullwidth-code-point": {
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=8"
+            }
+        },
         "node_modules/is-promise": {
             "version": "4.0.0",
             "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
@@ -1208,6 +1585,30 @@
             "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==",
             "license": "BSD-2-Clause"
         },
+        "node_modules/jsonfile": {
+            "version": "6.2.0",
+            "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+            "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
+            "license": "MIT",
+            "dependencies": {
+                "universalify": "^2.0.0"
+            },
+            "optionalDependencies": {
+                "graceful-fs": "^4.1.6"
+            }
+        },
+        "node_modules/kuzu": {
+            "version": "0.11.3",
+            "resolved": "https://registry.npmjs.org/kuzu/-/kuzu-0.11.3.tgz",
+            "integrity": "sha512-4+hD3Y+YMV3e0uiqTv1/GUal47D04l8qluw1WFWg8Nx3k7rLsHG1Pmq9WHIOlf1742svxQvTYQiuY6oS1qxAZA==",
+            "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+            "hasInstallScript": true,
+            "license": "MIT",
+            "dependencies": {
+                "cmake-js": "^7.3.0",
+                "node-addon-api": "^6.0.0"
+            }
+        },
         "node_modules/math-intrinsics": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -1226,6 +1627,15 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/memory-stream": {
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz",
+            "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==",
+            "license": "MIT",
+            "dependencies": {
+                "readable-stream": "^3.4.0"
+            }
+        },
         "node_modules/merge-descriptors": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
@@ -1263,6 +1673,67 @@
                 "url": "https://opencollective.com/express"
             }
         },
+        "node_modules/minimist": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+            "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+            "license": "MIT",
+            "funding": {
+                "url": "https://github.com/sponsors/ljharb"
+            }
+        },
+        "node_modules/minipass": {
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+            "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+            "license": "ISC",
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/minisearch": {
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
+            "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
+            "license": "MIT"
+        },
+        "node_modules/minizlib": {
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+            "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+            "license": "MIT",
+            "dependencies": {
+                "minipass": "^3.0.0",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">= 8"
+            }
+        },
+        "node_modules/minizlib/node_modules/minipass": {
+            "version": "3.3.6",
+            "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+            "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+            "license": "ISC",
+            "dependencies": {
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/mkdirp": {
+            "version": "1.0.4",
+            "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+            "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+            "license": "MIT",
+            "bin": {
+                "mkdirp": "bin/cmd.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/ms": {
             "version": "2.1.3",
             "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -1278,6 +1749,34 @@
                 "node": ">= 0.6"
             }
         },
+        "node_modules/node-addon-api": {
+            "version": "6.1.0",
+            "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+            "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==",
+            "license": "MIT"
+        },
+        "node_modules/node-api-headers": {
+            "version": "1.8.0",
+            "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz",
+            "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==",
+            "license": "MIT"
+        },
+        "node_modules/npmlog": {
+            "version": "6.0.2",
+            "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+            "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+            "deprecated": "This package is no longer supported.",
+            "license": "ISC",
+            "dependencies": {
+                "are-we-there-yet": "^3.0.0",
+                "console-control-strings": "^1.1.0",
+                "gauge": "^4.0.3",
+                "set-blocking": "^2.0.0"
+            },
+            "engines": {
+                "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+            }
+        },
         "node_modules/object-assign": {
             "version": "4.1.1",
             "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1370,6 +1869,12 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/proxy-from-env": {
+            "version": "1.1.0",
+            "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+            "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+            "license": "MIT"
+        },
         "node_modules/qs": {
             "version": "6.14.1",
             "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
@@ -1409,6 +1914,44 @@
                 "node": ">= 0.10"
             }
         },
+        "node_modules/rc": {
+            "version": "1.2.8",
+            "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+            "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+            "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+            "dependencies": {
+                "deep-extend": "^0.6.0",
+                "ini": "~1.3.0",
+                "minimist": "^1.2.0",
+                "strip-json-comments": "~2.0.1"
+            },
+            "bin": {
+                "rc": "cli.js"
+            }
+        },
+        "node_modules/readable-stream": {
+            "version": "3.6.2",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+            "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+            "license": "MIT",
+            "dependencies": {
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
+            },
+            "engines": {
+                "node": ">= 6"
+            }
+        },
+        "node_modules/require-directory": {
+            "version": "2.1.1",
+            "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+            "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
         "node_modules/require-from-string": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@@ -1444,12 +1987,44 @@
                 "node": ">= 18"
             }
         },
+        "node_modules/safe-buffer": {
+            "version": "5.2.1",
+            "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+            "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+            "funding": [
+                {
+                    "type": "github",
+                    "url": "https://github.com/sponsors/feross"
+                },
+                {
+                    "type": "patreon",
+                    "url": "https://www.patreon.com/feross"
+                },
+                {
+                    "type": "consulting",
+                    "url": "https://feross.org/support"
+                }
+            ],
+            "license": "MIT"
+        },
         "node_modules/safer-buffer": {
             "version": "2.1.2",
             "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
             "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
             "license": "MIT"
         },
+        "node_modules/semver": {
+            "version": "7.7.3",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+            "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+            "license": "ISC",
+            "bin": {
+                "semver": "bin/semver.js"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/send": {
             "version": "1.2.1",
             "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
@@ -1495,6 +2070,12 @@
                 "url": "https://opencollective.com/express"
             }
         },
+        "node_modules/set-blocking": {
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+            "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+            "license": "ISC"
+        },
         "node_modules/setprototypeof": {
             "version": "1.2.0",
             "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -1594,6 +2175,12 @@
                 "url": "https://github.com/sponsors/ljharb"
             }
         },
+        "node_modules/signal-exit": {
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+            "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+            "license": "ISC"
+        },
         "node_modules/statuses": {
             "version": "2.0.2",
             "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
@@ -1603,6 +2190,68 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/string_decoder": {
+            "version": "1.3.0",
+            "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+            "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+            "license": "MIT",
+            "dependencies": {
+                "safe-buffer": "~5.2.0"
+            }
+        },
+        "node_modules/string-width": {
+            "version": "4.2.3",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+            "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+            "license": "MIT",
+            "dependencies": {
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-ansi": {
+            "version": "6.0.1",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+            "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+            "license": "MIT",
+            "dependencies": {
+                "ansi-regex": "^5.0.1"
+            },
+            "engines": {
+                "node": ">=8"
+            }
+        },
+        "node_modules/strip-json-comments": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+            "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+            "license": "MIT",
+            "engines": {
+                "node": ">=0.10.0"
+            }
+        },
+        "node_modules/tar": {
+            "version": "6.2.1",
+            "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+            "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+            "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me",
+            "license": "ISC",
+            "dependencies": {
+                "chownr": "^2.0.0",
+                "fs-minipass": "^2.0.0",
+                "minipass": "^5.0.0",
+                "minizlib": "^2.1.1",
+                "mkdirp": "^1.0.3",
+                "yallist": "^4.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            }
+        },
         "node_modules/toidentifier": {
             "version": "1.0.1",
             "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -1667,6 +2316,15 @@
             "dev": true,
             "license": "MIT"
         },
+        "node_modules/universalify": {
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+            "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+            "license": "MIT",
+            "engines": {
+                "node": ">= 10.0.0"
+            }
+        },
         "node_modules/unpipe": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -1676,6 +2334,18 @@
                 "node": ">= 0.8"
             }
         },
+        "node_modules/url-join": {
+            "version": "4.0.1",
+            "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+            "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
+            "license": "MIT"
+        },
+        "node_modules/util-deprecate": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+            "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+            "license": "MIT"
+        },
         "node_modules/uuid": {
             "version": "13.0.0",
             "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz",
@@ -1713,6 +2383,32 @@
                 "node": ">= 8"
             }
         },
+        "node_modules/wide-align": {
+            "version": "1.1.5",
+            "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+            "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+            "license": "ISC",
+            "dependencies": {
+                "string-width": "^1.0.2 || 2 || 3 || 4"
+            }
+        },
+        "node_modules/wrap-ansi": {
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+            "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+            "license": "MIT",
+            "dependencies": {
+                "ansi-styles": "^4.0.0",
+                "string-width": "^4.1.0",
+                "strip-ansi": "^6.0.0"
+            },
+            "engines": {
+                "node": ">=10"
+            },
+            "funding": {
+                "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+            }
+        },
         "node_modules/wrappy": {
             "version": "1.0.2",
             "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -1740,6 +2436,48 @@
                 }
             }
         },
+        "node_modules/y18n": {
+            "version": "5.0.8",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+            "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+            "license": "ISC",
+            "engines": {
+                "node": ">=10"
+            }
+        },
+        "node_modules/yallist": {
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+            "license": "ISC"
+        },
+        "node_modules/yargs": {
+            "version": "17.7.2",
+            "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+            "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+            "license": "MIT",
+            "dependencies": {
+                "cliui": "^8.0.1",
+                "escalade": "^3.1.1",
+                "get-caller-file": "^2.0.5",
+                "require-directory": "^2.1.1",
+                "string-width": "^4.2.3",
+                "y18n": "^5.0.5",
+                "yargs-parser": "^21.1.1"
+            },
+            "engines": {
+                "node": ">=12"
+            }
+        },
+        "node_modules/yargs-parser": {
+            "version": "21.1.1",
+            "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+            "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+            "license": "ISC",
+            "engines": {
+                "node": ">=12"
+            }
+        },
         "node_modules/zod": {
             "version": "4.3.5",
             "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz",
diff --git a/gitnexus-mcp/package.json b/gitnexus-mcp/package.json
index 037571f93..782cfc19e 100644
--- a/gitnexus-mcp/package.json
+++ b/gitnexus-mcp/package.json
@@ -31,6 +31,8 @@
     },
     "dependencies": {
         "@modelcontextprotocol/sdk": "^1.0.0",
+        "kuzu": "^0.11.0",
+        "minisearch": "^7.1.0",
         "uuid": "^13.0.0",
         "ws": "^8.16.0"
     },
diff --git a/gitnexus-mcp/src/commands/serve.ts b/gitnexus-mcp/src/commands/serve.ts
index 524e40d60..97e13fc78 100644
--- a/gitnexus-mcp/src/commands/serve.ts
+++ b/gitnexus-mcp/src/commands/serve.ts
@@ -1,13 +1,14 @@
 /**
  * Serve Command
  * 
- * Starts the MCP server that bridges external AI agents to GitNexus.
- * - Listens on stdio for MCP protocol (from AI tools)
- * - Hosts a local WebSocket bridge for the GitNexus browser app
+ * Starts the MCP server with hybrid mode:
+ * 1. First tries local .gitnexus/ index (standalone mode)
+ * 2. Falls back to WebSocket bridge if browser is running
  */
 
 import { startMCPServer } from '../mcp/server.js';
 import { WebSocketBridge } from '../bridge/websocket-server.js';
+import { LocalBackend } from '../local/local-backend.js';
 
 interface ServeOptions {
   port: string;
@@ -15,17 +16,30 @@ interface ServeOptions {
 
 export async function serveCommand(options: ServeOptions) {
   const port = parseInt(options.port, 10);
+  // Use GITNEXUS_CWD env var if set, otherwise use process.cwd()
+  const cwd = process.env.GITNEXUS_CWD || process.cwd();
   
-  // Start local WebSocket bridge (browser connects to ws://localhost:)
-  const client = new WebSocketBridge(port);
-  const started = await client.start();
+  // Try local backend first (standalone mode)
+  const local = new LocalBackend();
+  const hasLocalIndex = await local.init(cwd);
+  
+  if (hasLocalIndex) {
+    console.error(`GitNexus: Using local index at ${local.storagePath}`);
+    await startMCPServer(local);
+    return;
+  }
+  
+  // No local index - fall back to browser bridge
+  console.error('GitNexus: No local .gitnexus/ found, starting browser bridge...');
+  
+  const bridge = new WebSocketBridge(port);
+  const started = await bridge.start();
 
   if (!started) {
     console.error(`Failed to start GitNexus browser bridge on port ${port}.`);
-    console.error('Another process is already using this port.');
+    console.error('Run "gitnexus analyze" to index this repository for standalone mode.');
     process.exit(1);
   }
   
-  // Start MCP server on stdio (AI tools connect here)
-  await startMCPServer(client);
+  await startMCPServer(bridge);
 }
diff --git a/gitnexus-mcp/src/core/bm25-index.ts b/gitnexus-mcp/src/core/bm25-index.ts
new file mode 100644
index 000000000..b13d6aebd
--- /dev/null
+++ b/gitnexus-mcp/src/core/bm25-index.ts
@@ -0,0 +1,120 @@
+/**
+ * BM25 Full-Text Search Index (Read-Only)
+ * 
+ * Uses MiniSearch for fast keyword-based search with BM25 ranking.
+ * For MCP, we only load and search - not build.
+ */
+
+import MiniSearch from 'minisearch';
+import fs from 'fs/promises';
+
+export interface BM25Document {
+  id: string;       // File path
+  content: string;  // File content
+  name: string;     // File name (boosted in search)
+}
+
+export interface BM25SearchResult {
+  filePath: string;
+  score: number;
+  rank: number;
+}
+
+let searchIndex: MiniSearch | null = null;
+let indexedDocCount = 0;
+
+/**
+ * Common stop words to filter out
+ */
+const STOP_WORDS = new Set([
+  'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while',
+  'class', 'new', 'this', 'import', 'export', 'from', 'default', 'async', 'await',
+  'try', 'catch', 'throw', 'typeof', 'instanceof', 'true', 'false', 'null', 'undefined',
+  'the', 'is', 'at', 'which', 'on', 'a', 'an', 'and', 'or', 'but', 'in', 'with',
+  'to', 'of', 'it', 'be', 'as', 'by', 'that', 'for', 'are', 'was', 'were',
+]);
+
+/**
+ * Tokenizer for BM25 search
+ */
+const tokenize = (text: string): string[] => {
+  const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/);
+  const expanded: string[] = [];
+  for (const token of tokens) {
+    if (token.length === 0) continue;
+    const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' ');
+    expanded.push(...camelParts);
+    if (camelParts.length > 1) {
+      expanded.push(token);
+    }
+  }
+  return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t));
+};
+
+/**
+ * Load a BM25 index from disk
+ */
+export const loadBM25Index = async (filePath: string): Promise => {
+  try {
+    const json = await fs.readFile(filePath, 'utf-8');
+    // MiniSearch.loadJSON expects the raw JSON string, not a parsed object
+    searchIndex = MiniSearch.loadJSON(json, {
+      fields: ['content', 'name'],
+      storeFields: ['id'],
+      tokenize,
+    });
+    indexedDocCount = searchIndex.documentCount;
+    return true;
+  } catch {
+    return false;
+  }
+};
+
+/**
+ * Search the BM25 index
+ */
+export const searchBM25 = (query: string, limit: number = 20): BM25SearchResult[] => {
+  if (!searchIndex) {
+    return [];
+  }
+  
+  const results = searchIndex.search(query, {
+    fuzzy: 0.2,
+    prefix: true,
+    boost: { name: 2 },
+  });
+  
+  return results.slice(0, limit).map((r, index) => ({
+    filePath: r.id,
+    score: r.score,
+    rank: index + 1,
+  }));
+};
+
+/**
+ * Check if the BM25 index is ready
+ */
+export const isBM25Ready = (): boolean => {
+  return searchIndex !== null && indexedDocCount > 0;
+};
+
+/**
+ * Get index statistics
+ */
+export const getBM25Stats = (): { documentCount: number; termCount: number } => {
+  if (!searchIndex) {
+    return { documentCount: 0, termCount: 0 };
+  }
+  return {
+    documentCount: indexedDocCount,
+    termCount: searchIndex.termCount,
+  };
+};
+
+/**
+ * Clear the index
+ */
+export const clearBM25Index = (): void => {
+  searchIndex = null;
+  indexedDocCount = 0;
+};
diff --git a/gitnexus-mcp/src/core/kuzu-adapter.ts b/gitnexus-mcp/src/core/kuzu-adapter.ts
new file mode 100644
index 000000000..80a063b05
--- /dev/null
+++ b/gitnexus-mcp/src/core/kuzu-adapter.ts
@@ -0,0 +1,54 @@
+/**
+ * KuzuDB Adapter (Read-Only)
+ * 
+ * Simplified adapter for MCP that only reads from existing .gitnexus/ database.
+ */
+
+import fs from 'fs/promises';
+import path from 'path';
+import kuzu from 'kuzu';
+
+let db: kuzu.Database | null = null;
+let conn: kuzu.Connection | null = null;
+
+export const initKuzu = async (dbPath: string): Promise => {
+  if (conn) return;
+
+  // Check if database exists
+  try {
+    await fs.stat(dbPath);
+  } catch {
+    throw new Error(`KuzuDB not found at ${dbPath}. Run: gitnexus analyze`);
+  }
+
+  db = new kuzu.Database(dbPath);
+  conn = new kuzu.Connection(db);
+};
+
+export const executeQuery = async (cypher: string): Promise => {
+  if (!conn) {
+    throw new Error('KuzuDB not initialized. Call initKuzu first.');
+  }
+
+  const queryResult = await conn.query(cypher);
+  const result = Array.isArray(queryResult) ? queryResult[0] : queryResult;
+  const rows = await result.getAll();
+  return rows;
+};
+
+export const closeKuzu = async (): Promise => {
+  if (conn) {
+    try {
+      await conn.close();
+    } catch {}
+    conn = null;
+  }
+  if (db) {
+    try {
+      await db.close();
+    } catch {}
+    db = null;
+  }
+};
+
+export const isKuzuReady = (): boolean => conn !== null && db !== null;
diff --git a/gitnexus-mcp/src/local/local-backend.ts b/gitnexus-mcp/src/local/local-backend.ts
new file mode 100644
index 000000000..0aa191dac
--- /dev/null
+++ b/gitnexus-mcp/src/local/local-backend.ts
@@ -0,0 +1,589 @@
+/**
+ * Local Backend
+ * 
+ * Provides tool implementations using local .gitnexus/ index.
+ * This enables MCP to work without the browser.
+ */
+
+import fs from 'fs/promises';
+import path from 'path';
+import { initKuzu, executeQuery, closeKuzu, isKuzuReady } from '../core/kuzu-adapter.js';
+import { loadBM25Index, searchBM25, isBM25Ready } from '../core/bm25-index.js';
+
+export interface RepoMeta {
+  repoPath: string;
+  lastCommit: string;
+  indexedAt: string;
+  stats?: {
+    files?: number;
+    nodes?: number;
+    edges?: number;
+    communities?: number;
+    processes?: number;
+  };
+}
+
+export interface IndexedRepo {
+  repoPath: string;
+  storagePath: string;
+  kuzuPath: string;
+  bm25Path: string;
+  metaPath: string;
+  meta: RepoMeta;
+}
+
+const GITNEXUS_DIR = '.gitnexus';
+
+function getStoragePaths(repoPath: string) {
+  const storagePath = path.join(path.resolve(repoPath), GITNEXUS_DIR);
+  return {
+    storagePath,
+    kuzuPath: path.join(storagePath, 'kuzu'),
+    bm25Path: path.join(storagePath, 'bm25.json'),
+    metaPath: path.join(storagePath, 'meta.json'),
+  };
+}
+
+async function loadMeta(storagePath: string): Promise {
+  try {
+    const metaPath = path.join(storagePath, 'meta.json');
+    const raw = await fs.readFile(metaPath, 'utf-8');
+    return JSON.parse(raw) as RepoMeta;
+  } catch {
+    return null;
+  }
+}
+
+async function loadRepo(repoPath: string): Promise {
+  const paths = getStoragePaths(repoPath);
+  const meta = await loadMeta(paths.storagePath);
+  if (!meta) return null;
+  
+  return {
+    repoPath: path.resolve(repoPath),
+    ...paths,
+    meta,
+  };
+}
+
+export async function findRepo(startPath: string): Promise {
+  let current = path.resolve(startPath);
+  const root = path.parse(current).root;
+  
+  while (current !== root) {
+    const repo = await loadRepo(current);
+    if (repo) return repo;
+    current = path.dirname(current);
+  }
+  
+  return null;
+}
+
+export interface CodebaseContext {
+  projectName: string;
+  stats: {
+    fileCount: number;
+    functionCount: number;
+    classCount: number;
+    interfaceCount: number;
+    methodCount: number;
+    communityCount: number;
+    processCount: number;
+  };
+  hotspots: Array<{
+    name: string;
+    type: string;
+    filePath: string;
+    connections: number;
+  }>;
+  folderTree: string;
+}
+
+export class LocalBackend {
+  private repo: IndexedRepo | null = null;
+  private _context: CodebaseContext | null = null;
+  private initialized = false;
+
+  async init(cwd: string): Promise {
+    this.repo = await findRepo(cwd);
+    if (!this.repo) return false;
+    
+    const stats = this.repo.meta.stats || {};
+    this._context = {
+      projectName: path.basename(this.repo.repoPath),
+      stats: {
+        fileCount: stats.files || 0,
+        functionCount: stats.nodes || 0,
+        classCount: 0,
+        interfaceCount: 0,
+        methodCount: 0,
+        communityCount: stats.communities || 0,
+        processCount: stats.processes || 0,
+      },
+      hotspots: [],
+      folderTree: '',
+    };
+    
+    return true;
+  }
+
+  private async ensureInitialized(): Promise {
+    if (this.initialized || !this.repo) return;
+    
+    await initKuzu(this.repo.kuzuPath);
+    await loadBM25Index(this.repo.bm25Path);
+    this.initialized = true;
+  }
+
+  get context(): CodebaseContext | null {
+    return this._context;
+  }
+
+  get isReady(): boolean {
+    return this.repo !== null;
+  }
+
+  get repoPath(): string | null {
+    return this.repo?.repoPath || null;
+  }
+
+  get storagePath(): string | null {
+    return this.repo?.storagePath || null;
+  }
+
+  async callTool(method: string, params: any): Promise {
+    if (!this.repo) {
+      throw new Error('Repository not indexed. Run: gitnexus analyze');
+    }
+
+    switch (method) {
+      case 'context':
+        return this.getContext();
+      case 'search':
+        return this.search(params);
+      case 'cypher':
+        return this.cypher(params);
+      case 'overview':
+        return this.overview(params);
+      case 'explore':
+        return this.explore(params);
+      case 'impact':
+        return this.impact(params);
+      case 'analyze':
+        return this.analyze(params);
+      default:
+        throw new Error(`Unknown tool: ${method}`);
+    }
+  }
+
+  private async getContext(): Promise {
+    if (!this._context || !this.repo) {
+      return 'Repository not indexed. Run: gitnexus analyze';
+    }
+
+    const stats = this.repo.meta.stats || {};
+    return [
+      `# GitNexus: ${this._context.projectName}`,
+      '',
+      '## Stats',
+      `- Files: ${stats.files || 0}`,
+      `- Nodes: ${stats.nodes || 0}`,
+      `- Edges: ${stats.edges || 0}`,
+      `- Communities: ${stats.communities || 0}`,
+      `- Processes: ${stats.processes || 0}`,
+      '',
+      `Indexed: ${this.repo.meta.indexedAt}`,
+      `Commit: ${this.repo.meta.lastCommit?.slice(0, 7)}`,
+      '',
+      '## Available Tools',
+      '- **analyze**: Index/re-index repository',
+      '- **search**: Hybrid semantic + keyword search',
+      '- **cypher**: Graph queries (Cypher)',
+      '- **overview**: List communities and processes',
+      '- **explore**: Deep dive on symbol/cluster/process',
+      '- **impact**: Change impact analysis',
+    ].join('\n');
+  }
+
+  private async search(params: { query: string; limit?: number; depth?: string }): Promise {
+    await this.ensureInitialized();
+    
+    const limit = params.limit || 10;
+    const query = params.query;
+    const depth = params.depth || 'definitions';
+    
+    // BM25 keyword search
+    const bm25Results = isBM25Ready() ? searchBM25(query, limit * 2) : [];
+    
+    if (bm25Results.length === 0) {
+      return { message: 'No results found', query, bm25Ready: isBM25Ready() };
+    }
+    
+    // Get node details from kuzu for top results
+    const results: any[] = [];
+    
+    for (const bm25Result of bm25Results.slice(0, limit)) {
+      try {
+        // Use CONTAINS to match file paths (handles relative vs full paths)
+        const fileName = bm25Result.filePath.split('/').pop() || bm25Result.filePath;
+        const symbolQuery = `
+          MATCH (n) 
+          WHERE n.filePath CONTAINS '${fileName.replace(/'/g, "''")}'
+          RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine
+          LIMIT 5
+        `;
+        const symbols = await executeQuery(symbolQuery);
+        
+        if (symbols.length > 0) {
+          for (const sym of symbols) {
+            const result: any = {
+              name: sym.name || sym[1],
+              type: sym.type || sym[2],
+              filePath: sym.filePath || sym[3],
+              startLine: sym.startLine || sym[4],
+              endLine: sym.endLine || sym[5],
+              score: bm25Result.score,
+            };
+            
+            // Add relationships if depth is 'full'
+            if (depth === 'full') {
+              const relQuery = `
+                MATCH (n {id: '${(sym.id || sym[0]).replace(/'/g, "''")}' })-[r:CodeRelation]->(m)
+                RETURN r.type AS type, m.name AS targetName, m.filePath AS targetPath
+                LIMIT 5
+              `;
+              try {
+                const rels = await executeQuery(relQuery);
+                result.connections = rels.map((rel: any) => ({
+                  type: rel.type || rel[0],
+                  name: rel.targetName || rel[1],
+                  path: rel.targetPath || rel[2],
+                }));
+              } catch {
+                result.connections = [];
+              }
+            }
+            
+            results.push(result);
+          }
+        } else {
+          // No symbols found in kuzu, return file info from BM25
+          results.push({
+            name: fileName,
+            type: 'File',
+            filePath: bm25Result.filePath,
+            score: bm25Result.score,
+          });
+        }
+      } catch {
+        // On kuzu error, still return BM25 result
+        results.push({
+          name: bm25Result.filePath.split('/').pop(),
+          type: 'File',
+          filePath: bm25Result.filePath,
+          score: bm25Result.score,
+        });
+      }
+    }
+    
+    return results.slice(0, limit);
+  }
+
+  private async cypher(params: { query: string }): Promise {
+    await this.ensureInitialized();
+    
+    if (!isKuzuReady()) {
+      return { error: 'KuzuDB not ready. Index may be corrupted.' };
+    }
+    
+    try {
+      const result = await executeQuery(params.query);
+      return result;
+    } catch (err: any) {
+      return { error: err.message || 'Query failed' };
+    }
+  }
+
+  private async overview(params: { showClusters?: boolean; showProcesses?: boolean; limit?: number }): Promise {
+    await this.ensureInitialized();
+    
+    const limit = params.limit || 20;
+    const result: any = {
+      repoPath: this.repo!.repoPath,
+      stats: this.repo!.meta.stats,
+      indexedAt: this.repo!.meta.indexedAt,
+      lastCommit: this.repo!.meta.lastCommit,
+    };
+    
+    if (params.showClusters !== false) {
+      try {
+        const clusters = await executeQuery(`
+          MATCH (c:Community)
+          RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount
+          ORDER BY c.symbolCount DESC
+          LIMIT ${limit}
+        `);
+        result.clusters = clusters.map((c: any) => ({
+          id: c.id || c[0],
+          label: c.label || c[1],
+          heuristicLabel: c.heuristicLabel || c[2],
+          cohesion: c.cohesion || c[3],
+          symbolCount: c.symbolCount || c[4],
+        }));
+      } catch {
+        result.clusters = [];
+      }
+    }
+    
+    if (params.showProcesses !== false) {
+      try {
+        const processes = await executeQuery(`
+          MATCH (p:Process)
+          RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount
+          ORDER BY p.stepCount DESC
+          LIMIT ${limit}
+        `);
+        result.processes = processes.map((p: any) => ({
+          id: p.id || p[0],
+          label: p.label || p[1],
+          heuristicLabel: p.heuristicLabel || p[2],
+          processType: p.processType || p[3],
+          stepCount: p.stepCount || p[4],
+        }));
+      } catch {
+        result.processes = [];
+      }
+    }
+    
+    return result;
+  }
+
+  private async explore(params: { name: string; type: 'symbol' | 'cluster' | 'process' }): Promise {
+    await this.ensureInitialized();
+    
+    const { name, type } = params;
+    
+    if (type === 'symbol') {
+      // Find symbol and its context
+      const symbolQuery = `
+        MATCH (n)
+        WHERE n.name = '${name.replace(/'/g, "''")}'
+        RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine
+        LIMIT 1
+      `;
+      const symbols = await executeQuery(symbolQuery);
+      if (symbols.length === 0) return { error: `Symbol '${name}' not found` };
+      
+      const sym = symbols[0];
+      const symId = sym.id || sym[0];
+      
+      // Get callers
+      const callersQuery = `
+        MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(n {id: '${symId}'})
+        RETURN caller.name AS name, caller.filePath AS filePath
+        LIMIT 10
+      `;
+      const callers = await executeQuery(callersQuery);
+      
+      // Get callees
+      const calleesQuery = `
+        MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'CALLS'}]->(callee)
+        RETURN callee.name AS name, callee.filePath AS filePath
+        LIMIT 10
+      `;
+      const callees = await executeQuery(calleesQuery);
+      
+      // Get community
+      const communityQuery = `
+        MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community)
+        RETURN c.label AS label, c.heuristicLabel AS heuristicLabel
+        LIMIT 1
+      `;
+      const communities = await executeQuery(communityQuery);
+      
+      return {
+        symbol: {
+          id: symId,
+          name: sym.name || sym[1],
+          type: sym.type || sym[2],
+          filePath: sym.filePath || sym[3],
+          startLine: sym.startLine || sym[4],
+          endLine: sym.endLine || sym[5],
+        },
+        callers: callers.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })),
+        callees: callees.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })),
+        community: communities.length > 0 ? {
+          label: communities[0].label || communities[0][0],
+          heuristicLabel: communities[0].heuristicLabel || communities[0][1],
+        } : null,
+      };
+    }
+    
+    if (type === 'cluster') {
+      const clusterQuery = `
+        MATCH (c:Community)
+        WHERE c.label = '${name.replace(/'/g, "''")}' OR c.heuristicLabel = '${name.replace(/'/g, "''")}'
+        RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount
+        LIMIT 1
+      `;
+      const clusters = await executeQuery(clusterQuery);
+      if (clusters.length === 0) return { error: `Cluster '${name}' not found` };
+      
+      const cluster = clusters[0];
+      const clusterId = cluster.id || cluster[0];
+      
+      const membersQuery = `
+        MATCH (n)-[:CodeRelation {type: 'MEMBER_OF'}]->(c {id: '${clusterId}'})
+        RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath
+        LIMIT 20
+      `;
+      const members = await executeQuery(membersQuery);
+      
+      return {
+        cluster: {
+          id: clusterId,
+          label: cluster.label || cluster[1],
+          heuristicLabel: cluster.heuristicLabel || cluster[2],
+          cohesion: cluster.cohesion || cluster[3],
+          symbolCount: cluster.symbolCount || cluster[4],
+        },
+        members: members.map((m: any) => ({
+          name: m.name || m[0],
+          type: m.type || m[1],
+          filePath: m.filePath || m[2],
+        })),
+      };
+    }
+    
+    if (type === 'process') {
+      const processQuery = `
+        MATCH (p:Process)
+        WHERE p.label = '${name.replace(/'/g, "''")}' OR p.heuristicLabel = '${name.replace(/'/g, "''")}'
+        RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount, p.entryPointId AS entryPointId, p.terminalId AS terminalId
+        LIMIT 1
+      `;
+      const processes = await executeQuery(processQuery);
+      if (processes.length === 0) return { error: `Process '${name}' not found` };
+      
+      const proc = processes[0];
+      const procId = proc.id || proc[0];
+      
+      const stepsQuery = `
+        MATCH (n)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p {id: '${procId}'})
+        RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, r.step AS step
+        ORDER BY r.step
+      `;
+      const steps = await executeQuery(stepsQuery);
+      
+      return {
+        process: {
+          id: procId,
+          label: proc.label || proc[1],
+          heuristicLabel: proc.heuristicLabel || proc[2],
+          processType: proc.processType || proc[3],
+          stepCount: proc.stepCount || proc[4],
+        },
+        steps: steps.map((s: any) => ({
+          step: s.step || s[3],
+          name: s.name || s[0],
+          type: s.type || s[1],
+          filePath: s.filePath || s[2],
+        })),
+      };
+    }
+    
+    return { error: 'Invalid type. Use: symbol, cluster, or process' };
+  }
+
+  private async impact(params: { target: string; direction: 'upstream' | 'downstream'; maxDepth?: number }): Promise {
+    await this.ensureInitialized();
+    
+    const { target, direction } = params;
+    const maxDepth = params.maxDepth || 3;
+    
+    // Find target symbol
+    const targetQuery = `
+      MATCH (n)
+      WHERE n.name = '${target.replace(/'/g, "''")}'
+      RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath
+      LIMIT 1
+    `;
+    const targets = await executeQuery(targetQuery);
+    if (targets.length === 0) return { error: `Target '${target}' not found` };
+    
+    const sym = targets[0];
+    const symId = sym.id || sym[0];
+    
+    // BFS to find impacted nodes
+    const impacted: any[] = [];
+    const visited = new Set([symId]);
+    let frontier = [symId];
+    
+    for (let depth = 1; depth <= maxDepth && frontier.length > 0; depth++) {
+      const nextFrontier: string[] = [];
+      
+      for (const nodeId of frontier) {
+        const query = direction === 'upstream'
+          ? `MATCH (caller)-[r:CodeRelation]->(n {id: '${nodeId}'}) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence`
+          : `MATCH (n {id: '${nodeId}'})-[r:CodeRelation]->(callee) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence`;
+        
+        const related = await executeQuery(query);
+        
+        for (const rel of related) {
+          const relId = rel.id || rel[0];
+          if (!visited.has(relId)) {
+            visited.add(relId);
+            nextFrontier.push(relId);
+            impacted.push({
+              depth,
+              id: relId,
+              name: rel.name || rel[1],
+              type: rel.type || rel[2],
+              filePath: rel.filePath || rel[3],
+              relationType: rel.relType || rel[4],
+              confidence: rel.confidence || rel[5] || 1.0,
+            });
+          }
+        }
+      }
+      
+      frontier = nextFrontier;
+    }
+    
+    // Group by depth
+    const grouped: Record = {};
+    for (const item of impacted) {
+      if (!grouped[item.depth]) grouped[item.depth] = [];
+      grouped[item.depth].push(item);
+    }
+    
+    return {
+      target: {
+        id: symId,
+        name: sym.name || sym[1],
+        type: sym.type || sym[2],
+        filePath: sym.filePath || sym[3],
+      },
+      direction,
+      impactedCount: impacted.length,
+      byDepth: grouped,
+    };
+  }
+
+  private async analyze(params: { path?: string; force?: boolean }): Promise {
+    const targetPath = params.path ? path.resolve(params.path) : process.cwd();
+    
+    return {
+      action: 'analyze',
+      targetPath,
+      message: `To index this repository, run:\n\n  cd ${targetPath}\n  gitnexus analyze${params.force ? ' --force' : ''}\n\nThis will create a .gitnexus/ folder with the knowledge graph.`,
+    };
+  }
+
+  disconnect(): void {
+    closeKuzu();
+    this.repo = null;
+    this._context = null;
+    this.initialized = false;
+  }
+}
diff --git a/gitnexus-mcp/src/mcp/tools.ts b/gitnexus-mcp/src/mcp/tools.ts
index 84ab18d72..f4d6e997c 100644
--- a/gitnexus-mcp/src/mcp/tools.ts
+++ b/gitnexus-mcp/src/mcp/tools.ts
@@ -2,7 +2,7 @@
  * MCP Tool Definitions
  * 
  * Defines the tools that GitNexus exposes to external AI agents.
- * Each tool has a rich description with examples to help agents use them correctly.
+ * Only includes tools that provide unique value over native IDE capabilities.
  */
 
 export interface ToolDefinition {
@@ -15,12 +15,37 @@ export interface ToolDefinition {
       description?: string;
       default?: any;
       items?: { type: string };
+      enum?: string[];
     }>;
     required: string[];
   };
 }
 
 export const GITNEXUS_TOOLS: ToolDefinition[] = [
+  {
+    name: 'analyze',
+    description: `Index or re-index the current repository.
+
+Creates .gitnexus/ in repo root with:
+- Knowledge graph (functions, classes, calls, imports)
+- BM25 search index
+- Community detection (Leiden)
+- Process tracing
+
+Run this when:
+- First time using GitNexus on a repo
+- After major code changes
+- When 'not indexed' error appears`,
+    inputSchema: {
+      type: 'object',
+      properties: {
+        path: { type: 'string', description: 'Repo path (default: current directory)' },
+        force: { type: 'boolean', description: 'Re-index even if exists', default: false },
+        skipEmbeddings: { type: 'boolean', description: 'Skip embedding generation (faster)', default: false },
+      },
+      required: [],
+    },
+  },
   {
     name: 'context',
     description: `Get GitNexus codebase context. CALL THIS FIRST before using other tools.
@@ -28,7 +53,7 @@ export const GITNEXUS_TOOLS: ToolDefinition[] = [
 Returns:
 - Project name and stats (files, functions, classes)
 - Hotspots (most connected/important nodes)
-- Directory structure (TOON format for token efficiency)
+- Communities and processes count
 - Tool usage guidance
 
 ALWAYS call this first to understand the codebase before searching or querying.`,
@@ -43,10 +68,10 @@ ALWAYS call this first to understand the codebase before searching or querying.`
     description: `Hybrid search (keyword + semantic) across the codebase.
 Returns code nodes with their graph connections, grouped by process.
 
-WHEN TO USE:
-- Finding implementations ("where is auth handled?")
-- Understanding code flow ("what calls UserService?")
-- Locating patterns ("find all API endpoints")
+BETTER THAN IDE search because:
+- Process-aware grouping (shows execution flows)
+- Cluster context (which functional area)
+- Relationship data (callers/callees)
 
 RETURNS: Array of {name, type, filePath, code, connections[], cluster, processes[]}`,
     inputSchema: {
@@ -54,6 +79,7 @@ RETURNS: Array of {name, type, filePath, code, connections[], cluster, processes
       properties: {
         query: { type: 'string', description: 'Natural language or keyword search query' },
         limit: { type: 'number', description: 'Max results to return', default: 10 },
+        depth: { type: 'string', description: 'Result detail: "definitions" (symbols only) or "full" (with relationships)', enum: ['definitions', 'full'], default: 'definitions' },
         groupByProcess: { type: 'boolean', description: 'Group results by process', default: true },
       },
       required: ['query'],
@@ -89,50 +115,6 @@ TIPS:
       required: ['query'],
     },
   },
-  {
-    name: 'grep',
-    description: `Regex search for exact patterns in file contents.
-
-WHEN TO USE:
-- Finding exact strings: error codes, TODOs, specific API keys
-- Pattern matching: all console.log, all fetch calls
-- Finding imports of specific modules
-
-BETTER THAN search for: exact matches, regex patterns, case-sensitive
-
-RETURNS: Array of {filePath, line, lineNumber, match}`,
-    inputSchema: {
-      type: 'object',
-      properties: {
-        pattern: { type: 'string', description: 'Regex pattern to search for' },
-        caseSensitive: { type: 'boolean', description: 'Case-sensitive search', default: false },
-        maxResults: { type: 'number', description: 'Max results to return', default: 50 },
-      },
-      required: ['pattern'],
-    },
-  },
-  {
-    name: 'read',
-    description: `Read file content from the codebase.
-
-WHEN TO USE:
-- After search/grep to see full context
-- To understand implementation details
-- Before making changes
-
-ALWAYS read before concluding - don't guess from names alone.
-
-RETURNS: {filePath, content, language, lines}`,
-    inputSchema: {
-      type: 'object',
-      properties: {
-        filePath: { type: 'string', description: 'Path to file to read' },
-        startLine: { type: 'number', description: 'Start line (optional)' },
-        endLine: { type: 'number', description: 'End line (optional)' },
-      },
-      required: ['filePath'],
-    },
-  },
   {
     name: 'explore',
     description: `Deep dive on a symbol, cluster, or process.
@@ -206,20 +188,4 @@ Depth groups:
       required: ['target', 'direction'],
     },
   },
-  {
-    name: 'highlight',
-    description: `Highlight nodes in the GitNexus graph visualization.
-Use after search/analysis to show the user what you found.
-
-The user will see the nodes glow in the graph view.
-Great for visual confirmation of your findings.`,
-    inputSchema: {
-      type: 'object',
-      properties: {
-        nodeIds: { type: 'array', items: { type: 'string' }, description: 'Array of node IDs to highlight' },
-        color: { type: 'string', description: 'Highlight color (optional, default: cyan)' },
-      },
-      required: ['nodeIds'],
-    },
-  },
 ];
diff --git a/gitnexus/src/App.tsx b/gitnexus/src/App.tsx
index 646b6c97f..1288e502c 100644
--- a/gitnexus/src/App.tsx
+++ b/gitnexus/src/App.tsx
@@ -26,7 +26,6 @@ const AppContent = () => {
     isRightPanelOpen,
     runPipeline,
     runPipelineFromFiles,
-    loadSerializedGraph,
     isSettingsPanelOpen,
     setSettingsPanelOpen,
     refreshLLMSettings,
@@ -43,8 +42,6 @@ const AppContent = () => {
   } = useAppState();
 
   const [showClusteringModal, setShowClusteringModal] = useState(false);
-  const [localRepos, setLocalRepos] = useState>([]);
-  const [localAvailable, setLocalAvailable] = useState(false);
 
   // Trigger clustering modal after ingestion if not seen yet
   // DISABLED: Clustering is now in the upload flow
@@ -191,64 +188,6 @@ const AppContent = () => {
     }
   }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipelineFromFiles, startEmbeddings, initializeAgent, runClusterEnrichment]);
 
-  useEffect(() => {
-    fetch('http://localhost:4747/api/repos')
-      .then((res) => res.json())
-      .then((data) => {
-        if (data?.repos?.length) {
-          setLocalAvailable(true);
-          setLocalRepos(data.repos);
-        }
-      })
-      .catch(() => {
-        setLocalAvailable(false);
-      });
-  }, []);
-
-  const handleOpenLocalRepo = useCallback(async (repoId: string, repoPath: string) => {
-    const project = repoPath.split('/').pop() || repoPath.split('\\').pop() || 'repository';
-    setProjectName(project);
-    setProgress({ phase: 'extracting', percent: 0, message: 'Loading local repository...' });
-    setViewMode('loading');
-
-    try {
-      const res = await fetch(`http://localhost:4747/api/repos/${repoId}/serialized`);
-      if (!res.ok) {
-        throw new Error(`Failed to fetch local repo: ${res.status}`);
-      }
-      const serialized = await res.json();
-      const result = await loadSerializedGraph(serialized);
-
-      setGraph(result.graph);
-      setFileContents(result.fileContents);
-      setViewMode('exploring');
-
-      if (getActiveProviderConfig()) {
-        initializeAgent(project);
-      }
-
-      startEmbeddings().catch((err) => {
-        if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) {
-          startEmbeddings('wasm').catch(console.warn);
-        } else {
-          console.warn('Embeddings auto-start failed:', err);
-        }
-      });
-    } catch (error) {
-      console.error('Local repo load error:', error);
-      setProgress({
-        phase: 'error',
-        percent: 0,
-        message: 'Error loading local repository',
-        detail: error instanceof Error ? error.message : 'Unknown error',
-      });
-      setTimeout(() => {
-        setViewMode('onboarding');
-        setProgress(null);
-      }, 3000);
-    }
-  }, [setProjectName, setProgress, setViewMode, loadSerializedGraph, setGraph, setFileContents, initializeAgent, startEmbeddings]);
-
   const handleFocusNode = useCallback((nodeId: string) => {
     graphCanvasRef.current?.focusNode(nodeId);
   }, []);
@@ -262,34 +201,7 @@ const AppContent = () => {
 
   // Render based on view mode
   if (viewMode === 'onboarding') {
-    return (
-      
- {localAvailable && localRepos.length > 0 && ( -
-
Local GitNexus server detected
-
- {localRepos.map((repo) => ( -
-
-
{repo.repoPath}
-
Indexed: {repo.indexedAt}
-
- -
- ))} -
-
- )} -
- -
-
- ); + return ; } if (viewMode === 'loading' && progress) { diff --git a/gitnexus/src/hooks/useAppState.tsx b/gitnexus/src/hooks/useAppState.tsx index 278140cc8..720b92314 100644 --- a/gitnexus/src/hooks/useAppState.tsx +++ b/gitnexus/src/hooks/useAppState.tsx @@ -1,7 +1,7 @@ import { createContext, useContext, useState, useCallback, useRef, useEffect, ReactNode } from 'react'; import * as Comlink from 'comlink'; import { KnowledgeGraph, GraphNode, NodeLabel } from '../core/graph/types'; -import { PipelineProgress, PipelineResult, SerializablePipelineResult, deserializePipelineResult } from '../types/pipeline'; +import { PipelineProgress, PipelineResult, deserializePipelineResult } from '../types/pipeline'; import { createKnowledgeGraph } from '../core/graph/graph'; import { DEFAULT_VISIBLE_LABELS } from '../lib/constants'; import type { IngestionWorkerApi } from '../workers/ingestion.worker'; @@ -114,7 +114,6 @@ interface AppState { // Worker API (shared across app) runPipeline: (file: File, onProgress: (p: PipelineProgress) => void, clusteringConfig?: ProviderConfig) => Promise; runPipelineFromFiles: (files: FileEntry[], onProgress: (p: PipelineProgress) => void, clusteringConfig?: ProviderConfig) => Promise; - loadSerializedGraph: (serialized: SerializablePipelineResult) => Promise; runQuery: (cypher: string) => Promise; isDatabaseReady: () => Promise; @@ -461,15 +460,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { return deserializePipelineResult(serializedResult, createKnowledgeGraph); }, []); - const loadSerializedGraph = useCallback(async ( - serialized: SerializablePipelineResult - ): Promise => { - const api = apiRef.current; - if (!api) throw new Error('Worker not initialized'); - await api.loadSerializedGraph(serialized); - return deserializePipelineResult(serialized, createKnowledgeGraph); - }, []); - const runQuery = useCallback(async (cypher: string): Promise => { const api = apiRef.current; if (!api) throw new Error('Worker not initialized'); @@ -1206,7 +1196,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { setProjectName, runPipeline, runPipelineFromFiles, - loadSerializedGraph, runQuery, isDatabaseReady, // Embedding state and methods diff --git a/gitnexus/src/workers/ingestion.worker.ts b/gitnexus/src/workers/ingestion.worker.ts index 863e8a699..c5fb407f2 100644 --- a/gitnexus/src/workers/ingestion.worker.ts +++ b/gitnexus/src/workers/ingestion.worker.ts @@ -1,6 +1,6 @@ import * as Comlink from 'comlink'; import { runIngestionPipeline, runPipelineFromFiles } from '../core/ingestion/pipeline'; -import { PipelineProgress, SerializablePipelineResult, serializePipelineResult, deserializePipelineResult } from '../types/pipeline'; +import { PipelineProgress, SerializablePipelineResult, serializePipelineResult } from '../types/pipeline'; import { FileEntry } from '../services/zip'; import { runEmbeddingPipeline, @@ -25,7 +25,6 @@ import { mergeWithRRF, type HybridSearchResult, } from '../core/search'; -import { createKnowledgeGraph } from '../core/graph/graph'; // Lazy import for Kuzu to avoid breaking worker if SharedArrayBuffer unavailable let kuzuAdapter: typeof import('../core/kuzu/kuzu-adapter') | null = null; @@ -224,31 +223,6 @@ const workerApi = { return serializePipelineResult(result); }, - /** - * Load a serialized graph result into the worker (for local CLI integration) - */ - async loadSerializedGraph(serialized: SerializablePipelineResult): Promise { - const result = deserializePipelineResult(serialized, createKnowledgeGraph); - currentGraphResult = result; - storedFileContents = result.fileContents; - - const bm25DocCount = buildBM25Index(storedFileContents); - if (import.meta.env.DEV) { - console.log(`🔍 BM25 index built: ${bm25DocCount} documents`); - } - - try { - const kuzu = await getKuzuAdapter(); - await kuzu.loadGraphToKuzu(result.graph, result.fileContents); - if (import.meta.env.DEV) { - const stats = await kuzu.getKuzuStats(); - console.log('KuzuDB loaded from serialized graph:', stats); - } - } catch { - // KuzuDB is optional - } - }, - // ============================================================ // Embedding Pipeline Methods // ============================================================ From 1ae08ee9fcd9c77e834cc6649a87680717fcf09e Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Tue, 3 Feb 2026 22:19:44 +0530 Subject: [PATCH 04/36] refactor: make mcp standalone-only, remove legacy browser bridge --- gitnexus-mcp/package-lock.json | 983 +++++++++++++++++++- gitnexus-mcp/package.json | 1 + gitnexus-mcp/src/bridge/protocol.ts | 36 - gitnexus-mcp/src/bridge/websocket-server.ts | 397 -------- gitnexus-mcp/src/commands/serve.ts | 111 ++- gitnexus-mcp/src/core/embedder.ts | 110 +++ gitnexus-mcp/src/local/local-backend.ts | 211 ++++- gitnexus-mcp/src/mcp/server.ts | 106 +-- 8 files changed, 1376 insertions(+), 579 deletions(-) delete mode 100644 gitnexus-mcp/src/bridge/protocol.ts delete mode 100644 gitnexus-mcp/src/bridge/websocket-server.ts create mode 100644 gitnexus-mcp/src/core/embedder.ts diff --git a/gitnexus-mcp/package-lock.json b/gitnexus-mcp/package-lock.json index 07821db63..5b2350221 100644 --- a/gitnexus-mcp/package-lock.json +++ b/gitnexus-mcp/package-lock.json @@ -9,6 +9,7 @@ "version": "0.2.0", "license": "MIT", "dependencies": { + "@huggingface/transformers": "^3.5.1", "@modelcontextprotocol/sdk": "^1.0.0", "kuzu": "^0.11.0", "minisearch": "^7.1.0", @@ -29,6 +30,16 @@ "node": ">=18.0.0" } }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -483,6 +494,513 @@ "hono": "^4" } }, + "node_modules/@huggingface/jinja": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.5.tgz", + "integrity": "sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", + "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.5.3", + "onnxruntime-node": "1.21.0", + "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", + "sharp": "^0.34.1" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isaacs/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.25.2", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", @@ -522,11 +1040,74 @@ } } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@types/node": { "version": "20.19.30", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -680,6 +1261,13 @@ "url": "https://opencollective.com/express" } }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -905,6 +1493,40 @@ "node": ">=4.0.0" } }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -929,6 +1551,21 @@ "node": ">= 0.8" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1009,6 +1646,12 @@ "node": ">= 0.4" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", @@ -1066,6 +1709,18 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1197,6 +1852,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, "node_modules/follow-redirects": { "version": "1.15.11", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", @@ -1413,6 +2074,39 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1431,6 +2125,24 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -1585,6 +2297,12 @@ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, "node_modules/jsonfile": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", @@ -1609,6 +2327,24 @@ "node-addon-api": "^6.0.0" } }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1798,6 +2534,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -1819,6 +2564,104 @@ "wrappy": "1" } }, + "node_modules/onnxruntime-common": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", + "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", + "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "global-agent": "^3.0.0", + "onnxruntime-common": "1.21.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-node/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/onnxruntime-node/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/onnxruntime-node/node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -1856,6 +2699,36 @@ "node": ">=16.20.0" } }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -1971,6 +2844,23 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -2025,6 +2915,12 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, "node_modules/send": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", @@ -2051,6 +2947,21 @@ "url": "https://opencollective.com/express" } }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serve-static": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", @@ -2082,6 +2993,50 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2181,6 +3136,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "license": "ISC" }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -2261,6 +3222,13 @@ "node": ">=0.6" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, "node_modules/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -2281,6 +3249,18 @@ "fsevents": "~2.3.3" } }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -2313,7 +3293,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/universalify": { diff --git a/gitnexus-mcp/package.json b/gitnexus-mcp/package.json index 782cfc19e..4bf1eb250 100644 --- a/gitnexus-mcp/package.json +++ b/gitnexus-mcp/package.json @@ -30,6 +30,7 @@ "prepublishOnly": "npm run build" }, "dependencies": { + "@huggingface/transformers": "^3.5.1", "@modelcontextprotocol/sdk": "^1.0.0", "kuzu": "^0.11.0", "minisearch": "^7.1.0", diff --git a/gitnexus-mcp/src/bridge/protocol.ts b/gitnexus-mcp/src/bridge/protocol.ts deleted file mode 100644 index 1d0d63fe4..000000000 --- a/gitnexus-mcp/src/bridge/protocol.ts +++ /dev/null @@ -1,36 +0,0 @@ -/** - * Bridge Protocol Types - * - * JSON-RPC-like protocol for communication between bridge and browser. - */ - -export interface BridgeMessage { - id: string; - type?: 'register_peer' | 'tool_call' | 'tool_result' | 'agent_info' | 'handshake' | 'handshake_ack' | 'context'; - method?: string; - params?: any; - result?: any; - error?: { - code?: number; - message: string; - }; - agentName?: string; - peerId?: string; -} - -export type ToolCallRequest = BridgeMessage & { method: string }; -export type ToolCallResponse = BridgeMessage & ({ result: any } | { error: any }); - -/** - * Check if message is a request (has method) - */ -export function isRequest(msg: BridgeMessage): msg is ToolCallRequest { - return typeof msg.method === 'string'; -} - -/** - * Check if message is a response (has result or error) - */ -export function isResponse(msg: BridgeMessage): msg is ToolCallResponse { - return 'result' in msg || 'error' in msg; -} diff --git a/gitnexus-mcp/src/bridge/websocket-server.ts b/gitnexus-mcp/src/bridge/websocket-server.ts deleted file mode 100644 index 450414941..000000000 --- a/gitnexus-mcp/src/bridge/websocket-server.ts +++ /dev/null @@ -1,397 +0,0 @@ -import { WebSocketServer, WebSocket } from 'ws'; -import { createServer as createNetServer } from 'net'; -import { BridgeMessage, isRequest, isResponse } from './protocol.js'; -import { v4 as uuidv4 } from 'uuid'; - -/** - * Codebase context sent from the GitNexus browser app - */ -export interface CodebaseContext { - projectName: string; - stats: { - fileCount: number; - functionCount: number; - classCount: number; - interfaceCount: number; - methodCount: number; - }; - hotspots: Array<{ - name: string; - type: string; - filePath: string; - connections: number; - }>; - folderTree: string; -} - -/** - * Check if a Port is available - */ -async function isPortAvailable(port: number): Promise { - return new Promise((resolve) => { - const server = createNetServer(); - server.once('error', () => resolve(false)); - server.once('listening', () => { - server.close(); - resolve(true); - }); - server.listen(port); - }); -} - -export class WebSocketBridge { - private wss: WebSocketServer | null = null; // Used if we are the Hub - private client: WebSocket | null = null; // Used if we are a Peer (connecting to Hub), OR if we are Hub (clients connecting to us) - - // Hub State - private browserClient: WebSocket | null = null; - private peerClients: Map = new Map(); - - // Common State - private pendingRequests: Map void, reject: (err: any) => void }> = new Map(); - private requestId = 0; - private started = false; - private _context: any | null = null; // CodebaseContext - private contextListeners: Set<(context: any | null) => void> = new Set(); - private agentName: string; - private isHub = false; - private port = 54319; - - constructor(port: number = 54319, agentName?: string) { - this.port = port; - this.agentName = agentName || process.env.GITNEXUS_AGENT || this.detectAgent(); - } - - private detectAgent(): string { - if (process.env.CURSOR_SESSION_ID) return 'Cursor'; - if (process.env.CLAUDE_CODE) return 'Claude Code'; - if (process.env.WINDSURF_SESSION) return 'Windsurf'; - return 'Unknown Agent'; - } - - async start(): Promise { - const available = await isPortAvailable(this.port); - - if (available) { - return this.startAsHub(); - } else { - return this.startAsPeer(); - } - } - - // ------------------------------------------------------------------------- - // Hub Implementation (Master) - // ------------------------------------------------------------------------- - - private async startAsHub(): Promise { - console.error(`Starting as MCP Hub on port ${this.port}`); - this.isHub = true; - - return new Promise((resolve) => { - this.wss = new WebSocketServer({ port: this.port }); - - this.wss.on('connection', (ws, req) => { - // Security: Origin check could go here if req.headers.origin available - - ws.on('message', (data) => this.handleHubMessage(ws, data)); - ws.on('close', () => this.handleHubDisconnect(ws)); - ws.on('error', (err) => console.error('Hub client error:', err)); - }); - - this.wss.on('listening', () => { - this.started = true; - resolve(true); - }); - - this.wss.on('error', (err) => { - console.error('Hub server error:', err); - resolve(false); - }); - }); - } - - private handleHubMessage(ws: WebSocket, data: any) { - try { - const msg: BridgeMessage = JSON.parse(data.toString()); - - if (msg.type === 'handshake') { - // Peer verifying we are GitNexus - ws.send(JSON.stringify({ type: 'handshake_ack', id: msg.id })); - return; - } - - if (msg.type === 'register_peer') { - // Peer registering itself - const peerId = uuidv4(); - this.peerClients.set(peerId, ws); - (ws as any).peerId = peerId; - (ws as any).agentName = msg.agentName; - console.error(`Peer connected: ${msg.agentName} (${peerId})`); - - // Forward current context to new peer if available - if (this._context) { - ws.send(JSON.stringify({ type: 'context', params: this._context })); - } - return; - } - - // Handle Context updates (from Browser) - if (msg.type === 'context') { - // Browser identified itself (implicitly) - if (this.browserClient !== ws) { - if (this.browserClient) this.browserClient.close(); - this.browserClient = ws; - console.error('Browser connected to Hub'); - } - - this._context = msg.params; - this.notifyContextListeners(); - - // Broadcast context to all peers - this.broadcastToPeers(msg); - return; - } - - // Handle Tool Calls (Peer/Hub -> Browser) - if (isRequest(msg)) { - // If it came from a ws client (Peer), validation needed? - // We assume it's destined for the Browser - if (this.browserClient && this.browserClient.readyState === WebSocket.OPEN) { - // Attach agent info if missing (for UI) - if (!msg.agentName && (ws as any).agentName) { - msg.agentName = (ws as any).agentName; - } - // Attach peerId so we can route response back - if (!msg.peerId && (ws as any).peerId) { - msg.peerId = (ws as any).peerId; - } - - this.browserClient.send(JSON.stringify(msg)); - } else { - // Browser not connected, fail - if (msg.id) { - ws.send(JSON.stringify({ - id: msg.id, - error: { message: "Browser not connected. Open GitNexus." } - })); - } - } - return; - } - - // Handle Tool Results (Browser -> Peer/Hub) - if (isResponse(msg)) { - // Route to the correct peer - if (msg.peerId && this.peerClients.has(msg.peerId)) { - const peer = this.peerClients.get(msg.peerId); - if (peer?.readyState === WebSocket.OPEN) { - peer.send(JSON.stringify(msg)); - } - } else { - // It might be for Us (the Hub) - this.handleResponseLocal(msg); - } - return; - } - - } catch (e) { - console.error('Hub: Failed to parse message', e); - } - } - - private handleHubDisconnect(ws: WebSocket) { - if (ws === this.browserClient) { - console.error('Browser disconnected from Hub'); - this.browserClient = null; - this._context = null; - this.notifyContextListeners(); - } else { - const peerId = (ws as any).peerId; - if (peerId) { - this.peerClients.delete(peerId); - console.error(`Peer disconnected: ${peerId}`); - } - } - } - - private broadcastToPeers(msg: any) { - for (const client of this.peerClients.values()) { - if (client.readyState === WebSocket.OPEN) { - client.send(JSON.stringify(msg)); - } - } - } - - // ------------------------------------------------------------------------- - // Peer Implementation (Spoke) - // ------------------------------------------------------------------------- - - private async startAsPeer(): Promise { - console.error(`Port ${this.port} busy. Attempting to connect as Peer...`); - - return new Promise((resolve) => { - const ws = new WebSocket(`ws://localhost:${this.port}`); - - const timeout = setTimeout(() => { - console.error('Handshake timeout. Port is busy by unknown app.'); - ws.close(); - resolve(false); - }, 1000); - - ws.on('open', () => { - // Send Handshake - ws.send(JSON.stringify({ type: 'handshake', id: 'init' })); - }); - - ws.on('message', (data) => { - try { - const msg = JSON.parse(data.toString()); - - // Handshake success? - if (msg.type === 'handshake_ack') { - clearTimeout(timeout); - console.error('Handshake successful. Joining as Peer.'); - - // Register ourselves - ws.send(JSON.stringify({ - type: 'register_peer', - agentName: this.agentName - })); - - this.client = ws; - this.started = true; - resolve(true); - return; - } - - // Normal messages from Hub - this.handlePeerMessage(msg); - - } catch (e) { - // ignore garbage - } - }); - - ws.on('error', (err) => { - console.error('Peer connection error:', err); - resolve(false); - }); - - // If connection fails immediately - ws.on('close', () => { - if (!this.started) resolve(false); - else { - this.client = null; - this._context = null; - this.notifyContextListeners(); - } - }); - }); - } - - private handlePeerMessage(msg: BridgeMessage) { - if (msg.type === 'context') { - this._context = msg.params; - this.notifyContextListeners(); - return; - } - - if (isResponse(msg)) { - this.handleResponseLocal(msg); - } - } - - // ------------------------------------------------------------------------- - // Shared / Public API - // ------------------------------------------------------------------------- - - private handleResponseLocal(msg: any) { - if (msg.id && this.pendingRequests.has(msg.id)) { - const { resolve, reject } = this.pendingRequests.get(msg.id)!; - this.pendingRequests.delete(msg.id); - - if (msg.error) { - // We'll reject the promise so caller knows - reject(new Error(msg.error.message)); - } else { - resolve(msg.result); - } - } - } - - get isConnected(): boolean { - if (this.isHub) { - return this.browserClient !== null && this.browserClient.readyState === WebSocket.OPEN; - } else { - return this.client !== null && this.client.readyState === WebSocket.OPEN; - } - } - - get context(): any { - return this._context; - } - - onContextChange(listener: (context: any) => void) { - this.contextListeners.add(listener); - return () => this.contextListeners.delete(listener); - } - - private notifyContextListeners() { - this.contextListeners.forEach((listener) => listener(this._context)); - } - - async callTool(method: string, params: any): Promise { - if (!this.isConnected) { - if (this.isHub) throw new Error('GitNexus Browser not connected.'); - else throw new Error('GitNexus Hub disonnected.'); - } - - const id = `req_${++this.requestId}`; - - return new Promise((resolve, reject) => { - this.pendingRequests.set(id, { resolve, reject }); - - const msg: BridgeMessage = { - id, - method, - params, - agentName: this.agentName, - // type is implicitly request because of method - }; - - if (this.isHub) { - // Send directly to browser - if (this.browserClient && this.browserClient.readyState === WebSocket.OPEN) { - this.browserClient.send(JSON.stringify(msg)); - } else { - this.pendingRequests.delete(id); - reject(new Error('Browser not connected')); - } - } else { - // Send to Hub (who forwards to browser) - if (this.client && this.client.readyState === WebSocket.OPEN) { - this.client.send(JSON.stringify(msg)); - } else { - this.pendingRequests.delete(id); - reject(new Error('Hub disconnected')); - } - } - - setTimeout(() => { - if (this.pendingRequests.has(id)) { - this.pendingRequests.delete(id); - reject(new Error('Request timeout')); - } - }, 30000); - }); - } - - close() { - this.wss?.close(); - this.client?.close(); - } - - disconnect() { - this.close(); - } -} diff --git a/gitnexus-mcp/src/commands/serve.ts b/gitnexus-mcp/src/commands/serve.ts index 97e13fc78..bfde486e5 100644 --- a/gitnexus-mcp/src/commands/serve.ts +++ b/gitnexus-mcp/src/commands/serve.ts @@ -1,45 +1,102 @@ /** * Serve Command * - * Starts the MCP server with hybrid mode: - * 1. First tries local .gitnexus/ index (standalone mode) - * 2. Falls back to WebSocket bridge if browser is running + * Starts the MCP server in standalone mode using local .gitnexus/ index. + * + * Auto-detects repository by trying (in order): + * 1. GITNEXUS_CWD env var (explicit override) + * 2. process.cwd() (IDE working directory) + * 3. VSCODE_WORKSPACE_FOLDER env var */ import { startMCPServer } from '../mcp/server.js'; -import { WebSocketBridge } from '../bridge/websocket-server.js'; -import { LocalBackend } from '../local/local-backend.js'; +import { LocalBackend, findRepo } from '../local/local-backend.js'; +import path from 'path'; +import fs from 'fs/promises'; interface ServeOptions { port: string; } -export async function serveCommand(options: ServeOptions) { - const port = parseInt(options.port, 10); - // Use GITNEXUS_CWD env var if set, otherwise use process.cwd() - const cwd = process.env.GITNEXUS_CWD || process.cwd(); +/** + * Get candidate paths to search for .gitnexus/ folder + */ +function getCandidatePaths(): string[] { + const candidates: string[] = []; - // Try local backend first (standalone mode) - const local = new LocalBackend(); - const hasLocalIndex = await local.init(cwd); - - if (hasLocalIndex) { - console.error(`GitNexus: Using local index at ${local.storagePath}`); - await startMCPServer(local); - return; + // 1. Explicit override (highest priority) + if (process.env.GITNEXUS_CWD) { + candidates.push(process.env.GITNEXUS_CWD); } - // No local index - fall back to browser bridge - console.error('GitNexus: No local .gitnexus/ found, starting browser bridge...'); + // 2. Current working directory + candidates.push(process.cwd()); - const bridge = new WebSocketBridge(port); - const started = await bridge.start(); - - if (!started) { - console.error(`Failed to start GitNexus browser bridge on port ${port}.`); - console.error('Run "gitnexus analyze" to index this repository for standalone mode.'); - process.exit(1); + // 3. VS Code workspace folders (if available via env) + if (process.env.VSCODE_WORKSPACE_FOLDER) { + candidates.push(process.env.VSCODE_WORKSPACE_FOLDER); } - await startMCPServer(bridge); + // Deduplicate while preserving order + return [...new Set(candidates.map(p => path.resolve(p)))]; +} + +/** + * Find a git repository root by walking up the directory tree + */ +async function findGitRoot(startPath: string): Promise { + let current = path.resolve(startPath); + const root = path.parse(current).root; + + while (current !== root) { + try { + const gitPath = path.join(current, '.git'); + const stat = await fs.stat(gitPath); + if (stat.isDirectory()) return current; + } catch {} + current = path.dirname(current); + } + return null; +} + +export async function serveCommand(_options: ServeOptions) { + // Try multiple candidate paths to find .gitnexus/ + const candidates = getCandidatePaths(); + + for (const candidate of candidates) { + const repo = await findRepo(candidate); + if (repo) { + const local = new LocalBackend(); + await local.init(candidate); + console.error(`GitNexus: Found index at ${repo.storagePath}`); + await startMCPServer(local); + return; + } + } + + // No index found - give helpful error message + for (const candidate of candidates) { + const gitRoot = await findGitRoot(candidate); + if (gitRoot) { + console.error(''); + console.error('╔════════════════════════════════════════════════════╗'); + console.error('║ GitNexus: Repository Not Indexed ║'); + console.error('╠════════════════════════════════════════════════════╣'); + console.error(`║ Found git repo: ${gitRoot.slice(0, 35).padEnd(35)} ║`); + console.error('║ ║'); + console.error('║ To enable AI code understanding, run: ║'); + console.error('║ ║'); + console.error('║ npx gitnexus-cli analyze ║'); + console.error('║ ║'); + console.error('║ Then restart your IDE. ║'); + console.error('╚════════════════════════════════════════════════════╝'); + console.error(''); + process.exit(1); + } + } + + // No git repo found + console.error('GitNexus: No git repository found.'); + console.error(`Searched: ${candidates.join(', ')}`); + process.exit(1); } diff --git a/gitnexus-mcp/src/core/embedder.ts b/gitnexus-mcp/src/core/embedder.ts new file mode 100644 index 000000000..2979ddc53 --- /dev/null +++ b/gitnexus-mcp/src/core/embedder.ts @@ -0,0 +1,110 @@ +/** + * Embedder Module (Read-Only) + * + * Singleton factory for transformers.js embedding pipeline. + * For MCP, we only need to compute query embeddings, not batch embed. + */ + +import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; + +// Model config +const MODEL_ID = 'Snowflake/snowflake-arctic-embed-xs'; +const EMBEDDING_DIMS = 384; + +// Module-level state for singleton pattern +let embedderInstance: FeatureExtractionPipeline | null = null; +let isInitializing = false; +let initPromise: Promise | null = null; + +/** + * Initialize the embedding model (lazy, on first search) + */ +export const initEmbedder = async (): Promise => { + if (embedderInstance) { + return embedderInstance; + } + + if (isInitializing && initPromise) { + return initPromise; + } + + isInitializing = true; + + initPromise = (async () => { + try { + env.allowLocalModels = false; + + console.error('GitNexus: Loading embedding model (first search may take a moment)...'); + + // Try WebGPU first (Windows DirectX12), fall back to CPU + const devicesToTry: Array<'webgpu' | 'cpu'> = ['webgpu', 'cpu']; + + for (const device of devicesToTry) { + try { + embedderInstance = await (pipeline as any)( + 'feature-extraction', + MODEL_ID, + { + device: device, + dtype: 'fp32', + } + ); + console.error(`GitNexus: Embedding model loaded (${device})`); + return embedderInstance!; + } catch { + if (device === 'cpu') throw new Error('Failed to load embedding model'); + } + } + + throw new Error('No suitable device found'); + } catch (error) { + isInitializing = false; + initPromise = null; + embedderInstance = null; + throw error; + } finally { + isInitializing = false; + } + })(); + + return initPromise; +}; + +/** + * Check if embedder is ready + */ +export const isEmbedderReady = (): boolean => embedderInstance !== null; + +/** + * Embed a query text for semantic search + */ +export const embedQuery = async (query: string): Promise => { + const embedder = await initEmbedder(); + + const result = await embedder(query, { + pooling: 'mean', + normalize: true, + }); + + return Array.from(result.data as ArrayLike); +}; + +/** + * Get embedding dimensions + */ +export const getEmbeddingDims = (): number => EMBEDDING_DIMS; + +/** + * Cleanup embedder + */ +export const disposeEmbedder = async (): Promise => { + if (embedderInstance) { + try { + if ('dispose' in embedderInstance && typeof embedderInstance.dispose === 'function') { + await embedderInstance.dispose(); + } + } catch {} + embedderInstance = null; + initPromise = null; + } +}; diff --git a/gitnexus-mcp/src/local/local-backend.ts b/gitnexus-mcp/src/local/local-backend.ts index 0aa191dac..4bcd13bcf 100644 --- a/gitnexus-mcp/src/local/local-backend.ts +++ b/gitnexus-mcp/src/local/local-backend.ts @@ -9,6 +9,7 @@ import fs from 'fs/promises'; import path from 'path'; import { initKuzu, executeQuery, closeKuzu, isKuzuReady } from '../core/kuzu-adapter.js'; import { loadBM25Index, searchBM25, isBM25Ready } from '../core/bm25-index.js'; +import { embedQuery, getEmbeddingDims, disposeEmbedder } from '../core/embedder.js'; export interface RepoMeta { repoPath: string; @@ -46,7 +47,18 @@ function getStoragePaths(repoPath: string) { async function loadMeta(storagePath: string): Promise { try { + // Verify both meta.json and kuzu exist for a valid index const metaPath = path.join(storagePath, 'meta.json'); + const kuzuPath = path.join(storagePath, 'kuzu'); + + // Check kuzu exists (can be file or directory depending on how it was saved) + try { + await fs.stat(kuzuPath); + } catch { + return null; // kuzu doesn't exist + } + + // Load and parse meta.json const raw = await fs.readFile(metaPath, 'utf-8'); return JSON.parse(raw) as RepoMeta; } catch { @@ -205,88 +217,204 @@ export class LocalBackend { ].join('\n'); } - private async search(params: { query: string; limit?: number; depth?: string }): Promise { + private async search(params: { query: string; limit?: number; depth?: string; groupByProcess?: boolean }): Promise { await this.ensureInitialized(); const limit = params.limit || 10; const query = params.query; const depth = params.depth || 'definitions'; - // BM25 keyword search - const bm25Results = isBM25Ready() ? searchBM25(query, limit * 2) : []; + // Run BM25 and semantic search in parallel + const [bm25Results, semanticResults] = await Promise.all([ + this.bm25Search(query, limit * 2), + this.semanticSearch(query, limit * 2), + ]); - if (bm25Results.length === 0) { - return { message: 'No results found', query, bm25Ready: isBM25Ready() }; + // Merge and deduplicate results using reciprocal rank fusion + const scoreMap = new Map(); + + // BM25 results + for (let i = 0; i < bm25Results.length; i++) { + const result = bm25Results[i]; + const key = result.filePath; + const rrfScore = 1 / (60 + i); // RRF formula with k=60 + const existing = scoreMap.get(key); + if (existing) { + existing.score += rrfScore; + existing.source = 'hybrid'; + } else { + scoreMap.set(key, { score: rrfScore, source: 'bm25', data: result }); + } } - // Get node details from kuzu for top results + // Semantic results + for (let i = 0; i < semanticResults.length; i++) { + const result = semanticResults[i]; + const key = result.filePath; + const rrfScore = 1 / (60 + i); + const existing = scoreMap.get(key); + if (existing) { + existing.score += rrfScore; + existing.source = 'hybrid'; + } else { + scoreMap.set(key, { score: rrfScore, source: 'semantic', data: result }); + } + } + + // Sort by fused score and take top results + const merged = Array.from(scoreMap.entries()) + .sort((a, b) => b[1].score - a[1].score) + .slice(0, limit); + + // Enrich with graph data const results: any[] = []; - for (const bm25Result of bm25Results.slice(0, limit)) { + for (const [_, item] of merged) { + const result = item.data; + result.searchSource = item.source; + result.fusedScore = item.score; + + // Add relationships if depth is 'full' and we have a node ID + if (depth === 'full' && result.nodeId) { + try { + const relQuery = ` + MATCH (n {id: '${result.nodeId.replace(/'/g, "''")}'})-[r:CodeRelation]->(m) + RETURN r.type AS type, m.name AS targetName, m.filePath AS targetPath + LIMIT 5 + `; + const rels = await executeQuery(relQuery); + result.connections = rels.map((rel: any) => ({ + type: rel.type || rel[0], + name: rel.targetName || rel[1], + path: rel.targetPath || rel[2], + })); + } catch { + result.connections = []; + } + } + + results.push(result); + } + + return results; + } + + /** + * BM25 keyword search helper + */ + private async bm25Search(query: string, limit: number): Promise { + if (!isBM25Ready()) return []; + + const bm25Results = searchBM25(query, limit); + const results: any[] = []; + + for (const bm25Result of bm25Results) { + const fileName = bm25Result.filePath.split('/').pop() || bm25Result.filePath; try { - // Use CONTAINS to match file paths (handles relative vs full paths) - const fileName = bm25Result.filePath.split('/').pop() || bm25Result.filePath; const symbolQuery = ` MATCH (n) WHERE n.filePath CONTAINS '${fileName.replace(/'/g, "''")}' RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine - LIMIT 5 + LIMIT 3 `; const symbols = await executeQuery(symbolQuery); if (symbols.length > 0) { for (const sym of symbols) { - const result: any = { + results.push({ + nodeId: sym.id || sym[0], name: sym.name || sym[1], type: sym.type || sym[2], filePath: sym.filePath || sym[3], startLine: sym.startLine || sym[4], endLine: sym.endLine || sym[5], - score: bm25Result.score, - }; - - // Add relationships if depth is 'full' - if (depth === 'full') { - const relQuery = ` - MATCH (n {id: '${(sym.id || sym[0]).replace(/'/g, "''")}' })-[r:CodeRelation]->(m) - RETURN r.type AS type, m.name AS targetName, m.filePath AS targetPath - LIMIT 5 - `; - try { - const rels = await executeQuery(relQuery); - result.connections = rels.map((rel: any) => ({ - type: rel.type || rel[0], - name: rel.targetName || rel[1], - path: rel.targetPath || rel[2], - })); - } catch { - result.connections = []; - } - } - - results.push(result); + bm25Score: bm25Result.score, + }); } } else { - // No symbols found in kuzu, return file info from BM25 results.push({ name: fileName, type: 'File', filePath: bm25Result.filePath, - score: bm25Result.score, + bm25Score: bm25Result.score, }); } } catch { - // On kuzu error, still return BM25 result results.push({ - name: bm25Result.filePath.split('/').pop(), + name: fileName, type: 'File', filePath: bm25Result.filePath, - score: bm25Result.score, + bm25Score: bm25Result.score, }); } } - return results.slice(0, limit); + return results; + } + + /** + * Semantic vector search helper + */ + private async semanticSearch(query: string, limit: number): Promise { + try { + // Embed the query + const queryVec = await embedQuery(query); + const dims = getEmbeddingDims(); + const queryVecStr = `[${queryVec.join(',')}]`; + + // Query vector index + const vectorQuery = ` + CALL QUERY_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx', + CAST(${queryVecStr} AS FLOAT[${dims}]), ${limit}) + YIELD node AS emb, distance + WITH emb, distance + WHERE distance < 0.6 + RETURN emb.nodeId AS nodeId, distance + ORDER BY distance + `; + + const embResults = await executeQuery(vectorQuery); + + if (embResults.length === 0) return []; + + // Get metadata for each result + const results: any[] = []; + + for (const embRow of embResults) { + const nodeId = embRow.nodeId ?? embRow[0]; + const distance = embRow.distance ?? embRow[1]; + + // Extract label from node ID + const labelEndIdx = nodeId.indexOf(':'); + const label = labelEndIdx > 0 ? nodeId.substring(0, labelEndIdx) : 'Unknown'; + + try { + const nodeQuery = label === 'File' + ? `MATCH (n:File {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath` + : `MATCH (n:${label} {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine`; + + const nodeRows = await executeQuery(nodeQuery); + if (nodeRows.length > 0) { + const nodeRow = nodeRows[0]; + results.push({ + nodeId, + name: nodeRow.name ?? nodeRow[0] ?? '', + type: label, + filePath: nodeRow.filePath ?? nodeRow[1] ?? '', + distance, + startLine: label !== 'File' ? (nodeRow.startLine ?? nodeRow[2]) : undefined, + endLine: label !== 'File' ? (nodeRow.endLine ?? nodeRow[3]) : undefined, + }); + } + } catch {} + } + + return results; + } catch (err: any) { + // Semantic search unavailable (no embeddings or model not loaded) + console.error('GitNexus: Semantic search unavailable -', err.message); + return []; + } } private async cypher(params: { query: string }): Promise { @@ -580,8 +708,9 @@ export class LocalBackend { }; } - disconnect(): void { + async disconnect(): Promise { closeKuzu(); + await disposeEmbedder(); this.repo = null; this._context = null; this.initialized = false; diff --git a/gitnexus-mcp/src/mcp/server.ts b/gitnexus-mcp/src/mcp/server.ts index a5c4ef7e7..74f4b6100 100644 --- a/gitnexus-mcp/src/mcp/server.ts +++ b/gitnexus-mcp/src/mcp/server.ts @@ -2,12 +2,10 @@ * MCP Server * * Model Context Protocol server that runs on stdio. - * External AI tools (Cursor, Claude Code) spawn this process and + * External AI tools (Cursor, Claude) spawn this process and * communicate via stdin/stdout using the MCP protocol. * - * Exposes: - * - Tools: search, cypher, blastRadius, highlight - * - Resources: codebase context (stats, hotspots, folder tree) + * Tools: context, search, cypher, overview, explore, impact, analyze */ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; @@ -19,93 +17,50 @@ import { ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { GITNEXUS_TOOLS } from './tools.js'; -import type { CodebaseContext } from '../bridge/websocket-server.js'; - -// Interface for anything that can call tools (DaemonClient or WebSocketBridge) -interface ToolCaller { - callTool(method: string, params: any): Promise; - disconnect?(): void; - context?: CodebaseContext | null; - onContextChange?: (listener: (context: CodebaseContext | null) => void) => () => void; -} +import type { LocalBackend, CodebaseContext } from '../local/local-backend.js'; /** * Format context as markdown for the resource */ function formatContextAsMarkdown(context: CodebaseContext): string { - const { projectName, stats, hotspots, folderTree } = context; + const { projectName, stats } = context; const lines: string[] = []; lines.push(`# GitNexus: ${projectName}`); lines.push(''); - lines.push('This codebase is currently loaded in GitNexus. Use the tools below to explore it.'); + lines.push('## Stats'); + lines.push(`- Files: ${stats.fileCount}`); + lines.push(`- Functions: ${stats.functionCount}`); + if (stats.communityCount > 0) lines.push(`- Communities: ${stats.communityCount}`); + if (stats.processCount > 0) lines.push(`- Processes: ${stats.processCount}`); lines.push(''); - // Stats - lines.push('## 📊 Statistics'); - lines.push(`- **Files**: ${stats.fileCount}`); - lines.push(`- **Functions**: ${stats.functionCount}`); - if (stats.classCount > 0) lines.push(`- **Classes**: ${stats.classCount}`); - if (stats.interfaceCount > 0) lines.push(`- **Interfaces**: ${stats.interfaceCount}`); - if (stats.methodCount > 0) lines.push(`- **Methods**: ${stats.methodCount}`); + lines.push('## Available Tools'); + lines.push(''); + lines.push('- **context**: Codebase overview and stats'); + lines.push('- **search**: Hybrid semantic + keyword search'); + lines.push('- **cypher**: Execute Cypher queries on graph'); + lines.push('- **overview**: List communities and processes'); + lines.push('- **explore**: Deep dive on symbol/cluster/process'); + lines.push('- **impact**: Change impact analysis'); + lines.push('- **analyze**: Index/re-index repository'); lines.push(''); - // Hotspots - if (hotspots.length > 0) { - lines.push('## 🔥 Hotspots (Most Connected Nodes)'); - lines.push(''); - hotspots.forEach(h => { - lines.push(`- \`${h.name}\` (${h.type}) — ${h.connections} connections — ${h.filePath}`); - }); - lines.push(''); - } - - // Folder tree - if (folderTree) { - lines.push('## 📁 Project Structure'); - lines.push('```'); - lines.push(projectName + '/'); - lines.push(folderTree); - lines.push('```'); - lines.push(''); - } - - // Usage hints - lines.push('## 🛠️ Available Tools'); + lines.push('## Graph Schema'); lines.push(''); - lines.push('- **search**: Semantic + keyword search across codebase'); - lines.push('- **cypher**: Execute Cypher queries on knowledge graph'); - lines.push('- **grep**: Regex pattern search in files'); - lines.push('- **read**: Read file contents'); - lines.push('- **explore**: Deep dive on symbol, cluster, or process'); - lines.push('- **overview**: Codebase map (all clusters + processes)'); - lines.push('- **impact**: Analyze change impact (upstream/downstream)'); - lines.push('- **highlight**: Visualize nodes in graph'); + lines.push('**Nodes**: File, Function, Class, Interface, Method, Community, Process'); lines.push(''); - lines.push('## 📝 Graph Schema'); - lines.push(''); - lines.push('**Node Types**: File, Folder, Function, Class, Interface, Method, Community, Process'); - lines.push(''); - lines.push('**Relation**: `CodeRelation` with `type` property:'); - lines.push('- CALLS, IMPORTS, EXTENDS, IMPLEMENTS, CONTAINS, DEFINES'); - lines.push('- MEMBER_OF (symbol → community), STEP_IN_PROCESS (symbol → process)'); - lines.push(''); - lines.push('**Example Cypher Queries**:'); - lines.push('```cypher'); - lines.push('MATCH (f:Function) RETURN f.name LIMIT 10'); - lines.push("MATCH (f:File)-[:CodeRelation {type: 'IMPORTS'}]->(g:File) RETURN f.name, g.name"); - lines.push("MATCH (s)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community) RETURN c.label, count(s)"); - lines.push('```'); + lines.push('**Relations**: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS'); return lines.join('\n'); } -export async function startMCPServer(client: ToolCaller): Promise { +export async function startMCPServer(backend: LocalBackend): Promise { const server = new Server( { name: 'gitnexus', - version: '0.1.0', + version: '0.2.0', }, { capabilities: { @@ -117,7 +72,7 @@ export async function startMCPServer(client: ToolCaller): Promise { // Handle list resources request server.setRequestHandler(ListResourcesRequestSchema, async () => { - const context = client.context; + const context = backend.context; if (!context) { return { resources: [] }; @@ -128,7 +83,7 @@ export async function startMCPServer(client: ToolCaller): Promise { { uri: 'gitnexus://codebase/context', name: `GitNexus: ${context.projectName}`, - description: `Codebase context for ${context.projectName} (${context.stats.fileCount} files, ${context.stats.functionCount} functions)`, + description: `Codebase context for ${context.projectName} (${context.stats.fileCount} files)`, mimeType: 'text/markdown', }, ], @@ -140,7 +95,7 @@ export async function startMCPServer(client: ToolCaller): Promise { const { uri } = request.params; if (uri === 'gitnexus://codebase/context') { - const context = client.context; + const context = backend.context; if (!context) { return { @@ -148,7 +103,7 @@ export async function startMCPServer(client: ToolCaller): Promise { { uri, mimeType: 'text/plain', - text: 'No codebase loaded. Open GitNexus in your browser and load a repository.', + text: 'No codebase loaded.', }, ], }; @@ -182,8 +137,7 @@ export async function startMCPServer(client: ToolCaller): Promise { const { name, arguments: args } = request.params; try { - // Forward the tool call to the browser via daemon - const result = await client.callTool(name, args); + const result = await backend.callTool(name, args); return { content: [ @@ -213,13 +167,13 @@ export async function startMCPServer(client: ToolCaller): Promise { // Handle graceful shutdown process.on('SIGINT', async () => { - client.disconnect?.(); + await backend.disconnect(); await server.close(); process.exit(0); }); process.on('SIGTERM', async () => { - client.disconnect?.(); + await backend.disconnect(); await server.close(); process.exit(0); }); From 789e7809befdea87ffefb3a2d00ecdab7e2bd318 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Tue, 3 Feb 2026 22:54:01 +0530 Subject: [PATCH 05/36] docs: update license copyright holder --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index b7dfb94de..485af9b57 100644 --- a/LICENSE +++ b/LICENSE @@ -18,7 +18,7 @@ The licensor grants you an additional copyright license to distribute copies of You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example: -> Required Notice: Copyright Yoyodyne, Inc. (http://example.com) +> Required Notice: Copyright Abhigyan Patwari (https://github.com/abhigyanpatwari/GitNexus) ## Changes and New Works License From c90576442e483fd1276409379ac4e724d9aa274a Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 01:12:41 +0530 Subject: [PATCH 06/36] feat: merge gitnexus-mcp into gitnexus package - unified CLI+MCP --- gitnexus-cli/package-lock.json | 5012 -------- gitnexus-cli/package.json | 54 - gitnexus-cli/src/cli/mcp.ts | 8 - gitnexus-cli/src/core/embeddings/index.ts | 11 - gitnexus-cli/src/core/ingestion/pipeline.ts | 267 - gitnexus-cli/src/core/kuzu/kuzu-adapter.ts | 243 - .../src/core/tree-sitter/parser-loader.ts | 45 - gitnexus-cli/src/mcp/server.ts | 175 - gitnexus-cli/src/mcp/tools.ts | 47 - gitnexus-cli/tsconfig.json | 24 - gitnexus-test-setup/.gitignore | 7 + {gitnexus => gitnexus-web}/TODO.md | 0 {gitnexus => gitnexus-web}/api/proxy.ts | 0 .../docs/FRAMEWORK_SUPPORT.md | 0 {gitnexus => gitnexus-web}/index.html | 0 gitnexus-web/package-lock.json | 10215 +++++++++++++++ gitnexus-web/package.json | 67 + .../public/wasm/c/tree-sitter-c.wasm | Bin .../public/wasm/cpp/tree-sitter-cpp.wasm | Bin .../wasm/csharp/tree-sitter-csharp.wasm | Bin .../public/wasm/go/tree-sitter-go.wasm | Bin .../public/wasm/java/tree-sitter-java.wasm | Bin .../javascript/tree-sitter-javascript.wasm | Bin .../public/wasm/kuzu-wasm.wasm | Bin .../wasm/python/tree-sitter-python.wasm | Bin .../public/wasm/rust/tree-sitter-rust.wasm | Bin .../public/wasm/tree-sitter.wasm | Bin .../wasm/typescript/tree-sitter-tsx.wasm | Bin .../typescript/tree-sitter-typescript.wasm | Bin {gitnexus => gitnexus-web}/src/App.tsx | 0 .../src/components/ActivityFeed.tsx | 0 .../src/components/CodeReferencesPanel.tsx | 0 .../src/components/DropZone.tsx | 0 .../src/components/EmbeddingStatus.tsx | 0 .../src/components/FileTreePanel.tsx | 0 .../src/components/GraphCanvas.tsx | 0 .../src/components/Header.tsx | 0 .../components/IntelligentClusteringModal.tsx | 0 .../src/components/LoadingOverlay.tsx | 0 .../src/components/MCPToggle.tsx | 0 .../src/components/MarkdownRenderer.tsx | 0 .../src/components/MermaidDiagram.tsx | 0 .../src/components/ProcessFlowModal.tsx | 0 .../src/components/ProcessesPanel.tsx | 0 .../src/components/QueryFAB.tsx | 0 .../src/components/RightPanel.tsx | 0 .../src/components/SettingsPanel.tsx | 0 .../src/components/StatusBar.tsx | 0 .../src/components/ToolCallCard.tsx | 0 .../src/components/WebGPUFallbackDialog.tsx | 0 .../src/config/ignore-service.ts | 0 .../src/config/supported-languages.ts | 0 .../src/core/embeddings/embedder.ts | 157 +- .../src/core/embeddings/embedding-pipeline.ts | 22 +- gitnexus-web/src/core/embeddings/index.ts | 11 + .../src/core/embeddings/text-generator.ts | 4 +- .../src/core/embeddings/types.ts | 6 +- .../src/core/graph/graph.ts | 2 +- .../src/core/graph/types.ts | 0 .../src/core/ingestion/ast-cache.ts | 7 +- .../src/core/ingestion/call-processor.ts | 32 +- .../src/core/ingestion/cluster-enricher.ts | 2 +- .../src/core/ingestion/community-processor.ts | 16 +- .../src/core/ingestion/entry-point-scoring.ts | 2 +- .../src/core/ingestion/framework-detection.ts | 0 .../src/core/ingestion/heritage-processor.ts | 30 +- .../src/core/ingestion/import-processor.ts | 34 +- .../src/core/ingestion/parsing-processor.ts | 28 +- gitnexus-web/src/core/ingestion/pipeline.ts | 304 + .../src/core/ingestion/process-processor.ts | 10 +- .../src/core/ingestion/structure-processor.ts | 4 +- .../src/core/ingestion/symbol-table.ts | 0 .../src/core/ingestion/tree-sitter-queries.ts | 2 +- .../src/core/ingestion/utils.ts | 2 +- .../src/core/kuzu/csv-generator.ts | 9 +- gitnexus-web/src/core/kuzu/kuzu-adapter.ts | 520 + .../src/core/kuzu/schema.ts | 0 .../src/core/llm/agent.ts | 0 .../src/core/llm/context-builder.ts | 0 .../src/core/llm/index.ts | 0 .../src/core/llm/settings-service.ts | 0 .../src/core/llm/tools.ts | 0 .../src/core/llm/types.ts | 0 .../src/core/mcp/mcp-client.ts | 0 .../src/core/search/bm25-index.ts | 44 +- .../src/core/search/hybrid-search.ts | 19 +- .../src/core/search/index.ts | 0 .../src/core/tree-sitter/parser-loader.ts | 72 + .../src/hooks/useAppState.tsx | 0 .../src/hooks/useSettings.ts | 0 .../src/hooks/useSigma.ts | 0 {gitnexus => gitnexus-web}/src/index.css | 0 .../src/lib/constants.ts | 0 .../src/lib/graph-adapter.ts | 0 .../src/lib/mermaid-generator.ts | 0 .../src/lib/utils.ts | 0 {gitnexus => gitnexus-web}/src/main.tsx | 0 .../src/repomix-output.md | 0 .../src/services/git-clone.ts | 0 .../src/services/zip.ts | 0 .../src/types/kuzu-wasm.d.ts | 0 .../src/types/pipeline.ts | 6 +- {gitnexus => gitnexus-web}/src/vite-env.d.ts | 0 .../src/workers/ingestion.worker.ts | 0 {gitnexus => gitnexus-web}/tsconfig.app.json | 0 gitnexus-web/tsconfig.json | 7 + {gitnexus => gitnexus-web}/tsconfig.node.json | 0 {gitnexus => gitnexus-web}/vercel.json | 0 {gitnexus => gitnexus-web}/vite.config.ts | 0 gitnexus/package-lock.json | 10228 ++++------------ gitnexus/package.json | 99 +- {gitnexus-cli => gitnexus}/src/cli/analyze.ts | 0 {gitnexus-cli => gitnexus}/src/cli/clean.ts | 0 {gitnexus-cli => gitnexus}/src/cli/index.ts | 0 {gitnexus-cli => gitnexus}/src/cli/list.ts | 0 gitnexus/src/cli/mcp.ts | 94 + {gitnexus-cli => gitnexus}/src/cli/serve.ts | 0 {gitnexus-cli => gitnexus}/src/cli/status.ts | 0 gitnexus/src/core/embeddings/embedder.ts | 155 +- .../src/core/embeddings/embedding-pipeline.ts | 22 +- gitnexus/src/core/embeddings/index.ts | 8 +- .../src/core/embeddings/text-generator.ts | 4 +- gitnexus/src/core/embeddings/types.ts | 6 +- gitnexus/src/core/graph/graph.ts | 2 +- gitnexus/src/core/ingestion/ast-cache.ts | 7 +- gitnexus/src/core/ingestion/call-processor.ts | 32 +- .../src/core/ingestion/cluster-enricher.ts | 2 +- .../src/core/ingestion/community-processor.ts | 16 +- .../src/core/ingestion/entry-point-scoring.ts | 2 +- .../src/core/ingestion/filesystem-walker.ts | 0 .../src/core/ingestion/heritage-processor.ts | 30 +- .../src/core/ingestion/import-processor.ts | 34 +- .../src/core/ingestion/parsing-processor.ts | 28 +- gitnexus/src/core/ingestion/pipeline.ts | 475 +- .../src/core/ingestion/process-processor.ts | 10 +- .../src/core/ingestion/structure-processor.ts | 4 +- .../src/core/ingestion/tree-sitter-queries.ts | 2 +- gitnexus/src/core/ingestion/utils.ts | 2 +- gitnexus/src/core/kuzu/csv-generator.ts | 9 +- gitnexus/src/core/kuzu/kuzu-adapter.ts | 643 +- gitnexus/src/core/search/bm25-index.ts | 44 +- gitnexus/src/core/search/hybrid-search.ts | 19 +- .../src/core/tree-sitter/parser-loader.ts | 99 +- gitnexus/src/mcp/core/bm25-index.ts | 120 + gitnexus/src/mcp/core/embedder.ts | 110 + gitnexus/src/mcp/core/kuzu-adapter.ts | 54 + gitnexus/src/mcp/local/local-backend.ts | 718 ++ gitnexus/src/mcp/server.ts | 180 + gitnexus/src/mcp/tools.ts | 191 + {gitnexus-cli => gitnexus}/src/server/api.ts | 0 {gitnexus-cli => gitnexus}/src/storage/git.ts | 0 .../src/storage/repo-manager.ts | 0 gitnexus/src/types/pipeline.ts | 6 +- gitnexus/tsconfig.json | 27 +- 154 files changed, 16143 insertions(+), 14866 deletions(-) delete mode 100644 gitnexus-cli/package-lock.json delete mode 100644 gitnexus-cli/package.json delete mode 100644 gitnexus-cli/src/cli/mcp.ts delete mode 100644 gitnexus-cli/src/core/embeddings/index.ts delete mode 100644 gitnexus-cli/src/core/ingestion/pipeline.ts delete mode 100644 gitnexus-cli/src/core/kuzu/kuzu-adapter.ts delete mode 100644 gitnexus-cli/src/core/tree-sitter/parser-loader.ts delete mode 100644 gitnexus-cli/src/mcp/server.ts delete mode 100644 gitnexus-cli/src/mcp/tools.ts delete mode 100644 gitnexus-cli/tsconfig.json create mode 100644 gitnexus-test-setup/.gitignore rename {gitnexus => gitnexus-web}/TODO.md (100%) rename {gitnexus => gitnexus-web}/api/proxy.ts (100%) rename {gitnexus => gitnexus-web}/docs/FRAMEWORK_SUPPORT.md (100%) rename {gitnexus => gitnexus-web}/index.html (100%) create mode 100644 gitnexus-web/package-lock.json create mode 100644 gitnexus-web/package.json rename {gitnexus => gitnexus-web}/public/wasm/c/tree-sitter-c.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/cpp/tree-sitter-cpp.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/csharp/tree-sitter-csharp.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/go/tree-sitter-go.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/java/tree-sitter-java.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/javascript/tree-sitter-javascript.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/kuzu-wasm.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/python/tree-sitter-python.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/rust/tree-sitter-rust.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/tree-sitter.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/typescript/tree-sitter-tsx.wasm (100%) rename {gitnexus => gitnexus-web}/public/wasm/typescript/tree-sitter-typescript.wasm (100%) rename {gitnexus => gitnexus-web}/src/App.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/ActivityFeed.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/CodeReferencesPanel.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/DropZone.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/EmbeddingStatus.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/FileTreePanel.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/GraphCanvas.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/Header.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/IntelligentClusteringModal.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/LoadingOverlay.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/MCPToggle.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/MarkdownRenderer.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/MermaidDiagram.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/ProcessFlowModal.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/ProcessesPanel.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/QueryFAB.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/RightPanel.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/SettingsPanel.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/StatusBar.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/ToolCallCard.tsx (100%) rename {gitnexus => gitnexus-web}/src/components/WebGPUFallbackDialog.tsx (100%) rename {gitnexus-cli => gitnexus-web}/src/config/ignore-service.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/config/supported-languages.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/core/embeddings/embedder.ts (58%) rename {gitnexus-cli => gitnexus-web}/src/core/embeddings/embedding-pipeline.ts (97%) create mode 100644 gitnexus-web/src/core/embeddings/index.ts rename {gitnexus-cli => gitnexus-web}/src/core/embeddings/text-generator.ts (97%) rename {gitnexus-cli => gitnexus-web}/src/core/embeddings/types.ts (92%) rename {gitnexus-cli => gitnexus-web}/src/core/graph/graph.ts (98%) rename {gitnexus-cli => gitnexus-web}/src/core/graph/types.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/ast-cache.ts (82%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/call-processor.ts (93%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/cluster-enricher.ts (99%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/community-processor.ts (95%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/entry-point-scoring.ts (99%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/framework-detection.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/heritage-processor.ts (85%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/import-processor.ts (89%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/parsing-processor.ts (91%) create mode 100644 gitnexus-web/src/core/ingestion/pipeline.ts rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/process-processor.ts (98%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/structure-processor.ts (95%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/symbol-table.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/tree-sitter-queries.ts (99%) rename {gitnexus-cli => gitnexus-web}/src/core/ingestion/utils.ts (99%) rename {gitnexus-cli => gitnexus-web}/src/core/kuzu/csv-generator.ts (98%) create mode 100644 gitnexus-web/src/core/kuzu/kuzu-adapter.ts rename {gitnexus-cli => gitnexus-web}/src/core/kuzu/schema.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/agent.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/context-builder.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/index.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/settings-service.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/tools.ts (100%) rename {gitnexus => gitnexus-web}/src/core/llm/types.ts (100%) rename {gitnexus => gitnexus-web}/src/core/mcp/mcp-client.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/core/search/bm25-index.ts (76%) rename {gitnexus-cli => gitnexus-web}/src/core/search/hybrid-search.ts (84%) rename {gitnexus => gitnexus-web}/src/core/search/index.ts (100%) create mode 100644 gitnexus-web/src/core/tree-sitter/parser-loader.ts rename {gitnexus => gitnexus-web}/src/hooks/useAppState.tsx (100%) rename {gitnexus => gitnexus-web}/src/hooks/useSettings.ts (100%) rename {gitnexus => gitnexus-web}/src/hooks/useSigma.ts (100%) rename {gitnexus => gitnexus-web}/src/index.css (100%) rename {gitnexus => gitnexus-web}/src/lib/constants.ts (100%) rename {gitnexus => gitnexus-web}/src/lib/graph-adapter.ts (100%) rename {gitnexus => gitnexus-web}/src/lib/mermaid-generator.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/lib/utils.ts (100%) rename {gitnexus => gitnexus-web}/src/main.tsx (100%) rename {gitnexus => gitnexus-web}/src/repomix-output.md (100%) rename {gitnexus => gitnexus-web}/src/services/git-clone.ts (100%) rename {gitnexus => gitnexus-web}/src/services/zip.ts (100%) rename {gitnexus => gitnexus-web}/src/types/kuzu-wasm.d.ts (100%) rename {gitnexus-cli => gitnexus-web}/src/types/pipeline.ts (96%) rename {gitnexus => gitnexus-web}/src/vite-env.d.ts (100%) rename {gitnexus => gitnexus-web}/src/workers/ingestion.worker.ts (100%) rename {gitnexus => gitnexus-web}/tsconfig.app.json (100%) create mode 100644 gitnexus-web/tsconfig.json rename {gitnexus => gitnexus-web}/tsconfig.node.json (100%) rename {gitnexus => gitnexus-web}/vercel.json (100%) rename {gitnexus => gitnexus-web}/vite.config.ts (100%) rename {gitnexus-cli => gitnexus}/src/cli/analyze.ts (100%) rename {gitnexus-cli => gitnexus}/src/cli/clean.ts (100%) rename {gitnexus-cli => gitnexus}/src/cli/index.ts (100%) rename {gitnexus-cli => gitnexus}/src/cli/list.ts (100%) create mode 100644 gitnexus/src/cli/mcp.ts rename {gitnexus-cli => gitnexus}/src/cli/serve.ts (100%) rename {gitnexus-cli => gitnexus}/src/cli/status.ts (100%) rename {gitnexus-cli => gitnexus}/src/core/ingestion/filesystem-walker.ts (100%) create mode 100644 gitnexus/src/mcp/core/bm25-index.ts create mode 100644 gitnexus/src/mcp/core/embedder.ts create mode 100644 gitnexus/src/mcp/core/kuzu-adapter.ts create mode 100644 gitnexus/src/mcp/local/local-backend.ts create mode 100644 gitnexus/src/mcp/server.ts create mode 100644 gitnexus/src/mcp/tools.ts rename {gitnexus-cli => gitnexus}/src/server/api.ts (100%) rename {gitnexus-cli => gitnexus}/src/storage/git.ts (100%) rename {gitnexus-cli => gitnexus}/src/storage/repo-manager.ts (100%) diff --git a/gitnexus-cli/package-lock.json b/gitnexus-cli/package-lock.json deleted file mode 100644 index 71809a7e3..000000000 --- a/gitnexus-cli/package-lock.json +++ /dev/null @@ -1,5012 +0,0 @@ -{ - "name": "gitnexus", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "gitnexus", - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "@huggingface/transformers": "^3.0.0", - "@modelcontextprotocol/sdk": "^1.0.0", - "commander": "^12.0.0", - "cors": "^2.8.5", - "express": "^4.19.2", - "glob": "^11.0.0", - "graphology": "^0.25.4", - "graphology-communities-louvain": "^2.0.1", - "kuzu": "^0.11.3", - "lru-cache": "^11.0.0", - "minisearch": "^7.2.0", - "ora": "^8.0.0", - "tree-sitter": "^0.21.0", - "tree-sitter-c": "^0.21.0", - "tree-sitter-c-sharp": "^0.21.0", - "tree-sitter-cpp": "^0.22.0", - "tree-sitter-go": "^0.21.0", - "tree-sitter-java": "^0.20.0", - "tree-sitter-javascript": "^0.21.0", - "tree-sitter-python": "^0.21.0", - "tree-sitter-rust": "^0.21.0", - "tree-sitter-typescript": "^0.21.0", - "uuid": "^13.0.0" - }, - "bin": { - "gitnexus": "dist/cli/index.js" - }, - "devDependencies": { - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/node": "^20.0.0", - "@types/uuid": "^10.0.0", - "tsx": "^4.0.0", - "typescript": "^5.4.5" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.4.tgz", - "integrity": "sha512-VoQJywjpjy2D88Oj0BTHRuS8JCbUgoOg5t1UGgbtGh2fRia9Dx/k6Wf8FqrEWIvWK9fAkfJeeLB9fcSpCNPCpw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/transformers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", - "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", - "license": "Apache-2.0", - "dependencies": { - "@huggingface/jinja": "^0.5.3", - "onnxruntime-node": "1.21.0", - "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", - "sharp": "^0.34.1" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.3", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", - "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "jose": "^6.1.1", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.8", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", - "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", - "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", - "type-is": "~1.6.18", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cmake-js": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", - "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.5", - "debug": "^4", - "fs-extra": "^11.2.0", - "memory-stream": "^1.0.0", - "node-api-headers": "^1.1.0", - "npmlog": "^6.0.2", - "rc": "^1.2.7", - "semver": "^7.5.4", - "tar": "^6.2.0", - "url-join": "^4.0.1", - "which": "^2.0.2", - "yargs": "^17.7.2" - }, - "bin": { - "cmake-js": "bin/cmake-js" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/cmake-js/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/cmake-js/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", - "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", - "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", - "proxy-addr": "~2.0.7", - "qs": "~6.14.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", - "setprototypeof": "1.2.0", - "statuses": "~2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "~2.4.1", - "parseurl": "~1.3.3", - "statuses": "~2.0.2", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/flatbuffers": { - "version": "25.9.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - "license": "Apache-2.0" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", - "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", - "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", - "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.1.1", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/graphology": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz", - "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==", - "license": "MIT", - "dependencies": { - "events": "^3.3.0", - "obliterator": "^2.0.2" - }, - "peerDependencies": { - "graphology-types": ">=0.24.0" - } - }, - "node_modules/graphology-communities-louvain": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/graphology-communities-louvain/-/graphology-communities-louvain-2.0.2.tgz", - "integrity": "sha512-zt+2hHVPYxjEquyecxWXoUoIuN/UvYzsvI7boDdMNz0rRvpESQ7+e+Ejv6wK7AThycbZXuQ6DkG8NPMCq6XwoA==", - "license": "MIT", - "dependencies": { - "graphology-indices": "^0.17.0", - "graphology-utils": "^2.4.4", - "mnemonist": "^0.39.0", - "pandemonium": "^2.4.1" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, - "node_modules/graphology-indices": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", - "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.4.2", - "mnemonist": "^0.39.0" - }, - "peerDependencies": { - "graphology-types": ">=0.20.0" - } - }, - "node_modules/graphology-types": { - "version": "0.24.8", - "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", - "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", - "license": "MIT", - "peer": true - }, - "node_modules/graphology-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", - "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", - "license": "MIT", - "peerDependencies": { - "graphology-types": ">=0.23.0" - } - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "license": "ISC" - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hono": { - "version": "4.11.7", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", - "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kuzu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/kuzu/-/kuzu-0.11.3.tgz", - "integrity": "sha512-4+hD3Y+YMV3e0uiqTv1/GUal47D04l8qluw1WFWg8Nx3k7rLsHG1Pmq9WHIOlf1742svxQvTYQiuY6oS1qxAZA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "cmake-js": "^7.3.0", - "node-addon-api": "^6.0.0" - } - }, - "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/lru-cache": { - "version": "11.2.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", - "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memory-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", - "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "license": "MIT" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mnemonist": { - "version": "0.39.8", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", - "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", - "license": "MIT", - "dependencies": { - "obliterator": "^2.0.1" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/nan": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", - "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "license": "MIT" - }, - "node_modules/node-api-headers": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz", - "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==", - "license": "MIT" - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/obliterator": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", - "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", - "license": "MIT" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", - "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", - "license": "MIT" - }, - "node_modules/onnxruntime-node": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", - "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", - "hasInstallScript": true, - "license": "MIT", - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "global-agent": "^3.0.0", - "onnxruntime-common": "1.21.0", - "tar": "^7.0.1" - } - }, - "node_modules/onnxruntime-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/onnxruntime-node/node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.22.0-dev.20250409-89f8206ba4", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", - "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", - "license": "MIT", - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { - "version": "1.22.0-dev.20250409-89f8206ba4", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", - "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", - "license": "MIT" - }, - "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", - "license": "MIT", - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^2.0.0", - "log-symbols": "^6.0.0", - "stdin-discarder": "^0.2.2", - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/emoji-regex": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", - "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT" - }, - "node_modules/ora/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/pandemonium": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", - "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", - "license": "MIT", - "dependencies": { - "mnemonist": "^0.39.2" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", - "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" - }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/router/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT" - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.4.1", - "range-parser": "~1.2.1", - "statuses": "~2.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "~0.19.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stdin-discarder": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", - "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-sitter": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", - "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.0" - } - }, - "node_modules/tree-sitter-c": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.21.4.tgz", - "integrity": "sha512-IahxFIhXiY15SUlrt2upBiKSBGdOaE1fjKLK1Ik5zxqGHf6T1rvr3IJrovbsE5sXhypx7Hnmf50gshsppaIihA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-c-sharp": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/tree-sitter-c-sharp/-/tree-sitter-c-sharp-0.21.3.tgz", - "integrity": "sha512-TVsl5EhmqetO/mhzDPVnMK6TPFnpNMKP0OTNuAQIprshk5Hx672ODRxoIoG5WqvUUlsnBu8J0zmn35hmJqelsA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-c-sharp/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter-c/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter-cpp": { - "version": "0.22.3", - "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.22.3.tgz", - "integrity": "sha512-p7w5903L/koqTQFVDwyyX0vjioxoZu2G4zT2ZHVG8DvLQbWN6OjNAqfMsCi+WdVkfMgU+7j06hS8i3j6Q0sPNQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.1" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-cpp/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter-go": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.21.2.tgz", - "integrity": "sha512-aMFwjsB948nWhURiIxExK8QX29JYKs96P/IfXVvluVMRJZpL04SREHsdOZHYqJr1whkb7zr3/gWHqqvlkczmvw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.1.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-go/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter-java": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.20.2.tgz", - "integrity": "sha512-jc6RCnM+JE2ns1AkpErOp2Dp1jOADPbljsrWup0Vj2qTmG8KGYMSTD7HcrVRyZUC6pRLFySPMOh8x7Dn12aynw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "nan": "^2.14.1" - } - }, - "node_modules/tree-sitter-javascript": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.21.4.tgz", - "integrity": "sha512-Lrk8yahebwrwc1sWJE9xPcz1OnnqiEV7Dh5fbN6EN3wNAdu9r06HpTqLqDwUUbnG4EB46Sfk+FJFAOldfoKLOw==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.1" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-javascript/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter-python": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.21.0.tgz", - "integrity": "sha512-IUKx7JcTVbByUx1iHGFS/QsIjx7pqwTMHL9bl/NGyhyyydbfNrpruo2C7W6V4KZrbkkCOlX8QVrCoGOFW5qecg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.1.0", - "node-gyp-build": "^4.8.0" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-python/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/tree-sitter-rust": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.21.0.tgz", - "integrity": "sha512-unVr73YLn3VC4Qa/GF0Nk+Wom6UtI526p5kz9Rn2iZSqwIFedyCZ3e0fKCEmUJLIPGrTb/cIEdu3ZUNGzfZx7A==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^7.1.0", - "node-gyp-build": "^4.8.0" - }, - "peerDependencies": { - "tree-sitter": "^0.21.1" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-rust/node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "license": "MIT" - }, - "node_modules/tree-sitter-typescript": { - "version": "0.21.2", - "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.21.2.tgz", - "integrity": "sha512-/RyNK41ZpkA8PuPZimR6pGLvNR1p0ibRUJwwQn4qAjyyLEIQD/BNlwS3NSxWtGsAWZe9gZ44VK1mWx2+eQVldg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.0.0", - "node-gyp-build": "^4.8.1" - }, - "peerDependencies": { - "tree-sitter": "^0.21.0" - }, - "peerDependenciesMeta": { - "tree_sitter": { - "optional": true - } - } - }, - "node_modules/tree-sitter-typescript/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tree-sitter/node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - } - } -} diff --git a/gitnexus-cli/package.json b/gitnexus-cli/package.json deleted file mode 100644 index 43c3c018a..000000000 --- a/gitnexus-cli/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "gitnexus", - "version": "0.1.0", - "description": "GitNexus local CLI and MCP server", - "author": "Abhigyan Patwari", - "license": "MIT", - "type": "module", - "bin": { - "gitnexus": "./dist/cli/index.js" - }, - "files": [ - "dist" - ], - "scripts": { - "build": "tsc", - "dev": "tsx watch src/cli/index.ts" - }, - "dependencies": { - "@huggingface/transformers": "^3.0.0", - "@modelcontextprotocol/sdk": "^1.0.0", - "commander": "^12.0.0", - "cors": "^2.8.5", - "express": "^4.19.2", - "glob": "^11.0.0", - "graphology": "^0.25.4", - "graphology-communities-louvain": "^2.0.1", - "kuzu": "^0.11.3", - "lru-cache": "^11.0.0", - "minisearch": "^7.2.0", - "ora": "^8.0.0", - "tree-sitter": "^0.21.0", - "tree-sitter-c": "^0.21.0", - "tree-sitter-c-sharp": "^0.21.0", - "tree-sitter-cpp": "^0.22.0", - "tree-sitter-go": "^0.21.0", - "tree-sitter-java": "^0.20.0", - "tree-sitter-javascript": "^0.21.0", - "tree-sitter-python": "^0.21.0", - "tree-sitter-rust": "^0.21.0", - "tree-sitter-typescript": "^0.21.0", - "uuid": "^13.0.0" - }, - "devDependencies": { - "@types/cors": "^2.8.17", - "@types/express": "^4.17.21", - "@types/node": "^20.0.0", - "@types/uuid": "^10.0.0", - "tsx": "^4.0.0", - "typescript": "^5.4.5" - }, - "engines": { - "node": ">=18.0.0" - } -} diff --git a/gitnexus-cli/src/cli/mcp.ts b/gitnexus-cli/src/cli/mcp.ts deleted file mode 100644 index 4e5acdbf9..000000000 --- a/gitnexus-cli/src/cli/mcp.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { startMCPServer } from '../mcp/server.js'; - -export const mcpCommand = async () => { - await startMCPServer(); -}; - - - diff --git a/gitnexus-cli/src/core/embeddings/index.ts b/gitnexus-cli/src/core/embeddings/index.ts deleted file mode 100644 index 4b4f10bb5..000000000 --- a/gitnexus-cli/src/core/embeddings/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Embeddings Module - * - * Re-exports for the embedding pipeline system. - */ - -export * from './types.js'; -export * from './embedder.js'; -export * from './text-generator.js'; -export * from './embedding-pipeline.js'; - diff --git a/gitnexus-cli/src/core/ingestion/pipeline.ts b/gitnexus-cli/src/core/ingestion/pipeline.ts deleted file mode 100644 index 45b087db7..000000000 --- a/gitnexus-cli/src/core/ingestion/pipeline.ts +++ /dev/null @@ -1,267 +0,0 @@ -import { createKnowledgeGraph } from '../graph/graph.js'; -import { processStructure } from './structure-processor.js'; -import { processParsing } from './parsing-processor.js'; -import { processImports, createImportMap } from './import-processor.js'; -import { processCalls } from './call-processor.js'; -import { processHeritage } from './heritage-processor.js'; -import { processCommunities } from './community-processor.js'; -import { processProcesses } from './process-processor.js'; -import { createSymbolTable } from './symbol-table.js'; -import { createASTCache } from './ast-cache.js'; -import { PipelineProgress, PipelineResult } from '../../types/pipeline.js'; -import { walkRepository } from './filesystem-walker.js'; - -const isDev = process.env.NODE_ENV !== 'production'; - -export const runPipelineFromRepo = async ( - repoPath: string, - onProgress: (progress: PipelineProgress) => void -): Promise => { - const graph = createKnowledgeGraph(); - const fileContents = new Map(); - const symbolTable = createSymbolTable(); - const astCache = createASTCache(50); - const importMap = createImportMap(); - - const cleanup = () => { - astCache.clear(); - symbolTable.clear(); - }; - - try { - onProgress({ - phase: 'extracting', - percent: 0, - message: 'Scanning repository...', - }); - - const files = await walkRepository(repoPath, (current, total, filePath) => { - const scanProgress = Math.round((current / total) * 15); - onProgress({ - phase: 'extracting', - percent: scanProgress, - message: 'Scanning repository...', - detail: filePath, - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - files.forEach(f => fileContents.set(f.path, f.content)); - - onProgress({ - phase: 'extracting', - percent: 15, - message: 'Repository scanned successfully', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - onProgress({ - phase: 'structure', - percent: 15, - message: 'Analyzing project structure...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - const filePaths = files.map(f => f.path); - processStructure(graph, filePaths); - - onProgress({ - phase: 'structure', - percent: 30, - message: 'Project structure analyzed', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - onProgress({ - phase: 'parsing', - percent: 30, - message: 'Parsing code definitions...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processParsing(graph, files, symbolTable, astCache, (current, total, filePath) => { - const parsingProgress = 30 + ((current / total) * 40); - onProgress({ - phase: 'parsing', - percent: Math.round(parsingProgress), - message: 'Parsing code definitions...', - detail: filePath, - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - onProgress({ - phase: 'imports', - percent: 70, - message: 'Resolving imports...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processImports(graph, files, astCache, importMap, (current, total) => { - const importProgress = 70 + ((current / total) * 12); - onProgress({ - phase: 'imports', - percent: Math.round(importProgress), - message: 'Resolving imports...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - if (isDev) { - const importsCount = graph.relationships.filter(r => r.type === 'IMPORTS').length; - console.log(`📊 Pipeline: After import phase, graph has ${importsCount} IMPORTS relationships (total: ${graph.relationshipCount})`); - } - - onProgress({ - phase: 'calls', - percent: 82, - message: 'Tracing function calls...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processCalls(graph, files, astCache, symbolTable, importMap, (current, total) => { - const callProgress = 82 + ((current / total) * 10); - onProgress({ - phase: 'calls', - percent: Math.round(callProgress), - message: 'Tracing function calls...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - onProgress({ - phase: 'heritage', - percent: 92, - message: 'Extracting class inheritance...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processHeritage(graph, files, astCache, symbolTable, (current, total) => { - const heritageProgress = 88 + ((current / total) * 4); - onProgress({ - phase: 'heritage', - percent: Math.round(heritageProgress), - message: 'Extracting class inheritance...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - onProgress({ - phase: 'communities', - percent: 92, - message: 'Detecting code communities...', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - const communityResult = await processCommunities(graph, (message, progress) => { - const communityProgress = 92 + (progress * 0.06); - onProgress({ - phase: 'communities', - percent: Math.round(communityProgress), - message, - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - }); - - if (isDev) { - console.log(`🏘️ Community detection: ${communityResult.stats.totalCommunities} communities found (modularity: ${communityResult.stats.modularity.toFixed(3)})`); - } - - communityResult.communities.forEach(comm => { - graph.addNode({ - id: comm.id, - label: 'Community' as const, - properties: { - name: comm.label, - filePath: '', - heuristicLabel: comm.heuristicLabel, - cohesion: comm.cohesion, - symbolCount: comm.symbolCount, - } - }); - }); - - communityResult.memberships.forEach(membership => { - graph.addRelationship({ - id: `${membership.nodeId}_member_of_${membership.communityId}`, - type: 'MEMBER_OF', - sourceId: membership.nodeId, - targetId: membership.communityId, - confidence: 1.0, - reason: 'leiden-algorithm', - }); - }); - - onProgress({ - phase: 'processes', - percent: 98, - message: 'Detecting execution flows...', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - const processResult = await processProcesses( - graph, - communityResult.memberships, - (message, progress) => { - const processProgress = 98 + (progress * 0.01); - onProgress({ - phase: 'processes', - percent: Math.round(processProgress), - message, - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - } - ); - - if (isDev) { - console.log(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`); - } - - processResult.processes.forEach(proc => { - graph.addNode({ - id: proc.id, - label: 'Process' as const, - properties: { - name: proc.label, - filePath: '', - heuristicLabel: proc.heuristicLabel, - processType: proc.processType, - stepCount: proc.stepCount, - communities: proc.communities, - entryPointId: proc.entryPointId, - terminalId: proc.terminalId, - } - }); - }); - - processResult.steps.forEach(step => { - graph.addRelationship({ - id: `${step.nodeId}_step_${step.step}_${step.processId}`, - type: 'STEP_IN_PROCESS', - sourceId: step.nodeId, - targetId: step.processId, - confidence: 1.0, - reason: 'trace-detection', - step: step.step, - }); - }); - - onProgress({ - phase: 'complete', - percent: 100, - message: `Graph complete! ${communityResult.stats.totalCommunities} communities, ${processResult.stats.totalProcesses} processes detected.`, - stats: { - filesProcessed: files.length, - totalFiles: files.length, - nodesCreated: graph.nodeCount - }, - }); - - astCache.clear(); - - return { graph, fileContents, communityResult, processResult }; - } catch (error) { - cleanup(); - throw error; - } -}; diff --git a/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts b/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts deleted file mode 100644 index e42a6fb7c..000000000 --- a/gitnexus-cli/src/core/kuzu/kuzu-adapter.ts +++ /dev/null @@ -1,243 +0,0 @@ -import fs from 'fs/promises'; -import path from 'path'; -import kuzu from 'kuzu'; -import { KnowledgeGraph } from '../graph/types.js'; -import { - NODE_TABLES, - REL_TABLE_NAME, - SCHEMA_QUERIES, - EMBEDDING_TABLE_NAME, - NodeTableName, -} from './schema.js'; -import { generateAllCSVs } from './csv-generator.js'; - -let db: kuzu.Database | null = null; -let conn: kuzu.Connection | null = null; - -const normalizeCopyPath = (filePath: string): string => filePath.replace(/\\/g, '/'); - -export const initKuzu = async (dbPath: string) => { - if (conn) return { db, conn }; - - // kuzu v0.11 expects the database path to NOT exist (it will create it) - // or to be an existing valid kuzu database - // If an empty directory exists from a previous clean, remove it - try { - const stat = await fs.stat(dbPath); - if (stat.isDirectory()) { - // Check if it's an empty directory - const files = await fs.readdir(dbPath); - if (files.length === 0) { - // Empty directory - remove it so kuzu can create fresh - await fs.rmdir(dbPath); - } - } - } catch { - // Path doesn't exist, which is what kuzu v0.11 wants for a new database - } - - // Ensure parent directory exists - const parentDir = path.dirname(dbPath); - await fs.mkdir(parentDir, { recursive: true }); - - db = new kuzu.Database(dbPath); - conn = new kuzu.Connection(db); - - for (const schemaQuery of SCHEMA_QUERIES) { - try { - await conn.query(schemaQuery); - } catch { - // Schema may already exist - } - } - - return { db, conn }; -}; - -export const loadGraphToKuzu = async ( - graph: KnowledgeGraph, - fileContents: Map, - storagePath: string -) => { - if (!conn) { - throw new Error('KuzuDB not initialized. Call initKuzu first.'); - } - - const csvData = generateAllCSVs(graph, fileContents); - const csvDir = path.join(storagePath, 'csv'); - await fs.mkdir(csvDir, { recursive: true }); - - const nodeFiles: Array<{ table: NodeTableName; path: string }> = []; - for (const [tableName, csv] of csvData.nodes.entries()) { - if (csv.split('\n').length <= 1) continue; - const filePath = path.join(csvDir, `${tableName.toLowerCase()}.csv`); - await fs.writeFile(filePath, csv, 'utf-8'); - nodeFiles.push({ table: tableName, path: filePath }); - } - - const relLines = csvData.relCSV.split('\n').slice(1).filter(line => line.trim()); - - for (const { table, path: filePath } of nodeFiles) { - const copyQuery = getCopyQuery(table, normalizeCopyPath(filePath)); - await conn.query(copyQuery); - } - - let insertedRels = 0; - let skippedRels = 0; - for (const line of relLines) { - try { - const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)",([0-9-]+)/); - if (!match) continue; - const [, fromId, toId, relType, confidenceStr, reason, stepStr] = match; - const confidence = parseFloat(confidenceStr) || 1.0; - const step = parseInt(stepStr) || 0; - - const getNodeLabel = (nodeId: string): string => { - if (nodeId.startsWith('comm_')) return 'Community'; - if (nodeId.startsWith('proc_')) return 'Process'; - return nodeId.split(':')[0]; - }; - - const RESERVED_LABELS = ['Macro', 'Enum', 'Union', 'Const', 'Module', 'Struct']; - const escapeLabel = (label: string): string => { - return RESERVED_LABELS.includes(label) ? `\`${label}\`` : label; - }; - - const fromLabel = escapeLabel(getNodeLabel(fromId)); - const toLabel = escapeLabel(getNodeLabel(toId)); - - const insertQuery = ` - MATCH (a:${fromLabel} {id: '${fromId.replace(/'/g, "''")}' }), - (b:${toLabel} {id: '${toId.replace(/'/g, "''")}' }) - CREATE (a)-[:${REL_TABLE_NAME} {type: '${relType}', confidence: ${confidence}, reason: '${reason.replace(/'/g, "''")}', step: ${step}}]->(b) - `; - await conn.query(insertQuery); - insertedRels++; - } catch { - skippedRels++; - } - } - - // Cleanup CSVs - for (const { path: filePath } of nodeFiles) { - try { - await fs.unlink(filePath); - } catch { - // ignore - } - } - - return { success: true, insertedRels, skippedRels }; -}; - -const getCopyQuery = (table: NodeTableName, filePath: string): string => { - if (table === 'File') { - return `COPY File(id, name, filePath, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; - } - if (table === 'Folder') { - return `COPY Folder(id, name, filePath) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; - } - if (table === 'Community') { - return `COPY Community(id, label, heuristicLabel, keywords, description, enrichedBy, cohesion, symbolCount) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; - } - if (table === 'Process') { - return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; - } - return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; -}; - -export const executeQuery = async (cypher: string): Promise => { - if (!conn) { - throw new Error('KuzuDB not initialized. Call initKuzu first.'); - } - - const queryResult = await conn.query(cypher); - // kuzu v0.11 uses getAll() instead of hasNext()/getNext() - // Query returns QueryResult for single queries, QueryResult[] for multi-statement - const result = Array.isArray(queryResult) ? queryResult[0] : queryResult; - const rows = await result.getAll(); - return rows; -}; - -export const executeWithReusedStatement = async ( - cypher: string, - paramsList: Array> -): Promise => { - if (!conn) { - throw new Error('KuzuDB not initialized. Call initKuzu first.'); - } - if (paramsList.length === 0) return; - - const SUB_BATCH_SIZE = 4; - for (let i = 0; i < paramsList.length; i += SUB_BATCH_SIZE) { - const subBatch = paramsList.slice(i, i + SUB_BATCH_SIZE); - const stmt = await conn.prepare(cypher); - if (!stmt.isSuccess()) { - const errMsg = await stmt.getErrorMessage(); - throw new Error(`Prepare failed: ${errMsg}`); - } - try { - for (const params of subBatch) { - await conn.execute(stmt, params); - } - } catch (e) { - // Log the error and continue with next batch - console.warn('Batch execution error:', e); - } - // Note: kuzu 0.8.2 PreparedStatement doesn't require explicit close() - } -}; - -export const getKuzuStats = async (): Promise<{ nodes: number; edges: number }> => { - if (!conn) return { nodes: 0, edges: 0 }; - - let totalNodes = 0; - for (const tableName of NODE_TABLES) { - try { - const queryResult = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); - const nodeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; - const nodeRows = await nodeResult.getAll(); - if (nodeRows.length > 0) { - totalNodes += Number(nodeRows[0]?.cnt ?? nodeRows[0]?.[0] ?? 0); - } - } catch { - // ignore - } - } - - let totalEdges = 0; - try { - const queryResult = await conn.query(`MATCH ()-[r:${REL_TABLE_NAME}]->() RETURN count(r) AS cnt`); - const edgeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; - const edgeRows = await edgeResult.getAll(); - if (edgeRows.length > 0) { - totalEdges = Number(edgeRows[0]?.cnt ?? edgeRows[0]?.[0] ?? 0); - } - } catch { - // ignore - } - - return { nodes: totalNodes, edges: totalEdges }; -}; - -export const closeKuzu = async (): Promise => { - if (conn) { - try { - await conn.close(); - } catch {} - conn = null; - } - if (db) { - try { - await db.close(); - } catch {} - db = null; - } -}; - -export const isKuzuReady = (): boolean => conn !== null && db !== null; - -export const getEmbeddingTableName = (): string => EMBEDDING_TABLE_NAME; - - - diff --git a/gitnexus-cli/src/core/tree-sitter/parser-loader.ts b/gitnexus-cli/src/core/tree-sitter/parser-loader.ts deleted file mode 100644 index cdca3003d..000000000 --- a/gitnexus-cli/src/core/tree-sitter/parser-loader.ts +++ /dev/null @@ -1,45 +0,0 @@ -import Parser from 'tree-sitter'; -import JavaScript from 'tree-sitter-javascript'; -import TypeScript from 'tree-sitter-typescript'; -import Python from 'tree-sitter-python'; -import Java from 'tree-sitter-java'; -import C from 'tree-sitter-c'; -import CPP from 'tree-sitter-cpp'; -import CSharp from 'tree-sitter-c-sharp'; -import Go from 'tree-sitter-go'; -import Rust from 'tree-sitter-rust'; -import { SupportedLanguages } from '../../config/supported-languages.js'; - -let parser: Parser | null = null; - -const languageMap: Record = { - [SupportedLanguages.JavaScript]: JavaScript, - [SupportedLanguages.TypeScript]: TypeScript.typescript, - [`${SupportedLanguages.TypeScript}:tsx`]: TypeScript.tsx, - [SupportedLanguages.Python]: Python, - [SupportedLanguages.Java]: Java, - [SupportedLanguages.C]: C, - [SupportedLanguages.CPlusPlus]: CPP, - [SupportedLanguages.CSharp]: CSharp, - [SupportedLanguages.Go]: Go, - [SupportedLanguages.Rust]: Rust, -}; - -export const loadParser = async (): Promise => { - if (parser) return parser; - parser = new Parser(); - return parser; -}; - -export const loadLanguage = async (language: SupportedLanguages, filePath?: string): Promise => { - if (!parser) await loadParser(); - const key = language === SupportedLanguages.TypeScript && filePath?.endsWith('.tsx') - ? `${language}:tsx` - : language; - - const lang = languageMap[key]; - if (!lang) { - throw new Error(`Unsupported language: ${language}`); - } - parser!.setLanguage(lang); -}; diff --git a/gitnexus-cli/src/mcp/server.ts b/gitnexus-cli/src/mcp/server.ts deleted file mode 100644 index 9c59776ba..000000000 --- a/gitnexus-cli/src/mcp/server.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * CLI MCP Server - * - * Standalone MCP server that uses local .gitnexus/ index. - */ - -import path from 'path'; -import fs from 'fs/promises'; -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -import { - CallToolRequestSchema, - ListToolsRequestSchema, - ListResourcesRequestSchema, - ReadResourceRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; -import { GITNEXUS_TOOLS } from './tools.js'; -import { findRepo } from '../storage/repo-manager.js'; -import { initKuzu, executeQuery } from '../core/kuzu/kuzu-adapter.js'; -import { loadBM25Index, isBM25Ready, searchBM25 } from '../core/search/bm25-index.js'; -import { hybridSearch } from '../core/search/hybrid-search.js'; -import { semanticSearch } from '../core/embeddings/embedding-pipeline.js'; -import { isEmbedderReady } from '../core/embeddings/embedder.js'; - -const notIndexedMessage = (cwd: string) => ` -Repository not indexed. - -Run: - cd ${cwd} - gitnexus analyze -`; - -const formatContext = (meta: { repoPath: string; indexedAt: string; lastCommit: string; stats?: any }) => { - const stats = meta.stats || {}; - return [ - `# GitNexus: ${meta.repoPath}`, - '', - '## Stats', - `- Files: ${stats.files ?? 0}`, - `- Nodes: ${stats.nodes ?? 0}`, - `- Edges: ${stats.edges ?? 0}`, - `- Communities: ${stats.communities ?? 0}`, - `- Processes: ${stats.processes ?? 0}`, - '', - `Indexed at: ${meta.indexedAt}`, - `Last commit: ${meta.lastCommit}`, - '', - '## Available Tools', - '- search, cypher, read, overview', - ].join('\n'); -}; - -export const startMCPServer = async () => { - const server = new Server( - { name: 'gitnexus', version: '0.1.0' }, - { capabilities: { tools: {}, resources: {} } } - ); - - server.setRequestHandler(ListResourcesRequestSchema, async () => { - const repo = await findRepo(process.cwd()); - if (!repo) return { resources: [] }; - return { - resources: [ - { - uri: 'gitnexus://context', - name: `GitNexus: ${repo.meta.repoPath}`, - description: 'Indexed repository context', - mimeType: 'text/markdown', - }, - ], - }; - }); - - server.setRequestHandler(ReadResourceRequestSchema, async (request) => { - if (request.params.uri !== 'gitnexus://context') { - throw new Error(`Unknown resource: ${request.params.uri}`); - } - const repo = await findRepo(process.cwd()); - if (!repo) { - return { - contents: [ - { - uri: 'gitnexus://context', - mimeType: 'text/plain', - text: notIndexedMessage(process.cwd()), - }, - ], - }; - } - return { - contents: [ - { - uri: 'gitnexus://context', - mimeType: 'text/markdown', - text: formatContext(repo.meta), - }, - ], - }; - }); - - server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: GITNEXUS_TOOLS.map((tool) => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })), - })); - - server.setRequestHandler(CallToolRequestSchema, async (request) => { - const repo = await findRepo(process.cwd()); - if (!repo) { - return { - content: [{ type: 'text', text: notIndexedMessage(process.cwd()) }], - isError: true, - }; - } - - await initKuzu(repo.kuzuPath); - await loadBM25Index(repo.bm25Path); - - const name = request.params.name; - const args = request.params.arguments || {}; - - if (name === 'search') { - const query = String(args.query || ''); - const limit = Number(args.limit ?? 10); - let results: any[] = []; - if (isBM25Ready() && isEmbedderReady()) { - results = await hybridSearch(query, limit, executeQuery, semanticSearch); - } else if (isBM25Ready()) { - results = searchBM25(query, limit); - } else if (isEmbedderReady()) { - results = await semanticSearch(executeQuery, query, limit); - } - return { - content: [{ type: 'text', text: JSON.stringify(results, null, 2) }], - }; - } - - if (name === 'cypher') { - const query = String(args.query || ''); - const result = await executeQuery(query); - return { - content: [{ type: 'text', text: JSON.stringify(result, null, 2) }], - }; - } - - if (name === 'read') { - const filePath = args.path; - if (!filePath) { - return { - content: [{ type: 'text', text: 'Missing path.' }], - isError: true, - }; - } - const fullPath = path.join(repo.repoPath, String(filePath)); - const content = await fs.readFile(fullPath, 'utf-8'); - return { content: [{ type: 'text', text: content }] }; - } - - if (name === 'overview') { - return { - content: [{ type: 'text', text: JSON.stringify(repo.meta, null, 2) }], - }; - } - - return { - content: [{ type: 'text', text: `Unknown tool: ${name}` }], - isError: true, - }; - }); - - const transport = new StdioServerTransport(); - await server.connect(transport); -}; diff --git a/gitnexus-cli/src/mcp/tools.ts b/gitnexus-cli/src/mcp/tools.ts deleted file mode 100644 index 6ce5d1e77..000000000 --- a/gitnexus-cli/src/mcp/tools.ts +++ /dev/null @@ -1,47 +0,0 @@ -export const GITNEXUS_TOOLS = [ - { - name: 'search', - description: 'Hybrid search across the indexed repository (BM25 + semantic if available).', - inputSchema: { - type: 'object', - properties: { - query: { type: 'string', description: 'Search query' }, - limit: { type: 'number', description: 'Max results', default: 10 }, - }, - required: ['query'], - }, - }, - { - name: 'cypher', - description: 'Execute a Cypher query on the knowledge graph.', - inputSchema: { - type: 'object', - properties: { - query: { type: 'string', description: 'Cypher query string' }, - }, - required: ['query'], - }, - }, - { - name: 'read', - description: 'Read a file from the repository.', - inputSchema: { - type: 'object', - properties: { - path: { type: 'string', description: 'File path relative to repo root' }, - }, - required: ['path'], - }, - }, - { - name: 'overview', - description: 'Return basic stats for the indexed repository.', - inputSchema: { - type: 'object', - properties: {}, - }, - }, -]; - - - diff --git a/gitnexus-cli/tsconfig.json b/gitnexus-cli/tsconfig.json deleted file mode 100644 index 7fc8c33ce..000000000 --- a/gitnexus-cli/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "lib": [ - "ES2022" - ], - "module": "NodeNext", - "moduleResolution": "NodeNext", - "outDir": "dist", - "rootDir": "src", - "strict": false, - "esModuleInterop": true, - "skipLibCheck": true, - "resolveJsonModule": true, - "forceConsistentCasingInFileNames": true, - "declaration": true, - "types": [ - "node" - ] - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file diff --git a/gitnexus-test-setup/.gitignore b/gitnexus-test-setup/.gitignore new file mode 100644 index 000000000..c66cf2d98 --- /dev/null +++ b/gitnexus-test-setup/.gitignore @@ -0,0 +1,7 @@ + +# GitNexus AI Context +.gitnexus-rules.md +.cursorrules +.windsurfrules +CLAUDE.md +.github/copilot-instructions.md diff --git a/gitnexus/TODO.md b/gitnexus-web/TODO.md similarity index 100% rename from gitnexus/TODO.md rename to gitnexus-web/TODO.md diff --git a/gitnexus/api/proxy.ts b/gitnexus-web/api/proxy.ts similarity index 100% rename from gitnexus/api/proxy.ts rename to gitnexus-web/api/proxy.ts diff --git a/gitnexus/docs/FRAMEWORK_SUPPORT.md b/gitnexus-web/docs/FRAMEWORK_SUPPORT.md similarity index 100% rename from gitnexus/docs/FRAMEWORK_SUPPORT.md rename to gitnexus-web/docs/FRAMEWORK_SUPPORT.md diff --git a/gitnexus/index.html b/gitnexus-web/index.html similarity index 100% rename from gitnexus/index.html rename to gitnexus-web/index.html diff --git a/gitnexus-web/package-lock.json b/gitnexus-web/package-lock.json new file mode 100644 index 000000000..cf591cb30 --- /dev/null +++ b/gitnexus-web/package-lock.json @@ -0,0 +1,10215 @@ +{ + "name": "gitnexus", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "gitnexus", + "version": "0.0.0", + "dependencies": { + "@huggingface/transformers": "^3.0.0", + "@isomorphic-git/lightning-fs": "^4.6.2", + "@langchain/anthropic": "^1.3.10", + "@langchain/core": "^1.1.15", + "@langchain/google-genai": "^2.1.10", + "@langchain/langgraph": "^1.1.0", + "@langchain/ollama": "^1.2.0", + "@langchain/openai": "^1.2.2", + "@sigma/edge-curve": "^3.1.0", + "@tailwindcss/vite": "^4.1.18", + "axios": "^1.13.2", + "buffer": "^6.0.3", + "comlink": "^4.4.2", + "d3": "^7.9.0", + "graphology": "^0.26.0", + "graphology-communities-louvain": "^2.0.2", + "graphology-layout-force": "^0.2.4", + "graphology-layout-forceatlas2": "^0.10.1", + "graphology-layout-noverlap": "^0.4.2", + "isomorphic-git": "^1.36.1", + "jszip": "^3.10.1", + "kuzu-wasm": "^0.11.1", + "langchain": "^1.2.10", + "lru-cache": "^11.2.4", + "lucide-react": "^0.562.0", + "mermaid": "^11.12.2", + "minisearch": "^7.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^10.1.0", + "react-syntax-highlighter": "^16.1.0", + "react-zoom-pan-pinch": "^3.7.0", + "remark-gfm": "^4.0.1", + "sigma": "^3.0.2", + "tailwindcss": "^4.1.18", + "uuid": "^13.0.0", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.5.0", + "web-tree-sitter": "^0.20.8", + "zod": "^3.25.76" + }, + "devDependencies": { + "@babel/types": "^7.28.5", + "@types/jszip": "^3.4.0", + "@types/node": "^24.10.1", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@types/react-syntax-highlighter": "^15.5.13", + "@vercel/node": "^5.5.16", + "@vitejs/plugin-react": "^5.1.0", + "tree-sitter-wasms": "^0.1.13", + "typescript": "^5.4.5", + "vite": "^5.2.0", + "vite-plugin-static-copy": "^3.1.4" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@anthropic-ai/sdk": { + "version": "0.71.2", + "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.71.2.tgz", + "integrity": "sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ==", + "license": "MIT", + "dependencies": { + "json-schema-to-ts": "^3.1.1" + }, + "bin": { + "anthropic-ai-sdk": "bin/cli" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/@babel/code-frame": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", + "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", + "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", + "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", + "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", + "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", + "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/generator": "^7.28.6", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.6", + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "license": "MIT" + }, + "node_modules/@cfworker/json-schema": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", + "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", + "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.0.3", + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/@chevrotain/gast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", + "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/@chevrotain/gast/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", + "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", + "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", + "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "license": "Apache-2.0" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@edge-runtime/format": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", + "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/node-utils": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", + "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/ponyfill": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", + "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/primitives": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", + "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=16" + } + }, + "node_modules/@edge-runtime/vm": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", + "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/primitives": "4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/busboy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@huggingface/jinja": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.3.tgz", + "integrity": "sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@huggingface/transformers": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", + "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", + "license": "Apache-2.0", + "dependencies": { + "@huggingface/jinja": "^0.5.3", + "onnxruntime-node": "1.21.0", + "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", + "sharp": "^0.34.1" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@isomorphic-git/idb-keyval": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@isomorphic-git/idb-keyval/-/idb-keyval-3.3.2.tgz", + "integrity": "sha512-r8/AdpiS0/WJCNR/t/gsgL+M8NMVj/ek7s60uz3LmpCaTF2mEVlZJlB01ZzalgYzRLXwSPC92o+pdzjM7PN/pA==", + "license": "Apache-2.0" + }, + "node_modules/@isomorphic-git/lightning-fs": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@isomorphic-git/lightning-fs/-/lightning-fs-4.6.2.tgz", + "integrity": "sha512-RS/oa1UBnoUFe56bsjOEgoUUReYKQzYUlQnbERRRNv9s9KmjyWuuylPV+YgsWirR2oONKaipWYMebVQ8SAe55Q==", + "license": "MIT", + "dependencies": { + "@isomorphic-git/idb-keyval": "3.3.2", + "isomorphic-textencoder": "1.0.1", + "just-debounce-it": "1.1.0", + "just-once": "1.1.0" + }, + "bin": { + "superblocktxt": "src/superblocktxt.js" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@langchain/anthropic": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-1.3.10.tgz", + "integrity": "sha512-VXq5fsEJ4FB5XGrnoG+bfm0I7OlmYLI4jZ6cX9RasyqhGo9wcDyKw1+uEQ1H7Og7jWrTa1bfXCun76wttewJnw==", + "license": "MIT", + "dependencies": { + "@anthropic-ai/sdk": "^0.71.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "1.1.15" + } + }, + "node_modules/@langchain/core": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.15.tgz", + "integrity": "sha512-b8RN5DkWAmDAlMu/UpTZEluYwCLpm63PPWniRKlE8ie3KkkE7IuMQ38pf4kV1iaiI+d99BEQa2vafQHfCujsRA==", + "license": "MIT", + "dependencies": { + "@cfworker/json-schema": "^4.0.2", + "ansi-styles": "^5.0.0", + "camelcase": "6", + "decamelize": "1.2.0", + "js-tiktoken": "^1.0.12", + "langsmith": ">=0.4.0 <1.0.0", + "mustache": "^4.2.0", + "p-queue": "^6.6.2", + "uuid": "^10.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@langchain/core/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/google-genai": { + "version": "2.1.10", + "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-2.1.10.tgz", + "integrity": "sha512-OpiBr2OUzB9Pg20mjLId+vfxJvYurc8TzbElaM/d6KE7aE8DiKCEOuQn5ZSgHTVzZV2g++lcJXw6iZlso4SORA==", + "license": "MIT", + "dependencies": { + "@google/generative-ai": "^0.24.0", + "uuid": "^11.1.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "1.1.15" + } + }, + "node_modules/@langchain/google-genai/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/@langchain/langgraph": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.1.0.tgz", + "integrity": "sha512-3n1GL0ZTtr57ZwbYvbi4Th26fwiGogmpFn8OA8UXEpBM2HcpGwcv1+c8YSBJF4XRjlcCzIlXtY+DyrNsvinc6g==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph-checkpoint": "^1.0.0", + "@langchain/langgraph-sdk": "~1.5.4", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1", + "zod": "^3.25.32 || ^4.2.0", + "zod-to-json-schema": "^3.x" + }, + "peerDependenciesMeta": { + "zod-to-json-schema": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-checkpoint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.0.tgz", + "integrity": "sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==", + "license": "MIT", + "dependencies": { + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1" + } + }, + "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/langgraph-sdk": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.5.4.tgz", + "integrity": "sha512-eSYqG875c2qvcPwdvBwQH0niTZxt6roMGc2dAWBqCbWCUiUL0X4ftYHg2OqOelsrNE3SO6faLr/m0LIPc9hDwg==", + "license": "MIT", + "dependencies": { + "p-queue": "^9.0.1", + "p-retry": "^7.1.1", + "uuid": "^13.0.0" + }, + "peerDependencies": { + "@langchain/core": "^1.0.1", + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@langchain/core": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "license": "MIT" + }, + "node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", + "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^7.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", + "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@langchain/langgraph/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/ollama": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@langchain/ollama/-/ollama-1.2.0.tgz", + "integrity": "sha512-OinxIhssKXdDQKnQoBF4TQTMBuMMV5OcNPk4Zze8UjcaSOGngn3CAI1FVbBxl0bTG5ov61w4AoWWsUwOwiSJFw==", + "license": "MIT", + "dependencies": { + "ollama": "^0.6.3", + "uuid": "^10.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, + "node_modules/@langchain/ollama/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@langchain/openai": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.2.2.tgz", + "integrity": "sha512-ByGtj9nJlyL2UPR7BAxtM34g8JA0qEfDKZq7ZisLW23ju+da1ZRAKogoEqoEHHSxl5fAt2LXcydsIYx0qgCDgg==", + "license": "MIT", + "dependencies": { + "js-tiktoken": "^1.0.12", + "openai": "^6.10.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "^1.0.0" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", + "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "consola": "^3.2.3", + "detect-libc": "^2.0.0", + "https-proxy-agent": "^7.0.5", + "node-fetch": "^2.6.7", + "nopt": "^8.0.0", + "semver": "^7.5.3", + "tar": "^7.4.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", + "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "license": "MIT", + "dependencies": { + "langium": "3.3.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-virtual": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", + "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", + "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", + "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", + "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", + "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", + "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", + "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", + "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", + "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", + "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", + "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", + "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", + "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", + "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", + "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", + "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", + "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", + "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", + "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", + "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", + "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", + "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", + "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", + "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", + "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", + "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sigma/edge-curve": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sigma/edge-curve/-/edge-curve-3.1.0.tgz", + "integrity": "sha512-OFWkfAXEsm+X8l1K4K49cC0psB0gQ+gqxKA08HG5piNPdzrDZ5gG9Gza6htZ5AirOVwd/4/uq/gPpD5En+H+3Q==", + "license": "MIT", + "peerDependencies": { + "sigma": ">=3.0.0-beta.10" + } + }, + "node_modules/@swc/core": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.8.tgz", + "integrity": "sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.8", + "@swc/core-darwin-x64": "1.15.8", + "@swc/core-linux-arm-gnueabihf": "1.15.8", + "@swc/core-linux-arm64-gnu": "1.15.8", + "@swc/core-linux-arm64-musl": "1.15.8", + "@swc/core-linux-x64-gnu": "1.15.8", + "@swc/core-linux-x64-musl": "1.15.8", + "@swc/core-win32-arm64-msvc": "1.15.8", + "@swc/core-win32-ia32-msvc": "1.15.8", + "@swc/core-win32-x64-msvc": "1.15.8" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.8.tgz", + "integrity": "sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.8.tgz", + "integrity": "sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.8.tgz", + "integrity": "sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.8.tgz", + "integrity": "sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.8.tgz", + "integrity": "sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.8.tgz", + "integrity": "sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.8.tgz", + "integrity": "sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.8.tgz", + "integrity": "sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.8.tgz", + "integrity": "sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.8.tgz", + "integrity": "sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@swc/wasm": { + "version": "1.15.8", + "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.8.tgz", + "integrity": "sha512-RG2BxGbbsjtddFCo1ghKH6A/BMXbY1eMBfpysV0lJMCpI4DZOjW1BNBnxvBt7YsYmlJtmy5UXIg9/4ekBTFFaQ==", + "license": "Apache-2.0" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", + "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", + "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-arm64": "4.1.18", + "@tailwindcss/oxide-darwin-x64": "4.1.18", + "@tailwindcss/oxide-freebsd-x64": "4.1.18", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", + "@tailwindcss/oxide-linux-x64-musl": "4.1.18", + "@tailwindcss/oxide-wasm32-wasi": "4.1.18", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", + "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", + "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.18", + "@tailwindcss/oxide": "4.1.18", + "tailwindcss": "4.1.18" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@ts-morph/common": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", + "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", + "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jszip": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz", + "integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "jszip": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.27", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", + "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/react-syntax-highlighter": { + "version": "15.5.13", + "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", + "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/@vercel/build-utils": { + "version": "13.2.11", + "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.2.11.tgz", + "integrity": "sha512-jbsg78iS8SLpOkLw378bBLchmzeQ+YtPnztMMuEFBORjY1G4lDxiStMacD3xp5HImCAl1wz4dNV4I8jHKd/3Tg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/error-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", + "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@vercel/nft": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.1.1.tgz", + "integrity": "sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mapbox/node-pre-gyp": "^2.0.0", + "@rollup/pluginutils": "^5.1.3", + "acorn": "^8.6.0", + "acorn-import-attributes": "^1.9.5", + "async-sema": "^3.1.1", + "bindings": "^1.4.0", + "estree-walker": "2.0.2", + "glob": "^13.0.0", + "graceful-fs": "^4.2.9", + "node-gyp-build": "^4.2.2", + "picomatch": "^4.0.2", + "resolve-from": "^5.0.0" + }, + "bin": { + "nft": "out/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@vercel/node": { + "version": "5.5.23", + "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.5.23.tgz", + "integrity": "sha512-dDJtroLF4D/H9vRMt/x/qI2bKujMOPbk6aIqRKI9WXddngjKziuHxsjcF3zEm5YXGUYDSC2lEVEFrXPbbP+hhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@edge-runtime/node-utils": "2.3.0", + "@edge-runtime/primitives": "4.1.0", + "@edge-runtime/vm": "3.2.0", + "@types/node": "16.18.11", + "@vercel/build-utils": "13.2.11", + "@vercel/error-utils": "2.0.3", + "@vercel/nft": "1.1.1", + "@vercel/static-config": "3.1.2", + "async-listen": "3.0.0", + "cjs-module-lexer": "1.2.3", + "edge-runtime": "2.5.9", + "es-module-lexer": "1.4.1", + "esbuild": "0.27.0", + "etag": "1.8.1", + "mime-types": "2.1.35", + "node-fetch": "2.6.9", + "path-to-regexp": "6.1.0", + "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", + "ts-morph": "12.0.0", + "ts-node": "10.9.1", + "typescript": "4.9.5", + "typescript5": "npm:typescript@5.9.3", + "undici": "5.28.4" + } + }, + "node_modules/@vercel/node/node_modules/@types/node": { + "version": "16.18.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", + "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vercel/node/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@vercel/static-config": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.1.2.tgz", + "integrity": "sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ajv": "8.6.3", + "json-schema-to-ts": "1.6.4", + "ts-morph": "12.0.0" + } + }, + "node_modules/@vercel/static-config/node_modules/json-schema-to-ts": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", + "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.6", + "ts-toolbelt": "^6.15.5" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", + "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.5", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.53", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-listen": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", + "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/async-lock": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", + "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", + "license": "MIT" + }, + "node_modules/async-sema": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", + "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.9.15", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", + "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/boolean": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", + "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001764", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", + "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chevrotain": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", + "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.0.3", + "@chevrotain/gast": "11.0.3", + "@chevrotain/regexp-to-ast": "11.0.3", + "@chevrotain/types": "11.0.3", + "@chevrotain/utils": "11.0.3", + "lodash-es": "4.17.21" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chevrotain/node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-git-ref": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", + "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", + "license": "Apache-2.0" + }, + "node_modules/code-block-writer": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", + "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/console-table-printer": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz", + "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==", + "license": "MIT", + "dependencies": { + "simple-wcswidth": "^1.1.2" + } + }, + "node_modules/convert-hrtime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", + "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", + "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff3": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", + "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", + "license": "MIT" + }, + "node_modules/dompurify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", + "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/edge-runtime": { + "version": "2.5.9", + "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", + "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "@edge-runtime/format": "2.2.1", + "@edge-runtime/ponyfill": "2.4.2", + "@edge-runtime/vm": "3.2.0", + "async-listen": "3.0.1", + "mri": "1.2.0", + "picocolors": "1.0.0", + "pretty-ms": "7.0.1", + "signal-exit": "4.0.2", + "time-span": "4.0.0" + }, + "bin": { + "edge-runtime": "dist/cli/index.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/edge-runtime/node_modules/async-listen": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", + "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/edge-runtime/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.267", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", + "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.4", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", + "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-text-encoding": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", + "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", + "license": "Apache-2.0" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", + "license": "Apache-2.0" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", + "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.1.1", + "minipass": "^7.1.2", + "path-scurry": "^2.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-agent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", + "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "es6-error": "^4.1.1", + "matcher": "^3.0.0", + "roarr": "^2.15.3", + "semver": "^7.3.2", + "serialize-error": "^7.0.1" + }, + "engines": { + "node": ">=10.0" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphology": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz", + "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.24.0" + } + }, + "node_modules/graphology-communities-louvain": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/graphology-communities-louvain/-/graphology-communities-louvain-2.0.2.tgz", + "integrity": "sha512-zt+2hHVPYxjEquyecxWXoUoIuN/UvYzsvI7boDdMNz0rRvpESQ7+e+Ejv6wK7AThycbZXuQ6DkG8NPMCq6XwoA==", + "license": "MIT", + "dependencies": { + "graphology-indices": "^0.17.0", + "graphology-utils": "^2.4.4", + "mnemonist": "^0.39.0", + "pandemonium": "^2.4.1" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-indices": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", + "integrity": "sha512-A7RXuKQvdqSWOpn7ZVQo4S33O0vCfPBnUSf7FwE0zNCasqwZVUaCXePuWo5HBpWw68KJcwObZDHpFk6HKH6MYQ==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.4.2", + "mnemonist": "^0.39.0" + }, + "peerDependencies": { + "graphology-types": ">=0.20.0" + } + }, + "node_modules/graphology-layout-force": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/graphology-layout-force/-/graphology-layout-force-0.2.4.tgz", + "integrity": "sha512-NYZz0YAnDkn5pkm30cvB0IScFoWGtbzJMrqaiH070dYlYJiag12Oc89dbVfaMaVR/w8DMIKxn/ix9Bqj+Umm9Q==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.4.2" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-layout-forceatlas2": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/graphology-layout-forceatlas2/-/graphology-layout-forceatlas2-0.10.1.tgz", + "integrity": "sha512-ogzBeF1FvWzjkikrIFwxhlZXvD2+wlY54lqhsrWprcdPjopM2J9HoMweUmIgwaTvY4bUYVimpSsOdvDv1gPRFQ==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.1.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-layout-noverlap": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/graphology-layout-noverlap/-/graphology-layout-noverlap-0.4.2.tgz", + "integrity": "sha512-13WwZSx96zim6l1dfZONcqLh3oqyRcjIBsqz2c2iJ3ohgs3605IDWjldH41Gnhh462xGB1j6VGmuGhZ2FKISXA==", + "license": "MIT", + "dependencies": { + "graphology-utils": "^2.3.0" + }, + "peerDependencies": { + "graphology-types": ">=0.19.0" + } + }, + "node_modules/graphology-types": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", + "integrity": "sha512-hDRKYXa8TsoZHjgEaysSRyPdT6uB78Ci8WnjgbStlQysz7xR52PInxNsmnB7IBOM1BhikxkNyCVEFgmPKnpx3Q==", + "license": "MIT", + "peer": true + }, + "node_modules/graphology-utils": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/graphology-utils/-/graphology-utils-2.5.2.tgz", + "integrity": "sha512-ckHg8MXrXJkOARk56ZaSCM1g1Wihe2d6iTmz1enGOz4W/l831MBCKSayeFQfowgF8wd+PQ4rlch/56Vs/VZLDQ==", + "license": "MIT", + "peerDependencies": { + "graphology-types": ">=0.23.0" + } + }, + "node_modules/guid-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", + "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", + "license": "ISC" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-vue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", + "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", + "license": "CC0-1.0" + }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-network-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", + "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-observable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", + "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "license": "MIT" + }, + "node_modules/isomorphic-git": { + "version": "1.36.1", + "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.36.1.tgz", + "integrity": "sha512-fC8SRT8MwoaXDK8G4z5biPEbqf2WyEJUb2MJ2ftSd39/UIlsnoZxLGux+lae0poLZO4AEcx6aUVOh5bV+P8zFA==", + "license": "MIT", + "dependencies": { + "async-lock": "^1.4.1", + "clean-git-ref": "^2.0.1", + "crc-32": "^1.2.0", + "diff3": "0.0.3", + "ignore": "^5.1.4", + "minimisted": "^2.0.0", + "pako": "^1.0.10", + "pify": "^4.0.1", + "readable-stream": "^4.0.0", + "sha.js": "^2.4.12", + "simple-get": "^4.0.1" + }, + "bin": { + "isogit": "cli.cjs" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/isomorphic-textencoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-textencoder/-/isomorphic-textencoder-1.0.1.tgz", + "integrity": "sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ==", + "license": "MIT", + "dependencies": { + "fast-text-encoding": "^1.0.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tiktoken": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", + "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.5.1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-schema-to-ts": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", + "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "ts-algebra": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/just-debounce-it": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-1.1.0.tgz", + "integrity": "sha512-87Nnc0qZKgBZuhFZjYVjSraic0x7zwjhaTMrCKlj0QYKH6lh0KbFzVnfu6LHan03NO7J8ygjeBeD0epejn5Zcg==", + "license": "MIT" + }, + "node_modules/just-once": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/just-once/-/just-once-1.1.0.tgz", + "integrity": "sha512-+rZVpl+6VyTilK7vB/svlMPil4pxqIJZkbnN7DKZTOzyXfun6ZiFeq2Pk4EtCEHZ0VU4EkdFzG8ZK5F3PErcDw==", + "license": "MIT" + }, + "node_modules/katex": { + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + }, + "node_modules/kuzu-wasm": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/kuzu-wasm/-/kuzu-wasm-0.11.3.tgz", + "integrity": "sha512-+bLOqXgYZJJ2dHJG1y9LTLyb9ZB73eLxErRZahZz2rPokfIdyLaktTJFzJH7wX39hgyukKn8QxeRNobH6gl27g==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "dependencies": { + "threads": "^1.7.0", + "tiny-worker": "^2.3.0", + "uuid": "^11.0.3" + } + }, + "node_modules/kuzu-wasm/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/langchain": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/langchain/-/langchain-1.2.10.tgz", + "integrity": "sha512-9uVxOJE/RTECvNutQfOLwH7f6R9mcq0G/IMHwA2eptDA86R/Yz2zWMz4vARVFPxPrdSJ9nJFDPAqRQlRFwdHBw==", + "license": "MIT", + "dependencies": { + "@langchain/langgraph": "^1.0.0", + "@langchain/langgraph-checkpoint": "^1.0.0", + "langsmith": ">=0.4.0 <1.0.0", + "uuid": "^10.0.0", + "zod": "^3.25.76 || ^4" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "@langchain/core": "1.1.15" + } + }, + "node_modules/langchain/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/langium": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", + "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "license": "MIT", + "dependencies": { + "chevrotain": "~11.0.3", + "chevrotain-allstar": "~0.3.0", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.0.8" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/langsmith": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.4.7.tgz", + "integrity": "sha512-Esv5g/J8wwRwbGQr10PB9+bLsNk0mWbrXc7nnEreQDhh0azbU57I7epSnT7GC4sS4EOWavhbxk+6p8PTXtreHw==", + "license": "MIT", + "dependencies": { + "@types/uuid": "^10.0.0", + "chalk": "^4.1.2", + "console-table-printer": "^2.12.1", + "p-queue": "^6.6.2", + "semver": "^7.6.3", + "uuid": "^10.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "*", + "@opentelemetry/exporter-trace-otlp-proto": "*", + "@opentelemetry/sdk-trace-base": "*", + "openai": "*" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-proto": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "openai": { + "optional": true + } + } + }, + "node_modules/langsmith/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "license": "MIT" + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash-es": { + "version": "4.17.22", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", + "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "license": "MIT" + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "license": "MIT", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.4", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", + "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/lucide-react": { + "version": "0.562.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", + "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/matcher": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", + "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.12.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", + "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^0.6.3", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.21", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimisted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", + "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "license": "MIT" + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mnemonist": { + "version": "0.39.8", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", + "integrity": "sha512-vyWo2K3fjrUw8YeeZ1zF0fy6Mu59RHokURlld8ymdUPjMlD9EC9ov1/YPqTgqRvUN9nTr3Gqfz29LYAmu0PHPQ==", + "license": "MIT", + "dependencies": { + "obliterator": "^2.0.1" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", + "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", + "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^3.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/obliterator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.5.tgz", + "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", + "license": "MIT" + }, + "node_modules/observable-fns": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", + "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", + "license": "MIT" + }, + "node_modules/ollama": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.6.3.tgz", + "integrity": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==", + "license": "MIT", + "dependencies": { + "whatwg-fetch": "^3.6.20" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onnxruntime-common": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", + "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", + "license": "MIT" + }, + "node_modules/onnxruntime-node": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", + "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", + "hasInstallScript": true, + "license": "MIT", + "os": [ + "win32", + "darwin", + "linux" + ], + "dependencies": { + "global-agent": "^3.0.0", + "onnxruntime-common": "1.21.0", + "tar": "^7.0.1" + } + }, + "node_modules/onnxruntime-web": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", + "license": "MIT", + "dependencies": { + "flatbuffers": "^25.1.24", + "guid-typescript": "^1.0.9", + "long": "^5.2.3", + "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", + "platform": "^1.3.6", + "protobufjs": "^7.2.4" + } + }, + "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { + "version": "1.22.0-dev.20250409-89f8206ba4", + "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", + "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", + "license": "MIT" + }, + "node_modules/openai": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/openai/-/openai-6.16.0.tgz", + "integrity": "sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==", + "license": "Apache-2.0", + "bin": { + "openai": "bin/cli" + }, + "peerDependencies": { + "ws": "^8.18.0", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "ws": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", + "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", + "license": "MIT", + "dependencies": { + "is-network-error": "^1.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, + "node_modules/pandemonium": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/pandemonium/-/pandemonium-2.4.1.tgz", + "integrity": "sha512-wRqjisUyiUfXowgm7MFH2rwJzKIr20rca5FsHXCMNm1W5YPP1hCtrZfgmQ62kP7OZ7Xt+cR858aB28lu5NX55g==", + "license": "MIT", + "dependencies": { + "mnemonist": "^0.39.2" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", + "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", + "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp-updated": { + "name": "path-to-regexp", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", + "license": "MIT" + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-syntax-highlighter": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", + "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "highlight.js": "^10.4.1", + "highlightjs-vue": "^1.0.0", + "lowlight": "^1.17.0", + "prismjs": "^1.30.0", + "refractor": "^5.0.0" + }, + "engines": { + "node": ">= 16.20.2" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-zoom-pan-pinch": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", + "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==", + "license": "MIT", + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/refractor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", + "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/prismjs": "^1.0.0", + "hastscript": "^9.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/roarr": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", + "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", + "license": "BSD-3-Clause", + "dependencies": { + "boolean": "^3.0.1", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "4.55.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", + "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.55.1", + "@rollup/rollup-android-arm64": "4.55.1", + "@rollup/rollup-darwin-arm64": "4.55.1", + "@rollup/rollup-darwin-x64": "4.55.1", + "@rollup/rollup-freebsd-arm64": "4.55.1", + "@rollup/rollup-freebsd-x64": "4.55.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", + "@rollup/rollup-linux-arm-musleabihf": "4.55.1", + "@rollup/rollup-linux-arm64-gnu": "4.55.1", + "@rollup/rollup-linux-arm64-musl": "4.55.1", + "@rollup/rollup-linux-loong64-gnu": "4.55.1", + "@rollup/rollup-linux-loong64-musl": "4.55.1", + "@rollup/rollup-linux-ppc64-gnu": "4.55.1", + "@rollup/rollup-linux-ppc64-musl": "4.55.1", + "@rollup/rollup-linux-riscv64-gnu": "4.55.1", + "@rollup/rollup-linux-riscv64-musl": "4.55.1", + "@rollup/rollup-linux-s390x-gnu": "4.55.1", + "@rollup/rollup-linux-x64-gnu": "4.55.1", + "@rollup/rollup-linux-x64-musl": "4.55.1", + "@rollup/rollup-openbsd-x64": "4.55.1", + "@rollup/rollup-openharmony-arm64": "4.55.1", + "@rollup/rollup-win32-arm64-msvc": "4.55.1", + "@rollup/rollup-win32-ia32-msvc": "4.55.1", + "@rollup/rollup-win32-x64-gnu": "4.55.1", + "@rollup/rollup-win32-x64-msvc": "4.55.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, + "node_modules/sha.js": { + "version": "2.4.12", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", + "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.0" + }, + "bin": { + "sha.js": "bin.js" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/sigma": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.2.tgz", + "integrity": "sha512-/BUbeOwPGruiBOm0YQQ6ZMcLIZ6tf/W+Jcm7dxZyAX0tK3WP9/sq7/NAWBxPIxVahdGjCJoGwej0Gdrv0DxlQQ==", + "license": "MIT", + "dependencies": { + "events": "^3.3.0", + "graphology-utils": "^2.5.2" + } + }, + "node_modules/signal-exit": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", + "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-wcswidth": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", + "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", + "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tar": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", + "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/threads": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", + "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", + "license": "MIT", + "dependencies": { + "callsites": "^3.1.0", + "debug": "^4.2.0", + "is-observable": "^2.1.0", + "observable-fns": "^0.6.1" + }, + "funding": { + "url": "https://github.com/andywer/threads.js?sponsor=1" + }, + "optionalDependencies": { + "tiny-worker": ">= 2" + } + }, + "node_modules/time-span": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", + "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-hrtime": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tiny-worker": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", + "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", + "license": "BSD-3-Clause", + "dependencies": { + "esm": "^3.2.25" + } + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-buffer": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", + "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", + "license": "MIT", + "dependencies": { + "isarray": "^2.0.5", + "safe-buffer": "^5.2.1", + "typed-array-buffer": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tree-sitter-wasms": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/tree-sitter-wasms/-/tree-sitter-wasms-0.1.13.tgz", + "integrity": "sha512-wT+cR6DwaIz80/vho3AvSF0N4txuNx/5bcRKoXouOfClpxh/qqrF4URNLQXbbt8MaAxeksZcZd1j8gcGjc+QxQ==", + "dev": true, + "license": "Unlicense", + "dependencies": { + "tree-sitter-wasms": "^0.1.11" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-algebra": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", + "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", + "license": "MIT" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/ts-morph": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", + "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ts-morph/common": "~0.11.0", + "code-block-writer": "^10.1.1" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-toolbelt": { + "version": "6.15.5", + "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", + "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript5": { + "name": "typescript", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-static-copy": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz", + "integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "p-map": "^7.0.3", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.15" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/vite-plugin-top-level-await": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz", + "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", + "license": "MIT", + "dependencies": { + "@rollup/plugin-virtual": "^3.0.2", + "@swc/core": "^1.12.14", + "@swc/wasm": "^1.12.14", + "uuid": "10.0.0" + }, + "peerDependencies": { + "vite": ">=2.8" + } + }, + "node_modules/vite-plugin-top-level-await/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite-plugin-wasm": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz", + "integrity": "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==", + "license": "MIT", + "peerDependencies": { + "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "license": "MIT" + }, + "node_modules/web-tree-sitter": { + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==", + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.20", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", + "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/gitnexus-web/package.json b/gitnexus-web/package.json new file mode 100644 index 000000000..20ee8b00b --- /dev/null +++ b/gitnexus-web/package.json @@ -0,0 +1,67 @@ +{ + "name": "gitnexus", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@huggingface/transformers": "^3.0.0", + "@isomorphic-git/lightning-fs": "^4.6.2", + "@langchain/anthropic": "^1.3.10", + "@langchain/core": "^1.1.15", + "@langchain/google-genai": "^2.1.10", + "@langchain/langgraph": "^1.1.0", + "@langchain/ollama": "^1.2.0", + "@langchain/openai": "^1.2.2", + "@sigma/edge-curve": "^3.1.0", + "@tailwindcss/vite": "^4.1.18", + "axios": "^1.13.2", + "buffer": "^6.0.3", + "comlink": "^4.4.2", + "d3": "^7.9.0", + "graphology": "^0.26.0", + "graphology-communities-louvain": "^2.0.2", + "graphology-layout-force": "^0.2.4", + "graphology-layout-forceatlas2": "^0.10.1", + "graphology-layout-noverlap": "^0.4.2", + "isomorphic-git": "^1.36.1", + "jszip": "^3.10.1", + "kuzu-wasm": "^0.11.1", + "langchain": "^1.2.10", + "lru-cache": "^11.2.4", + "lucide-react": "^0.562.0", + "mermaid": "^11.12.2", + "minisearch": "^7.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-markdown": "^10.1.0", + "react-syntax-highlighter": "^16.1.0", + "react-zoom-pan-pinch": "^3.7.0", + "remark-gfm": "^4.0.1", + "sigma": "^3.0.2", + "tailwindcss": "^4.1.18", + "uuid": "^13.0.0", + "vite-plugin-top-level-await": "^1.6.0", + "vite-plugin-wasm": "^3.5.0", + "web-tree-sitter": "^0.20.8", + "zod": "^3.25.76" + }, + "devDependencies": { + "@babel/types": "^7.28.5", + "@types/jszip": "^3.4.0", + "@types/node": "^24.10.1", + "@types/react": "^18.3.5", + "@types/react-dom": "^18.3.0", + "@types/react-syntax-highlighter": "^15.5.13", + "@vercel/node": "^5.5.16", + "@vitejs/plugin-react": "^5.1.0", + "tree-sitter-wasms": "^0.1.13", + "typescript": "^5.4.5", + "vite": "^5.2.0", + "vite-plugin-static-copy": "^3.1.4" + } +} diff --git a/gitnexus/public/wasm/c/tree-sitter-c.wasm b/gitnexus-web/public/wasm/c/tree-sitter-c.wasm similarity index 100% rename from gitnexus/public/wasm/c/tree-sitter-c.wasm rename to gitnexus-web/public/wasm/c/tree-sitter-c.wasm diff --git a/gitnexus/public/wasm/cpp/tree-sitter-cpp.wasm b/gitnexus-web/public/wasm/cpp/tree-sitter-cpp.wasm similarity index 100% rename from gitnexus/public/wasm/cpp/tree-sitter-cpp.wasm rename to gitnexus-web/public/wasm/cpp/tree-sitter-cpp.wasm diff --git a/gitnexus/public/wasm/csharp/tree-sitter-csharp.wasm b/gitnexus-web/public/wasm/csharp/tree-sitter-csharp.wasm similarity index 100% rename from gitnexus/public/wasm/csharp/tree-sitter-csharp.wasm rename to gitnexus-web/public/wasm/csharp/tree-sitter-csharp.wasm diff --git a/gitnexus/public/wasm/go/tree-sitter-go.wasm b/gitnexus-web/public/wasm/go/tree-sitter-go.wasm similarity index 100% rename from gitnexus/public/wasm/go/tree-sitter-go.wasm rename to gitnexus-web/public/wasm/go/tree-sitter-go.wasm diff --git a/gitnexus/public/wasm/java/tree-sitter-java.wasm b/gitnexus-web/public/wasm/java/tree-sitter-java.wasm similarity index 100% rename from gitnexus/public/wasm/java/tree-sitter-java.wasm rename to gitnexus-web/public/wasm/java/tree-sitter-java.wasm diff --git a/gitnexus/public/wasm/javascript/tree-sitter-javascript.wasm b/gitnexus-web/public/wasm/javascript/tree-sitter-javascript.wasm similarity index 100% rename from gitnexus/public/wasm/javascript/tree-sitter-javascript.wasm rename to gitnexus-web/public/wasm/javascript/tree-sitter-javascript.wasm diff --git a/gitnexus/public/wasm/kuzu-wasm.wasm b/gitnexus-web/public/wasm/kuzu-wasm.wasm similarity index 100% rename from gitnexus/public/wasm/kuzu-wasm.wasm rename to gitnexus-web/public/wasm/kuzu-wasm.wasm diff --git a/gitnexus/public/wasm/python/tree-sitter-python.wasm b/gitnexus-web/public/wasm/python/tree-sitter-python.wasm similarity index 100% rename from gitnexus/public/wasm/python/tree-sitter-python.wasm rename to gitnexus-web/public/wasm/python/tree-sitter-python.wasm diff --git a/gitnexus/public/wasm/rust/tree-sitter-rust.wasm b/gitnexus-web/public/wasm/rust/tree-sitter-rust.wasm similarity index 100% rename from gitnexus/public/wasm/rust/tree-sitter-rust.wasm rename to gitnexus-web/public/wasm/rust/tree-sitter-rust.wasm diff --git a/gitnexus/public/wasm/tree-sitter.wasm b/gitnexus-web/public/wasm/tree-sitter.wasm similarity index 100% rename from gitnexus/public/wasm/tree-sitter.wasm rename to gitnexus-web/public/wasm/tree-sitter.wasm diff --git a/gitnexus/public/wasm/typescript/tree-sitter-tsx.wasm b/gitnexus-web/public/wasm/typescript/tree-sitter-tsx.wasm similarity index 100% rename from gitnexus/public/wasm/typescript/tree-sitter-tsx.wasm rename to gitnexus-web/public/wasm/typescript/tree-sitter-tsx.wasm diff --git a/gitnexus/public/wasm/typescript/tree-sitter-typescript.wasm b/gitnexus-web/public/wasm/typescript/tree-sitter-typescript.wasm similarity index 100% rename from gitnexus/public/wasm/typescript/tree-sitter-typescript.wasm rename to gitnexus-web/public/wasm/typescript/tree-sitter-typescript.wasm diff --git a/gitnexus/src/App.tsx b/gitnexus-web/src/App.tsx similarity index 100% rename from gitnexus/src/App.tsx rename to gitnexus-web/src/App.tsx diff --git a/gitnexus/src/components/ActivityFeed.tsx b/gitnexus-web/src/components/ActivityFeed.tsx similarity index 100% rename from gitnexus/src/components/ActivityFeed.tsx rename to gitnexus-web/src/components/ActivityFeed.tsx diff --git a/gitnexus/src/components/CodeReferencesPanel.tsx b/gitnexus-web/src/components/CodeReferencesPanel.tsx similarity index 100% rename from gitnexus/src/components/CodeReferencesPanel.tsx rename to gitnexus-web/src/components/CodeReferencesPanel.tsx diff --git a/gitnexus/src/components/DropZone.tsx b/gitnexus-web/src/components/DropZone.tsx similarity index 100% rename from gitnexus/src/components/DropZone.tsx rename to gitnexus-web/src/components/DropZone.tsx diff --git a/gitnexus/src/components/EmbeddingStatus.tsx b/gitnexus-web/src/components/EmbeddingStatus.tsx similarity index 100% rename from gitnexus/src/components/EmbeddingStatus.tsx rename to gitnexus-web/src/components/EmbeddingStatus.tsx diff --git a/gitnexus/src/components/FileTreePanel.tsx b/gitnexus-web/src/components/FileTreePanel.tsx similarity index 100% rename from gitnexus/src/components/FileTreePanel.tsx rename to gitnexus-web/src/components/FileTreePanel.tsx diff --git a/gitnexus/src/components/GraphCanvas.tsx b/gitnexus-web/src/components/GraphCanvas.tsx similarity index 100% rename from gitnexus/src/components/GraphCanvas.tsx rename to gitnexus-web/src/components/GraphCanvas.tsx diff --git a/gitnexus/src/components/Header.tsx b/gitnexus-web/src/components/Header.tsx similarity index 100% rename from gitnexus/src/components/Header.tsx rename to gitnexus-web/src/components/Header.tsx diff --git a/gitnexus/src/components/IntelligentClusteringModal.tsx b/gitnexus-web/src/components/IntelligentClusteringModal.tsx similarity index 100% rename from gitnexus/src/components/IntelligentClusteringModal.tsx rename to gitnexus-web/src/components/IntelligentClusteringModal.tsx diff --git a/gitnexus/src/components/LoadingOverlay.tsx b/gitnexus-web/src/components/LoadingOverlay.tsx similarity index 100% rename from gitnexus/src/components/LoadingOverlay.tsx rename to gitnexus-web/src/components/LoadingOverlay.tsx diff --git a/gitnexus/src/components/MCPToggle.tsx b/gitnexus-web/src/components/MCPToggle.tsx similarity index 100% rename from gitnexus/src/components/MCPToggle.tsx rename to gitnexus-web/src/components/MCPToggle.tsx diff --git a/gitnexus/src/components/MarkdownRenderer.tsx b/gitnexus-web/src/components/MarkdownRenderer.tsx similarity index 100% rename from gitnexus/src/components/MarkdownRenderer.tsx rename to gitnexus-web/src/components/MarkdownRenderer.tsx diff --git a/gitnexus/src/components/MermaidDiagram.tsx b/gitnexus-web/src/components/MermaidDiagram.tsx similarity index 100% rename from gitnexus/src/components/MermaidDiagram.tsx rename to gitnexus-web/src/components/MermaidDiagram.tsx diff --git a/gitnexus/src/components/ProcessFlowModal.tsx b/gitnexus-web/src/components/ProcessFlowModal.tsx similarity index 100% rename from gitnexus/src/components/ProcessFlowModal.tsx rename to gitnexus-web/src/components/ProcessFlowModal.tsx diff --git a/gitnexus/src/components/ProcessesPanel.tsx b/gitnexus-web/src/components/ProcessesPanel.tsx similarity index 100% rename from gitnexus/src/components/ProcessesPanel.tsx rename to gitnexus-web/src/components/ProcessesPanel.tsx diff --git a/gitnexus/src/components/QueryFAB.tsx b/gitnexus-web/src/components/QueryFAB.tsx similarity index 100% rename from gitnexus/src/components/QueryFAB.tsx rename to gitnexus-web/src/components/QueryFAB.tsx diff --git a/gitnexus/src/components/RightPanel.tsx b/gitnexus-web/src/components/RightPanel.tsx similarity index 100% rename from gitnexus/src/components/RightPanel.tsx rename to gitnexus-web/src/components/RightPanel.tsx diff --git a/gitnexus/src/components/SettingsPanel.tsx b/gitnexus-web/src/components/SettingsPanel.tsx similarity index 100% rename from gitnexus/src/components/SettingsPanel.tsx rename to gitnexus-web/src/components/SettingsPanel.tsx diff --git a/gitnexus/src/components/StatusBar.tsx b/gitnexus-web/src/components/StatusBar.tsx similarity index 100% rename from gitnexus/src/components/StatusBar.tsx rename to gitnexus-web/src/components/StatusBar.tsx diff --git a/gitnexus/src/components/ToolCallCard.tsx b/gitnexus-web/src/components/ToolCallCard.tsx similarity index 100% rename from gitnexus/src/components/ToolCallCard.tsx rename to gitnexus-web/src/components/ToolCallCard.tsx diff --git a/gitnexus/src/components/WebGPUFallbackDialog.tsx b/gitnexus-web/src/components/WebGPUFallbackDialog.tsx similarity index 100% rename from gitnexus/src/components/WebGPUFallbackDialog.tsx rename to gitnexus-web/src/components/WebGPUFallbackDialog.tsx diff --git a/gitnexus-cli/src/config/ignore-service.ts b/gitnexus-web/src/config/ignore-service.ts similarity index 100% rename from gitnexus-cli/src/config/ignore-service.ts rename to gitnexus-web/src/config/ignore-service.ts diff --git a/gitnexus-cli/src/config/supported-languages.ts b/gitnexus-web/src/config/supported-languages.ts similarity index 100% rename from gitnexus-cli/src/config/supported-languages.ts rename to gitnexus-web/src/config/supported-languages.ts diff --git a/gitnexus-cli/src/core/embeddings/embedder.ts b/gitnexus-web/src/core/embeddings/embedder.ts similarity index 58% rename from gitnexus-cli/src/core/embeddings/embedder.ts rename to gitnexus-web/src/core/embeddings/embedder.ts index f0cdcde45..118894583 100644 --- a/gitnexus-cli/src/core/embeddings/embedder.ts +++ b/gitnexus-web/src/core/embeddings/embedder.ts @@ -8,23 +8,59 @@ */ import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; -import { DEFAULT_EMBEDDING_CONFIG, type EmbeddingConfig, type ModelProgress } from './types.js'; +import { DEFAULT_EMBEDDING_CONFIG, type EmbeddingConfig, type ModelProgress } from './types'; // Module-level state for singleton pattern let embedderInstance: FeatureExtractionPipeline | null = null; let isInitializing = false; let initPromise: Promise | null = null; -let currentDevice: 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null = null; +let currentDevice: 'webgpu' | 'wasm' | null = null; /** * Progress callback type for model loading */ export type ModelProgressCallback = (progress: ModelProgress) => void; +/** + * Custom error thrown when WebGPU is not available + * Allows UI to prompt user for fallback choice + */ +export class WebGPUNotAvailableError extends Error { + constructor(originalError?: Error) { + super('WebGPU not available in this browser'); + this.name = 'WebGPUNotAvailableError'; + this.cause = originalError; + } +} + +/** + * Check if WebGPU is available in this browser + * Quick check without loading the model + */ +export const checkWebGPUAvailability = async (): Promise => { + try { + // Cast to any to avoid WebGPU types not being available in all TS configs + const nav = navigator as any; + if (!nav.gpu) { + return false; + } + const adapter = await nav.gpu.requestAdapter(); + if (!adapter) { + return false; + } + // Try to get a device - this is where it usually fails + const device = await adapter.requestDevice(); + device.destroy(); // Clean up + return true; + } catch { + return false; + } +}; + /** * Get the current device being used for inference */ -export const getCurrentDevice = (): 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null => currentDevice; +export const getCurrentDevice = (): 'webgpu' | 'wasm' | null => currentDevice; /** * Initialize the embedding model @@ -32,13 +68,14 @@ export const getCurrentDevice = (): 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null => * * @param onProgress - Optional callback for model download progress * @param config - Optional configuration override - * @param forceDevice - Force a specific device + * @param forceDevice - Force a specific device (bypasses WebGPU check) * @returns Promise resolving to the embedder pipeline + * @throws WebGPUNotAvailableError if WebGPU is requested but unavailable */ export const initEmbedder = async ( onProgress?: ModelProgressCallback, config: Partial = {}, - forceDevice?: 'webgpu' | 'cuda' | 'cpu' | 'wasm' + forceDevice?: 'webgpu' | 'wasm' ): Promise => { // Return existing instance if available if (embedderInstance) { @@ -53,19 +90,14 @@ export const initEmbedder = async ( isInitializing = true; const finalConfig = { ...DEFAULT_EMBEDDING_CONFIG, ...config }; - // On Windows, use webgpu for GPU acceleration (via DirectX12/DirectML) - // CUDA is only available on Linux with onnxruntime-node - const isWindows = process.platform === 'win32'; - const gpuDevice = isWindows ? 'webgpu' : 'cuda'; - let requestedDevice = forceDevice || (finalConfig.device === 'auto' ? gpuDevice : finalConfig.device); + const requestedDevice = forceDevice || finalConfig.device; initPromise = (async () => { try { // Configure transformers.js environment env.allowLocalModels = false; - const isDev = process.env.NODE_ENV !== 'production'; - if (isDev) { + if (import.meta.env.DEV) { console.log(`🧠 Loading embedding model: ${finalConfig.modelId}`); } @@ -80,59 +112,86 @@ export const initEmbedder = async ( onProgress(progress); } : undefined; - // Try GPU first if auto, fall back to CPU - // Windows: webgpu (DirectX12/DirectML), Linux: cuda - const devicesToTry: Array<'webgpu' | 'cuda' | 'cpu' | 'wasm'> = - (requestedDevice === 'webgpu' || requestedDevice === 'cuda') - ? [requestedDevice, 'cpu'] - : [requestedDevice as 'cpu' | 'wasm']; - - for (const device of devicesToTry) { - try { - if (isDev && device === 'webgpu') { - console.log('🔧 Trying WebGPU (DirectX12) backend...'); - } else if (isDev && device === 'cuda') { - console.log('🔧 Trying CUDA GPU backend...'); - } else if (isDev && device === 'cpu') { - console.log('🔧 Using CPU backend...'); - } else if (isDev && device === 'wasm') { - console.log('🔧 Using WASM backend (slower)...'); + // If WebGPU is requested (default), check availability first + if (requestedDevice === 'webgpu') { + if (import.meta.env.DEV) { + console.log('🔧 Checking WebGPU availability...'); + } + + const webgpuAvailable = await checkWebGPUAvailability(); + + if (!webgpuAvailable) { + if (import.meta.env.DEV) { + console.warn('⚠️ WebGPU not available'); } - + isInitializing = false; + initPromise = null; + throw new WebGPUNotAvailableError(); + } + + // Try WebGPU + try { + if (import.meta.env.DEV) { + console.log('🔧 Initializing WebGPU backend...'); + } + + // Type assertion needed due to complex union types in transformers.js embedderInstance = await (pipeline as any)( 'feature-extraction', finalConfig.modelId, { - device: device, + device: 'webgpu', dtype: 'fp32', progress_callback: progressCallback, } ); - currentDevice = device; - - if (isDev) { - const label = device === 'webgpu' ? 'GPU (WebGPU/DirectX12)' - : device === 'cuda' ? 'GPU (CUDA)' - : device.toUpperCase(); - console.log(`✅ Using ${label} backend`); - console.log('✅ Embedding model loaded successfully'); + currentDevice = 'webgpu'; + + if (import.meta.env.DEV) { + console.log('✅ Using WebGPU backend'); } - - return embedderInstance!; - } catch (deviceError) { - if (isDev && (device === 'cuda' || device === 'webgpu')) { - const gpuType = device === 'webgpu' ? 'WebGPU' : 'CUDA'; - console.log(`⚠️ ${gpuType} not available, falling back to CPU...`); + } catch (err) { + if (import.meta.env.DEV) { + console.warn('⚠️ WebGPU initialization failed:', err); } - // Continue to next device in list - if (device === devicesToTry[devicesToTry.length - 1]) { - throw deviceError; // Last device failed, propagate error + isInitializing = false; + initPromise = null; + embedderInstance = null; + throw new WebGPUNotAvailableError(err as Error); + } + } else { + // WASM mode requested (user chose fallback) + if (import.meta.env.DEV) { + console.log('🔧 Initializing WASM backend (this will be slower)...'); + } + + // Type assertion needed due to complex union types in transformers.js + embedderInstance = await (pipeline as any)( + 'feature-extraction', + finalConfig.modelId, + { + device: 'wasm', // WASM-based CPU execution + dtype: 'fp32', + progress_callback: progressCallback, } + ); + currentDevice = 'wasm'; + + if (import.meta.env.DEV) { + console.log('✅ Using WASM backend'); } } - throw new Error('No suitable device found for embedding model'); + if (import.meta.env.DEV) { + console.log('✅ Embedding model loaded successfully'); + } + + return embedderInstance!; } catch (error) { + // Re-throw WebGPUNotAvailableError as-is + if (error instanceof WebGPUNotAvailableError) { + throw error; + } isInitializing = false; initPromise = null; embedderInstance = null; diff --git a/gitnexus-cli/src/core/embeddings/embedding-pipeline.ts b/gitnexus-web/src/core/embeddings/embedding-pipeline.ts similarity index 97% rename from gitnexus-cli/src/core/embeddings/embedding-pipeline.ts rename to gitnexus-web/src/core/embeddings/embedding-pipeline.ts index 128e5d937..05f8ae7ed 100644 --- a/gitnexus-cli/src/core/embeddings/embedding-pipeline.ts +++ b/gitnexus-web/src/core/embeddings/embedding-pipeline.ts @@ -9,8 +9,8 @@ * 5. Create vector index for semantic search */ -import { initEmbedder, embedBatch, embedText, embeddingToArray, isEmbedderReady } from './embedder.js'; -import { generateBatchEmbeddingTexts, generateEmbeddingText } from './text-generator.js'; +import { initEmbedder, embedBatch, embedText, embeddingToArray, isEmbedderReady } from './embedder'; +import { generateBatchEmbeddingTexts, generateEmbeddingText } from './text-generator'; import { type EmbeddingProgress, type EmbeddingConfig, @@ -19,9 +19,7 @@ import { type ModelProgress, DEFAULT_EMBEDDING_CONFIG, EMBEDDABLE_LABELS, -} from './types.js'; - -const isDev = process.env.NODE_ENV !== 'production'; +} from './types'; /** * Progress callback type @@ -73,7 +71,7 @@ const queryEmbeddableNodes = async ( } } catch (error) { // Table might not exist or be empty, continue - if (isDev) { + if (import.meta.env.DEV) { console.warn(`Query for ${label} nodes failed:`, error); } } @@ -115,7 +113,7 @@ const createVectorIndex = async ( await executeQuery(cypher); } catch (error) { // Index might already exist - if (isDev) { + if (import.meta.env.DEV) { console.warn('Vector index creation warning:', error); } } @@ -161,7 +159,7 @@ export const runEmbeddingPipeline = async ( modelDownloadPercent: 100, }); - if (isDev) { + if (import.meta.env.DEV) { console.log('🔍 Querying embeddable nodes...'); } @@ -169,7 +167,7 @@ export const runEmbeddingPipeline = async ( const nodes = await queryEmbeddableNodes(executeQuery); const totalNodes = nodes.length; - if (isDev) { + if (import.meta.env.DEV) { console.log(`📊 Found ${totalNodes} embeddable nodes`); } @@ -238,7 +236,7 @@ export const runEmbeddingPipeline = async ( totalNodes, }); - if (isDev) { + if (import.meta.env.DEV) { console.log('📇 Creating vector index...'); } @@ -252,13 +250,13 @@ export const runEmbeddingPipeline = async ( totalNodes, }); - if (isDev) { + if (import.meta.env.DEV) { console.log('✅ Embedding pipeline complete!'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error'; - if (isDev) { + if (import.meta.env.DEV) { console.error('❌ Embedding pipeline error:', error); } diff --git a/gitnexus-web/src/core/embeddings/index.ts b/gitnexus-web/src/core/embeddings/index.ts new file mode 100644 index 000000000..5d384c8d5 --- /dev/null +++ b/gitnexus-web/src/core/embeddings/index.ts @@ -0,0 +1,11 @@ +/** + * Embeddings Module + * + * Re-exports for the embedding pipeline system. + */ + +export * from './types'; +export * from './embedder'; +export * from './text-generator'; +export * from './embedding-pipeline'; + diff --git a/gitnexus-cli/src/core/embeddings/text-generator.ts b/gitnexus-web/src/core/embeddings/text-generator.ts similarity index 97% rename from gitnexus-cli/src/core/embeddings/text-generator.ts rename to gitnexus-web/src/core/embeddings/text-generator.ts index e3a99ff49..36594e1a8 100644 --- a/gitnexus-cli/src/core/embeddings/text-generator.ts +++ b/gitnexus-web/src/core/embeddings/text-generator.ts @@ -5,8 +5,8 @@ * Combines node metadata with code snippets for semantic matching. */ -import type { EmbeddableNode, EmbeddingConfig } from './types.js'; -import { DEFAULT_EMBEDDING_CONFIG } from './types.js'; +import type { EmbeddableNode, EmbeddingConfig } from './types'; +import { DEFAULT_EMBEDDING_CONFIG } from './types'; /** * Extract the filename from a file path diff --git a/gitnexus-cli/src/core/embeddings/types.ts b/gitnexus-web/src/core/embeddings/types.ts similarity index 92% rename from gitnexus-cli/src/core/embeddings/types.ts rename to gitnexus-web/src/core/embeddings/types.ts index b769b950c..e4a04222b 100644 --- a/gitnexus-cli/src/core/embeddings/types.ts +++ b/gitnexus-web/src/core/embeddings/types.ts @@ -59,8 +59,8 @@ export interface EmbeddingConfig { batchSize: number; /** Embedding vector dimensions */ dimensions: number; - /** Device to use for inference: 'auto' tries GPU first, falls back to CPU */ - device: 'auto' | 'webgpu' | 'cuda' | 'cpu' | 'wasm'; + /** Device to use for inference: 'webgpu' for GPU acceleration, 'wasm' for WASM-based CPU */ + device: 'webgpu' | 'wasm'; /** Maximum characters of code snippet to include */ maxSnippetLength: number; } @@ -74,7 +74,7 @@ export const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig = { modelId: 'Snowflake/snowflake-arctic-embed-xs', batchSize: 16, dimensions: 384, - device: 'auto', + device: 'webgpu', // WebGPU preferred, WASM fallback available if user chooses maxSnippetLength: 500, }; diff --git a/gitnexus-cli/src/core/graph/graph.ts b/gitnexus-web/src/core/graph/graph.ts similarity index 98% rename from gitnexus-cli/src/core/graph/graph.ts rename to gitnexus-web/src/core/graph/graph.ts index 695daf2bf..1f9653b95 100644 --- a/gitnexus-cli/src/core/graph/graph.ts +++ b/gitnexus-web/src/core/graph/graph.ts @@ -1,4 +1,4 @@ -import { GraphNode, GraphRelationship, KnowledgeGraph } from './types.js' +import { GraphNode, GraphRelationship, KnowledgeGraph } from './types' export const createKnowledgeGraph = (): KnowledgeGraph => { const nodeMap = new Map(); diff --git a/gitnexus-cli/src/core/graph/types.ts b/gitnexus-web/src/core/graph/types.ts similarity index 100% rename from gitnexus-cli/src/core/graph/types.ts rename to gitnexus-web/src/core/graph/types.ts diff --git a/gitnexus-cli/src/core/ingestion/ast-cache.ts b/gitnexus-web/src/core/ingestion/ast-cache.ts similarity index 82% rename from gitnexus-cli/src/core/ingestion/ast-cache.ts rename to gitnexus-web/src/core/ingestion/ast-cache.ts index 0ae105120..61775416a 100644 --- a/gitnexus-cli/src/core/ingestion/ast-cache.ts +++ b/gitnexus-web/src/core/ingestion/ast-cache.ts @@ -1,5 +1,5 @@ import { LRUCache } from 'lru-cache'; -import Parser from 'tree-sitter'; +import Parser from 'web-tree-sitter'; // Define the interface for the Cache export interface ASTCache { @@ -16,9 +16,8 @@ export const createASTCache = (maxSize: number = 50): ASTCache => { max: maxSize, dispose: (tree) => { try { - // NOTE: web-tree-sitter has tree.delete(); native tree-sitter trees are GC-managed. - // Keep this try/catch so we don't crash on either runtime. - (tree as any).delete?.(); + // CRITICAL: Free the WASM memory when the tree leaves the cache + tree.delete(); } catch (e) { console.warn('Failed to delete tree from WASM memory', e); } diff --git a/gitnexus-cli/src/core/ingestion/call-processor.ts b/gitnexus-web/src/core/ingestion/call-processor.ts similarity index 93% rename from gitnexus-cli/src/core/ingestion/call-processor.ts rename to gitnexus-web/src/core/ingestion/call-processor.ts index 895e55352..2b71c5aaa 100644 --- a/gitnexus-cli/src/core/ingestion/call-processor.ts +++ b/gitnexus-web/src/core/ingestion/call-processor.ts @@ -1,12 +1,11 @@ -import { KnowledgeGraph } from '../graph/types.js'; -import { ASTCache } from './ast-cache.js'; -import { SymbolTable } from './symbol-table.js'; -import { ImportMap } from './import-processor.js'; -import Parser from 'tree-sitter'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; -import { generateId } from '../../lib/utils.js'; -import { getLanguageFromFilename } from './utils.js'; +import { KnowledgeGraph } from '../graph/types'; +import { ASTCache } from './ast-cache'; +import { SymbolTable } from './symbol-table'; +import { ImportMap } from './import-processor'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries'; +import { generateId } from '../../lib/utils'; +import { getLanguageFromFilename } from './utils'; /** * Node types that represent function/method definitions across languages. @@ -157,25 +156,18 @@ export const processCalls = async ( if (!tree) { // Cache Miss: Re-parse - // Use larger bufferSize for files > 32KB - try { - tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); - } catch (parseError) { - // Skip files that can't be parsed - continue; - } + tree = parser.parse(file.content); wasReparsed = true; } let query; let matches; try { - const language = parser.getLanguage(); - query = new Parser.Query(language, queryStr); + query = parser.getLanguage().query(queryStr); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Query error for ${file.path}:`, queryError); - if (wasReparsed) (tree as any).delete?.(); + if (wasReparsed) tree.delete(); continue; } @@ -226,7 +218,7 @@ export const processCalls = async ( // Cleanup if re-parsed if (wasReparsed) { - (tree as any).delete?.(); + tree.delete(); } } }; diff --git a/gitnexus-cli/src/core/ingestion/cluster-enricher.ts b/gitnexus-web/src/core/ingestion/cluster-enricher.ts similarity index 99% rename from gitnexus-cli/src/core/ingestion/cluster-enricher.ts rename to gitnexus-web/src/core/ingestion/cluster-enricher.ts index 0154e3bf3..51e00d618 100644 --- a/gitnexus-cli/src/core/ingestion/cluster-enricher.ts +++ b/gitnexus-web/src/core/ingestion/cluster-enricher.ts @@ -5,7 +5,7 @@ * Generates semantic names, keywords, and descriptions using an LLM. */ -import { CommunityNode } from './community-processor.js'; +import { CommunityNode } from './community-processor'; // ============================================================================ // TYPES diff --git a/gitnexus-cli/src/core/ingestion/community-processor.ts b/gitnexus-web/src/core/ingestion/community-processor.ts similarity index 95% rename from gitnexus-cli/src/core/ingestion/community-processor.ts rename to gitnexus-web/src/core/ingestion/community-processor.ts index 42194c076..1a8901acc 100644 --- a/gitnexus-cli/src/core/ingestion/community-processor.ts +++ b/gitnexus-web/src/core/ingestion/community-processor.ts @@ -8,11 +8,9 @@ * helping agents navigate the codebase by functional area rather than file structure. */ -// NOTE: graphology + louvain typings are a bit inconsistent across versions. -// Keep these as `any` to avoid blocking the CLI build. import Graph from 'graphology'; import louvain from 'graphology-communities-louvain'; -import { KnowledgeGraph, NodeLabel } from '../graph/types.js'; +import { KnowledgeGraph, NodeLabel } from '../graph/types'; // ============================================================================ // TYPES @@ -96,7 +94,7 @@ export const processCommunities = async ( onProgress?.(`Running Leiden algorithm on ${graph.order} nodes...`, 30); // Step 2: Run Leiden (via Louvain implementation with refinement) - const details = (louvain as any).detailed(graph, { + const details = louvain.detailed(graph, { resolution: 1.0, // Default resolution, can be tuned randomWalk: true, }); @@ -143,9 +141,9 @@ export const processCommunities = async ( * Build a graphology graph containing only symbol nodes and CALLS edges * This is what the Leiden algorithm will cluster */ -const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): any => { +const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): Graph => { // Use undirected graph for Leiden - it looks at edge density, not direction - const graph = new (Graph as any)({ type: 'undirected', allowSelfLoops: false }); + const graph = new Graph({ type: 'undirected', allowSelfLoops: false }); // Symbol types that should be clustered const symbolTypes = new Set(['Function', 'Class', 'Method', 'Interface']); @@ -191,7 +189,7 @@ const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): any => { const createCommunityNodes = ( communities: Record, communityCount: number, - graph: any, + graph: Graph, knowledgeGraph: KnowledgeGraph ): CommunityNode[] => { // Group node IDs by community @@ -246,7 +244,7 @@ const createCommunityNodes = ( const generateHeuristicLabel = ( memberIds: string[], nodePathMap: Map, - graph: any, + graph: Graph, commNum: number ): string => { // Collect folder names from file paths @@ -327,7 +325,7 @@ const findCommonPrefix = (strings: string[]): string => { * Calculate cohesion score (0-1) based on internal edge density * Higher cohesion = more internal connections relative to size */ -const calculateCohesion = (memberIds: string[], graph: any): number => { +const calculateCohesion = (memberIds: string[], graph: Graph): number => { if (memberIds.length <= 1) return 1.0; const memberSet = new Set(memberIds); diff --git a/gitnexus-cli/src/core/ingestion/entry-point-scoring.ts b/gitnexus-web/src/core/ingestion/entry-point-scoring.ts similarity index 99% rename from gitnexus-cli/src/core/ingestion/entry-point-scoring.ts rename to gitnexus-web/src/core/ingestion/entry-point-scoring.ts index 55d0b1035..1ef3d3ddc 100644 --- a/gitnexus-cli/src/core/ingestion/entry-point-scoring.ts +++ b/gitnexus-web/src/core/ingestion/entry-point-scoring.ts @@ -10,7 +10,7 @@ * This module is language-agnostic - language-specific patterns are defined per language. */ -import { detectFrameworkFromPath } from './framework-detection.js'; +import { detectFrameworkFromPath } from './framework-detection'; // ============================================================================ // NAME PATTERNS - All 9 supported languages diff --git a/gitnexus-cli/src/core/ingestion/framework-detection.ts b/gitnexus-web/src/core/ingestion/framework-detection.ts similarity index 100% rename from gitnexus-cli/src/core/ingestion/framework-detection.ts rename to gitnexus-web/src/core/ingestion/framework-detection.ts diff --git a/gitnexus-cli/src/core/ingestion/heritage-processor.ts b/gitnexus-web/src/core/ingestion/heritage-processor.ts similarity index 85% rename from gitnexus-cli/src/core/ingestion/heritage-processor.ts rename to gitnexus-web/src/core/ingestion/heritage-processor.ts index f0143a77d..378a3bdd1 100644 --- a/gitnexus-cli/src/core/ingestion/heritage-processor.ts +++ b/gitnexus-web/src/core/ingestion/heritage-processor.ts @@ -6,14 +6,13 @@ * - IMPLEMENTS: Class implements an Interface (TS only) */ -import { KnowledgeGraph } from '../graph/types.js'; -import { ASTCache } from './ast-cache.js'; -import { SymbolTable } from './symbol-table.js'; -import Parser from 'tree-sitter'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; -import { generateId } from '../../lib/utils.js'; -import { getLanguageFromFilename } from './utils.js'; +import { KnowledgeGraph } from '../graph/types'; +import { ASTCache } from './ast-cache'; +import { SymbolTable } from './symbol-table'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries'; +import { generateId } from '../../lib/utils'; +import { getLanguageFromFilename } from './utils'; export const processHeritage = async ( graph: KnowledgeGraph, @@ -43,25 +42,18 @@ export const processHeritage = async ( let wasReparsed = false; if (!tree) { - // Use larger bufferSize for files > 32KB - try { - tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); - } catch (parseError) { - // Skip files that can't be parsed - continue; - } + tree = parser.parse(file.content); wasReparsed = true; } let query; let matches; try { - const language = parser.getLanguage(); - query = new Parser.Query(language, queryStr); + query = parser.getLanguage().query(queryStr); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Heritage query error for ${file.path}:`, queryError); - if (wasReparsed) (tree as any).delete?.(); + if (wasReparsed) tree.delete(); continue; } @@ -156,7 +148,7 @@ export const processHeritage = async ( // Cleanup if (wasReparsed) { - (tree as any).delete?.(); + tree.delete(); } } }; diff --git a/gitnexus-cli/src/core/ingestion/import-processor.ts b/gitnexus-web/src/core/ingestion/import-processor.ts similarity index 89% rename from gitnexus-cli/src/core/ingestion/import-processor.ts rename to gitnexus-web/src/core/ingestion/import-processor.ts index aeac2162f..c0cb6bd68 100644 --- a/gitnexus-cli/src/core/ingestion/import-processor.ts +++ b/gitnexus-web/src/core/ingestion/import-processor.ts @@ -1,12 +1,9 @@ -import { KnowledgeGraph } from '../graph/types.js'; -import { ASTCache } from './ast-cache.js'; -import Parser from 'tree-sitter'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; -import { generateId } from '../../lib/utils.js'; -import { getLanguageFromFilename } from './utils.js'; - -const isDev = process.env.NODE_ENV !== 'production'; +import { KnowledgeGraph } from '../graph/types'; +import { ASTCache } from './ast-cache'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries'; +import { generateId } from '../../lib/utils'; +import { getLanguageFromFilename } from './utils'; // Type: Map> // Stores all files that a given file imports from @@ -144,21 +141,14 @@ export const processImports = async ( if (!tree) { // Cache Miss: Re-parse (slower, but necessary if evicted) - // Use larger bufferSize for files > 32KB - try { - tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); - } catch (parseError) { - // Skip files that can't be parsed - continue; - } + tree = parser.parse(file.content); wasReparsed = true; } let query; let matches; try { - const language = parser.getLanguage(); - query = new Parser.Query(language, queryStr); + query = parser.getLanguage().query(queryStr); matches = query.matches(tree.rootNode); // Removed verbose Java import logging @@ -173,7 +163,7 @@ export const processImports = async ( console.log('AST has errors:', tree.rootNode?.hasError); console.groupEnd(); - if (wasReparsed) (tree as any).delete?.(); + if (wasReparsed) tree.delete(); continue; } @@ -184,7 +174,7 @@ export const processImports = async ( if (captureMap['import']) { const sourceNode = captureMap['import.source']; if (!sourceNode) { - if (isDev) { + if (import.meta.env.DEV) { console.log(`⚠️ Import captured but no source node in ${file.path}`); } return; @@ -234,11 +224,11 @@ export const processImports = async ( // If re-parsed just for this, delete the tree to save memory if (wasReparsed) { - (tree as any).delete?.(); + tree.delete(); } } - if (isDev) { + if (import.meta.env.DEV) { console.log(`📊 Import processing complete: ${totalImportsResolved}/${totalImportsFound} imports resolved to graph edges`); } }; diff --git a/gitnexus-cli/src/core/ingestion/parsing-processor.ts b/gitnexus-web/src/core/ingestion/parsing-processor.ts similarity index 91% rename from gitnexus-cli/src/core/ingestion/parsing-processor.ts rename to gitnexus-web/src/core/ingestion/parsing-processor.ts index cca7098ea..807bcf581 100644 --- a/gitnexus-cli/src/core/ingestion/parsing-processor.ts +++ b/gitnexus-web/src/core/ingestion/parsing-processor.ts @@ -1,11 +1,10 @@ -import { KnowledgeGraph, GraphNode, GraphRelationship } from '../graph/types.js'; -import Parser from 'tree-sitter'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; -import { generateId } from '../../lib/utils.js'; -import { SymbolTable } from './symbol-table.js'; -import { ASTCache } from './ast-cache.js'; -import { getLanguageFromFilename } from './utils.js'; +import { KnowledgeGraph, GraphNode, GraphRelationship } from '../graph/types'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries'; +import { generateId } from '../../lib/utils'; +import { SymbolTable } from './symbol-table'; +import { ASTCache } from './ast-cache'; +import { getLanguageFromFilename } from './utils'; export type FileProgressCallback = (current: number, total: number, filePath: string) => void; @@ -135,15 +134,7 @@ export const processParsing = async ( await loadLanguage(language, file.path); // 3. Parse the text content into an AST - // Use larger bufferSize for files > 32KB (default limit) - let tree; - try { - tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); - } catch (parseError) { - // Skip files that can't be parsed (binary, encoding issues, etc.) - console.warn(`Skipping unparseable file: ${file.path}`); - continue; - } + const tree = parser.parse(file.content); // Store in cache immediately (this might evict an old one) astCache.set(file.path, tree); @@ -159,8 +150,7 @@ export const processParsing = async ( let query; let matches; try { - const language = parser.getLanguage(); - query = new Parser.Query(language, queryString); + query = parser.getLanguage().query(queryString); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Query error for ${file.path}:`, queryError); diff --git a/gitnexus-web/src/core/ingestion/pipeline.ts b/gitnexus-web/src/core/ingestion/pipeline.ts new file mode 100644 index 000000000..8c276b312 --- /dev/null +++ b/gitnexus-web/src/core/ingestion/pipeline.ts @@ -0,0 +1,304 @@ +import { createKnowledgeGraph } from '../graph/graph'; +import { extractZip, FileEntry } from '../../services/zip'; +import { processStructure } from './structure-processor'; +import { processParsing } from './parsing-processor'; +import { processImports, createImportMap } from './import-processor'; +import { processCalls } from './call-processor'; +import { processHeritage } from './heritage-processor'; +import { processCommunities, CommunityDetectionResult } from './community-processor'; +import { processProcesses, ProcessDetectionResult } from './process-processor'; +import { createSymbolTable } from './symbol-table'; +import { createASTCache } from './ast-cache'; +import { PipelineProgress, PipelineResult } from '../../types/pipeline'; + +/** + * Run the ingestion pipeline from a ZIP file + */ +export const runIngestionPipeline = async ( file: File, onProgress: (progress: PipelineProgress) => void): Promise => { + // Phase 1: Extracting (0-15%) + onProgress({ + phase: 'extracting', + percent: 0, + message: 'Extracting ZIP file...', + }); + + // Fake progress for extraction (JSZip doesn't expose progress) + const fakeExtractionProgress = setInterval(() => { + onProgress({ + phase: 'extracting', + percent: Math.min(14, Math.random() * 10 + 5), + message: 'Extracting ZIP file...', + }); + }, 200); + + const files = await extractZip(file); + clearInterval(fakeExtractionProgress); + + // Continue with common pipeline + return runPipelineFromFiles(files, onProgress); +}; + +/** + * Run the ingestion pipeline from pre-extracted files (e.g., from git clone) + */ +export const runPipelineFromFiles = async ( + files: FileEntry[], + onProgress: (progress: PipelineProgress) => void +): Promise => { + const graph = createKnowledgeGraph(); + const fileContents = new Map(); + const symbolTable = createSymbolTable(); + const astCache = createASTCache(50); // Keep last 50 files hot + const importMap = createImportMap(); + + // Cleanup function for error handling + const cleanup = () => { + astCache.clear(); + symbolTable.clear(); + }; + + try { + // Store file contents for code panel + files.forEach(f => fileContents.set(f.path, f.content)); + + onProgress({ + phase: 'extracting', + percent: 15, + message: 'ZIP extracted successfully', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: 0 }, + }); + + // Phase 2: Structure (15-30%) + onProgress({ + phase: 'structure', + percent: 15, + message: 'Analyzing project structure...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: 0 }, + }); + + const filePaths = files.map(f => f.path); + processStructure(graph, filePaths); + + onProgress({ + phase: 'structure', + percent: 30, + message: 'Project structure analyzed', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + // Phase 3: Parsing (30-70%) + onProgress({ + phase: 'parsing', + percent: 30, + message: 'Parsing code definitions...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processParsing(graph, files, symbolTable, astCache, (current, total, filePath) => { + const parsingProgress = 30 + ((current / total) * 40); + onProgress({ + phase: 'parsing', + percent: Math.round(parsingProgress), + message: 'Parsing code definitions...', + detail: filePath, + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + + // Phase 4: Imports (70-82%) + onProgress({ + phase: 'imports', + percent: 70, + message: 'Resolving imports...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processImports(graph, files, astCache, importMap, (current, total) => { + const importProgress = 70 + ((current / total) * 12); + onProgress({ + phase: 'imports', + percent: Math.round(importProgress), + message: 'Resolving imports...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + // Debug: Count IMPORTS relationships + if (import.meta.env.DEV) { + const importsCount = graph.relationships.filter(r => r.type === 'IMPORTS').length; + console.log(`📊 Pipeline: After import phase, graph has ${importsCount} IMPORTS relationships (total: ${graph.relationshipCount})`); + if (importsCount > 0) { + const sample = graph.relationships.filter(r => r.type === 'IMPORTS').slice(0, 3); + sample.forEach(r => console.log(` Sample IMPORTS: ${r.sourceId} → ${r.targetId}`)); + } + } + + + // Phase 5: Calls (82-98%) + onProgress({ + phase: 'calls', + percent: 82, + message: 'Tracing function calls...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processCalls(graph, files, astCache, symbolTable, importMap, (current, total) => { + const callProgress = 82 + ((current / total) * 10); + onProgress({ + phase: 'calls', + percent: Math.round(callProgress), + message: 'Tracing function calls...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + // Phase 6: Heritage - Class inheritance (92-98%) + onProgress({ + phase: 'heritage', + percent: 92, + message: 'Extracting class inheritance...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processHeritage(graph, files, astCache, symbolTable, (current, total) => { + const heritageProgress = 88 + ((current / total) * 4); + onProgress({ + phase: 'heritage', + percent: Math.round(heritageProgress), + message: 'Extracting class inheritance...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + // Phase 7: Community Detection (92-98%) + onProgress({ + phase: 'communities', + percent: 92, + message: 'Detecting code communities...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const communityResult = await processCommunities(graph, (message, progress) => { + const communityProgress = 92 + (progress * 0.06); + onProgress({ + phase: 'communities', + percent: Math.round(communityProgress), + message, + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + }); + + // Log community detection results + if (import.meta.env.DEV) { + console.log(`🏘️ Community detection: ${communityResult.stats.totalCommunities} communities found (modularity: ${communityResult.stats.modularity.toFixed(3)})`); + } + + // Add community nodes to the graph + communityResult.communities.forEach(comm => { + graph.addNode({ + id: comm.id, + label: 'Community' as const, + properties: { + name: comm.label, + filePath: '', + heuristicLabel: comm.heuristicLabel, + cohesion: comm.cohesion, + symbolCount: comm.symbolCount, + } + }); + }); + + // Add MEMBER_OF relationships + communityResult.memberships.forEach(membership => { + graph.addRelationship({ + id: `${membership.nodeId}_member_of_${membership.communityId}`, + type: 'MEMBER_OF', + sourceId: membership.nodeId, + targetId: membership.communityId, + confidence: 1.0, + reason: 'leiden-algorithm', + }); + }); + + // Phase 8: Process Detection (98-99%) + onProgress({ + phase: 'processes', + percent: 98, + message: 'Detecting execution flows...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const processResult = await processProcesses( + graph, + communityResult.memberships, + (message, progress) => { + const processProgress = 98 + (progress * 0.01); + onProgress({ + phase: 'processes', + percent: Math.round(processProgress), + message, + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + } + ); + + // Log process detection results + if (import.meta.env.DEV) { + console.log(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`); + } + + // Add Process nodes to the graph + processResult.processes.forEach(proc => { + graph.addNode({ + id: proc.id, + label: 'Process' as const, + properties: { + name: proc.label, + filePath: '', + heuristicLabel: proc.heuristicLabel, + processType: proc.processType, + stepCount: proc.stepCount, + communities: proc.communities, + entryPointId: proc.entryPointId, + terminalId: proc.terminalId, + } + }); + }); + + // Add STEP_IN_PROCESS relationships + processResult.steps.forEach(step => { + graph.addRelationship({ + id: `${step.nodeId}_step_${step.step}_${step.processId}`, + type: 'STEP_IN_PROCESS', + sourceId: step.nodeId, + targetId: step.processId, + confidence: 1.0, + reason: 'trace-detection', + step: step.step, + }); + }); + + + // Phase 9: Complete (100%) + onProgress({ + phase: 'complete', + percent: 100, + message: `Graph complete! ${communityResult.stats.totalCommunities} communities, ${processResult.stats.totalProcesses} processes detected.`, + stats: { + filesProcessed: files.length, + totalFiles: files.length, + nodesCreated: graph.nodeCount + }, + }); + + // Cleanup WASM memory before returning + astCache.clear(); + + return { graph, fileContents, communityResult, processResult }; + + } catch (error) { + cleanup(); + throw error; + } +}; diff --git a/gitnexus-cli/src/core/ingestion/process-processor.ts b/gitnexus-web/src/core/ingestion/process-processor.ts similarity index 98% rename from gitnexus-cli/src/core/ingestion/process-processor.ts rename to gitnexus-web/src/core/ingestion/process-processor.ts index ccb1bf1cc..cf983d2e6 100644 --- a/gitnexus-cli/src/core/ingestion/process-processor.ts +++ b/gitnexus-web/src/core/ingestion/process-processor.ts @@ -10,11 +10,9 @@ * Processes help agents understand how features work through the codebase. */ -import { KnowledgeGraph, GraphNode, GraphRelationship, NodeLabel } from '../graph/types.js'; -import { CommunityMembership } from './community-processor.js'; -import { calculateEntryPointScore, isTestFile } from './entry-point-scoring.js'; - -const isDev = process.env.NODE_ENV !== 'production'; +import { KnowledgeGraph, GraphNode, GraphRelationship, NodeLabel } from '../graph/types'; +import { CommunityMembership } from './community-processor'; +import { calculateEntryPointScore, isTestFile } from './entry-point-scoring'; // ============================================================================ // CONFIGURATION @@ -291,7 +289,7 @@ const findEntryPoints = ( const sorted = entryPointCandidates.sort((a, b) => b.score - a.score); // DEBUG: Log top candidates with new scoring details - if (sorted.length > 0 && isDev) { + if (sorted.length > 0 && typeof import.meta !== 'undefined' && import.meta.env?.DEV) { console.log(`[Process] Top 10 entry point candidates (new scoring):`); sorted.slice(0, 10).forEach((c, i) => { const node = graph.nodes.find(n => n.id === c.id); diff --git a/gitnexus-cli/src/core/ingestion/structure-processor.ts b/gitnexus-web/src/core/ingestion/structure-processor.ts similarity index 95% rename from gitnexus-cli/src/core/ingestion/structure-processor.ts rename to gitnexus-web/src/core/ingestion/structure-processor.ts index de1a53e49..c73a5837c 100644 --- a/gitnexus-cli/src/core/ingestion/structure-processor.ts +++ b/gitnexus-web/src/core/ingestion/structure-processor.ts @@ -1,5 +1,5 @@ -import { generateId } from "../../lib/utils.js"; -import { KnowledgeGraph, GraphNode, GraphRelationship } from "../graph/types.js"; +import { generateId } from "@/lib/utils"; +import { KnowledgeGraph, GraphNode, GraphRelationship } from "../graph/types"; export const processStructure = ( graph: KnowledgeGraph, paths: string[])=>{ paths.forEach( path => { diff --git a/gitnexus-cli/src/core/ingestion/symbol-table.ts b/gitnexus-web/src/core/ingestion/symbol-table.ts similarity index 100% rename from gitnexus-cli/src/core/ingestion/symbol-table.ts rename to gitnexus-web/src/core/ingestion/symbol-table.ts diff --git a/gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts b/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts similarity index 99% rename from gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts rename to gitnexus-web/src/core/ingestion/tree-sitter-queries.ts index f8bcd7add..a931b4a40 100644 --- a/gitnexus-cli/src/core/ingestion/tree-sitter-queries.ts +++ b/gitnexus-web/src/core/ingestion/tree-sitter-queries.ts @@ -1,4 +1,4 @@ -import { SupportedLanguages } from '../../config/supported-languages.js'; +import { SupportedLanguages } from '../../config/supported-languages'; /* * Tree-sitter queries for extracting code definitions. diff --git a/gitnexus-cli/src/core/ingestion/utils.ts b/gitnexus-web/src/core/ingestion/utils.ts similarity index 99% rename from gitnexus-cli/src/core/ingestion/utils.ts rename to gitnexus-web/src/core/ingestion/utils.ts index 5ac12a8be..959eb55dc 100644 --- a/gitnexus-cli/src/core/ingestion/utils.ts +++ b/gitnexus-web/src/core/ingestion/utils.ts @@ -1,4 +1,4 @@ -import { SupportedLanguages } from '../../config/supported-languages.js'; +import { SupportedLanguages } from '../../config/supported-languages'; /** * Map file extension to SupportedLanguage enum diff --git a/gitnexus-cli/src/core/kuzu/csv-generator.ts b/gitnexus-web/src/core/kuzu/csv-generator.ts similarity index 98% rename from gitnexus-cli/src/core/kuzu/csv-generator.ts rename to gitnexus-web/src/core/kuzu/csv-generator.ts index b23471deb..43df569cf 100644 --- a/gitnexus-cli/src/core/kuzu/csv-generator.ts +++ b/gitnexus-web/src/core/kuzu/csv-generator.ts @@ -10,8 +10,8 @@ * - All fields are consistently quoted for safety with code content */ -import { KnowledgeGraph, GraphNode, NodeLabel } from '../graph/types.js'; -import { NODE_TABLES, NodeTableName } from './schema.js'; +import { KnowledgeGraph, GraphNode, NodeLabel } from '../graph/types'; +import { NODE_TABLES, NodeTableName } from './schema'; // ============================================================================ // CSV ESCAPE UTILITIES @@ -133,14 +133,9 @@ export interface CSVData { const generateFileCSV = (nodes: GraphNode[], fileContents: Map): string => { const headers = ['id', 'name', 'filePath', 'content']; const rows: string[] = [headers.join(',')]; - const seenIds = new Set(); for (const node of nodes) { if (node.label !== 'File') continue; - // Skip duplicates - if (seenIds.has(node.id)) continue; - seenIds.add(node.id); - const content = extractContent(node, fileContents); rows.push([ escapeCSVField(node.id), diff --git a/gitnexus-web/src/core/kuzu/kuzu-adapter.ts b/gitnexus-web/src/core/kuzu/kuzu-adapter.ts new file mode 100644 index 000000000..c16e2edf3 --- /dev/null +++ b/gitnexus-web/src/core/kuzu/kuzu-adapter.ts @@ -0,0 +1,520 @@ +/** + * KuzuDB Adapter + * + * Manages the KuzuDB WASM instance for client-side graph database operations. + * Uses the "Snapshot / Bulk Load" pattern with COPY FROM for performance. + * + * Multi-table schema: separate tables for File, Function, Class, etc. + */ + +import { KnowledgeGraph } from '../graph/types'; +import { + NODE_TABLES, + REL_TABLE_NAME, + SCHEMA_QUERIES, + EMBEDDING_TABLE_NAME, + NodeTableName, +} from './schema'; +import { generateAllCSVs } from './csv-generator'; + +// Holds the reference to the dynamically loaded module +let kuzu: any = null; +let db: any = null; +let conn: any = null; + +/** + * Initialize KuzuDB WASM module and create in-memory database + */ +export const initKuzu = async () => { + if (conn) return { db, conn, kuzu }; + + try { + if (import.meta.env.DEV) console.log('🚀 Initializing KuzuDB...'); + + // 1. Dynamic Import (Fixes the "not a function" bundler issue) + const kuzuModule = await import('kuzu-wasm'); + + // 2. Handle Vite/Webpack "default" wrapping + kuzu = kuzuModule.default || kuzuModule; + + // 3. Initialize WASM + await kuzu.init(); + + // 4. Create Database with 512MB buffer pool + const BUFFER_POOL_SIZE = 512 * 1024 * 1024; // 512MB + db = new kuzu.Database(':memory:', BUFFER_POOL_SIZE); + conn = new kuzu.Connection(db); + + if (import.meta.env.DEV) console.log('✅ KuzuDB WASM Initialized'); + + // 5. Initialize Schema (all node tables, then rel tables, then embedding table) + for (const schemaQuery of SCHEMA_QUERIES) { + try { + await conn.query(schemaQuery); + } catch (e) { + // Schema might already exist, skip + if (import.meta.env.DEV) { + console.warn('Schema creation skipped (may already exist):', e); + } + } + } + + if (import.meta.env.DEV) console.log('✅ KuzuDB Multi-Table Schema Created'); + + return { db, conn, kuzu }; + } catch (error) { + if (import.meta.env.DEV) console.error('❌ KuzuDB Initialization Failed:', error); + throw error; + } +}; + +/** + * Load a KnowledgeGraph into KuzuDB using COPY FROM (bulk load) + * Uses batched CSV writes and COPY statements for optimal performance + */ +export const loadGraphToKuzu = async ( + graph: KnowledgeGraph, + fileContents: Map +) => { + const { conn, kuzu } = await initKuzu(); + + try { + if (import.meta.env.DEV) console.log(`KuzuDB: Generating CSVs for ${graph.nodeCount} nodes...`); + + // 1. Generate all CSVs (per-table) + const csvData = generateAllCSVs(graph, fileContents); + + const fs = kuzu.FS; + + // 2. Write all node CSVs to virtual filesystem + const nodeFiles: Array<{ table: NodeTableName; path: string }> = []; + for (const [tableName, csv] of csvData.nodes.entries()) { + // Skip empty CSVs (only header row) + if (csv.split('\n').length <= 1) continue; + + const path = `/${tableName.toLowerCase()}.csv`; + try { await fs.unlink(path); } catch {} + await fs.writeFile(path, csv); + nodeFiles.push({ table: tableName, path }); + } + + // 3. Parse relation CSV and prepare for INSERT (COPY FROM doesn't work with multi-pair tables) + const relLines = csvData.relCSV.split('\n').slice(1).filter(line => line.trim()); + const relCount = relLines.length; + + if (import.meta.env.DEV) { + console.log(`KuzuDB: Wrote ${nodeFiles.length} node CSVs, ${relCount} relations to insert`); + } + + // 4. COPY all node tables (must complete before rels due to FK constraints) + for (const { table, path } of nodeFiles) { + const copyQuery = getCopyQuery(table, path); + await conn.query(copyQuery); + } + + // 5. INSERT relations one by one (COPY doesn't work with multi-pair REL tables) + // Parse CSV format: "from","to","type",confidence,"reason" + let insertedRels = 0; + let skippedRels = 0; + const skippedRelStats = new Map(); + for (const line of relLines) { + try { + // Parse CSV - handle quoted fields and numeric confidence + // Parse CSV - handle quoted fields and numeric confidence + // Format: "from","to","type",confidence,"reason",step + // Note: step is unquoted numeric + const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)",([0-9-]+)/); + if (!match) continue; + + const [, fromId, toId, relType, confidenceStr, reason, stepStr] = match; + const confidence = parseFloat(confidenceStr) || 1.0; + const step = parseInt(stepStr) || 0; + + // Extract labels from node IDs + // Community nodes have IDs like "comm_14" (no colon) + // Other nodes have IDs like "Label:path:name" + const getNodeLabel = (nodeId: string): string => { + if (nodeId.startsWith('comm_')) { + return 'Community'; + } + if (nodeId.startsWith('proc_')) { + return 'Process'; + } + return nodeId.split(':')[0]; + }; + + // Reserved Cypher keywords need backtick escaping + const RESERVED_LABELS = ['Macro', 'Enum', 'Union', 'Const', 'Module', 'Struct']; + const escapeLabel = (label: string): string => { + return RESERVED_LABELS.includes(label) ? `\`${label}\`` : label; + }; + + const fromLabel = escapeLabel(getNodeLabel(fromId)); + const toLabel = escapeLabel(getNodeLabel(toId)); + + // INSERT with explicit node matching (including confidence and reason) + const insertQuery = ` + MATCH (a:${fromLabel} {id: '${fromId.replace(/'/g, "''")}'}), + (b:${toLabel} {id: '${toId.replace(/'/g, "''")}'}) + CREATE (a)-[:${REL_TABLE_NAME} {type: '${relType}', confidence: ${confidence}, reason: '${reason.replace(/'/g, "''")}', step: ${step}}]->(b) + `; + await conn.query(insertQuery); + insertedRels++; + } catch (err) { + // Skip failed insertions (nodes might not exist, or relation pair not allowed by schema) + skippedRels++; + const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)"/); + if (match) { + const [, fromId, toId, relType] = match; + const getNodeLabel = (nodeId: string): string => { + if (nodeId.startsWith('comm_')) return 'Community'; + if (nodeId.startsWith('proc_')) return 'Process'; + return nodeId.split(':')[0]; + }; + const fromLabel = getNodeLabel(fromId); + const toLabel = getNodeLabel(toId); + const key = `${relType}:${fromLabel}->` + toLabel; + skippedRelStats.set(key, (skippedRelStats.get(key) || 0) + 1); + + // Log each skipped relation + if (import.meta.env.DEV) { + console.warn(`⚠️ Skipped: ${key} | "${fromId}" → "${toId}" | ${err instanceof Error ? err.message : String(err)}`); + } + } + } + } + + if (import.meta.env.DEV) { + console.log(`KuzuDB: Inserted ${insertedRels}/${relCount} relations`); + if (skippedRels > 0) { + const topSkipped = Array.from(skippedRelStats.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, 10); + console.warn(`KuzuDB: Skipped ${skippedRels}/${relCount} relations (top by kind/pair):`, topSkipped); + } + } + + // 6. Verify results + let totalNodes = 0; + for (const tableName of NODE_TABLES) { + try { + const countRes = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); + const countRow = await countRes.getNext(); + const count = countRow ? (countRow.cnt ?? countRow[0] ?? 0) : 0; + totalNodes += Number(count); + } catch { + // Table might be empty, skip + } + } + + if (import.meta.env.DEV) console.log(`✅ KuzuDB Bulk Load Complete. Total nodes: ${totalNodes}, edges: ${insertedRels}`); + + // 7. Cleanup CSV files + for (const { path } of nodeFiles) { + try { await fs.unlink(path); } catch {} + } + + return { success: true, count: totalNodes }; + + } catch (error) { + if (import.meta.env.DEV) console.error('❌ KuzuDB Bulk Load Failed:', error); + return { success: false, count: 0 }; + } +}; + +/** + * Get the COPY query for a node table with correct column mapping + */ +const getCopyQuery = (table: NodeTableName, path: string): string => { + // File and Folder have different columns than code elements + if (table === 'File') { + return `COPY File(id, name, filePath, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Folder') { + return `COPY Folder(id, name, filePath) FROM "${path}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Community') { + return `COPY Community(id, label, heuristicLabel, keywords, description, enrichedBy, cohesion, symbolCount) FROM "${path}" (HEADER=true, PARALLEL=false)`; + } + if (table === 'Process') { + return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${path}" (HEADER=true, PARALLEL=false)`; + } + // All code element tables: Function, Class, Interface, Method, CodeElement + return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; +}; + +/** + * Execute a Cypher query against the database + * Returns results as named objects (not tuples) for better usability + */ +export const executeQuery = async (cypher: string): Promise => { + if (!conn) { + await initKuzu(); + } + + try { + const result = await conn.query(cypher); + + // Extract column names from RETURN clause + const returnMatch = cypher.match(/RETURN\s+(.+?)(?:\s+ORDER|\s+LIMIT|\s+SKIP|\s*$)/is); + let columnNames: string[] = []; + if (returnMatch) { + // Parse RETURN clause to get column names/aliases + // Handles: "a.name, b.filePath AS path, count(x) AS cnt" + const returnClause = returnMatch[1]; + columnNames = returnClause.split(',').map(col => { + col = col.trim(); + // Check for AS alias + const asMatch = col.match(/\s+AS\s+(\w+)\s*$/i); + if (asMatch) return asMatch[1]; + // Check for property access like n.name + const propMatch = col.match(/\.(\w+)\s*$/); + if (propMatch) return propMatch[1]; + // Check for function call like count(x) + const funcMatch = col.match(/^(\w+)\s*\(/); + if (funcMatch) return funcMatch[1]; + // Just use as-is if simple identifier + return col.replace(/[^a-zA-Z0-9_]/g, '_'); + }); + } + + // Collect all rows + const rows: any[] = []; + while (await result.hasNext()) { + const row = await result.getNext(); + + // Convert tuple to named object if we have column names and row is array + if (Array.isArray(row) && columnNames.length === row.length) { + const namedRow: Record = {}; + for (let i = 0; i < row.length; i++) { + namedRow[columnNames[i]] = row[i]; + } + rows.push(namedRow); + } else { + // Already an object or column count doesn't match + rows.push(row); + } + } + + return rows; + } catch (error) { + if (import.meta.env.DEV) console.error('Query execution failed:', error); + throw error; + } +}; + +/** + * Get database statistics + */ +export const getKuzuStats = async (): Promise<{ nodes: number; edges: number }> => { + if (!conn) { + return { nodes: 0, edges: 0 }; + } + + try { + // Count nodes across all tables + let totalNodes = 0; + for (const tableName of NODE_TABLES) { + try { + const nodeResult = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); + const nodeRow = await nodeResult.getNext(); + totalNodes += Number(nodeRow?.cnt ?? nodeRow?.[0] ?? 0); + } catch { + // Table might not exist or be empty + } + } + + // Count edges from single relation table + let totalEdges = 0; + try { + const edgeResult = await conn.query(`MATCH ()-[r:${REL_TABLE_NAME}]->() RETURN count(r) AS cnt`); + const edgeRow = await edgeResult.getNext(); + totalEdges = Number(edgeRow?.cnt ?? edgeRow?.[0] ?? 0); + } catch { + // Table might not exist or be empty + } + + return { nodes: totalNodes, edges: totalEdges }; + } catch (error) { + if (import.meta.env.DEV) { + console.warn('Failed to get Kuzu stats:', error); + } + return { nodes: 0, edges: 0 }; + } +}; + +/** + * Check if KuzuDB is initialized and has data + */ +export const isKuzuReady = (): boolean => { + return conn !== null && db !== null; +}; + +/** + * Close the database connection (cleanup) + */ +export const closeKuzu = async (): Promise => { + if (conn) { + try { + await conn.close(); + } catch {} + conn = null; + } + if (db) { + try { + await db.close(); + } catch {} + db = null; + } + kuzu = null; +}; + +/** + * Execute a prepared statement with parameters + * @param cypher - Cypher query with $param placeholders + * @param params - Object mapping param names to values + * @returns Query results + */ +export const executePrepared = async ( + cypher: string, + params: Record +): Promise => { + if (!conn) { + await initKuzu(); + } + + try { + const stmt = await conn.prepare(cypher); + if (!stmt.isSuccess()) { + const errMsg = await stmt.getErrorMessage(); + throw new Error(`Prepare failed: ${errMsg}`); + } + + const result = await conn.execute(stmt, params); + + const rows: any[] = []; + while (await result.hasNext()) { + const row = await result.getNext(); + rows.push(row); + } + + await stmt.close(); + return rows; + } catch (error) { + if (import.meta.env.DEV) console.error('Prepared query failed:', error); + throw error; + } +}; + +/** + * Execute a prepared statement with multiple parameter sets in small sub-batches + */ +export const executeWithReusedStatement = async ( + cypher: string, + paramsList: Array> +): Promise => { + if (!conn) { + await initKuzu(); + } + + if (paramsList.length === 0) return; + + const SUB_BATCH_SIZE = 4; + + for (let i = 0; i < paramsList.length; i += SUB_BATCH_SIZE) { + const subBatch = paramsList.slice(i, i + SUB_BATCH_SIZE); + + const stmt = await conn.prepare(cypher); + if (!stmt.isSuccess()) { + const errMsg = await stmt.getErrorMessage(); + throw new Error(`Prepare failed: ${errMsg}`); + } + + try { + for (const params of subBatch) { + await conn.execute(stmt, params); + } + } finally { + await stmt.close(); + } + + if (i + SUB_BATCH_SIZE < paramsList.length) { + await new Promise(r => setTimeout(r, 0)); + } + } +}; + +/** + * Test if array parameters work with prepared statements + */ +export const testArrayParams = async (): Promise<{ success: boolean; error?: string }> => { + if (!conn) { + await initKuzu(); + } + + try { + const testEmbedding = new Array(384).fill(0).map((_, i) => i / 384); + + // Get any node ID to test with (try File first, then others) + let testNodeId: string | null = null; + for (const tableName of NODE_TABLES) { + try { + const nodeResult = await conn.query(`MATCH (n:${tableName}) RETURN n.id AS id LIMIT 1`); + const nodeRow = await nodeResult.getNext(); + if (nodeRow) { + testNodeId = nodeRow.id ?? nodeRow[0]; + break; + } + } catch {} + } + + if (!testNodeId) { + return { success: false, error: 'No nodes found to test with' }; + } + + if (import.meta.env.DEV) { + console.log('🧪 Testing array params with node:', testNodeId); + } + + // First create an embedding entry + const createQuery = `CREATE (e:${EMBEDDING_TABLE_NAME} {nodeId: $nodeId, embedding: $embedding})`; + const stmt = await conn.prepare(createQuery); + + if (!stmt.isSuccess()) { + const errMsg = await stmt.getErrorMessage(); + return { success: false, error: `Prepare failed: ${errMsg}` }; + } + + await conn.execute(stmt, { + nodeId: testNodeId, + embedding: testEmbedding, + }); + + await stmt.close(); + + // Verify it was stored + const verifyResult = await conn.query( + `MATCH (e:${EMBEDDING_TABLE_NAME} {nodeId: '${testNodeId}'}) RETURN e.embedding AS emb` + ); + const verifyRow = await verifyResult.getNext(); + const storedEmb = verifyRow?.emb ?? verifyRow?.[0]; + + if (storedEmb && Array.isArray(storedEmb) && storedEmb.length === 384) { + if (import.meta.env.DEV) { + console.log('✅ Array params WORK! Stored embedding length:', storedEmb.length); + } + return { success: true }; + } else { + return { + success: false, + error: `Embedding not stored correctly. Got: ${typeof storedEmb}, length: ${storedEmb?.length}` + }; + } + } catch (error) { + const errorMsg = error instanceof Error ? error.message : String(error); + if (import.meta.env.DEV) { + console.error('❌ Array params test failed:', errorMsg); + } + return { success: false, error: errorMsg }; + } +}; diff --git a/gitnexus-cli/src/core/kuzu/schema.ts b/gitnexus-web/src/core/kuzu/schema.ts similarity index 100% rename from gitnexus-cli/src/core/kuzu/schema.ts rename to gitnexus-web/src/core/kuzu/schema.ts diff --git a/gitnexus/src/core/llm/agent.ts b/gitnexus-web/src/core/llm/agent.ts similarity index 100% rename from gitnexus/src/core/llm/agent.ts rename to gitnexus-web/src/core/llm/agent.ts diff --git a/gitnexus/src/core/llm/context-builder.ts b/gitnexus-web/src/core/llm/context-builder.ts similarity index 100% rename from gitnexus/src/core/llm/context-builder.ts rename to gitnexus-web/src/core/llm/context-builder.ts diff --git a/gitnexus/src/core/llm/index.ts b/gitnexus-web/src/core/llm/index.ts similarity index 100% rename from gitnexus/src/core/llm/index.ts rename to gitnexus-web/src/core/llm/index.ts diff --git a/gitnexus/src/core/llm/settings-service.ts b/gitnexus-web/src/core/llm/settings-service.ts similarity index 100% rename from gitnexus/src/core/llm/settings-service.ts rename to gitnexus-web/src/core/llm/settings-service.ts diff --git a/gitnexus/src/core/llm/tools.ts b/gitnexus-web/src/core/llm/tools.ts similarity index 100% rename from gitnexus/src/core/llm/tools.ts rename to gitnexus-web/src/core/llm/tools.ts diff --git a/gitnexus/src/core/llm/types.ts b/gitnexus-web/src/core/llm/types.ts similarity index 100% rename from gitnexus/src/core/llm/types.ts rename to gitnexus-web/src/core/llm/types.ts diff --git a/gitnexus/src/core/mcp/mcp-client.ts b/gitnexus-web/src/core/mcp/mcp-client.ts similarity index 100% rename from gitnexus/src/core/mcp/mcp-client.ts rename to gitnexus-web/src/core/mcp/mcp-client.ts diff --git a/gitnexus-cli/src/core/search/bm25-index.ts b/gitnexus-web/src/core/search/bm25-index.ts similarity index 76% rename from gitnexus-cli/src/core/search/bm25-index.ts rename to gitnexus-web/src/core/search/bm25-index.ts index 5a64f3c12..4b745bd72 100644 --- a/gitnexus-cli/src/core/search/bm25-index.ts +++ b/gitnexus-web/src/core/search/bm25-index.ts @@ -6,7 +6,6 @@ */ import MiniSearch from 'minisearch'; -import fs from 'fs/promises'; export interface BM25Document { id: string; // File path @@ -83,8 +82,7 @@ export const buildBM25Index = (fileContents: Map): number => { searchIndex.addAll(documents); indexedDocCount = documents.length; - const isDev = process.env.NODE_ENV !== 'production'; - if (isDev) { + if (import.meta.env.DEV) { console.log(`📚 BM25 index built: ${indexedDocCount} documents`); } @@ -147,46 +145,6 @@ export const clearBM25Index = (): void => { indexedDocCount = 0; }; -/** - * Export the BM25 index to disk - */ -export const exportBM25Index = async (filePath: string): Promise => { - if (!searchIndex) return; - const json = JSON.stringify(searchIndex.toJSON()); - await fs.writeFile(filePath, json, 'utf-8'); -}; - -/** - * Load a BM25 index from disk - */ -export const loadBM25Index = async (filePath: string): Promise => { - try { - const json = await fs.readFile(filePath, 'utf-8'); - const data = JSON.parse(json); - searchIndex = MiniSearch.loadJSON(data, { - fields: ['content', 'name'], - storeFields: ['id'], - tokenize: (text: string) => { - const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); - const expanded: string[] = []; - for (const token of tokens) { - if (token.length === 0) continue; - const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); - expanded.push(...camelParts); - if (camelParts.length > 1) { - expanded.push(token); - } - } - return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); - }, - }); - indexedDocCount = searchIndex.documentCount; - return true; - } catch { - return false; - } -}; - /** * Common stop words to filter out (too common to be useful) */ diff --git a/gitnexus-cli/src/core/search/hybrid-search.ts b/gitnexus-web/src/core/search/hybrid-search.ts similarity index 84% rename from gitnexus-cli/src/core/search/hybrid-search.ts rename to gitnexus-web/src/core/search/hybrid-search.ts index 4af6f3700..247bb2783 100644 --- a/gitnexus-cli/src/core/search/hybrid-search.ts +++ b/gitnexus-web/src/core/search/hybrid-search.ts @@ -8,8 +8,8 @@ * production search systems. */ -import { searchBM25, isBM25Ready, type BM25SearchResult } from './bm25-index.js'; -import type { SemanticSearchResult } from '../embeddings/types.js'; +import { searchBM25, isBM25Ready, type BM25SearchResult } from './bm25-index'; +import type { SemanticSearchResult } from '../embeddings/types'; /** * RRF constant - standard value used in the literature @@ -144,21 +144,6 @@ export const formatHybridResults = (results: HybridSearchResult[]): string => { return `Found ${results.length} results:\n\n${formatted.join('\n\n')}`; }; -/** - * Execute BM25 + semantic search and merge with RRF. - * The semanticSearch function is injected to keep this module environment-agnostic. - */ -export const hybridSearch = async ( - query: string, - limit: number, - executeQuery: (cypher: string) => Promise, - semanticSearch: (executeQuery: (cypher: string) => Promise, query: string, k?: number) => Promise -): Promise => { - const bm25Results = isBM25Ready() ? searchBM25(query, limit) : []; - const semanticResults = await semanticSearch(executeQuery, query, limit); - return mergeWithRRF(bm25Results, semanticResults, limit); -}; - diff --git a/gitnexus/src/core/search/index.ts b/gitnexus-web/src/core/search/index.ts similarity index 100% rename from gitnexus/src/core/search/index.ts rename to gitnexus-web/src/core/search/index.ts diff --git a/gitnexus-web/src/core/tree-sitter/parser-loader.ts b/gitnexus-web/src/core/tree-sitter/parser-loader.ts new file mode 100644 index 000000000..d5224ca4e --- /dev/null +++ b/gitnexus-web/src/core/tree-sitter/parser-loader.ts @@ -0,0 +1,72 @@ +import Parser from 'web-tree-sitter'; +import { SupportedLanguages } from '../../config/supported-languages'; + +let parser: Parser | null = null; + +// Cache the compiled Language objects to avoid fetching/compiling twice +const languageCache = new Map(); + +export const loadParser = async (): Promise => { + if (parser) return parser; + + await Parser.init({ + locateFile: (scriptName: string) => { + return `/wasm/${scriptName}`; + } + }) + + parser = new Parser(); + return parser; +} + +// Get the appropriate WASM file based on language and file extension +const getWasmPath = (language: SupportedLanguages, filePath?: string): string => { + // For TypeScript, check if it's a TSX file + if (language === SupportedLanguages.TypeScript) { + if (filePath?.endsWith('.tsx')) { + return '/wasm/typescript/tree-sitter-tsx.wasm'; + } + return '/wasm/typescript/tree-sitter-typescript.wasm'; + } + + const languageFileMap: Record = { + [SupportedLanguages.JavaScript]: '/wasm/javascript/tree-sitter-javascript.wasm', + [SupportedLanguages.TypeScript]: '/wasm/typescript/tree-sitter-typescript.wasm', + [SupportedLanguages.Python]: '/wasm/python/tree-sitter-python.wasm', + [SupportedLanguages.Java]: '/wasm/java/tree-sitter-java.wasm', + [SupportedLanguages.C]: '/wasm/c/tree-sitter-c.wasm', + [SupportedLanguages.CPlusPlus]: '/wasm/cpp/tree-sitter-cpp.wasm', + [SupportedLanguages.CSharp]: '/wasm/csharp/tree-sitter-csharp.wasm', + [SupportedLanguages.Go]: '/wasm/go/tree-sitter-go.wasm', + [SupportedLanguages.Rust]: '/wasm/rust/tree-sitter-rust.wasm', + }; + + return languageFileMap[language]; +}; + +export const loadLanguage = async (language: SupportedLanguages, filePath?: string): Promise => { + if (!parser) await loadParser(); + const wasmPath = getWasmPath(language, filePath); + + if (languageCache.has(wasmPath)) { + parser!.setLanguage(languageCache.get(wasmPath)!); + return; + } + + if (!wasmPath) { + console.error(`❌ [Parser] No WASM path configured for language: ${language}`); + throw new Error(`Unsupported language: ${language}`); + } + + try { + const loadedLanguage = await Parser.Language.load(wasmPath); + languageCache.set(wasmPath, loadedLanguage); + parser!.setLanguage(loadedLanguage); + } catch (error: unknown) { + const errorMessage = error instanceof Error ? error.message : String(error); + console.error(`❌ [Parser] Failed to load WASM grammar for ${language}`); + console.error(` WASM Path: ${wasmPath}`); + console.error(` Error: ${errorMessage}`); + throw new Error(`Failed to load grammar for ${language}: ${errorMessage}`); + } +} diff --git a/gitnexus/src/hooks/useAppState.tsx b/gitnexus-web/src/hooks/useAppState.tsx similarity index 100% rename from gitnexus/src/hooks/useAppState.tsx rename to gitnexus-web/src/hooks/useAppState.tsx diff --git a/gitnexus/src/hooks/useSettings.ts b/gitnexus-web/src/hooks/useSettings.ts similarity index 100% rename from gitnexus/src/hooks/useSettings.ts rename to gitnexus-web/src/hooks/useSettings.ts diff --git a/gitnexus/src/hooks/useSigma.ts b/gitnexus-web/src/hooks/useSigma.ts similarity index 100% rename from gitnexus/src/hooks/useSigma.ts rename to gitnexus-web/src/hooks/useSigma.ts diff --git a/gitnexus/src/index.css b/gitnexus-web/src/index.css similarity index 100% rename from gitnexus/src/index.css rename to gitnexus-web/src/index.css diff --git a/gitnexus/src/lib/constants.ts b/gitnexus-web/src/lib/constants.ts similarity index 100% rename from gitnexus/src/lib/constants.ts rename to gitnexus-web/src/lib/constants.ts diff --git a/gitnexus/src/lib/graph-adapter.ts b/gitnexus-web/src/lib/graph-adapter.ts similarity index 100% rename from gitnexus/src/lib/graph-adapter.ts rename to gitnexus-web/src/lib/graph-adapter.ts diff --git a/gitnexus/src/lib/mermaid-generator.ts b/gitnexus-web/src/lib/mermaid-generator.ts similarity index 100% rename from gitnexus/src/lib/mermaid-generator.ts rename to gitnexus-web/src/lib/mermaid-generator.ts diff --git a/gitnexus-cli/src/lib/utils.ts b/gitnexus-web/src/lib/utils.ts similarity index 100% rename from gitnexus-cli/src/lib/utils.ts rename to gitnexus-web/src/lib/utils.ts diff --git a/gitnexus/src/main.tsx b/gitnexus-web/src/main.tsx similarity index 100% rename from gitnexus/src/main.tsx rename to gitnexus-web/src/main.tsx diff --git a/gitnexus/src/repomix-output.md b/gitnexus-web/src/repomix-output.md similarity index 100% rename from gitnexus/src/repomix-output.md rename to gitnexus-web/src/repomix-output.md diff --git a/gitnexus/src/services/git-clone.ts b/gitnexus-web/src/services/git-clone.ts similarity index 100% rename from gitnexus/src/services/git-clone.ts rename to gitnexus-web/src/services/git-clone.ts diff --git a/gitnexus/src/services/zip.ts b/gitnexus-web/src/services/zip.ts similarity index 100% rename from gitnexus/src/services/zip.ts rename to gitnexus-web/src/services/zip.ts diff --git a/gitnexus/src/types/kuzu-wasm.d.ts b/gitnexus-web/src/types/kuzu-wasm.d.ts similarity index 100% rename from gitnexus/src/types/kuzu-wasm.d.ts rename to gitnexus-web/src/types/kuzu-wasm.d.ts diff --git a/gitnexus-cli/src/types/pipeline.ts b/gitnexus-web/src/types/pipeline.ts similarity index 96% rename from gitnexus-cli/src/types/pipeline.ts rename to gitnexus-web/src/types/pipeline.ts index c8848d562..123be720b 100644 --- a/gitnexus-cli/src/types/pipeline.ts +++ b/gitnexus-web/src/types/pipeline.ts @@ -1,6 +1,6 @@ -import { GraphNode, GraphRelationship, KnowledgeGraph } from '../core/graph/types.js'; -import { CommunityDetectionResult } from '../core/ingestion/community-processor.js'; -import { ProcessDetectionResult } from '../core/ingestion/process-processor.js'; +import { GraphNode, GraphRelationship, KnowledgeGraph } from '../core/graph/types'; +import { CommunityDetectionResult } from '../core/ingestion/community-processor'; +import { ProcessDetectionResult } from '../core/ingestion/process-processor'; export type PipelinePhase = 'idle' | 'extracting' | 'structure' | 'parsing' | 'imports' | 'calls' | 'heritage' | 'communities' | 'processes' | 'enriching' | 'complete' | 'error'; diff --git a/gitnexus/src/vite-env.d.ts b/gitnexus-web/src/vite-env.d.ts similarity index 100% rename from gitnexus/src/vite-env.d.ts rename to gitnexus-web/src/vite-env.d.ts diff --git a/gitnexus/src/workers/ingestion.worker.ts b/gitnexus-web/src/workers/ingestion.worker.ts similarity index 100% rename from gitnexus/src/workers/ingestion.worker.ts rename to gitnexus-web/src/workers/ingestion.worker.ts diff --git a/gitnexus/tsconfig.app.json b/gitnexus-web/tsconfig.app.json similarity index 100% rename from gitnexus/tsconfig.app.json rename to gitnexus-web/tsconfig.app.json diff --git a/gitnexus-web/tsconfig.json b/gitnexus-web/tsconfig.json new file mode 100644 index 000000000..1ffef600d --- /dev/null +++ b/gitnexus-web/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/gitnexus/tsconfig.node.json b/gitnexus-web/tsconfig.node.json similarity index 100% rename from gitnexus/tsconfig.node.json rename to gitnexus-web/tsconfig.node.json diff --git a/gitnexus/vercel.json b/gitnexus-web/vercel.json similarity index 100% rename from gitnexus/vercel.json rename to gitnexus-web/vercel.json diff --git a/gitnexus/vite.config.ts b/gitnexus-web/vite.config.ts similarity index 100% rename from gitnexus/vite.config.ts rename to gitnexus-web/vite.config.ts diff --git a/gitnexus/package-lock.json b/gitnexus/package-lock.json index cf591cb30..38102fa8a 100644 --- a/gitnexus/package-lock.json +++ b/gitnexus/package-lock.json @@ -1,568 +1,53 @@ { "name": "gitnexus", - "version": "0.0.0", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gitnexus", - "version": "0.0.0", + "version": "0.1.0", + "license": "MIT", "dependencies": { "@huggingface/transformers": "^3.0.0", - "@isomorphic-git/lightning-fs": "^4.6.2", - "@langchain/anthropic": "^1.3.10", - "@langchain/core": "^1.1.15", - "@langchain/google-genai": "^2.1.10", - "@langchain/langgraph": "^1.1.0", - "@langchain/ollama": "^1.2.0", - "@langchain/openai": "^1.2.2", - "@sigma/edge-curve": "^3.1.0", - "@tailwindcss/vite": "^4.1.18", - "axios": "^1.13.2", - "buffer": "^6.0.3", - "comlink": "^4.4.2", - "d3": "^7.9.0", - "graphology": "^0.26.0", - "graphology-communities-louvain": "^2.0.2", - "graphology-layout-force": "^0.2.4", - "graphology-layout-forceatlas2": "^0.10.1", - "graphology-layout-noverlap": "^0.4.2", - "isomorphic-git": "^1.36.1", - "jszip": "^3.10.1", - "kuzu-wasm": "^0.11.1", - "langchain": "^1.2.10", - "lru-cache": "^11.2.4", - "lucide-react": "^0.562.0", - "mermaid": "^11.12.2", + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^12.0.0", + "cors": "^2.8.5", + "express": "^4.19.2", + "glob": "^11.0.0", + "graphology": "^0.25.4", + "graphology-communities-louvain": "^2.0.1", + "kuzu": "^0.11.3", + "lru-cache": "^11.0.0", "minisearch": "^7.2.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^10.1.0", - "react-syntax-highlighter": "^16.1.0", - "react-zoom-pan-pinch": "^3.7.0", - "remark-gfm": "^4.0.1", - "sigma": "^3.0.2", - "tailwindcss": "^4.1.18", + "ora": "^8.0.0", + "tree-sitter": "^0.21.0", + "tree-sitter-c": "^0.21.0", + "tree-sitter-c-sharp": "^0.21.0", + "tree-sitter-cpp": "^0.22.0", + "tree-sitter-go": "^0.21.0", + "tree-sitter-java": "^0.20.0", + "tree-sitter-javascript": "^0.21.0", + "tree-sitter-python": "^0.21.0", + "tree-sitter-rust": "^0.21.0", + "tree-sitter-typescript": "^0.21.0", "uuid": "^13.0.0", - "vite-plugin-top-level-await": "^1.6.0", - "vite-plugin-wasm": "^3.5.0", - "web-tree-sitter": "^0.20.8", - "zod": "^3.25.76" + "ws": "^8.16.0" + }, + "bin": { + "gitnexus": "dist/cli/index.js" }, "devDependencies": { - "@babel/types": "^7.28.5", - "@types/jszip": "^3.4.0", - "@types/node": "^24.10.1", - "@types/react": "^18.3.5", - "@types/react-dom": "^18.3.0", - "@types/react-syntax-highlighter": "^15.5.13", - "@vercel/node": "^5.5.16", - "@vitejs/plugin-react": "^5.1.0", - "tree-sitter-wasms": "^0.1.13", - "typescript": "^5.4.5", - "vite": "^5.2.0", - "vite-plugin-static-copy": "^3.1.4" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", - "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", - "license": "MIT", - "dependencies": { - "package-manager-detector": "^1.3.0", - "tinyexec": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.71.2", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.71.2.tgz", - "integrity": "sha512-TGNDEUuEstk/DKu0/TflXAEt+p+p/WhTlFzEnoosvbaDU2LTjm42igSdlL0VijrKpWejtOKxX0b8A7uc+XiSAQ==", - "license": "MIT", - "dependencies": { - "json-schema-to-ts": "^3.1.1" - }, - "bin": { - "anthropic-ai-sdk": "bin/cli" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - }, - "peerDependenciesMeta": { - "zod": { - "optional": true - } - } - }, - "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/uuid": "^10.0.0", + "@types/ws": "^8.5.10", + "tsx": "^4.0.0", + "typescript": "^5.4.5" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz", - "integrity": "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz", - "integrity": "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz", - "integrity": "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", - "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.6" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz", - "integrity": "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/generator": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.6", - "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", - "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", - "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", - "license": "MIT" - }, - "node_modules/@cfworker/json-schema": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cfworker/json-schema/-/json-schema-4.1.1.tgz", - "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", - "license": "MIT" - }, - "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/@chevrotain/gast/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", - "license": "Apache-2.0" - }, - "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", - "license": "Apache-2.0" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@edge-runtime/format": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@edge-runtime/format/-/format-2.2.1.tgz", - "integrity": "sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/node-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/node-utils/-/node-utils-2.3.0.tgz", - "integrity": "sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/ponyfill": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@edge-runtime/ponyfill/-/ponyfill-2.4.2.tgz", - "integrity": "sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/primitives": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-4.1.0.tgz", - "integrity": "sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=16" - } - }, - "node_modules/@edge-runtime/vm": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-3.2.0.tgz", - "integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@edge-runtime/primitives": "4.1.0" - }, - "engines": { - "node": ">=16" + "node": ">=18.0.0" } }, "node_modules/@emnapi/runtime": { @@ -576,9 +61,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], @@ -593,9 +78,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], @@ -610,9 +95,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], @@ -627,9 +112,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], @@ -644,9 +129,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], @@ -661,9 +146,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], @@ -678,9 +163,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], @@ -695,9 +180,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], @@ -712,9 +197,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], @@ -729,9 +214,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], @@ -746,9 +231,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], @@ -763,9 +248,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], @@ -780,9 +265,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], @@ -797,9 +282,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], @@ -814,9 +299,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], @@ -831,9 +316,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], @@ -848,9 +333,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], @@ -865,9 +350,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], @@ -882,9 +367,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], @@ -899,9 +384,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], @@ -916,9 +401,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -933,9 +418,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], @@ -950,9 +435,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], @@ -967,9 +452,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], @@ -984,9 +469,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], @@ -1001,9 +486,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], @@ -1017,29 +502,22 @@ "node": ">=18" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, + "node_modules/@hono/node-server": { + "version": "1.19.9", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", + "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", "license": "MIT", "engines": { - "node": ">=14" - } - }, - "node_modules/@google/generative-ai": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", - "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" } }, "node_modules/@huggingface/jinja": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.3.tgz", - "integrity": "sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.4.tgz", + "integrity": "sha512-VoQJywjpjy2D88Oj0BTHRuS8JCbUgoOg5t1UGgbtGh2fRia9Dx/k6Wf8FqrEWIvWK9fAkfJeeLB9fcSpCNPCpw==", "license": "MIT", "engines": { "node": ">=18" @@ -1057,23 +535,6 @@ "sharp": "^0.34.1" } }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", - "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", - "license": "MIT", - "dependencies": { - "@antfu/install-pkg": "^1.1.0", - "@iconify/types": "^2.0.0", - "mlly": "^1.8.0" - } - }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", @@ -1543,7 +1004,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, "license": "MIT", "engines": { "node": "20 || >=22" @@ -1553,7 +1013,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, "license": "MIT", "dependencies": { "@isaacs/balanced-match": "^4.0.1" @@ -1562,6 +1021,23 @@ "node": "20 || >=22" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -1574,390 +1050,328 @@ "node": ">=18.0.0" } }, - "node_modules/@isomorphic-git/idb-keyval": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@isomorphic-git/idb-keyval/-/idb-keyval-3.3.2.tgz", - "integrity": "sha512-r8/AdpiS0/WJCNR/t/gsgL+M8NMVj/ek7s60uz3LmpCaTF2mEVlZJlB01ZzalgYzRLXwSPC92o+pdzjM7PN/pA==", - "license": "Apache-2.0" - }, - "node_modules/@isomorphic-git/lightning-fs": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@isomorphic-git/lightning-fs/-/lightning-fs-4.6.2.tgz", - "integrity": "sha512-RS/oa1UBnoUFe56bsjOEgoUUReYKQzYUlQnbERRRNv9s9KmjyWuuylPV+YgsWirR2oONKaipWYMebVQ8SAe55Q==", + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.25.3", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.3.tgz", + "integrity": "sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==", "license": "MIT", "dependencies": { - "@isomorphic-git/idb-keyval": "3.3.2", - "isomorphic-textencoder": "1.0.1", - "just-debounce-it": "1.1.0", - "just-once": "1.1.0" - }, - "bin": { - "superblocktxt": "src/superblocktxt.js" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@langchain/anthropic": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@langchain/anthropic/-/anthropic-1.3.10.tgz", - "integrity": "sha512-VXq5fsEJ4FB5XGrnoG+bfm0I7OlmYLI4jZ6cX9RasyqhGo9wcDyKw1+uEQ1H7Og7jWrTa1bfXCun76wttewJnw==", - "license": "MIT", - "dependencies": { - "@anthropic-ai/sdk": "^0.71.0", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@langchain/core": "1.1.15" - } - }, - "node_modules/@langchain/core": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/@langchain/core/-/core-1.1.15.tgz", - "integrity": "sha512-b8RN5DkWAmDAlMu/UpTZEluYwCLpm63PPWniRKlE8ie3KkkE7IuMQ38pf4kV1iaiI+d99BEQa2vafQHfCujsRA==", - "license": "MIT", - "dependencies": { - "@cfworker/json-schema": "^4.0.2", - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": ">=0.4.0 <1.0.0", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "uuid": "^10.0.0", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@langchain/core/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/google-genai": { - "version": "2.1.10", - "resolved": "https://registry.npmjs.org/@langchain/google-genai/-/google-genai-2.1.10.tgz", - "integrity": "sha512-OpiBr2OUzB9Pg20mjLId+vfxJvYurc8TzbElaM/d6KE7aE8DiKCEOuQn5ZSgHTVzZV2g++lcJXw6iZlso4SORA==", - "license": "MIT", - "dependencies": { - "@google/generative-ai": "^0.24.0", - "uuid": "^11.1.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@langchain/core": "1.1.15" - } - }, - "node_modules/@langchain/google-genai/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/@langchain/langgraph": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@langchain/langgraph/-/langgraph-1.1.0.tgz", - "integrity": "sha512-3n1GL0ZTtr57ZwbYvbi4Th26fwiGogmpFn8OA8UXEpBM2HcpGwcv1+c8YSBJF4XRjlcCzIlXtY+DyrNsvinc6g==", - "license": "MIT", - "dependencies": { - "@langchain/langgraph-checkpoint": "^1.0.0", - "@langchain/langgraph-sdk": "~1.5.4", - "uuid": "^10.0.0" + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.0.1", + "express-rate-limit": "^7.5.0", + "jose": "^6.1.1", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.0" }, "engines": { "node": ">=18" }, "peerDependencies": { - "@langchain/core": "^1.0.1", - "zod": "^3.25.32 || ^4.2.0", - "zod-to-json-schema": "^3.x" + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" }, "peerDependenciesMeta": { - "zod-to-json-schema": { + "@cfworker/json-schema": { "optional": true + }, + "zod": { + "optional": false } } }, - "node_modules/@langchain/langgraph-checkpoint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.0.tgz", - "integrity": "sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==", + "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "uuid": "^10.0.0" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/body-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { "node": ">=18" }, - "peerDependencies": { - "@langchain/core": "^1.0.1" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/langgraph-sdk": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@langchain/langgraph-sdk/-/langgraph-sdk-1.5.4.tgz", - "integrity": "sha512-eSYqG875c2qvcPwdvBwQH0niTZxt6roMGc2dAWBqCbWCUiUL0X4ftYHg2OqOelsrNE3SO6faLr/m0LIPc9hDwg==", - "license": "MIT", - "dependencies": { - "p-queue": "^9.0.1", - "p-retry": "^7.1.1", - "uuid": "^13.0.0" - }, - "peerDependencies": { - "@langchain/core": "^1.0.1", - "react": "^18 || ^19", - "react-dom": "^18 || ^19" - }, - "peerDependenciesMeta": { - "@langchain/core": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.1.0.tgz", - "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^7.0.0" - }, "engines": { - "node": ">=20" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@langchain/langgraph/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/ollama": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@langchain/ollama/-/ollama-1.2.0.tgz", - "integrity": "sha512-OinxIhssKXdDQKnQoBF4TQTMBuMMV5OcNPk4Zze8UjcaSOGngn3CAI1FVbBxl0bTG5ov61w4AoWWsUwOwiSJFw==", - "license": "MIT", - "dependencies": { - "ollama": "^0.6.3", - "uuid": "^10.0.0" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@langchain/core": "^1.0.0" - } - }, - "node_modules/@langchain/ollama/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/openai": { + "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@langchain/openai/-/openai-1.2.2.tgz", - "integrity": "sha512-ByGtj9nJlyL2UPR7BAxtM34g8JA0qEfDKZq7ZisLW23ju+da1ZRAKogoEqoEHHSxl5fAt2LXcydsIYx0qgCDgg==", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", - "dependencies": { - "js-tiktoken": "^1.0.12", - "openai": "^6.10.0", - "zod": "^3.25.76 || ^4" - }, "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@langchain/core": "^1.0.0" + "node": ">=6.6.0" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.3.tgz", - "integrity": "sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@modelcontextprotocol/sdk/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" + "ms": "^2.1.3" }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" }, "engines": { "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "node_modules/@modelcontextprotocol/sdk/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", - "dependencies": { - "langium": "3.3.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "node_modules/@modelcontextprotocol/sdk/node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 8" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/@protobufjs/aspromise": { @@ -2024,1651 +1438,244 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.53", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", - "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/plugin-virtual": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz", - "integrity": "sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.1.tgz", - "integrity": "sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.1.tgz", - "integrity": "sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.1.tgz", - "integrity": "sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.1.tgz", - "integrity": "sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.1.tgz", - "integrity": "sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.1.tgz", - "integrity": "sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.1.tgz", - "integrity": "sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.1.tgz", - "integrity": "sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.1.tgz", - "integrity": "sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.1.tgz", - "integrity": "sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.1.tgz", - "integrity": "sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.1.tgz", - "integrity": "sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.1.tgz", - "integrity": "sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.1.tgz", - "integrity": "sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.1.tgz", - "integrity": "sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.1.tgz", - "integrity": "sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.1.tgz", - "integrity": "sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.1.tgz", - "integrity": "sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.1.tgz", - "integrity": "sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.1.tgz", - "integrity": "sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.1.tgz", - "integrity": "sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.1.tgz", - "integrity": "sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.1.tgz", - "integrity": "sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.1.tgz", - "integrity": "sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.1.tgz", - "integrity": "sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sigma/edge-curve": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sigma/edge-curve/-/edge-curve-3.1.0.tgz", - "integrity": "sha512-OFWkfAXEsm+X8l1K4K49cC0psB0gQ+gqxKA08HG5piNPdzrDZ5gG9Gza6htZ5AirOVwd/4/uq/gPpD5En+H+3Q==", - "license": "MIT", - "peerDependencies": { - "sigma": ">=3.0.0-beta.10" - } - }, - "node_modules/@swc/core": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.8.tgz", - "integrity": "sha512-T8keoJjXaSUoVBCIjgL6wAnhADIb09GOELzKg10CjNg+vLX48P93SME6jTfte9MZIm5m+Il57H3rTSk/0kzDUw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.25" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.15.8", - "@swc/core-darwin-x64": "1.15.8", - "@swc/core-linux-arm-gnueabihf": "1.15.8", - "@swc/core-linux-arm64-gnu": "1.15.8", - "@swc/core-linux-arm64-musl": "1.15.8", - "@swc/core-linux-x64-gnu": "1.15.8", - "@swc/core-linux-x64-musl": "1.15.8", - "@swc/core-win32-arm64-msvc": "1.15.8", - "@swc/core-win32-ia32-msvc": "1.15.8", - "@swc/core-win32-x64-msvc": "1.15.8" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.17" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.8.tgz", - "integrity": "sha512-M9cK5GwyWWRkRGwwCbREuj6r8jKdES/haCZ3Xckgkl8MUQJZA3XB7IXXK1IXRNeLjg6m7cnoMICpXv1v1hlJOg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.8.tgz", - "integrity": "sha512-j47DasuOvXl80sKJHSi2X25l44CMc3VDhlJwA7oewC1nV1VsSzwX+KOwE5tLnfORvVJJyeiXgJORNYg4jeIjYQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.8.tgz", - "integrity": "sha512-siAzDENu2rUbwr9+fayWa26r5A9fol1iORG53HWxQL1J8ym4k7xt9eME0dMPXlYZDytK5r9sW8zEA10F2U3Xwg==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.8.tgz", - "integrity": "sha512-o+1y5u6k2FfPYbTRUPvurwzNt5qd0NTumCTFscCNuBksycloXY16J8L+SMW5QRX59n4Hp9EmFa3vpvNHRVv1+Q==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.8.tgz", - "integrity": "sha512-koiCqL09EwOP1S2RShCI7NbsQuG6r2brTqUYE7pV7kZm9O17wZ0LSz22m6gVibpwEnw8jI3IE1yYsQTVpluALw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.8.tgz", - "integrity": "sha512-4p6lOMU3bC+Vd5ARtKJ/FxpIC5G8v3XLoPEZ5s7mLR8h7411HWC/LmTXDHcrSXRC55zvAVia1eldy6zDLz8iFQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-linux-x64-musl": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.8.tgz", - "integrity": "sha512-z3XBnbrZAL+6xDGAhJoN4lOueIxC/8rGrJ9tg+fEaeqLEuAtHSW2QHDHxDwkxZMjuF/pZ6MUTjHjbp8wLbuRLA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.8.tgz", - "integrity": "sha512-djQPJ9Rh9vP8GTS/Df3hcc6XP6xnG5c8qsngWId/BLA9oX6C7UzCPAn74BG/wGb9a6j4w3RINuoaieJB3t+7iQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.8.tgz", - "integrity": "sha512-/wfAgxORg2VBaUoFdytcVBVCgf1isWZIEXB9MZEUty4wwK93M/PxAkjifOho9RN3WrM3inPLabICRCEgdHpKKQ==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.8.tgz", - "integrity": "sha512-GpMePrh9Sl4d61o4KAHOOv5is5+zt6BEXCOCgs/H0FLGeii7j9bWDE8ExvKFy2GRRZVNR1ugsnzaGWHKM6kuzA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.25", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", - "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@swc/wasm": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@swc/wasm/-/wasm-1.15.8.tgz", - "integrity": "sha512-RG2BxGbbsjtddFCo1ghKH6A/BMXbY1eMBfpysV0lJMCpI4DZOjW1BNBnxvBt7YsYmlJtmy5UXIg9/4ekBTFFaQ==", - "license": "Apache-2.0" - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", - "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "tailwindcss": "4.1.18" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" - } - }, - "node_modules/@ts-morph/common": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.11.1.tgz", - "integrity": "sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.2.7", - "minimatch": "^3.0.4", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" + "@types/node": "*" } }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz", - "integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@types/node": "*" } }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.0.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.8", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.8.tgz", + "integrity": "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/d3": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", - "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", - "license": "MIT" - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "license": "MIT" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", - "license": "MIT", - "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "license": "MIT" - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", - "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", - "license": "MIT" - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "license": "MIT" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", - "license": "MIT", - "dependencies": { - "@types/d3-dsv": "*" - } - }, - "node_modules/@types/d3-force": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", - "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", - "license": "MIT" - }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", - "license": "MIT" - }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "license": "MIT", - "dependencies": { - "@types/geojson": "*" - } - }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", - "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", - "license": "MIT" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" - }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "license": "MIT" - }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", - "license": "MIT" - }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "license": "MIT" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", - "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", - "license": "MIT" - }, - "node_modules/@types/d3-selection": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", - "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", - "license": "MIT" - }, - "node_modules/@types/d3-shape": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", - "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", - "license": "MIT", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "license": "MIT" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, - "node_modules/@types/d3-transition": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", - "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", - "license": "MIT", - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "license": "MIT", - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.16", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", - "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", - "license": "MIT" - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", "dev": true, "license": "MIT" }, - "node_modules/@types/jszip": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.0.tgz", - "integrity": "sha512-GFHqtQQP3R4NNuvZH3hNCYD0NbyBZ42bkN7kO3NDrU/SnvIZWMS8Bp38XCsRKBT5BXvgm0y1zqpZWp/ZkRzBzg==", + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, - "license": "MIT", - "dependencies": { - "jszip": "*" - } - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "license": "MIT" }, "node_modules/@types/node": { - "version": "24.10.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", - "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "version": "20.19.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", + "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", "license": "MIT", "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~6.21.0" } }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.27", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.27.tgz", - "integrity": "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } + "license": "MIT" }, - "node_modules/@types/react-syntax-highlighter": { - "version": "15.5.13", - "resolved": "https://registry.npmjs.org/@types/react-syntax-highlighter/-/react-syntax-highlighter-15.5.13.tgz", - "integrity": "sha512-uLGJ87j6Sz8UaBAooU0T6lWJ0dBmjZgN1PZTrj05TNql2/XpC6+4HhMT5syIdFUUt+FASfCeLLv4kBygNU+8qA==", + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "*" + "@types/node": "*" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, "license": "MIT", - "optional": true + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "license": "MIT" + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } }, "node_modules/@types/uuid": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "license": "ISC" - }, - "node_modules/@vercel/build-utils": { - "version": "13.2.11", - "resolved": "https://registry.npmjs.org/@vercel/build-utils/-/build-utils-13.2.11.tgz", - "integrity": "sha512-jbsg78iS8SLpOkLw378bBLchmzeQ+YtPnztMMuEFBORjY1G4lDxiStMacD3xp5HImCAl1wz4dNV4I8jHKd/3Tg==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@vercel/error-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@vercel/error-utils/-/error-utils-2.0.3.tgz", - "integrity": "sha512-CqC01WZxbLUxoiVdh9B/poPbNpY9U+tO1N9oWHwTl5YAZxcqXmmWJ8KNMFItJCUUWdY3J3xv8LvAuQv2KZ5YdQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@vercel/nft": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-1.1.1.tgz", - "integrity": "sha512-mKMGa7CEUcXU75474kOeqHbtvK1kAcu4wiahhmlUenB5JbTQB8wVlDI8CyHR3rpGo0qlzoRWqcDzI41FUoBJCA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^13.0.0", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@vercel/node": { - "version": "5.5.23", - "resolved": "https://registry.npmjs.org/@vercel/node/-/node-5.5.23.tgz", - "integrity": "sha512-dDJtroLF4D/H9vRMt/x/qI2bKujMOPbk6aIqRKI9WXddngjKziuHxsjcF3zEm5YXGUYDSC2lEVEFrXPbbP+hhw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@edge-runtime/node-utils": "2.3.0", - "@edge-runtime/primitives": "4.1.0", - "@edge-runtime/vm": "3.2.0", - "@types/node": "16.18.11", - "@vercel/build-utils": "13.2.11", - "@vercel/error-utils": "2.0.3", - "@vercel/nft": "1.1.1", - "@vercel/static-config": "3.1.2", - "async-listen": "3.0.0", - "cjs-module-lexer": "1.2.3", - "edge-runtime": "2.5.9", - "es-module-lexer": "1.4.1", - "esbuild": "0.27.0", - "etag": "1.8.1", - "mime-types": "2.1.35", - "node-fetch": "2.6.9", - "path-to-regexp": "6.1.0", - "path-to-regexp-updated": "npm:path-to-regexp@6.3.0", - "ts-morph": "12.0.0", - "ts-node": "10.9.1", - "typescript": "4.9.5", - "typescript5": "npm:typescript@5.9.3", - "undici": "5.28.4" - } - }, - "node_modules/@vercel/node/node_modules/@types/node": { - "version": "16.18.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", - "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==", "dev": true, "license": "MIT" }, - "node_modules/@vercel/node/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@vercel/static-config": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@vercel/static-config/-/static-config-3.1.2.tgz", - "integrity": "sha512-2d+TXr6K30w86a+WbMbGm2W91O0UzO5VeemZYBBUJbCjk/5FLLGIi8aV6RS2+WmaRvtcqNTn2pUA7nCOK3bGcQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "ajv": "8.6.3", - "json-schema-to-ts": "1.6.4", - "ts-morph": "12.0.0" - } - }, - "node_modules/@vercel/static-config/node_modules/json-schema-to-ts": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-1.6.4.tgz", - "integrity": "sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.6", - "ts-toolbelt": "^6.15.5" + "@types/node": "*" } }, - "node_modules/@vitejs/plugin-react": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.2.tgz", - "integrity": "sha512-EcA07pHJouywpzsoTUqNh5NwGayl2PPVEJKUSinGGSxFGYn+shYbqMGBg6FXDqgXum9Ou/ecb+411ssw8HImJQ==", - "dev": true, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "license": "MIT", "dependencies": { - "@babel/core": "^7.28.5", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.53", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "license": "MIT", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" + "node": ">= 0.6" } }, "node_modules/ajv": { - "version": "8.6.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", - "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", - "dev": true, + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, + "node_modules/aproba": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", + "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", + "license": "ISC" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">= 8" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-listen": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.0.tgz", - "integrity": "sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/async-lock": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz", - "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==", - "license": "MIT" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==", - "dev": true, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, "node_modules/asynckit": { @@ -3677,25 +1684,10 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", + "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -3703,74 +1695,43 @@ "proxy-from-env": "^1.1.0" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.9.15", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.15.tgz", - "integrity": "sha512-kX8h7K2srmDyYnXRIppo4AH/wYgzWVCs+eKr3RusRSQ5PvRYoEFmR/I0PbdTjKFAoKqp5+kbxnNTFO9jOfSVJg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "license": "MIT", "dependencies": { - "file-uri-to-path": "1.0.0" + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/boolean": { @@ -3780,104 +1741,13 @@ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "license": "MIT" }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz", - "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.9.0", - "caniuse-lite": "^1.0.30001759", - "electron-to-chromium": "^1.5.263", - "node-releases": "^2.0.27", - "update-browserslist-db": "^1.2.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, "node_modules/call-bind-apply-helpers": { @@ -3909,75 +1779,78 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001764", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001764.tgz", - "integrity": "sha512-9JGuzl2M+vPL+pz70gtMF9sHdMFbY9FJaQBi186cHKH3pSzDvzoUJUPV6fqiKIMyXbud9ZLg4F3Yza1vJ1+93g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chalk/node_modules/ansi-styles": { + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", @@ -3992,130 +1865,102 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", - "license": "Apache-2.0", - "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" - } - }, - "node_modules/chevrotain-allstar": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", - "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", - "license": "MIT", - "dependencies": { - "lodash-es": "^4.17.21" - }, - "peerDependencies": { - "chevrotain": "^11.0.0" - } - }, - "node_modules/chevrotain/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8.10.0" + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cmake-js": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", + "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", + "license": "MIT", + "dependencies": { + "axios": "^1.6.5", + "debug": "^4", + "fs-extra": "^11.2.0", + "memory-stream": "^1.0.0", + "node-api-headers": "^1.1.0", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.5.4", + "tar": "^6.2.0", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "cmake-js": "bin/cmake-js" }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", "engines": { - "node": ">=18" + "node": ">= 14.15.0" } }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true, - "license": "MIT" + "node_modules/cmake-js/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } }, - "node_modules/clean-git-ref": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/clean-git-ref/-/clean-git-ref-2.0.1.tgz", - "integrity": "sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==", - "license": "Apache-2.0" - }, - "node_modules/code-block-writer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-10.1.1.tgz", - "integrity": "sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==", - "dev": true, + "node_modules/cmake-js/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/color-convert": { @@ -4136,6 +1981,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -4148,677 +2002,104 @@ "node": ">= 0.8" } }, - "node_modules/comlink": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", - "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", - "license": "Apache-2.0" - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">=18" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/console-table-printer": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/console-table-printer/-/console-table-printer-2.15.0.tgz", - "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==", - "license": "MIT", - "dependencies": { - "simple-wcswidth": "^1.1.2" - } - }, - "node_modules/convert-hrtime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz", - "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "license": "MIT", - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" - }, - "node_modules/cytoscape": { - "version": "3.33.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", - "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "license": "MIT", - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "license": "MIT", - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "license": "MIT" - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "license": "ISC", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", - "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-sankey": { - "version": "0.12.3", - "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", - "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1 - 2", - "d3-shape": "^1.2.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", - "license": "BSD-3-Clause", - "dependencies": { - "internmap": "^1.0.0" - } - }, - "node_modules/d3-sankey/node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" - }, - "node_modules/d3-sankey/node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-sankey/node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "license": "ISC" }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", - "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "license": "MIT", "dependencies": { - "d3": "^7.9.0", - "lodash-es": "^4.17.21" + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "ms": "2.0.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", - "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==", - "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0.0" } }, "node_modules/define-data-property": { @@ -4855,15 +2136,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "license": "ISC", - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4873,13 +2145,29 @@ "node": ">=0.4.0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-libc": { @@ -4897,44 +2185,6 @@ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", "license": "MIT" }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff3": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/diff3/-/diff3-0.0.3.tgz", - "integrity": "sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==", - "license": "MIT" - }, - "node_modules/dompurify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.1.tgz", - "integrity": "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4949,65 +2199,31 @@ "node": ">= 0.4" } }, - "node_modules/edge-runtime": { - "version": "2.5.9", - "resolved": "https://registry.npmjs.org/edge-runtime/-/edge-runtime-2.5.9.tgz", - "integrity": "sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@edge-runtime/format": "2.2.1", - "@edge-runtime/ponyfill": "2.4.2", - "@edge-runtime/vm": "3.2.0", - "async-listen": "3.0.1", - "mri": "1.2.0", - "picocolors": "1.0.0", - "pretty-ms": "7.0.1", - "signal-exit": "4.0.2", - "time-span": "4.0.0" - }, - "bin": { - "edge-runtime": "dist/cli/index.js" - }, - "engines": { - "node": ">=16" - } + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" }, - "node_modules/edge-runtime/node_modules/async-listen": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/async-listen/-/async-listen-3.0.1.tgz", - "integrity": "sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==", - "dev": true, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", "engines": { - "node": ">= 14" - } - }, - "node_modules/edge-runtime/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.267", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.267.tgz", - "integrity": "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==", - "dev": true, - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" } }, "node_modules/es-define-property": { @@ -5028,13 +2244,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true, - "license": "MIT" - }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -5069,9 +2278,9 @@ "license": "MIT" }, "node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5082,44 +2291,49 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -5132,57 +2346,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -5192,101 +2364,126 @@ "node": ">=0.8.x" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "license": "MIT" + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", + "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", + "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-text-encoding": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.6.tgz", - "integrity": "sha512-VhXlQgj9ioXCqGstD37E/HBeqEGV/qOD/kmbVG8h5xKBYvM1L3lR1Zn4555cQ8GkYbJa8aJSipLPndE1k6zK2w==", - "license": "Apache-2.0" - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fault": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", - "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", - "license": "MIT", - "dependencies": { - "format": "^0.2.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" } - } + ], + "license": "BSD-3-Clause" }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, "node_modules/flatbuffers": { @@ -5315,19 +2512,20 @@ } } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "license": "ISC", "dependencies": { - "is-callable": "^1.2.7" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/form-data": { @@ -5346,18 +2544,67 @@ "node": ">= 6" } }, - "node_modules/format": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", - "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { - "node": ">=0.4.x" + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", + "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -5377,14 +2624,92 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-intrinsic": { @@ -5424,17 +2749,35 @@ "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz", - "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==", + "node_modules/get-tsconfig": { + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.1.tgz", + "integrity": "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w==", "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-11.1.0.tgz", + "integrity": "sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==", "license": "BlueOak-1.0.0", "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", "minimatch": "^10.1.1", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^2.0.0" }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, "engines": { "node": "20 || >=22" }, @@ -5442,19 +2785,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -5507,12 +2837,13 @@ "license": "ISC" }, "node_modules/graphology": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.26.0.tgz", - "integrity": "sha512-8SSImzgUUYC89Z042s+0r/vMibY7GX/Emz4LDO5e7jYXhuoWfHISPFJYjpRLUSJGq6UQ6xlenvX1p/hJdfXuXg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/graphology/-/graphology-0.25.4.tgz", + "integrity": "sha512-33g0Ol9nkWdD6ulw687viS8YJQBxqG5LWII6FI6nul0pq6iM2t5EKquOTFDbyTblRB3O9I+7KX4xI8u5ffekAQ==", "license": "MIT", "dependencies": { - "events": "^3.3.0" + "events": "^3.3.0", + "obliterator": "^2.0.2" }, "peerDependencies": { "graphology-types": ">=0.24.0" @@ -5546,42 +2877,6 @@ "graphology-types": ">=0.20.0" } }, - "node_modules/graphology-layout-force": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/graphology-layout-force/-/graphology-layout-force-0.2.4.tgz", - "integrity": "sha512-NYZz0YAnDkn5pkm30cvB0IScFoWGtbzJMrqaiH070dYlYJiag12Oc89dbVfaMaVR/w8DMIKxn/ix9Bqj+Umm9Q==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.4.2" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, - "node_modules/graphology-layout-forceatlas2": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/graphology-layout-forceatlas2/-/graphology-layout-forceatlas2-0.10.1.tgz", - "integrity": "sha512-ogzBeF1FvWzjkikrIFwxhlZXvD2+wlY54lqhsrWprcdPjopM2J9HoMweUmIgwaTvY4bUYVimpSsOdvDv1gPRFQ==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.1.0" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, - "node_modules/graphology-layout-noverlap": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/graphology-layout-noverlap/-/graphology-layout-noverlap-0.4.2.tgz", - "integrity": "sha512-13WwZSx96zim6l1dfZONcqLh3oqyRcjIBsqz2c2iJ3ohgs3605IDWjldH41Gnhh462xGB1j6VGmuGhZ2FKISXA==", - "license": "MIT", - "dependencies": { - "graphology-utils": "^2.3.0" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, "node_modules/graphology-types": { "version": "0.24.8", "resolved": "https://registry.npmjs.org/graphology-types/-/graphology-types-0.24.8.tgz", @@ -5604,21 +2899,6 @@ "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", "license": "ISC" }, - "node_modules/hachure-fill": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", - "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", - "license": "MIT" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -5658,6 +2938,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "license": "ISC" + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -5670,313 +2956,82 @@ "node": ">= 0.4" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "node_modules/hono": { + "version": "4.11.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.7.tgz", + "integrity": "sha512-l7qMiNee7t82bH3SeyUCt9UF15EVmaBvsppY2zQtrbIhl/yzBTny+YUxsVjSjQ6gaqaeVtZmGocom8TzBlA4Yw==", "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "license": "BSD-3-Clause", + "peer": true, "engines": { - "node": "*" + "node": ">=16.9.0" } }, - "node_modules/highlightjs-vue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz", - "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", - "license": "CC0-1.0" - }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">= 14" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", - "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", - "license": "MIT" + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.10" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-network-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.0.tgz", - "integrity": "sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-observable": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-2.1.0.tgz", - "integrity": "sha512-DailKdLb0WU+xX8K5w7VsJhapwHLZ9jjmazqCJq4X12CTgqq73TKnbRcnSLuXYPOoLQgV5IrD7ePiX/h1vnkBw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "license": "MIT", "engines": { "node": ">=12" @@ -5985,715 +3040,139 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isomorphic-git": { - "version": "1.36.1", - "resolved": "https://registry.npmjs.org/isomorphic-git/-/isomorphic-git-1.36.1.tgz", - "integrity": "sha512-fC8SRT8MwoaXDK8G4z5biPEbqf2WyEJUb2MJ2ftSd39/UIlsnoZxLGux+lae0poLZO4AEcx6aUVOh5bV+P8zFA==", - "license": "MIT", - "dependencies": { - "async-lock": "^1.4.1", - "clean-git-ref": "^2.0.1", - "crc-32": "^1.2.0", - "diff3": "0.0.3", - "ignore": "^5.1.4", - "minimisted": "^2.0.0", - "pako": "^1.0.10", - "pify": "^4.0.1", - "readable-stream": "^4.0.0", - "sha.js": "^2.4.12", - "simple-get": "^4.0.1" - }, - "bin": { - "isogit": "cli.cjs" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/isomorphic-textencoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/isomorphic-textencoder/-/isomorphic-textencoder-1.0.1.tgz", - "integrity": "sha512-676hESgHullDdHDsj469hr+7t3i/neBKU9J7q1T4RHaWwLAsaQnywC0D1dIUId0YZ+JtVrShzuBk1soo0+GVcQ==", - "license": "MIT", - "dependencies": { - "fast-text-encoding": "^1.0.0" - } - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tiktoken": { - "version": "1.0.21", - "resolved": "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.21.tgz", - "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.5.1" - } - }, - "node_modules/js-tokens": { + "node_modules/is-promise": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/json-schema-to-ts": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/json-schema-to-ts/-/json-schema-to-ts-3.1.1.tgz", - "integrity": "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==", - "license": "MIT", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "license": "BlueOak-1.0.0", "dependencies": { - "@babel/runtime": "^7.18.3", - "ts-algebra": "^2.0.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=16" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jose": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", + "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" } }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, "license": "MIT" }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "license": "BSD-2-Clause" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "license": "ISC" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/jszip/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, - "node_modules/jszip/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/just-debounce-it": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-debounce-it/-/just-debounce-it-1.1.0.tgz", - "integrity": "sha512-87Nnc0qZKgBZuhFZjYVjSraic0x7zwjhaTMrCKlj0QYKH6lh0KbFzVnfu6LHan03NO7J8ygjeBeD0epejn5Zcg==", - "license": "MIT" - }, - "node_modules/just-once": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-once/-/just-once-1.1.0.tgz", - "integrity": "sha512-+rZVpl+6VyTilK7vB/svlMPil4pxqIJZkbnN7DKZTOzyXfun6ZiFeq2Pk4EtCEHZ0VU4EkdFzG8ZK5F3PErcDw==", - "license": "MIT" - }, - "node_modules/katex": { - "version": "0.16.27", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", - "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" - }, - "node_modules/kuzu-wasm": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/kuzu-wasm/-/kuzu-wasm-0.11.3.tgz", - "integrity": "sha512-+bLOqXgYZJJ2dHJG1y9LTLyb9ZB73eLxErRZahZz2rPokfIdyLaktTJFzJH7wX39hgyukKn8QxeRNobH6gl27g==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT", - "dependencies": { - "threads": "^1.7.0", - "tiny-worker": "^2.3.0", - "uuid": "^11.0.3" - } - }, - "node_modules/kuzu-wasm/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/langchain": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/langchain/-/langchain-1.2.10.tgz", - "integrity": "sha512-9uVxOJE/RTECvNutQfOLwH7f6R9mcq0G/IMHwA2eptDA86R/Yz2zWMz4vARVFPxPrdSJ9nJFDPAqRQlRFwdHBw==", - "license": "MIT", - "dependencies": { - "@langchain/langgraph": "^1.0.0", - "@langchain/langgraph-checkpoint": "^1.0.0", - "langsmith": ">=0.4.0 <1.0.0", - "uuid": "^10.0.0", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=20" - }, - "peerDependencies": { - "@langchain/core": "1.1.15" - } - }, - "node_modules/langchain/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", - "license": "MIT", - "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", - "vscode-languageserver": "~9.0.1", - "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/langsmith": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/langsmith/-/langsmith-0.4.7.tgz", - "integrity": "sha512-Esv5g/J8wwRwbGQr10PB9+bLsNk0mWbrXc7nnEreQDhh0azbU57I7epSnT7GC4sS4EOWavhbxk+6p8PTXtreHw==", - "license": "MIT", - "dependencies": { - "@types/uuid": "^10.0.0", - "chalk": "^4.1.2", - "console-table-printer": "^2.12.1", - "p-queue": "^6.6.2", - "semver": "^7.6.3", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "*", - "@opentelemetry/exporter-trace-otlp-proto": "*", - "@opentelemetry/sdk-trace-base": "*", - "openai": "*" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@opentelemetry/exporter-trace-otlp-proto": { - "optional": true - }, - "@opentelemetry/sdk-trace-base": { - "optional": true - }, - "openai": { - "optional": true - } - } - }, - "node_modules/langsmith/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "license": "MIT" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "universalify": "^2.0.0" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "graceful-fs": "^4.1.6" } }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], + "node_modules/kuzu": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/kuzu/-/kuzu-0.11.3.tgz", + "integrity": "sha512-4+hD3Y+YMV3e0uiqTv1/GUal47D04l8qluw1WFWg8Nx3k7rLsHG1Pmq9WHIOlf1742svxQvTYQiuY6oS1qxAZA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "cmake-js": "^7.3.0", + "node-addon-api": "^6.0.0" + } + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, "engines": { - "node": ">= 12.0.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "license": "MIT", "engines": { - "node": ">= 12.0.0" + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", - "license": "MIT" - }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lowlight": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", - "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", - "license": "MIT", - "dependencies": { - "fault": "^1.0.0", - "highlight.js": "~10.7.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/lru-cache": { - "version": "11.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz", - "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==", + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, - "node_modules/lucide-react": { - "version": "0.562.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.562.0.tgz", - "integrity": "sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/marked": { - "version": "16.4.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", - "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 20" - } - }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -6715,927 +3194,52 @@ "node": ">= 0.4" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "license": "MIT", "engines": { - "node": ">=12" - }, + "node": ">= 0.6" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", - "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", - "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "license": "MIT", "engines": { - "node": ">= 8" + "node": ">= 0.6" } }, - "node_modules/mermaid": { - "version": "11.12.2", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.2.tgz", - "integrity": "sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==", - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^7.1.1", - "@iconify/utils": "^3.0.1", - "@mermaid-js/parser": "^0.6.3", - "@types/d3": "^7.4.3", - "cytoscape": "^3.29.3", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.2.0", - "d3": "^7.9.0", - "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.13", - "dayjs": "^1.11.18", - "dompurify": "^3.2.5", - "katex": "^0.16.22", - "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.2.1", - "roughjs": "^4.6.6", - "stylis": "^4.3.6", - "ts-dedent": "^2.2.0", - "uuid": "^11.1.0" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "mime": "cli.js" }, "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "node": ">=4" } }, "node_modules/mime-db": { @@ -7659,13 +3263,13 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7675,7 +3279,6 @@ "version": "10.1.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz", "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/brace-expansion": "^5.0.0" @@ -7696,15 +3299,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minimisted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minimisted/-/minimisted-2.0.1.tgz", - "integrity": "sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -7721,22 +3315,34 @@ "license": "MIT" }, "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "license": "MIT", "dependencies": { - "minipass": "^7.1.2" + "minipass": "^3.0.0", + "yallist": "^4.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -7745,18 +3351,6 @@ "node": ">=10" } }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, "node_modules/mnemonist": { "version": "0.39.8", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.39.8.tgz", @@ -7766,75 +3360,43 @@ "obliterator": "^2.0.1" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "node_modules/nan": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.25.0.tgz", + "integrity": "sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "license": "MIT", - "bin": { - "mustache": "bin/mustache" + "engines": { + "node": ">= 0.6" } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } + "node_modules/node-api-headers": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz", + "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==", + "license": "MIT" }, "node_modules/node-gyp-build": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "dev": true, "license": "MIT", "bin": { "node-gyp-build": "bin.js", @@ -7842,39 +3404,43 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dev": true, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "license": "ISC", "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -7890,19 +3456,16 @@ "integrity": "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw==", "license": "MIT" }, - "node_modules/observable-fns": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/observable-fns/-/observable-fns-0.6.1.tgz", - "integrity": "sha512-9gRK4+sRWzeN6AOewNBTLXir7Zl/i3GB6Yl26gK4flxz8BXVpD3kt8amREmWNb0mxYOGDotvE5a4N+PtGGKdkg==", - "license": "MIT" - }, - "node_modules/ollama": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/ollama/-/ollama-0.6.3.tgz", - "integrity": "sha512-KEWEhIqE5wtfzEIZbDCLH51VFZ6Z3ZSa6sIOg/E/tBV8S51flyqBOXi+bRxlOYKDf8i327zG9eSTb8IJxvm3Zg==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { - "whatwg-fetch": "^3.6.20" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/once": { @@ -7914,6 +3477,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/onnxruntime-common": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", @@ -7937,6 +3515,52 @@ "tar": "^7.0.1" } }, + "node_modules/onnxruntime-node/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/onnxruntime-node/node_modules/tar": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/onnxruntime-node/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/onnxruntime-web": { "version": "1.22.0-dev.20250409-89f8206ba4", "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", @@ -7957,42 +3581,22 @@ "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", "license": "MIT" }, - "node_modules/openai": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/openai/-/openai-6.16.0.tgz", - "integrity": "sha512-fZ1uBqjFUjXzbGc35fFtYKEOxd20kd9fDpFeqWtsOZWiubY8CZ1NAlXHW3iathaFvqmNtCWMIsosCuyeI7Joxg==", - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-map": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", - "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", - "dev": true, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, "engines": { "node": ">=18" }, @@ -8000,60 +3604,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-7.1.1.tgz", - "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", - "license": "MIT", - "dependencies": { - "is-network-error": "^1.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-manager-detector": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", - "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", "license": "MIT" }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "license": "BlueOak-1.0.0" }, "node_modules/pandemonium": { "version": "2.4.1", @@ -8064,59 +3642,28 @@ "mnemonist": "^0.39.2" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "license": "MIT" - }, - "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", - "dev": true, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-data-parser": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", - "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", - "license": "MIT" + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, "node_modules/path-scurry": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz", "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==", - "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^11.0.0", @@ -8130,63 +3677,18 @@ } }, "node_modules/path-to-regexp": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.1.0.tgz", - "integrity": "sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==", - "dev": true, + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, - "node_modules/path-to-regexp-updated": { - "name": "path-to-regexp", - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "node": ">=16.20.0" } }, "node_modules/platform": { @@ -8195,109 +3697,6 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "license": "MIT" }, - "node_modules/points-on-curve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", - "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", - "license": "MIT" - }, - "node_modules/points-on-path": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", - "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", - "license": "MIT", - "dependencies": { - "path-data-parser": "0.1.0", - "points-on-curve": "0.2.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-ms": "^2.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prismjs": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", - "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/protobufjs": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", @@ -8322,292 +3721,151 @@ "node": ">=12.0.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", + "node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=6" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" + "url": "https://opencollective.com/express" } }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-syntax-highlighter": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.0.tgz", - "integrity": "sha512-E40/hBiP5rCNwkeBN1vRP+xow1X0pndinO+z3h7HLsHyjztbyjfzNWNKuAsJj+7DLam9iT4AaaOZnueCU+Nplg==", - "license": "MIT", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "dependencies": { - "@babel/runtime": "^7.28.4", - "highlight.js": "^10.4.1", - "highlightjs-vue": "^1.0.0", - "lowlight": "^1.17.0", - "prismjs": "^1.30.0", - "refractor": "^5.0.0" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, - "engines": { - "node": ">= 16.20.2" - }, - "peerDependencies": { - "react": ">= 0.14.0" - } - }, - "node_modules/react-zoom-pan-pinch": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.7.0.tgz", - "integrity": "sha512-UmReVZ0TxlKzxSbYiAj+LeGRW8s8LraAFTXRAxzMYnNRgGPsxCudwZKVkjvGmjtx7SW/hZamt69NUmGf4xrkXA==", - "license": "MIT", - "engines": { - "node": ">=8", - "npm": ">=5" - }, - "peerDependencies": { - "react": "*", - "react-dom": "*" + "bin": { + "rc": "cli.js" } }, "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "license": "MIT", "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/refractor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", - "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/prismjs": "^1.0.0", - "hastscript": "^9.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/roarr": { @@ -8627,97 +3885,54 @@ "node": ">=8.0" } }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "license": "Unlicense" - }, - "node_modules/rollup": { - "version": "4.55.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.55.1.tgz", - "integrity": "sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": ">= 18" + } + }, + "node_modules/router/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.55.1", - "@rollup/rollup-android-arm64": "4.55.1", - "@rollup/rollup-darwin-arm64": "4.55.1", - "@rollup/rollup-darwin-x64": "4.55.1", - "@rollup/rollup-freebsd-arm64": "4.55.1", - "@rollup/rollup-freebsd-x64": "4.55.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.55.1", - "@rollup/rollup-linux-arm-musleabihf": "4.55.1", - "@rollup/rollup-linux-arm64-gnu": "4.55.1", - "@rollup/rollup-linux-arm64-musl": "4.55.1", - "@rollup/rollup-linux-loong64-gnu": "4.55.1", - "@rollup/rollup-linux-loong64-musl": "4.55.1", - "@rollup/rollup-linux-ppc64-gnu": "4.55.1", - "@rollup/rollup-linux-ppc64-musl": "4.55.1", - "@rollup/rollup-linux-riscv64-gnu": "4.55.1", - "@rollup/rollup-linux-riscv64-musl": "4.55.1", - "@rollup/rollup-linux-s390x-gnu": "4.55.1", - "@rollup/rollup-linux-x64-gnu": "4.55.1", - "@rollup/rollup-linux-x64-musl": "4.55.1", - "@rollup/rollup-openbsd-x64": "4.55.1", - "@rollup/rollup-openharmony-arm64": "4.55.1", - "@rollup/rollup-win32-arm64-msvc": "4.55.1", - "@rollup/rollup-win32-ia32-msvc": "4.55.1", - "@rollup/rollup-win32-x64-gnu": "4.55.1", - "@rollup/rollup-win32-x64-msvc": "4.55.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", - "license": "MIT", - "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" + "node_modules/router/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/router/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -8745,15 +3960,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", @@ -8772,6 +3978,36 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "license": "MIT" }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, "node_modules/serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -8787,48 +4023,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/sharp": { "version": "0.34.5", @@ -8874,21 +4094,103 @@ "@img/sharp-win32-x64": "0.34.5" } }, - "node_modules/sigma": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/sigma/-/sigma-3.0.2.tgz", - "integrity": "sha512-/BUbeOwPGruiBOm0YQQ6ZMcLIZ6tf/W+Jcm7dxZyAX0tK3WP9/sq7/NAWBxPIxVahdGjCJoGwej0Gdrv0DxlQQ==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "license": "MIT", "dependencies": { - "events": "^3.3.0", - "graphology-utils": "^2.5.2" + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz", - "integrity": "sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "license": "ISC", "engines": { "node": ">=14" @@ -8897,82 +4199,33 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", - "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-wcswidth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", - "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", - "license": "MIT" - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", "license": "BSD-3-Clause" }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -8982,300 +4235,394 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "license": "MIT", "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/style-to-js": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", - "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.14" - } - }, - "node_modules/style-to-object": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", - "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tar": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.3.tgz", - "integrity": "sha512-ENg5JUHUm2rDD7IvKNFGzyElLXNjachNLp6RaGf4+JOgxXHkqA+gq81ZAMCUmtMtqBsoU62lcp6S27g1LCYGGQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/threads": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/threads/-/threads-1.7.0.tgz", - "integrity": "sha512-Mx5NBSHX3sQYR6iI9VYbgHKBLisyB+xROCBGjjWm1O9wb9vfLxdaGtmT/KCjUqMsSNW6nERzCW3T6H43LqjDZQ==", - "license": "MIT", - "dependencies": { - "callsites": "^3.1.0", - "debug": "^4.2.0", - "is-observable": "^2.1.0", - "observable-fns": "^0.6.1" - }, - "funding": { - "url": "https://github.com/andywer/threads.js?sponsor=1" - }, - "optionalDependencies": { - "tiny-worker": ">= 2" - } - }, - "node_modules/time-span": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-4.0.0.tgz", - "integrity": "sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-hrtime": "^3.0.0" - }, - "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/tiny-worker": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tiny-worker/-/tiny-worker-2.3.0.tgz", - "integrity": "sha512-pJ70wq5EAqTAEl9IkGzA+fN0836rycEuz2Cn6yeZ6FRzlVS5IDOkFHpIoEsksPRQV34GDqXm65+OlnZqUSyK2g==", - "license": "BSD-3-Clause", - "dependencies": { - "esm": "^3.2.25" - } - }, - "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=8" } }, - "node_modules/to-buffer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", - "integrity": "sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-regex-range": { + "node_modules/string-width-cjs/node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tree-sitter-wasms": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/tree-sitter-wasms/-/tree-sitter-wasms-0.1.13.tgz", - "integrity": "sha512-wT+cR6DwaIz80/vho3AvSF0N4txuNx/5bcRKoXouOfClpxh/qqrF4URNLQXbbt8MaAxeksZcZd1j8gcGjc+QxQ==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "tree-sitter-wasms": "^0.1.11" - } - }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/ts-algebra": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "license": "MIT" - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "license": "MIT", "engines": { - "node": ">=6.10" + "node": ">=8" } }, - "node_modules/ts-morph": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-12.0.0.tgz", - "integrity": "sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ts-morph/common": "~0.11.0", - "code-block-writer": "^10.1.1" - } + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "ansi-regex": "^5.0.1" }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-sitter": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", + "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.0" + } + }, + "node_modules/tree-sitter-c": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/tree-sitter-c/-/tree-sitter-c-0.21.4.tgz", + "integrity": "sha512-IahxFIhXiY15SUlrt2upBiKSBGdOaE1fjKLK1Ik5zxqGHf6T1rvr3IJrovbsE5sXhypx7Hnmf50gshsppaIihA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "tree-sitter": "^0.21.0" }, "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { + "tree_sitter": { "optional": true } } }, - "node_modules/ts-toolbelt": { - "version": "6.15.5", - "resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-6.15.5.tgz", - "integrity": "sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==", - "dev": true, - "license": "Apache-2.0" + "node_modules/tree-sitter-c-sharp": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/tree-sitter-c-sharp/-/tree-sitter-c-sharp-0.21.3.tgz", + "integrity": "sha512-TVsl5EhmqetO/mhzDPVnMK6TPFnpNMKP0OTNuAQIprshk5Hx672ODRxoIoG5WqvUUlsnBu8J0zmn35hmJqelsA==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-c-sharp/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-c/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-cpp": { + "version": "0.22.3", + "resolved": "https://registry.npmjs.org/tree-sitter-cpp/-/tree-sitter-cpp-0.22.3.tgz", + "integrity": "sha512-p7w5903L/koqTQFVDwyyX0vjioxoZu2G4zT2ZHVG8DvLQbWN6OjNAqfMsCi+WdVkfMgU+7j06hS8i3j6Q0sPNQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-cpp/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-go": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/tree-sitter-go/-/tree-sitter-go-0.21.2.tgz", + "integrity": "sha512-aMFwjsB948nWhURiIxExK8QX29JYKs96P/IfXVvluVMRJZpL04SREHsdOZHYqJr1whkb7zr3/gWHqqvlkczmvw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.1.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-go/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-java": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.20.2.tgz", + "integrity": "sha512-jc6RCnM+JE2ns1AkpErOp2Dp1jOADPbljsrWup0Vj2qTmG8KGYMSTD7HcrVRyZUC6pRLFySPMOh8x7Dn12aynw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "nan": "^2.14.1" + } + }, + "node_modules/tree-sitter-javascript": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/tree-sitter-javascript/-/tree-sitter-javascript-0.21.4.tgz", + "integrity": "sha512-Lrk8yahebwrwc1sWJE9xPcz1OnnqiEV7Dh5fbN6EN3wNAdu9r06HpTqLqDwUUbnG4EB46Sfk+FJFAOldfoKLOw==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-javascript/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter-python": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/tree-sitter-python/-/tree-sitter-python-0.21.0.tgz", + "integrity": "sha512-IUKx7JcTVbByUx1iHGFS/QsIjx7pqwTMHL9bl/NGyhyyydbfNrpruo2C7W6V4KZrbkkCOlX8QVrCoGOFW5qecg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.1.0", + "node-gyp-build": "^4.8.0" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-python/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/tree-sitter-rust": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/tree-sitter-rust/-/tree-sitter-rust-0.21.0.tgz", + "integrity": "sha512-unVr73YLn3VC4Qa/GF0Nk+Wom6UtI526p5kz9Rn2iZSqwIFedyCZ3e0fKCEmUJLIPGrTb/cIEdu3ZUNGzfZx7A==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.1.0", + "node-gyp-build": "^4.8.0" + }, + "peerDependencies": { + "tree-sitter": "^0.21.1" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-rust/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT" + }, + "node_modules/tree-sitter-typescript": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/tree-sitter-typescript/-/tree-sitter-typescript-0.21.2.tgz", + "integrity": "sha512-/RyNK41ZpkA8PuPZimR6pGLvNR1p0ibRUJwwQn4qAjyyLEIQD/BNlwS3NSxWtGsAWZe9gZ44VK1mWx2+eQVldg==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^8.0.0", + "node-gyp-build": "^4.8.1" + }, + "peerDependencies": { + "tree-sitter": "^0.21.0" + }, + "peerDependenciesMeta": { + "tree_sitter": { + "optional": true + } + } + }, + "node_modules/tree-sitter-typescript/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/tree-sitter/node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } }, "node_modules/tslib": { "version": "2.8.1", @@ -9284,6 +4631,26 @@ "license": "0BSD", "optional": true }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -9296,18 +4663,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.6" } }, "node_modules/typescript": { @@ -9324,173 +4690,35 @@ "node": ">=14.17" } }, - "node_modules/typescript5": { - "name": "typescript", - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - "license": "MIT" - }, - "node_modules/undici": { - "version": "5.28.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", - "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 10.0.0" } }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", @@ -9498,6 +4726,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", @@ -9511,660 +4748,169 @@ "uuid": "dist-node/bin/uuid" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "license": "MIT", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vite": { - "version": "5.4.21", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", - "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "isexe": "^2.0.0" }, "bin": { - "vite": "bin/vite.js" + "node-which": "bin/node-which" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/vite-plugin-static-copy": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-3.1.4.tgz", - "integrity": "sha512-iCmr4GSw4eSnaB+G8zc2f4dxSuDjbkjwpuBLLGvQYR9IW7rnDzftnUjOH5p4RYR+d4GsiBqXRvzuFhs5bnzVyw==", - "dev": true, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "chokidar": "^3.6.0", - "p-map": "^7.0.3", - "picocolors": "^1.1.1", - "tinyglobby": "^0.2.15" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/vite-plugin-top-level-await": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-plugin-top-level-await/-/vite-plugin-top-level-await-1.6.0.tgz", - "integrity": "sha512-bNhUreLamTIkoulCR9aDXbTbhLk6n1YE8NJUTTxl5RYskNRtzOR0ASzSjBVRtNdjIfngDXo11qOsybGLNsrdww==", - "license": "MIT", - "dependencies": { - "@rollup/plugin-virtual": "^3.0.2", - "@swc/core": "^1.12.14", - "@swc/wasm": "^1.12.14", - "uuid": "10.0.0" - }, - "peerDependencies": { - "vite": ">=2.8" - } - }, - "node_modules/vite-plugin-top-level-await/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vite-plugin-wasm": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/vite-plugin-wasm/-/vite-plugin-wasm-3.5.0.tgz", - "integrity": "sha512-X5VWgCnqiQEGb+omhlBVsvTfxikKtoOgAzQ95+BZ8gQ+VfMHIjSHr0wyvXFQCa0eKQ0fKyaL0kWcEnYqBac4lQ==", - "license": "MIT", - "peerDependencies": { - "vite": "^2 || ^3 || ^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", - "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", - "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", - "license": "MIT", - "dependencies": { - "vscode-languageserver-protocol": "3.17.5" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", - "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", - "license": "MIT", - "dependencies": { - "vscode-jsonrpc": "8.2.0", - "vscode-languageserver-types": "3.17.5" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "license": "MIT" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.5", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", - "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", - "license": "MIT" - }, - "node_modules/web-tree-sitter": { - "version": "0.20.8", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", - "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "license": "MIT" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/wrappy": { @@ -10173,42 +4919,126 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, - "node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", + "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" } } } diff --git a/gitnexus/package.json b/gitnexus/package.json index 20ee8b00b..968a6ff62 100644 --- a/gitnexus/package.json +++ b/gitnexus/package.json @@ -1,67 +1,54 @@ { "name": "gitnexus", - "private": true, - "version": "0.0.0", + "version": "0.1.0", + "description": "GitNexus local CLI and MCP server", + "author": "Abhigyan Patwari", + "license": "PolyForm-Noncommercial-1.0.0", "type": "module", + "bin": { + "gitnexus": "./dist/cli/index.js" + }, + "files": [ + "dist" + ], "scripts": { - "dev": "vite", - "build": "tsc -b && vite build", - "preview": "vite preview" + "build": "tsc", + "dev": "tsx watch src/cli/index.ts" }, "dependencies": { "@huggingface/transformers": "^3.0.0", - "@isomorphic-git/lightning-fs": "^4.6.2", - "@langchain/anthropic": "^1.3.10", - "@langchain/core": "^1.1.15", - "@langchain/google-genai": "^2.1.10", - "@langchain/langgraph": "^1.1.0", - "@langchain/ollama": "^1.2.0", - "@langchain/openai": "^1.2.2", - "@sigma/edge-curve": "^3.1.0", - "@tailwindcss/vite": "^4.1.18", - "axios": "^1.13.2", - "buffer": "^6.0.3", - "comlink": "^4.4.2", - "d3": "^7.9.0", - "graphology": "^0.26.0", - "graphology-communities-louvain": "^2.0.2", - "graphology-layout-force": "^0.2.4", - "graphology-layout-forceatlas2": "^0.10.1", - "graphology-layout-noverlap": "^0.4.2", - "isomorphic-git": "^1.36.1", - "jszip": "^3.10.1", - "kuzu-wasm": "^0.11.1", - "langchain": "^1.2.10", - "lru-cache": "^11.2.4", - "lucide-react": "^0.562.0", - "mermaid": "^11.12.2", + "@modelcontextprotocol/sdk": "^1.0.0", + "commander": "^12.0.0", + "cors": "^2.8.5", + "express": "^4.19.2", + "glob": "^11.0.0", + "graphology": "^0.25.4", + "graphology-communities-louvain": "^2.0.1", + "kuzu": "^0.11.3", + "lru-cache": "^11.0.0", "minisearch": "^7.2.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-markdown": "^10.1.0", - "react-syntax-highlighter": "^16.1.0", - "react-zoom-pan-pinch": "^3.7.0", - "remark-gfm": "^4.0.1", - "sigma": "^3.0.2", - "tailwindcss": "^4.1.18", - "uuid": "^13.0.0", - "vite-plugin-top-level-await": "^1.6.0", - "vite-plugin-wasm": "^3.5.0", - "web-tree-sitter": "^0.20.8", - "zod": "^3.25.76" + "ora": "^8.0.0", + "tree-sitter": "^0.21.0", + "tree-sitter-c": "^0.21.0", + "tree-sitter-c-sharp": "^0.21.0", + "tree-sitter-cpp": "^0.22.0", + "tree-sitter-go": "^0.21.0", + "tree-sitter-java": "^0.20.0", + "tree-sitter-javascript": "^0.21.0", + "tree-sitter-python": "^0.21.0", + "tree-sitter-rust": "^0.21.0", + "tree-sitter-typescript": "^0.21.0", + "uuid": "^13.0.0" }, "devDependencies": { - "@babel/types": "^7.28.5", - "@types/jszip": "^3.4.0", - "@types/node": "^24.10.1", - "@types/react": "^18.3.5", - "@types/react-dom": "^18.3.0", - "@types/react-syntax-highlighter": "^15.5.13", - "@vercel/node": "^5.5.16", - "@vitejs/plugin-react": "^5.1.0", - "tree-sitter-wasms": "^0.1.13", - "typescript": "^5.4.5", - "vite": "^5.2.0", - "vite-plugin-static-copy": "^3.1.4" + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/node": "^20.0.0", + "@types/uuid": "^10.0.0", + "tsx": "^4.0.0", + "typescript": "^5.4.5" + }, + "engines": { + "node": ">=18.0.0" } -} +} \ No newline at end of file diff --git a/gitnexus-cli/src/cli/analyze.ts b/gitnexus/src/cli/analyze.ts similarity index 100% rename from gitnexus-cli/src/cli/analyze.ts rename to gitnexus/src/cli/analyze.ts diff --git a/gitnexus-cli/src/cli/clean.ts b/gitnexus/src/cli/clean.ts similarity index 100% rename from gitnexus-cli/src/cli/clean.ts rename to gitnexus/src/cli/clean.ts diff --git a/gitnexus-cli/src/cli/index.ts b/gitnexus/src/cli/index.ts similarity index 100% rename from gitnexus-cli/src/cli/index.ts rename to gitnexus/src/cli/index.ts diff --git a/gitnexus-cli/src/cli/list.ts b/gitnexus/src/cli/list.ts similarity index 100% rename from gitnexus-cli/src/cli/list.ts rename to gitnexus/src/cli/list.ts diff --git a/gitnexus/src/cli/mcp.ts b/gitnexus/src/cli/mcp.ts new file mode 100644 index 000000000..43d7458dc --- /dev/null +++ b/gitnexus/src/cli/mcp.ts @@ -0,0 +1,94 @@ +/** + * MCP Command + * + * Starts the MCP server in standalone mode using local .gitnexus/ index. + * Auto-detects repository by searching for .gitnexus/ folder. + */ + +import path from 'path'; +import fs from 'fs/promises'; +import { startMCPServer } from '../mcp/server.js'; +import { LocalBackend, findRepo } from '../mcp/local/local-backend.js'; + +/** + * Get candidate paths to search for .gitnexus/ folder + */ +function getCandidatePaths(): string[] { + const candidates: string[] = []; + + // 1. Explicit override (highest priority) + if (process.env.GITNEXUS_CWD) { + candidates.push(process.env.GITNEXUS_CWD); + } + + // 2. Current working directory + candidates.push(process.cwd()); + + // 3. VS Code workspace folders (if available via env) + if (process.env.VSCODE_WORKSPACE_FOLDER) { + candidates.push(process.env.VSCODE_WORKSPACE_FOLDER); + } + + // Deduplicate while preserving order + return [...new Set(candidates.map(p => path.resolve(p)))]; +} + +/** + * Find a git repository root by walking up the directory tree + */ +async function findGitRoot(startPath: string): Promise { + let current = path.resolve(startPath); + const root = path.parse(current).root; + + while (current !== root) { + try { + const gitPath = path.join(current, '.git'); + const stat = await fs.stat(gitPath); + if (stat.isDirectory()) return current; + } catch {} + current = path.dirname(current); + } + return null; +} + +export const mcpCommand = async () => { + // Try multiple candidate paths to find .gitnexus/ + const candidates = getCandidatePaths(); + + for (const candidate of candidates) { + const repo = await findRepo(candidate); + if (repo) { + const local = new LocalBackend(); + await local.init(candidate); + console.error(`GitNexus: Found index at ${repo.storagePath}`); + await startMCPServer(local); + return; + } + } + + // No index found - give helpful error message + for (const candidate of candidates) { + const gitRoot = await findGitRoot(candidate); + if (gitRoot) { + console.error(''); + console.error('╔════════════════════════════════════════════════════╗'); + console.error('║ GitNexus: Repository Not Indexed ║'); + console.error('╠════════════════════════════════════════════════════╣'); + console.error(`║ Found git repo: ${gitRoot.slice(0, 35).padEnd(35)} ║`); + console.error('║ ║'); + console.error('║ To enable AI code understanding, run: ║'); + console.error('║ ║'); + console.error('║ npx gitnexus analyze ║'); + console.error('║ ║'); + console.error('║ Then restart your IDE. ║'); + console.error('╚════════════════════════════════════════════════════╝'); + console.error(''); + process.exit(1); + } + } + + // No git repo found + console.error('GitNexus: No git repository found.'); + console.error(`Searched: ${candidates.join(', ')}`); + process.exit(1); +}; diff --git a/gitnexus-cli/src/cli/serve.ts b/gitnexus/src/cli/serve.ts similarity index 100% rename from gitnexus-cli/src/cli/serve.ts rename to gitnexus/src/cli/serve.ts diff --git a/gitnexus-cli/src/cli/status.ts b/gitnexus/src/cli/status.ts similarity index 100% rename from gitnexus-cli/src/cli/status.ts rename to gitnexus/src/cli/status.ts diff --git a/gitnexus/src/core/embeddings/embedder.ts b/gitnexus/src/core/embeddings/embedder.ts index 118894583..f0cdcde45 100644 --- a/gitnexus/src/core/embeddings/embedder.ts +++ b/gitnexus/src/core/embeddings/embedder.ts @@ -8,59 +8,23 @@ */ import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; -import { DEFAULT_EMBEDDING_CONFIG, type EmbeddingConfig, type ModelProgress } from './types'; +import { DEFAULT_EMBEDDING_CONFIG, type EmbeddingConfig, type ModelProgress } from './types.js'; // Module-level state for singleton pattern let embedderInstance: FeatureExtractionPipeline | null = null; let isInitializing = false; let initPromise: Promise | null = null; -let currentDevice: 'webgpu' | 'wasm' | null = null; +let currentDevice: 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null = null; /** * Progress callback type for model loading */ export type ModelProgressCallback = (progress: ModelProgress) => void; -/** - * Custom error thrown when WebGPU is not available - * Allows UI to prompt user for fallback choice - */ -export class WebGPUNotAvailableError extends Error { - constructor(originalError?: Error) { - super('WebGPU not available in this browser'); - this.name = 'WebGPUNotAvailableError'; - this.cause = originalError; - } -} - -/** - * Check if WebGPU is available in this browser - * Quick check without loading the model - */ -export const checkWebGPUAvailability = async (): Promise => { - try { - // Cast to any to avoid WebGPU types not being available in all TS configs - const nav = navigator as any; - if (!nav.gpu) { - return false; - } - const adapter = await nav.gpu.requestAdapter(); - if (!adapter) { - return false; - } - // Try to get a device - this is where it usually fails - const device = await adapter.requestDevice(); - device.destroy(); // Clean up - return true; - } catch { - return false; - } -}; - /** * Get the current device being used for inference */ -export const getCurrentDevice = (): 'webgpu' | 'wasm' | null => currentDevice; +export const getCurrentDevice = (): 'webgpu' | 'cuda' | 'cpu' | 'wasm' | null => currentDevice; /** * Initialize the embedding model @@ -68,14 +32,13 @@ export const getCurrentDevice = (): 'webgpu' | 'wasm' | null => currentDevice; * * @param onProgress - Optional callback for model download progress * @param config - Optional configuration override - * @param forceDevice - Force a specific device (bypasses WebGPU check) + * @param forceDevice - Force a specific device * @returns Promise resolving to the embedder pipeline - * @throws WebGPUNotAvailableError if WebGPU is requested but unavailable */ export const initEmbedder = async ( onProgress?: ModelProgressCallback, config: Partial = {}, - forceDevice?: 'webgpu' | 'wasm' + forceDevice?: 'webgpu' | 'cuda' | 'cpu' | 'wasm' ): Promise => { // Return existing instance if available if (embedderInstance) { @@ -90,14 +53,19 @@ export const initEmbedder = async ( isInitializing = true; const finalConfig = { ...DEFAULT_EMBEDDING_CONFIG, ...config }; - const requestedDevice = forceDevice || finalConfig.device; + // On Windows, use webgpu for GPU acceleration (via DirectX12/DirectML) + // CUDA is only available on Linux with onnxruntime-node + const isWindows = process.platform === 'win32'; + const gpuDevice = isWindows ? 'webgpu' : 'cuda'; + let requestedDevice = forceDevice || (finalConfig.device === 'auto' ? gpuDevice : finalConfig.device); initPromise = (async () => { try { // Configure transformers.js environment env.allowLocalModels = false; - if (import.meta.env.DEV) { + const isDev = process.env.NODE_ENV !== 'production'; + if (isDev) { console.log(`🧠 Loading embedding model: ${finalConfig.modelId}`); } @@ -112,86 +80,59 @@ export const initEmbedder = async ( onProgress(progress); } : undefined; - // If WebGPU is requested (default), check availability first - if (requestedDevice === 'webgpu') { - if (import.meta.env.DEV) { - console.log('🔧 Checking WebGPU availability...'); - } - - const webgpuAvailable = await checkWebGPUAvailability(); - - if (!webgpuAvailable) { - if (import.meta.env.DEV) { - console.warn('⚠️ WebGPU not available'); - } - isInitializing = false; - initPromise = null; - throw new WebGPUNotAvailableError(); - } - - // Try WebGPU + // Try GPU first if auto, fall back to CPU + // Windows: webgpu (DirectX12/DirectML), Linux: cuda + const devicesToTry: Array<'webgpu' | 'cuda' | 'cpu' | 'wasm'> = + (requestedDevice === 'webgpu' || requestedDevice === 'cuda') + ? [requestedDevice, 'cpu'] + : [requestedDevice as 'cpu' | 'wasm']; + + for (const device of devicesToTry) { try { - if (import.meta.env.DEV) { - console.log('🔧 Initializing WebGPU backend...'); + if (isDev && device === 'webgpu') { + console.log('🔧 Trying WebGPU (DirectX12) backend...'); + } else if (isDev && device === 'cuda') { + console.log('🔧 Trying CUDA GPU backend...'); + } else if (isDev && device === 'cpu') { + console.log('🔧 Using CPU backend...'); + } else if (isDev && device === 'wasm') { + console.log('🔧 Using WASM backend (slower)...'); } - - // Type assertion needed due to complex union types in transformers.js + embedderInstance = await (pipeline as any)( 'feature-extraction', finalConfig.modelId, { - device: 'webgpu', + device: device, dtype: 'fp32', progress_callback: progressCallback, } ); - currentDevice = 'webgpu'; - - if (import.meta.env.DEV) { - console.log('✅ Using WebGPU backend'); + currentDevice = device; + + if (isDev) { + const label = device === 'webgpu' ? 'GPU (WebGPU/DirectX12)' + : device === 'cuda' ? 'GPU (CUDA)' + : device.toUpperCase(); + console.log(`✅ Using ${label} backend`); + console.log('✅ Embedding model loaded successfully'); } - } catch (err) { - if (import.meta.env.DEV) { - console.warn('⚠️ WebGPU initialization failed:', err); + + return embedderInstance!; + } catch (deviceError) { + if (isDev && (device === 'cuda' || device === 'webgpu')) { + const gpuType = device === 'webgpu' ? 'WebGPU' : 'CUDA'; + console.log(`⚠️ ${gpuType} not available, falling back to CPU...`); } - isInitializing = false; - initPromise = null; - embedderInstance = null; - throw new WebGPUNotAvailableError(err as Error); - } - } else { - // WASM mode requested (user chose fallback) - if (import.meta.env.DEV) { - console.log('🔧 Initializing WASM backend (this will be slower)...'); - } - - // Type assertion needed due to complex union types in transformers.js - embedderInstance = await (pipeline as any)( - 'feature-extraction', - finalConfig.modelId, - { - device: 'wasm', // WASM-based CPU execution - dtype: 'fp32', - progress_callback: progressCallback, + // Continue to next device in list + if (device === devicesToTry[devicesToTry.length - 1]) { + throw deviceError; // Last device failed, propagate error } - ); - currentDevice = 'wasm'; - - if (import.meta.env.DEV) { - console.log('✅ Using WASM backend'); } } - if (import.meta.env.DEV) { - console.log('✅ Embedding model loaded successfully'); - } - - return embedderInstance!; + throw new Error('No suitable device found for embedding model'); } catch (error) { - // Re-throw WebGPUNotAvailableError as-is - if (error instanceof WebGPUNotAvailableError) { - throw error; - } isInitializing = false; initPromise = null; embedderInstance = null; diff --git a/gitnexus/src/core/embeddings/embedding-pipeline.ts b/gitnexus/src/core/embeddings/embedding-pipeline.ts index 05f8ae7ed..128e5d937 100644 --- a/gitnexus/src/core/embeddings/embedding-pipeline.ts +++ b/gitnexus/src/core/embeddings/embedding-pipeline.ts @@ -9,8 +9,8 @@ * 5. Create vector index for semantic search */ -import { initEmbedder, embedBatch, embedText, embeddingToArray, isEmbedderReady } from './embedder'; -import { generateBatchEmbeddingTexts, generateEmbeddingText } from './text-generator'; +import { initEmbedder, embedBatch, embedText, embeddingToArray, isEmbedderReady } from './embedder.js'; +import { generateBatchEmbeddingTexts, generateEmbeddingText } from './text-generator.js'; import { type EmbeddingProgress, type EmbeddingConfig, @@ -19,7 +19,9 @@ import { type ModelProgress, DEFAULT_EMBEDDING_CONFIG, EMBEDDABLE_LABELS, -} from './types'; +} from './types.js'; + +const isDev = process.env.NODE_ENV !== 'production'; /** * Progress callback type @@ -71,7 +73,7 @@ const queryEmbeddableNodes = async ( } } catch (error) { // Table might not exist or be empty, continue - if (import.meta.env.DEV) { + if (isDev) { console.warn(`Query for ${label} nodes failed:`, error); } } @@ -113,7 +115,7 @@ const createVectorIndex = async ( await executeQuery(cypher); } catch (error) { // Index might already exist - if (import.meta.env.DEV) { + if (isDev) { console.warn('Vector index creation warning:', error); } } @@ -159,7 +161,7 @@ export const runEmbeddingPipeline = async ( modelDownloadPercent: 100, }); - if (import.meta.env.DEV) { + if (isDev) { console.log('🔍 Querying embeddable nodes...'); } @@ -167,7 +169,7 @@ export const runEmbeddingPipeline = async ( const nodes = await queryEmbeddableNodes(executeQuery); const totalNodes = nodes.length; - if (import.meta.env.DEV) { + if (isDev) { console.log(`📊 Found ${totalNodes} embeddable nodes`); } @@ -236,7 +238,7 @@ export const runEmbeddingPipeline = async ( totalNodes, }); - if (import.meta.env.DEV) { + if (isDev) { console.log('📇 Creating vector index...'); } @@ -250,13 +252,13 @@ export const runEmbeddingPipeline = async ( totalNodes, }); - if (import.meta.env.DEV) { + if (isDev) { console.log('✅ Embedding pipeline complete!'); } } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error'; - if (import.meta.env.DEV) { + if (isDev) { console.error('❌ Embedding pipeline error:', error); } diff --git a/gitnexus/src/core/embeddings/index.ts b/gitnexus/src/core/embeddings/index.ts index 5d384c8d5..4b4f10bb5 100644 --- a/gitnexus/src/core/embeddings/index.ts +++ b/gitnexus/src/core/embeddings/index.ts @@ -4,8 +4,8 @@ * Re-exports for the embedding pipeline system. */ -export * from './types'; -export * from './embedder'; -export * from './text-generator'; -export * from './embedding-pipeline'; +export * from './types.js'; +export * from './embedder.js'; +export * from './text-generator.js'; +export * from './embedding-pipeline.js'; diff --git a/gitnexus/src/core/embeddings/text-generator.ts b/gitnexus/src/core/embeddings/text-generator.ts index 36594e1a8..e3a99ff49 100644 --- a/gitnexus/src/core/embeddings/text-generator.ts +++ b/gitnexus/src/core/embeddings/text-generator.ts @@ -5,8 +5,8 @@ * Combines node metadata with code snippets for semantic matching. */ -import type { EmbeddableNode, EmbeddingConfig } from './types'; -import { DEFAULT_EMBEDDING_CONFIG } from './types'; +import type { EmbeddableNode, EmbeddingConfig } from './types.js'; +import { DEFAULT_EMBEDDING_CONFIG } from './types.js'; /** * Extract the filename from a file path diff --git a/gitnexus/src/core/embeddings/types.ts b/gitnexus/src/core/embeddings/types.ts index e4a04222b..b769b950c 100644 --- a/gitnexus/src/core/embeddings/types.ts +++ b/gitnexus/src/core/embeddings/types.ts @@ -59,8 +59,8 @@ export interface EmbeddingConfig { batchSize: number; /** Embedding vector dimensions */ dimensions: number; - /** Device to use for inference: 'webgpu' for GPU acceleration, 'wasm' for WASM-based CPU */ - device: 'webgpu' | 'wasm'; + /** Device to use for inference: 'auto' tries GPU first, falls back to CPU */ + device: 'auto' | 'webgpu' | 'cuda' | 'cpu' | 'wasm'; /** Maximum characters of code snippet to include */ maxSnippetLength: number; } @@ -74,7 +74,7 @@ export const DEFAULT_EMBEDDING_CONFIG: EmbeddingConfig = { modelId: 'Snowflake/snowflake-arctic-embed-xs', batchSize: 16, dimensions: 384, - device: 'webgpu', // WebGPU preferred, WASM fallback available if user chooses + device: 'auto', maxSnippetLength: 500, }; diff --git a/gitnexus/src/core/graph/graph.ts b/gitnexus/src/core/graph/graph.ts index 1f9653b95..695daf2bf 100644 --- a/gitnexus/src/core/graph/graph.ts +++ b/gitnexus/src/core/graph/graph.ts @@ -1,4 +1,4 @@ -import { GraphNode, GraphRelationship, KnowledgeGraph } from './types' +import { GraphNode, GraphRelationship, KnowledgeGraph } from './types.js' export const createKnowledgeGraph = (): KnowledgeGraph => { const nodeMap = new Map(); diff --git a/gitnexus/src/core/ingestion/ast-cache.ts b/gitnexus/src/core/ingestion/ast-cache.ts index 61775416a..0ae105120 100644 --- a/gitnexus/src/core/ingestion/ast-cache.ts +++ b/gitnexus/src/core/ingestion/ast-cache.ts @@ -1,5 +1,5 @@ import { LRUCache } from 'lru-cache'; -import Parser from 'web-tree-sitter'; +import Parser from 'tree-sitter'; // Define the interface for the Cache export interface ASTCache { @@ -16,8 +16,9 @@ export const createASTCache = (maxSize: number = 50): ASTCache => { max: maxSize, dispose: (tree) => { try { - // CRITICAL: Free the WASM memory when the tree leaves the cache - tree.delete(); + // NOTE: web-tree-sitter has tree.delete(); native tree-sitter trees are GC-managed. + // Keep this try/catch so we don't crash on either runtime. + (tree as any).delete?.(); } catch (e) { console.warn('Failed to delete tree from WASM memory', e); } diff --git a/gitnexus/src/core/ingestion/call-processor.ts b/gitnexus/src/core/ingestion/call-processor.ts index 2b71c5aaa..895e55352 100644 --- a/gitnexus/src/core/ingestion/call-processor.ts +++ b/gitnexus/src/core/ingestion/call-processor.ts @@ -1,11 +1,12 @@ -import { KnowledgeGraph } from '../graph/types'; -import { ASTCache } from './ast-cache'; -import { SymbolTable } from './symbol-table'; -import { ImportMap } from './import-processor'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries'; -import { generateId } from '../../lib/utils'; -import { getLanguageFromFilename } from './utils'; +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import { SymbolTable } from './symbol-table.js'; +import { ImportMap } from './import-processor.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; /** * Node types that represent function/method definitions across languages. @@ -156,18 +157,25 @@ export const processCalls = async ( if (!tree) { // Cache Miss: Re-parse - tree = parser.parse(file.content); + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } wasReparsed = true; } let query; let matches; try { - query = parser.getLanguage().query(queryStr); + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Query error for ${file.path}:`, queryError); - if (wasReparsed) tree.delete(); + if (wasReparsed) (tree as any).delete?.(); continue; } @@ -218,7 +226,7 @@ export const processCalls = async ( // Cleanup if re-parsed if (wasReparsed) { - tree.delete(); + (tree as any).delete?.(); } } }; diff --git a/gitnexus/src/core/ingestion/cluster-enricher.ts b/gitnexus/src/core/ingestion/cluster-enricher.ts index 51e00d618..0154e3bf3 100644 --- a/gitnexus/src/core/ingestion/cluster-enricher.ts +++ b/gitnexus/src/core/ingestion/cluster-enricher.ts @@ -5,7 +5,7 @@ * Generates semantic names, keywords, and descriptions using an LLM. */ -import { CommunityNode } from './community-processor'; +import { CommunityNode } from './community-processor.js'; // ============================================================================ // TYPES diff --git a/gitnexus/src/core/ingestion/community-processor.ts b/gitnexus/src/core/ingestion/community-processor.ts index 1a8901acc..42194c076 100644 --- a/gitnexus/src/core/ingestion/community-processor.ts +++ b/gitnexus/src/core/ingestion/community-processor.ts @@ -8,9 +8,11 @@ * helping agents navigate the codebase by functional area rather than file structure. */ +// NOTE: graphology + louvain typings are a bit inconsistent across versions. +// Keep these as `any` to avoid blocking the CLI build. import Graph from 'graphology'; import louvain from 'graphology-communities-louvain'; -import { KnowledgeGraph, NodeLabel } from '../graph/types'; +import { KnowledgeGraph, NodeLabel } from '../graph/types.js'; // ============================================================================ // TYPES @@ -94,7 +96,7 @@ export const processCommunities = async ( onProgress?.(`Running Leiden algorithm on ${graph.order} nodes...`, 30); // Step 2: Run Leiden (via Louvain implementation with refinement) - const details = louvain.detailed(graph, { + const details = (louvain as any).detailed(graph, { resolution: 1.0, // Default resolution, can be tuned randomWalk: true, }); @@ -141,9 +143,9 @@ export const processCommunities = async ( * Build a graphology graph containing only symbol nodes and CALLS edges * This is what the Leiden algorithm will cluster */ -const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): Graph => { +const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): any => { // Use undirected graph for Leiden - it looks at edge density, not direction - const graph = new Graph({ type: 'undirected', allowSelfLoops: false }); + const graph = new (Graph as any)({ type: 'undirected', allowSelfLoops: false }); // Symbol types that should be clustered const symbolTypes = new Set(['Function', 'Class', 'Method', 'Interface']); @@ -189,7 +191,7 @@ const buildGraphologyGraph = (knowledgeGraph: KnowledgeGraph): Graph => { const createCommunityNodes = ( communities: Record, communityCount: number, - graph: Graph, + graph: any, knowledgeGraph: KnowledgeGraph ): CommunityNode[] => { // Group node IDs by community @@ -244,7 +246,7 @@ const createCommunityNodes = ( const generateHeuristicLabel = ( memberIds: string[], nodePathMap: Map, - graph: Graph, + graph: any, commNum: number ): string => { // Collect folder names from file paths @@ -325,7 +327,7 @@ const findCommonPrefix = (strings: string[]): string => { * Calculate cohesion score (0-1) based on internal edge density * Higher cohesion = more internal connections relative to size */ -const calculateCohesion = (memberIds: string[], graph: Graph): number => { +const calculateCohesion = (memberIds: string[], graph: any): number => { if (memberIds.length <= 1) return 1.0; const memberSet = new Set(memberIds); diff --git a/gitnexus/src/core/ingestion/entry-point-scoring.ts b/gitnexus/src/core/ingestion/entry-point-scoring.ts index 1ef3d3ddc..55d0b1035 100644 --- a/gitnexus/src/core/ingestion/entry-point-scoring.ts +++ b/gitnexus/src/core/ingestion/entry-point-scoring.ts @@ -10,7 +10,7 @@ * This module is language-agnostic - language-specific patterns are defined per language. */ -import { detectFrameworkFromPath } from './framework-detection'; +import { detectFrameworkFromPath } from './framework-detection.js'; // ============================================================================ // NAME PATTERNS - All 9 supported languages diff --git a/gitnexus-cli/src/core/ingestion/filesystem-walker.ts b/gitnexus/src/core/ingestion/filesystem-walker.ts similarity index 100% rename from gitnexus-cli/src/core/ingestion/filesystem-walker.ts rename to gitnexus/src/core/ingestion/filesystem-walker.ts diff --git a/gitnexus/src/core/ingestion/heritage-processor.ts b/gitnexus/src/core/ingestion/heritage-processor.ts index 378a3bdd1..f0143a77d 100644 --- a/gitnexus/src/core/ingestion/heritage-processor.ts +++ b/gitnexus/src/core/ingestion/heritage-processor.ts @@ -6,13 +6,14 @@ * - IMPLEMENTS: Class implements an Interface (TS only) */ -import { KnowledgeGraph } from '../graph/types'; -import { ASTCache } from './ast-cache'; -import { SymbolTable } from './symbol-table'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries'; -import { generateId } from '../../lib/utils'; -import { getLanguageFromFilename } from './utils'; +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import { SymbolTable } from './symbol-table.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; export const processHeritage = async ( graph: KnowledgeGraph, @@ -42,18 +43,25 @@ export const processHeritage = async ( let wasReparsed = false; if (!tree) { - tree = parser.parse(file.content); + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } wasReparsed = true; } let query; let matches; try { - query = parser.getLanguage().query(queryStr); + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Heritage query error for ${file.path}:`, queryError); - if (wasReparsed) tree.delete(); + if (wasReparsed) (tree as any).delete?.(); continue; } @@ -148,7 +156,7 @@ export const processHeritage = async ( // Cleanup if (wasReparsed) { - tree.delete(); + (tree as any).delete?.(); } } }; diff --git a/gitnexus/src/core/ingestion/import-processor.ts b/gitnexus/src/core/ingestion/import-processor.ts index c0cb6bd68..aeac2162f 100644 --- a/gitnexus/src/core/ingestion/import-processor.ts +++ b/gitnexus/src/core/ingestion/import-processor.ts @@ -1,9 +1,12 @@ -import { KnowledgeGraph } from '../graph/types'; -import { ASTCache } from './ast-cache'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries'; -import { generateId } from '../../lib/utils'; -import { getLanguageFromFilename } from './utils'; +import { KnowledgeGraph } from '../graph/types.js'; +import { ASTCache } from './ast-cache.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { getLanguageFromFilename } from './utils.js'; + +const isDev = process.env.NODE_ENV !== 'production'; // Type: Map> // Stores all files that a given file imports from @@ -141,14 +144,21 @@ export const processImports = async ( if (!tree) { // Cache Miss: Re-parse (slower, but necessary if evicted) - tree = parser.parse(file.content); + // Use larger bufferSize for files > 32KB + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed + continue; + } wasReparsed = true; } let query; let matches; try { - query = parser.getLanguage().query(queryStr); + const language = parser.getLanguage(); + query = new Parser.Query(language, queryStr); matches = query.matches(tree.rootNode); // Removed verbose Java import logging @@ -163,7 +173,7 @@ export const processImports = async ( console.log('AST has errors:', tree.rootNode?.hasError); console.groupEnd(); - if (wasReparsed) tree.delete(); + if (wasReparsed) (tree as any).delete?.(); continue; } @@ -174,7 +184,7 @@ export const processImports = async ( if (captureMap['import']) { const sourceNode = captureMap['import.source']; if (!sourceNode) { - if (import.meta.env.DEV) { + if (isDev) { console.log(`⚠️ Import captured but no source node in ${file.path}`); } return; @@ -224,11 +234,11 @@ export const processImports = async ( // If re-parsed just for this, delete the tree to save memory if (wasReparsed) { - tree.delete(); + (tree as any).delete?.(); } } - if (import.meta.env.DEV) { + if (isDev) { console.log(`📊 Import processing complete: ${totalImportsResolved}/${totalImportsFound} imports resolved to graph edges`); } }; diff --git a/gitnexus/src/core/ingestion/parsing-processor.ts b/gitnexus/src/core/ingestion/parsing-processor.ts index 807bcf581..cca7098ea 100644 --- a/gitnexus/src/core/ingestion/parsing-processor.ts +++ b/gitnexus/src/core/ingestion/parsing-processor.ts @@ -1,10 +1,11 @@ -import { KnowledgeGraph, GraphNode, GraphRelationship } from '../graph/types'; -import { loadParser, loadLanguage } from '../tree-sitter/parser-loader'; -import { LANGUAGE_QUERIES } from './tree-sitter-queries'; -import { generateId } from '../../lib/utils'; -import { SymbolTable } from './symbol-table'; -import { ASTCache } from './ast-cache'; -import { getLanguageFromFilename } from './utils'; +import { KnowledgeGraph, GraphNode, GraphRelationship } from '../graph/types.js'; +import Parser from 'tree-sitter'; +import { loadParser, loadLanguage } from '../tree-sitter/parser-loader.js'; +import { LANGUAGE_QUERIES } from './tree-sitter-queries.js'; +import { generateId } from '../../lib/utils.js'; +import { SymbolTable } from './symbol-table.js'; +import { ASTCache } from './ast-cache.js'; +import { getLanguageFromFilename } from './utils.js'; export type FileProgressCallback = (current: number, total: number, filePath: string) => void; @@ -134,7 +135,15 @@ export const processParsing = async ( await loadLanguage(language, file.path); // 3. Parse the text content into an AST - const tree = parser.parse(file.content); + // Use larger bufferSize for files > 32KB (default limit) + let tree; + try { + tree = parser.parse(file.content, undefined, { bufferSize: 1024 * 256 }); + } catch (parseError) { + // Skip files that can't be parsed (binary, encoding issues, etc.) + console.warn(`Skipping unparseable file: ${file.path}`); + continue; + } // Store in cache immediately (this might evict an old one) astCache.set(file.path, tree); @@ -150,7 +159,8 @@ export const processParsing = async ( let query; let matches; try { - query = parser.getLanguage().query(queryString); + const language = parser.getLanguage(); + query = new Parser.Query(language, queryString); matches = query.matches(tree.rootNode); } catch (queryError) { console.warn(`Query error for ${file.path}:`, queryError); diff --git a/gitnexus/src/core/ingestion/pipeline.ts b/gitnexus/src/core/ingestion/pipeline.ts index 8c276b312..45b087db7 100644 --- a/gitnexus/src/core/ingestion/pipeline.ts +++ b/gitnexus/src/core/ingestion/pipeline.ts @@ -1,302 +1,265 @@ -import { createKnowledgeGraph } from '../graph/graph'; -import { extractZip, FileEntry } from '../../services/zip'; -import { processStructure } from './structure-processor'; -import { processParsing } from './parsing-processor'; -import { processImports, createImportMap } from './import-processor'; -import { processCalls } from './call-processor'; -import { processHeritage } from './heritage-processor'; -import { processCommunities, CommunityDetectionResult } from './community-processor'; -import { processProcesses, ProcessDetectionResult } from './process-processor'; -import { createSymbolTable } from './symbol-table'; -import { createASTCache } from './ast-cache'; -import { PipelineProgress, PipelineResult } from '../../types/pipeline'; +import { createKnowledgeGraph } from '../graph/graph.js'; +import { processStructure } from './structure-processor.js'; +import { processParsing } from './parsing-processor.js'; +import { processImports, createImportMap } from './import-processor.js'; +import { processCalls } from './call-processor.js'; +import { processHeritage } from './heritage-processor.js'; +import { processCommunities } from './community-processor.js'; +import { processProcesses } from './process-processor.js'; +import { createSymbolTable } from './symbol-table.js'; +import { createASTCache } from './ast-cache.js'; +import { PipelineProgress, PipelineResult } from '../../types/pipeline.js'; +import { walkRepository } from './filesystem-walker.js'; -/** - * Run the ingestion pipeline from a ZIP file - */ -export const runIngestionPipeline = async ( file: File, onProgress: (progress: PipelineProgress) => void): Promise => { - // Phase 1: Extracting (0-15%) - onProgress({ - phase: 'extracting', - percent: 0, - message: 'Extracting ZIP file...', - }); - - // Fake progress for extraction (JSZip doesn't expose progress) - const fakeExtractionProgress = setInterval(() => { - onProgress({ - phase: 'extracting', - percent: Math.min(14, Math.random() * 10 + 5), - message: 'Extracting ZIP file...', - }); - }, 200); - - const files = await extractZip(file); - clearInterval(fakeExtractionProgress); - - // Continue with common pipeline - return runPipelineFromFiles(files, onProgress); -}; +const isDev = process.env.NODE_ENV !== 'production'; -/** - * Run the ingestion pipeline from pre-extracted files (e.g., from git clone) - */ -export const runPipelineFromFiles = async ( - files: FileEntry[], +export const runPipelineFromRepo = async ( + repoPath: string, onProgress: (progress: PipelineProgress) => void ): Promise => { const graph = createKnowledgeGraph(); const fileContents = new Map(); const symbolTable = createSymbolTable(); - const astCache = createASTCache(50); // Keep last 50 files hot + const astCache = createASTCache(50); const importMap = createImportMap(); - // Cleanup function for error handling const cleanup = () => { astCache.clear(); symbolTable.clear(); }; - + try { - // Store file contents for code panel - files.forEach(f => fileContents.set(f.path, f.content)); - - onProgress({ - phase: 'extracting', - percent: 15, - message: 'ZIP extracted successfully', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: 0 }, - }); - - // Phase 2: Structure (15-30%) - onProgress({ - phase: 'structure', - percent: 15, - message: 'Analyzing project structure...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: 0 }, - }); - - const filePaths = files.map(f => f.path); - processStructure(graph, filePaths); - - onProgress({ - phase: 'structure', - percent: 30, - message: 'Project structure analyzed', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - // Phase 3: Parsing (30-70%) - onProgress({ - phase: 'parsing', - percent: 30, - message: 'Parsing code definitions...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processParsing(graph, files, symbolTable, astCache, (current, total, filePath) => { - const parsingProgress = 30 + ((current / total) * 40); onProgress({ - phase: 'parsing', - percent: Math.round(parsingProgress), - message: 'Parsing code definitions...', - detail: filePath, - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + phase: 'extracting', + percent: 0, + message: 'Scanning repository...', }); - }); - - // Phase 4: Imports (70-82%) - onProgress({ - phase: 'imports', - percent: 70, - message: 'Resolving imports...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processImports(graph, files, astCache, importMap, (current, total) => { - const importProgress = 70 + ((current / total) * 12); - onProgress({ - phase: 'imports', - percent: Math.round(importProgress), - message: 'Resolving imports...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + const files = await walkRepository(repoPath, (current, total, filePath) => { + const scanProgress = Math.round((current / total) * 15); + onProgress({ + phase: 'extracting', + percent: scanProgress, + message: 'Scanning repository...', + detail: filePath, + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); }); - }); - - // Debug: Count IMPORTS relationships - if (import.meta.env.DEV) { - const importsCount = graph.relationships.filter(r => r.type === 'IMPORTS').length; - console.log(`📊 Pipeline: After import phase, graph has ${importsCount} IMPORTS relationships (total: ${graph.relationshipCount})`); - if (importsCount > 0) { - const sample = graph.relationships.filter(r => r.type === 'IMPORTS').slice(0, 3); - sample.forEach(r => console.log(` Sample IMPORTS: ${r.sourceId} → ${r.targetId}`)); - } - } + files.forEach(f => fileContents.set(f.path, f.content)); - // Phase 5: Calls (82-98%) - onProgress({ - phase: 'calls', - percent: 82, - message: 'Tracing function calls...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processCalls(graph, files, astCache, symbolTable, importMap, (current, total) => { - const callProgress = 82 + ((current / total) * 10); onProgress({ - phase: 'calls', - percent: Math.round(callProgress), - message: 'Tracing function calls...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - // Phase 6: Heritage - Class inheritance (92-98%) - onProgress({ - phase: 'heritage', - percent: 92, - message: 'Extracting class inheritance...', - stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - await processHeritage(graph, files, astCache, symbolTable, (current, total) => { - const heritageProgress = 88 + ((current / total) * 4); - onProgress({ - phase: 'heritage', - percent: Math.round(heritageProgress), - message: 'Extracting class inheritance...', - stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, - }); - }); - - // Phase 7: Community Detection (92-98%) - onProgress({ - phase: 'communities', - percent: 92, - message: 'Detecting code communities...', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); - - const communityResult = await processCommunities(graph, (message, progress) => { - const communityProgress = 92 + (progress * 0.06); - onProgress({ - phase: 'communities', - percent: Math.round(communityProgress), - message, + phase: 'extracting', + percent: 15, + message: 'Repository scanned successfully', stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, }); - }); - // Log community detection results - if (import.meta.env.DEV) { - console.log(`🏘️ Community detection: ${communityResult.stats.totalCommunities} communities found (modularity: ${communityResult.stats.modularity.toFixed(3)})`); - } - - // Add community nodes to the graph - communityResult.communities.forEach(comm => { - graph.addNode({ - id: comm.id, - label: 'Community' as const, - properties: { - name: comm.label, - filePath: '', - heuristicLabel: comm.heuristicLabel, - cohesion: comm.cohesion, - symbolCount: comm.symbolCount, - } + onProgress({ + phase: 'structure', + percent: 15, + message: 'Analyzing project structure...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, }); - }); - // Add MEMBER_OF relationships - communityResult.memberships.forEach(membership => { - graph.addRelationship({ - id: `${membership.nodeId}_member_of_${membership.communityId}`, - type: 'MEMBER_OF', - sourceId: membership.nodeId, - targetId: membership.communityId, - confidence: 1.0, - reason: 'leiden-algorithm', + const filePaths = files.map(f => f.path); + processStructure(graph, filePaths); + + onProgress({ + phase: 'structure', + percent: 30, + message: 'Project structure analyzed', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, }); - }); - // Phase 8: Process Detection (98-99%) - onProgress({ - phase: 'processes', - percent: 98, - message: 'Detecting execution flows...', - stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, - }); + onProgress({ + phase: 'parsing', + percent: 30, + message: 'Parsing code definitions...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); - const processResult = await processProcesses( - graph, - communityResult.memberships, - (message, progress) => { - const processProgress = 98 + (progress * 0.01); + await processParsing(graph, files, symbolTable, astCache, (current, total, filePath) => { + const parsingProgress = 30 + ((current / total) * 40); onProgress({ - phase: 'processes', - percent: Math.round(processProgress), + phase: 'parsing', + percent: Math.round(parsingProgress), + message: 'Parsing code definitions...', + detail: filePath, + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'imports', + percent: 70, + message: 'Resolving imports...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processImports(graph, files, astCache, importMap, (current, total) => { + const importProgress = 70 + ((current / total) * 12); + onProgress({ + phase: 'imports', + percent: Math.round(importProgress), + message: 'Resolving imports...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + if (isDev) { + const importsCount = graph.relationships.filter(r => r.type === 'IMPORTS').length; + console.log(`📊 Pipeline: After import phase, graph has ${importsCount} IMPORTS relationships (total: ${graph.relationshipCount})`); + } + + onProgress({ + phase: 'calls', + percent: 82, + message: 'Tracing function calls...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processCalls(graph, files, astCache, symbolTable, importMap, (current, total) => { + const callProgress = 82 + ((current / total) * 10); + onProgress({ + phase: 'calls', + percent: Math.round(callProgress), + message: 'Tracing function calls...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'heritage', + percent: 92, + message: 'Extracting class inheritance...', + stats: { filesProcessed: 0, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + await processHeritage(graph, files, astCache, symbolTable, (current, total) => { + const heritageProgress = 88 + ((current / total) * 4); + onProgress({ + phase: 'heritage', + percent: Math.round(heritageProgress), + message: 'Extracting class inheritance...', + stats: { filesProcessed: current, totalFiles: total, nodesCreated: graph.nodeCount }, + }); + }); + + onProgress({ + phase: 'communities', + percent: 92, + message: 'Detecting code communities...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const communityResult = await processCommunities(graph, (message, progress) => { + const communityProgress = 92 + (progress * 0.06); + onProgress({ + phase: 'communities', + percent: Math.round(communityProgress), message, stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, }); + }); + + if (isDev) { + console.log(`🏘️ Community detection: ${communityResult.stats.totalCommunities} communities found (modularity: ${communityResult.stats.modularity.toFixed(3)})`); } - ); - // Log process detection results - if (import.meta.env.DEV) { - console.log(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`); - } + communityResult.communities.forEach(comm => { + graph.addNode({ + id: comm.id, + label: 'Community' as const, + properties: { + name: comm.label, + filePath: '', + heuristicLabel: comm.heuristicLabel, + cohesion: comm.cohesion, + symbolCount: comm.symbolCount, + } + }); + }); - // Add Process nodes to the graph - processResult.processes.forEach(proc => { - graph.addNode({ - id: proc.id, - label: 'Process' as const, - properties: { - name: proc.label, - filePath: '', - heuristicLabel: proc.heuristicLabel, - processType: proc.processType, - stepCount: proc.stepCount, - communities: proc.communities, - entryPointId: proc.entryPointId, - terminalId: proc.terminalId, + communityResult.memberships.forEach(membership => { + graph.addRelationship({ + id: `${membership.nodeId}_member_of_${membership.communityId}`, + type: 'MEMBER_OF', + sourceId: membership.nodeId, + targetId: membership.communityId, + confidence: 1.0, + reason: 'leiden-algorithm', + }); + }); + + onProgress({ + phase: 'processes', + percent: 98, + message: 'Detecting execution flows...', + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); + + const processResult = await processProcesses( + graph, + communityResult.memberships, + (message, progress) => { + const processProgress = 98 + (progress * 0.01); + onProgress({ + phase: 'processes', + percent: Math.round(processProgress), + message, + stats: { filesProcessed: files.length, totalFiles: files.length, nodesCreated: graph.nodeCount }, + }); } + ); + + if (isDev) { + console.log(`🔄 Process detection: ${processResult.stats.totalProcesses} processes found (${processResult.stats.crossCommunityCount} cross-community)`); + } + + processResult.processes.forEach(proc => { + graph.addNode({ + id: proc.id, + label: 'Process' as const, + properties: { + name: proc.label, + filePath: '', + heuristicLabel: proc.heuristicLabel, + processType: proc.processType, + stepCount: proc.stepCount, + communities: proc.communities, + entryPointId: proc.entryPointId, + terminalId: proc.terminalId, + } + }); }); - }); - // Add STEP_IN_PROCESS relationships - processResult.steps.forEach(step => { - graph.addRelationship({ - id: `${step.nodeId}_step_${step.step}_${step.processId}`, - type: 'STEP_IN_PROCESS', - sourceId: step.nodeId, - targetId: step.processId, - confidence: 1.0, - reason: 'trace-detection', - step: step.step, + processResult.steps.forEach(step => { + graph.addRelationship({ + id: `${step.nodeId}_step_${step.step}_${step.processId}`, + type: 'STEP_IN_PROCESS', + sourceId: step.nodeId, + targetId: step.processId, + confidence: 1.0, + reason: 'trace-detection', + step: step.step, + }); }); - }); - - // Phase 9: Complete (100%) - onProgress({ - phase: 'complete', - percent: 100, - message: `Graph complete! ${communityResult.stats.totalCommunities} communities, ${processResult.stats.totalProcesses} processes detected.`, - stats: { - filesProcessed: files.length, - totalFiles: files.length, - nodesCreated: graph.nodeCount - }, - }); + onProgress({ + phase: 'complete', + percent: 100, + message: `Graph complete! ${communityResult.stats.totalCommunities} communities, ${processResult.stats.totalProcesses} processes detected.`, + stats: { + filesProcessed: files.length, + totalFiles: files.length, + nodesCreated: graph.nodeCount + }, + }); - // Cleanup WASM memory before returning - astCache.clear(); - - return { graph, fileContents, communityResult, processResult }; + astCache.clear(); + return { graph, fileContents, communityResult, processResult }; } catch (error) { cleanup(); throw error; diff --git a/gitnexus/src/core/ingestion/process-processor.ts b/gitnexus/src/core/ingestion/process-processor.ts index cf983d2e6..ccb1bf1cc 100644 --- a/gitnexus/src/core/ingestion/process-processor.ts +++ b/gitnexus/src/core/ingestion/process-processor.ts @@ -10,9 +10,11 @@ * Processes help agents understand how features work through the codebase. */ -import { KnowledgeGraph, GraphNode, GraphRelationship, NodeLabel } from '../graph/types'; -import { CommunityMembership } from './community-processor'; -import { calculateEntryPointScore, isTestFile } from './entry-point-scoring'; +import { KnowledgeGraph, GraphNode, GraphRelationship, NodeLabel } from '../graph/types.js'; +import { CommunityMembership } from './community-processor.js'; +import { calculateEntryPointScore, isTestFile } from './entry-point-scoring.js'; + +const isDev = process.env.NODE_ENV !== 'production'; // ============================================================================ // CONFIGURATION @@ -289,7 +291,7 @@ const findEntryPoints = ( const sorted = entryPointCandidates.sort((a, b) => b.score - a.score); // DEBUG: Log top candidates with new scoring details - if (sorted.length > 0 && typeof import.meta !== 'undefined' && import.meta.env?.DEV) { + if (sorted.length > 0 && isDev) { console.log(`[Process] Top 10 entry point candidates (new scoring):`); sorted.slice(0, 10).forEach((c, i) => { const node = graph.nodes.find(n => n.id === c.id); diff --git a/gitnexus/src/core/ingestion/structure-processor.ts b/gitnexus/src/core/ingestion/structure-processor.ts index c73a5837c..de1a53e49 100644 --- a/gitnexus/src/core/ingestion/structure-processor.ts +++ b/gitnexus/src/core/ingestion/structure-processor.ts @@ -1,5 +1,5 @@ -import { generateId } from "@/lib/utils"; -import { KnowledgeGraph, GraphNode, GraphRelationship } from "../graph/types"; +import { generateId } from "../../lib/utils.js"; +import { KnowledgeGraph, GraphNode, GraphRelationship } from "../graph/types.js"; export const processStructure = ( graph: KnowledgeGraph, paths: string[])=>{ paths.forEach( path => { diff --git a/gitnexus/src/core/ingestion/tree-sitter-queries.ts b/gitnexus/src/core/ingestion/tree-sitter-queries.ts index a931b4a40..f8bcd7add 100644 --- a/gitnexus/src/core/ingestion/tree-sitter-queries.ts +++ b/gitnexus/src/core/ingestion/tree-sitter-queries.ts @@ -1,4 +1,4 @@ -import { SupportedLanguages } from '../../config/supported-languages'; +import { SupportedLanguages } from '../../config/supported-languages.js'; /* * Tree-sitter queries for extracting code definitions. diff --git a/gitnexus/src/core/ingestion/utils.ts b/gitnexus/src/core/ingestion/utils.ts index 959eb55dc..5ac12a8be 100644 --- a/gitnexus/src/core/ingestion/utils.ts +++ b/gitnexus/src/core/ingestion/utils.ts @@ -1,4 +1,4 @@ -import { SupportedLanguages } from '../../config/supported-languages'; +import { SupportedLanguages } from '../../config/supported-languages.js'; /** * Map file extension to SupportedLanguage enum diff --git a/gitnexus/src/core/kuzu/csv-generator.ts b/gitnexus/src/core/kuzu/csv-generator.ts index 43df569cf..b23471deb 100644 --- a/gitnexus/src/core/kuzu/csv-generator.ts +++ b/gitnexus/src/core/kuzu/csv-generator.ts @@ -10,8 +10,8 @@ * - All fields are consistently quoted for safety with code content */ -import { KnowledgeGraph, GraphNode, NodeLabel } from '../graph/types'; -import { NODE_TABLES, NodeTableName } from './schema'; +import { KnowledgeGraph, GraphNode, NodeLabel } from '../graph/types.js'; +import { NODE_TABLES, NodeTableName } from './schema.js'; // ============================================================================ // CSV ESCAPE UTILITIES @@ -133,9 +133,14 @@ export interface CSVData { const generateFileCSV = (nodes: GraphNode[], fileContents: Map): string => { const headers = ['id', 'name', 'filePath', 'content']; const rows: string[] = [headers.join(',')]; + const seenIds = new Set(); for (const node of nodes) { if (node.label !== 'File') continue; + // Skip duplicates + if (seenIds.has(node.id)) continue; + seenIds.add(node.id); + const content = extractContent(node, fileContents); rows.push([ escapeCSVField(node.id), diff --git a/gitnexus/src/core/kuzu/kuzu-adapter.ts b/gitnexus/src/core/kuzu/kuzu-adapter.ts index c16e2edf3..e42a6fb7c 100644 --- a/gitnexus/src/core/kuzu/kuzu-adapter.ts +++ b/gitnexus/src/core/kuzu/kuzu-adapter.ts @@ -1,358 +1,225 @@ -/** - * KuzuDB Adapter - * - * Manages the KuzuDB WASM instance for client-side graph database operations. - * Uses the "Snapshot / Bulk Load" pattern with COPY FROM for performance. - * - * Multi-table schema: separate tables for File, Function, Class, etc. - */ - -import { KnowledgeGraph } from '../graph/types'; -import { - NODE_TABLES, +import fs from 'fs/promises'; +import path from 'path'; +import kuzu from 'kuzu'; +import { KnowledgeGraph } from '../graph/types.js'; +import { + NODE_TABLES, REL_TABLE_NAME, - SCHEMA_QUERIES, + SCHEMA_QUERIES, EMBEDDING_TABLE_NAME, NodeTableName, -} from './schema'; -import { generateAllCSVs } from './csv-generator'; +} from './schema.js'; +import { generateAllCSVs } from './csv-generator.js'; -// Holds the reference to the dynamically loaded module -let kuzu: any = null; -let db: any = null; -let conn: any = null; +let db: kuzu.Database | null = null; +let conn: kuzu.Connection | null = null; -/** - * Initialize KuzuDB WASM module and create in-memory database - */ -export const initKuzu = async () => { - if (conn) return { db, conn, kuzu }; +const normalizeCopyPath = (filePath: string): string => filePath.replace(/\\/g, '/'); +export const initKuzu = async (dbPath: string) => { + if (conn) return { db, conn }; + + // kuzu v0.11 expects the database path to NOT exist (it will create it) + // or to be an existing valid kuzu database + // If an empty directory exists from a previous clean, remove it try { - if (import.meta.env.DEV) console.log('🚀 Initializing KuzuDB...'); - - // 1. Dynamic Import (Fixes the "not a function" bundler issue) - const kuzuModule = await import('kuzu-wasm'); - - // 2. Handle Vite/Webpack "default" wrapping - kuzu = kuzuModule.default || kuzuModule; - - // 3. Initialize WASM - await kuzu.init(); - - // 4. Create Database with 512MB buffer pool - const BUFFER_POOL_SIZE = 512 * 1024 * 1024; // 512MB - db = new kuzu.Database(':memory:', BUFFER_POOL_SIZE); - conn = new kuzu.Connection(db); - - if (import.meta.env.DEV) console.log('✅ KuzuDB WASM Initialized'); - - // 5. Initialize Schema (all node tables, then rel tables, then embedding table) - for (const schemaQuery of SCHEMA_QUERIES) { - try { - await conn.query(schemaQuery); - } catch (e) { - // Schema might already exist, skip - if (import.meta.env.DEV) { - console.warn('Schema creation skipped (may already exist):', e); - } + const stat = await fs.stat(dbPath); + if (stat.isDirectory()) { + // Check if it's an empty directory + const files = await fs.readdir(dbPath); + if (files.length === 0) { + // Empty directory - remove it so kuzu can create fresh + await fs.rmdir(dbPath); } } - - if (import.meta.env.DEV) console.log('✅ KuzuDB Multi-Table Schema Created'); - - return { db, conn, kuzu }; - } catch (error) { - if (import.meta.env.DEV) console.error('❌ KuzuDB Initialization Failed:', error); - throw error; + } catch { + // Path doesn't exist, which is what kuzu v0.11 wants for a new database } + + // Ensure parent directory exists + const parentDir = path.dirname(dbPath); + await fs.mkdir(parentDir, { recursive: true }); + + db = new kuzu.Database(dbPath); + conn = new kuzu.Connection(db); + + for (const schemaQuery of SCHEMA_QUERIES) { + try { + await conn.query(schemaQuery); + } catch { + // Schema may already exist + } + } + + return { db, conn }; }; -/** - * Load a KnowledgeGraph into KuzuDB using COPY FROM (bulk load) - * Uses batched CSV writes and COPY statements for optimal performance - */ export const loadGraphToKuzu = async ( - graph: KnowledgeGraph, - fileContents: Map + graph: KnowledgeGraph, + fileContents: Map, + storagePath: string ) => { - const { conn, kuzu } = await initKuzu(); - - try { - if (import.meta.env.DEV) console.log(`KuzuDB: Generating CSVs for ${graph.nodeCount} nodes...`); - - // 1. Generate all CSVs (per-table) - const csvData = generateAllCSVs(graph, fileContents); - - const fs = kuzu.FS; - - // 2. Write all node CSVs to virtual filesystem - const nodeFiles: Array<{ table: NodeTableName; path: string }> = []; - for (const [tableName, csv] of csvData.nodes.entries()) { - // Skip empty CSVs (only header row) - if (csv.split('\n').length <= 1) continue; - - const path = `/${tableName.toLowerCase()}.csv`; - try { await fs.unlink(path); } catch {} - await fs.writeFile(path, csv); - nodeFiles.push({ table: tableName, path }); - } - - // 3. Parse relation CSV and prepare for INSERT (COPY FROM doesn't work with multi-pair tables) - const relLines = csvData.relCSV.split('\n').slice(1).filter(line => line.trim()); - const relCount = relLines.length; - - if (import.meta.env.DEV) { - console.log(`KuzuDB: Wrote ${nodeFiles.length} node CSVs, ${relCount} relations to insert`); - } - - // 4. COPY all node tables (must complete before rels due to FK constraints) - for (const { table, path } of nodeFiles) { - const copyQuery = getCopyQuery(table, path); - await conn.query(copyQuery); - } - - // 5. INSERT relations one by one (COPY doesn't work with multi-pair REL tables) - // Parse CSV format: "from","to","type",confidence,"reason" - let insertedRels = 0; - let skippedRels = 0; - const skippedRelStats = new Map(); - for (const line of relLines) { - try { - // Parse CSV - handle quoted fields and numeric confidence - // Parse CSV - handle quoted fields and numeric confidence - // Format: "from","to","type",confidence,"reason",step - // Note: step is unquoted numeric - const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)",([0-9-]+)/); - if (!match) continue; - - const [, fromId, toId, relType, confidenceStr, reason, stepStr] = match; - const confidence = parseFloat(confidenceStr) || 1.0; - const step = parseInt(stepStr) || 0; - - // Extract labels from node IDs - // Community nodes have IDs like "comm_14" (no colon) - // Other nodes have IDs like "Label:path:name" - const getNodeLabel = (nodeId: string): string => { - if (nodeId.startsWith('comm_')) { - return 'Community'; - } - if (nodeId.startsWith('proc_')) { - return 'Process'; - } - return nodeId.split(':')[0]; - }; - - // Reserved Cypher keywords need backtick escaping - const RESERVED_LABELS = ['Macro', 'Enum', 'Union', 'Const', 'Module', 'Struct']; - const escapeLabel = (label: string): string => { - return RESERVED_LABELS.includes(label) ? `\`${label}\`` : label; - }; - - const fromLabel = escapeLabel(getNodeLabel(fromId)); - const toLabel = escapeLabel(getNodeLabel(toId)); - - // INSERT with explicit node matching (including confidence and reason) - const insertQuery = ` - MATCH (a:${fromLabel} {id: '${fromId.replace(/'/g, "''")}'}), - (b:${toLabel} {id: '${toId.replace(/'/g, "''")}'}) - CREATE (a)-[:${REL_TABLE_NAME} {type: '${relType}', confidence: ${confidence}, reason: '${reason.replace(/'/g, "''")}', step: ${step}}]->(b) - `; - await conn.query(insertQuery); - insertedRels++; - } catch (err) { - // Skip failed insertions (nodes might not exist, or relation pair not allowed by schema) - skippedRels++; - const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)"/); - if (match) { - const [, fromId, toId, relType] = match; - const getNodeLabel = (nodeId: string): string => { - if (nodeId.startsWith('comm_')) return 'Community'; - if (nodeId.startsWith('proc_')) return 'Process'; - return nodeId.split(':')[0]; - }; - const fromLabel = getNodeLabel(fromId); - const toLabel = getNodeLabel(toId); - const key = `${relType}:${fromLabel}->` + toLabel; - skippedRelStats.set(key, (skippedRelStats.get(key) || 0) + 1); - - // Log each skipped relation - if (import.meta.env.DEV) { - console.warn(`⚠️ Skipped: ${key} | "${fromId}" → "${toId}" | ${err instanceof Error ? err.message : String(err)}`); - } - } - } - } - - if (import.meta.env.DEV) { - console.log(`KuzuDB: Inserted ${insertedRels}/${relCount} relations`); - if (skippedRels > 0) { - const topSkipped = Array.from(skippedRelStats.entries()) - .sort((a, b) => b[1] - a[1]) - .slice(0, 10); - console.warn(`KuzuDB: Skipped ${skippedRels}/${relCount} relations (top by kind/pair):`, topSkipped); - } - } - - // 6. Verify results - let totalNodes = 0; - for (const tableName of NODE_TABLES) { - try { - const countRes = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); - const countRow = await countRes.getNext(); - const count = countRow ? (countRow.cnt ?? countRow[0] ?? 0) : 0; - totalNodes += Number(count); - } catch { - // Table might be empty, skip - } - } - - if (import.meta.env.DEV) console.log(`✅ KuzuDB Bulk Load Complete. Total nodes: ${totalNodes}, edges: ${insertedRels}`); - - // 7. Cleanup CSV files - for (const { path } of nodeFiles) { - try { await fs.unlink(path); } catch {} - } - - return { success: true, count: totalNodes }; - - } catch (error) { - if (import.meta.env.DEV) console.error('❌ KuzuDB Bulk Load Failed:', error); - return { success: false, count: 0 }; + if (!conn) { + throw new Error('KuzuDB not initialized. Call initKuzu first.'); } + + const csvData = generateAllCSVs(graph, fileContents); + const csvDir = path.join(storagePath, 'csv'); + await fs.mkdir(csvDir, { recursive: true }); + + const nodeFiles: Array<{ table: NodeTableName; path: string }> = []; + for (const [tableName, csv] of csvData.nodes.entries()) { + if (csv.split('\n').length <= 1) continue; + const filePath = path.join(csvDir, `${tableName.toLowerCase()}.csv`); + await fs.writeFile(filePath, csv, 'utf-8'); + nodeFiles.push({ table: tableName, path: filePath }); + } + + const relLines = csvData.relCSV.split('\n').slice(1).filter(line => line.trim()); + + for (const { table, path: filePath } of nodeFiles) { + const copyQuery = getCopyQuery(table, normalizeCopyPath(filePath)); + await conn.query(copyQuery); + } + + let insertedRels = 0; + let skippedRels = 0; + for (const line of relLines) { + try { + const match = line.match(/"([^"]*)","([^"]*)","([^"]*)",([0-9.]+),"([^"]*)",([0-9-]+)/); + if (!match) continue; + const [, fromId, toId, relType, confidenceStr, reason, stepStr] = match; + const confidence = parseFloat(confidenceStr) || 1.0; + const step = parseInt(stepStr) || 0; + + const getNodeLabel = (nodeId: string): string => { + if (nodeId.startsWith('comm_')) return 'Community'; + if (nodeId.startsWith('proc_')) return 'Process'; + return nodeId.split(':')[0]; + }; + + const RESERVED_LABELS = ['Macro', 'Enum', 'Union', 'Const', 'Module', 'Struct']; + const escapeLabel = (label: string): string => { + return RESERVED_LABELS.includes(label) ? `\`${label}\`` : label; + }; + + const fromLabel = escapeLabel(getNodeLabel(fromId)); + const toLabel = escapeLabel(getNodeLabel(toId)); + + const insertQuery = ` + MATCH (a:${fromLabel} {id: '${fromId.replace(/'/g, "''")}' }), + (b:${toLabel} {id: '${toId.replace(/'/g, "''")}' }) + CREATE (a)-[:${REL_TABLE_NAME} {type: '${relType}', confidence: ${confidence}, reason: '${reason.replace(/'/g, "''")}', step: ${step}}]->(b) + `; + await conn.query(insertQuery); + insertedRels++; + } catch { + skippedRels++; + } + } + + // Cleanup CSVs + for (const { path: filePath } of nodeFiles) { + try { + await fs.unlink(filePath); + } catch { + // ignore + } + } + + return { success: true, insertedRels, skippedRels }; }; -/** - * Get the COPY query for a node table with correct column mapping - */ -const getCopyQuery = (table: NodeTableName, path: string): string => { - // File and Folder have different columns than code elements +const getCopyQuery = (table: NodeTableName, filePath: string): string => { if (table === 'File') { - return `COPY File(id, name, filePath, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY File(id, name, filePath, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; } if (table === 'Folder') { - return `COPY Folder(id, name, filePath) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY Folder(id, name, filePath) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; } if (table === 'Community') { - return `COPY Community(id, label, heuristicLabel, keywords, description, enrichedBy, cohesion, symbolCount) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY Community(id, label, heuristicLabel, keywords, description, enrichedBy, cohesion, symbolCount) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; } if (table === 'Process') { - return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; } - // All code element tables: Function, Class, Interface, Method, CodeElement - return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${filePath}" (HEADER=true, PARALLEL=false)`; }; -/** - * Execute a Cypher query against the database - * Returns results as named objects (not tuples) for better usability - */ export const executeQuery = async (cypher: string): Promise => { if (!conn) { - await initKuzu(); - } - - try { - const result = await conn.query(cypher); - - // Extract column names from RETURN clause - const returnMatch = cypher.match(/RETURN\s+(.+?)(?:\s+ORDER|\s+LIMIT|\s+SKIP|\s*$)/is); - let columnNames: string[] = []; - if (returnMatch) { - // Parse RETURN clause to get column names/aliases - // Handles: "a.name, b.filePath AS path, count(x) AS cnt" - const returnClause = returnMatch[1]; - columnNames = returnClause.split(',').map(col => { - col = col.trim(); - // Check for AS alias - const asMatch = col.match(/\s+AS\s+(\w+)\s*$/i); - if (asMatch) return asMatch[1]; - // Check for property access like n.name - const propMatch = col.match(/\.(\w+)\s*$/); - if (propMatch) return propMatch[1]; - // Check for function call like count(x) - const funcMatch = col.match(/^(\w+)\s*\(/); - if (funcMatch) return funcMatch[1]; - // Just use as-is if simple identifier - return col.replace(/[^a-zA-Z0-9_]/g, '_'); - }); - } - - // Collect all rows - const rows: any[] = []; - while (await result.hasNext()) { - const row = await result.getNext(); - - // Convert tuple to named object if we have column names and row is array - if (Array.isArray(row) && columnNames.length === row.length) { - const namedRow: Record = {}; - for (let i = 0; i < row.length; i++) { - namedRow[columnNames[i]] = row[i]; - } - rows.push(namedRow); - } else { - // Already an object or column count doesn't match - rows.push(row); - } - } - - return rows; - } catch (error) { - if (import.meta.env.DEV) console.error('Query execution failed:', error); - throw error; + throw new Error('KuzuDB not initialized. Call initKuzu first.'); } + + const queryResult = await conn.query(cypher); + // kuzu v0.11 uses getAll() instead of hasNext()/getNext() + // Query returns QueryResult for single queries, QueryResult[] for multi-statement + const result = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const rows = await result.getAll(); + return rows; }; -/** - * Get database statistics - */ -export const getKuzuStats = async (): Promise<{ nodes: number; edges: number }> => { +export const executeWithReusedStatement = async ( + cypher: string, + paramsList: Array> +): Promise => { if (!conn) { - return { nodes: 0, edges: 0 }; + throw new Error('KuzuDB not initialized. Call initKuzu first.'); } + if (paramsList.length === 0) return; - try { - // Count nodes across all tables - let totalNodes = 0; - for (const tableName of NODE_TABLES) { - try { - const nodeResult = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); - const nodeRow = await nodeResult.getNext(); - totalNodes += Number(nodeRow?.cnt ?? nodeRow?.[0] ?? 0); - } catch { - // Table might not exist or be empty - } + const SUB_BATCH_SIZE = 4; + for (let i = 0; i < paramsList.length; i += SUB_BATCH_SIZE) { + const subBatch = paramsList.slice(i, i + SUB_BATCH_SIZE); + const stmt = await conn.prepare(cypher); + if (!stmt.isSuccess()) { + const errMsg = await stmt.getErrorMessage(); + throw new Error(`Prepare failed: ${errMsg}`); } - - // Count edges from single relation table - let totalEdges = 0; try { - const edgeResult = await conn.query(`MATCH ()-[r:${REL_TABLE_NAME}]->() RETURN count(r) AS cnt`); - const edgeRow = await edgeResult.getNext(); - totalEdges = Number(edgeRow?.cnt ?? edgeRow?.[0] ?? 0); - } catch { - // Table might not exist or be empty + for (const params of subBatch) { + await conn.execute(stmt, params); + } + } catch (e) { + // Log the error and continue with next batch + console.warn('Batch execution error:', e); } - - return { nodes: totalNodes, edges: totalEdges }; - } catch (error) { - if (import.meta.env.DEV) { - console.warn('Failed to get Kuzu stats:', error); - } - return { nodes: 0, edges: 0 }; + // Note: kuzu 0.8.2 PreparedStatement doesn't require explicit close() } }; -/** - * Check if KuzuDB is initialized and has data - */ -export const isKuzuReady = (): boolean => { - return conn !== null && db !== null; +export const getKuzuStats = async (): Promise<{ nodes: number; edges: number }> => { + if (!conn) return { nodes: 0, edges: 0 }; + + let totalNodes = 0; + for (const tableName of NODE_TABLES) { + try { + const queryResult = await conn.query(`MATCH (n:${tableName}) RETURN count(n) AS cnt`); + const nodeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const nodeRows = await nodeResult.getAll(); + if (nodeRows.length > 0) { + totalNodes += Number(nodeRows[0]?.cnt ?? nodeRows[0]?.[0] ?? 0); + } + } catch { + // ignore + } + } + + let totalEdges = 0; + try { + const queryResult = await conn.query(`MATCH ()-[r:${REL_TABLE_NAME}]->() RETURN count(r) AS cnt`); + const edgeResult = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const edgeRows = await edgeResult.getAll(); + if (edgeRows.length > 0) { + totalEdges = Number(edgeRows[0]?.cnt ?? edgeRows[0]?.[0] ?? 0); + } + } catch { + // ignore + } + + return { nodes: totalNodes, edges: totalEdges }; }; -/** - * Close the database connection (cleanup) - */ export const closeKuzu = async (): Promise => { if (conn) { try { @@ -366,155 +233,11 @@ export const closeKuzu = async (): Promise => { } catch {} db = null; } - kuzu = null; }; -/** - * Execute a prepared statement with parameters - * @param cypher - Cypher query with $param placeholders - * @param params - Object mapping param names to values - * @returns Query results - */ -export const executePrepared = async ( - cypher: string, - params: Record -): Promise => { - if (!conn) { - await initKuzu(); - } - - try { - const stmt = await conn.prepare(cypher); - if (!stmt.isSuccess()) { - const errMsg = await stmt.getErrorMessage(); - throw new Error(`Prepare failed: ${errMsg}`); - } - - const result = await conn.execute(stmt, params); - - const rows: any[] = []; - while (await result.hasNext()) { - const row = await result.getNext(); - rows.push(row); - } - - await stmt.close(); - return rows; - } catch (error) { - if (import.meta.env.DEV) console.error('Prepared query failed:', error); - throw error; - } -}; +export const isKuzuReady = (): boolean => conn !== null && db !== null; + +export const getEmbeddingTableName = (): string => EMBEDDING_TABLE_NAME; + -/** - * Execute a prepared statement with multiple parameter sets in small sub-batches - */ -export const executeWithReusedStatement = async ( - cypher: string, - paramsList: Array> -): Promise => { - if (!conn) { - await initKuzu(); - } - - if (paramsList.length === 0) return; - - const SUB_BATCH_SIZE = 4; - - for (let i = 0; i < paramsList.length; i += SUB_BATCH_SIZE) { - const subBatch = paramsList.slice(i, i + SUB_BATCH_SIZE); - - const stmt = await conn.prepare(cypher); - if (!stmt.isSuccess()) { - const errMsg = await stmt.getErrorMessage(); - throw new Error(`Prepare failed: ${errMsg}`); - } - - try { - for (const params of subBatch) { - await conn.execute(stmt, params); - } - } finally { - await stmt.close(); - } - - if (i + SUB_BATCH_SIZE < paramsList.length) { - await new Promise(r => setTimeout(r, 0)); - } - } -}; -/** - * Test if array parameters work with prepared statements - */ -export const testArrayParams = async (): Promise<{ success: boolean; error?: string }> => { - if (!conn) { - await initKuzu(); - } - - try { - const testEmbedding = new Array(384).fill(0).map((_, i) => i / 384); - - // Get any node ID to test with (try File first, then others) - let testNodeId: string | null = null; - for (const tableName of NODE_TABLES) { - try { - const nodeResult = await conn.query(`MATCH (n:${tableName}) RETURN n.id AS id LIMIT 1`); - const nodeRow = await nodeResult.getNext(); - if (nodeRow) { - testNodeId = nodeRow.id ?? nodeRow[0]; - break; - } - } catch {} - } - - if (!testNodeId) { - return { success: false, error: 'No nodes found to test with' }; - } - - if (import.meta.env.DEV) { - console.log('🧪 Testing array params with node:', testNodeId); - } - - // First create an embedding entry - const createQuery = `CREATE (e:${EMBEDDING_TABLE_NAME} {nodeId: $nodeId, embedding: $embedding})`; - const stmt = await conn.prepare(createQuery); - - if (!stmt.isSuccess()) { - const errMsg = await stmt.getErrorMessage(); - return { success: false, error: `Prepare failed: ${errMsg}` }; - } - - await conn.execute(stmt, { - nodeId: testNodeId, - embedding: testEmbedding, - }); - - await stmt.close(); - - // Verify it was stored - const verifyResult = await conn.query( - `MATCH (e:${EMBEDDING_TABLE_NAME} {nodeId: '${testNodeId}'}) RETURN e.embedding AS emb` - ); - const verifyRow = await verifyResult.getNext(); - const storedEmb = verifyRow?.emb ?? verifyRow?.[0]; - - if (storedEmb && Array.isArray(storedEmb) && storedEmb.length === 384) { - if (import.meta.env.DEV) { - console.log('✅ Array params WORK! Stored embedding length:', storedEmb.length); - } - return { success: true }; - } else { - return { - success: false, - error: `Embedding not stored correctly. Got: ${typeof storedEmb}, length: ${storedEmb?.length}` - }; - } - } catch (error) { - const errorMsg = error instanceof Error ? error.message : String(error); - if (import.meta.env.DEV) { - console.error('❌ Array params test failed:', errorMsg); - } - return { success: false, error: errorMsg }; - } -}; diff --git a/gitnexus/src/core/search/bm25-index.ts b/gitnexus/src/core/search/bm25-index.ts index 4b745bd72..5a64f3c12 100644 --- a/gitnexus/src/core/search/bm25-index.ts +++ b/gitnexus/src/core/search/bm25-index.ts @@ -6,6 +6,7 @@ */ import MiniSearch from 'minisearch'; +import fs from 'fs/promises'; export interface BM25Document { id: string; // File path @@ -82,7 +83,8 @@ export const buildBM25Index = (fileContents: Map): number => { searchIndex.addAll(documents); indexedDocCount = documents.length; - if (import.meta.env.DEV) { + const isDev = process.env.NODE_ENV !== 'production'; + if (isDev) { console.log(`📚 BM25 index built: ${indexedDocCount} documents`); } @@ -145,6 +147,46 @@ export const clearBM25Index = (): void => { indexedDocCount = 0; }; +/** + * Export the BM25 index to disk + */ +export const exportBM25Index = async (filePath: string): Promise => { + if (!searchIndex) return; + const json = JSON.stringify(searchIndex.toJSON()); + await fs.writeFile(filePath, json, 'utf-8'); +}; + +/** + * Load a BM25 index from disk + */ +export const loadBM25Index = async (filePath: string): Promise => { + try { + const json = await fs.readFile(filePath, 'utf-8'); + const data = JSON.parse(json); + searchIndex = MiniSearch.loadJSON(data, { + fields: ['content', 'name'], + storeFields: ['id'], + tokenize: (text: string) => { + const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); + const expanded: string[] = []; + for (const token of tokens) { + if (token.length === 0) continue; + const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); + expanded.push(...camelParts); + if (camelParts.length > 1) { + expanded.push(token); + } + } + return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); + }, + }); + indexedDocCount = searchIndex.documentCount; + return true; + } catch { + return false; + } +}; + /** * Common stop words to filter out (too common to be useful) */ diff --git a/gitnexus/src/core/search/hybrid-search.ts b/gitnexus/src/core/search/hybrid-search.ts index 247bb2783..4af6f3700 100644 --- a/gitnexus/src/core/search/hybrid-search.ts +++ b/gitnexus/src/core/search/hybrid-search.ts @@ -8,8 +8,8 @@ * production search systems. */ -import { searchBM25, isBM25Ready, type BM25SearchResult } from './bm25-index'; -import type { SemanticSearchResult } from '../embeddings/types'; +import { searchBM25, isBM25Ready, type BM25SearchResult } from './bm25-index.js'; +import type { SemanticSearchResult } from '../embeddings/types.js'; /** * RRF constant - standard value used in the literature @@ -144,6 +144,21 @@ export const formatHybridResults = (results: HybridSearchResult[]): string => { return `Found ${results.length} results:\n\n${formatted.join('\n\n')}`; }; +/** + * Execute BM25 + semantic search and merge with RRF. + * The semanticSearch function is injected to keep this module environment-agnostic. + */ +export const hybridSearch = async ( + query: string, + limit: number, + executeQuery: (cypher: string) => Promise, + semanticSearch: (executeQuery: (cypher: string) => Promise, query: string, k?: number) => Promise +): Promise => { + const bm25Results = isBM25Ready() ? searchBM25(query, limit) : []; + const semanticResults = await semanticSearch(executeQuery, query, limit); + return mergeWithRRF(bm25Results, semanticResults, limit); +}; + diff --git a/gitnexus/src/core/tree-sitter/parser-loader.ts b/gitnexus/src/core/tree-sitter/parser-loader.ts index d5224ca4e..cdca3003d 100644 --- a/gitnexus/src/core/tree-sitter/parser-loader.ts +++ b/gitnexus/src/core/tree-sitter/parser-loader.ts @@ -1,72 +1,45 @@ -import Parser from 'web-tree-sitter'; -import { SupportedLanguages } from '../../config/supported-languages'; +import Parser from 'tree-sitter'; +import JavaScript from 'tree-sitter-javascript'; +import TypeScript from 'tree-sitter-typescript'; +import Python from 'tree-sitter-python'; +import Java from 'tree-sitter-java'; +import C from 'tree-sitter-c'; +import CPP from 'tree-sitter-cpp'; +import CSharp from 'tree-sitter-c-sharp'; +import Go from 'tree-sitter-go'; +import Rust from 'tree-sitter-rust'; +import { SupportedLanguages } from '../../config/supported-languages.js'; let parser: Parser | null = null; -// Cache the compiled Language objects to avoid fetching/compiling twice -const languageCache = new Map(); +const languageMap: Record = { + [SupportedLanguages.JavaScript]: JavaScript, + [SupportedLanguages.TypeScript]: TypeScript.typescript, + [`${SupportedLanguages.TypeScript}:tsx`]: TypeScript.tsx, + [SupportedLanguages.Python]: Python, + [SupportedLanguages.Java]: Java, + [SupportedLanguages.C]: C, + [SupportedLanguages.CPlusPlus]: CPP, + [SupportedLanguages.CSharp]: CSharp, + [SupportedLanguages.Go]: Go, + [SupportedLanguages.Rust]: Rust, +}; export const loadParser = async (): Promise => { - if (parser) return parser; - - await Parser.init({ - locateFile: (scriptName: string) => { - return `/wasm/${scriptName}`; - } - }) - - parser = new Parser(); - return parser; -} - -// Get the appropriate WASM file based on language and file extension -const getWasmPath = (language: SupportedLanguages, filePath?: string): string => { - // For TypeScript, check if it's a TSX file - if (language === SupportedLanguages.TypeScript) { - if (filePath?.endsWith('.tsx')) { - return '/wasm/typescript/tree-sitter-tsx.wasm'; - } - return '/wasm/typescript/tree-sitter-typescript.wasm'; - } - - const languageFileMap: Record = { - [SupportedLanguages.JavaScript]: '/wasm/javascript/tree-sitter-javascript.wasm', - [SupportedLanguages.TypeScript]: '/wasm/typescript/tree-sitter-typescript.wasm', - [SupportedLanguages.Python]: '/wasm/python/tree-sitter-python.wasm', - [SupportedLanguages.Java]: '/wasm/java/tree-sitter-java.wasm', - [SupportedLanguages.C]: '/wasm/c/tree-sitter-c.wasm', - [SupportedLanguages.CPlusPlus]: '/wasm/cpp/tree-sitter-cpp.wasm', - [SupportedLanguages.CSharp]: '/wasm/csharp/tree-sitter-csharp.wasm', - [SupportedLanguages.Go]: '/wasm/go/tree-sitter-go.wasm', - [SupportedLanguages.Rust]: '/wasm/rust/tree-sitter-rust.wasm', - }; - - return languageFileMap[language]; + if (parser) return parser; + parser = new Parser(); + return parser; }; export const loadLanguage = async (language: SupportedLanguages, filePath?: string): Promise => { - if (!parser) await loadParser(); - const wasmPath = getWasmPath(language, filePath); - - if (languageCache.has(wasmPath)) { - parser!.setLanguage(languageCache.get(wasmPath)!); - return; - } + if (!parser) await loadParser(); + const key = language === SupportedLanguages.TypeScript && filePath?.endsWith('.tsx') + ? `${language}:tsx` + : language; - if (!wasmPath) { - console.error(`❌ [Parser] No WASM path configured for language: ${language}`); - throw new Error(`Unsupported language: ${language}`); - } - - try { - const loadedLanguage = await Parser.Language.load(wasmPath); - languageCache.set(wasmPath, loadedLanguage); - parser!.setLanguage(loadedLanguage); - } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : String(error); - console.error(`❌ [Parser] Failed to load WASM grammar for ${language}`); - console.error(` WASM Path: ${wasmPath}`); - console.error(` Error: ${errorMessage}`); - throw new Error(`Failed to load grammar for ${language}: ${errorMessage}`); - } -} + const lang = languageMap[key]; + if (!lang) { + throw new Error(`Unsupported language: ${language}`); + } + parser!.setLanguage(lang); +}; diff --git a/gitnexus/src/mcp/core/bm25-index.ts b/gitnexus/src/mcp/core/bm25-index.ts new file mode 100644 index 000000000..b13d6aebd --- /dev/null +++ b/gitnexus/src/mcp/core/bm25-index.ts @@ -0,0 +1,120 @@ +/** + * BM25 Full-Text Search Index (Read-Only) + * + * Uses MiniSearch for fast keyword-based search with BM25 ranking. + * For MCP, we only load and search - not build. + */ + +import MiniSearch from 'minisearch'; +import fs from 'fs/promises'; + +export interface BM25Document { + id: string; // File path + content: string; // File content + name: string; // File name (boosted in search) +} + +export interface BM25SearchResult { + filePath: string; + score: number; + rank: number; +} + +let searchIndex: MiniSearch | null = null; +let indexedDocCount = 0; + +/** + * Common stop words to filter out + */ +const STOP_WORDS = new Set([ + 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', + 'class', 'new', 'this', 'import', 'export', 'from', 'default', 'async', 'await', + 'try', 'catch', 'throw', 'typeof', 'instanceof', 'true', 'false', 'null', 'undefined', + 'the', 'is', 'at', 'which', 'on', 'a', 'an', 'and', 'or', 'but', 'in', 'with', + 'to', 'of', 'it', 'be', 'as', 'by', 'that', 'for', 'are', 'was', 'were', +]); + +/** + * Tokenizer for BM25 search + */ +const tokenize = (text: string): string[] => { + const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); + const expanded: string[] = []; + for (const token of tokens) { + if (token.length === 0) continue; + const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); + expanded.push(...camelParts); + if (camelParts.length > 1) { + expanded.push(token); + } + } + return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); +}; + +/** + * Load a BM25 index from disk + */ +export const loadBM25Index = async (filePath: string): Promise => { + try { + const json = await fs.readFile(filePath, 'utf-8'); + // MiniSearch.loadJSON expects the raw JSON string, not a parsed object + searchIndex = MiniSearch.loadJSON(json, { + fields: ['content', 'name'], + storeFields: ['id'], + tokenize, + }); + indexedDocCount = searchIndex.documentCount; + return true; + } catch { + return false; + } +}; + +/** + * Search the BM25 index + */ +export const searchBM25 = (query: string, limit: number = 20): BM25SearchResult[] => { + if (!searchIndex) { + return []; + } + + const results = searchIndex.search(query, { + fuzzy: 0.2, + prefix: true, + boost: { name: 2 }, + }); + + return results.slice(0, limit).map((r, index) => ({ + filePath: r.id, + score: r.score, + rank: index + 1, + })); +}; + +/** + * Check if the BM25 index is ready + */ +export const isBM25Ready = (): boolean => { + return searchIndex !== null && indexedDocCount > 0; +}; + +/** + * Get index statistics + */ +export const getBM25Stats = (): { documentCount: number; termCount: number } => { + if (!searchIndex) { + return { documentCount: 0, termCount: 0 }; + } + return { + documentCount: indexedDocCount, + termCount: searchIndex.termCount, + }; +}; + +/** + * Clear the index + */ +export const clearBM25Index = (): void => { + searchIndex = null; + indexedDocCount = 0; +}; diff --git a/gitnexus/src/mcp/core/embedder.ts b/gitnexus/src/mcp/core/embedder.ts new file mode 100644 index 000000000..2979ddc53 --- /dev/null +++ b/gitnexus/src/mcp/core/embedder.ts @@ -0,0 +1,110 @@ +/** + * Embedder Module (Read-Only) + * + * Singleton factory for transformers.js embedding pipeline. + * For MCP, we only need to compute query embeddings, not batch embed. + */ + +import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; + +// Model config +const MODEL_ID = 'Snowflake/snowflake-arctic-embed-xs'; +const EMBEDDING_DIMS = 384; + +// Module-level state for singleton pattern +let embedderInstance: FeatureExtractionPipeline | null = null; +let isInitializing = false; +let initPromise: Promise | null = null; + +/** + * Initialize the embedding model (lazy, on first search) + */ +export const initEmbedder = async (): Promise => { + if (embedderInstance) { + return embedderInstance; + } + + if (isInitializing && initPromise) { + return initPromise; + } + + isInitializing = true; + + initPromise = (async () => { + try { + env.allowLocalModels = false; + + console.error('GitNexus: Loading embedding model (first search may take a moment)...'); + + // Try WebGPU first (Windows DirectX12), fall back to CPU + const devicesToTry: Array<'webgpu' | 'cpu'> = ['webgpu', 'cpu']; + + for (const device of devicesToTry) { + try { + embedderInstance = await (pipeline as any)( + 'feature-extraction', + MODEL_ID, + { + device: device, + dtype: 'fp32', + } + ); + console.error(`GitNexus: Embedding model loaded (${device})`); + return embedderInstance!; + } catch { + if (device === 'cpu') throw new Error('Failed to load embedding model'); + } + } + + throw new Error('No suitable device found'); + } catch (error) { + isInitializing = false; + initPromise = null; + embedderInstance = null; + throw error; + } finally { + isInitializing = false; + } + })(); + + return initPromise; +}; + +/** + * Check if embedder is ready + */ +export const isEmbedderReady = (): boolean => embedderInstance !== null; + +/** + * Embed a query text for semantic search + */ +export const embedQuery = async (query: string): Promise => { + const embedder = await initEmbedder(); + + const result = await embedder(query, { + pooling: 'mean', + normalize: true, + }); + + return Array.from(result.data as ArrayLike); +}; + +/** + * Get embedding dimensions + */ +export const getEmbeddingDims = (): number => EMBEDDING_DIMS; + +/** + * Cleanup embedder + */ +export const disposeEmbedder = async (): Promise => { + if (embedderInstance) { + try { + if ('dispose' in embedderInstance && typeof embedderInstance.dispose === 'function') { + await embedderInstance.dispose(); + } + } catch {} + embedderInstance = null; + initPromise = null; + } +}; diff --git a/gitnexus/src/mcp/core/kuzu-adapter.ts b/gitnexus/src/mcp/core/kuzu-adapter.ts new file mode 100644 index 000000000..80a063b05 --- /dev/null +++ b/gitnexus/src/mcp/core/kuzu-adapter.ts @@ -0,0 +1,54 @@ +/** + * KuzuDB Adapter (Read-Only) + * + * Simplified adapter for MCP that only reads from existing .gitnexus/ database. + */ + +import fs from 'fs/promises'; +import path from 'path'; +import kuzu from 'kuzu'; + +let db: kuzu.Database | null = null; +let conn: kuzu.Connection | null = null; + +export const initKuzu = async (dbPath: string): Promise => { + if (conn) return; + + // Check if database exists + try { + await fs.stat(dbPath); + } catch { + throw new Error(`KuzuDB not found at ${dbPath}. Run: gitnexus analyze`); + } + + db = new kuzu.Database(dbPath); + conn = new kuzu.Connection(db); +}; + +export const executeQuery = async (cypher: string): Promise => { + if (!conn) { + throw new Error('KuzuDB not initialized. Call initKuzu first.'); + } + + const queryResult = await conn.query(cypher); + const result = Array.isArray(queryResult) ? queryResult[0] : queryResult; + const rows = await result.getAll(); + return rows; +}; + +export const closeKuzu = async (): Promise => { + if (conn) { + try { + await conn.close(); + } catch {} + conn = null; + } + if (db) { + try { + await db.close(); + } catch {} + db = null; + } +}; + +export const isKuzuReady = (): boolean => conn !== null && db !== null; diff --git a/gitnexus/src/mcp/local/local-backend.ts b/gitnexus/src/mcp/local/local-backend.ts new file mode 100644 index 000000000..4bcd13bcf --- /dev/null +++ b/gitnexus/src/mcp/local/local-backend.ts @@ -0,0 +1,718 @@ +/** + * Local Backend + * + * Provides tool implementations using local .gitnexus/ index. + * This enables MCP to work without the browser. + */ + +import fs from 'fs/promises'; +import path from 'path'; +import { initKuzu, executeQuery, closeKuzu, isKuzuReady } from '../core/kuzu-adapter.js'; +import { loadBM25Index, searchBM25, isBM25Ready } from '../core/bm25-index.js'; +import { embedQuery, getEmbeddingDims, disposeEmbedder } from '../core/embedder.js'; + +export interface RepoMeta { + repoPath: string; + lastCommit: string; + indexedAt: string; + stats?: { + files?: number; + nodes?: number; + edges?: number; + communities?: number; + processes?: number; + }; +} + +export interface IndexedRepo { + repoPath: string; + storagePath: string; + kuzuPath: string; + bm25Path: string; + metaPath: string; + meta: RepoMeta; +} + +const GITNEXUS_DIR = '.gitnexus'; + +function getStoragePaths(repoPath: string) { + const storagePath = path.join(path.resolve(repoPath), GITNEXUS_DIR); + return { + storagePath, + kuzuPath: path.join(storagePath, 'kuzu'), + bm25Path: path.join(storagePath, 'bm25.json'), + metaPath: path.join(storagePath, 'meta.json'), + }; +} + +async function loadMeta(storagePath: string): Promise { + try { + // Verify both meta.json and kuzu exist for a valid index + const metaPath = path.join(storagePath, 'meta.json'); + const kuzuPath = path.join(storagePath, 'kuzu'); + + // Check kuzu exists (can be file or directory depending on how it was saved) + try { + await fs.stat(kuzuPath); + } catch { + return null; // kuzu doesn't exist + } + + // Load and parse meta.json + const raw = await fs.readFile(metaPath, 'utf-8'); + return JSON.parse(raw) as RepoMeta; + } catch { + return null; + } +} + +async function loadRepo(repoPath: string): Promise { + const paths = getStoragePaths(repoPath); + const meta = await loadMeta(paths.storagePath); + if (!meta) return null; + + return { + repoPath: path.resolve(repoPath), + ...paths, + meta, + }; +} + +export async function findRepo(startPath: string): Promise { + let current = path.resolve(startPath); + const root = path.parse(current).root; + + while (current !== root) { + const repo = await loadRepo(current); + if (repo) return repo; + current = path.dirname(current); + } + + return null; +} + +export interface CodebaseContext { + projectName: string; + stats: { + fileCount: number; + functionCount: number; + classCount: number; + interfaceCount: number; + methodCount: number; + communityCount: number; + processCount: number; + }; + hotspots: Array<{ + name: string; + type: string; + filePath: string; + connections: number; + }>; + folderTree: string; +} + +export class LocalBackend { + private repo: IndexedRepo | null = null; + private _context: CodebaseContext | null = null; + private initialized = false; + + async init(cwd: string): Promise { + this.repo = await findRepo(cwd); + if (!this.repo) return false; + + const stats = this.repo.meta.stats || {}; + this._context = { + projectName: path.basename(this.repo.repoPath), + stats: { + fileCount: stats.files || 0, + functionCount: stats.nodes || 0, + classCount: 0, + interfaceCount: 0, + methodCount: 0, + communityCount: stats.communities || 0, + processCount: stats.processes || 0, + }, + hotspots: [], + folderTree: '', + }; + + return true; + } + + private async ensureInitialized(): Promise { + if (this.initialized || !this.repo) return; + + await initKuzu(this.repo.kuzuPath); + await loadBM25Index(this.repo.bm25Path); + this.initialized = true; + } + + get context(): CodebaseContext | null { + return this._context; + } + + get isReady(): boolean { + return this.repo !== null; + } + + get repoPath(): string | null { + return this.repo?.repoPath || null; + } + + get storagePath(): string | null { + return this.repo?.storagePath || null; + } + + async callTool(method: string, params: any): Promise { + if (!this.repo) { + throw new Error('Repository not indexed. Run: gitnexus analyze'); + } + + switch (method) { + case 'context': + return this.getContext(); + case 'search': + return this.search(params); + case 'cypher': + return this.cypher(params); + case 'overview': + return this.overview(params); + case 'explore': + return this.explore(params); + case 'impact': + return this.impact(params); + case 'analyze': + return this.analyze(params); + default: + throw new Error(`Unknown tool: ${method}`); + } + } + + private async getContext(): Promise { + if (!this._context || !this.repo) { + return 'Repository not indexed. Run: gitnexus analyze'; + } + + const stats = this.repo.meta.stats || {}; + return [ + `# GitNexus: ${this._context.projectName}`, + '', + '## Stats', + `- Files: ${stats.files || 0}`, + `- Nodes: ${stats.nodes || 0}`, + `- Edges: ${stats.edges || 0}`, + `- Communities: ${stats.communities || 0}`, + `- Processes: ${stats.processes || 0}`, + '', + `Indexed: ${this.repo.meta.indexedAt}`, + `Commit: ${this.repo.meta.lastCommit?.slice(0, 7)}`, + '', + '## Available Tools', + '- **analyze**: Index/re-index repository', + '- **search**: Hybrid semantic + keyword search', + '- **cypher**: Graph queries (Cypher)', + '- **overview**: List communities and processes', + '- **explore**: Deep dive on symbol/cluster/process', + '- **impact**: Change impact analysis', + ].join('\n'); + } + + private async search(params: { query: string; limit?: number; depth?: string; groupByProcess?: boolean }): Promise { + await this.ensureInitialized(); + + const limit = params.limit || 10; + const query = params.query; + const depth = params.depth || 'definitions'; + + // Run BM25 and semantic search in parallel + const [bm25Results, semanticResults] = await Promise.all([ + this.bm25Search(query, limit * 2), + this.semanticSearch(query, limit * 2), + ]); + + // Merge and deduplicate results using reciprocal rank fusion + const scoreMap = new Map(); + + // BM25 results + for (let i = 0; i < bm25Results.length; i++) { + const result = bm25Results[i]; + const key = result.filePath; + const rrfScore = 1 / (60 + i); // RRF formula with k=60 + const existing = scoreMap.get(key); + if (existing) { + existing.score += rrfScore; + existing.source = 'hybrid'; + } else { + scoreMap.set(key, { score: rrfScore, source: 'bm25', data: result }); + } + } + + // Semantic results + for (let i = 0; i < semanticResults.length; i++) { + const result = semanticResults[i]; + const key = result.filePath; + const rrfScore = 1 / (60 + i); + const existing = scoreMap.get(key); + if (existing) { + existing.score += rrfScore; + existing.source = 'hybrid'; + } else { + scoreMap.set(key, { score: rrfScore, source: 'semantic', data: result }); + } + } + + // Sort by fused score and take top results + const merged = Array.from(scoreMap.entries()) + .sort((a, b) => b[1].score - a[1].score) + .slice(0, limit); + + // Enrich with graph data + const results: any[] = []; + + for (const [_, item] of merged) { + const result = item.data; + result.searchSource = item.source; + result.fusedScore = item.score; + + // Add relationships if depth is 'full' and we have a node ID + if (depth === 'full' && result.nodeId) { + try { + const relQuery = ` + MATCH (n {id: '${result.nodeId.replace(/'/g, "''")}'})-[r:CodeRelation]->(m) + RETURN r.type AS type, m.name AS targetName, m.filePath AS targetPath + LIMIT 5 + `; + const rels = await executeQuery(relQuery); + result.connections = rels.map((rel: any) => ({ + type: rel.type || rel[0], + name: rel.targetName || rel[1], + path: rel.targetPath || rel[2], + })); + } catch { + result.connections = []; + } + } + + results.push(result); + } + + return results; + } + + /** + * BM25 keyword search helper + */ + private async bm25Search(query: string, limit: number): Promise { + if (!isBM25Ready()) return []; + + const bm25Results = searchBM25(query, limit); + const results: any[] = []; + + for (const bm25Result of bm25Results) { + const fileName = bm25Result.filePath.split('/').pop() || bm25Result.filePath; + try { + const symbolQuery = ` + MATCH (n) + WHERE n.filePath CONTAINS '${fileName.replace(/'/g, "''")}' + RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine + LIMIT 3 + `; + const symbols = await executeQuery(symbolQuery); + + if (symbols.length > 0) { + for (const sym of symbols) { + results.push({ + nodeId: sym.id || sym[0], + name: sym.name || sym[1], + type: sym.type || sym[2], + filePath: sym.filePath || sym[3], + startLine: sym.startLine || sym[4], + endLine: sym.endLine || sym[5], + bm25Score: bm25Result.score, + }); + } + } else { + results.push({ + name: fileName, + type: 'File', + filePath: bm25Result.filePath, + bm25Score: bm25Result.score, + }); + } + } catch { + results.push({ + name: fileName, + type: 'File', + filePath: bm25Result.filePath, + bm25Score: bm25Result.score, + }); + } + } + + return results; + } + + /** + * Semantic vector search helper + */ + private async semanticSearch(query: string, limit: number): Promise { + try { + // Embed the query + const queryVec = await embedQuery(query); + const dims = getEmbeddingDims(); + const queryVecStr = `[${queryVec.join(',')}]`; + + // Query vector index + const vectorQuery = ` + CALL QUERY_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx', + CAST(${queryVecStr} AS FLOAT[${dims}]), ${limit}) + YIELD node AS emb, distance + WITH emb, distance + WHERE distance < 0.6 + RETURN emb.nodeId AS nodeId, distance + ORDER BY distance + `; + + const embResults = await executeQuery(vectorQuery); + + if (embResults.length === 0) return []; + + // Get metadata for each result + const results: any[] = []; + + for (const embRow of embResults) { + const nodeId = embRow.nodeId ?? embRow[0]; + const distance = embRow.distance ?? embRow[1]; + + // Extract label from node ID + const labelEndIdx = nodeId.indexOf(':'); + const label = labelEndIdx > 0 ? nodeId.substring(0, labelEndIdx) : 'Unknown'; + + try { + const nodeQuery = label === 'File' + ? `MATCH (n:File {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath` + : `MATCH (n:${label} {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine`; + + const nodeRows = await executeQuery(nodeQuery); + if (nodeRows.length > 0) { + const nodeRow = nodeRows[0]; + results.push({ + nodeId, + name: nodeRow.name ?? nodeRow[0] ?? '', + type: label, + filePath: nodeRow.filePath ?? nodeRow[1] ?? '', + distance, + startLine: label !== 'File' ? (nodeRow.startLine ?? nodeRow[2]) : undefined, + endLine: label !== 'File' ? (nodeRow.endLine ?? nodeRow[3]) : undefined, + }); + } + } catch {} + } + + return results; + } catch (err: any) { + // Semantic search unavailable (no embeddings or model not loaded) + console.error('GitNexus: Semantic search unavailable -', err.message); + return []; + } + } + + private async cypher(params: { query: string }): Promise { + await this.ensureInitialized(); + + if (!isKuzuReady()) { + return { error: 'KuzuDB not ready. Index may be corrupted.' }; + } + + try { + const result = await executeQuery(params.query); + return result; + } catch (err: any) { + return { error: err.message || 'Query failed' }; + } + } + + private async overview(params: { showClusters?: boolean; showProcesses?: boolean; limit?: number }): Promise { + await this.ensureInitialized(); + + const limit = params.limit || 20; + const result: any = { + repoPath: this.repo!.repoPath, + stats: this.repo!.meta.stats, + indexedAt: this.repo!.meta.indexedAt, + lastCommit: this.repo!.meta.lastCommit, + }; + + if (params.showClusters !== false) { + try { + const clusters = await executeQuery(` + MATCH (c:Community) + RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount + ORDER BY c.symbolCount DESC + LIMIT ${limit} + `); + result.clusters = clusters.map((c: any) => ({ + id: c.id || c[0], + label: c.label || c[1], + heuristicLabel: c.heuristicLabel || c[2], + cohesion: c.cohesion || c[3], + symbolCount: c.symbolCount || c[4], + })); + } catch { + result.clusters = []; + } + } + + if (params.showProcesses !== false) { + try { + const processes = await executeQuery(` + MATCH (p:Process) + RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount + ORDER BY p.stepCount DESC + LIMIT ${limit} + `); + result.processes = processes.map((p: any) => ({ + id: p.id || p[0], + label: p.label || p[1], + heuristicLabel: p.heuristicLabel || p[2], + processType: p.processType || p[3], + stepCount: p.stepCount || p[4], + })); + } catch { + result.processes = []; + } + } + + return result; + } + + private async explore(params: { name: string; type: 'symbol' | 'cluster' | 'process' }): Promise { + await this.ensureInitialized(); + + const { name, type } = params; + + if (type === 'symbol') { + // Find symbol and its context + const symbolQuery = ` + MATCH (n) + WHERE n.name = '${name.replace(/'/g, "''")}' + RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine + LIMIT 1 + `; + const symbols = await executeQuery(symbolQuery); + if (symbols.length === 0) return { error: `Symbol '${name}' not found` }; + + const sym = symbols[0]; + const symId = sym.id || sym[0]; + + // Get callers + const callersQuery = ` + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(n {id: '${symId}'}) + RETURN caller.name AS name, caller.filePath AS filePath + LIMIT 10 + `; + const callers = await executeQuery(callersQuery); + + // Get callees + const calleesQuery = ` + MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'CALLS'}]->(callee) + RETURN callee.name AS name, callee.filePath AS filePath + LIMIT 10 + `; + const callees = await executeQuery(calleesQuery); + + // Get community + const communityQuery = ` + MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community) + RETURN c.label AS label, c.heuristicLabel AS heuristicLabel + LIMIT 1 + `; + const communities = await executeQuery(communityQuery); + + return { + symbol: { + id: symId, + name: sym.name || sym[1], + type: sym.type || sym[2], + filePath: sym.filePath || sym[3], + startLine: sym.startLine || sym[4], + endLine: sym.endLine || sym[5], + }, + callers: callers.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })), + callees: callees.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })), + community: communities.length > 0 ? { + label: communities[0].label || communities[0][0], + heuristicLabel: communities[0].heuristicLabel || communities[0][1], + } : null, + }; + } + + if (type === 'cluster') { + const clusterQuery = ` + MATCH (c:Community) + WHERE c.label = '${name.replace(/'/g, "''")}' OR c.heuristicLabel = '${name.replace(/'/g, "''")}' + RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount + LIMIT 1 + `; + const clusters = await executeQuery(clusterQuery); + if (clusters.length === 0) return { error: `Cluster '${name}' not found` }; + + const cluster = clusters[0]; + const clusterId = cluster.id || cluster[0]; + + const membersQuery = ` + MATCH (n)-[:CodeRelation {type: 'MEMBER_OF'}]->(c {id: '${clusterId}'}) + RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath + LIMIT 20 + `; + const members = await executeQuery(membersQuery); + + return { + cluster: { + id: clusterId, + label: cluster.label || cluster[1], + heuristicLabel: cluster.heuristicLabel || cluster[2], + cohesion: cluster.cohesion || cluster[3], + symbolCount: cluster.symbolCount || cluster[4], + }, + members: members.map((m: any) => ({ + name: m.name || m[0], + type: m.type || m[1], + filePath: m.filePath || m[2], + })), + }; + } + + if (type === 'process') { + const processQuery = ` + MATCH (p:Process) + WHERE p.label = '${name.replace(/'/g, "''")}' OR p.heuristicLabel = '${name.replace(/'/g, "''")}' + RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount, p.entryPointId AS entryPointId, p.terminalId AS terminalId + LIMIT 1 + `; + const processes = await executeQuery(processQuery); + if (processes.length === 0) return { error: `Process '${name}' not found` }; + + const proc = processes[0]; + const procId = proc.id || proc[0]; + + const stepsQuery = ` + MATCH (n)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p {id: '${procId}'}) + RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, r.step AS step + ORDER BY r.step + `; + const steps = await executeQuery(stepsQuery); + + return { + process: { + id: procId, + label: proc.label || proc[1], + heuristicLabel: proc.heuristicLabel || proc[2], + processType: proc.processType || proc[3], + stepCount: proc.stepCount || proc[4], + }, + steps: steps.map((s: any) => ({ + step: s.step || s[3], + name: s.name || s[0], + type: s.type || s[1], + filePath: s.filePath || s[2], + })), + }; + } + + return { error: 'Invalid type. Use: symbol, cluster, or process' }; + } + + private async impact(params: { target: string; direction: 'upstream' | 'downstream'; maxDepth?: number }): Promise { + await this.ensureInitialized(); + + const { target, direction } = params; + const maxDepth = params.maxDepth || 3; + + // Find target symbol + const targetQuery = ` + MATCH (n) + WHERE n.name = '${target.replace(/'/g, "''")}' + RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath + LIMIT 1 + `; + const targets = await executeQuery(targetQuery); + if (targets.length === 0) return { error: `Target '${target}' not found` }; + + const sym = targets[0]; + const symId = sym.id || sym[0]; + + // BFS to find impacted nodes + const impacted: any[] = []; + const visited = new Set([symId]); + let frontier = [symId]; + + for (let depth = 1; depth <= maxDepth && frontier.length > 0; depth++) { + const nextFrontier: string[] = []; + + for (const nodeId of frontier) { + const query = direction === 'upstream' + ? `MATCH (caller)-[r:CodeRelation]->(n {id: '${nodeId}'}) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence` + : `MATCH (n {id: '${nodeId}'})-[r:CodeRelation]->(callee) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence`; + + const related = await executeQuery(query); + + for (const rel of related) { + const relId = rel.id || rel[0]; + if (!visited.has(relId)) { + visited.add(relId); + nextFrontier.push(relId); + impacted.push({ + depth, + id: relId, + name: rel.name || rel[1], + type: rel.type || rel[2], + filePath: rel.filePath || rel[3], + relationType: rel.relType || rel[4], + confidence: rel.confidence || rel[5] || 1.0, + }); + } + } + } + + frontier = nextFrontier; + } + + // Group by depth + const grouped: Record = {}; + for (const item of impacted) { + if (!grouped[item.depth]) grouped[item.depth] = []; + grouped[item.depth].push(item); + } + + return { + target: { + id: symId, + name: sym.name || sym[1], + type: sym.type || sym[2], + filePath: sym.filePath || sym[3], + }, + direction, + impactedCount: impacted.length, + byDepth: grouped, + }; + } + + private async analyze(params: { path?: string; force?: boolean }): Promise { + const targetPath = params.path ? path.resolve(params.path) : process.cwd(); + + return { + action: 'analyze', + targetPath, + message: `To index this repository, run:\n\n cd ${targetPath}\n gitnexus analyze${params.force ? ' --force' : ''}\n\nThis will create a .gitnexus/ folder with the knowledge graph.`, + }; + } + + async disconnect(): Promise { + closeKuzu(); + await disposeEmbedder(); + this.repo = null; + this._context = null; + this.initialized = false; + } +} diff --git a/gitnexus/src/mcp/server.ts b/gitnexus/src/mcp/server.ts new file mode 100644 index 000000000..3e77a6fde --- /dev/null +++ b/gitnexus/src/mcp/server.ts @@ -0,0 +1,180 @@ +/** + * MCP Server + * + * Model Context Protocol server that runs on stdio. + * External AI tools (Cursor, Claude) spawn this process and + * communicate via stdin/stdout using the MCP protocol. + * + * Tools: context, search, cypher, overview, explore, impact, analyze + */ + +import { Server } from '@modelcontextprotocol/sdk/server/index.js'; +import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; +import { + CallToolRequestSchema, + ListToolsRequestSchema, + ListResourcesRequestSchema, + ReadResourceRequestSchema, +} from '@modelcontextprotocol/sdk/types.js'; +import { GITNEXUS_TOOLS } from './tools.js'; +import type { LocalBackend, CodebaseContext } from './local/local-backend.js'; + +/** + * Format context as markdown for the resource + */ +function formatContextAsMarkdown(context: CodebaseContext): string { + const { projectName, stats } = context; + + const lines: string[] = []; + + lines.push(`# GitNexus: ${projectName}`); + lines.push(''); + lines.push('## Stats'); + lines.push(`- Files: ${stats.fileCount}`); + lines.push(`- Functions: ${stats.functionCount}`); + if (stats.communityCount > 0) lines.push(`- Communities: ${stats.communityCount}`); + if (stats.processCount > 0) lines.push(`- Processes: ${stats.processCount}`); + lines.push(''); + + lines.push('## Available Tools'); + lines.push(''); + lines.push('- **context**: Codebase overview and stats'); + lines.push('- **search**: Hybrid semantic + keyword search'); + lines.push('- **cypher**: Execute Cypher queries on graph'); + lines.push('- **overview**: List communities and processes'); + lines.push('- **explore**: Deep dive on symbol/cluster/process'); + lines.push('- **impact**: Change impact analysis'); + lines.push('- **analyze**: Index/re-index repository'); + lines.push(''); + + lines.push('## Graph Schema'); + lines.push(''); + lines.push('**Nodes**: File, Function, Class, Interface, Method, Community, Process'); + lines.push(''); + lines.push('**Relations**: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS'); + + return lines.join('\n'); +} + +export async function startMCPServer(backend: LocalBackend): Promise { + const server = new Server( + { + name: 'gitnexus', + version: '0.2.0', + }, + { + capabilities: { + tools: {}, + resources: {}, + }, + } + ); + + // Handle list resources request + server.setRequestHandler(ListResourcesRequestSchema, async () => { + const context = backend.context; + + if (!context) { + return { resources: [] }; + } + + return { + resources: [ + { + uri: 'gitnexus://codebase/context', + name: `GitNexus: ${context.projectName}`, + description: `Codebase context for ${context.projectName} (${context.stats.fileCount} files)`, + mimeType: 'text/markdown', + }, + ], + }; + }); + + // Handle read resource request + server.setRequestHandler(ReadResourceRequestSchema, async (request) => { + const { uri } = request.params; + + if (uri === 'gitnexus://codebase/context') { + const context = backend.context; + + if (!context) { + return { + contents: [ + { + uri, + mimeType: 'text/plain', + text: 'No codebase loaded.', + }, + ], + }; + } + + return { + contents: [ + { + uri, + mimeType: 'text/markdown', + text: formatContextAsMarkdown(context), + }, + ], + }; + } + + throw new Error(`Unknown resource: ${uri}`); + }); + + // Handle list tools request + server.setRequestHandler(ListToolsRequestSchema, async () => ({ + tools: GITNEXUS_TOOLS.map((tool) => ({ + name: tool.name, + description: tool.description, + inputSchema: tool.inputSchema, + })), + })); + + // Handle tool calls + server.setRequestHandler(CallToolRequestSchema, async (request) => { + const { name, arguments: args } = request.params; + + try { + const result = await backend.callTool(name, args); + + return { + content: [ + { + type: 'text', + text: typeof result === 'string' ? result : JSON.stringify(result, null, 2), + }, + ], + }; + } catch (error) { + const message = error instanceof Error ? error.message : 'Unknown error'; + return { + content: [ + { + type: 'text', + text: `Error: ${message}`, + }, + ], + isError: true, + }; + } + }); + + // Connect to stdio transport + const transport = new StdioServerTransport(); + await server.connect(transport); + + // Handle graceful shutdown + process.on('SIGINT', async () => { + await backend.disconnect(); + await server.close(); + process.exit(0); + }); + + process.on('SIGTERM', async () => { + await backend.disconnect(); + await server.close(); + process.exit(0); + }); +} diff --git a/gitnexus/src/mcp/tools.ts b/gitnexus/src/mcp/tools.ts new file mode 100644 index 000000000..f4d6e997c --- /dev/null +++ b/gitnexus/src/mcp/tools.ts @@ -0,0 +1,191 @@ +/** + * MCP Tool Definitions + * + * Defines the tools that GitNexus exposes to external AI agents. + * Only includes tools that provide unique value over native IDE capabilities. + */ + +export interface ToolDefinition { + name: string; + description: string; + inputSchema: { + type: 'object'; + properties: Record; + required: string[]; + }; +} + +export const GITNEXUS_TOOLS: ToolDefinition[] = [ + { + name: 'analyze', + description: `Index or re-index the current repository. + +Creates .gitnexus/ in repo root with: +- Knowledge graph (functions, classes, calls, imports) +- BM25 search index +- Community detection (Leiden) +- Process tracing + +Run this when: +- First time using GitNexus on a repo +- After major code changes +- When 'not indexed' error appears`, + inputSchema: { + type: 'object', + properties: { + path: { type: 'string', description: 'Repo path (default: current directory)' }, + force: { type: 'boolean', description: 'Re-index even if exists', default: false }, + skipEmbeddings: { type: 'boolean', description: 'Skip embedding generation (faster)', default: false }, + }, + required: [], + }, + }, + { + name: 'context', + description: `Get GitNexus codebase context. CALL THIS FIRST before using other tools. + +Returns: +- Project name and stats (files, functions, classes) +- Hotspots (most connected/important nodes) +- Communities and processes count +- Tool usage guidance + +ALWAYS call this first to understand the codebase before searching or querying.`, + inputSchema: { + type: 'object', + properties: {}, + required: [], + }, + }, + { + name: 'search', + description: `Hybrid search (keyword + semantic) across the codebase. +Returns code nodes with their graph connections, grouped by process. + +BETTER THAN IDE search because: +- Process-aware grouping (shows execution flows) +- Cluster context (which functional area) +- Relationship data (callers/callees) + +RETURNS: Array of {name, type, filePath, code, connections[], cluster, processes[]}`, + inputSchema: { + type: 'object', + properties: { + query: { type: 'string', description: 'Natural language or keyword search query' }, + limit: { type: 'number', description: 'Max results to return', default: 10 }, + depth: { type: 'string', description: 'Result detail: "definitions" (symbols only) or "full" (with relationships)', enum: ['definitions', 'full'], default: 'definitions' }, + groupByProcess: { type: 'boolean', description: 'Group results by process', default: true }, + }, + required: ['query'], + }, + }, + { + name: 'cypher', + description: `Execute Cypher query against the code knowledge graph. + +SCHEMA: +- Nodes: File, Folder, Function, Class, Interface, Method, Community, Process +- Edges via CodeRelation.type: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, CONTAINS, DEFINES, MEMBER_OF, STEP_IN_PROCESS + +EXAMPLES: +• Find callers of a function: + MATCH (a)-[:CodeRelation {type: 'CALLS'}]->(b:Function {name: "validateUser"}) RETURN a.name, a.filePath + +• Find all functions in a community: + MATCH (f:Function)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community {label: "Auth"}) RETURN f.name + +• Find steps in a process: + MATCH (s)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p:Process {label: "UserLogin"}) RETURN s.name, r.step ORDER BY r.step + +TIPS: +- All relationships use CodeRelation table with 'type' property +- Community = functional cluster detected by Leiden algorithm +- Process = execution flow trace from entry point to terminal`, + inputSchema: { + type: 'object', + properties: { + query: { type: 'string', description: 'Cypher query to execute' }, + }, + required: ['query'], + }, + }, + { + name: 'explore', + description: `Deep dive on a symbol, cluster, or process. + +TYPE: symbol | cluster | process + +For SYMBOL: Shows cluster membership, process participation, callers/callees +For CLUSTER: Shows members, cohesion score, processes touching it +For PROCESS: Shows step-by-step trace, clusters traversed, entry/terminal points + +Use after search to understand context of a specific node.`, + inputSchema: { + type: 'object', + properties: { + name: { type: 'string', description: 'Name of symbol, cluster, or process to explore' }, + type: { type: 'string', description: 'Type: symbol, cluster, or process' }, + }, + required: ['name', 'type'], + }, + }, + { + name: 'overview', + description: `Get codebase map showing all clusters and processes. + +Returns: +- All communities (clusters) with member counts and cohesion scores +- All processes with step counts and types (intra/cross-community) +- High-level architectural view + +Use to understand overall codebase structure before diving deep.`, + inputSchema: { + type: 'object', + properties: { + showProcesses: { type: 'boolean', description: 'Include process list', default: true }, + showClusters: { type: 'boolean', description: 'Include cluster list', default: true }, + limit: { type: 'number', description: 'Max items per category', default: 20 }, + }, + required: [], + }, + }, + { + name: 'impact', + description: `Analyze the impact of changing a code element. +Returns all nodes affected by modifying the target, with distance, edge type, and confidence. + +USE BEFORE making changes to understand ripple effects. + +Output includes: +- Affected processes (with step positions) +- Affected clusters (direct/indirect) +- Risk assessment (critical/high/medium/low) +- Callers/dependents grouped by depth + +EdgeType: CALLS, IMPORTS, EXTENDS, IMPLEMENTS +Confidence: 100% = certain, <80% = fuzzy match + +Depth groups: +- d=1: WILL BREAK (direct callers/importers) +- d=2: LIKELY AFFECTED (indirect) +- d=3: MAY NEED TESTING (transitive)`, + inputSchema: { + type: 'object', + properties: { + target: { type: 'string', description: 'Name of function, class, or file to analyze' }, + direction: { type: 'string', description: 'upstream (what depends on this) or downstream (what this depends on)' }, + maxDepth: { type: 'number', description: 'Max relationship depth (default: 3)', default: 3 }, + relationTypes: { type: 'array', items: { type: 'string' }, description: 'Filter: CALLS, IMPORTS, EXTENDS, IMPLEMENTS (default: usage-based)' }, + includeTests: { type: 'boolean', description: 'Include test files (default: false)' }, + minConfidence: { type: 'number', description: 'Minimum confidence 0-1 (default: 0.7)' }, + }, + required: ['target', 'direction'], + }, + }, +]; diff --git a/gitnexus-cli/src/server/api.ts b/gitnexus/src/server/api.ts similarity index 100% rename from gitnexus-cli/src/server/api.ts rename to gitnexus/src/server/api.ts diff --git a/gitnexus-cli/src/storage/git.ts b/gitnexus/src/storage/git.ts similarity index 100% rename from gitnexus-cli/src/storage/git.ts rename to gitnexus/src/storage/git.ts diff --git a/gitnexus-cli/src/storage/repo-manager.ts b/gitnexus/src/storage/repo-manager.ts similarity index 100% rename from gitnexus-cli/src/storage/repo-manager.ts rename to gitnexus/src/storage/repo-manager.ts diff --git a/gitnexus/src/types/pipeline.ts b/gitnexus/src/types/pipeline.ts index 123be720b..c8848d562 100644 --- a/gitnexus/src/types/pipeline.ts +++ b/gitnexus/src/types/pipeline.ts @@ -1,6 +1,6 @@ -import { GraphNode, GraphRelationship, KnowledgeGraph } from '../core/graph/types'; -import { CommunityDetectionResult } from '../core/ingestion/community-processor'; -import { ProcessDetectionResult } from '../core/ingestion/process-processor'; +import { GraphNode, GraphRelationship, KnowledgeGraph } from '../core/graph/types.js'; +import { CommunityDetectionResult } from '../core/ingestion/community-processor.js'; +import { ProcessDetectionResult } from '../core/ingestion/process-processor.js'; export type PipelinePhase = 'idle' | 'extracting' | 'structure' | 'parsing' | 'imports' | 'calls' | 'heritage' | 'communities' | 'processes' | 'enriching' | 'complete' | 'error'; diff --git a/gitnexus/tsconfig.json b/gitnexus/tsconfig.json index 1ffef600d..7fc8c33ce 100644 --- a/gitnexus/tsconfig.json +++ b/gitnexus/tsconfig.json @@ -1,7 +1,24 @@ { - "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } + "compilerOptions": { + "target": "ES2022", + "lib": [ + "ES2022" + ], + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "dist", + "rootDir": "src", + "strict": false, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "types": [ + "node" + ] + }, + "include": [ + "src/**/*" ] -} +} \ No newline at end of file From b723ce70c3c616ea81c5f12f2341ede73c4468d4 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 01:16:15 +0530 Subject: [PATCH 07/36] chore: remove gitnexus-mcp (merged into gitnexus) --- gitnexus-mcp/package-lock.json | 3479 ----------------------- gitnexus-mcp/package.json | 50 - gitnexus-mcp/src/cli.ts | 60 - gitnexus-mcp/src/commands/serve.ts | 102 - gitnexus-mcp/src/core/bm25-index.ts | 120 - gitnexus-mcp/src/core/embedder.ts | 110 - gitnexus-mcp/src/core/kuzu-adapter.ts | 54 - gitnexus-mcp/src/local/local-backend.ts | 718 ----- gitnexus-mcp/src/mcp/server.ts | 180 -- gitnexus-mcp/src/mcp/tools.ts | 191 -- gitnexus-mcp/tsconfig.json | 27 - 11 files changed, 5091 deletions(-) delete mode 100644 gitnexus-mcp/package-lock.json delete mode 100644 gitnexus-mcp/package.json delete mode 100644 gitnexus-mcp/src/cli.ts delete mode 100644 gitnexus-mcp/src/commands/serve.ts delete mode 100644 gitnexus-mcp/src/core/bm25-index.ts delete mode 100644 gitnexus-mcp/src/core/embedder.ts delete mode 100644 gitnexus-mcp/src/core/kuzu-adapter.ts delete mode 100644 gitnexus-mcp/src/local/local-backend.ts delete mode 100644 gitnexus-mcp/src/mcp/server.ts delete mode 100644 gitnexus-mcp/src/mcp/tools.ts delete mode 100644 gitnexus-mcp/tsconfig.json diff --git a/gitnexus-mcp/package-lock.json b/gitnexus-mcp/package-lock.json deleted file mode 100644 index 5b2350221..000000000 --- a/gitnexus-mcp/package-lock.json +++ /dev/null @@ -1,3479 +0,0 @@ -{ - "name": "gitnexus-mcp", - "version": "0.2.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "gitnexus-mcp", - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "@huggingface/transformers": "^3.5.1", - "@modelcontextprotocol/sdk": "^1.0.0", - "kuzu": "^0.11.0", - "minisearch": "^7.1.0", - "uuid": "^13.0.0", - "ws": "^8.16.0" - }, - "bin": { - "gitnexus-mcp": "dist/cli.js" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@types/uuid": "^10.0.0", - "@types/ws": "^8.5.10", - "tsx": "^4.0.0", - "typescript": "^5.4.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", - "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.5.5.tgz", - "integrity": "sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@huggingface/transformers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@huggingface/transformers/-/transformers-3.8.1.tgz", - "integrity": "sha512-tsTk4zVjImqdqjS8/AOZg2yNLd1z9S5v+7oUPpXaasDRwEDhB+xnglK1k5cad26lL5/ZIaeREgWWy0bs9y9pPA==", - "license": "Apache-2.0", - "dependencies": { - "@huggingface/jinja": "^0.5.3", - "onnxruntime-node": "1.21.0", - "onnxruntime-web": "1.22.0-dev.20250409-89f8206ba4", - "sharp": "^0.34.1" - } - }, - "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", - "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", - "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", - "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", - "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "darwin" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", - "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", - "cpu": [ - "arm" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", - "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", - "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", - "cpu": [ - "ppc64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", - "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", - "cpu": [ - "riscv64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", - "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", - "cpu": [ - "s390x" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", - "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", - "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", - "cpu": [ - "arm64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", - "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", - "cpu": [ - "x64" - ], - "license": "LGPL-3.0-or-later", - "optional": true, - "os": [ - "linux" - ], - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-linux-arm": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", - "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", - "cpu": [ - "arm" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", - "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-ppc64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", - "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", - "cpu": [ - "ppc64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-riscv64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", - "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", - "cpu": [ - "riscv64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", - "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", - "cpu": [ - "s390x" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.2.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", - "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", - "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", - "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.2.4" - } - }, - "node_modules/@img/sharp-wasm32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", - "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", - "cpu": [ - "wasm32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", - "optional": true, - "dependencies": { - "@emnapi/runtime": "^1.7.0" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", - "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", - "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", - "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND LGPL-3.0-or-later", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.25.2", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.25.2.tgz", - "integrity": "sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.7", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.0.1", - "express-rate-limit": "^7.5.0", - "jose": "^6.1.1", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@types/node": { - "version": "20.19.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.30.tgz", - "integrity": "sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aproba": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", - "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.4.tgz", - "integrity": "sha512-1wVkUaAO6WyaYtCkcYCOx12ZgpGf9Zif+qXa4n+oYzK558YryKqiL6UWwd5DqiH3VRW0GYhTZQ/vlgJrCoNQlg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/boolean": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", - "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cmake-js": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.4.0.tgz", - "integrity": "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q==", - "license": "MIT", - "dependencies": { - "axios": "^1.6.5", - "debug": "^4", - "fs-extra": "^11.2.0", - "memory-stream": "^1.0.0", - "node-api-headers": "^1.1.0", - "npmlog": "^6.0.2", - "rc": "^1.2.7", - "semver": "^7.5.4", - "tar": "^6.2.0", - "url-join": "^4.0.1", - "which": "^2.0.2", - "yargs": "^17.7.2" - }, - "bin": { - "cmake-js": "bin/cmake-js" - }, - "engines": { - "node": ">= 14.15.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "license": "MIT" - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/flatbuffers": { - "version": "25.9.23", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", - "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", - "license": "Apache-2.0" - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs-extra": { - "version": "11.3.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz", - "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/global-agent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", - "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "es6-error": "^4.1.1", - "matcher": "^3.0.0", - "roarr": "^2.15.3", - "semver": "^7.3.2", - "serialize-error": "^7.0.1" - }, - "engines": { - "node": ">=10.0" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/guid-typescript": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/guid-typescript/-/guid-typescript-1.0.9.tgz", - "integrity": "sha512-Y8T4vYhEfwJOTbouREvG+3XDsjr8E3kIr7uf+JZ0BYloFsttiHU0WfvANVsR7TxNUJa/WpCnw/Ino/p+DeBhBQ==", - "license": "ISC" - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hono": { - "version": "4.11.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.11.4.tgz", - "integrity": "sha512-U7tt8JsyrxSRKspfhtLET79pU8K+tInj5QZXs1jSugO1Vq5dFj3kmZsRldo29mTBfcjDRVRXrEZ6LS63Cog9ZA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kuzu": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/kuzu/-/kuzu-0.11.3.tgz", - "integrity": "sha512-4+hD3Y+YMV3e0uiqTv1/GUal47D04l8qluw1WFWg8Nx3k7rLsHG1Pmq9WHIOlf1742svxQvTYQiuY6oS1qxAZA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "cmake-js": "^7.3.0", - "node-addon-api": "^6.0.0" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, - "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memory-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", - "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/minisearch": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", - "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", - "license": "MIT" - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-addon-api": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "license": "MIT" - }, - "node_modules/node-api-headers": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.8.0.tgz", - "integrity": "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ==", - "license": "MIT" - }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.21.0.tgz", - "integrity": "sha512-Q632iLLrtCAVOTO65dh2+mNbQir/QNTVBG3h/QdZBpns7mZ0RYbLRBgGABPbpU9351AgYy7SJf1WaeVwMrBFPQ==", - "license": "MIT" - }, - "node_modules/onnxruntime-node": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.21.0.tgz", - "integrity": "sha512-NeaCX6WW2L8cRCSqy3bInlo5ojjQqu2fD3D+9W5qb5irwxhEyWKXeH2vZ8W9r6VxaMPUan+4/7NDwZMtouZxEw==", - "hasInstallScript": true, - "license": "MIT", - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "global-agent": "^3.0.0", - "onnxruntime-common": "1.21.0", - "tar": "^7.0.1" - } - }, - "node_modules/onnxruntime-node/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/onnxruntime-node/node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/onnxruntime-node/node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-node/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.22.0-dev.20250409-89f8206ba4", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.22.0-dev.20250409-89f8206ba4.tgz", - "integrity": "sha512-0uS76OPgH0hWCPrFKlL8kYVV7ckM7t/36HfbgoFw6Nd0CZVVbQC4PkrR8mBX8LtNUFZO25IQBqV2Hx2ho3FlbQ==", - "license": "MIT", - "dependencies": { - "flatbuffers": "^25.1.24", - "guid-typescript": "^1.0.9", - "long": "^5.2.3", - "onnxruntime-common": "1.22.0-dev.20250409-89f8206ba4", - "platform": "^1.3.6", - "protobufjs": "^7.2.4" - } - }, - "node_modules/onnxruntime-web/node_modules/onnxruntime-common": { - "version": "1.22.0-dev.20250409-89f8206ba4", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.22.0-dev.20250409-89f8206ba4.tgz", - "integrity": "sha512-vDJMkfCfb0b1A836rgHj+ORuZf4B4+cc2bASQtpeoJLueuFc5DuYwjIZUBrSvx/fO5IrLjLz+oTrB3pcGlhovQ==", - "license": "MIT" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, - "node_modules/platform": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", - "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", - "license": "MIT" - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/roarr": { - "version": "2.15.4", - "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", - "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", - "license": "BSD-3-Clause", - "dependencies": { - "boolean": "^3.0.1", - "detect-node": "^2.0.4", - "globalthis": "^1.0.1", - "json-stringify-safe": "^5.0.1", - "semver-compare": "^1.0.0", - "sprintf-js": "^1.1.2" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "license": "MIT" - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serialize-error": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", - "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", - "license": "MIT", - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sharp": { - "version": "0.34.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", - "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@img/colour": "^1.0.0", - "detect-libc": "^2.1.2", - "semver": "^7.7.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.5", - "@img/sharp-darwin-x64": "0.34.5", - "@img/sharp-libvips-darwin-arm64": "1.2.4", - "@img/sharp-libvips-darwin-x64": "1.2.4", - "@img/sharp-libvips-linux-arm": "1.2.4", - "@img/sharp-libvips-linux-arm64": "1.2.4", - "@img/sharp-libvips-linux-ppc64": "1.2.4", - "@img/sharp-libvips-linux-riscv64": "1.2.4", - "@img/sharp-libvips-linux-s390x": "1.2.4", - "@img/sharp-libvips-linux-x64": "1.2.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", - "@img/sharp-libvips-linuxmusl-x64": "1.2.4", - "@img/sharp-linux-arm": "0.34.5", - "@img/sharp-linux-arm64": "0.34.5", - "@img/sharp-linux-ppc64": "0.34.5", - "@img/sharp-linux-riscv64": "0.34.5", - "@img/sharp-linux-s390x": "0.34.5", - "@img/sharp-linux-x64": "0.34.5", - "@img/sharp-linuxmusl-arm64": "0.34.5", - "@img/sharp-linuxmusl-x64": "0.34.5", - "@img/sharp-wasm32": "0.34.5", - "@img/sharp-win32-arm64": "0.34.5", - "@img/sharp-win32-ia32": "0.34.5", - "@img/sharp-win32-x64": "0.34.5" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "license": "BSD-3-Clause" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD", - "optional": true - }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", - "license": "MIT" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/zod": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.5.tgz", - "integrity": "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - } - } -} diff --git a/gitnexus-mcp/package.json b/gitnexus-mcp/package.json deleted file mode 100644 index 4bf1eb250..000000000 --- a/gitnexus-mcp/package.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "name": "gitnexus-mcp", - "version": "0.2.0", - "description": "MCP server for GitNexus code intelligence - connect Cursor, Claude, and other AI agents to your codebase", - "author": "Abhigyan Patwari", - "license": "MIT", - "repository": { - "type": "git", - "url": "https://github.com/abhigyanpatwari/GitNexus" - }, - "keywords": [ - "mcp", - "model-context-protocol", - "code-intelligence", - "cursor", - "claude", - "ai-agent", - "gitnexus" - ], - "type": "module", - "bin": { - "gitnexus-mcp": "./dist/cli.js" - }, - "files": [ - "dist" - ], - "scripts": { - "build": "tsc", - "dev": "tsx watch src/cli.ts", - "prepublishOnly": "npm run build" - }, - "dependencies": { - "@huggingface/transformers": "^3.5.1", - "@modelcontextprotocol/sdk": "^1.0.0", - "kuzu": "^0.11.0", - "minisearch": "^7.1.0", - "uuid": "^13.0.0", - "ws": "^8.16.0" - }, - "devDependencies": { - "@types/node": "^20.0.0", - "@types/uuid": "^10.0.0", - "@types/ws": "^8.5.10", - "tsx": "^4.0.0", - "typescript": "^5.4.0" - }, - "engines": { - "node": ">=18.0.0" - } -} \ No newline at end of file diff --git a/gitnexus-mcp/src/cli.ts b/gitnexus-mcp/src/cli.ts deleted file mode 100644 index 281ecb0fb..000000000 --- a/gitnexus-mcp/src/cli.ts +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/env node -/** - * GitNexus MCP CLI - * - * Bridge between external AI agents (Cursor, Claude Code, Windsurf) - * and GitNexus code intelligence running in the browser. - */ - -import { serveCommand } from './commands/serve.js'; -/** - * Minimal CLI: - * - Default: start MCP stdio server + local browser WebSocket bridge - * - Optional: `serve` alias, and `--port ` - * - * This is designed for MCP clients (Cursor/Claude/Windsurf) which spawn this - * process automatically; users should not need to run commands manually. - */ - -function parsePort(argv: string[]): string { - const portFlagIndex = argv.findIndex((a) => a === '--port' || a === '-p'); - if (portFlagIndex !== -1) { - const value = argv[portFlagIndex + 1]; - if (value) return value; - } - // Support `--port=54319` - const portEq = argv.find((a) => a.startsWith('--port=')); - if (portEq) return portEq.split('=')[1] || '54319'; - return '54319'; -} - -async function main() { - const argv = process.argv.slice(2); - const first = argv[0]; - const port = parsePort(argv); - - // Allow `gitnexus-mcp serve` for compatibility, but default to serve anyway - if (!first || first === 'serve') { - await serveCommand({ port }); - return; - } - - // Minimal help for unknown commands - if (first === '--help' || first === '-h') { - // eslint-disable-next-line no-console - console.log('gitnexus-mcp\n\nUsage:\n gitnexus-mcp [serve] [--port ]\n'); - process.exit(0); - } - - // eslint-disable-next-line no-console - console.error(`Unknown command: ${first}`); - // eslint-disable-next-line no-console - console.error('Usage: gitnexus-mcp [serve] [--port ]'); - process.exit(1); -} - -main().catch((err) => { - // eslint-disable-next-line no-console - console.error(err instanceof Error ? err.message : err); - process.exit(1); -}); diff --git a/gitnexus-mcp/src/commands/serve.ts b/gitnexus-mcp/src/commands/serve.ts deleted file mode 100644 index bfde486e5..000000000 --- a/gitnexus-mcp/src/commands/serve.ts +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Serve Command - * - * Starts the MCP server in standalone mode using local .gitnexus/ index. - * - * Auto-detects repository by trying (in order): - * 1. GITNEXUS_CWD env var (explicit override) - * 2. process.cwd() (IDE working directory) - * 3. VSCODE_WORKSPACE_FOLDER env var - */ - -import { startMCPServer } from '../mcp/server.js'; -import { LocalBackend, findRepo } from '../local/local-backend.js'; -import path from 'path'; -import fs from 'fs/promises'; - -interface ServeOptions { - port: string; -} - -/** - * Get candidate paths to search for .gitnexus/ folder - */ -function getCandidatePaths(): string[] { - const candidates: string[] = []; - - // 1. Explicit override (highest priority) - if (process.env.GITNEXUS_CWD) { - candidates.push(process.env.GITNEXUS_CWD); - } - - // 2. Current working directory - candidates.push(process.cwd()); - - // 3. VS Code workspace folders (if available via env) - if (process.env.VSCODE_WORKSPACE_FOLDER) { - candidates.push(process.env.VSCODE_WORKSPACE_FOLDER); - } - - // Deduplicate while preserving order - return [...new Set(candidates.map(p => path.resolve(p)))]; -} - -/** - * Find a git repository root by walking up the directory tree - */ -async function findGitRoot(startPath: string): Promise { - let current = path.resolve(startPath); - const root = path.parse(current).root; - - while (current !== root) { - try { - const gitPath = path.join(current, '.git'); - const stat = await fs.stat(gitPath); - if (stat.isDirectory()) return current; - } catch {} - current = path.dirname(current); - } - return null; -} - -export async function serveCommand(_options: ServeOptions) { - // Try multiple candidate paths to find .gitnexus/ - const candidates = getCandidatePaths(); - - for (const candidate of candidates) { - const repo = await findRepo(candidate); - if (repo) { - const local = new LocalBackend(); - await local.init(candidate); - console.error(`GitNexus: Found index at ${repo.storagePath}`); - await startMCPServer(local); - return; - } - } - - // No index found - give helpful error message - for (const candidate of candidates) { - const gitRoot = await findGitRoot(candidate); - if (gitRoot) { - console.error(''); - console.error('╔════════════════════════════════════════════════════╗'); - console.error('║ GitNexus: Repository Not Indexed ║'); - console.error('╠════════════════════════════════════════════════════╣'); - console.error(`║ Found git repo: ${gitRoot.slice(0, 35).padEnd(35)} ║`); - console.error('║ ║'); - console.error('║ To enable AI code understanding, run: ║'); - console.error('║ ║'); - console.error('║ npx gitnexus-cli analyze ║'); - console.error('║ ║'); - console.error('║ Then restart your IDE. ║'); - console.error('╚════════════════════════════════════════════════════╝'); - console.error(''); - process.exit(1); - } - } - - // No git repo found - console.error('GitNexus: No git repository found.'); - console.error(`Searched: ${candidates.join(', ')}`); - process.exit(1); -} diff --git a/gitnexus-mcp/src/core/bm25-index.ts b/gitnexus-mcp/src/core/bm25-index.ts deleted file mode 100644 index b13d6aebd..000000000 --- a/gitnexus-mcp/src/core/bm25-index.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * BM25 Full-Text Search Index (Read-Only) - * - * Uses MiniSearch for fast keyword-based search with BM25 ranking. - * For MCP, we only load and search - not build. - */ - -import MiniSearch from 'minisearch'; -import fs from 'fs/promises'; - -export interface BM25Document { - id: string; // File path - content: string; // File content - name: string; // File name (boosted in search) -} - -export interface BM25SearchResult { - filePath: string; - score: number; - rank: number; -} - -let searchIndex: MiniSearch | null = null; -let indexedDocCount = 0; - -/** - * Common stop words to filter out - */ -const STOP_WORDS = new Set([ - 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while', - 'class', 'new', 'this', 'import', 'export', 'from', 'default', 'async', 'await', - 'try', 'catch', 'throw', 'typeof', 'instanceof', 'true', 'false', 'null', 'undefined', - 'the', 'is', 'at', 'which', 'on', 'a', 'an', 'and', 'or', 'but', 'in', 'with', - 'to', 'of', 'it', 'be', 'as', 'by', 'that', 'for', 'are', 'was', 'were', -]); - -/** - * Tokenizer for BM25 search - */ -const tokenize = (text: string): string[] => { - const tokens = text.toLowerCase().split(/[\s\-_./\\(){}[\]<>:;,!?'"]+/); - const expanded: string[] = []; - for (const token of tokens) { - if (token.length === 0) continue; - const camelParts = token.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase().split(' '); - expanded.push(...camelParts); - if (camelParts.length > 1) { - expanded.push(token); - } - } - return expanded.filter(t => t.length > 1 && !STOP_WORDS.has(t)); -}; - -/** - * Load a BM25 index from disk - */ -export const loadBM25Index = async (filePath: string): Promise => { - try { - const json = await fs.readFile(filePath, 'utf-8'); - // MiniSearch.loadJSON expects the raw JSON string, not a parsed object - searchIndex = MiniSearch.loadJSON(json, { - fields: ['content', 'name'], - storeFields: ['id'], - tokenize, - }); - indexedDocCount = searchIndex.documentCount; - return true; - } catch { - return false; - } -}; - -/** - * Search the BM25 index - */ -export const searchBM25 = (query: string, limit: number = 20): BM25SearchResult[] => { - if (!searchIndex) { - return []; - } - - const results = searchIndex.search(query, { - fuzzy: 0.2, - prefix: true, - boost: { name: 2 }, - }); - - return results.slice(0, limit).map((r, index) => ({ - filePath: r.id, - score: r.score, - rank: index + 1, - })); -}; - -/** - * Check if the BM25 index is ready - */ -export const isBM25Ready = (): boolean => { - return searchIndex !== null && indexedDocCount > 0; -}; - -/** - * Get index statistics - */ -export const getBM25Stats = (): { documentCount: number; termCount: number } => { - if (!searchIndex) { - return { documentCount: 0, termCount: 0 }; - } - return { - documentCount: indexedDocCount, - termCount: searchIndex.termCount, - }; -}; - -/** - * Clear the index - */ -export const clearBM25Index = (): void => { - searchIndex = null; - indexedDocCount = 0; -}; diff --git a/gitnexus-mcp/src/core/embedder.ts b/gitnexus-mcp/src/core/embedder.ts deleted file mode 100644 index 2979ddc53..000000000 --- a/gitnexus-mcp/src/core/embedder.ts +++ /dev/null @@ -1,110 +0,0 @@ -/** - * Embedder Module (Read-Only) - * - * Singleton factory for transformers.js embedding pipeline. - * For MCP, we only need to compute query embeddings, not batch embed. - */ - -import { pipeline, env, type FeatureExtractionPipeline } from '@huggingface/transformers'; - -// Model config -const MODEL_ID = 'Snowflake/snowflake-arctic-embed-xs'; -const EMBEDDING_DIMS = 384; - -// Module-level state for singleton pattern -let embedderInstance: FeatureExtractionPipeline | null = null; -let isInitializing = false; -let initPromise: Promise | null = null; - -/** - * Initialize the embedding model (lazy, on first search) - */ -export const initEmbedder = async (): Promise => { - if (embedderInstance) { - return embedderInstance; - } - - if (isInitializing && initPromise) { - return initPromise; - } - - isInitializing = true; - - initPromise = (async () => { - try { - env.allowLocalModels = false; - - console.error('GitNexus: Loading embedding model (first search may take a moment)...'); - - // Try WebGPU first (Windows DirectX12), fall back to CPU - const devicesToTry: Array<'webgpu' | 'cpu'> = ['webgpu', 'cpu']; - - for (const device of devicesToTry) { - try { - embedderInstance = await (pipeline as any)( - 'feature-extraction', - MODEL_ID, - { - device: device, - dtype: 'fp32', - } - ); - console.error(`GitNexus: Embedding model loaded (${device})`); - return embedderInstance!; - } catch { - if (device === 'cpu') throw new Error('Failed to load embedding model'); - } - } - - throw new Error('No suitable device found'); - } catch (error) { - isInitializing = false; - initPromise = null; - embedderInstance = null; - throw error; - } finally { - isInitializing = false; - } - })(); - - return initPromise; -}; - -/** - * Check if embedder is ready - */ -export const isEmbedderReady = (): boolean => embedderInstance !== null; - -/** - * Embed a query text for semantic search - */ -export const embedQuery = async (query: string): Promise => { - const embedder = await initEmbedder(); - - const result = await embedder(query, { - pooling: 'mean', - normalize: true, - }); - - return Array.from(result.data as ArrayLike); -}; - -/** - * Get embedding dimensions - */ -export const getEmbeddingDims = (): number => EMBEDDING_DIMS; - -/** - * Cleanup embedder - */ -export const disposeEmbedder = async (): Promise => { - if (embedderInstance) { - try { - if ('dispose' in embedderInstance && typeof embedderInstance.dispose === 'function') { - await embedderInstance.dispose(); - } - } catch {} - embedderInstance = null; - initPromise = null; - } -}; diff --git a/gitnexus-mcp/src/core/kuzu-adapter.ts b/gitnexus-mcp/src/core/kuzu-adapter.ts deleted file mode 100644 index 80a063b05..000000000 --- a/gitnexus-mcp/src/core/kuzu-adapter.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * KuzuDB Adapter (Read-Only) - * - * Simplified adapter for MCP that only reads from existing .gitnexus/ database. - */ - -import fs from 'fs/promises'; -import path from 'path'; -import kuzu from 'kuzu'; - -let db: kuzu.Database | null = null; -let conn: kuzu.Connection | null = null; - -export const initKuzu = async (dbPath: string): Promise => { - if (conn) return; - - // Check if database exists - try { - await fs.stat(dbPath); - } catch { - throw new Error(`KuzuDB not found at ${dbPath}. Run: gitnexus analyze`); - } - - db = new kuzu.Database(dbPath); - conn = new kuzu.Connection(db); -}; - -export const executeQuery = async (cypher: string): Promise => { - if (!conn) { - throw new Error('KuzuDB not initialized. Call initKuzu first.'); - } - - const queryResult = await conn.query(cypher); - const result = Array.isArray(queryResult) ? queryResult[0] : queryResult; - const rows = await result.getAll(); - return rows; -}; - -export const closeKuzu = async (): Promise => { - if (conn) { - try { - await conn.close(); - } catch {} - conn = null; - } - if (db) { - try { - await db.close(); - } catch {} - db = null; - } -}; - -export const isKuzuReady = (): boolean => conn !== null && db !== null; diff --git a/gitnexus-mcp/src/local/local-backend.ts b/gitnexus-mcp/src/local/local-backend.ts deleted file mode 100644 index 4bcd13bcf..000000000 --- a/gitnexus-mcp/src/local/local-backend.ts +++ /dev/null @@ -1,718 +0,0 @@ -/** - * Local Backend - * - * Provides tool implementations using local .gitnexus/ index. - * This enables MCP to work without the browser. - */ - -import fs from 'fs/promises'; -import path from 'path'; -import { initKuzu, executeQuery, closeKuzu, isKuzuReady } from '../core/kuzu-adapter.js'; -import { loadBM25Index, searchBM25, isBM25Ready } from '../core/bm25-index.js'; -import { embedQuery, getEmbeddingDims, disposeEmbedder } from '../core/embedder.js'; - -export interface RepoMeta { - repoPath: string; - lastCommit: string; - indexedAt: string; - stats?: { - files?: number; - nodes?: number; - edges?: number; - communities?: number; - processes?: number; - }; -} - -export interface IndexedRepo { - repoPath: string; - storagePath: string; - kuzuPath: string; - bm25Path: string; - metaPath: string; - meta: RepoMeta; -} - -const GITNEXUS_DIR = '.gitnexus'; - -function getStoragePaths(repoPath: string) { - const storagePath = path.join(path.resolve(repoPath), GITNEXUS_DIR); - return { - storagePath, - kuzuPath: path.join(storagePath, 'kuzu'), - bm25Path: path.join(storagePath, 'bm25.json'), - metaPath: path.join(storagePath, 'meta.json'), - }; -} - -async function loadMeta(storagePath: string): Promise { - try { - // Verify both meta.json and kuzu exist for a valid index - const metaPath = path.join(storagePath, 'meta.json'); - const kuzuPath = path.join(storagePath, 'kuzu'); - - // Check kuzu exists (can be file or directory depending on how it was saved) - try { - await fs.stat(kuzuPath); - } catch { - return null; // kuzu doesn't exist - } - - // Load and parse meta.json - const raw = await fs.readFile(metaPath, 'utf-8'); - return JSON.parse(raw) as RepoMeta; - } catch { - return null; - } -} - -async function loadRepo(repoPath: string): Promise { - const paths = getStoragePaths(repoPath); - const meta = await loadMeta(paths.storagePath); - if (!meta) return null; - - return { - repoPath: path.resolve(repoPath), - ...paths, - meta, - }; -} - -export async function findRepo(startPath: string): Promise { - let current = path.resolve(startPath); - const root = path.parse(current).root; - - while (current !== root) { - const repo = await loadRepo(current); - if (repo) return repo; - current = path.dirname(current); - } - - return null; -} - -export interface CodebaseContext { - projectName: string; - stats: { - fileCount: number; - functionCount: number; - classCount: number; - interfaceCount: number; - methodCount: number; - communityCount: number; - processCount: number; - }; - hotspots: Array<{ - name: string; - type: string; - filePath: string; - connections: number; - }>; - folderTree: string; -} - -export class LocalBackend { - private repo: IndexedRepo | null = null; - private _context: CodebaseContext | null = null; - private initialized = false; - - async init(cwd: string): Promise { - this.repo = await findRepo(cwd); - if (!this.repo) return false; - - const stats = this.repo.meta.stats || {}; - this._context = { - projectName: path.basename(this.repo.repoPath), - stats: { - fileCount: stats.files || 0, - functionCount: stats.nodes || 0, - classCount: 0, - interfaceCount: 0, - methodCount: 0, - communityCount: stats.communities || 0, - processCount: stats.processes || 0, - }, - hotspots: [], - folderTree: '', - }; - - return true; - } - - private async ensureInitialized(): Promise { - if (this.initialized || !this.repo) return; - - await initKuzu(this.repo.kuzuPath); - await loadBM25Index(this.repo.bm25Path); - this.initialized = true; - } - - get context(): CodebaseContext | null { - return this._context; - } - - get isReady(): boolean { - return this.repo !== null; - } - - get repoPath(): string | null { - return this.repo?.repoPath || null; - } - - get storagePath(): string | null { - return this.repo?.storagePath || null; - } - - async callTool(method: string, params: any): Promise { - if (!this.repo) { - throw new Error('Repository not indexed. Run: gitnexus analyze'); - } - - switch (method) { - case 'context': - return this.getContext(); - case 'search': - return this.search(params); - case 'cypher': - return this.cypher(params); - case 'overview': - return this.overview(params); - case 'explore': - return this.explore(params); - case 'impact': - return this.impact(params); - case 'analyze': - return this.analyze(params); - default: - throw new Error(`Unknown tool: ${method}`); - } - } - - private async getContext(): Promise { - if (!this._context || !this.repo) { - return 'Repository not indexed. Run: gitnexus analyze'; - } - - const stats = this.repo.meta.stats || {}; - return [ - `# GitNexus: ${this._context.projectName}`, - '', - '## Stats', - `- Files: ${stats.files || 0}`, - `- Nodes: ${stats.nodes || 0}`, - `- Edges: ${stats.edges || 0}`, - `- Communities: ${stats.communities || 0}`, - `- Processes: ${stats.processes || 0}`, - '', - `Indexed: ${this.repo.meta.indexedAt}`, - `Commit: ${this.repo.meta.lastCommit?.slice(0, 7)}`, - '', - '## Available Tools', - '- **analyze**: Index/re-index repository', - '- **search**: Hybrid semantic + keyword search', - '- **cypher**: Graph queries (Cypher)', - '- **overview**: List communities and processes', - '- **explore**: Deep dive on symbol/cluster/process', - '- **impact**: Change impact analysis', - ].join('\n'); - } - - private async search(params: { query: string; limit?: number; depth?: string; groupByProcess?: boolean }): Promise { - await this.ensureInitialized(); - - const limit = params.limit || 10; - const query = params.query; - const depth = params.depth || 'definitions'; - - // Run BM25 and semantic search in parallel - const [bm25Results, semanticResults] = await Promise.all([ - this.bm25Search(query, limit * 2), - this.semanticSearch(query, limit * 2), - ]); - - // Merge and deduplicate results using reciprocal rank fusion - const scoreMap = new Map(); - - // BM25 results - for (let i = 0; i < bm25Results.length; i++) { - const result = bm25Results[i]; - const key = result.filePath; - const rrfScore = 1 / (60 + i); // RRF formula with k=60 - const existing = scoreMap.get(key); - if (existing) { - existing.score += rrfScore; - existing.source = 'hybrid'; - } else { - scoreMap.set(key, { score: rrfScore, source: 'bm25', data: result }); - } - } - - // Semantic results - for (let i = 0; i < semanticResults.length; i++) { - const result = semanticResults[i]; - const key = result.filePath; - const rrfScore = 1 / (60 + i); - const existing = scoreMap.get(key); - if (existing) { - existing.score += rrfScore; - existing.source = 'hybrid'; - } else { - scoreMap.set(key, { score: rrfScore, source: 'semantic', data: result }); - } - } - - // Sort by fused score and take top results - const merged = Array.from(scoreMap.entries()) - .sort((a, b) => b[1].score - a[1].score) - .slice(0, limit); - - // Enrich with graph data - const results: any[] = []; - - for (const [_, item] of merged) { - const result = item.data; - result.searchSource = item.source; - result.fusedScore = item.score; - - // Add relationships if depth is 'full' and we have a node ID - if (depth === 'full' && result.nodeId) { - try { - const relQuery = ` - MATCH (n {id: '${result.nodeId.replace(/'/g, "''")}'})-[r:CodeRelation]->(m) - RETURN r.type AS type, m.name AS targetName, m.filePath AS targetPath - LIMIT 5 - `; - const rels = await executeQuery(relQuery); - result.connections = rels.map((rel: any) => ({ - type: rel.type || rel[0], - name: rel.targetName || rel[1], - path: rel.targetPath || rel[2], - })); - } catch { - result.connections = []; - } - } - - results.push(result); - } - - return results; - } - - /** - * BM25 keyword search helper - */ - private async bm25Search(query: string, limit: number): Promise { - if (!isBM25Ready()) return []; - - const bm25Results = searchBM25(query, limit); - const results: any[] = []; - - for (const bm25Result of bm25Results) { - const fileName = bm25Result.filePath.split('/').pop() || bm25Result.filePath; - try { - const symbolQuery = ` - MATCH (n) - WHERE n.filePath CONTAINS '${fileName.replace(/'/g, "''")}' - RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine - LIMIT 3 - `; - const symbols = await executeQuery(symbolQuery); - - if (symbols.length > 0) { - for (const sym of symbols) { - results.push({ - nodeId: sym.id || sym[0], - name: sym.name || sym[1], - type: sym.type || sym[2], - filePath: sym.filePath || sym[3], - startLine: sym.startLine || sym[4], - endLine: sym.endLine || sym[5], - bm25Score: bm25Result.score, - }); - } - } else { - results.push({ - name: fileName, - type: 'File', - filePath: bm25Result.filePath, - bm25Score: bm25Result.score, - }); - } - } catch { - results.push({ - name: fileName, - type: 'File', - filePath: bm25Result.filePath, - bm25Score: bm25Result.score, - }); - } - } - - return results; - } - - /** - * Semantic vector search helper - */ - private async semanticSearch(query: string, limit: number): Promise { - try { - // Embed the query - const queryVec = await embedQuery(query); - const dims = getEmbeddingDims(); - const queryVecStr = `[${queryVec.join(',')}]`; - - // Query vector index - const vectorQuery = ` - CALL QUERY_VECTOR_INDEX('CodeEmbedding', 'code_embedding_idx', - CAST(${queryVecStr} AS FLOAT[${dims}]), ${limit}) - YIELD node AS emb, distance - WITH emb, distance - WHERE distance < 0.6 - RETURN emb.nodeId AS nodeId, distance - ORDER BY distance - `; - - const embResults = await executeQuery(vectorQuery); - - if (embResults.length === 0) return []; - - // Get metadata for each result - const results: any[] = []; - - for (const embRow of embResults) { - const nodeId = embRow.nodeId ?? embRow[0]; - const distance = embRow.distance ?? embRow[1]; - - // Extract label from node ID - const labelEndIdx = nodeId.indexOf(':'); - const label = labelEndIdx > 0 ? nodeId.substring(0, labelEndIdx) : 'Unknown'; - - try { - const nodeQuery = label === 'File' - ? `MATCH (n:File {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath` - : `MATCH (n:${label} {id: '${nodeId.replace(/'/g, "''")}'}) RETURN n.name AS name, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine`; - - const nodeRows = await executeQuery(nodeQuery); - if (nodeRows.length > 0) { - const nodeRow = nodeRows[0]; - results.push({ - nodeId, - name: nodeRow.name ?? nodeRow[0] ?? '', - type: label, - filePath: nodeRow.filePath ?? nodeRow[1] ?? '', - distance, - startLine: label !== 'File' ? (nodeRow.startLine ?? nodeRow[2]) : undefined, - endLine: label !== 'File' ? (nodeRow.endLine ?? nodeRow[3]) : undefined, - }); - } - } catch {} - } - - return results; - } catch (err: any) { - // Semantic search unavailable (no embeddings or model not loaded) - console.error('GitNexus: Semantic search unavailable -', err.message); - return []; - } - } - - private async cypher(params: { query: string }): Promise { - await this.ensureInitialized(); - - if (!isKuzuReady()) { - return { error: 'KuzuDB not ready. Index may be corrupted.' }; - } - - try { - const result = await executeQuery(params.query); - return result; - } catch (err: any) { - return { error: err.message || 'Query failed' }; - } - } - - private async overview(params: { showClusters?: boolean; showProcesses?: boolean; limit?: number }): Promise { - await this.ensureInitialized(); - - const limit = params.limit || 20; - const result: any = { - repoPath: this.repo!.repoPath, - stats: this.repo!.meta.stats, - indexedAt: this.repo!.meta.indexedAt, - lastCommit: this.repo!.meta.lastCommit, - }; - - if (params.showClusters !== false) { - try { - const clusters = await executeQuery(` - MATCH (c:Community) - RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount - ORDER BY c.symbolCount DESC - LIMIT ${limit} - `); - result.clusters = clusters.map((c: any) => ({ - id: c.id || c[0], - label: c.label || c[1], - heuristicLabel: c.heuristicLabel || c[2], - cohesion: c.cohesion || c[3], - symbolCount: c.symbolCount || c[4], - })); - } catch { - result.clusters = []; - } - } - - if (params.showProcesses !== false) { - try { - const processes = await executeQuery(` - MATCH (p:Process) - RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount - ORDER BY p.stepCount DESC - LIMIT ${limit} - `); - result.processes = processes.map((p: any) => ({ - id: p.id || p[0], - label: p.label || p[1], - heuristicLabel: p.heuristicLabel || p[2], - processType: p.processType || p[3], - stepCount: p.stepCount || p[4], - })); - } catch { - result.processes = []; - } - } - - return result; - } - - private async explore(params: { name: string; type: 'symbol' | 'cluster' | 'process' }): Promise { - await this.ensureInitialized(); - - const { name, type } = params; - - if (type === 'symbol') { - // Find symbol and its context - const symbolQuery = ` - MATCH (n) - WHERE n.name = '${name.replace(/'/g, "''")}' - RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, n.startLine AS startLine, n.endLine AS endLine - LIMIT 1 - `; - const symbols = await executeQuery(symbolQuery); - if (symbols.length === 0) return { error: `Symbol '${name}' not found` }; - - const sym = symbols[0]; - const symId = sym.id || sym[0]; - - // Get callers - const callersQuery = ` - MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(n {id: '${symId}'}) - RETURN caller.name AS name, caller.filePath AS filePath - LIMIT 10 - `; - const callers = await executeQuery(callersQuery); - - // Get callees - const calleesQuery = ` - MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'CALLS'}]->(callee) - RETURN callee.name AS name, callee.filePath AS filePath - LIMIT 10 - `; - const callees = await executeQuery(calleesQuery); - - // Get community - const communityQuery = ` - MATCH (n {id: '${symId}'})-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community) - RETURN c.label AS label, c.heuristicLabel AS heuristicLabel - LIMIT 1 - `; - const communities = await executeQuery(communityQuery); - - return { - symbol: { - id: symId, - name: sym.name || sym[1], - type: sym.type || sym[2], - filePath: sym.filePath || sym[3], - startLine: sym.startLine || sym[4], - endLine: sym.endLine || sym[5], - }, - callers: callers.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })), - callees: callees.map((c: any) => ({ name: c.name || c[0], filePath: c.filePath || c[1] })), - community: communities.length > 0 ? { - label: communities[0].label || communities[0][0], - heuristicLabel: communities[0].heuristicLabel || communities[0][1], - } : null, - }; - } - - if (type === 'cluster') { - const clusterQuery = ` - MATCH (c:Community) - WHERE c.label = '${name.replace(/'/g, "''")}' OR c.heuristicLabel = '${name.replace(/'/g, "''")}' - RETURN c.id AS id, c.label AS label, c.heuristicLabel AS heuristicLabel, c.cohesion AS cohesion, c.symbolCount AS symbolCount - LIMIT 1 - `; - const clusters = await executeQuery(clusterQuery); - if (clusters.length === 0) return { error: `Cluster '${name}' not found` }; - - const cluster = clusters[0]; - const clusterId = cluster.id || cluster[0]; - - const membersQuery = ` - MATCH (n)-[:CodeRelation {type: 'MEMBER_OF'}]->(c {id: '${clusterId}'}) - RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath - LIMIT 20 - `; - const members = await executeQuery(membersQuery); - - return { - cluster: { - id: clusterId, - label: cluster.label || cluster[1], - heuristicLabel: cluster.heuristicLabel || cluster[2], - cohesion: cluster.cohesion || cluster[3], - symbolCount: cluster.symbolCount || cluster[4], - }, - members: members.map((m: any) => ({ - name: m.name || m[0], - type: m.type || m[1], - filePath: m.filePath || m[2], - })), - }; - } - - if (type === 'process') { - const processQuery = ` - MATCH (p:Process) - WHERE p.label = '${name.replace(/'/g, "''")}' OR p.heuristicLabel = '${name.replace(/'/g, "''")}' - RETURN p.id AS id, p.label AS label, p.heuristicLabel AS heuristicLabel, p.processType AS processType, p.stepCount AS stepCount, p.entryPointId AS entryPointId, p.terminalId AS terminalId - LIMIT 1 - `; - const processes = await executeQuery(processQuery); - if (processes.length === 0) return { error: `Process '${name}' not found` }; - - const proc = processes[0]; - const procId = proc.id || proc[0]; - - const stepsQuery = ` - MATCH (n)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p {id: '${procId}'}) - RETURN n.name AS name, labels(n)[0] AS type, n.filePath AS filePath, r.step AS step - ORDER BY r.step - `; - const steps = await executeQuery(stepsQuery); - - return { - process: { - id: procId, - label: proc.label || proc[1], - heuristicLabel: proc.heuristicLabel || proc[2], - processType: proc.processType || proc[3], - stepCount: proc.stepCount || proc[4], - }, - steps: steps.map((s: any) => ({ - step: s.step || s[3], - name: s.name || s[0], - type: s.type || s[1], - filePath: s.filePath || s[2], - })), - }; - } - - return { error: 'Invalid type. Use: symbol, cluster, or process' }; - } - - private async impact(params: { target: string; direction: 'upstream' | 'downstream'; maxDepth?: number }): Promise { - await this.ensureInitialized(); - - const { target, direction } = params; - const maxDepth = params.maxDepth || 3; - - // Find target symbol - const targetQuery = ` - MATCH (n) - WHERE n.name = '${target.replace(/'/g, "''")}' - RETURN n.id AS id, n.name AS name, labels(n)[0] AS type, n.filePath AS filePath - LIMIT 1 - `; - const targets = await executeQuery(targetQuery); - if (targets.length === 0) return { error: `Target '${target}' not found` }; - - const sym = targets[0]; - const symId = sym.id || sym[0]; - - // BFS to find impacted nodes - const impacted: any[] = []; - const visited = new Set([symId]); - let frontier = [symId]; - - for (let depth = 1; depth <= maxDepth && frontier.length > 0; depth++) { - const nextFrontier: string[] = []; - - for (const nodeId of frontier) { - const query = direction === 'upstream' - ? `MATCH (caller)-[r:CodeRelation]->(n {id: '${nodeId}'}) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN caller.id AS id, caller.name AS name, labels(caller)[0] AS type, caller.filePath AS filePath, r.type AS relType, r.confidence AS confidence` - : `MATCH (n {id: '${nodeId}'})-[r:CodeRelation]->(callee) WHERE r.type IN ['CALLS', 'IMPORTS', 'EXTENDS', 'IMPLEMENTS'] RETURN callee.id AS id, callee.name AS name, labels(callee)[0] AS type, callee.filePath AS filePath, r.type AS relType, r.confidence AS confidence`; - - const related = await executeQuery(query); - - for (const rel of related) { - const relId = rel.id || rel[0]; - if (!visited.has(relId)) { - visited.add(relId); - nextFrontier.push(relId); - impacted.push({ - depth, - id: relId, - name: rel.name || rel[1], - type: rel.type || rel[2], - filePath: rel.filePath || rel[3], - relationType: rel.relType || rel[4], - confidence: rel.confidence || rel[5] || 1.0, - }); - } - } - } - - frontier = nextFrontier; - } - - // Group by depth - const grouped: Record = {}; - for (const item of impacted) { - if (!grouped[item.depth]) grouped[item.depth] = []; - grouped[item.depth].push(item); - } - - return { - target: { - id: symId, - name: sym.name || sym[1], - type: sym.type || sym[2], - filePath: sym.filePath || sym[3], - }, - direction, - impactedCount: impacted.length, - byDepth: grouped, - }; - } - - private async analyze(params: { path?: string; force?: boolean }): Promise { - const targetPath = params.path ? path.resolve(params.path) : process.cwd(); - - return { - action: 'analyze', - targetPath, - message: `To index this repository, run:\n\n cd ${targetPath}\n gitnexus analyze${params.force ? ' --force' : ''}\n\nThis will create a .gitnexus/ folder with the knowledge graph.`, - }; - } - - async disconnect(): Promise { - closeKuzu(); - await disposeEmbedder(); - this.repo = null; - this._context = null; - this.initialized = false; - } -} diff --git a/gitnexus-mcp/src/mcp/server.ts b/gitnexus-mcp/src/mcp/server.ts deleted file mode 100644 index 74f4b6100..000000000 --- a/gitnexus-mcp/src/mcp/server.ts +++ /dev/null @@ -1,180 +0,0 @@ -/** - * MCP Server - * - * Model Context Protocol server that runs on stdio. - * External AI tools (Cursor, Claude) spawn this process and - * communicate via stdin/stdout using the MCP protocol. - * - * Tools: context, search, cypher, overview, explore, impact, analyze - */ - -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; -import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; -import { - CallToolRequestSchema, - ListToolsRequestSchema, - ListResourcesRequestSchema, - ReadResourceRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; -import { GITNEXUS_TOOLS } from './tools.js'; -import type { LocalBackend, CodebaseContext } from '../local/local-backend.js'; - -/** - * Format context as markdown for the resource - */ -function formatContextAsMarkdown(context: CodebaseContext): string { - const { projectName, stats } = context; - - const lines: string[] = []; - - lines.push(`# GitNexus: ${projectName}`); - lines.push(''); - lines.push('## Stats'); - lines.push(`- Files: ${stats.fileCount}`); - lines.push(`- Functions: ${stats.functionCount}`); - if (stats.communityCount > 0) lines.push(`- Communities: ${stats.communityCount}`); - if (stats.processCount > 0) lines.push(`- Processes: ${stats.processCount}`); - lines.push(''); - - lines.push('## Available Tools'); - lines.push(''); - lines.push('- **context**: Codebase overview and stats'); - lines.push('- **search**: Hybrid semantic + keyword search'); - lines.push('- **cypher**: Execute Cypher queries on graph'); - lines.push('- **overview**: List communities and processes'); - lines.push('- **explore**: Deep dive on symbol/cluster/process'); - lines.push('- **impact**: Change impact analysis'); - lines.push('- **analyze**: Index/re-index repository'); - lines.push(''); - - lines.push('## Graph Schema'); - lines.push(''); - lines.push('**Nodes**: File, Function, Class, Interface, Method, Community, Process'); - lines.push(''); - lines.push('**Relations**: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS'); - - return lines.join('\n'); -} - -export async function startMCPServer(backend: LocalBackend): Promise { - const server = new Server( - { - name: 'gitnexus', - version: '0.2.0', - }, - { - capabilities: { - tools: {}, - resources: {}, - }, - } - ); - - // Handle list resources request - server.setRequestHandler(ListResourcesRequestSchema, async () => { - const context = backend.context; - - if (!context) { - return { resources: [] }; - } - - return { - resources: [ - { - uri: 'gitnexus://codebase/context', - name: `GitNexus: ${context.projectName}`, - description: `Codebase context for ${context.projectName} (${context.stats.fileCount} files)`, - mimeType: 'text/markdown', - }, - ], - }; - }); - - // Handle read resource request - server.setRequestHandler(ReadResourceRequestSchema, async (request) => { - const { uri } = request.params; - - if (uri === 'gitnexus://codebase/context') { - const context = backend.context; - - if (!context) { - return { - contents: [ - { - uri, - mimeType: 'text/plain', - text: 'No codebase loaded.', - }, - ], - }; - } - - return { - contents: [ - { - uri, - mimeType: 'text/markdown', - text: formatContextAsMarkdown(context), - }, - ], - }; - } - - throw new Error(`Unknown resource: ${uri}`); - }); - - // Handle list tools request - server.setRequestHandler(ListToolsRequestSchema, async () => ({ - tools: GITNEXUS_TOOLS.map((tool) => ({ - name: tool.name, - description: tool.description, - inputSchema: tool.inputSchema, - })), - })); - - // Handle tool calls - server.setRequestHandler(CallToolRequestSchema, async (request) => { - const { name, arguments: args } = request.params; - - try { - const result = await backend.callTool(name, args); - - return { - content: [ - { - type: 'text', - text: typeof result === 'string' ? result : JSON.stringify(result, null, 2), - }, - ], - }; - } catch (error) { - const message = error instanceof Error ? error.message : 'Unknown error'; - return { - content: [ - { - type: 'text', - text: `Error: ${message}`, - }, - ], - isError: true, - }; - } - }); - - // Connect to stdio transport - const transport = new StdioServerTransport(); - await server.connect(transport); - - // Handle graceful shutdown - process.on('SIGINT', async () => { - await backend.disconnect(); - await server.close(); - process.exit(0); - }); - - process.on('SIGTERM', async () => { - await backend.disconnect(); - await server.close(); - process.exit(0); - }); -} diff --git a/gitnexus-mcp/src/mcp/tools.ts b/gitnexus-mcp/src/mcp/tools.ts deleted file mode 100644 index f4d6e997c..000000000 --- a/gitnexus-mcp/src/mcp/tools.ts +++ /dev/null @@ -1,191 +0,0 @@ -/** - * MCP Tool Definitions - * - * Defines the tools that GitNexus exposes to external AI agents. - * Only includes tools that provide unique value over native IDE capabilities. - */ - -export interface ToolDefinition { - name: string; - description: string; - inputSchema: { - type: 'object'; - properties: Record; - required: string[]; - }; -} - -export const GITNEXUS_TOOLS: ToolDefinition[] = [ - { - name: 'analyze', - description: `Index or re-index the current repository. - -Creates .gitnexus/ in repo root with: -- Knowledge graph (functions, classes, calls, imports) -- BM25 search index -- Community detection (Leiden) -- Process tracing - -Run this when: -- First time using GitNexus on a repo -- After major code changes -- When 'not indexed' error appears`, - inputSchema: { - type: 'object', - properties: { - path: { type: 'string', description: 'Repo path (default: current directory)' }, - force: { type: 'boolean', description: 'Re-index even if exists', default: false }, - skipEmbeddings: { type: 'boolean', description: 'Skip embedding generation (faster)', default: false }, - }, - required: [], - }, - }, - { - name: 'context', - description: `Get GitNexus codebase context. CALL THIS FIRST before using other tools. - -Returns: -- Project name and stats (files, functions, classes) -- Hotspots (most connected/important nodes) -- Communities and processes count -- Tool usage guidance - -ALWAYS call this first to understand the codebase before searching or querying.`, - inputSchema: { - type: 'object', - properties: {}, - required: [], - }, - }, - { - name: 'search', - description: `Hybrid search (keyword + semantic) across the codebase. -Returns code nodes with their graph connections, grouped by process. - -BETTER THAN IDE search because: -- Process-aware grouping (shows execution flows) -- Cluster context (which functional area) -- Relationship data (callers/callees) - -RETURNS: Array of {name, type, filePath, code, connections[], cluster, processes[]}`, - inputSchema: { - type: 'object', - properties: { - query: { type: 'string', description: 'Natural language or keyword search query' }, - limit: { type: 'number', description: 'Max results to return', default: 10 }, - depth: { type: 'string', description: 'Result detail: "definitions" (symbols only) or "full" (with relationships)', enum: ['definitions', 'full'], default: 'definitions' }, - groupByProcess: { type: 'boolean', description: 'Group results by process', default: true }, - }, - required: ['query'], - }, - }, - { - name: 'cypher', - description: `Execute Cypher query against the code knowledge graph. - -SCHEMA: -- Nodes: File, Folder, Function, Class, Interface, Method, Community, Process -- Edges via CodeRelation.type: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, CONTAINS, DEFINES, MEMBER_OF, STEP_IN_PROCESS - -EXAMPLES: -• Find callers of a function: - MATCH (a)-[:CodeRelation {type: 'CALLS'}]->(b:Function {name: "validateUser"}) RETURN a.name, a.filePath - -• Find all functions in a community: - MATCH (f:Function)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community {label: "Auth"}) RETURN f.name - -• Find steps in a process: - MATCH (s)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p:Process {label: "UserLogin"}) RETURN s.name, r.step ORDER BY r.step - -TIPS: -- All relationships use CodeRelation table with 'type' property -- Community = functional cluster detected by Leiden algorithm -- Process = execution flow trace from entry point to terminal`, - inputSchema: { - type: 'object', - properties: { - query: { type: 'string', description: 'Cypher query to execute' }, - }, - required: ['query'], - }, - }, - { - name: 'explore', - description: `Deep dive on a symbol, cluster, or process. - -TYPE: symbol | cluster | process - -For SYMBOL: Shows cluster membership, process participation, callers/callees -For CLUSTER: Shows members, cohesion score, processes touching it -For PROCESS: Shows step-by-step trace, clusters traversed, entry/terminal points - -Use after search to understand context of a specific node.`, - inputSchema: { - type: 'object', - properties: { - name: { type: 'string', description: 'Name of symbol, cluster, or process to explore' }, - type: { type: 'string', description: 'Type: symbol, cluster, or process' }, - }, - required: ['name', 'type'], - }, - }, - { - name: 'overview', - description: `Get codebase map showing all clusters and processes. - -Returns: -- All communities (clusters) with member counts and cohesion scores -- All processes with step counts and types (intra/cross-community) -- High-level architectural view - -Use to understand overall codebase structure before diving deep.`, - inputSchema: { - type: 'object', - properties: { - showProcesses: { type: 'boolean', description: 'Include process list', default: true }, - showClusters: { type: 'boolean', description: 'Include cluster list', default: true }, - limit: { type: 'number', description: 'Max items per category', default: 20 }, - }, - required: [], - }, - }, - { - name: 'impact', - description: `Analyze the impact of changing a code element. -Returns all nodes affected by modifying the target, with distance, edge type, and confidence. - -USE BEFORE making changes to understand ripple effects. - -Output includes: -- Affected processes (with step positions) -- Affected clusters (direct/indirect) -- Risk assessment (critical/high/medium/low) -- Callers/dependents grouped by depth - -EdgeType: CALLS, IMPORTS, EXTENDS, IMPLEMENTS -Confidence: 100% = certain, <80% = fuzzy match - -Depth groups: -- d=1: WILL BREAK (direct callers/importers) -- d=2: LIKELY AFFECTED (indirect) -- d=3: MAY NEED TESTING (transitive)`, - inputSchema: { - type: 'object', - properties: { - target: { type: 'string', description: 'Name of function, class, or file to analyze' }, - direction: { type: 'string', description: 'upstream (what depends on this) or downstream (what this depends on)' }, - maxDepth: { type: 'number', description: 'Max relationship depth (default: 3)', default: 3 }, - relationTypes: { type: 'array', items: { type: 'string' }, description: 'Filter: CALLS, IMPORTS, EXTENDS, IMPLEMENTS (default: usage-based)' }, - includeTests: { type: 'boolean', description: 'Include test files (default: false)' }, - minConfidence: { type: 'number', description: 'Minimum confidence 0-1 (default: 0.7)' }, - }, - required: ['target', 'direction'], - }, - }, -]; diff --git a/gitnexus-mcp/tsconfig.json b/gitnexus-mcp/tsconfig.json deleted file mode 100644 index 6f8152161..000000000 --- a/gitnexus-mcp/tsconfig.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2022", - "module": "NodeNext", - "moduleResolution": "NodeNext", - "lib": [ - "ES2022" - ], - "outDir": "./dist", - "rootDir": "./src", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "declaration": true, - "declarationMap": true, - "sourceMap": true - }, - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "dist" - ] -} \ No newline at end of file From 778ff107071a974e5466c46c0c02cc84533bdfa3 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 01:29:09 +0530 Subject: [PATCH 08/36] feat: auto-generate AI context files after analyze (AGENTS.md, .cursorrules, .windsurfrules) --- gitnexus/src/cli/ai-context.ts | 185 +++++++++++++++++++++++++++++++++ gitnexus/src/cli/analyze.ts | 15 +++ 2 files changed, 200 insertions(+) create mode 100644 gitnexus/src/cli/ai-context.ts diff --git a/gitnexus/src/cli/ai-context.ts b/gitnexus/src/cli/ai-context.ts new file mode 100644 index 000000000..e97192f18 --- /dev/null +++ b/gitnexus/src/cli/ai-context.ts @@ -0,0 +1,185 @@ +/** + * AI Context Generator + * + * Creates AI context files for various IDE integrations. + * Uses .gitnexus/RULES.md as single source of truth, + * with shadow pointer files for different IDEs. + */ + +import fs from 'fs/promises'; +import path from 'path'; + +interface RepoStats { + files?: number; + nodes?: number; + edges?: number; + communities?: number; + processes?: number; +} + +/** + * Generate the full GitNexus rules content + */ +function generateRulesContent(projectName: string, stats: RepoStats): string { + return `# GitNexus MCP Integration + +This project is indexed by GitNexus, providing AI agents with deep code intelligence. + +## Project: ${projectName} + +**Index Stats:** +- Files: ${stats.files || 0} +- Symbols: ${stats.nodes || 0} +- Relationships: ${stats.edges || 0} +- Communities: ${stats.communities || 0} +- Processes: ${stats.processes || 0} + +## Available MCP Tools + +When working with this codebase, use these GitNexus tools: + +### \`context\` +Get codebase overview and stats. **Call this first** to understand the project structure. + +### \`search\` +Hybrid semantic + keyword search across the codebase. +- Returns symbols with their graph connections +- Groups results by process + +\`\`\` +Example: search for "authentication middleware" +\`\`\` + +### \`cypher\` +Execute Cypher queries on the code knowledge graph. + +**Schema:** +- Nodes: \`File\`, \`Function\`, \`Class\`, \`Interface\`, \`Method\`, \`Community\`, \`Process\` +- Relations: \`CALLS\`, \`IMPORTS\`, \`EXTENDS\`, \`IMPLEMENTS\`, \`DEFINES\`, \`MEMBER_OF\`, \`STEP_IN_PROCESS\` + +\`\`\`cypher +// Find all callers of a function +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunction"}) +RETURN caller.name, caller.filePath +\`\`\` + +### \`overview\` +List all communities (functional clusters) and processes (execution flows). + +### \`explore\` +Deep dive on a specific symbol, cluster, or process. +- \`type: "symbol"\` - Get callers, callees, community membership +- \`type: "cluster"\` - Get all members of a functional cluster +- \`type: "process"\` - Get step-by-step execution trace + +### \`impact\` +Analyze change impact before modifying code. +- \`direction: "upstream"\` - What depends on this symbol (will break if changed) +- \`direction: "downstream"\` - What this symbol depends on + +## Best Practices + +1. **Always call \`context\` first** when starting a new conversation +2. **Use \`search\` for discovery** - semantic search understands intent +3. **Use \`impact\` before refactoring** - understand blast radius +4. **Use \`explore\` for deep dives** - understand symbol context +5. **Use \`cypher\` for complex queries** - full graph power + +## Graph Concepts + +- **Community**: Functional cluster detected by Leiden algorithm (e.g., "Auth", "Database", "API") +- **Process**: Execution flow from entry point to terminal (e.g., "HandleRequest → ValidateUser → SaveToDb") +- **Confidence**: Relationship confidence score (1.0 = certain, <0.8 = fuzzy match) +`; +} + +/** + * Generate pointer content for shadow files + */ +function generatePointerContent(): string { + return `# AI Agent Rules + +Follow .gitnexus/RULES.md for all project context and coding guidelines. + +This project uses GitNexus MCP for code intelligence. See .gitnexus/RULES.md for available tools and best practices. +`; +} + +/** + * Check if a file exists + */ +async function fileExists(filePath: string): Promise { + try { + await fs.access(filePath); + return true; + } catch { + return false; + } +} + +/** + * Create or append to a file, respecting existing content + */ +async function createOrAppendFile( + filePath: string, + content: string, + appendMarker: string +): Promise<'created' | 'appended' | 'exists'> { + const exists = await fileExists(filePath); + + if (exists) { + const existingContent = await fs.readFile(filePath, 'utf-8'); + + // Check if GitNexus content already present + if (existingContent.includes(appendMarker)) { + return 'exists'; + } + + // Append GitNexus content + const newContent = existingContent.trim() + '\n\n' + content; + await fs.writeFile(filePath, newContent, 'utf-8'); + return 'appended'; + } + + // Create new file + await fs.writeFile(filePath, content, 'utf-8'); + return 'created'; +} + +/** + * Generate AI context files after indexing + */ +export async function generateAIContextFiles( + repoPath: string, + storagePath: string, + projectName: string, + stats: RepoStats +): Promise<{ rulesPath: string; pointerFiles: string[] }> { + const rulesPath = path.join(storagePath, 'RULES.md'); + const pointerFiles: string[] = []; + + // 1. Create main rules file in .gitnexus/ + const rulesContent = generateRulesContent(projectName, stats); + await fs.writeFile(rulesPath, rulesContent, 'utf-8'); + + // 2. Create pointer files in repo root + const pointerContent = generatePointerContent(); + const appendMarker = '.gitnexus/RULES.md'; + + const pointerConfigs = [ + { file: 'AGENTS.md', name: 'AGENTS.md' }, + { file: '.cursorrules', name: '.cursorrules' }, + { file: '.windsurfrules', name: '.windsurfrules' }, + ]; + + for (const config of pointerConfigs) { + const filePath = path.join(repoPath, config.file); + const result = await createOrAppendFile(filePath, pointerContent, appendMarker); + + if (result === 'created' || result === 'appended') { + pointerFiles.push(config.name); + } + } + + return { rulesPath, pointerFiles }; +} diff --git a/gitnexus/src/cli/analyze.ts b/gitnexus/src/cli/analyze.ts index b79303646..b086cf599 100644 --- a/gitnexus/src/cli/analyze.ts +++ b/gitnexus/src/cli/analyze.ts @@ -12,6 +12,7 @@ import { buildBM25Index, exportBM25Index } from '../core/search/bm25-index.js'; import { runEmbeddingPipeline } from '../core/embeddings/embedding-pipeline.js'; import { getStoragePaths, saveMeta, loadMeta, addToGitignore } from '../storage/repo-manager.js'; import { getCurrentCommit, isGitRepo } from '../storage/git.js'; +import { generateAIContextFiles } from './ai-context.js'; export interface AnalyzeOptions { force?: boolean; @@ -87,6 +88,16 @@ export const analyzeCommand = async ( // Add .gitnexus to .gitignore await addToGitignore(repoPath); + // Generate AI context files + const projectName = path.basename(repoPath); + const aiContext = await generateAIContextFiles(repoPath, storagePath, projectName, { + files: pipelineResult.fileContents.size, + nodes: stats.nodes, + edges: stats.edges, + communities: pipelineResult.communityResult?.stats.totalCommunities, + processes: pipelineResult.processResult?.stats.totalProcesses, + }); + // Close database await closeKuzu(); @@ -94,4 +105,8 @@ export const analyzeCommand = async ( console.log(` Path: ${repoPath}`); console.log(` Storage: ${storagePath}`); console.log(` Stats: ${stats.nodes} nodes, ${stats.edges} edges`); + + if (aiContext.pointerFiles.length > 0) { + console.log(` AI Context: ${aiContext.pointerFiles.join(', ')}`); + } }; From 1ed9d286aee3067cf10ef5068bdb0c23a2fd2693 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 01:40:59 +0530 Subject: [PATCH 09/36] chore: cleanup empty csv directory after kuzu load --- gitnexus/src/core/kuzu/kuzu-adapter.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gitnexus/src/core/kuzu/kuzu-adapter.ts b/gitnexus/src/core/kuzu/kuzu-adapter.ts index e42a6fb7c..3681b440c 100644 --- a/gitnexus/src/core/kuzu/kuzu-adapter.ts +++ b/gitnexus/src/core/kuzu/kuzu-adapter.ts @@ -126,6 +126,13 @@ export const loadGraphToKuzu = async ( // ignore } } + + // Remove empty csv directory + try { + await fs.rmdir(csvDir); + } catch { + // ignore if not empty or other error + } return { success: true, insertedRels, skippedRels }; }; From 5830a5028810881eea7c3703a9761ef99574586f Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 02:30:16 +0530 Subject: [PATCH 10/36] feat: analyze command auto-finds git root when run from subdirectory --- gitnexus/src/cli/analyze.ts | 17 +++++++++++++++-- gitnexus/src/storage/git.ts | 13 +++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/gitnexus/src/cli/analyze.ts b/gitnexus/src/cli/analyze.ts index b086cf599..d46f0fcea 100644 --- a/gitnexus/src/cli/analyze.ts +++ b/gitnexus/src/cli/analyze.ts @@ -11,7 +11,7 @@ import { initKuzu, loadGraphToKuzu, getKuzuStats, executeQuery, executeWithReuse import { buildBM25Index, exportBM25Index } from '../core/search/bm25-index.js'; import { runEmbeddingPipeline } from '../core/embeddings/embedding-pipeline.js'; import { getStoragePaths, saveMeta, loadMeta, addToGitignore } from '../storage/repo-manager.js'; -import { getCurrentCommit, isGitRepo } from '../storage/git.js'; +import { getCurrentCommit, isGitRepo, getGitRoot } from '../storage/git.js'; import { generateAIContextFiles } from './ai-context.js'; export interface AnalyzeOptions { @@ -23,9 +23,22 @@ export const analyzeCommand = async ( inputPath?: string, options?: AnalyzeOptions ) => { - const repoPath = path.resolve(inputPath || '.'); const spinner = ora('Checking repository...').start(); + // If path provided, use it directly. Otherwise, find git root from cwd. + let repoPath: string; + if (inputPath) { + repoPath = path.resolve(inputPath); + } else { + const gitRoot = getGitRoot(process.cwd()); + if (!gitRoot) { + spinner.fail('Not inside a git repository'); + process.exitCode = 1; + return; + } + repoPath = gitRoot; + } + if (!isGitRepo(repoPath)) { spinner.fail('Not a git repository'); process.exitCode = 1; diff --git a/gitnexus/src/storage/git.ts b/gitnexus/src/storage/git.ts index 817b5717c..6670565ca 100644 --- a/gitnexus/src/storage/git.ts +++ b/gitnexus/src/storage/git.ts @@ -25,5 +25,18 @@ export const getStatusPorcelain = (repoPath: string): string => { } }; +/** + * Find the git repository root from any path inside the repo + */ +export const getGitRoot = (fromPath: string): string | null => { + try { + return execSync('git rev-parse --show-toplevel', { cwd: fromPath }) + .toString() + .trim(); + } catch { + return null; + } +}; + From 747cf003b8c55b0d3303803431abcebb0f779fff Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 02:50:51 +0530 Subject: [PATCH 11/36] feat: improved AI context - full inline content in AGENTS.md and CLAUDE.md with markers for updates --- gitnexus/src/cli/ai-context.ts | 221 ++++++++++++++++----------------- 1 file changed, 109 insertions(+), 112 deletions(-) diff --git a/gitnexus/src/cli/ai-context.ts b/gitnexus/src/cli/ai-context.ts index e97192f18..119877c09 100644 --- a/gitnexus/src/cli/ai-context.ts +++ b/gitnexus/src/cli/ai-context.ts @@ -1,9 +1,9 @@ /** * AI Context Generator * - * Creates AI context files for various IDE integrations. - * Uses .gitnexus/RULES.md as single source of truth, - * with shadow pointer files for different IDEs. + * Creates AGENTS.md and CLAUDE.md with full inline GitNexus context. + * AGENTS.md is the standard read by Cursor, Windsurf, OpenCode, Cline, etc. + * CLAUDE.md is for Claude Code which only reads that file. */ import fs from 'fs/promises'; @@ -17,45 +17,77 @@ interface RepoStats { processes?: number; } +const GITNEXUS_START_MARKER = ''; +const GITNEXUS_END_MARKER = ''; + /** - * Generate the full GitNexus rules content + * Generate the full GitNexus context content */ -function generateRulesContent(projectName: string, stats: RepoStats): string { - return `# GitNexus MCP Integration +function generateGitNexusContent(projectName: string, stats: RepoStats): string { + return `${GITNEXUS_START_MARKER} +# GitNexus MCP This project is indexed by GitNexus, providing AI agents with deep code intelligence. ## Project: ${projectName} -**Index Stats:** -- Files: ${stats.files || 0} -- Symbols: ${stats.nodes || 0} -- Relationships: ${stats.edges || 0} -- Communities: ${stats.communities || 0} -- Processes: ${stats.processes || 0} +| Metric | Count | +|--------|-------| +| Files | ${stats.files || 0} | +| Symbols | ${stats.nodes || 0} | +| Relationships | ${stats.edges || 0} | +| Communities | ${stats.communities || 0} | +| Processes | ${stats.processes || 0} | -## Available MCP Tools +## Quick Start -When working with this codebase, use these GitNexus tools: +1. **Call \`context\` first** — Understand the codebase structure +2. **Use \`search\` for discovery** — Semantic search with graph context +3. **Use \`impact\` before refactoring** — Understand blast radius + +## Available Tools + +| Tool | Purpose | When to Use | +|------|---------|-------------| +| \`context\` | Codebase overview | Start of conversation | +| \`search\` | Semantic + keyword search | Finding code | +| \`overview\` | List clusters & processes | Understanding architecture | +| \`explore\` | Deep dive on symbol/cluster/process | Detailed investigation | +| \`impact\` | Blast radius analysis | Before making changes | +| \`cypher\` | Raw graph queries | Complex analysis | + +## Tool Reference ### \`context\` -Get codebase overview and stats. **Call this first** to understand the project structure. +Get codebase overview and stats. **Call this first.** ### \`search\` -Hybrid semantic + keyword search across the codebase. -- Returns symbols with their graph connections -- Groups results by process +\`\`\` +search(query: "authentication middleware", depth: "full") +\`\`\` +- \`depth: "definitions"\` — Symbol signatures only (default) +- \`depth: "full"\` — Symbols + all relationships +### \`explore\` \`\`\` -Example: search for "authentication middleware" +explore(name: "validateUser", type: "symbol") +explore(name: "Authentication", type: "cluster") +explore(name: "LoginFlow", type: "process") \`\`\` +### \`impact\` +\`\`\` +impact(target: "UserService", direction: "upstream", minConfidence: 0.8) +\`\`\` +- \`upstream\` — What depends on this (will break if changed) +- \`downstream\` — What this depends on + ### \`cypher\` -Execute Cypher queries on the code knowledge graph. +Execute Cypher queries on the knowledge graph. **Schema:** -- Nodes: \`File\`, \`Function\`, \`Class\`, \`Interface\`, \`Method\`, \`Community\`, \`Process\` -- Relations: \`CALLS\`, \`IMPORTS\`, \`EXTENDS\`, \`IMPLEMENTS\`, \`DEFINES\`, \`MEMBER_OF\`, \`STEP_IN_PROCESS\` +- Nodes: \`File\`, \`Folder\`, \`Function\`, \`Class\`, \`Interface\`, \`Method\`, \`Community\`, \`Process\` +- Edges: \`CALLS\`, \`IMPORTS\`, \`EXTENDS\`, \`IMPLEMENTS\`, \`DEFINES\`, \`MEMBER_OF\`, \`STEP_IN_PROCESS\` \`\`\`cypher // Find all callers of a function @@ -63,46 +95,15 @@ MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunction"} RETURN caller.name, caller.filePath \`\`\` -### \`overview\` -List all communities (functional clusters) and processes (execution flows). +## Key Concepts -### \`explore\` -Deep dive on a specific symbol, cluster, or process. -- \`type: "symbol"\` - Get callers, callees, community membership -- \`type: "cluster"\` - Get all members of a functional cluster -- \`type: "process"\` - Get step-by-step execution trace +| Concept | Description | +|---------|-------------| +| **Community** | Functional cluster detected by Leiden algorithm | +| **Process** | Execution flow from entry point to terminal | +| **Confidence** | Relationship trust score (1.0 = certain, <0.8 = fuzzy) | -### \`impact\` -Analyze change impact before modifying code. -- \`direction: "upstream"\` - What depends on this symbol (will break if changed) -- \`direction: "downstream"\` - What this symbol depends on - -## Best Practices - -1. **Always call \`context\` first** when starting a new conversation -2. **Use \`search\` for discovery** - semantic search understands intent -3. **Use \`impact\` before refactoring** - understand blast radius -4. **Use \`explore\` for deep dives** - understand symbol context -5. **Use \`cypher\` for complex queries** - full graph power - -## Graph Concepts - -- **Community**: Functional cluster detected by Leiden algorithm (e.g., "Auth", "Database", "API") -- **Process**: Execution flow from entry point to terminal (e.g., "HandleRequest → ValidateUser → SaveToDb") -- **Confidence**: Relationship confidence score (1.0 = certain, <0.8 = fuzzy match) -`; -} - -/** - * Generate pointer content for shadow files - */ -function generatePointerContent(): string { - return `# AI Agent Rules - -Follow .gitnexus/RULES.md for all project context and coding guidelines. - -This project uses GitNexus MCP for code intelligence. See .gitnexus/RULES.md for available tools and best practices. -`; +${GITNEXUS_END_MARKER}`; } /** @@ -118,32 +119,41 @@ async function fileExists(filePath: string): Promise { } /** - * Create or append to a file, respecting existing content + * Create or update GitNexus section in a file + * - If file doesn't exist: create with GitNexus content + * - If file exists without GitNexus section: append + * - If file exists with GitNexus section: replace that section */ -async function createOrAppendFile( - filePath: string, - content: string, - appendMarker: string -): Promise<'created' | 'appended' | 'exists'> { +async function upsertGitNexusSection( + filePath: string, + content: string +): Promise<'created' | 'updated' | 'appended'> { const exists = await fileExists(filePath); - - if (exists) { - const existingContent = await fs.readFile(filePath, 'utf-8'); - - // Check if GitNexus content already present - if (existingContent.includes(appendMarker)) { - return 'exists'; - } - - // Append GitNexus content - const newContent = existingContent.trim() + '\n\n' + content; - await fs.writeFile(filePath, newContent, 'utf-8'); - return 'appended'; + + if (!exists) { + await fs.writeFile(filePath, content, 'utf-8'); + return 'created'; } - - // Create new file - await fs.writeFile(filePath, content, 'utf-8'); - return 'created'; + + const existingContent = await fs.readFile(filePath, 'utf-8'); + + // Check if GitNexus section already exists + const startIdx = existingContent.indexOf(GITNEXUS_START_MARKER); + const endIdx = existingContent.indexOf(GITNEXUS_END_MARKER); + + if (startIdx !== -1 && endIdx !== -1) { + // Replace existing section + const before = existingContent.substring(0, startIdx); + const after = existingContent.substring(endIdx + GITNEXUS_END_MARKER.length); + const newContent = before + content + after; + await fs.writeFile(filePath, newContent.trim() + '\n', 'utf-8'); + return 'updated'; + } + + // Append new section + const newContent = existingContent.trim() + '\n\n' + content + '\n'; + await fs.writeFile(filePath, newContent, 'utf-8'); + return 'appended'; } /** @@ -151,35 +161,22 @@ async function createOrAppendFile( */ export async function generateAIContextFiles( repoPath: string, - storagePath: string, + _storagePath: string, projectName: string, stats: RepoStats -): Promise<{ rulesPath: string; pointerFiles: string[] }> { - const rulesPath = path.join(storagePath, 'RULES.md'); - const pointerFiles: string[] = []; - - // 1. Create main rules file in .gitnexus/ - const rulesContent = generateRulesContent(projectName, stats); - await fs.writeFile(rulesPath, rulesContent, 'utf-8'); - - // 2. Create pointer files in repo root - const pointerContent = generatePointerContent(); - const appendMarker = '.gitnexus/RULES.md'; - - const pointerConfigs = [ - { file: 'AGENTS.md', name: 'AGENTS.md' }, - { file: '.cursorrules', name: '.cursorrules' }, - { file: '.windsurfrules', name: '.windsurfrules' }, - ]; - - for (const config of pointerConfigs) { - const filePath = path.join(repoPath, config.file); - const result = await createOrAppendFile(filePath, pointerContent, appendMarker); - - if (result === 'created' || result === 'appended') { - pointerFiles.push(config.name); - } - } - - return { rulesPath, pointerFiles }; +): Promise<{ files: string[] }> { + const content = generateGitNexusContent(projectName, stats); + const createdFiles: string[] = []; + + // Create AGENTS.md (standard for Cursor, Windsurf, OpenCode, Cline, etc.) + const agentsPath = path.join(repoPath, 'AGENTS.md'); + const agentsResult = await upsertGitNexusSection(agentsPath, content); + createdFiles.push(`AGENTS.md (${agentsResult})`); + + // Create CLAUDE.md (for Claude Code) + const claudePath = path.join(repoPath, 'CLAUDE.md'); + const claudeResult = await upsertGitNexusSection(claudePath, content); + createdFiles.push(`CLAUDE.md (${claudeResult})`); + + return { files: createdFiles }; } From e480888cf05b888ee124759414e442973071fff5 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 03:06:19 +0530 Subject: [PATCH 12/36] fix: clean command --force flag, hide debug logs in production --- gitnexus/src/cli/analyze.ts | 4 ++-- gitnexus/src/cli/index.ts | 5 ++--- .../src/core/ingestion/import-processor.ts | 20 ++++++++++--------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/gitnexus/src/cli/analyze.ts b/gitnexus/src/cli/analyze.ts index d46f0fcea..312693190 100644 --- a/gitnexus/src/cli/analyze.ts +++ b/gitnexus/src/cli/analyze.ts @@ -119,7 +119,7 @@ export const analyzeCommand = async ( console.log(` Storage: ${storagePath}`); console.log(` Stats: ${stats.nodes} nodes, ${stats.edges} edges`); - if (aiContext.pointerFiles.length > 0) { - console.log(` AI Context: ${aiContext.pointerFiles.join(', ')}`); + if (aiContext.files.length > 0) { + console.log(` AI Context: ${aiContext.files.join(', ')}`); } }; diff --git a/gitnexus/src/cli/index.ts b/gitnexus/src/cli/index.ts index 149e0f1b7..8e354ba50 100644 --- a/gitnexus/src/cli/index.ts +++ b/gitnexus/src/cli/index.ts @@ -43,9 +43,8 @@ program .action(statusCommand); program - .command('clean [target]') - .description('Delete indexed repository(ies)') - .option('-a, --all', 'Delete all indexed repositories') + .command('clean') + .description('Delete GitNexus index for current repo') .option('-f, --force', 'Skip confirmation prompt') .action(cleanCommand); diff --git a/gitnexus/src/core/ingestion/import-processor.ts b/gitnexus/src/core/ingestion/import-processor.ts index aeac2162f..1977ca290 100644 --- a/gitnexus/src/core/ingestion/import-processor.ts +++ b/gitnexus/src/core/ingestion/import-processor.ts @@ -163,15 +163,17 @@ export const processImports = async ( // Removed verbose Java import logging } catch (queryError: any) { - // Detailed debug logging for query failures - console.group(`🔴 Query Error: ${file.path}`); - console.log('Language:', language); - console.log('Query (first 200 chars):', queryStr.substring(0, 200) + '...'); - console.log('Error:', queryError?.message || queryError); - console.log('File content (first 300 chars):', file.content.substring(0, 300)); - console.log('AST root type:', tree.rootNode?.type); - console.log('AST has errors:', tree.rootNode?.hasError); - console.groupEnd(); + // Only log query errors in development mode + if (isDev) { + console.group(`🔴 Query Error: ${file.path}`); + console.log('Language:', language); + console.log('Query (first 200 chars):', queryStr.substring(0, 200) + '...'); + console.log('Error:', queryError?.message || queryError); + console.log('File content (first 300 chars):', file.content.substring(0, 300)); + console.log('AST root type:', tree.rootNode?.type); + console.log('AST has errors:', tree.rootNode?.hasError); + console.groupEnd(); + } if (wasReparsed) (tree as any).delete?.(); continue; From 664aa820f51b959f7d9a1210a9da04f366d7cbfb Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 03:52:49 +0530 Subject: [PATCH 13/36] fix: move typescript to dependencies, add prepare script for production builds --- gitnexus/package.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/gitnexus/package.json b/gitnexus/package.json index 968a6ff62..c4403f9d8 100644 --- a/gitnexus/package.json +++ b/gitnexus/package.json @@ -13,7 +13,8 @@ ], "scripts": { "build": "tsc", - "dev": "tsx watch src/cli/index.ts" + "dev": "tsx watch src/cli/index.ts", + "prepare": "npm run build" }, "dependencies": { "@huggingface/transformers": "^3.0.0", @@ -38,6 +39,7 @@ "tree-sitter-python": "^0.21.0", "tree-sitter-rust": "^0.21.0", "tree-sitter-typescript": "^0.21.0", + "typescript": "^5.4.5", "uuid": "^13.0.0" }, "devDependencies": { @@ -45,8 +47,7 @@ "@types/express": "^4.17.21", "@types/node": "^20.0.0", "@types/uuid": "^10.0.0", - "tsx": "^4.0.0", - "typescript": "^5.4.5" + "tsx": "^4.0.0" }, "engines": { "node": ">=18.0.0" From d1e53d70309742ab60f2cbeca5720deac0583423 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Wed, 4 Feb 2026 04:55:09 +0530 Subject: [PATCH 14/36] implemented skills, CLI and MCP merged into /gitnexus --- gitnexus/package.json | 3 +- gitnexus/skills/debugging.md | 122 ++++++++++++++++++++++ gitnexus/skills/exploring.md | 96 +++++++++++++++++ gitnexus/skills/impact-analysis.md | 129 +++++++++++++++++++++++ gitnexus/skills/refactoring.md | 162 +++++++++++++++++++++++++++++ gitnexus/src/cli/ai-context.ts | 80 ++++++++++++++ 6 files changed, 591 insertions(+), 1 deletion(-) create mode 100644 gitnexus/skills/debugging.md create mode 100644 gitnexus/skills/exploring.md create mode 100644 gitnexus/skills/impact-analysis.md create mode 100644 gitnexus/skills/refactoring.md diff --git a/gitnexus/package.json b/gitnexus/package.json index c4403f9d8..5595b2c17 100644 --- a/gitnexus/package.json +++ b/gitnexus/package.json @@ -9,7 +9,8 @@ "gitnexus": "./dist/cli/index.js" }, "files": [ - "dist" + "dist", + "skills" ], "scripts": { "build": "tsc", diff --git a/gitnexus/skills/debugging.md b/gitnexus/skills/debugging.md new file mode 100644 index 000000000..ac75c13d2 --- /dev/null +++ b/gitnexus/skills/debugging.md @@ -0,0 +1,122 @@ +--- +name: gitnexus-debugging +description: Trace bugs through call chains using knowledge graph +--- + +# Debugging with GitNexus + +## Quick Start +1. `gitnexus_search(query)` → Find code related to the error +2. `gitnexus_explore(name, "symbol")` → Get callers and callees +3. `gitnexus_cypher` → Trace specific dependency paths + +## When to Use +- "Why is this function failing?" +- "Trace where this error comes from" +- "Who calls this method?" +- "Debug the payment issue" + +## Workflow +``` +Bug Investigation: +- [ ] Understand the symptom (error message, behavior) +- [ ] gitnexus_search to find related code +- [ ] Identify the suspect function +- [ ] gitnexus_explore to see callers/callees +- [ ] Check which processes the suspect is in +- [ ] Trace dependencies with gitnexus_cypher +- [ ] Form hypothesis and verify +``` + +## Tool Reference + +### gitnexus_search +Find code related to error or symptom. +``` +gitnexus_search({ + query: "payment validation error", + depth: "full", + groupByProcess: true +}) +→ validatePayment, handlePaymentError, PaymentException +→ Grouped by: CheckoutFlow, RefundFlow +``` + +### gitnexus_explore (for symbol) +Get symbol context. +``` +gitnexus_explore({name: "validatePayment", type: "symbol"}) +→ Callers: processCheckout, webhookHandler +→ Callees: verifyCard, fetchRates +→ Cluster: Payment +→ Processes: CheckoutFlow, RefundFlow +``` + +### gitnexus_cypher +Custom graph queries for tracing. + +**Find all callers of a function:** +``` +gitnexus_cypher({query: ` + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validatePayment"}) + RETURN caller.name, caller.filePath +`}) +``` + +**Find what a function calls:** +``` +gitnexus_cypher({query: ` + MATCH (f:Function {name: "validatePayment"})-[:CodeRelation {type: 'CALLS'}]->(callee) + RETURN callee.name, callee.filePath +`}) +``` + +**Trace call chain (2 hops):** +``` +gitnexus_cypher({query: ` + MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"}) + RETURN [n IN nodes(path) | n.name] AS chain +`}) +``` + +## Example: "Payment endpoint returns 500 intermittently" + +1. **Search for payment error handling** + ``` + gitnexus_search({query: "payment error handling", depth: "full"}) + ``` + → validatePayment, handlePaymentError, PaymentException + +2. **Explore the suspect function** + ``` + gitnexus_explore({name: "validatePayment", type: "symbol"}) + ``` + → Callers: processCheckout, webhookHandler + → Callees: verifyCard, **fetchRates** (external API!) + +3. **Form hypothesis** + `fetchRates` calls external currency API → intermittent failures when API is slow + +4. **Verify** + Read `fetchRates` source to check timeout/error handling + +5. **Root cause** + `fetchRates` doesn't handle timeout properly → fix with retry logic + +## Debugging Patterns + +| Symptom | Approach | +|---------|----------| +| Error message | Search for error text, trace throw sites | +| Wrong return value | Trace data flow through callees | +| Intermittent failure | Look for external calls, timeouts | +| Performance issue | Find hot paths via callers count | +| Recent regression | Check recently modified files | + +## When to Use Something Else + +| Need | Use Instead | +|------|-------------| +| Explore unfamiliar code | `gitnexus-exploring` skill | +| Check change impact | `gitnexus-impact-analysis` skill | +| Plan refactoring | `gitnexus-refactoring` skill | diff --git a/gitnexus/skills/exploring.md b/gitnexus/skills/exploring.md new file mode 100644 index 000000000..8488c13ae --- /dev/null +++ b/gitnexus/skills/exploring.md @@ -0,0 +1,96 @@ +--- +name: gitnexus-exploring +description: Navigate unfamiliar code using GitNexus knowledge graph +--- + +# Exploring Codebases + +## Quick Start +1. `gitnexus_context` → Get codebase stats and hotspots +2. `gitnexus_overview` → See all clusters and processes +3. `gitnexus_explore(name, "cluster")` → Deep dive on a cluster + +## When to Use +- "How does authentication work?" +- "What's the project structure?" +- "Show me the main components" +- "Where is the database logic?" + +## Workflow +``` +Exploring Codebase: +- [ ] Call gitnexus_context to get codebase overview +- [ ] Call gitnexus_overview to list clusters +- [ ] Identify the relevant cluster by name +- [ ] Call gitnexus_explore(clusterName, "cluster") to see members +- [ ] Call gitnexus_explore(symbolName, "symbol") for specific functions +``` + +## Tool Reference + +### gitnexus_context +Get codebase overview. **Call first.** +``` +gitnexus_context() +→ Stats: 2,400 nodes, 12 clusters, 45 processes +→ Hotspots: most connected functions +``` + +### gitnexus_overview +List all clusters and processes. +``` +gitnexus_overview({showClusters: true, showProcesses: true}) +→ Clusters: Auth, Database, API, ... +→ Processes: LoginFlow, CheckoutFlow, ... +``` + +### gitnexus_explore +Deep dive on symbol, cluster, or process. +``` +gitnexus_explore({name: "Auth", type: "cluster"}) +→ Members: validateUser, checkToken, hashPassword +→ Processes using this cluster + +gitnexus_explore({name: "validateUser", type: "symbol"}) +→ Callers: loginHandler, apiMiddleware +→ Callees: checkToken, getUserById +→ Cluster: Auth + +gitnexus_explore({name: "LoginFlow", type: "process"}) +→ Steps: handleLogin → validateUser → createSession → respond +``` + +## Example: "How does payment processing work?" + +1. **Get overview** + ``` + gitnexus_context() + ``` + → 2,400 nodes, 12 clusters, 45 processes + +2. **Find payment cluster** + ``` + gitnexus_overview({showClusters: true}) + ``` + → Clusters: Auth, **Payment**, Database, API, ... + +3. **Explore payment cluster** + ``` + gitnexus_explore({name: "Payment", type: "cluster"}) + ``` + → Members: processPayment, validateCard, PaymentService, ... + → Processes: CheckoutFlow, RefundFlow + +4. **Trace the checkout flow** + ``` + gitnexus_explore({name: "CheckoutFlow", type: "process"}) + ``` + → handleCheckout → validateCart → processPayment → sendConfirmation + +## When to Use Something Else + +| Need | Use Instead | +|------|-------------| +| Debug failing code | `gitnexus-debugging` skill | +| Check change impact | `gitnexus-impact-analysis` skill | +| Plan refactoring | `gitnexus-refactoring` skill | diff --git a/gitnexus/skills/impact-analysis.md b/gitnexus/skills/impact-analysis.md new file mode 100644 index 000000000..cc3a85e8f --- /dev/null +++ b/gitnexus/skills/impact-analysis.md @@ -0,0 +1,129 @@ +--- +name: gitnexus-impact-analysis +description: Analyze blast radius before making code changes +--- + +# Impact Analysis + +## Quick Start +1. `gitnexus_impact(target, "upstream")` → What depends on this (will break) +2. Review affected processes and clusters +3. Assess risk level + +## When to Use +- "Is it safe to change this function?" +- "What will break if I modify X?" +- "Show me the blast radius" +- "Who uses this code?" + +## Understanding Output + +| Depth | Risk Level | Meaning | +|-------|-----------|---------| +| d=1 | WILL BREAK | Direct callers/importers | +| d=2 | LIKELY AFFECTED | Indirect dependencies | +| d=3 | MAY NEED TESTING | Transitive effects | + +| Confidence | Meaning | +|------------|---------| +| 1.0 | Certain (static analysis) | +| 0.8+ | High confidence | +| <0.8 | Fuzzy match (may be false positive) | + +## Workflow +``` +Impact Analysis: +- [ ] gitnexus_impact(target, "upstream") to find dependents +- [ ] Review affected processes +- [ ] Check high-confidence (>0.8) dependencies first +- [ ] Count affected clusters (cross-cutting = higher risk) +- [ ] If >10 processes affected, consider splitting change +``` + +## Tool Reference + +### gitnexus_impact +Analyze blast radius. +``` +gitnexus_impact({ + target: "validateUser", + direction: "upstream", + minConfidence: 0.8, + maxDepth: 3, + includeTests: false +}) +``` + +**Parameters:** +- `target` — Function, class, or file name +- `direction` — "upstream" (what depends on this) or "downstream" (what this depends on) +- `minConfidence` — Filter out fuzzy matches (default: 0.7) +- `maxDepth` — How far to trace (default: 3) +- `includeTests` — Include test files (default: false) + +**Output:** +``` +Impact Analysis for "validateUser": + +d=1 (WILL BREAK): +- loginHandler (src/auth/login.ts:42) [CALLS, 100%] +- apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%] + +d=2 (LIKELY AFFECTED): +- authRouter (src/routes/auth.ts:22) [CALLS, 95%] +- sessionManager (src/session/manager.ts:88) [CALLS, 90%] + +Affected Processes: LoginFlow, TokenRefresh, APIGateway +Affected Clusters: Auth, API + +Risk: MEDIUM (3 processes, 2 clusters) +``` + +## Example: "What breaks if I change validateUser?" + +1. **Run impact analysis** + ``` + gitnexus_impact({ + target: "validateUser", + direction: "upstream", + minConfidence: 0.8 + }) + ``` + +2. **Review output** + - d=1: loginHandler, apiMiddleware (WILL BREAK) + - d=2: authRouter, sessionManager (LIKELY AFFECTED) + - Processes: LoginFlow, TokenRefresh, APIGateway + - Risk: MEDIUM + +3. **Decision** + - 2 direct callers → manageable + - 3 processes → need to test all three + - Auth + API clusters → may need API team coordination + +## Risk Assessment Guide + +| Affected | Risk | +|----------|------| +| <5 symbols, 1 cluster | LOW | +| 5-15 symbols, 1-2 clusters | MEDIUM | +| >15 symbols or 3+ clusters | HIGH | +| Critical path (auth, payments) | CRITICAL | + +## Pre-Change Checklist +``` +Before Committing: +- [ ] Run impact analysis +- [ ] Review all d=1 (WILL BREAK) items +- [ ] Verify test coverage for affected processes +- [ ] If risk > MEDIUM, get code review +- [ ] If cross-cluster, coordinate with other teams +``` + +## When to Use Something Else + +| Need | Use Instead | +|------|-------------| +| Explore unfamiliar code | `gitnexus-exploring` skill | +| Debug failing code | `gitnexus-debugging` skill | +| Plan large refactors | `gitnexus-refactoring` skill | diff --git a/gitnexus/skills/refactoring.md b/gitnexus/skills/refactoring.md new file mode 100644 index 000000000..0bd0c84ea --- /dev/null +++ b/gitnexus/skills/refactoring.md @@ -0,0 +1,162 @@ +--- +name: gitnexus-refactoring +description: Plan safe refactors using blast radius and dependency mapping +--- + +# Refactoring with GitNexus + +## Quick Start +1. `gitnexus_impact(target, "upstream")` → Map all dependents +2. `gitnexus_cypher` → Find all references +3. Plan changes in dependency order + +## When to Use +- "Rename this function safely" +- "Extract this into a module" +- "Split this service" +- "Refactor without breaking things" + +## Checklists + +### Rename Symbol +``` +Rename Refactoring: +- [ ] gitnexus_impact(oldName, "upstream") — find all callers +- [ ] gitnexus_search(oldName) — find string literals +- [ ] Check for reflection/dynamic references +- [ ] Update in order: interface → implementation → usages +- [ ] Run tests for affected processes +``` + +### Extract Module +``` +Extract Module: +- [ ] gitnexus_explore(target, "symbol") — map dependencies +- [ ] gitnexus_impact(target, "upstream") — find callers +- [ ] Define new module interface +- [ ] Move code to new module +- [ ] Update imports across affected files +- [ ] Verify no circular dependencies +``` + +### Split Function +``` +Split Function: +- [ ] gitnexus_explore(target, "symbol") — understand callees +- [ ] Group related logic +- [ ] gitnexus_impact — verify callers won't break +- [ ] Create new functions +- [ ] Update callers to use correct function +``` + +## Tool Reference + +### Finding all references +``` +gitnexus_cypher({query: ` + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"}) + RETURN caller.name, caller.filePath + ORDER BY caller.filePath +`}) +``` + +### Finding symbols by name pattern +``` +gitnexus_cypher({query: ` + MATCH (s) + WHERE s.name CONTAINS "Payment" + RETURN s.name, labels(s)[0] AS type, s.filePath +`}) +``` + +### Finding all imports of a module +``` +gitnexus_cypher({query: ` + MATCH (importer)-[:CodeRelation {type: 'IMPORTS'}]->(f:File {name: "utils.ts"}) + RETURN importer.name, importer.filePath +`}) +``` + +### Finding community/cluster members +``` +gitnexus_cypher({query: ` + MATCH (s)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community {label: "Auth"}) + RETURN s.name, labels(s)[0] AS type +`}) +``` + +## Example: Safely Rename `validateUser` to `authenticateUser` + +1. **Map all callers** + ``` + gitnexus_impact({ + target: "validateUser", + direction: "upstream", + minConfidence: 0.9 + }) + ``` + → loginHandler, apiMiddleware, testUtils + +2. **Check for string references** + ``` + gitnexus_search({query: "validateUser"}) + ``` + → Found in: config.json (dynamic reference!) + +3. **Get affected processes** + ``` + gitnexus_explore({name: "validateUser", type: "symbol"}) + ``` + → Processes: LoginFlow, TokenRefresh, APIGateway + +4. **Plan update order** + 1. Update declaration in auth.ts + 2. Update config.json string reference + 3. Update loginHandler + 4. Update apiMiddleware + 5. Update testUtils + 6. Run: LoginFlow, TokenRefresh, APIGateway tests + +## Example: Extract PaymentValidator Module + +1. **Understand current dependencies** + ``` + gitnexus_explore({name: "validatePayment", type: "symbol"}) + ``` + → Callees: verifyCard, checkAmount, fetchRates + → Callers: processCheckout, refundHandler + +2. **Map blast radius** + ``` + gitnexus_impact({target: "validatePayment", direction: "upstream"}) + ``` + → 2 direct callers, 3 processes + +3. **Create new module** + - Move validatePayment, verifyCard, checkAmount to PaymentValidator + - Keep fetchRates as external dependency (inject it) + +4. **Update callers** + - processCheckout: import { validatePayment } from './PaymentValidator' + - refundHandler: import { validatePayment } from './PaymentValidator' + +5. **Verify** + - Run tests for CheckoutFlow, RefundFlow processes + +## Refactoring Safety Rules + +| Risk Factor | Mitigation | +|-------------|------------| +| Many callers (>5) | Update in small batches | +| Cross-cluster | Coordinate with other teams | +| String references | Search for dynamic usage | +| Reflection | Check for dynamic invocation | +| External exports | May break downstream repos | + +## When to Use Something Else + +| Need | Use Instead | +|------|-------------| +| Explore unfamiliar code | `gitnexus-exploring` skill | +| Debug failing code | `gitnexus-debugging` skill | +| Quick impact check | `gitnexus-impact-analysis` skill | diff --git a/gitnexus/src/cli/ai-context.ts b/gitnexus/src/cli/ai-context.ts index 119877c09..8dcf1bd36 100644 --- a/gitnexus/src/cli/ai-context.ts +++ b/gitnexus/src/cli/ai-context.ts @@ -8,6 +8,11 @@ import fs from 'fs/promises'; import path from 'path'; +import { fileURLToPath } from 'url'; + +// ESM equivalent of __dirname +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); interface RepoStats { files?: number; @@ -156,6 +161,74 @@ async function upsertGitNexusSection( return 'appended'; } +/** + * Install GitNexus skills to .claude/skills/gitnexus/ + * Works natively with Claude Code, Cursor, and GitHub Copilot + */ +async function installSkills(repoPath: string): Promise { + const skillsDir = path.join(repoPath, '.claude', 'skills', 'gitnexus'); + const installedSkills: string[] = []; + + // Skill definitions bundled with the package + const skills = [ + { + name: 'exploring', + description: 'Navigate unfamiliar code using GitNexus knowledge graph', + }, + { + name: 'debugging', + description: 'Trace bugs through call chains using knowledge graph', + }, + { + name: 'impact-analysis', + description: 'Analyze blast radius before making code changes', + }, + { + name: 'refactoring', + description: 'Plan safe refactors using blast radius and dependency mapping', + }, + ]; + + for (const skill of skills) { + const skillDir = path.join(skillsDir, skill.name); + const skillPath = path.join(skillDir, 'SKILL.md'); + + try { + // Create skill directory + await fs.mkdir(skillDir, { recursive: true }); + + // Try to read from package skills directory + const packageSkillPath = path.join(__dirname, '..', '..', 'skills', `${skill.name}.md`); + let skillContent: string; + + try { + skillContent = await fs.readFile(packageSkillPath, 'utf-8'); + } catch { + // Fallback: generate minimal skill content + skillContent = `--- +name: gitnexus-${skill.name} +description: ${skill.description} +--- + +# ${skill.name.charAt(0).toUpperCase() + skill.name.slice(1)} + +${skill.description} + +Use GitNexus tools to accomplish this task. +`; + } + + await fs.writeFile(skillPath, skillContent, 'utf-8'); + installedSkills.push(skill.name); + } catch (err) { + // Skip on error, don't fail the whole process + console.warn(`Warning: Could not install skill ${skill.name}:`, err); + } + } + + return installedSkills; +} + /** * Generate AI context files after indexing */ @@ -178,5 +251,12 @@ export async function generateAIContextFiles( const claudeResult = await upsertGitNexusSection(claudePath, content); createdFiles.push(`CLAUDE.md (${claudeResult})`); + // Install skills to .claude/skills/gitnexus/ + const installedSkills = await installSkills(repoPath); + if (installedSkills.length > 0) { + createdFiles.push(`.claude/skills/gitnexus/ (${installedSkills.length} skills)`); + } + return { files: createdFiles }; } + From 6c3c47edc3cf4e7e498938637d2f5ff7ea3d8e48 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Thu, 5 Feb 2026 05:13:48 +0530 Subject: [PATCH 15/36] resources implemented and agents.md and skills updated to use it --- .claude/skills/gitnexus/debugging/SKILL.md | 103 ++++++ .claude/skills/gitnexus/exploring/SKILL.md | 111 +++++++ .../skills/gitnexus/impact-analysis/SKILL.md | 113 +++++++ .claude/skills/gitnexus/refactoring/SKILL.md | 118 +++++++ .cursor/plans/enhance_523ca41c.plan.md | 239 -------------- .cursorrules | 5 + .gitignore | 3 + .windsurfrules | 5 + AGENTS.md | 81 +++++ CLAUDE.md | 75 +++++ gitnexus/skills/debugging.md | 119 +++---- gitnexus/skills/exploring.md | 129 ++++---- gitnexus/skills/impact-analysis.md | 120 +++---- gitnexus/skills/refactoring.md | 134 +++----- gitnexus/src/cli/ai-context.ts | 76 ++--- gitnexus/src/mcp/local/local-backend.ts | 31 -- gitnexus/src/mcp/resources.ts | 311 ++++++++++++++++++ gitnexus/src/mcp/server.ts | 104 +++--- gitnexus/src/mcp/tools.ts | 17 - 19 files changed, 1219 insertions(+), 675 deletions(-) create mode 100644 .claude/skills/gitnexus/debugging/SKILL.md create mode 100644 .claude/skills/gitnexus/exploring/SKILL.md create mode 100644 .claude/skills/gitnexus/impact-analysis/SKILL.md create mode 100644 .claude/skills/gitnexus/refactoring/SKILL.md delete mode 100644 .cursor/plans/enhance_523ca41c.plan.md create mode 100644 .cursorrules create mode 100644 .windsurfrules create mode 100644 AGENTS.md create mode 100644 CLAUDE.md create mode 100644 gitnexus/src/mcp/resources.ts diff --git a/.claude/skills/gitnexus/debugging/SKILL.md b/.claude/skills/gitnexus/debugging/SKILL.md new file mode 100644 index 000000000..3d8dab1b7 --- /dev/null +++ b/.claude/skills/gitnexus/debugging/SKILL.md @@ -0,0 +1,103 @@ +--- +name: gitnexus-debugging +description: Trace bugs through call chains using knowledge graph +--- + +# Debugging with GitNexus + +## Quick Start +``` +1. gitnexus_search({query}) → Find code related to error +2. gitnexus_explore({name, type: "symbol"}) → Get callers and callees +3. READ gitnexus://process/{name} → Trace execution flow +``` + +## When to Use +- "Why is this function failing?" +- "Trace where this error comes from" +- "Who calls this method?" +- "Debug the payment issue" + +## Workflow Checklist +``` +Bug Investigation: +- [ ] Understand the symptom (error message, behavior) +- [ ] gitnexus_search to find related code +- [ ] Identify the suspect function +- [ ] gitnexus_explore to see callers/callees +- [ ] READ gitnexus://process/{name} if suspect is in a process +- [ ] READ gitnexus://schema for Cypher query help +- [ ] gitnexus_cypher for custom traces +``` + +## Resource Reference + +### gitnexus://schema +Graph schema for writing Cypher queries: +```yaml +nodes: [Function, Class, Method, File, Community, Process] +relationships: [CALLS, IMPORTS, EXTENDS, IMPLEMENTS, MEMBER_OF, STEP_IN_PROCESS] +example_queries: + find_callers: | + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "X"}) + RETURN caller.name +``` + +### gitnexus://process/{name} +Trace execution flow to find where bug might occur: +```yaml +name: CheckoutFlow +trace: + 1: handleCheckout + 2: validateCart + 3: processPayment ← bug here? + 4: sendConfirmation +``` + +## Tool Reference + +### gitnexus_search +Find code related to error or symptom: +``` +gitnexus_search({query: "payment validation error", depth: "full"}) +``` + +### gitnexus_explore +Get symbol context: +``` +gitnexus_explore({name: "validatePayment", type: "symbol"}) +→ Callers: processCheckout, webhookHandler +→ Callees: verifyCard, fetchRates +``` + +### gitnexus_cypher +Custom graph queries for tracing: +```cypher +// Trace call chain (2 hops) +MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"}) +RETURN [n IN nodes(path) | n.name] AS chain +``` + +## Example: "Payment endpoint returns 500 intermittently" + +``` +1. gitnexus_search({query: "payment error handling"}) + → validatePayment, handlePaymentError, PaymentException + +2. gitnexus_explore({name: "validatePayment", type: "symbol"}) + → Callees: verifyCard, fetchRates (external API!) + +3. READ gitnexus://process/CheckoutFlow + → Step 3: validatePayment → calls external API + +4. Root cause: fetchRates calls external API without proper timeout +``` + +## Debugging Patterns + +| Symptom | Approach | +|---------|----------| +| Error message | Search for error text, trace throw sites | +| Wrong return value | Trace data flow through callees | +| Intermittent failure | Look for external calls, timeouts | +| Performance issue | Find hot paths via callers count | diff --git a/.claude/skills/gitnexus/exploring/SKILL.md b/.claude/skills/gitnexus/exploring/SKILL.md new file mode 100644 index 000000000..2baa7f31e --- /dev/null +++ b/.claude/skills/gitnexus/exploring/SKILL.md @@ -0,0 +1,111 @@ +--- +name: gitnexus-exploring +description: Navigate unfamiliar code using GitNexus knowledge graph +--- + +# Exploring Codebases + +## Quick Start +``` +1. READ gitnexus://context → Get codebase overview (~150 tokens) +2. READ gitnexus://clusters → See all functional clusters +3. READ gitnexus://cluster/{name} → Deep dive on specific cluster +``` + +## When to Use +- "How does authentication work?" +- "What's the project structure?" +- "Show me the main components" +- "Where is the database logic?" + +## Workflow Checklist +``` +Exploration Progress: +- [ ] READ gitnexus://context for codebase overview +- [ ] READ gitnexus://clusters to list all clusters +- [ ] Identify the relevant cluster by name +- [ ] READ gitnexus://cluster/{name} for cluster details +- [ ] Use gitnexus_explore for specific symbols +``` + +## Resource Reference + +### gitnexus://context +Codebase overview. **Read first.** +```yaml +project: my-app +stats: + files: 42 + symbols: 918 + clusters: 12 + processes: 45 +tools_available: [search, explore, impact, overview, cypher] +resources_available: [clusters, processes, cluster/{name}, process/{name}] +``` + +### gitnexus://clusters +All functional clusters with cohesion scores. +```yaml +clusters: + - name: "Auth" + symbols: 47 + cohesion: 92% + - name: "Database" + symbols: 32 + cohesion: 88% +``` + +### gitnexus://cluster/{name} +Members of a specific cluster. +```yaml +name: Auth +symbols: 47 +cohesion: 92% +members: + - name: validateUser + type: Function + file: src/auth/validator.ts +``` + +### gitnexus://process/{name} +Full execution trace. +```yaml +name: LoginFlow +type: cross_community +steps: + 1: handleLogin (src/auth/handler.ts) + 2: validateUser (src/auth/validator.ts) + 3: createSession (src/auth/session.ts) +``` + +## Tool Reference (When Resources Aren't Enough) + +### gitnexus_explore +For detailed symbol context with callers/callees: +``` +gitnexus_explore({name: "validateUser", type: "symbol"}) +→ Callers: loginHandler, apiMiddleware +→ Callees: checkToken, getUserById +``` + +### gitnexus_search +For finding code by query: +``` +gitnexus_search({query: "payment validation", depth: "full"}) +``` + +## Example: "How does payment processing work?" + +``` +1. READ gitnexus://context + → 918 symbols, 12 clusters + +2. READ gitnexus://clusters + → Clusters: Auth, Payment, Database, API... + +3. READ gitnexus://cluster/Payment + → Members: processPayment, validateCard, PaymentService + +4. READ gitnexus://process/CheckoutFlow + → handleCheckout → validateCart → processPayment → sendConfirmation +``` diff --git a/.claude/skills/gitnexus/impact-analysis/SKILL.md b/.claude/skills/gitnexus/impact-analysis/SKILL.md new file mode 100644 index 000000000..8f8db0084 --- /dev/null +++ b/.claude/skills/gitnexus/impact-analysis/SKILL.md @@ -0,0 +1,113 @@ +--- +name: gitnexus-impact-analysis +description: Analyze blast radius before making code changes +--- + +# Impact Analysis + +## Quick Start +``` +1. gitnexus_impact({target, direction: "upstream"}) → What depends on this +2. READ gitnexus://clusters → Check affected areas +3. READ gitnexus://processes → Affected execution flows +``` + +## When to Use +- "Is it safe to change this function?" +- "What will break if I modify X?" +- "Show me the blast radius" +- "Who uses this code?" + +## Understanding Output + +| Depth | Risk Level | Meaning | +|-------|-----------|---------| +| d=1 | WILL BREAK | Direct callers/importers | +| d=2 | LIKELY AFFECTED | Indirect dependencies | +| d=3 | MAY NEED TESTING | Transitive effects | + +## Workflow Checklist +``` +Impact Analysis: +- [ ] gitnexus_impact(target, "upstream") to find dependents +- [ ] READ gitnexus://clusters to understand affected areas +- [ ] Check high-confidence (>0.8) dependencies first +- [ ] Count affected clusters (cross-cutting = higher risk) +- [ ] If >10 processes affected, consider splitting change +``` + +## Resource Reference + +### gitnexus://clusters +Check which clusters might be affected: +```yaml +clusters: + - name: Auth + symbols: 47 + - name: API + symbols: 32 +``` + +### gitnexus://processes +Find which processes touch the target: +```yaml +processes: + - name: LoginFlow + type: cross_community + steps: 5 +``` + +## Tool Reference + +### gitnexus_impact +Analyze blast radius: +``` +gitnexus_impact({ + target: "validateUser", + direction: "upstream", + minConfidence: 0.8, + maxDepth: 3 +}) + +→ d=1 (WILL BREAK): + - loginHandler (src/auth/login.ts:42) [CALLS, 100%] + - apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%] + +→ d=2 (LIKELY AFFECTED): + - authRouter (src/routes/auth.ts:22) [CALLS, 95%] + +→ Affected Processes: LoginFlow, TokenRefresh +→ Risk: MEDIUM (3 processes) +``` + +## Risk Assessment + +| Affected | Risk | +|----------|------| +| <5 symbols, 1 cluster | LOW | +| 5-15 symbols, 1-2 clusters | MEDIUM | +| >15 symbols or 3+ clusters | HIGH | +| Critical path (auth, payments) | CRITICAL | + +## Pre-Change Checklist +``` +Before Committing: +- [ ] Run impact analysis +- [ ] Review all d=1 (WILL BREAK) items +- [ ] Verify test coverage for affected processes +- [ ] If risk > MEDIUM, get code review +- [ ] If cross-cluster, coordinate with other teams +``` + +## Example: "What breaks if I change validateUser?" + +``` +1. gitnexus_impact({target: "validateUser", direction: "upstream"}) + → d=1: loginHandler, apiMiddleware + → d=2: authRouter, sessionManager + +2. READ gitnexus://clusters + → Auth and API clusters affected + +3. Decision: 2 direct callers, 2 clusters = MEDIUM risk +``` diff --git a/.claude/skills/gitnexus/refactoring/SKILL.md b/.claude/skills/gitnexus/refactoring/SKILL.md new file mode 100644 index 000000000..1513a2ed6 --- /dev/null +++ b/.claude/skills/gitnexus/refactoring/SKILL.md @@ -0,0 +1,118 @@ +--- +name: gitnexus-refactoring +description: Plan safe refactors using blast radius and dependency mapping +--- + +# Refactoring with GitNexus + +## Quick Start +``` +1. gitnexus_impact({target, direction: "upstream"}) → Map all dependents +2. READ gitnexus://schema → Understand graph structure +3. gitnexus_cypher → Find all references +``` + +## When to Use +- "Rename this function safely" +- "Extract this into a module" +- "Split this service" +- "Refactor without breaking things" + +## Checklists + +### Rename Symbol +``` +Rename Refactoring: +- [ ] gitnexus_impact(oldName, "upstream") — find all callers +- [ ] gitnexus_search(oldName) — find string literals +- [ ] Check for reflection/dynamic references +- [ ] Update in order: interface → implementation → usages +- [ ] Run tests for affected processes +``` + +### Extract Module +``` +Extract Module: +- [ ] gitnexus_explore(target, "symbol") — map dependencies +- [ ] gitnexus_impact(target, "upstream") — find callers +- [ ] READ gitnexus://cluster/{name} — check cohesion +- [ ] Define new module interface +- [ ] Update imports across affected files +``` + +### Split Function +``` +Split Function: +- [ ] gitnexus_explore(target, "symbol") — understand callees +- [ ] Group related logic +- [ ] gitnexus_impact — verify callers won't break +- [ ] Create new functions +- [ ] Update callers +``` + +## Resource Reference + +### gitnexus://schema +Graph structure for Cypher queries: +```yaml +nodes: [Function, Class, Method, Community, Process] +relationships: [CALLS, IMPORTS, EXTENDS, MEMBER_OF] + +example_queries: + find_callers: | + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "X"}) + RETURN caller.name +``` + +### gitnexus://cluster/{name} +Check if extraction preserves cohesion: +```yaml +name: Payment +cohesion: 92% +members: [processPayment, validateCard, PaymentService] +``` + +## Tool Reference + +### Finding all references +```cypher +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"}) +RETURN caller.name, caller.filePath +ORDER BY caller.filePath +``` + +### Finding imports of a module +```cypher +MATCH (importer)-[:CodeRelation {type: 'IMPORTS'}]->(f:File {name: "utils.ts"}) +RETURN importer.name, importer.filePath +``` + +## Example: Safely Rename `validateUser` to `authenticateUser` + +``` +1. gitnexus_impact({target: "validateUser", direction: "upstream"}) + → loginHandler, apiMiddleware, testUtils + +2. gitnexus_search({query: "validateUser"}) + → Found in: config.json (dynamic reference!) + +3. READ gitnexus://processes + → LoginFlow, TokenRefresh, APIGateway + +4. Plan update order: + 1. Update declaration in auth.ts + 2. Update config.json string reference + 3. Update loginHandler + 4. Update apiMiddleware + 5. Run tests for LoginFlow, TokenRefresh +``` + +## Refactoring Safety Rules + +| Risk Factor | Mitigation | +|-------------|------------| +| Many callers (>5) | Update in small batches | +| Cross-cluster | Coordinate with other teams | +| String references | Search for dynamic usage | +| Reflection | Check for dynamic invocation | +| External exports | May break downstream repos | diff --git a/.cursor/plans/enhance_523ca41c.plan.md b/.cursor/plans/enhance_523ca41c.plan.md deleted file mode 100644 index 471e13f67..000000000 --- a/.cursor/plans/enhance_523ca41c.plan.md +++ /dev/null @@ -1,239 +0,0 @@ ---- -name: Enhance -overview: Restructure GitNexus LLM tools to leverage clusters and processes for better code understanding. Remove unused highlight tool, add new tools (explore, overview), enhance existing tools with cluster/process context, and improve impact analysis reliability. -todos: [] ---- - -# Enhanced LLM Tools with Cluster and Process Integration - -## Summary - -Consolidate GitNexus from 6 tools to **7 focused tools** that leverage the pre-computed clusters (Communities) and processes for richer context. Remove the highlight tool, add `explore` and `overview` tools, and enhance `search` and `blastRadius` with cluster/process awareness. - -## Final Tool Set - -| Tool | Status | Purpose ||------|--------|---------|| `search` | Enhance | Hybrid search + group results by process/cluster || `grep` | Keep | Regex pattern search || `read` | Keep | Read file content || `explore` | **New** | Deep dive on one symbol, cluster, or process || `overview` | **New** | Codebase map (all clusters + all processes) || `impact` | Enhance | Rename from blastRadius, add process/cluster context, increase limits || `cypher` | Keep | Raw graph queries || `highlight` | **Remove** | No longer needed | - -## Architecture - -```mermaid -flowchart TD - subgraph tools [LLM Tools Layer] - search[search] - grep[grep] - read[read] - explore[explore] - overview[overview] - impact[impact] - cypher[cypher] - end - - subgraph graph [Knowledge Graph] - nodes[Nodes: File, Function, Class...] - communities[Community Nodes] - processes[Process Nodes] - edges[CodeRelation Edges] - memberOf[MEMBER_OF Edges] - stepIn[STEP_IN_PROCESS Edges] - end - - search --> edges - search --> communities - search --> processes - explore --> communities - explore --> processes - explore --> memberOf - explore --> stepIn - overview --> communities - overview --> processes - impact --> edges - impact --> communities - impact --> processes - cypher --> graph -``` - - - -## File Changes - -### 1. Remove Highlight Tool - -**File:** [gitnexus/src/core/llm/tools.ts](gitnexus/src/core/llm/tools.ts) - -- Delete the `highlightTool` definition (lines ~395-414) -- Remove `highlightTool` from the returned array (line ~862) -- Remove highlight marker logic from `blastRadius` output (line ~814-816) - -**File:** [gitnexus/src/core/llm/agent.ts](gitnexus/src/core/llm/agent.ts) - -- Remove highlight references from system prompt (lines 70, 77) -- Update tool list in prompt to reflect new tools - -**File:** [gitnexus/src/core/llm/types.ts](gitnexus/src/core/llm/types.ts) - -- Remove `'highlight'` from `AgentStreamChunk.type` union (line 180) -- Remove `highlightNodeIds` property (line 187-188) - -### 2. Add `explore` Tool - -**File:** [gitnexus/src/core/llm/tools.ts](gitnexus/src/core/llm/tools.ts)New tool that auto-detects target type and returns comprehensive context: - -```typescript -explore({ - target: string, // Name of symbol, cluster, or process - type?: 'symbol' | 'cluster' | 'process' // Optional, auto-detected -}) -``` - -**Functionality:** - -- For symbols: Query node, get MEMBER_OF cluster, get STEP_IN_PROCESS processes, get 1-hop connections -- For clusters: Query Community node, get members via MEMBER_OF, get processes that touch this cluster -- For processes: Query Process node, get steps via STEP_IN_PROCESS with step order, get clusters touched - -**Cypher queries needed:** - -```cypher --- Symbol cluster membership -MATCH (s {name: $name})-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community) -RETURN c.label, c.description - --- Symbol process participation -MATCH (s {name: $name})-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p:Process) -RETURN p.label, r.step, p.stepCount - --- Process steps in order -MATCH (s)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p:Process {id: $processId}) -RETURN s.name, s.filePath, r.step -ORDER BY r.step -``` - - - -### 3. Add `overview` Tool - -**File:** [gitnexus/src/core/llm/tools.ts](gitnexus/src/core/llm/tools.ts)New tool that returns codebase structure: - -```typescript -overview() // No parameters -``` - -**Functionality:** - -- Query all Community nodes with member counts -- Query all Process nodes with step counts and types -- Calculate cluster dependencies (cross-cluster CALLS) -- Identify critical paths (most connected processes) - -**Output format:** - -```javascript -CLUSTERS (N total): -| Cluster | Symbols | Cohesion | Description | -... - -PROCESSES (N total): -| Process | Steps | Type | Clusters | -... - -CRITICAL PATHS: -- LoginFlow (45 edges) -... -``` - - - -### 4. Enhance `search` Tool - -**File:** [gitnexus/src/core/llm/tools.ts](gitnexus/src/core/llm/tools.ts)Modify existing search to group results by process:**Current:** Returns flat list with 1-hop connections**Enhanced:** Groups results by process, adds cluster context**Changes:** - -- After hybrid search, query STEP_IN_PROCESS for each result -- Group results by process ID -- Sort processes by number of matching results (relevance) -- Add cluster label for each result via MEMBER_OF query -- Keep 1-hop connections as optional detail - -**New parameter:** - -```typescript -search({ - query: string, - groupByProcess?: boolean, // Default: true - limit?: number -}) -``` - - - -### 5. Enhance `impact` Tool (rename from blastRadius) - -**File:** [gitnexus/src/core/llm/tools.ts](gitnexus/src/core/llm/tools.ts)**Rename:** `blastRadiusTool` to `impactTool`**Enhancements:** - -1. Increase LIMIT clauses: 100 to 300 (depth 1), 100 to 200 (depth 2), 50 to 100 (depth 3) -2. Add affected processes section (query STEP_IN_PROCESS for all affected symbols) -3. Add affected clusters section (query MEMBER_OF for all affected symbols) -4. Add risk assessment summary -5. Surface confidence scores more prominently (group by confidence level) - -**New output sections:** - -```javascript -AFFECTED PROCESSES: -- LoginFlow - BROKEN at step 2 -- SignupFlow - BROKEN at step 1 - -AFFECTED CLUSTERS: -- Authentication (direct) -- API Routes (indirect) - -RISK: CRITICAL -- N direct callers -- N processes affected -- N clusters affected -``` - - - -### 6. Increase Process Detection Limits - -**File:** [gitnexus/src/core/ingestion/process-processor.ts](gitnexus/src/core/ingestion/process-processor.ts)Change default config (lines 27-32): - -```typescript -const DEFAULT_CONFIG: ProcessDetectionConfig = { - maxTraceDepth: 10, // Keep - maxBranching: 4, // Was 3 - maxProcesses: 75, // Was 50 - minSteps: 2, // Keep -}; -``` - - - -### 7. Update System Prompt - -**File:** [gitnexus/src/core/llm/agent.ts](gitnexus/src/core/llm/agent.ts)Update BASE_SYSTEM_PROMPT to reflect new tools: - -```javascript -## TOOLS -- **search** - Hybrid search. Results grouped by process with cluster context. -- **grep** - Regex pattern search for exact strings. -- **read** - Read file content. -- **explore** - Deep dive on a symbol, cluster, or process. Shows membership, participation, connections. -- **overview** - Codebase map showing all clusters and processes. -- **impact** - Impact analysis. Shows affected processes, clusters, and risk level. -- **cypher** - Raw Cypher queries against the graph. - -## GRAPH SCHEMA -Nodes: File, Folder, Function, Class, Interface, Method, Community, Process -Relations: CodeRelation with type: CONTAINS, DEFINES, IMPORTS, CALLS, EXTENDS, IMPLEMENTS, MEMBER_OF, STEP_IN_PROCESS -``` - - - -## Implementation Order - -1. Remove highlight tool (cleanup) -2. Increase process detection limits -3. Add overview tool (simplest new tool) -4. Add explore tool -5. Enhance impact tool \ No newline at end of file diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 000000000..397f42422 --- /dev/null +++ b/.cursorrules @@ -0,0 +1,5 @@ +# AI Agent Rules + +Follow .gitnexus/RULES.md for all project context and coding guidelines. + +This project uses GitNexus MCP for code intelligence. See .gitnexus/RULES.md for available tools and best practices. diff --git a/.gitignore b/.gitignore index 0d9b76fbb..a92662bcb 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,6 @@ coverage/ .env*.local .gitnexus + +# Generated files (should not be indexed) +repomix-output* diff --git a/.windsurfrules b/.windsurfrules new file mode 100644 index 000000000..397f42422 --- /dev/null +++ b/.windsurfrules @@ -0,0 +1,5 @@ +# AI Agent Rules + +Follow .gitnexus/RULES.md for all project context and coding guidelines. + +This project uses GitNexus MCP for code intelligence. See .gitnexus/RULES.md for available tools and best practices. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 000000000..662b1f929 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,81 @@ +# AI Agent Rules + +Follow .gitnexus/RULES.md for all project context and coding guidelines. + +This project uses GitNexus MCP for code intelligence. See .gitnexus/RULES.md for available tools and best practices. + + +# GitNexus MCP + +This project is indexed by GitNexus, providing AI agents with deep code intelligence. + +## Project: GitnexusV2 + +| Metric | Count | +|--------|-------| +| Files | 150 | +| Symbols | 930 | +| Relationships | 2411 | +| Communities | 280 | +| Processes | 75 | + +## Quick Start + +``` +1. READ gitnexus://context → Get codebase overview (~150 tokens) +2. READ gitnexus://clusters → See all functional clusters +3. READ gitnexus://cluster/{name} → Deep dive on specific cluster +4. gitnexus_search(query) → Find code by query +``` + +## Available Resources + +| Resource | Purpose | +|----------|---------| +| `gitnexus://context` | Codebase stats, tools, and resources overview | +| `gitnexus://clusters` | All clusters with symbol counts and cohesion | +| `gitnexus://cluster/{name}` | Cluster members and details | +| `gitnexus://processes` | All execution flows with types | +| `gitnexus://process/{name}` | Full process trace with steps | +| `gitnexus://schema` | Graph schema for Cypher queries | + +## Available Tools + +| Tool | Purpose | When to Use | +|------|---------|-------------| +| `search` | Semantic + keyword search | Finding code by query | +| `overview` | List clusters & processes | Understanding architecture | +| `explore` | Deep dive on symbol/cluster/process | Detailed investigation | +| `impact` | Blast radius analysis | Before making changes | +| `cypher` | Raw graph queries | Complex analysis | + +## Workflow Examples + +### Exploring the Codebase +``` +READ gitnexus://context → Stats and overview +READ gitnexus://clusters → Find relevant cluster +READ gitnexus://cluster/Auth → Explore Auth cluster +gitnexus_explore("validateUser", "symbol") → Detailed symbol info +``` + +### Planning a Change +``` +gitnexus_impact("UserService", "upstream") → See what breaks +READ gitnexus://processes → Check affected flows +gitnexus_explore("LoginFlow", "process") → Trace execution +``` + +## Graph Schema + +**Nodes:** File, Function, Class, Interface, Method, Community, Process + +**Relationships:** CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS + +```cypher +// Example: Find callers of a function +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"}) +RETURN caller.name, caller.filePath +``` + + diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..69c4aed5a --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,75 @@ + +# GitNexus MCP + +This project is indexed by GitNexus, providing AI agents with deep code intelligence. + +## Project: GitnexusV2 + +| Metric | Count | +|--------|-------| +| Files | 150 | +| Symbols | 930 | +| Relationships | 2411 | +| Communities | 280 | +| Processes | 75 | + +## Quick Start + +``` +1. READ gitnexus://context → Get codebase overview (~150 tokens) +2. READ gitnexus://clusters → See all functional clusters +3. READ gitnexus://cluster/{name} → Deep dive on specific cluster +4. gitnexus_search(query) → Find code by query +``` + +## Available Resources + +| Resource | Purpose | +|----------|---------| +| `gitnexus://context` | Codebase stats, tools, and resources overview | +| `gitnexus://clusters` | All clusters with symbol counts and cohesion | +| `gitnexus://cluster/{name}` | Cluster members and details | +| `gitnexus://processes` | All execution flows with types | +| `gitnexus://process/{name}` | Full process trace with steps | +| `gitnexus://schema` | Graph schema for Cypher queries | + +## Available Tools + +| Tool | Purpose | When to Use | +|------|---------|-------------| +| `search` | Semantic + keyword search | Finding code by query | +| `overview` | List clusters & processes | Understanding architecture | +| `explore` | Deep dive on symbol/cluster/process | Detailed investigation | +| `impact` | Blast radius analysis | Before making changes | +| `cypher` | Raw graph queries | Complex analysis | + +## Workflow Examples + +### Exploring the Codebase +``` +READ gitnexus://context → Stats and overview +READ gitnexus://clusters → Find relevant cluster +READ gitnexus://cluster/Auth → Explore Auth cluster +gitnexus_explore("validateUser", "symbol") → Detailed symbol info +``` + +### Planning a Change +``` +gitnexus_impact("UserService", "upstream") → See what breaks +READ gitnexus://processes → Check affected flows +gitnexus_explore("LoginFlow", "process") → Trace execution +``` + +## Graph Schema + +**Nodes:** File, Function, Class, Interface, Method, Community, Process + +**Relationships:** CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS + +```cypher +// Example: Find callers of a function +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"}) +RETURN caller.name, caller.filePath +``` + + diff --git a/gitnexus/skills/debugging.md b/gitnexus/skills/debugging.md index ac75c13d2..3d8dab1b7 100644 --- a/gitnexus/skills/debugging.md +++ b/gitnexus/skills/debugging.md @@ -6,9 +6,11 @@ description: Trace bugs through call chains using knowledge graph # Debugging with GitNexus ## Quick Start -1. `gitnexus_search(query)` → Find code related to the error -2. `gitnexus_explore(name, "symbol")` → Get callers and callees -3. `gitnexus_cypher` → Trace specific dependency paths +``` +1. gitnexus_search({query}) → Find code related to error +2. gitnexus_explore({name, type: "symbol"}) → Get callers and callees +3. READ gitnexus://process/{name} → Trace execution flow +``` ## When to Use - "Why is this function failing?" @@ -16,92 +18,80 @@ description: Trace bugs through call chains using knowledge graph - "Who calls this method?" - "Debug the payment issue" -## Workflow +## Workflow Checklist ``` Bug Investigation: - [ ] Understand the symptom (error message, behavior) - [ ] gitnexus_search to find related code - [ ] Identify the suspect function - [ ] gitnexus_explore to see callers/callees -- [ ] Check which processes the suspect is in -- [ ] Trace dependencies with gitnexus_cypher -- [ ] Form hypothesis and verify +- [ ] READ gitnexus://process/{name} if suspect is in a process +- [ ] READ gitnexus://schema for Cypher query help +- [ ] gitnexus_cypher for custom traces +``` + +## Resource Reference + +### gitnexus://schema +Graph schema for writing Cypher queries: +```yaml +nodes: [Function, Class, Method, File, Community, Process] +relationships: [CALLS, IMPORTS, EXTENDS, IMPLEMENTS, MEMBER_OF, STEP_IN_PROCESS] +example_queries: + find_callers: | + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "X"}) + RETURN caller.name +``` + +### gitnexus://process/{name} +Trace execution flow to find where bug might occur: +```yaml +name: CheckoutFlow +trace: + 1: handleCheckout + 2: validateCart + 3: processPayment ← bug here? + 4: sendConfirmation ``` ## Tool Reference ### gitnexus_search -Find code related to error or symptom. +Find code related to error or symptom: ``` -gitnexus_search({ - query: "payment validation error", - depth: "full", - groupByProcess: true -}) -→ validatePayment, handlePaymentError, PaymentException -→ Grouped by: CheckoutFlow, RefundFlow +gitnexus_search({query: "payment validation error", depth: "full"}) ``` -### gitnexus_explore (for symbol) -Get symbol context. +### gitnexus_explore +Get symbol context: ``` gitnexus_explore({name: "validatePayment", type: "symbol"}) → Callers: processCheckout, webhookHandler → Callees: verifyCard, fetchRates -→ Cluster: Payment -→ Processes: CheckoutFlow, RefundFlow ``` ### gitnexus_cypher -Custom graph queries for tracing. - -**Find all callers of a function:** -``` -gitnexus_cypher({query: ` - MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validatePayment"}) - RETURN caller.name, caller.filePath -`}) -``` - -**Find what a function calls:** -``` -gitnexus_cypher({query: ` - MATCH (f:Function {name: "validatePayment"})-[:CodeRelation {type: 'CALLS'}]->(callee) - RETURN callee.name, callee.filePath -`}) -``` - -**Trace call chain (2 hops):** -``` -gitnexus_cypher({query: ` - MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"}) - RETURN [n IN nodes(path) | n.name] AS chain -`}) +Custom graph queries for tracing: +```cypher +// Trace call chain (2 hops) +MATCH path = (a)-[:CodeRelation {type: 'CALLS'}*1..2]->(b:Function {name: "validatePayment"}) +RETURN [n IN nodes(path) | n.name] AS chain ``` ## Example: "Payment endpoint returns 500 intermittently" -1. **Search for payment error handling** - ``` - gitnexus_search({query: "payment error handling", depth: "full"}) - ``` +``` +1. gitnexus_search({query: "payment error handling"}) → validatePayment, handlePaymentError, PaymentException -2. **Explore the suspect function** - ``` - gitnexus_explore({name: "validatePayment", type: "symbol"}) - ``` - → Callers: processCheckout, webhookHandler - → Callees: verifyCard, **fetchRates** (external API!) +2. gitnexus_explore({name: "validatePayment", type: "symbol"}) + → Callees: verifyCard, fetchRates (external API!) -3. **Form hypothesis** - `fetchRates` calls external currency API → intermittent failures when API is slow +3. READ gitnexus://process/CheckoutFlow + → Step 3: validatePayment → calls external API -4. **Verify** - Read `fetchRates` source to check timeout/error handling - -5. **Root cause** - `fetchRates` doesn't handle timeout properly → fix with retry logic +4. Root cause: fetchRates calls external API without proper timeout +``` ## Debugging Patterns @@ -111,12 +101,3 @@ gitnexus_cypher({query: ` | Wrong return value | Trace data flow through callees | | Intermittent failure | Look for external calls, timeouts | | Performance issue | Find hot paths via callers count | -| Recent regression | Check recently modified files | - -## When to Use Something Else - -| Need | Use Instead | -|------|-------------| -| Explore unfamiliar code | `gitnexus-exploring` skill | -| Check change impact | `gitnexus-impact-analysis` skill | -| Plan refactoring | `gitnexus-refactoring` skill | diff --git a/gitnexus/skills/exploring.md b/gitnexus/skills/exploring.md index 8488c13ae..2baa7f31e 100644 --- a/gitnexus/skills/exploring.md +++ b/gitnexus/skills/exploring.md @@ -6,9 +6,11 @@ description: Navigate unfamiliar code using GitNexus knowledge graph # Exploring Codebases ## Quick Start -1. `gitnexus_context` → Get codebase stats and hotspots -2. `gitnexus_overview` → See all clusters and processes -3. `gitnexus_explore(name, "cluster")` → Deep dive on a cluster +``` +1. READ gitnexus://context → Get codebase overview (~150 tokens) +2. READ gitnexus://clusters → See all functional clusters +3. READ gitnexus://cluster/{name} → Deep dive on specific cluster +``` ## When to Use - "How does authentication work?" @@ -16,81 +18,94 @@ description: Navigate unfamiliar code using GitNexus knowledge graph - "Show me the main components" - "Where is the database logic?" -## Workflow +## Workflow Checklist ``` -Exploring Codebase: -- [ ] Call gitnexus_context to get codebase overview -- [ ] Call gitnexus_overview to list clusters +Exploration Progress: +- [ ] READ gitnexus://context for codebase overview +- [ ] READ gitnexus://clusters to list all clusters - [ ] Identify the relevant cluster by name -- [ ] Call gitnexus_explore(clusterName, "cluster") to see members -- [ ] Call gitnexus_explore(symbolName, "symbol") for specific functions +- [ ] READ gitnexus://cluster/{name} for cluster details +- [ ] Use gitnexus_explore for specific symbols ``` -## Tool Reference +## Resource Reference -### gitnexus_context -Get codebase overview. **Call first.** -``` -gitnexus_context() -→ Stats: 2,400 nodes, 12 clusters, 45 processes -→ Hotspots: most connected functions +### gitnexus://context +Codebase overview. **Read first.** +```yaml +project: my-app +stats: + files: 42 + symbols: 918 + clusters: 12 + processes: 45 +tools_available: [search, explore, impact, overview, cypher] +resources_available: [clusters, processes, cluster/{name}, process/{name}] ``` -### gitnexus_overview -List all clusters and processes. +### gitnexus://clusters +All functional clusters with cohesion scores. +```yaml +clusters: + - name: "Auth" + symbols: 47 + cohesion: 92% + - name: "Database" + symbols: 32 + cohesion: 88% ``` -gitnexus_overview({showClusters: true, showProcesses: true}) -→ Clusters: Auth, Database, API, ... -→ Processes: LoginFlow, CheckoutFlow, ... + +### gitnexus://cluster/{name} +Members of a specific cluster. +```yaml +name: Auth +symbols: 47 +cohesion: 92% +members: + - name: validateUser + type: Function + file: src/auth/validator.ts ``` +### gitnexus://process/{name} +Full execution trace. +```yaml +name: LoginFlow +type: cross_community +steps: + 1: handleLogin (src/auth/handler.ts) + 2: validateUser (src/auth/validator.ts) + 3: createSession (src/auth/session.ts) +``` + +## Tool Reference (When Resources Aren't Enough) + ### gitnexus_explore -Deep dive on symbol, cluster, or process. +For detailed symbol context with callers/callees: ``` -gitnexus_explore({name: "Auth", type: "cluster"}) -→ Members: validateUser, checkToken, hashPassword -→ Processes using this cluster - gitnexus_explore({name: "validateUser", type: "symbol"}) → Callers: loginHandler, apiMiddleware → Callees: checkToken, getUserById -→ Cluster: Auth +``` -gitnexus_explore({name: "LoginFlow", type: "process"}) -→ Steps: handleLogin → validateUser → createSession → respond +### gitnexus_search +For finding code by query: +``` +gitnexus_search({query: "payment validation", depth: "full"}) ``` ## Example: "How does payment processing work?" -1. **Get overview** - ``` - gitnexus_context() - ``` - → 2,400 nodes, 12 clusters, 45 processes +``` +1. READ gitnexus://context + → 918 symbols, 12 clusters -2. **Find payment cluster** - ``` - gitnexus_overview({showClusters: true}) - ``` - → Clusters: Auth, **Payment**, Database, API, ... +2. READ gitnexus://clusters + → Clusters: Auth, Payment, Database, API... -3. **Explore payment cluster** - ``` - gitnexus_explore({name: "Payment", type: "cluster"}) - ``` - → Members: processPayment, validateCard, PaymentService, ... - → Processes: CheckoutFlow, RefundFlow +3. READ gitnexus://cluster/Payment + → Members: processPayment, validateCard, PaymentService -4. **Trace the checkout flow** - ``` - gitnexus_explore({name: "CheckoutFlow", type: "process"}) - ``` +4. READ gitnexus://process/CheckoutFlow → handleCheckout → validateCart → processPayment → sendConfirmation - -## When to Use Something Else - -| Need | Use Instead | -|------|-------------| -| Debug failing code | `gitnexus-debugging` skill | -| Check change impact | `gitnexus-impact-analysis` skill | -| Plan refactoring | `gitnexus-refactoring` skill | +``` diff --git a/gitnexus/skills/impact-analysis.md b/gitnexus/skills/impact-analysis.md index cc3a85e8f..8f8db0084 100644 --- a/gitnexus/skills/impact-analysis.md +++ b/gitnexus/skills/impact-analysis.md @@ -6,9 +6,11 @@ description: Analyze blast radius before making code changes # Impact Analysis ## Quick Start -1. `gitnexus_impact(target, "upstream")` → What depends on this (will break) -2. Review affected processes and clusters -3. Assess risk level +``` +1. gitnexus_impact({target, direction: "upstream"}) → What depends on this +2. READ gitnexus://clusters → Check affected areas +3. READ gitnexus://processes → Affected execution flows +``` ## When to Use - "Is it safe to change this function?" @@ -24,84 +26,61 @@ description: Analyze blast radius before making code changes | d=2 | LIKELY AFFECTED | Indirect dependencies | | d=3 | MAY NEED TESTING | Transitive effects | -| Confidence | Meaning | -|------------|---------| -| 1.0 | Certain (static analysis) | -| 0.8+ | High confidence | -| <0.8 | Fuzzy match (may be false positive) | - -## Workflow +## Workflow Checklist ``` Impact Analysis: - [ ] gitnexus_impact(target, "upstream") to find dependents -- [ ] Review affected processes +- [ ] READ gitnexus://clusters to understand affected areas - [ ] Check high-confidence (>0.8) dependencies first - [ ] Count affected clusters (cross-cutting = higher risk) - [ ] If >10 processes affected, consider splitting change ``` +## Resource Reference + +### gitnexus://clusters +Check which clusters might be affected: +```yaml +clusters: + - name: Auth + symbols: 47 + - name: API + symbols: 32 +``` + +### gitnexus://processes +Find which processes touch the target: +```yaml +processes: + - name: LoginFlow + type: cross_community + steps: 5 +``` + ## Tool Reference ### gitnexus_impact -Analyze blast radius. +Analyze blast radius: ``` gitnexus_impact({ target: "validateUser", direction: "upstream", minConfidence: 0.8, - maxDepth: 3, - includeTests: false + maxDepth: 3 }) + +→ d=1 (WILL BREAK): + - loginHandler (src/auth/login.ts:42) [CALLS, 100%] + - apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%] + +→ d=2 (LIKELY AFFECTED): + - authRouter (src/routes/auth.ts:22) [CALLS, 95%] + +→ Affected Processes: LoginFlow, TokenRefresh +→ Risk: MEDIUM (3 processes) ``` -**Parameters:** -- `target` — Function, class, or file name -- `direction` — "upstream" (what depends on this) or "downstream" (what this depends on) -- `minConfidence` — Filter out fuzzy matches (default: 0.7) -- `maxDepth` — How far to trace (default: 3) -- `includeTests` — Include test files (default: false) - -**Output:** -``` -Impact Analysis for "validateUser": - -d=1 (WILL BREAK): -- loginHandler (src/auth/login.ts:42) [CALLS, 100%] -- apiMiddleware (src/api/middleware.ts:15) [CALLS, 100%] - -d=2 (LIKELY AFFECTED): -- authRouter (src/routes/auth.ts:22) [CALLS, 95%] -- sessionManager (src/session/manager.ts:88) [CALLS, 90%] - -Affected Processes: LoginFlow, TokenRefresh, APIGateway -Affected Clusters: Auth, API - -Risk: MEDIUM (3 processes, 2 clusters) -``` - -## Example: "What breaks if I change validateUser?" - -1. **Run impact analysis** - ``` - gitnexus_impact({ - target: "validateUser", - direction: "upstream", - minConfidence: 0.8 - }) - ``` - -2. **Review output** - - d=1: loginHandler, apiMiddleware (WILL BREAK) - - d=2: authRouter, sessionManager (LIKELY AFFECTED) - - Processes: LoginFlow, TokenRefresh, APIGateway - - Risk: MEDIUM - -3. **Decision** - - 2 direct callers → manageable - - 3 processes → need to test all three - - Auth + API clusters → may need API team coordination - -## Risk Assessment Guide +## Risk Assessment | Affected | Risk | |----------|------| @@ -120,10 +99,15 @@ Before Committing: - [ ] If cross-cluster, coordinate with other teams ``` -## When to Use Something Else +## Example: "What breaks if I change validateUser?" -| Need | Use Instead | -|------|-------------| -| Explore unfamiliar code | `gitnexus-exploring` skill | -| Debug failing code | `gitnexus-debugging` skill | -| Plan large refactors | `gitnexus-refactoring` skill | +``` +1. gitnexus_impact({target: "validateUser", direction: "upstream"}) + → d=1: loginHandler, apiMiddleware + → d=2: authRouter, sessionManager + +2. READ gitnexus://clusters + → Auth and API clusters affected + +3. Decision: 2 direct callers, 2 clusters = MEDIUM risk +``` diff --git a/gitnexus/skills/refactoring.md b/gitnexus/skills/refactoring.md index 0bd0c84ea..1513a2ed6 100644 --- a/gitnexus/skills/refactoring.md +++ b/gitnexus/skills/refactoring.md @@ -6,9 +6,11 @@ description: Plan safe refactors using blast radius and dependency mapping # Refactoring with GitNexus ## Quick Start -1. `gitnexus_impact(target, "upstream")` → Map all dependents -2. `gitnexus_cypher` → Find all references -3. Plan changes in dependency order +``` +1. gitnexus_impact({target, direction: "upstream"}) → Map all dependents +2. READ gitnexus://schema → Understand graph structure +3. gitnexus_cypher → Find all references +``` ## When to Use - "Rename this function safely" @@ -33,10 +35,9 @@ Rename Refactoring: Extract Module: - [ ] gitnexus_explore(target, "symbol") — map dependencies - [ ] gitnexus_impact(target, "upstream") — find callers +- [ ] READ gitnexus://cluster/{name} — check cohesion - [ ] Define new module interface -- [ ] Move code to new module - [ ] Update imports across affected files -- [ ] Verify no circular dependencies ``` ### Split Function @@ -46,102 +47,65 @@ Split Function: - [ ] Group related logic - [ ] gitnexus_impact — verify callers won't break - [ ] Create new functions -- [ ] Update callers to use correct function +- [ ] Update callers +``` + +## Resource Reference + +### gitnexus://schema +Graph structure for Cypher queries: +```yaml +nodes: [Function, Class, Method, Community, Process] +relationships: [CALLS, IMPORTS, EXTENDS, MEMBER_OF] + +example_queries: + find_callers: | + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "X"}) + RETURN caller.name +``` + +### gitnexus://cluster/{name} +Check if extraction preserves cohesion: +```yaml +name: Payment +cohesion: 92% +members: [processPayment, validateCard, PaymentService] ``` ## Tool Reference ### Finding all references -``` -gitnexus_cypher({query: ` - MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"}) - RETURN caller.name, caller.filePath - ORDER BY caller.filePath -`}) +```cypher +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "validateUser"}) +RETURN caller.name, caller.filePath +ORDER BY caller.filePath ``` -### Finding symbols by name pattern -``` -gitnexus_cypher({query: ` - MATCH (s) - WHERE s.name CONTAINS "Payment" - RETURN s.name, labels(s)[0] AS type, s.filePath -`}) -``` - -### Finding all imports of a module -``` -gitnexus_cypher({query: ` - MATCH (importer)-[:CodeRelation {type: 'IMPORTS'}]->(f:File {name: "utils.ts"}) - RETURN importer.name, importer.filePath -`}) -``` - -### Finding community/cluster members -``` -gitnexus_cypher({query: ` - MATCH (s)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community {label: "Auth"}) - RETURN s.name, labels(s)[0] AS type -`}) +### Finding imports of a module +```cypher +MATCH (importer)-[:CodeRelation {type: 'IMPORTS'}]->(f:File {name: "utils.ts"}) +RETURN importer.name, importer.filePath ``` ## Example: Safely Rename `validateUser` to `authenticateUser` -1. **Map all callers** - ``` - gitnexus_impact({ - target: "validateUser", - direction: "upstream", - minConfidence: 0.9 - }) - ``` +``` +1. gitnexus_impact({target: "validateUser", direction: "upstream"}) → loginHandler, apiMiddleware, testUtils -2. **Check for string references** - ``` - gitnexus_search({query: "validateUser"}) - ``` +2. gitnexus_search({query: "validateUser"}) → Found in: config.json (dynamic reference!) -3. **Get affected processes** - ``` - gitnexus_explore({name: "validateUser", type: "symbol"}) - ``` - → Processes: LoginFlow, TokenRefresh, APIGateway +3. READ gitnexus://processes + → LoginFlow, TokenRefresh, APIGateway -4. **Plan update order** +4. Plan update order: 1. Update declaration in auth.ts 2. Update config.json string reference 3. Update loginHandler 4. Update apiMiddleware - 5. Update testUtils - 6. Run: LoginFlow, TokenRefresh, APIGateway tests - -## Example: Extract PaymentValidator Module - -1. **Understand current dependencies** - ``` - gitnexus_explore({name: "validatePayment", type: "symbol"}) - ``` - → Callees: verifyCard, checkAmount, fetchRates - → Callers: processCheckout, refundHandler - -2. **Map blast radius** - ``` - gitnexus_impact({target: "validatePayment", direction: "upstream"}) - ``` - → 2 direct callers, 3 processes - -3. **Create new module** - - Move validatePayment, verifyCard, checkAmount to PaymentValidator - - Keep fetchRates as external dependency (inject it) - -4. **Update callers** - - processCheckout: import { validatePayment } from './PaymentValidator' - - refundHandler: import { validatePayment } from './PaymentValidator' - -5. **Verify** - - Run tests for CheckoutFlow, RefundFlow processes + 5. Run tests for LoginFlow, TokenRefresh +``` ## Refactoring Safety Rules @@ -152,11 +116,3 @@ gitnexus_cypher({query: ` | String references | Search for dynamic usage | | Reflection | Check for dynamic invocation | | External exports | May break downstream repos | - -## When to Use Something Else - -| Need | Use Instead | -|------|-------------| -| Explore unfamiliar code | `gitnexus-exploring` skill | -| Debug failing code | `gitnexus-debugging` skill | -| Quick impact check | `gitnexus-impact-analysis` skill | diff --git a/gitnexus/src/cli/ai-context.ts b/gitnexus/src/cli/ai-context.ts index 8dcf1bd36..dcc8f3087 100644 --- a/gitnexus/src/cli/ai-context.ts +++ b/gitnexus/src/cli/ai-context.ts @@ -26,7 +26,7 @@ const GITNEXUS_START_MARKER = ''; const GITNEXUS_END_MARKER = ''; /** - * Generate the full GitNexus context content + * Generate the full GitNexus context content (resources-first approach) */ function generateGitNexusContent(projectName: string, stats: RepoStats): string { return `${GITNEXUS_START_MARKER} @@ -46,71 +46,67 @@ This project is indexed by GitNexus, providing AI agents with deep code intellig ## Quick Start -1. **Call \`context\` first** — Understand the codebase structure -2. **Use \`search\` for discovery** — Semantic search with graph context -3. **Use \`impact\` before refactoring** — Understand blast radius +\`\`\` +1. READ gitnexus://context → Get codebase overview (~150 tokens) +2. READ gitnexus://clusters → See all functional clusters +3. READ gitnexus://cluster/{name} → Deep dive on specific cluster +4. gitnexus_search(query) → Find code by query +\`\`\` + +## Available Resources + +| Resource | Purpose | +|----------|---------| +| \`gitnexus://context\` | Codebase stats, tools, and resources overview | +| \`gitnexus://clusters\` | All clusters with symbol counts and cohesion | +| \`gitnexus://cluster/{name}\` | Cluster members and details | +| \`gitnexus://processes\` | All execution flows with types | +| \`gitnexus://process/{name}\` | Full process trace with steps | +| \`gitnexus://schema\` | Graph schema for Cypher queries | ## Available Tools | Tool | Purpose | When to Use | |------|---------|-------------| -| \`context\` | Codebase overview | Start of conversation | -| \`search\` | Semantic + keyword search | Finding code | +| \`search\` | Semantic + keyword search | Finding code by query | | \`overview\` | List clusters & processes | Understanding architecture | | \`explore\` | Deep dive on symbol/cluster/process | Detailed investigation | | \`impact\` | Blast radius analysis | Before making changes | | \`cypher\` | Raw graph queries | Complex analysis | -## Tool Reference +## Workflow Examples -### \`context\` -Get codebase overview and stats. **Call this first.** - -### \`search\` +### Exploring the Codebase \`\`\` -search(query: "authentication middleware", depth: "full") -\`\`\` -- \`depth: "definitions"\` — Symbol signatures only (default) -- \`depth: "full"\` — Symbols + all relationships - -### \`explore\` -\`\`\` -explore(name: "validateUser", type: "symbol") -explore(name: "Authentication", type: "cluster") -explore(name: "LoginFlow", type: "process") +READ gitnexus://context → Stats and overview +READ gitnexus://clusters → Find relevant cluster +READ gitnexus://cluster/Auth → Explore Auth cluster +gitnexus_explore("validateUser", "symbol") → Detailed symbol info \`\`\` -### \`impact\` +### Planning a Change \`\`\` -impact(target: "UserService", direction: "upstream", minConfidence: 0.8) +gitnexus_impact("UserService", "upstream") → See what breaks +READ gitnexus://processes → Check affected flows +gitnexus_explore("LoginFlow", "process") → Trace execution \`\`\` -- \`upstream\` — What depends on this (will break if changed) -- \`downstream\` — What this depends on -### \`cypher\` -Execute Cypher queries on the knowledge graph. +## Graph Schema -**Schema:** -- Nodes: \`File\`, \`Folder\`, \`Function\`, \`Class\`, \`Interface\`, \`Method\`, \`Community\`, \`Process\` -- Edges: \`CALLS\`, \`IMPORTS\`, \`EXTENDS\`, \`IMPLEMENTS\`, \`DEFINES\`, \`MEMBER_OF\`, \`STEP_IN_PROCESS\` +**Nodes:** File, Function, Class, Interface, Method, Community, Process + +**Relationships:** CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS \`\`\`cypher -// Find all callers of a function -MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunction"}) +// Example: Find callers of a function +MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"}) RETURN caller.name, caller.filePath \`\`\` -## Key Concepts - -| Concept | Description | -|---------|-------------| -| **Community** | Functional cluster detected by Leiden algorithm | -| **Process** | Execution flow from entry point to terminal | -| **Confidence** | Relationship trust score (1.0 = certain, <0.8 = fuzzy) | - ${GITNEXUS_END_MARKER}`; } + /** * Check if a file exists */ diff --git a/gitnexus/src/mcp/local/local-backend.ts b/gitnexus/src/mcp/local/local-backend.ts index 4bcd13bcf..43b2dad1b 100644 --- a/gitnexus/src/mcp/local/local-backend.ts +++ b/gitnexus/src/mcp/local/local-backend.ts @@ -169,8 +169,6 @@ export class LocalBackend { } switch (method) { - case 'context': - return this.getContext(); case 'search': return this.search(params); case 'cypher': @@ -188,35 +186,6 @@ export class LocalBackend { } } - private async getContext(): Promise { - if (!this._context || !this.repo) { - return 'Repository not indexed. Run: gitnexus analyze'; - } - - const stats = this.repo.meta.stats || {}; - return [ - `# GitNexus: ${this._context.projectName}`, - '', - '## Stats', - `- Files: ${stats.files || 0}`, - `- Nodes: ${stats.nodes || 0}`, - `- Edges: ${stats.edges || 0}`, - `- Communities: ${stats.communities || 0}`, - `- Processes: ${stats.processes || 0}`, - '', - `Indexed: ${this.repo.meta.indexedAt}`, - `Commit: ${this.repo.meta.lastCommit?.slice(0, 7)}`, - '', - '## Available Tools', - '- **analyze**: Index/re-index repository', - '- **search**: Hybrid semantic + keyword search', - '- **cypher**: Graph queries (Cypher)', - '- **overview**: List communities and processes', - '- **explore**: Deep dive on symbol/cluster/process', - '- **impact**: Change impact analysis', - ].join('\n'); - } - private async search(params: { query: string; limit?: number; depth?: string; groupByProcess?: boolean }): Promise { await this.ensureInitialized(); diff --git a/gitnexus/src/mcp/resources.ts b/gitnexus/src/mcp/resources.ts new file mode 100644 index 000000000..d184bd46a --- /dev/null +++ b/gitnexus/src/mcp/resources.ts @@ -0,0 +1,311 @@ +/** + * MCP Resources + * + * Provides structured on-demand data to AI agents. + * Resources complement tools by offering lightweight, cacheable data. + */ + +import type { LocalBackend } from './local/local-backend.js'; + +export interface ResourceDefinition { + uri: string; + name: string; + description: string; + mimeType: string; +} + +export interface ResourceTemplate { + uriTemplate: string; + name: string; + description: string; + mimeType: string; +} + +/** + * Static resources available when codebase is indexed + */ +export function getResourceDefinitions(projectName: string): ResourceDefinition[] { + return [ + { + uri: 'gitnexus://context', + name: `${projectName} Overview`, + description: 'Codebase stats, hotspots, and available tools', + mimeType: 'text/yaml', + }, + { + uri: 'gitnexus://clusters', + name: 'All Clusters', + description: 'List of all functional clusters with stats', + mimeType: 'text/yaml', + }, + { + uri: 'gitnexus://processes', + name: 'All Processes', + description: 'List of all execution flows with types', + mimeType: 'text/yaml', + }, + { + uri: 'gitnexus://schema', + name: 'Graph Schema', + description: 'Node types and relationships for Cypher queries', + mimeType: 'text/yaml', + }, + ]; +} + +/** + * Dynamic resource templates + */ +export function getResourceTemplates(): ResourceTemplate[] { + return [ + { + uriTemplate: 'gitnexus://cluster/{name}', + name: 'Cluster Detail', + description: 'Deep dive into a specific cluster', + mimeType: 'text/yaml', + }, + { + uriTemplate: 'gitnexus://process/{name}', + name: 'Process Trace', + description: 'Step-by-step execution trace', + mimeType: 'text/yaml', + }, + ]; +} + +/** + * Read a resource and return its content + */ +export async function readResource(uri: string, backend: LocalBackend): Promise { + // Static resources + if (uri === 'gitnexus://context') { + return getContextResource(backend); + } + if (uri === 'gitnexus://clusters') { + return getClustersResource(backend); + } + if (uri === 'gitnexus://processes') { + return getProcessesResource(backend); + } + if (uri === 'gitnexus://schema') { + return getSchemaResource(); + } + + // Dynamic resources + if (uri.startsWith('gitnexus://cluster/')) { + const name = uri.replace('gitnexus://cluster/', ''); + return getClusterDetailResource(name, backend); + } + if (uri.startsWith('gitnexus://process/')) { + const name = uri.replace('gitnexus://process/', ''); + return getProcessDetailResource(name, backend); + } + + throw new Error(`Unknown resource: ${uri}`); +} + +/** + * Context resource - codebase overview + */ +async function getContextResource(backend: LocalBackend): Promise { + const context = backend.context; + if (!context) { + return 'error: No codebase loaded. Run: gitnexus analyze'; + } + + const lines: string[] = [ + `project: ${context.projectName}`, + 'stats:', + ` files: ${context.stats.fileCount}`, + ` symbols: ${context.stats.functionCount}`, + ` clusters: ${context.stats.communityCount}`, + ` processes: ${context.stats.processCount}`, + '', + 'tools_available:', + ' - search: Hybrid semantic + keyword search', + ' - explore: Deep dive on symbol/cluster/process', + ' - impact: Blast radius analysis', + ' - overview: List all clusters and processes', + ' - cypher: Raw graph queries', + '', + 'resources_available:', + ' - gitnexus://clusters: All clusters', + ' - gitnexus://processes: All processes', + ' - gitnexus://cluster/{name}: Cluster details', + ' - gitnexus://process/{name}: Process trace', + ]; + + return lines.join('\n'); +} + +/** + * Clusters resource - list all clusters + */ +async function getClustersResource(backend: LocalBackend): Promise { + try { + const result = await backend.callTool('overview', { showClusters: true, showProcesses: false, limit: 50 }); + + if (!result.clusters || result.clusters.length === 0) { + return 'clusters: []\n# No clusters detected. Run: gitnexus analyze'; + } + + const lines: string[] = ['clusters:']; + + for (const cluster of result.clusters) { + const label = cluster.heuristicLabel || cluster.label || cluster.id; + lines.push(` - name: "${label}"`); + lines.push(` symbols: ${cluster.symbolCount || 0}`); + if (cluster.cohesion) { + lines.push(` cohesion: ${(cluster.cohesion * 100).toFixed(0)}%`); + } + } + + return lines.join('\n'); + } catch (err: any) { + return `error: ${err.message}`; + } +} + +/** + * Processes resource - list all processes + */ +async function getProcessesResource(backend: LocalBackend): Promise { + try { + const result = await backend.callTool('overview', { showClusters: false, showProcesses: true, limit: 50 }); + + if (!result.processes || result.processes.length === 0) { + return 'processes: []\n# No processes detected. Run: gitnexus analyze'; + } + + const lines: string[] = ['processes:']; + + for (const proc of result.processes) { + const label = proc.heuristicLabel || proc.label || proc.id; + lines.push(` - name: "${label}"`); + lines.push(` type: ${proc.processType || 'unknown'}`); + lines.push(` steps: ${proc.stepCount || 0}`); + } + + return lines.join('\n'); + } catch (err: any) { + return `error: ${err.message}`; + } +} + +/** + * Schema resource - graph structure for Cypher queries + */ +function getSchemaResource(): string { + return `# GitNexus Graph Schema + +nodes: + - File: Source code files + - Function: Functions and arrow functions + - Class: Class definitions + - Interface: Interface/type definitions + - Method: Class methods + - Community: Functional cluster (Leiden algorithm) + - Process: Execution flow trace + +relationships: + - CALLS: Function/method invocation + - IMPORTS: Module imports + - EXTENDS: Class inheritance + - IMPLEMENTS: Interface implementation + - DEFINES: File defines symbol + - MEMBER_OF: Symbol belongs to community + - STEP_IN_PROCESS: Symbol is step N in process + +example_queries: + find_callers: | + MATCH (caller)-[:CodeRelation {type: 'CALLS'}]->(f:Function {name: "myFunc"}) + RETURN caller.name, caller.filePath + + find_community_members: | + MATCH (s)-[:CodeRelation {type: 'MEMBER_OF'}]->(c:Community) + WHERE c.heuristicLabel = "Auth" + RETURN s.name, labels(s)[0] AS type + + trace_process: | + MATCH (s)-[r:CodeRelation {type: 'STEP_IN_PROCESS'}]->(p:Process) + WHERE p.heuristicLabel = "LoginFlow" + RETURN s.name, r.step + ORDER BY r.step +`; +} + +/** + * Cluster detail resource + */ +async function getClusterDetailResource(name: string, backend: LocalBackend): Promise { + try { + const result = await backend.callTool('explore', { name, type: 'cluster' }); + + if (result.error) { + return `error: ${result.error}`; + } + + const cluster = result.cluster; + const members = result.members || []; + + const lines: string[] = [ + `name: "${cluster.heuristicLabel || cluster.label || cluster.id}"`, + `symbols: ${cluster.symbolCount || members.length}`, + ]; + + if (cluster.cohesion) { + lines.push(`cohesion: ${(cluster.cohesion * 100).toFixed(0)}%`); + } + + if (members.length > 0) { + lines.push(''); + lines.push('members:'); + for (const member of members.slice(0, 20)) { + lines.push(` - name: ${member.name}`); + lines.push(` type: ${member.type}`); + lines.push(` file: ${member.filePath}`); + } + if (members.length > 20) { + lines.push(` # ... and ${members.length - 20} more`); + } + } + + return lines.join('\n'); + } catch (err: any) { + return `error: ${err.message}`; + } +} + +/** + * Process detail resource + */ +async function getProcessDetailResource(name: string, backend: LocalBackend): Promise { + try { + const result = await backend.callTool('explore', { name, type: 'process' }); + + if (result.error) { + return `error: ${result.error}`; + } + + const proc = result.process; + const steps = result.steps || []; + + const lines: string[] = [ + `name: "${proc.heuristicLabel || proc.label || proc.id}"`, + `type: ${proc.processType || 'unknown'}`, + `step_count: ${proc.stepCount || steps.length}`, + ]; + + if (steps.length > 0) { + lines.push(''); + lines.push('trace:'); + for (const step of steps) { + lines.push(` ${step.step}: ${step.name} (${step.filePath})`); + } + } + + return lines.join('\n'); + } catch (err: any) { + return `error: ${err.message}`; + } +} diff --git a/gitnexus/src/mcp/server.ts b/gitnexus/src/mcp/server.ts index 3e77a6fde..586dfcead 100644 --- a/gitnexus/src/mcp/server.ts +++ b/gitnexus/src/mcp/server.ts @@ -6,6 +6,7 @@ * communicate via stdin/stdout using the MCP protocol. * * Tools: context, search, cypher, overview, explore, impact, analyze + * Resources: context, clusters, processes, schema, cluster/{name}, process/{name} */ import { Server } from '@modelcontextprotocol/sdk/server/index.js'; @@ -15,46 +16,11 @@ import { ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, + ListResourceTemplatesRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { GITNEXUS_TOOLS } from './tools.js'; -import type { LocalBackend, CodebaseContext } from './local/local-backend.js'; - -/** - * Format context as markdown for the resource - */ -function formatContextAsMarkdown(context: CodebaseContext): string { - const { projectName, stats } = context; - - const lines: string[] = []; - - lines.push(`# GitNexus: ${projectName}`); - lines.push(''); - lines.push('## Stats'); - lines.push(`- Files: ${stats.fileCount}`); - lines.push(`- Functions: ${stats.functionCount}`); - if (stats.communityCount > 0) lines.push(`- Communities: ${stats.communityCount}`); - if (stats.processCount > 0) lines.push(`- Processes: ${stats.processCount}`); - lines.push(''); - - lines.push('## Available Tools'); - lines.push(''); - lines.push('- **context**: Codebase overview and stats'); - lines.push('- **search**: Hybrid semantic + keyword search'); - lines.push('- **cypher**: Execute Cypher queries on graph'); - lines.push('- **overview**: List communities and processes'); - lines.push('- **explore**: Deep dive on symbol/cluster/process'); - lines.push('- **impact**: Change impact analysis'); - lines.push('- **analyze**: Index/re-index repository'); - lines.push(''); - - lines.push('## Graph Schema'); - lines.push(''); - lines.push('**Nodes**: File, Function, Class, Interface, Method, Community, Process'); - lines.push(''); - lines.push('**Relations**: CALLS, IMPORTS, EXTENDS, IMPLEMENTS, DEFINES, MEMBER_OF, STEP_IN_PROCESS'); - - return lines.join('\n'); -} +import type { LocalBackend } from './local/local-backend.js'; +import { getResourceDefinitions, getResourceTemplates, readResource } from './resources.js'; export async function startMCPServer(backend: LocalBackend): Promise { const server = new Server( @@ -78,15 +44,27 @@ export async function startMCPServer(backend: LocalBackend): Promise { return { resources: [] }; } + const resources = getResourceDefinitions(context.projectName); return { - resources: [ - { - uri: 'gitnexus://codebase/context', - name: `GitNexus: ${context.projectName}`, - description: `Codebase context for ${context.projectName} (${context.stats.fileCount} files)`, - mimeType: 'text/markdown', - }, - ], + resources: resources.map(r => ({ + uri: r.uri, + name: r.name, + description: r.description, + mimeType: r.mimeType, + })), + }; + }); + + // Handle list resource templates request (for dynamic resources) + server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => { + const templates = getResourceTemplates(); + return { + resourceTemplates: templates.map(t => ({ + uriTemplate: t.uriTemplate, + name: t.name, + description: t.description, + mimeType: t.mimeType, + })), }; }); @@ -94,35 +72,31 @@ export async function startMCPServer(backend: LocalBackend): Promise { server.setRequestHandler(ReadResourceRequestSchema, async (request) => { const { uri } = request.params; - if (uri === 'gitnexus://codebase/context') { - const context = backend.context; - - if (!context) { - return { - contents: [ - { - uri, - mimeType: 'text/plain', - text: 'No codebase loaded.', - }, - ], - }; - } - + try { + const content = await readResource(uri, backend); return { contents: [ { uri, - mimeType: 'text/markdown', - text: formatContextAsMarkdown(context), + mimeType: 'text/yaml', + text: content, + }, + ], + }; + } catch (err: any) { + return { + contents: [ + { + uri, + mimeType: 'text/plain', + text: `Error: ${err.message}`, }, ], }; } - - throw new Error(`Unknown resource: ${uri}`); }); + // Handle list tools request server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: GITNEXUS_TOOLS.map((tool) => ({ diff --git a/gitnexus/src/mcp/tools.ts b/gitnexus/src/mcp/tools.ts index f4d6e997c..1fd326330 100644 --- a/gitnexus/src/mcp/tools.ts +++ b/gitnexus/src/mcp/tools.ts @@ -46,23 +46,6 @@ Run this when: required: [], }, }, - { - name: 'context', - description: `Get GitNexus codebase context. CALL THIS FIRST before using other tools. - -Returns: -- Project name and stats (files, functions, classes) -- Hotspots (most connected/important nodes) -- Communities and processes count -- Tool usage guidance - -ALWAYS call this first to understand the codebase before searching or querying.`, - inputSchema: { - type: 'object', - properties: {}, - required: [], - }, - }, { name: 'search', description: `Hybrid search (keyword + semantic) across the codebase. From 86b171edac395d7ba04d279d517cc39f271294ab Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Thu, 5 Feb 2026 07:24:53 +0530 Subject: [PATCH 16/36] test: add FTS live test file --- gitnexus/src/FTS_LIVE_TEST.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 gitnexus/src/FTS_LIVE_TEST.ts diff --git a/gitnexus/src/FTS_LIVE_TEST.ts b/gitnexus/src/FTS_LIVE_TEST.ts new file mode 100644 index 000000000..204477761 --- /dev/null +++ b/gitnexus/src/FTS_LIVE_TEST.ts @@ -0,0 +1,13 @@ +/** + * FTS Live Update Test File + * + * This file contains the unique identifier: GITNEXUS_FTS_LIVETEST_2026_ALPHA + * + * If you can find this file via MCP search after the watcher picks up the commit, + * then the KuzuDB FTS live update system is working correctly! + */ + +export function ftsLiveTestFunction() { + // GITNEXUS_FTS_LIVETEST_2026_ALPHA marker for search + return "Live FTS test successful!"; +} From 6019e2512622ca0eb1a7e5484d552ef5a7576b28 Mon Sep 17 00:00:00 2001 From: abhigyanpatwari Date: Fri, 6 Feb 2026 04:43:21 +0530 Subject: [PATCH 17/36] Louvian to leindes, removed smar clustering in UI --- gitnexus-web/TODO.md | 13 +- gitnexus-web/package-lock.json | 20 +- gitnexus-web/package.json | 5 +- gitnexus-web/src/App.tsx | 84 +- gitnexus-web/src/components/DropZone.tsx | 64 +- gitnexus-web/src/components/RightPanel.tsx | 27 +- gitnexus-web/src/components/SettingsPanel.tsx | 141 +- gitnexus-web/src/components/StatusBar.tsx | 23 +- .../src/core/ingestion/community-processor.ts | 8 +- gitnexus-web/src/core/kuzu/csv-generator.ts | 5 +- gitnexus-web/src/core/kuzu/kuzu-adapter.ts | 2 +- gitnexus-web/src/core/kuzu/schema.ts | 5 + gitnexus-web/src/hooks/useAppState.tsx | 166 +- gitnexus-web/src/repomix-output.md | 13681 ---------------- gitnexus-web/src/vendor/leiden/index.d.ts | 35 + gitnexus-web/src/vendor/leiden/index.js | 341 + gitnexus-web/src/vendor/leiden/utils.js | 392 + gitnexus-web/src/workers/ingestion.worker.ts | 21 + 18 files changed, 863 insertions(+), 14170 deletions(-) delete mode 100644 gitnexus-web/src/repomix-output.md create mode 100644 gitnexus-web/src/vendor/leiden/index.d.ts create mode 100644 gitnexus-web/src/vendor/leiden/index.js create mode 100644 gitnexus-web/src/vendor/leiden/utils.js diff --git a/gitnexus-web/TODO.md b/gitnexus-web/TODO.md index 4ffce6f43..31e5e39fe 100644 --- a/gitnexus-web/TODO.md +++ b/gitnexus-web/TODO.md @@ -55,9 +55,9 @@ **Goal:** Group related code into named clusters. ### 1.1 Research & Setup -- [ ] Research JS/WASM implementations of Leiden algorithm - - Options: `graphology-communities-louvain`, custom WASM port - - Constraint: Must run in browser +- [x] Implement Leiden algorithm for community detection + - Vendored from graphology-communities-leiden (unpublished npm, MIT licensed) + - Works in both browser (ESM) and Node.js (CJS) - [ ] Benchmark on sample codebases (100, 1K, 10K nodes) ### 1.2 Schema Updates @@ -324,10 +324,9 @@ interface ImpactResult { ## Technical Notes -### Leiden Algorithm Options -1. **graphology-communities-louvain** (JS, works in browser) -2. **Custom WASM port** (if performance needed) -3. **Simple Louvain** might be sufficient for V1 +### Leiden Algorithm +Implemented using vendored graphology-communities-leiden source (MIT licensed). +The Leiden algorithm guarantees well-connected communities via a refinement phase after each Louvain-style move phase. ### Schema Summary (New Additions) ``` diff --git a/gitnexus-web/package-lock.json b/gitnexus-web/package-lock.json index cf591cb30..97942ca4d 100644 --- a/gitnexus-web/package-lock.json +++ b/gitnexus-web/package-lock.json @@ -23,10 +23,11 @@ "comlink": "^4.4.2", "d3": "^7.9.0", "graphology": "^0.26.0", - "graphology-communities-louvain": "^2.0.2", + "graphology-indices": "^0.17.0", "graphology-layout-force": "^0.2.4", "graphology-layout-forceatlas2": "^0.10.1", "graphology-layout-noverlap": "^0.4.2", + "graphology-utils": "^2.3.0", "isomorphic-git": "^1.36.1", "jszip": "^3.10.1", "kuzu-wasm": "^0.11.1", @@ -35,6 +36,8 @@ "lucide-react": "^0.562.0", "mermaid": "^11.12.2", "minisearch": "^7.2.0", + "mnemonist": "^0.39.0", + "pandemonium": "^2.4.0", "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", @@ -5518,21 +5521,6 @@ "graphology-types": ">=0.24.0" } }, - "node_modules/graphology-communities-louvain": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/graphology-communities-louvain/-/graphology-communities-louvain-2.0.2.tgz", - "integrity": "sha512-zt+2hHVPYxjEquyecxWXoUoIuN/UvYzsvI7boDdMNz0rRvpESQ7+e+Ejv6wK7AThycbZXuQ6DkG8NPMCq6XwoA==", - "license": "MIT", - "dependencies": { - "graphology-indices": "^0.17.0", - "graphology-utils": "^2.4.4", - "mnemonist": "^0.39.0", - "pandemonium": "^2.4.1" - }, - "peerDependencies": { - "graphology-types": ">=0.19.0" - } - }, "node_modules/graphology-indices": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/graphology-indices/-/graphology-indices-0.17.0.tgz", diff --git a/gitnexus-web/package.json b/gitnexus-web/package.json index 20ee8b00b..d66c42113 100644 --- a/gitnexus-web/package.json +++ b/gitnexus-web/package.json @@ -24,7 +24,10 @@ "comlink": "^4.4.2", "d3": "^7.9.0", "graphology": "^0.26.0", - "graphology-communities-louvain": "^2.0.2", + "graphology-indices": "^0.17.0", + "graphology-utils": "^2.3.0", + "mnemonist": "^0.39.0", + "pandemonium": "^2.4.0", "graphology-layout-force": "^0.2.4", "graphology-layout-forceatlas2": "^0.10.1", "graphology-layout-noverlap": "^0.4.2", diff --git a/gitnexus-web/src/App.tsx b/gitnexus-web/src/App.tsx index 1288e502c..d609be146 100644 --- a/gitnexus-web/src/App.tsx +++ b/gitnexus-web/src/App.tsx @@ -1,4 +1,4 @@ -import { useCallback, useRef, useState, useEffect } from 'react'; +import { useCallback, useRef } from 'react'; import { AppStateProvider, useAppState } from './hooks/useAppState'; import { DropZone } from './components/DropZone'; import { LoadingOverlay } from './components/LoadingOverlay'; @@ -11,8 +11,6 @@ import { FileTreePanel } from './components/FileTreePanel'; import { CodeReferencesPanel } from './components/CodeReferencesPanel'; import { FileEntry } from './services/zip'; import { getActiveProviderConfig } from './core/llm/settings-service'; -import { ProviderConfig } from './core/llm/types'; -import { IntelligentClusteringModal } from './components/IntelligentClusteringModal'; const AppContent = () => { const { @@ -31,68 +29,24 @@ const AppContent = () => { refreshLLMSettings, initializeAgent, startEmbeddings, - startBackgroundEnrichment, embeddingStatus, codeReferences, selectedNode, isCodePanelOpen, - llmSettings, - updateLLMSettings, - runClusterEnrichment, } = useAppState(); - const [showClusteringModal, setShowClusteringModal] = useState(false); - - // Trigger clustering modal after ingestion if not seen yet - // DISABLED: Clustering is now in the upload flow - /* - useEffect(() => { - if (viewMode === 'exploring' && !llmSettings.hasSeenClusteringPrompt && !llmSettings.intelligentClustering) { - const timer = setTimeout(() => setShowClusteringModal(true), 2000); - return () => clearTimeout(timer); - } - }, [viewMode, llmSettings.hasSeenClusteringPrompt, llmSettings.intelligentClustering]); - */ - - const handleEnableClustering = useCallback(() => { - updateLLMSettings({ - intelligentClustering: true, - hasSeenClusteringPrompt: true, - useSameModelForClustering: true // Default to simple path - }); - setShowClusteringModal(false); - runClusterEnrichment().catch(console.error); - }, [updateLLMSettings, runClusterEnrichment]); - - const handleConfigureClustering = useCallback(() => { - updateLLMSettings({ hasSeenClusteringPrompt: true }); - setShowClusteringModal(false); - setSettingsPanelOpen(true); - }, [updateLLMSettings, setSettingsPanelOpen]); - - const handleSkipClustering = useCallback(() => { - updateLLMSettings({ hasSeenClusteringPrompt: true }); - setShowClusteringModal(false); - }, [updateLLMSettings]); - const graphCanvasRef = useRef(null); - const handleFileSelect = useCallback(async (file: File, enableSmartClustering?: boolean) => { - console.log('📥 App.handleFileSelect - param received:', enableSmartClustering, 'provider exists:', !!getActiveProviderConfig()); + const handleFileSelect = useCallback(async (file: File) => { const projectName = file.name.replace('.zip', ''); setProjectName(projectName); - // Set initial progress BEFORE entering loading mode to prevent black screen setProgress({ phase: 'extracting', percent: 0, message: 'Starting...', detail: 'Preparing to extract files' }); setViewMode('loading'); try { - // Prepare LLM config if clustering is enabled - const clusteringConfig = enableSmartClustering ? getActiveProviderConfig() ?? undefined : undefined; - console.log('✅ clusteringConfig:', !!clusteringConfig, clusteringConfig?.provider); - const result = await runPipeline(file, (progress) => { setProgress(progress); - }, clusteringConfig || undefined); + }); setGraph(result.graph); setFileContents(result.fileContents); @@ -107,16 +61,12 @@ const AppContent = () => { // Auto-start embeddings pipeline in background // Uses WebGPU if available, falls back to WASM startEmbeddings().catch((err) => { - // WebGPU not available - try WASM fallback silently if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) { startEmbeddings('wasm').catch(console.warn); } else { console.warn('Embeddings auto-start failed:', err); } }); - - // Start background cluster enrichment (if toggle was enabled) - startBackgroundEnrichment().catch(console.warn); } catch (error) { console.error('Pipeline error:', error); setProgress({ @@ -130,49 +80,36 @@ const AppContent = () => { setProgress(null); }, 3000); } - }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipeline, startEmbeddings, initializeAgent, llmSettings]); + }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipeline, startEmbeddings, initializeAgent]); - const handleGitClone = useCallback(async (files: FileEntry[], enableSmartClustering?: boolean) => { - // Extract project name from first file path (e.g., "owner-repo-123/src/..." -> "owner-repo") + const handleGitClone = useCallback(async (files: FileEntry[]) => { const firstPath = files[0]?.path || 'repository'; const projectName = firstPath.split('/')[0].replace(/-\d+$/, '') || 'repository'; setProjectName(projectName); - // Set initial progress BEFORE entering loading mode to prevent black screen setProgress({ phase: 'extracting', percent: 0, message: 'Starting...', detail: 'Preparing to process files' }); setViewMode('loading'); try { - // Prepare LLM config if clustering is enabled - const clusteringConfig = enableSmartClustering ? getActiveProviderConfig() ?? undefined : undefined; - const result = await runPipelineFromFiles(files, (progress) => { setProgress(progress); - }, clusteringConfig || undefined); + }); setGraph(result.graph); setFileContents(result.fileContents); setViewMode('exploring'); - // Initialize (or re-initialize) the agent AFTER a repo loads so it captures - // the current codebase context (file contents + graph tools) in the worker. if (getActiveProviderConfig()) { initializeAgent(projectName); } - // Auto-start embeddings pipeline in background - // Uses WebGPU if available, falls back to WASM startEmbeddings().catch((err) => { - // WebGPU not available - try WASM fallback silently if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) { startEmbeddings('wasm').catch(console.warn); } else { console.warn('Embeddings auto-start failed:', err); } }); - - // Start background cluster enrichment (if toggle was enabled) - startBackgroundEnrichment().catch(console.warn); } catch (error) { console.error('Pipeline error:', error); setProgress({ @@ -186,7 +123,7 @@ const AppContent = () => { setProgress(null); }, 3000); } - }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipelineFromFiles, startEmbeddings, initializeAgent, runClusterEnrichment]); + }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipelineFromFiles, startEmbeddings, initializeAgent]); const handleFocusNode = useCallback((nodeId: string) => { graphCanvasRef.current?.focusNode(nodeId); @@ -242,13 +179,6 @@ const AppContent = () => { onSettingsSaved={handleSettingsSaved} /> - {/* Intelligent Clustering Modal */} -
); }; diff --git a/gitnexus-web/src/components/DropZone.tsx b/gitnexus-web/src/components/DropZone.tsx index 0bce617a9..1749cbb24 100644 --- a/gitnexus-web/src/components/DropZone.tsx +++ b/gitnexus-web/src/components/DropZone.tsx @@ -1,12 +1,11 @@ -import { useState, useCallback, DragEvent, useEffect } from 'react'; -import { Upload, FileArchive, Github, Loader2, ArrowRight, Key, Eye, EyeOff, Sparkles } from 'lucide-react'; +import { useState, useCallback, DragEvent } from 'react'; +import { Upload, FileArchive, Github, Loader2, ArrowRight, Key, Eye, EyeOff } from 'lucide-react'; import { cloneRepository, parseGitHubUrl } from '../services/git-clone'; import { FileEntry } from '../services/zip'; -import { getActiveProviderConfig } from '../core/llm/settings-service'; interface DropZoneProps { - onFileSelect: (file: File, enableSmartClustering?: boolean) => void; - onGitClone?: (files: FileEntry[], enableSmartClustering?: boolean) => void; + onFileSelect: (file: File) => void; + onGitClone?: (files: FileEntry[]) => void; } export const DropZone = ({ onFileSelect, onGitClone }: DropZoneProps) => { @@ -18,15 +17,6 @@ export const DropZone = ({ onFileSelect, onGitClone }: DropZoneProps) => { const [isCloning, setIsCloning] = useState(false); const [cloneProgress, setCloneProgress] = useState({ phase: '', percent: 0 }); const [error, setError] = useState(null); - const [enableSmartClustering, setEnableSmartClustering] = useState(false); - const [hasLLMProvider, setHasLLMProvider] = useState(false); - - // Check if LLM provider is configured - useEffect(() => { - const config = getActiveProviderConfig(); - setHasLLMProvider(!!config); - // Keep smart clustering OFF by default, user must opt-in - }, []); const handleDragOver = useCallback((e: DragEvent) => { e.preventDefault(); @@ -49,25 +39,24 @@ export const DropZone = ({ onFileSelect, onGitClone }: DropZoneProps) => { if (files.length > 0) { const file = files[0]; if (file.name.endsWith('.zip')) { - onFileSelect(file, enableSmartClustering); + onFileSelect(file); } else { setError('Please drop a .zip file'); } } - }, [onFileSelect, enableSmartClustering]); + }, [onFileSelect]); const handleFileInput = useCallback((e: React.ChangeEvent) => { const files = e.target.files; if (files && files.length > 0) { const file = files[0]; if (file.name.endsWith('.zip')) { - console.log('🎯 DropZone: Calling onFileSelect with enableSmartClustering:', enableSmartClustering); - onFileSelect(file, enableSmartClustering); + onFileSelect(file); } else { setError('Please select a .zip file'); } } - }, [onFileSelect, enableSmartClustering]); + }, [onFileSelect]); const handleGitClone = async () => { if (!githubUrl.trim()) { @@ -96,7 +85,7 @@ export const DropZone = ({ onFileSelect, onGitClone }: DropZoneProps) => { setGithubToken(''); if (onGitClone) { - onGitClone(files, enableSmartClustering); + onGitClone(files); } } catch (err) { console.error('Clone failed:', err); @@ -224,41 +213,6 @@ export const DropZone = ({ onFileSelect, onGitClone }: DropZoneProps) => {
- {/* Smart Clustering Toggle - Below drop zone */} -
- -
)} diff --git a/gitnexus-web/src/components/RightPanel.tsx b/gitnexus-web/src/components/RightPanel.tsx index f9b405d79..0c3a1e2b3 100644 --- a/gitnexus-web/src/components/RightPanel.tsx +++ b/gitnexus-web/src/components/RightPanel.tsx @@ -1,6 +1,6 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import { - Send, Sparkles, User, + Send, Square, Sparkles, User, PanelRightClose, Loader2, AlertTriangle, Activity, GitBranch } from 'lucide-react'; import { useAppState } from '../hooks/useAppState'; @@ -24,6 +24,7 @@ export const RightPanel = () => { isAgentReady, isAgentInitializing, sendChatMessage, + stopChatResponse, clearChat, } = useAppState(); @@ -429,13 +430,23 @@ export const RightPanel = () => { > Clear - + {isChatLoading ? ( + + ) : ( + + )} {!isAgentReady && !isAgentInitializing && (
diff --git a/gitnexus-web/src/components/SettingsPanel.tsx b/gitnexus-web/src/components/SettingsPanel.tsx index 11bdcdb62..ebc739144 100644 --- a/gitnexus-web/src/components/SettingsPanel.tsx +++ b/gitnexus-web/src/components/SettingsPanel.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback, useRef, useMemo } from 'react'; -import { X, Key, Server, Brain, Check, AlertCircle, Eye, EyeOff, RefreshCw, Sparkles, ChevronDown, Loader2, Search } from 'lucide-react'; +import { X, Key, Server, Brain, Check, AlertCircle, Eye, EyeOff, RefreshCw, ChevronDown, Loader2, Search } from 'lucide-react'; import { loadSettings, saveSettings, @@ -783,145 +783,6 @@ export const SettingsPanel = ({ isOpen, onClose, onSettingsSaved }: SettingsPane )} - {/* Intelligent Clustering Settings */} -
-

- - Intelligent Clustering (Beta) -

- -
-
-
- -

Generate semantic names and descriptions for code clusters

-
- -
- - {settings.intelligentClustering && ( -
-
-
- -

Use the same provider configured above

-
- -
- - {!settings.useSameModelForClustering && ( -
-
-
- -
-

- Pro Tip: Use a cheaper model like GPT-4o-mini or Gemini Flash for clustering! -

-
- - {/* Simplistic Clustering Provider Config - For now just a model name override for simplicity, - or we could duplicate the provider selector. - For key simplicity in this iteration, let's just let them override the MODEL name if using the SAME provider, - or we can add a provider dropdown. - - Actually, the simplest implementation for "separate model" is just allowing them to pick a provider/model - for clustering specifically. But that replicates a lot of UI. - - Let's stick to the plan: "Use same model as agent" vs "Use different model". - If different, show a simplified provider config (just Provider + Model + Key if needed). - - For MVP, let's just assume they want to use OpenAI/Azure/Gemini with a specific model string. - */} - -
- - -
- -
- - setSettings(prev => ({ - ...prev, - clusteringProvider: { ...prev.clusteringProvider, model: e.target.value } - }))} - placeholder="e.g. gpt-4o-mini" - className="w-full px-3 py-2 bg-elevated border border-border-subtle rounded-lg text-sm text-text-primary placeholder:text-text-muted outline-none" - /> -
- -
- - setSettings(prev => ({ - ...prev, - clusteringProvider: { ...prev.clusteringProvider, apiKey: e.target.value } - }))} - placeholder="Leave blank to use main key if matching..." - className="w-full px-3 py-2 bg-elevated border border-border-subtle rounded-lg text-sm text-text-primary placeholder:text-text-muted outline-none" - /> -
- -

- Required if using a different provider than your main agent. -

-
- )} -
- )} -
-
{/* Privacy Note */}
diff --git a/gitnexus-web/src/components/StatusBar.tsx b/gitnexus-web/src/components/StatusBar.tsx index 476f4ecb8..fbc4f53ad 100644 --- a/gitnexus-web/src/components/StatusBar.tsx +++ b/gitnexus-web/src/components/StatusBar.tsx @@ -1,8 +1,7 @@ -import { Pause, X } from 'lucide-react'; import { useAppState } from '../hooks/useAppState'; export const StatusBar = () => { - const { graph, progress, enrichmentProgress, cancelEnrichment } = useAppState(); + const { graph, progress } = useAppState(); const nodeCount = graph?.nodes.length ?? 0; const edgeCount = graph?.relationships.length ?? 0; @@ -23,8 +22,6 @@ export const StatusBar = () => { return Object.entries(counts).sort((a, b) => b[1] - a[1])[0]?.[0]; })(); - const isLabeling = enrichmentProgress !== null; - return (
{/* Left - Status */} @@ -39,24 +36,6 @@ export const StatusBar = () => {
{progress.message} - ) : isLabeling ? ( - <> -
-
-
- Labeling clusters {enrichmentProgress.current}/{enrichmentProgress.total}... - - ) : (
diff --git a/gitnexus-web/src/core/ingestion/community-processor.ts b/gitnexus-web/src/core/ingestion/community-processor.ts index 1a8901acc..5d898f1ba 100644 --- a/gitnexus-web/src/core/ingestion/community-processor.ts +++ b/gitnexus-web/src/core/ingestion/community-processor.ts @@ -1,7 +1,7 @@ /** * Community Detection Processor * - * Uses the Leiden algorithm (via graphology-communities-louvain) to detect + * Uses the Leiden algorithm (vendored from graphology-communities-leiden) to detect * communities/clusters in the code graph based on CALLS relationships. * * Communities represent groups of code that work together frequently, @@ -9,7 +9,7 @@ */ import Graph from 'graphology'; -import louvain from 'graphology-communities-louvain'; +import leiden from '../../vendor/leiden/index.js'; import { KnowledgeGraph, NodeLabel } from '../graph/types'; // ============================================================================ @@ -93,8 +93,8 @@ export const processCommunities = async ( onProgress?.(`Running Leiden algorithm on ${graph.order} nodes...`, 30); - // Step 2: Run Leiden (via Louvain implementation with refinement) - const details = louvain.detailed(graph, { + // Step 2: Run Leiden algorithm for community detection + const details = leiden.detailed(graph, { resolution: 1.0, // Default resolution, can be tuned randomWalk: true, }); diff --git a/gitnexus-web/src/core/kuzu/csv-generator.ts b/gitnexus-web/src/core/kuzu/csv-generator.ts index 43df569cf..a07ea8ccd 100644 --- a/gitnexus-web/src/core/kuzu/csv-generator.ts +++ b/gitnexus-web/src/core/kuzu/csv-generator.ts @@ -170,14 +170,14 @@ const generateFolderCSV = (nodes: GraphNode[]): string => { /** * Generate CSV for code element nodes (Function, Class, Interface, Method, CodeElement) - * Headers: id,name,filePath,startLine,endLine,content + * Headers: id,name,filePath,startLine,endLine,isExported,content */ const generateCodeElementCSV = ( nodes: GraphNode[], label: NodeLabel, fileContents: Map ): string => { - const headers = ['id', 'name', 'filePath', 'startLine', 'endLine', 'content']; + const headers = ['id', 'name', 'filePath', 'startLine', 'endLine', 'isExported', 'content']; const rows: string[] = [headers.join(',')]; for (const node of nodes) { @@ -189,6 +189,7 @@ const generateCodeElementCSV = ( escapeCSVField(node.properties.filePath || ''), escapeCSVNumber(node.properties.startLine, -1), escapeCSVNumber(node.properties.endLine, -1), + node.properties.isExported ? 'true' : 'false', escapeCSVField(content), ].join(',')); } diff --git a/gitnexus-web/src/core/kuzu/kuzu-adapter.ts b/gitnexus-web/src/core/kuzu/kuzu-adapter.ts index c16e2edf3..92b8cd5c6 100644 --- a/gitnexus-web/src/core/kuzu/kuzu-adapter.ts +++ b/gitnexus-web/src/core/kuzu/kuzu-adapter.ts @@ -240,7 +240,7 @@ const getCopyQuery = (table: NodeTableName, path: string): string => { return `COPY Process(id, label, heuristicLabel, processType, stepCount, communities, entryPointId, terminalId) FROM "${path}" (HEADER=true, PARALLEL=false)`; } // All code element tables: Function, Class, Interface, Method, CodeElement - return `COPY ${table}(id, name, filePath, startLine, endLine, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; + return `COPY ${table}(id, name, filePath, startLine, endLine, isExported, content) FROM "${path}" (HEADER=true, PARALLEL=false)`; }; /** diff --git a/gitnexus-web/src/core/kuzu/schema.ts b/gitnexus-web/src/core/kuzu/schema.ts index 6c20b4bd5..ccf4ea535 100644 --- a/gitnexus-web/src/core/kuzu/schema.ts +++ b/gitnexus-web/src/core/kuzu/schema.ts @@ -62,6 +62,7 @@ CREATE NODE TABLE Function ( filePath STRING, startLine INT64, endLine INT64, + isExported BOOLEAN, content STRING, PRIMARY KEY (id) )`; @@ -73,6 +74,7 @@ CREATE NODE TABLE Class ( filePath STRING, startLine INT64, endLine INT64, + isExported BOOLEAN, content STRING, PRIMARY KEY (id) )`; @@ -84,6 +86,7 @@ CREATE NODE TABLE Interface ( filePath STRING, startLine INT64, endLine INT64, + isExported BOOLEAN, content STRING, PRIMARY KEY (id) )`; @@ -95,6 +98,7 @@ CREATE NODE TABLE Method ( filePath STRING, startLine INT64, endLine INT64, + isExported BOOLEAN, content STRING, PRIMARY KEY (id) )`; @@ -106,6 +110,7 @@ CREATE NODE TABLE CodeElement ( filePath STRING, startLine INT64, endLine INT64, + isExported BOOLEAN, content STRING, PRIMARY KEY (id) )`; diff --git a/gitnexus-web/src/hooks/useAppState.tsx b/gitnexus-web/src/hooks/useAppState.tsx index 720b92314..bdd9321cc 100644 --- a/gitnexus-web/src/hooks/useAppState.tsx +++ b/gitnexus-web/src/hooks/useAppState.tsx @@ -123,9 +123,6 @@ interface AppState { // Embedding methods startEmbeddings: (forceDevice?: 'webgpu' | 'wasm') => Promise; - startBackgroundEnrichment: () => Promise; - cancelEnrichment: () => Promise; - enrichmentProgress: { current: number; total: number } | null; semanticSearch: (query: string, k?: number) => Promise; semanticSearchWithContext: (query: string, k?: number, hops?: number) => Promise; isEmbeddingReady: boolean; @@ -149,7 +146,6 @@ interface AppState { // LLM methods refreshLLMSettings: () => void; - runClusterEnrichment: () => Promise; initializeAgent: (overrideProjectName?: string) => Promise; sendChatMessage: (message: string) => Promise; clearChat: () => void; @@ -294,10 +290,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { const [isCodePanelOpen, setCodePanelOpen] = useState(false); const [codeReferenceFocus, setCodeReferenceFocus] = useState(null); - // Cluster enrichment state - const [enrichmentProgress, setEnrichmentProgress] = useState<{ current: number; total: number } | null>(null); - const enrichmentCancelledRef = useRef(false); - const normalizePath = useCallback((p: string) => { return p.replace(/\\/g, '/').replace(/^\.?\//, ''); }, []); @@ -521,63 +513,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { } }, []); - // Background cluster enrichment - const startBackgroundEnrichment = useCallback(async (): Promise => { - const api = apiRef.current; - if (!api) return; - - enrichmentCancelledRef.current = false; - - try { - const result = await api.startBackgroundEnrichment( - Comlink.proxy((current: number, total: number) => { - setEnrichmentProgress({ current, total }); - setProgress({ - phase: 'complete', - percent: 100, - message: `Labeling clusters ${current}/${total}...`, - }); - }) - ); - - setEnrichmentProgress(null); - - if (!result.skipped && result.enriched > 0) { - setProgress({ - phase: 'complete', - percent: 100, - message: 'Smart cluster labels generated!', - }); - // Clear after 3 seconds - setTimeout(() => setProgress(null), 3000); - } - } catch (err) { - console.warn('Background enrichment failed:', err); - setEnrichmentProgress(null); - } - }, []); - - // Cancel/pause enrichment - const cancelEnrichment = useCallback(async (): Promise => { - const api = apiRef.current; - if (!api) return; - - enrichmentCancelledRef.current = true; - setEnrichmentProgress(null); - - try { - await api.cancelEnrichment(); - setProgress({ - phase: 'complete', - percent: 100, - message: 'LLM labeling stopped. Using heuristic labels.', - }); - setTimeout(() => setProgress(null), 3000); - } catch (err) { - console.warn('Cancel enrichment failed:', err); - } - }, []); - const semanticSearch = useCallback(async ( query: string, k: number = 10 @@ -612,93 +547,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { }); }, []); - const runClusterEnrichment = useCallback(async () => { - const api = apiRef.current; - if (!api) { - setAgentError('Worker not initialized'); - return; - } - - - const defaultConfig = getActiveProviderConfig(); - const configToUse = (!llmSettings.useSameModelForClustering && llmSettings.clusteringProvider?.provider) - ? { - ...defaultConfig, - provider: llmSettings.clusteringProvider.provider || defaultConfig!.provider, - model: llmSettings.clusteringProvider.model || defaultConfig!.model, - apiKey: (llmSettings.clusteringProvider as any).apiKey || (defaultConfig as any).apiKey - } as ProviderConfig - : defaultConfig; - - if (!configToUse) { - // No provider configured - open settings panel - setSettingsPanelOpen(true); - setAgentError('Please configure an LLM provider in Settings first.'); - return; - } - - - try { - setProgress({ - phase: 'enriching', - percent: 1, - message: 'Starting AI enrichment...', - stats: { filesProcessed: 0, totalFiles: 0, nodesCreated: 0 } - }); - - const { enrichments } = await api.enrichCommunities( - configToUse, - Comlink.proxy((current, total) => { - setProgress(prev => prev ? ({ - ...prev, - percent: Math.min(99, 5 + Math.round((current / total) * 90)), - message: `Enriching clusters ${current}/${total}` - }) : null); - }) - ); - - // Update local graph - setGraph(prevGraph => { - if (!prevGraph) return null; - - const newNodes = prevGraph.nodes.map(n => { - if (n.label === 'Community' && enrichments[n.id]) { - const e = enrichments[n.id]; - return { - ...n, - properties: { - ...n.properties, - name: e.name, - keywords: e.keywords, - description: e.description, - enrichedBy: 'llm' as const - } - }; - } - return n; - }); - return { ...prevGraph, nodes: newNodes }; - }); - - setProgress({ - phase: 'complete', - percent: 100, - message: '✨ Smart labels generated!', - stats: { filesProcessed: 0, totalFiles: 0, nodesCreated: 0 } - }); - - - // Clear progress after 3 seconds - setTimeout(() => setProgress(null), 3000); - - } catch (err) { - console.error(err); - const errorMsg = err instanceof Error ? err.message : String(err); - setAgentError('Clustering enrichment failed: ' + errorMsg); - setProgress(null); - } - }, [llmSettings]); - const refreshLLMSettings = useCallback(() => { setLLMSettings(loadSettings()); }, []); @@ -1095,6 +943,15 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { } }, [chatMessages, isAgentReady, initializeAgent, resolveFilePath, findFileNodeId, addCodeReference, clearAICodeReferences, clearAIToolHighlights, graph, embeddingStatus]); + const stopChatResponse = useCallback(() => { + const api = apiRef.current; + if (api && isChatLoading) { + api.stopChat(); + setIsChatLoading(false); + setCurrentToolCalls([]); + } + }, [isChatLoading]); + const clearChat = useCallback(() => { setChatMessages([]); setCurrentToolCalls([]); @@ -1202,9 +1059,6 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { embeddingStatus, embeddingProgress, startEmbeddings, - startBackgroundEnrichment, - cancelEnrichment, - enrichmentProgress, semanticSearch, semanticSearchWithContext, isEmbeddingReady: embeddingStatus === 'ready', @@ -1224,9 +1078,9 @@ export const AppStateProvider = ({ children }: { children: ReactNode }) => { currentToolCalls, // LLM methods refreshLLMSettings, - runClusterEnrichment, initializeAgent, sendChatMessage, + stopChatResponse, clearChat, // Code References Panel codeReferences, diff --git a/gitnexus-web/src/repomix-output.md b/gitnexus-web/src/repomix-output.md deleted file mode 100644 index 6a96c3c1e..000000000 --- a/gitnexus-web/src/repomix-output.md +++ /dev/null @@ -1,13681 +0,0 @@ -This file is a merged representation of the entire codebase, combining all repository files into a single document. -Generated by Repomix on: 2026-01-20 12:29:34 - -# File Summary - -## Purpose: - -This file contains a packed representation of the entire repository's contents. -It is designed to be easily consumable by AI systems for analysis, code review, -or other automated processes. - -## File Format: - -The content is organized as follows: -1. This summary section -2. Repository information -3. Repository structure -4. Multiple file entries, each consisting of: - a. A header with the file path (## File: path/to/file) - b. The full contents of the file in a code block - -## Usage Guidelines: - -- This file should be treated as read-only. Any changes should be made to the - original repository files, not this packed version. -- When processing this file, use the file path to distinguish - between different files in the repository. -- Be aware that this file may contain sensitive information. Handle it with - the same level of security as you would the original repository. - -## Notes: - -- Some files may have been excluded based on .gitignore rules and Repomix's - configuration. -- Binary files are not included in this packed representation. Please refer to - the Repository Structure section for a complete list of file paths, including - binary files. - -## Additional Information: - -For more information about Repomix, visit: https://github.com/andersonby/python-repomix - - -# Repository Structure - -``` -App.tsx -components - ActivityFeed.tsx - CodeReferencesPanel.tsx - EmbeddingStatus.tsx - FileTreePanel.tsx - GraphCanvas.tsx - Header.tsx - IntelligentClusteringModal.tsx - LoadingOverlay.tsx - MarkdownRenderer.tsx - MCPToggle.tsx - MermaidDiagram.tsx - QueryFAB.tsx - RightPanel.tsx - StatusBar.tsx - ToolCallCard.tsx - WebGPUFallbackDialog.tsx -config - ignore-service.ts - supported-languages.ts -core - embeddings - embedder.ts - embedding-pipeline.ts - index.ts - text-generator.ts - types.ts - graph - graph.ts - types.ts - ingestion - ast-cache.ts - call-processor.ts - cluster-enricher.ts - community-processor.ts - heritage-processor.ts - import-processor.ts - parsing-processor.ts - pipeline.ts - structure-processor.ts - symbol-table.ts - tree-sitter-queries.ts - utils.ts - kuzu - csv-generator.ts - kuzu-adapter.ts - schema.ts - llm - agent.ts - context-builder.ts - index.ts - settings-service.ts - mcp - mcp-client.ts - search - hybrid-search.ts - index.ts - tree-sitter - parser-loader.ts -hooks - useAppState.tsx - useSigma.ts -index.css -main.tsx -services - zip.ts -types - kuzu-wasm.d.ts - pipeline.ts -vite-env.d.ts -workers - ingestion.worker.ts -``` - -# Repository Files - - -## App.tsx - -```text -import { useCallback, useRef } from 'react'; -import { AppStateProvider, useAppState } from './hooks/useAppState'; -import { DropZone } from './components/DropZone'; -import { LoadingOverlay } from './components/LoadingOverlay'; -import { Header } from './components/Header'; -import { GraphCanvas, GraphCanvasHandle } from './components/GraphCanvas'; -import { RightPanel } from './components/RightPanel'; -import { SettingsPanel } from './components/SettingsPanel'; -import { StatusBar } from './components/StatusBar'; -import { FileTreePanel } from './components/FileTreePanel'; -import { CodeReferencesPanel } from './components/CodeReferencesPanel'; -import { FileEntry } from './services/zip'; -import { getActiveProviderConfig } from './core/llm/settings-service'; - -const AppContent = () => { - const { - viewMode, - setViewMode, - setGraph, - setFileContents, - setProgress, - setProjectName, - progress, - isRightPanelOpen, - runPipeline, - runPipelineFromFiles, - isSettingsPanelOpen, - setSettingsPanelOpen, - refreshLLMSettings, - initializeAgent, - startEmbeddings, - embeddingStatus, - codeReferences, - selectedNode, - isCodePanelOpen, - } = useAppState(); - - const graphCanvasRef = useRef(null); - - const handleFileSelect = useCallback(async (file: File) => { - const projectName = file.name.replace('.zip', ''); - setProjectName(projectName); - setViewMode('loading'); - - try { - const result = await runPipeline(file, (progress) => { - setProgress(progress); - }); - - setGraph(result.graph); - setFileContents(result.fileContents); - setViewMode('exploring'); - - // Initialize (or re-initialize) the agent AFTER a repo loads so it captures - // the current codebase context (file contents + graph tools) in the worker. - if (getActiveProviderConfig()) { - initializeAgent(projectName); - } - - // Auto-start embeddings pipeline in background - // Uses WebGPU if available, falls back to WASM - startEmbeddings().catch((err) => { - // WebGPU not available - try WASM fallback silently - if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) { - startEmbeddings('wasm').catch(console.warn); - } else { - console.warn('Embeddings auto-start failed:', err); - } - }); - } catch (error) { - console.error('Pipeline error:', error); - setProgress({ - phase: 'error', - percent: 0, - message: 'Error processing file', - detail: error instanceof Error ? error.message : 'Unknown error', - }); - setTimeout(() => { - setViewMode('onboarding'); - setProgress(null); - }, 3000); - } - }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipeline, startEmbeddings, initializeAgent]); - - const handleGitClone = useCallback(async (files: FileEntry[]) => { - // Extract project name from first file path (e.g., "owner-repo-123/src/..." -> "owner-repo") - const firstPath = files[0]?.path || 'repository'; - const projectName = firstPath.split('/')[0].replace(/-\d+$/, '') || 'repository'; - - setProjectName(projectName); - setViewMode('loading'); - - try { - const result = await runPipelineFromFiles(files, (progress) => { - setProgress(progress); - }); - - setGraph(result.graph); - setFileContents(result.fileContents); - setViewMode('exploring'); - - // Initialize (or re-initialize) the agent AFTER a repo loads so it captures - // the current codebase context (file contents + graph tools) in the worker. - if (getActiveProviderConfig()) { - initializeAgent(projectName); - } - - // Auto-start embeddings pipeline in background - // Uses WebGPU if available, falls back to WASM - startEmbeddings().catch((err) => { - // WebGPU not available - try WASM fallback silently - if (err?.name === 'WebGPUNotAvailableError' || err?.message?.includes('WebGPU')) { - startEmbeddings('wasm').catch(console.warn); - } else { - console.warn('Embeddings auto-start failed:', err); - } - }); - } catch (error) { - console.error('Pipeline error:', error); - setProgress({ - phase: 'error', - percent: 0, - message: 'Error processing repository', - detail: error instanceof Error ? error.message : 'Unknown error', - }); - setTimeout(() => { - setViewMode('onboarding'); - setProgress(null); - }, 3000); - } - }, [setViewMode, setGraph, setFileContents, setProgress, setProjectName, runPipelineFromFiles, startEmbeddings, initializeAgent]); - - const handleFocusNode = useCallback((nodeId: string) => { - graphCanvasRef.current?.focusNode(nodeId); - }, []); - - // Handle settings saved - refresh and reinitialize agent - // NOTE: Must be defined BEFORE any conditional returns (React hooks rule) - const handleSettingsSaved = useCallback(() => { - refreshLLMSettings(); - initializeAgent(); - }, [refreshLLMSettings, initializeAgent]); - - // Render based on view mode - if (viewMode === 'onboarding') { - return ; - } - - if (viewMode === 'loading' && progress) { - return ; - } - - // Exploring view - return ( -
-
- -
- {/* Left Panel - File Tree */} - - - {/* Graph area - takes remaining space */} -
- - - {/* Code References Panel (overlay) - does NOT resize the graph, it overlaps on top */} - {isCodePanelOpen && (codeReferences.length > 0 || !!selectedNode) && ( -
- -
- )} -
- - {/* Right Panel - Code & Chat (tabbed) */} - {isRightPanelOpen && } -
- - - - {/* Settings Panel (modal) */} - setSettingsPanelOpen(false)} - onSettingsSaved={handleSettingsSaved} - /> -
- ); -}; - -function App() { - return ( - - - - ); -} - -export default App; -``` - -## components/ActivityFeed.tsx - -```text -/** - * Activity Feed Component - * - * Shows real-time log of external AI agent tool calls. - * Used in RightPanel as an alternative to the Chat tab. - */ - -import { useState, useEffect, useRef } from 'react'; -import { Activity, Search, Database, Terminal, Eye, Loader2, CheckCircle, XCircle, Clock, FileText, Zap } from 'lucide-react'; -import { getMCPClient, type ActivityEvent } from '../core/mcp/mcp-client'; - -// Tool icons -const TOOL_ICONS: Record = { - context: Zap, - search: Search, - cypher: Database, - grep: Terminal, - read: FileText, - blastRadius: Activity, - highlight: Eye, -}; - -// Tool colors -const TOOL_COLORS: Record = { - context: 'text-amber-400', - search: 'text-cyan-400', - cypher: 'text-purple-400', - grep: 'text-green-400', - read: 'text-blue-400', - blastRadius: 'text-rose-400', - highlight: 'text-teal-400', -}; - -export function ActivityFeed() { - const [events, setEvents] = useState([]); - const containerRef = useRef(null); - - useEffect(() => { - const client = getMCPClient(); - - // Subscribe to activity events - const unsubscribe = client.onActivity((event) => { - setEvents(prev => { - // Keep max 100 events - const next = [...prev, event]; - if (next.length > 100) { - next.shift(); - } - return next; - }); - }); - - // Get existing events - setEvents(client.getActivityLog()); - - return () => { - unsubscribe(); - }; - }, []); - - // Auto-scroll to bottom - useEffect(() => { - if (containerRef.current) { - containerRef.current.scrollTop = containerRef.current.scrollHeight; - } - }, [events]); - - const formatTime = (timestamp: number) => { - const date = new Date(timestamp); - return date.toLocaleTimeString('en-US', { - hour: '2-digit', - minute: '2-digit', - second: '2-digit', - }); - }; - - const formatParams = (params: any): string => { - if (!params) return ''; - // Show first key-value pairs, truncated - const entries = Object.entries(params).slice(0, 2); - return entries.map(([k, v]) => { - const val = typeof v === 'string' ? v.slice(0, 30) : JSON.stringify(v).slice(0, 30); - return `${k}: ${val}${val.length >= 30 ? '...' : ''}`; - }).join(', '); - }; - - const formatResult = (event: ActivityEvent): string => { - if (event.status === 'running') return 'Running...'; - if (event.status === 'error') return `Error: ${event.error?.slice(0, 50) || 'Unknown'}`; - - // Format result based on type - if (Array.isArray(event.result)) { - return `${event.result.length} results`; - } - if (typeof event.result === 'object' && event.result) { - const keys = Object.keys(event.result); - if (keys.includes('content')) return `${event.result.content?.length || 0} chars`; - if (keys.includes('projectName')) return event.result.projectName; - return `{${keys.slice(0, 3).join(', ')}${keys.length > 3 ? '...' : ''}}`; - } - return String(event.result || 'Done'); - }; - - if (events.length === 0) { - return ( -
-
- 📡 -
-

- No Agent Activity -

-

- When external AI agents (Cursor, Claude Code) call GitNexus tools, - their activity will appear here in real-time. -

-

- Make sure MCP toggle is enabled in the header -

-
- ); - } - - return ( -
-
- {events.map((event) => { - const Icon = TOOL_ICONS[event.tool] || Activity; - const color = TOOL_COLORS[event.tool] || 'text-text-muted'; - - return ( -
- {/* Header row */} -
- {/* Agent color indicator */} - {event.agentColor && ( -
- )} - - {event.tool} - {event.agentName && event.agentName !== 'Unknown' && ( - - {event.agentName} - - )} - - - {formatTime(event.timestamp)} - -
- - {/* Params preview */} - {event.params && Object.keys(event.params).length > 0 && ( -
- {formatParams(event.params)} -
- )} - - {/* Status/Result */} -
- {event.status === 'running' && ( - <> - - Running... - - )} - {event.status === 'complete' && ( - <> - - {formatResult(event)} - {event.duration && ( - {event.duration}ms - )} - - )} - {event.status === 'error' && ( - <> - - {formatResult(event)} - - )} -
-
- ); - })} -
-
- ); -} -``` - -## components/CodeReferencesPanel.tsx - -```text -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { Code, PanelLeftClose, PanelLeft, Trash2, X, Target, FileCode, Sparkles, MousePointerClick } from 'lucide-react'; -import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; -import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism'; -import { useAppState } from '../hooks/useAppState'; -import { NODE_COLORS } from '../lib/constants'; - -// Match the code theme used elsewhere in the app -const customTheme = { - ...vscDarkPlus, - 'pre[class*="language-"]': { - ...vscDarkPlus['pre[class*="language-"]'], - background: '#0a0a10', - margin: 0, - padding: '12px 0', - fontSize: '13px', - lineHeight: '1.6', - }, - 'code[class*="language-"]': { - ...vscDarkPlus['code[class*="language-"]'], - background: 'transparent', - fontFamily: '"JetBrains Mono", "Fira Code", monospace', - }, -}; - -export interface CodeReferencesPanelProps { - onFocusNode: (nodeId: string) => void; -} - -export const CodeReferencesPanel = ({ onFocusNode }: CodeReferencesPanelProps) => { - const { - graph, - fileContents, - selectedNode, - codeReferences, - removeCodeReference, - clearCodeReferences, - setSelectedNode, - codeReferenceFocus, - } = useAppState(); - - const [isCollapsed, setIsCollapsed] = useState(false); - const [glowRefId, setGlowRefId] = useState(null); - const panelRef = useRef(null); - const resizeRef = useRef<{ startX: number; startWidth: number } | null>(null); - const refCardEls = useRef>(new Map()); - const glowTimerRef = useRef(null); - - useEffect(() => { - return () => { - if (glowTimerRef.current) { - window.clearTimeout(glowTimerRef.current); - glowTimerRef.current = null; - } - }; - }, []); - - const [panelWidth, setPanelWidth] = useState(() => { - try { - const saved = window.localStorage.getItem('gitnexus.codePanelWidth'); - const parsed = saved ? parseInt(saved, 10) : NaN; - if (!Number.isFinite(parsed)) return 560; // increased default - return Math.max(420, Math.min(parsed, 900)); - } catch { - return 560; - } - }); - - useEffect(() => { - try { - window.localStorage.setItem('gitnexus.codePanelWidth', String(panelWidth)); - } catch { - // ignore - } - }, [panelWidth]); - - const startResize = useCallback((e: React.MouseEvent) => { - e.preventDefault(); - e.stopPropagation(); - resizeRef.current = { startX: e.clientX, startWidth: panelWidth }; - document.body.style.cursor = 'col-resize'; - document.body.style.userSelect = 'none'; - - const onMove = (ev: MouseEvent) => { - const state = resizeRef.current; - if (!state) return; - const delta = ev.clientX - state.startX; - const next = Math.max(420, Math.min(state.startWidth + delta, 900)); - setPanelWidth(next); - }; - - const onUp = () => { - resizeRef.current = null; - document.body.style.cursor = ''; - document.body.style.userSelect = ''; - window.removeEventListener('mousemove', onMove); - window.removeEventListener('mouseup', onUp); - }; - - window.addEventListener('mousemove', onMove); - window.addEventListener('mouseup', onUp); - }, [panelWidth]); - - const aiReferences = useMemo(() => codeReferences.filter(r => r.source === 'ai'), [codeReferences]); - - // When the user clicks a citation badge in chat, focus the corresponding snippet card: - // - expand the panel if collapsed - // - smooth-scroll the card into view - // - briefly glow it for discoverability - useEffect(() => { - if (!codeReferenceFocus) return; - - // Ensure panel is expanded - setIsCollapsed(false); - - const { filePath, startLine, endLine } = codeReferenceFocus; - const target = - aiReferences.find(r => - r.filePath === filePath && - r.startLine === startLine && - r.endLine === endLine - ) ?? - aiReferences.find(r => r.filePath === filePath); - - if (!target) return; - - // Double rAF: wait for collapse state + list DOM to render. - requestAnimationFrame(() => { - requestAnimationFrame(() => { - const el = refCardEls.current.get(target.id); - if (!el) return; - - el.scrollIntoView({ behavior: 'smooth', block: 'center' }); - setGlowRefId(target.id); - - if (glowTimerRef.current) { - window.clearTimeout(glowTimerRef.current); - } - glowTimerRef.current = window.setTimeout(() => { - setGlowRefId((prev) => (prev === target.id ? null : prev)); - glowTimerRef.current = null; - }, 1200); - }); - }); - }, [codeReferenceFocus?.ts, aiReferences]); - - const refsWithSnippets = useMemo(() => { - return aiReferences.map((ref) => { - const content = fileContents.get(ref.filePath); - if (!content) { - return { ref, content: null as string | null, start: 0, end: 0, highlightStart: 0, highlightEnd: 0, totalLines: 0 }; - } - - const lines = content.split('\n'); - const totalLines = lines.length; - - const startLine = ref.startLine ?? 0; - const endLine = ref.endLine ?? startLine; - - const contextBefore = 3; - const contextAfter = 20; - const start = Math.max(0, startLine - contextBefore); - const end = Math.min(totalLines - 1, endLine + contextAfter); - - return { - ref, - content: lines.slice(start, end + 1).join('\n'), - start, - end, - highlightStart: Math.max(0, startLine - start), - highlightEnd: Math.max(0, endLine - start), - totalLines, - }; - }); - }, [aiReferences, fileContents]); - - const selectedFilePath = selectedNode?.properties?.filePath; - const selectedFileContent = selectedFilePath ? fileContents.get(selectedFilePath) : undefined; - const selectedIsFile = selectedNode?.label === 'File' && !!selectedFilePath; - const showSelectedViewer = !!selectedNode && !!selectedFilePath; - const showCitations = aiReferences.length > 0; - - if (isCollapsed) { - return ( - - ); - } - - return ( - - ); -}; -``` - -## components/EmbeddingStatus.tsx - -```text -import { Brain, Loader2, Check, AlertCircle, Zap, FlaskConical } from 'lucide-react'; -import { useAppState } from '../hooks/useAppState'; -import { useState } from 'react'; -import { WebGPUFallbackDialog } from './WebGPUFallbackDialog'; - -/** - * Embedding status indicator and trigger button - * Shows in header when graph is loaded - */ -export const EmbeddingStatus = () => { - const { - embeddingStatus, - embeddingProgress, - startEmbeddings, - graph, - viewMode, - testArrayParams, - } = useAppState(); - - const [testResult, setTestResult] = useState(null); - const [showFallbackDialog, setShowFallbackDialog] = useState(false); - - // Only show when exploring a loaded graph - if (viewMode !== 'exploring' || !graph) return null; - - const nodeCount = graph.nodes.length; - - const handleStartEmbeddings = async (forceDevice?: 'webgpu' | 'wasm') => { - try { - await startEmbeddings(forceDevice); - } catch (error: any) { - // Check if it's a WebGPU not available error - if (error?.name === 'WebGPUNotAvailableError' || - error?.message?.includes('WebGPU not available')) { - setShowFallbackDialog(true); - } else { - console.error('Embedding failed:', error); - } - } - }; - - const handleUseCPU = () => { - setShowFallbackDialog(false); - handleStartEmbeddings('wasm'); - }; - - const handleSkipEmbeddings = () => { - setShowFallbackDialog(false); - // Just close - user can try again later if they want - }; - - const handleTestArrayParams = async () => { - setTestResult('Testing...'); - const result = await testArrayParams(); - if (result.success) { - setTestResult('✅ Array params WORK!'); - console.log('✅ Array params test passed!'); - } else { - setTestResult(`❌ ${result.error}`); - console.error('❌ Array params test failed:', result.error); - } - }; - - // WebGPU fallback dialog - rendered independently of state - const fallbackDialog = ( - setShowFallbackDialog(false)} - onUseCPU={handleUseCPU} - onSkip={handleSkipEmbeddings} - nodeCount={nodeCount} - /> - ); - - // Idle state - show button to start - if (embeddingStatus === 'idle') { - return ( - <> -
- {/* Test button (dev only) */} - {import.meta.env.DEV && ( - - )} - - -
- {fallbackDialog} - - ); - } - - // Loading model - if (embeddingStatus === 'loading') { - const downloadPercent = embeddingProgress?.modelDownloadPercent ?? 0; - return ( - <> -
- -
- Loading AI model... -
-
-
-
-
- {fallbackDialog} - - ); - } - - // Embedding in progress - if (embeddingStatus === 'embedding') { - const processed = embeddingProgress?.nodesProcessed ?? 0; - const total = embeddingProgress?.totalNodes ?? 0; - const percent = embeddingProgress?.percent ?? 0; - - return ( -
- -
- - Embedding {processed}/{total} nodes - -
-
-
-
-
- ); - } - - // Indexing - if (embeddingStatus === 'indexing') { - return ( -
- - Creating vector index... -
- ); - } - - // Ready - if (embeddingStatus === 'ready') { - return ( -
- - Semantic Ready -
- ); - } - - // Error - if (embeddingStatus === 'error') { - return ( - <> - - {fallbackDialog} - - ); - } - - return null; -}; -``` - -## components/FileTreePanel.tsx - -```text -import { useState, useMemo, useCallback, useEffect } from 'react'; -import { - ChevronRight, - ChevronDown, - Folder, - FolderOpen, - FileCode, - Search, - Filter, - PanelLeftClose, - PanelLeft, - Box, - Braces, - Variable, - Hash, - Target, -} from 'lucide-react'; -import { useAppState } from '../hooks/useAppState'; -import { FILTERABLE_LABELS, NODE_COLORS, ALL_EDGE_TYPES, EDGE_INFO, type EdgeType } from '../lib/constants'; -import { GraphNode, NodeLabel } from '../core/graph/types'; - -// Tree node structure -interface TreeNode { - id: string; - name: string; - type: 'folder' | 'file'; - path: string; - children: TreeNode[]; - graphNode?: GraphNode; -} - -// Build tree from graph nodes -const buildFileTree = (nodes: GraphNode[]): TreeNode[] => { - const root: TreeNode[] = []; - const pathMap = new Map(); - - // Filter to only folders and files - const fileNodes = nodes.filter(n => n.label === 'Folder' || n.label === 'File'); - - // Sort by path to ensure parents come before children - fileNodes.sort((a, b) => a.properties.filePath.localeCompare(b.properties.filePath)); - - fileNodes.forEach(node => { - const parts = node.properties.filePath.split('/').filter(Boolean); - let currentPath = ''; - let currentLevel = root; - - parts.forEach((part, index) => { - currentPath = currentPath ? `${currentPath}/${part}` : part; - - let existing = pathMap.get(currentPath); - - if (!existing) { - const isLastPart = index === parts.length - 1; - const isFile = isLastPart && node.label === 'File'; - - existing = { - id: isLastPart ? node.id : currentPath, - name: part, - type: isFile ? 'file' : 'folder', - path: currentPath, - children: [], - graphNode: isLastPart ? node : undefined, - }; - - pathMap.set(currentPath, existing); - currentLevel.push(existing); - } - - currentLevel = existing.children; - }); - }); - - return root; -}; - -// Tree item component -interface TreeItemProps { - node: TreeNode; - depth: number; - searchQuery: string; - onNodeClick: (node: TreeNode) => void; - expandedPaths: Set; - toggleExpanded: (path: string) => void; - selectedPath: string | null; -} - -const TreeItem = ({ - node, - depth, - searchQuery, - onNodeClick, - expandedPaths, - toggleExpanded, - selectedPath, -}: TreeItemProps) => { - const isExpanded = expandedPaths.has(node.path); - const isSelected = selectedPath === node.path; - const hasChildren = node.children.length > 0; - - // Filter children based on search - const filteredChildren = useMemo(() => { - if (!searchQuery) return node.children; - return node.children.filter(child => - child.name.toLowerCase().includes(searchQuery.toLowerCase()) || - child.children.some(c => c.name.toLowerCase().includes(searchQuery.toLowerCase())) - ); - }, [node.children, searchQuery]); - - // Check if this node matches search - const matchesSearch = searchQuery && node.name.toLowerCase().includes(searchQuery.toLowerCase()); - - const handleClick = () => { - if (hasChildren) { - toggleExpanded(node.path); - } - onNodeClick(node); - }; - - return ( -
- - - {/* Children */} - {isExpanded && filteredChildren.length > 0 && ( -
- {filteredChildren.map(child => ( - - ))} -
- )} -
- ); -}; - -// Icon for node types -const getNodeTypeIcon = (label: NodeLabel) => { - switch (label) { - case 'Folder': return Folder; - case 'File': return FileCode; - case 'Class': return Box; - case 'Function': return Braces; - case 'Method': return Braces; - case 'Interface': return Hash; - case 'Import': return FileCode; - default: return Variable; - } -}; - -interface FileTreePanelProps { - onFocusNode: (nodeId: string) => void; -} - -export const FileTreePanel = ({ onFocusNode }: FileTreePanelProps) => { - const { graph, visibleLabels, toggleLabelVisibility, visibleEdgeTypes, toggleEdgeVisibility, selectedNode, setSelectedNode, openCodePanel, depthFilter, setDepthFilter } = useAppState(); - - const [isCollapsed, setIsCollapsed] = useState(false); - const [searchQuery, setSearchQuery] = useState(''); - const [expandedPaths, setExpandedPaths] = useState>(new Set()); - const [activeTab, setActiveTab] = useState<'files' | 'filters'>('files'); - - // Build file tree from graph - const fileTree = useMemo(() => { - if (!graph) return []; - return buildFileTree(graph.nodes); - }, [graph]); - - // Auto-expand first level on initial load - useEffect(() => { - if (fileTree.length > 0 && expandedPaths.size === 0) { - const firstLevel = new Set(fileTree.map(n => n.path)); - setExpandedPaths(firstLevel); - } - }, [fileTree.length]); // Only run when tree first loads - - // Auto-expand to selected file when selectedNode changes (e.g., from graph click) - useEffect(() => { - const path = selectedNode?.properties?.filePath; - if (!path) return; - - // Expand all parent folders leading to this file - const parts = path.split('/').filter(Boolean); - const pathsToExpand: string[] = []; - let currentPath = ''; - - // Build all parent paths (exclude the last part if it's a file) - for (let i = 0; i < parts.length - 1; i++) { - currentPath = currentPath ? `${currentPath}/${parts[i]}` : parts[i]; - pathsToExpand.push(currentPath); - } - - if (pathsToExpand.length > 0) { - setExpandedPaths(prev => { - const next = new Set(prev); - pathsToExpand.forEach(p => next.add(p)); - return next; - }); - } - }, [selectedNode?.id]); // Trigger when selected node changes - - const toggleExpanded = useCallback((path: string) => { - setExpandedPaths(prev => { - const next = new Set(prev); - if (next.has(path)) { - next.delete(path); - } else { - next.add(path); - } - return next; - }); - }, []); - - const handleNodeClick = useCallback((treeNode: TreeNode) => { - if (treeNode.graphNode) { - // Only focus if selecting a different node - const isSameNode = selectedNode?.id === treeNode.graphNode.id; - setSelectedNode(treeNode.graphNode); - openCodePanel(); - if (!isSameNode) { - onFocusNode(treeNode.graphNode.id); - } - } - }, [setSelectedNode, openCodePanel, onFocusNode, selectedNode]); - - const selectedPath = selectedNode?.properties.filePath || null; - - if (isCollapsed) { - return ( -
- -
- - -
- ); - } - - return ( -
- {/* Header */} -
-
- - -
- -
- - {activeTab === 'files' && ( - <> - {/* Search */} -
-
- - setSearchQuery(e.target.value)} - className="w-full pl-8 pr-3 py-1.5 bg-elevated border border-border-subtle rounded text-xs text-text-primary placeholder:text-text-muted focus:outline-none focus:border-accent" - /> -
-
- - {/* File tree */} -
- {fileTree.length === 0 ? ( -
- No files loaded -
- ) : ( - fileTree.map(node => ( - - )) - )} -
- - )} - - {activeTab === 'filters' && ( -
-
-

- Node Types -

-

- Toggle visibility of node types in the graph -

-
- -
- {FILTERABLE_LABELS.map((label) => { - const Icon = getNodeTypeIcon(label); - const isVisible = visibleLabels.includes(label); - - return ( - - ); - })} -
- - {/* Edge Type Toggles */} -
-

- Edge Types -

-

- Toggle visibility of relationship types -

- -
- {ALL_EDGE_TYPES.map((edgeType) => { - const info = EDGE_INFO[edgeType]; - const isVisible = visibleEdgeTypes.includes(edgeType); - - return ( - - ); - })} -
-
- - {/* Depth Filter */} -
-

- - Focus Depth -

-

- Show nodes within N hops of selection -

- -
- {[ - { value: null, label: 'All' }, - { value: 1, label: '1 hop' }, - { value: 2, label: '2 hops' }, - { value: 3, label: '3 hops' }, - { value: 5, label: '5 hops' }, - ].map(({ value, label }) => ( - - ))} -
- - {depthFilter !== null && !selectedNode && ( -

- Select a node to apply depth filter -

- )} -
- - {/* Legend */} -
-

- Color Legend -

-
- {(['Folder', 'File', 'Class', 'Function', 'Interface', 'Method'] as NodeLabel[]).map(label => ( -
-
- {label} -
- ))} -
-
-
- )} - - {/* Stats footer */} - {graph && ( -
-
- {graph.nodes.length} nodes - {graph.relationships.length} edges -
-
- )} -
- ); -}; -``` - -## components/GraphCanvas.tsx - -```text -import { useEffect, useCallback, useMemo, useState, forwardRef, useImperativeHandle } from 'react'; -import { ZoomIn, ZoomOut, Maximize2, Focus, RotateCcw, Play, Pause, Lightbulb, LightbulbOff } from 'lucide-react'; -import { useSigma } from '../hooks/useSigma'; -import { useAppState } from '../hooks/useAppState'; -import { knowledgeGraphToGraphology, filterGraphByDepth, SigmaNodeAttributes, SigmaEdgeAttributes } from '../lib/graph-adapter'; -import { QueryFAB } from './QueryFAB'; -import Graph from 'graphology'; - -export interface GraphCanvasHandle { - focusNode: (nodeId: string) => void; -} - -export const GraphCanvas = forwardRef((_, ref) => { - const { - graph, - setSelectedNode, - selectedNode: appSelectedNode, - visibleLabels, - visibleEdgeTypes, - openCodePanel, - depthFilter, - highlightedNodeIds, - aiCitationHighlightedNodeIds, - aiToolHighlightedNodeIds, - blastRadiusNodeIds, - isAIHighlightsEnabled, - toggleAIHighlights, - animatedNodes, - } = useAppState(); - const [hoveredNodeName, setHoveredNodeName] = useState(null); - - const effectiveHighlightedNodeIds = useMemo(() => { - if (!isAIHighlightsEnabled) return highlightedNodeIds; - const next = new Set(highlightedNodeIds); - for (const id of aiCitationHighlightedNodeIds) next.add(id); - for (const id of aiToolHighlightedNodeIds) next.add(id); - // Note: blast radius nodes are handled separately with red color - return next; - }, [highlightedNodeIds, aiCitationHighlightedNodeIds, aiToolHighlightedNodeIds, isAIHighlightsEnabled]); - - // Blast radius nodes (only when AI highlights enabled) - const effectiveBlastRadiusNodeIds = useMemo(() => { - if (!isAIHighlightsEnabled) return new Set(); - return blastRadiusNodeIds; - }, [blastRadiusNodeIds, isAIHighlightsEnabled]); - - // Animated nodes (only when AI highlights enabled) - const effectiveAnimatedNodes = useMemo(() => { - if (!isAIHighlightsEnabled) return new Map(); - return animatedNodes; - }, [animatedNodes, isAIHighlightsEnabled]); - - const handleNodeClick = useCallback((nodeId: string) => { - if (!graph) return; - const node = graph.nodes.find(n => n.id === nodeId); - if (node) { - setSelectedNode(node); - openCodePanel(); - } - }, [graph, setSelectedNode, openCodePanel]); - - const handleNodeHover = useCallback((nodeId: string | null) => { - if (!nodeId || !graph) { - setHoveredNodeName(null); - return; - } - const node = graph.nodes.find(n => n.id === nodeId); - if (node) { - setHoveredNodeName(node.properties.name); - } - }, [graph]); - - const handleStageClick = useCallback(() => { - setSelectedNode(null); - }, [setSelectedNode]); - - const { - containerRef, - sigmaRef, - setGraph: setSigmaGraph, - zoomIn, - zoomOut, - resetZoom, - focusNode, - isLayoutRunning, - startLayout, - stopLayout, - selectedNode: sigmaSelectedNode, - setSelectedNode: setSigmaSelectedNode, - } = useSigma({ - onNodeClick: handleNodeClick, - onNodeHover: handleNodeHover, - onStageClick: handleStageClick, - highlightedNodeIds: effectiveHighlightedNodeIds, - blastRadiusNodeIds: effectiveBlastRadiusNodeIds, - animatedNodes: effectiveAnimatedNodes, - visibleEdgeTypes, - }); - - // Expose focusNode to parent via ref - useImperativeHandle(ref, () => ({ - focusNode: (nodeId: string) => { - // Also update app state so the selection syncs properly - if (graph) { - const node = graph.nodes.find(n => n.id === nodeId); - if (node) { - setSelectedNode(node); - openCodePanel(); - } - } - focusNode(nodeId); - } - }), [focusNode, graph, setSelectedNode, openCodePanel]); - - // Update Sigma graph when KnowledgeGraph changes - useEffect(() => { - if (!graph) return; - const sigmaGraph = knowledgeGraphToGraphology(graph); - setSigmaGraph(sigmaGraph); - }, [graph, setSigmaGraph]); - - // Update node visibility when filters change - useEffect(() => { - const sigma = sigmaRef.current; - if (!sigma) return; - - const sigmaGraph = sigma.getGraph() as Graph; - if (sigmaGraph.order === 0) return; // Don't filter empty graph - - filterGraphByDepth(sigmaGraph, appSelectedNode?.id || null, depthFilter, visibleLabels); - sigma.refresh(); - }, [visibleLabels, depthFilter, appSelectedNode, sigmaRef]); - - // Sync app selected node with sigma - useEffect(() => { - if (appSelectedNode) { - setSigmaSelectedNode(appSelectedNode.id); - } else { - setSigmaSelectedNode(null); - } - }, [appSelectedNode, setSigmaSelectedNode]); - - // Focus on selected node - const handleFocusSelected = useCallback(() => { - if (appSelectedNode) { - focusNode(appSelectedNode.id); - } - }, [appSelectedNode, focusNode]); - - // Clear selection - const handleClearSelection = useCallback(() => { - setSelectedNode(null); - setSigmaSelectedNode(null); - resetZoom(); - }, [setSelectedNode, setSigmaSelectedNode, resetZoom]); - - return ( -
- {/* Background gradient */} -
-
-
- - {/* Sigma container */} -
- - {/* Hovered node tooltip - only show when NOT selected */} - {hoveredNodeName && !sigmaSelectedNode && ( -
- {hoveredNodeName} -
- )} - - {/* Selection info bar */} - {sigmaSelectedNode && appSelectedNode && ( -
-
- - {appSelectedNode.properties.name} - - - ({appSelectedNode.label}) - - -
- )} - - {/* Graph Controls - Bottom Right */} -
- - - - - {/* Divider */} -
- - {/* Focus on selected */} - {appSelectedNode && ( - - )} - - {/* Clear selection */} - {sigmaSelectedNode && ( - - )} - - {/* Divider */} -
- - {/* Layout control */} - -
- - {/* Layout running indicator */} - {isLayoutRunning && ( -
-
- Layout optimizing... -
- )} - - {/* Query FAB */} - - - {/* AI Highlights toggle - Top Right */} -
- -
-
- ); -}); - -GraphCanvas.displayName = 'GraphCanvas'; -``` - -## components/Header.tsx - -```text -import { Search, Settings, HelpCircle, Sparkles, Github, Star } from 'lucide-react'; -import { useAppState } from '../hooks/useAppState'; -import { useState, useMemo, useRef, useEffect, useCallback } from 'react'; -import { GraphNode } from '../core/graph/types'; -import { EmbeddingStatus } from './EmbeddingStatus'; -import { MCPToggle } from './MCPToggle'; -import { buildCodebaseContext } from '../core/llm/context-builder'; - -// Color mapping for node types in search results -const NODE_TYPE_COLORS: Record = { - Folder: '#6366f1', - File: '#3b82f6', - Function: '#10b981', - Class: '#f59e0b', - Method: '#14b8a6', - Interface: '#ec4899', - Variable: '#64748b', - Import: '#475569', - Type: '#a78bfa', -}; - -interface HeaderProps { - onFocusNode?: (nodeId: string) => void; -} - -export const Header = ({ onFocusNode }: HeaderProps) => { - const { - projectName, - graph, - openChatPanel, - isRightPanelOpen, - rightPanelTab, - setSettingsPanelOpen, - runQuery, - semanticSearch, - setHighlightedNodeIds, - fileContents, - triggerNodeAnimation, - } = useAppState(); - const [searchQuery, setSearchQuery] = useState(''); - const [isSearchOpen, setIsSearchOpen] = useState(false); - const [selectedIndex, setSelectedIndex] = useState(0); - const searchRef = useRef(null); - const inputRef = useRef(null); - - const nodeCount = graph?.nodes.length ?? 0; - const edgeCount = graph?.relationships.length ?? 0; - - // Search results - filter nodes by name - const searchResults = useMemo(() => { - if (!graph || !searchQuery.trim()) return []; - - const query = searchQuery.toLowerCase(); - return graph.nodes - .filter(node => node.properties.name.toLowerCase().includes(query)) - .slice(0, 10); // Limit to 10 results - }, [graph, searchQuery]); - - // Handle clicking outside to close dropdown - useEffect(() => { - const handleClickOutside = (e: MouseEvent) => { - if (searchRef.current && !searchRef.current.contains(e.target as Node)) { - setIsSearchOpen(false); - } - }; - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, []); - - // Keyboard shortcut (Cmd+K / Ctrl+K) - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if ((e.metaKey || e.ctrlKey) && e.key === 'k') { - e.preventDefault(); - inputRef.current?.focus(); - setIsSearchOpen(true); - } - if (e.key === 'Escape') { - setIsSearchOpen(false); - inputRef.current?.blur(); - } - }; - document.addEventListener('keydown', handleKeyDown); - return () => document.removeEventListener('keydown', handleKeyDown); - }, []); - - // Handle keyboard navigation in results - const handleKeyDown = (e: React.KeyboardEvent) => { - if (!isSearchOpen || searchResults.length === 0) return; - - if (e.key === 'ArrowDown') { - e.preventDefault(); - setSelectedIndex(i => Math.min(i + 1, searchResults.length - 1)); - } else if (e.key === 'ArrowUp') { - e.preventDefault(); - setSelectedIndex(i => Math.max(i - 1, 0)); - } else if (e.key === 'Enter') { - e.preventDefault(); - const selected = searchResults[selectedIndex]; - if (selected) { - handleSelectNode(selected); - } - } - }; - - const handleSelectNode = (node: GraphNode) => { - // onFocusNode handles both camera focus AND selection in useSigma - onFocusNode?.(node.id); - setSearchQuery(''); - setIsSearchOpen(false); - setSelectedIndex(0); - }; - - return ( -
- {/* Left section */} -
- {/* Logo */} -
-
- ◇ -
- GitNexus -
- - {/* Project badge */} - {projectName && ( -
- - {projectName} -
- )} -
- - {/* Center - Search */} -
-
- - { - setSearchQuery(e.target.value); - setIsSearchOpen(true); - setSelectedIndex(0); - }} - onFocus={() => setIsSearchOpen(true)} - onKeyDown={handleKeyDown} - className="flex-1 bg-transparent border-none outline-none text-sm text-text-primary placeholder:text-text-muted" - /> - - ⌘K - -
- - {/* Search Results Dropdown */} - {isSearchOpen && searchQuery.trim() && ( -
- {searchResults.length === 0 ? ( -
- No nodes found for "{searchQuery}" -
- ) : ( -
- {searchResults.map((node, index) => ( - - ))} -
- )} -
- )} -
- - {/* Right section */} -
- {/* GitHub Star Button */} - - - Star if cool - - - - - {/* Stats */} - {graph && ( -
- {nodeCount} nodes - {edgeCount} edges -
- )} - - {/* Embedding Status */} - - - {/* MCP Toggle for external AI agents */} - { - // Use semantic search from the app - const results = await semanticSearch(query, limit); - // Trigger pulse animation on search results - const nodeIds = results.map((r: any) => r.id).filter(Boolean); - if (nodeIds.length > 0) { - triggerNodeAnimation(nodeIds, 'pulse'); - } - return results; - }} - onCypher={async (query) => { - // Execute Cypher query - const results = await runQuery(query); - return results; - }} - onBlastRadius={async (nodeId, hops = 2) => { - // Run blast radius query - const query = ` - MATCH (start)-[*1..${hops}]-(connected) - WHERE start.id = '${nodeId}' OR start.name = '${nodeId}' - RETURN DISTINCT connected.id AS id, connected.name AS name, labels(connected) AS labels - `; - const results = await runQuery(query); - // Trigger ripple animation on blast radius results - const nodeIds = results.map((r: any) => r.id).filter(Boolean); - if (nodeIds.length > 0) { - triggerNodeAnimation(nodeIds, 'ripple'); - } - return results; - }} - onHighlight={(nodeIds) => { - // Highlight nodes in the graph - setHighlightedNodeIds(new Set(nodeIds)); - // Trigger glow animation on highlighted nodes - if (nodeIds.length > 0) { - triggerNodeAnimation(nodeIds, 'glow'); - } - }} - getContext={async () => { - // Build codebase context for external AI agents - if (!projectName) return null; - const context = await buildCodebaseContext(runQuery, projectName); - // Reshape to match MCP CodebaseContext format - return { - projectName: context.stats.projectName, - stats: { - fileCount: context.stats.fileCount, - functionCount: context.stats.functionCount, - classCount: context.stats.classCount, - interfaceCount: context.stats.interfaceCount, - methodCount: context.stats.methodCount, - }, - hotspots: context.hotspots, - folderTree: context.folderTree, - }; - }} - onGrep={async (pattern, caseSensitive = false, maxResults = 50) => { - // Grep across file contents - const results: Array<{ filePath: string; line: string; lineNumber: number; match: string }> = []; - const regex = new RegExp(pattern, caseSensitive ? 'g' : 'gi'); - - for (const [filePath, content] of fileContents.entries()) { - const lines = content.split('\n'); - for (let i = 0; i < lines.length && results.length < maxResults; i++) { - const line = lines[i]; - const match = line.match(regex); - if (match) { - results.push({ - filePath, - line: line.trim(), - lineNumber: i + 1, - match: match[0], - }); - } - } - if (results.length >= maxResults) break; - } - return results; - }} - onRead={async (filePath, startLine, endLine) => { - // Read file content - let content = fileContents.get(filePath); - - // Try normalized path if not found - if (!content) { - const normalizedPath = filePath.replace(/\\/g, '/'); - for (const [path, c] of fileContents.entries()) { - if (path.endsWith(normalizedPath) || normalizedPath.endsWith(path)) { - content = c; - break; - } - } - } - - if (!content) { - return { error: `File not found: ${filePath}` }; - } - - const lines = content.split('\n'); - const language = filePath.split('.').pop() || 'text'; - - // If line range specified, return only those lines - if (startLine !== undefined && endLine !== undefined) { - const slice = lines.slice(startLine - 1, endLine); - return { - filePath, - content: slice.join('\n'), - language, - lines: slice.length, - }; - } - - return { - filePath, - content, - language, - lines: lines.length, - }; - }} - /> - - {/* Icon buttons */} - - - - {/* AI Button */} - -
-
- ); -}; -``` - -## components/IntelligentClusteringModal.tsx - -```text -import { Brain, Sparkles, X, Settings, Wallet } from 'lucide-react'; -import { useSettings } from '../hooks/useSettings'; -import { useAppState } from '../hooks/useAppState'; - -interface IntelligentClusteringModalProps { - isOpen: boolean; - onClose: () => void; - onEnable: () => void; - onConfigure: () => void; -} - -export const IntelligentClusteringModal = ({ - isOpen, - onClose, - onEnable, - onConfigure -}: IntelligentClusteringModalProps) => { - const { updateSettings } = useSettings(); - - if (!isOpen) return null; - - const handleEnable = () => { - updateSettings({ intelligentClustering: true, hasSeenClusteringPrompt: true }); - onEnable(); - onClose(); - }; - - const handleSkip = () => { - updateSettings({ hasSeenClusteringPrompt: true }); - onClose(); - }; - - return ( -
- {/* Backdrop */} -
- - {/* Modal Content */} -
- - {/* Header with cool gradient background */} -
-
- -
- - - -
-
- -
-
- -

- Upgrade to Intelligent Clustering? -

-

- Your clusters are ready, but they could be smarter! Right now they're just named after folders. -

-
- - {/* Body */} -
- -
-

- - What you get: -

-
    -
  • - - Semantic names (e.g., "Auth System" vs "utils") -
  • -
  • - - Search keywords for better agent context -
  • -
  • - - Descriptions of what the code actually does -
  • -
-
- - {/* Cost Note */} -
-
-
- -
-
-

Super cheap!

-

- Costs very less tokens for the whole codebase. -
- Pro tip: Smaller, cheaper models like GPT-4o-mini work great too! -

-
-
-
- -
- - {/* Actions */} -
- - -
- -
- -
-
- -
-
- ); -}; -``` - -## components/LoadingOverlay.tsx - -```text -import { PipelineProgress } from '../types/pipeline'; - -interface LoadingOverlayProps { - progress: PipelineProgress; -} - -export const LoadingOverlay = ({ progress }: LoadingOverlayProps) => { - return ( -
- {/* Background gradient effects */} -
-
-
-
- - {/* Pulsing orb */} -
-
-
-
- - {/* Progress bar */} -
-
-
-
-
- - {/* Status text */} -
-

- {progress.message} - | -

- {progress.detail && ( -

- {progress.detail} -

- )} -
- - {/* Stats */} - {progress.stats && ( -
-
- - {progress.stats.filesProcessed} / {progress.stats.totalFiles} files -
-
- - {progress.stats.nodesCreated} nodes -
-
- )} - - {/* Percent */} -

- {progress.percent}% -

-
- ); -}; -``` - -## components/MarkdownRenderer.tsx - -````text -import React from 'react'; -import ReactMarkdown from 'react-markdown'; -import remarkGfm from 'remark-gfm'; -import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter'; -import { vscDarkPlus } from 'react-syntax-highlighter/dist/esm/styles/prism'; -import { MermaidDiagram } from './MermaidDiagram'; -import { ToolCallCard } from './ToolCallCard'; - -// Custom syntax theme -const customTheme = { - ...vscDarkPlus, - 'pre[class*="language-"]': { - ...vscDarkPlus['pre[class*="language-"]'], - background: '#0a0a10', - margin: 0, - padding: '16px 0', - fontSize: '13px', - lineHeight: '1.6', - }, - 'code[class*="language-"]': { - ...vscDarkPlus['code[class*="language-"]'], - background: 'transparent', - fontFamily: '"JetBrains Mono", "Fira Code", monospace', - }, -}; - -interface MarkdownRendererProps { - content: string; - onLinkClick?: (href: string) => void; - toolCalls?: any[]; // Keep flexible for now -} - -export const MarkdownRenderer: React.FC = ({ - content, - onLinkClick, - toolCalls -}) => { - - // Helper to format text for display (convert [[links]] to markdown links) - const formatMarkdownForDisplay = (md: string) => { - // Avoid rewriting inside fenced code blocks. - const parts = md.split('```'); - for (let i = 0; i < parts.length; i += 2) { - // Pattern 1: File grounding - [[file.ext]] - parts[i] = parts[i].replace( - /\[\[([a-zA-Z0-9_\-./\\]+\.[a-zA-Z0-9]+(?::\d+(?:[-–]\d+)?)?)\]\]/g, - (_m, inner: string) => { - const trimmed = inner.trim(); - const href = `code-ref:${encodeURIComponent(trimmed)}`; - return `[${trimmed}](${href})`; - } - ); - - // Pattern 2: Node grounding - [[Type:Name]] - parts[i] = parts[i].replace( - /\[\[(?:graph:)?(Class|Function|Method|Interface|File|Folder|Variable|Enum|Type|CodeElement):([^\]]+)\]\]/g, - (_m, nodeType: string, nodeName: string) => { - const trimmed = `${nodeType}:${nodeName.trim()}`; - const href = `node-ref:${encodeURIComponent(trimmed)}`; - return `[${trimmed}](${href})`; - } - ); - } - return parts.join('```'); - }; - - const handleLinkClick = (e: React.MouseEvent, href: string) => { - if (href.startsWith('code-ref:') || href.startsWith('node-ref:')) { - e.preventDefault(); - onLinkClick?.(href); - } - // External links open in new tab (default behavior) - }; - - const formattedContent = React.useMemo(() => formatMarkdownForDisplay(content), [content]); - - const markdownComponents = React.useMemo(() => ({ - a: ({ href, children, ...props }: any) => { - const hrefStr = href || ''; - - // Grounding links (Code refs & Node refs) - if (hrefStr.startsWith('code-ref:') || hrefStr.startsWith('node-ref:')) { - const isNodeRef = hrefStr.startsWith('node-ref:'); - const inner = decodeURIComponent(hrefStr.slice(isNodeRef ? 9 : 9)); // length is same? wait.. code-ref: (9), node-ref: (9). Yes. - - // Styles - const baseParams = "code-ref-btn inline-flex items-center px-2 py-0.5 rounded-md font-mono text-[12px] !no-underline hover:!no-underline transition-colors"; - const colorParams = isNodeRef - ? "border border-amber-300/55 bg-amber-400/10 !text-amber-200 visited:!text-amber-200 hover:bg-amber-400/15 hover:border-amber-200/70" - : "border border-cyan-300/55 bg-cyan-400/10 !text-cyan-200 visited:!text-cyan-200 hover:bg-cyan-400/15 hover:border-cyan-200/70"; - - return ( - handleLinkClick(e, hrefStr)} - className={`${baseParams} ${colorParams}`} - title={isNodeRef ? `View ${inner} in Code panel` : `Open in Code panel • ${inner}`} - {...props} - > - {children} - - ); - } - - // External links - return ( -
- {children} - - ); - }, - code: ({ className, children, ...props }: any) => { - const match = /language-(\w+)/.exec(className || ''); - const isInline = !className && !match; - const codeContent = String(children).replace(/\n$/, ''); - - if (isInline) { - return {children}; - } - - const language = match ? match[1] : 'text'; - - // Render Mermaid diagrams - if (language === 'mermaid') { - return ; - } - - return ( - - {codeContent} - - ); - }, - pre: ({ children }: any) => <>{children}, - }), [onLinkClick]); // Removed handleLinkClick dependency as it is defined inside component but depends on onLinkClick - - return ( -
- { - if (url.startsWith('code-ref:') || url.startsWith('node-ref:')) return url; - // Default behavior for http/https/etc - return url; - }} - components={markdownComponents} - > - {formattedContent} - - - {/* Tool Call Cards appended at the bottom if provided */} - {toolCalls && toolCalls.length > 0 && ( -
- {toolCalls.map(tc => ( - - ))} -
- )} -
- ); -}; -```` - -## components/MCPToggle.tsx - -```text -/** - * MCP Toggle Component - * - * Toggle for enabling MCP exposure to external AI agents (Cursor, Claude, etc.) - * Shows MCP config for setup and connection status. - */ - -import { useState, useEffect, useCallback, useRef } from 'react'; -import { Copy, Check, X, Sparkles, Zap, ExternalLink } from 'lucide-react'; -import { getMCPClient, type CodebaseContext } from '../core/mcp/mcp-client'; - -type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'error'; - -interface MCPToggleProps { - onSearch?: (query: string, limit?: number) => Promise; - onCypher?: (query: string) => Promise; - onBlastRadius?: (nodeId: string, hops?: number) => Promise; - onHighlight?: (nodeIds: string[], color?: string) => void; - onGrep?: (pattern: string, caseSensitive?: boolean, maxResults?: number) => Promise; - onRead?: (filePath: string, startLine?: number, endLine?: number) => Promise; - showOnboardingTip?: boolean; - getContext?: () => Promise; -} - -const MCP_TIP_DISMISSED_KEY = 'gitnexus-mcp-tip-dismissed'; - -// MCP config that users copy to their AI agent -const MCP_CONFIG = `{ - "mcpServers": { - "gitnexus": { - "command": "npx", - "args": ["-y", "gitnexus-mcp"] - } - } -}`; - -export function MCPToggle({ - onSearch, - onCypher, - onBlastRadius, - onHighlight, - onGrep, - onRead, - showOnboardingTip = false, - getContext, -}: MCPToggleProps = {}) { - const [status, setStatus] = useState('disconnected'); - const [copied, setCopied] = useState(false); - const [showPopup, setShowPopup] = useState(false); - const popupRef = useRef(null); - const [showTip, setShowTip] = useState(false); - - const isConnected = status === 'connected'; - const isConnecting = status === 'connecting'; - - // Show tip when graph becomes ready - useEffect(() => { - if (showOnboardingTip) { - const dismissed = localStorage.getItem(MCP_TIP_DISMISSED_KEY); - if (!dismissed) { - const timer = setTimeout(() => setShowTip(true), 1500); - return () => clearTimeout(timer); - } - } - }, [showOnboardingTip]); - - // Close popup when clicking outside - useEffect(() => { - if (!showPopup) return; - const handleClickOutside = (event: MouseEvent) => { - if (popupRef.current && !popupRef.current.contains(event.target as Node)) { - setShowPopup(false); - } - }; - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, [showPopup]); - - const dismissTip = () => { - setShowTip(false); - localStorage.setItem(MCP_TIP_DISMISSED_KEY, 'true'); - }; - - const connect = useCallback(async () => { - const client = getMCPClient(); - setStatus('connecting'); - setShowTip(false); - - try { - await client.connect(); - - // Register tool handlers - if (onSearch) client.registerHandler('search', async (params) => onSearch(params.query, params.limit)); - if (onCypher) client.registerHandler('cypher', async (params) => onCypher(params.query)); - if (onBlastRadius) client.registerHandler('blastRadius', async (params) => onBlastRadius(params.nodeId, params.hops)); - if (onHighlight) client.registerHandler('highlight', async (params) => { onHighlight(params.nodeIds, params.color); return { highlighted: params.nodeIds.length }; }); - if (onGrep) client.registerHandler('grep', async (params) => onGrep(params.pattern, params.caseSensitive, params.maxResults)); - if (onRead) client.registerHandler('read', async (params) => onRead(params.filePath, params.startLine, params.endLine)); - if (getContext) client.registerHandler('context', async () => getContext()); - - setStatus('connected'); - setShowPopup(false); - localStorage.setItem(MCP_TIP_DISMISSED_KEY, 'true'); - - // Send context after connecting - if (getContext) { - try { - const context = await getContext(); - if (context) client.sendContext(context); - } catch (e) { - console.error('[MCP] Failed to send context:', e); - } - } - } catch { - setStatus('error'); - } - }, [onSearch, onCypher, onBlastRadius, onHighlight, onGrep, onRead, getContext]); - - const disconnect = useCallback(() => { - const client = getMCPClient(); - client.disconnect(); - setStatus('disconnected'); - }, []); - - const toggle = useCallback(() => { - if (isConnected) { - disconnect(); - } else if (!isConnecting) { - connect(); - } - }, [isConnected, isConnecting, connect, disconnect]); - - const copyConfig = () => { - navigator.clipboard.writeText(MCP_CONFIG); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }; - - // Listen for connection changes - useEffect(() => { - const client = getMCPClient(); - const unsubscribe = client.onConnectionChange((connected) => { - setStatus(connected ? 'connected' : 'disconnected'); - if (connected) setShowPopup(false); - }); - return () => { unsubscribe(); }; - }, []); - - return ( -
- {/* MCP Button */} - - - {/* Popup */} - {showPopup && ( -
- {/* Header */} -
-
-
-
- -
-
-

Connect AI Agents

-

Cursor, Claude Code, Antigravity

-
-
- -
-
- - {/* Content */} -
- {/* Step 1: Config */} -
-
- 1 - Add to your AI agent's MCP config -
-
-
-                                    {MCP_CONFIG}
-                                
- -
-
- - {/* Step 2: Connect */} -
-
- 2 - Connect browser to daemon -
- -
- - {/* Status message */} - {status === 'error' && ( -

- Daemon not running. Make sure your AI agent has started gitnexus-mcp. -

- )} - - {/* Help link */} - - Learn more - - -
-
- )} - - {/* Onboarding Tip */} - {showTip && !isConnected && !showPopup && ( -
- -
-
- -
-
-

- Connect your AI tools -

-

- Let Cursor or Claude access GitNexus code intelligence. -

- -
-
-
- )} -
- ); -} -``` - -## components/MermaidDiagram.tsx - -```text -import { useEffect, useRef, useState } from 'react'; -import mermaid from 'mermaid'; -import { AlertTriangle, Maximize2, Minimize2 } from 'lucide-react'; - -// Initialize mermaid with dark theme -mermaid.initialize({ - startOnLoad: false, - theme: 'dark', - themeVariables: { - primaryColor: '#06b6d4', - primaryTextColor: '#e4e4ed', - primaryBorderColor: '#1e1e2a', - lineColor: '#3b3b54', - secondaryColor: '#1e1e2a', - tertiaryColor: '#0a0a10', - background: '#0a0a10', - mainBkg: '#0f0f18', - nodeBorder: '#3b3b54', - clusterBkg: '#1e1e2a', - titleColor: '#e4e4ed', - edgeLabelBackground: '#0f0f18', - nodeTextColor: '#e4e4ed', - }, - flowchart: { - curve: 'basis', - padding: 15, - nodeSpacing: 50, - rankSpacing: 50, - }, - sequence: { - actorMargin: 50, - boxMargin: 10, - boxTextMargin: 5, - noteMargin: 10, - messageMargin: 35, - }, - fontFamily: '"JetBrains Mono", "Fira Code", monospace', - fontSize: 13, - suppressErrorRendering: true, // Prevent default error div appending -}); - -// Override the default error handler to prevent it from logging to UI -mermaid.parseError = (_err) => { - // Silent catch -}; - -interface MermaidDiagramProps { - code: string; -} - -export const MermaidDiagram = ({ code }: MermaidDiagramProps) => { - const containerRef = useRef(null); - const [error, setError] = useState(null); - const [isExpanded, setIsExpanded] = useState(false); - const [svg, setSvg] = useState(''); - - useEffect(() => { - const renderDiagram = async () => { - if (!containerRef.current) return; - - try { - // Generate unique ID for this diagram - const id = `mermaid-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`; - - // Render the diagram - const { svg: renderedSvg } = await mermaid.render(id, code.trim()); - setSvg(renderedSvg); - setError(null); - } catch (err) { - // Silent catch for streaming: - // If render fails (common during partial streaming), we: - // 1. Log to console for debugging - // 2. Do NOT set error state (avoids flashing red box) - // 3. Do NOT clear existing SVG (keeps last valid state visible) - console.debug('Mermaid render skipped (incomplete):', err); - } - }; - - // Debounce rendering to prevent "jerking" during high-speed streaming - const timeoutId = setTimeout(() => { - renderDiagram(); - }, 300); - - return () => clearTimeout(timeoutId); - }, [code]); - - if (error) { - return ( -
-
- - Diagram Error -
-
{error}
-
- - Show source - -
-            {code}
-          
-
-
- ); - } - - return ( -
- {/* Backdrop for expanded view */} - {isExpanded && ( -
setIsExpanded(false)} - /> - )} - -
- {/* Header */} -
- - Diagram - - -
- - {/* Diagram container */} -
-
-
- ); -}; -``` - -## components/QueryFAB.tsx - -```text -import { useState, useRef, useEffect, useCallback } from 'react'; -import { Terminal, Play, X, ChevronDown, ChevronUp, Loader2, Sparkles, Table } from 'lucide-react'; -import { useAppState } from '../hooks/useAppState'; - -const EXAMPLE_QUERIES = [ - { - label: 'All Functions', - query: `MATCH (n:Function) RETURN n.id AS id, n.name AS name, n.filePath AS path LIMIT 50`, - }, - { - label: 'All Classes', - query: `MATCH (n:Class) RETURN n.id AS id, n.name AS name, n.filePath AS path LIMIT 50`, - }, - { - label: 'All Interfaces', - query: `MATCH (n:Interface) RETURN n.id AS id, n.name AS name, n.filePath AS path LIMIT 50`, - }, - { - label: 'Function Calls', - query: `MATCH (a:File)-[r:CodeRelation {type: 'CALLS'}]->(b:Function) RETURN a.id AS id, a.name AS caller, b.name AS callee LIMIT 50`, - }, - { - label: 'Import Dependencies', - query: `MATCH (a:File)-[r:CodeRelation {type: 'IMPORTS'}]->(b:File) RETURN a.id AS id, a.name AS from, b.name AS imports LIMIT 50`, - }, -]; - -export const QueryFAB = () => { - const { setHighlightedNodeIds, setQueryResult, queryResult, clearQueryHighlights, graph, runQuery, isDatabaseReady } = useAppState(); - - const [isExpanded, setIsExpanded] = useState(false); - const [query, setQuery] = useState(''); - const [isRunning, setIsRunning] = useState(false); - const [error, setError] = useState(null); - const [showExamples, setShowExamples] = useState(false); - const [showResults, setShowResults] = useState(true); - - const textareaRef = useRef(null); - const panelRef = useRef(null); - - useEffect(() => { - if (isExpanded && textareaRef.current) { - textareaRef.current.focus(); - } - }, [isExpanded]); - - useEffect(() => { - const handleClickOutside = (e: MouseEvent) => { - if (panelRef.current && !panelRef.current.contains(e.target as Node)) { - setShowExamples(false); - } - }; - document.addEventListener('mousedown', handleClickOutside); - return () => document.removeEventListener('mousedown', handleClickOutside); - }, []); - - useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Escape' && isExpanded) { - setIsExpanded(false); - setShowExamples(false); - } - }; - document.addEventListener('keydown', handleKeyDown); - return () => document.removeEventListener('keydown', handleKeyDown); - }, [isExpanded]); - - const handleRunQuery = useCallback(async () => { - if (!query.trim() || isRunning) return; - - if (!graph) { - setError('No project loaded. Load a project first.'); - return; - } - - const ready = await isDatabaseReady(); - if (!ready) { - setError('Database not ready. Please wait for loading to complete.'); - return; - } - - setIsRunning(true); - setError(null); - - const startTime = performance.now(); - - try { - const rows = await runQuery(query); - const executionTime = performance.now() - startTime; - - // Extract node IDs from results - handles various formats - // 1. Array format: first element if it looks like a node ID - // 2. Object format: any field ending with 'id' (case-insensitive) - // 3. Values matching node ID pattern: Label:path:name - const nodeIdPattern = /^(File|Function|Class|Method|Interface|Folder|CodeElement):/; - - const nodeIds = rows - .flatMap(row => { - const ids: string[] = []; - - if (Array.isArray(row)) { - // Array format - check all elements for node ID patterns - row.forEach(val => { - if (typeof val === 'string' && (nodeIdPattern.test(val) || val.includes(':'))) { - ids.push(val); - } - }); - } else if (typeof row === 'object' && row !== null) { - // Object format - check fields ending with 'id' and values matching patterns - Object.entries(row).forEach(([key, val]) => { - const keyLower = key.toLowerCase(); - if (typeof val === 'string') { - // Field name contains 'id' - if (keyLower.includes('id') || keyLower === 'id') { - ids.push(val); - } - // Value matches node ID pattern - else if (nodeIdPattern.test(val)) { - ids.push(val); - } - } - }); - } - - return ids; - }) - .filter(Boolean) - .filter((id, index, arr) => arr.indexOf(id) === index); - - setQueryResult({ rows, nodeIds, executionTime }); - setHighlightedNodeIds(new Set(nodeIds)); - } catch (err) { - setError(err instanceof Error ? err.message : 'Query execution failed'); - setQueryResult(null); - setHighlightedNodeIds(new Set()); - } finally { - setIsRunning(false); - } - }, [query, isRunning, graph, isDatabaseReady, runQuery, setHighlightedNodeIds, setQueryResult]); - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && (e.ctrlKey || e.metaKey)) { - e.preventDefault(); - handleRunQuery(); - } - }; - - const handleSelectExample = (exampleQuery: string) => { - setQuery(exampleQuery); - setShowExamples(false); - textareaRef.current?.focus(); - }; - - const handleClose = () => { - setIsExpanded(false); - setShowExamples(false); - clearQueryHighlights(); - setError(null); - }; - - const handleClear = () => { - setQuery(''); - clearQueryHighlights(); - setError(null); - textareaRef.current?.focus(); - }; - - if (!isExpanded) { - return ( - - ); - } - - return ( -
-
-
-
- -
- Cypher Query -
- -
- -
-
-