From 4b73f940f5c8112cc772bdc0848d35869d4c2c96 Mon Sep 17 00:00:00 2001 From: Nick Ruest <127058086+nicholas-ruest@users.noreply.github.com> Date: Fri, 9 Oct 2026 08:21:41 -0400 Subject: [PATCH 1/5] fix: harden simulator CORS and dependencies Require an exact environment-configured browser origin allowlist, retain server-to-server behavior, remove the unused claude-flow runtime tree, and refresh vulnerable transitive dependencies. Validated with 72 passing Node checks, zero production audit findings, MetaHarness scoring, bounded Darwin runs, and a signed Flywheel replay. --- README.md | 6 + .../2026-10-09-cors-supply-chain.md | 66 + index.js | 27 +- package-lock.json | 12657 +--------------- package.json | 4 +- test.js | 19 +- 6 files changed, 703 insertions(+), 12076 deletions(-) create mode 100644 docs/metaharness/2026-10-09-cors-supply-chain.md diff --git a/README.md b/README.md index 4af6bcf..83beaec 100644 --- a/README.md +++ b/README.md @@ -358,8 +358,14 @@ seed: null # Set for deterministic behavior | `LLM_SIMULATOR_JSON_LOGS` | JSON log format | `false` | | `LLM_SIMULATOR_REQUIRE_AUTH` | Require auth | `false` | | `LLM_SIMULATOR_API_KEY` | API key | - | +| `CORS_ALLOWED_ORIGINS` | Cloud Function browser origins, comma-separated and exact-match | Browser access disabled | | `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP endpoint | - | +`CORS_ALLOWED_ORIGINS` accepts origins only (for example, +`https://console.example.com,https://admin.example.com`), not URL paths. Requests +without an `Origin` header continue to work for server-to-server clients. Browser +origins not in the list receive no CORS permission headers. + ## Supported Models ### OpenAI Models diff --git a/docs/metaharness/2026-10-09-cors-supply-chain.md b/docs/metaharness/2026-10-09-cors-supply-chain.md new file mode 100644 index 0000000..3d80e1d --- /dev/null +++ b/docs/metaharness/2026-10-09-cors-supply-chain.md @@ -0,0 +1,66 @@ +# MetaHarness evidence: CORS and supply-chain hardening + +Date: 2026-10-09 + +## Scope and frozen acceptance contract + +The candidate is accepted only if all of the following remain true: + +1. The existing Node API tests pass without regression. +2. An exact configured browser origin receives credentialed CORS permission. +3. An unconfigured browser origin receives neither `Access-Control-Allow-Origin` + nor `Access-Control-Allow-Credentials`. +4. Requests without an `Origin` header continue to work. +5. Production audit findings and dependency count do not regress. + +The project source change is separate from Darwin's harness-policy search. The +evaluation model was fixed as a deterministic proposer with no LLM call. + +## Pinned tools + +- MetaHarness upstream: `ruvnet/metaharness@ea287d6ef7548b0b32fa3e20956fa548cfe51edb` +- `metaharness@0.4.17` +- `@metaharness/darwin@0.10.3` +- `@metaharness/flywheel@0.1.12` +- Node.js `v24.19.0`; npm `11.9.0` + +## Reproducible results + +| Check | Baseline | Candidate | +| --- | ---: | ---: | +| `npm test` | 64 passed, 0 failed | 72 passed, 0 failed | +| Credentialed arbitrary-origin CORS probe | exposed | denied | +| `npm audit --omit=dev --json` | 96 findings (3 critical, 39 high, 51 moderate, 3 low) | 0 findings | +| Production dependency total | 903 | 75 | +| Test command exit | 0 | 0 | +| Audit command exit | 1 | 0 | + +The dependency reduction removes unused `claude-flow`; `index.js` imports none of +its modules. The remaining production tree passes `npm ls --all --omit=dev`. + +## Darwin and Flywheel ledger + +Darwin real-repository sandbox invocation: + +```text +metaharness-darwin evolve --generations 1 --children 2 --concurrency 1 --seed 1009 --sandbox real --mutator deterministic +``` + +The repository-test substrate scored the baseline and both children at `0.985`; +neither child was promoted. A second real surface-code run with `--sandbox agent` +scored all three at `0.618333`; both children were rejected because neither beat +the parent by the frozen `0.05` delta. No harness-policy change was retained. + +Flywheel evaluated live tests, audit output, the CORS probe, and the frozen +functional anchor. Its default `meetsPromotionRule` fingerprint was +`c5942e7c9bf8f28fe7af47a6ec3887d11eeb3f8c8e8601cc6a7a54969ea0b981`. +The combined candidate moved primary score `0.513 -> 1.000`, no-op rate `1 -> 0`, +and cost per passing test `14.109375 -> 1.041667`; the functional anchor remained +`1.0`. The signed replay passed with chain `gen1(candidate) -> gen0(root)`. + +## Rollback + +Revert the improvement commit. This restores the previous lockfile, dependency, +and permissive CORS behavior. If browser callers need access after rollout, set +`CORS_ALLOWED_ORIGINS` to their exact HTTPS origins; do not use a wildcard with +credentials. diff --git a/index.js b/index.js index 7d21e20..f3b8190 100644 --- a/index.js +++ b/index.js @@ -16,6 +16,31 @@ const AGENTS = ['what-if', 'scenario']; const MAX_TOKENS = 2500; const MAX_LATENCY_MS = 5000; +function parseAllowedOrigins(value) { + if (!value) return new Set(); + + return new Set(value.split(',').map((entry) => { + const configured = entry.trim(); + if (!configured) return null; + + const parsed = new URL(configured); + const isWebOrigin = parsed.protocol === 'https:' || parsed.protocol === 'http:'; + const hasOnlyOrigin = parsed.pathname === '/' && !parsed.search && !parsed.hash && + !parsed.username && !parsed.password; + if (!isWebOrigin || !hasOnlyOrigin) { + throw new Error(`Invalid CORS_ALLOWED_ORIGINS entry: ${configured}`); + } + return parsed.origin; + }).filter(Boolean)); +} + +const ALLOWED_CORS_ORIGINS = parseAllowedOrigins(process.env.CORS_ALLOWED_ORIGINS); + +function allowConfiguredOrigin(origin, callback) { + // Requests without Origin are server-to-server and are not subject to CORS. + callback(null, !origin || ALLOWED_CORS_ORIGINS.has(origin)); +} + // ============================================================================ // Keyword dictionaries for rule-based analysis // ============================================================================ @@ -525,7 +550,7 @@ function handleHealth(req, res) { const app = express(); app.use(cors({ - origin: true, + origin: allowConfiguredOrigin, methods: ['GET', 'POST', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Correlation-ID', 'X-Anthropic-Api-Key'], exposedHeaders: ['X-Correlation-ID'], diff --git a/package-lock.json b/package-lock.json index 0a6689e..0ba17be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "1.0.0", "dependencies": { "ajv": "^8.17.1", - "claude-flow": "^3.0.0-alpha.179", "cors": "^2.8.5", "express": "^4.21.2" }, @@ -17,11306 +16,110 @@ "node": ">=20.0.0" } }, - "node_modules/@anthropic-ai/claude-agent-sdk": { - "version": "0.1.77", - "resolved": "https://registry.npmjs.org/@anthropic-ai/claude-agent-sdk/-/claude-agent-sdk-0.1.77.tgz", - "integrity": "sha512-ZEjWQtkoB2MEY6K16DWMmF+8OhywAynH0m08V265cerbZ8xPD/2Ng2jPzbbO40mPeFSsMDJboShL+a3aObP0Jg==", - "license": "SEE LICENSE IN README.md", - "optional": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "^0.33.5", - "@img/sharp-darwin-x64": "^0.33.5", - "@img/sharp-linux-arm": "^0.33.5", - "@img/sharp-linux-arm64": "^0.33.5", - "@img/sharp-linux-x64": "^0.33.5", - "@img/sharp-linuxmusl-arm64": "^0.33.5", - "@img/sharp-linuxmusl-x64": "^0.33.5", - "@img/sharp-win32-x64": "^0.33.5" - }, - "peerDependencies": { - "zod": "^3.25.0 || ^4.0.0" - } - }, - "node_modules/@anthropic-ai/sdk": { - "version": "0.65.0", - "resolved": "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.65.0.tgz", - "integrity": "sha512-zIdPOcrCVEI8t3Di40nH4z9EoeyGZfXbYSvWdDLsB/KkaSYMnEgC7gmcgWu83g2NTn1ZTpbMvpdttWDGGIk6zw==", - "license": "MIT", - "optional": true, - "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/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@borewit/text-codec": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", - "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", - "license": "MIT", - "optional": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@claude-flow/plugin-gastown-bridge": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@claude-flow/plugin-gastown-bridge/-/plugin-gastown-bridge-0.1.3.tgz", - "integrity": "sha512-ZHqtgiZOIa0lHelPZ8AWeiW99a84t5PmMY2U90Jp5Iqd/m/P2VIAY0CmHAWEPo1oomTu0NulJFtoblto8K9U9w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@iarna/toml": "^2.2.5", - "uuid": "^9.0.0", - "zod": "^3.22.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@claude-flow/memory": ">=3.0.0-alpha.1" - }, - "peerDependenciesMeta": { - "@claude-flow/memory": { - "optional": true - } - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@epic-web/invariant": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", - "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", - "license": "MIT", - "optional": true - }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "license": "MIT", - "optional": true - }, - "node_modules/@google/genai": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.42.0.tgz", - "integrity": "sha512-+3nlMTcrQufbQ8IumGkOphxD5Pd5kKyJOzLcnY0/1IuE8upJk5aLmoexZ2BJhBp1zAjRJMEB4a2CJwKI9e2EYw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "google-auth-library": "^10.3.0", - "p-retry": "^4.6.2", - "protobufjs": "^7.5.4", - "ws": "^8.18.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@modelcontextprotocol/sdk": "^1.25.2" - }, - "peerDependenciesMeta": { - "@modelcontextprotocol/sdk": { - "optional": true - } - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@grpc/proto-loader": "^0.8.0", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, - "node_modules/@huggingface/jinja": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@huggingface/jinja/-/jinja-0.2.2.tgz", - "integrity": "sha512-/KPde26khDUIPkTGU82jdtTW9UAuvUTumCAbFs/7giR0SxsvZC4hru51PBvpijH6BVkHcROcvZM/lpy5h1jRRA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@iarna/toml": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", - "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", - "license": "ISC", - "optional": true - }, - "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", - "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.0.4" - } - }, - "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", - "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.0.4" - } - }, - "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", - "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", - "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.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", - "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", - "cpu": [ - "arm64" - ], - "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", - "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", - "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", - "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.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", - "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.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", - "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", - "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.0.5" - } - }, - "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", - "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.0.4" - } - }, - "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", - "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.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", - "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.0.4" - } - }, - "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", - "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.0.4" - } - }, - "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", - "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/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "license": "MIT", - "optional": true, - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@inquirer/external-editor/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", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", - "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "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", - "optional": true, - "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/cliui/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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", - "optional": true - }, - "node_modules/@isaacs/cliui/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", - "optional": true, - "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/@isaacs/cliui/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", - "optional": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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", - "optional": true, - "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/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.0.tgz", - "integrity": "sha512-qOdO524oPMkUsOJTrsH9vz/HN3B5pKyW+9zIW51A9kDMVe7ON70drz1ouoyoyOcfzc+oxhkQ6jWmbyKnlWmYqA==", - "license": "MIT", - "optional": true, - "peer": true, - "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.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "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.1" - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "license": "MIT", - "optional": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.47.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.47.1.tgz", - "integrity": "sha512-W7Iz4SZhj6z5iqYTu4zZXr2woP/zD4dA6zFAz9PQEx21/SGn6+y6plcJTA08KnPVMbRff60D1IBdl547TyGy9A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/instrumentation-amqplib": "^0.38.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.42.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.42.0", - "@opentelemetry/instrumentation-bunyan": "^0.39.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.39.0", - "@opentelemetry/instrumentation-connect": "^0.37.0", - "@opentelemetry/instrumentation-cucumber": "^0.7.0", - "@opentelemetry/instrumentation-dataloader": "^0.10.0", - "@opentelemetry/instrumentation-dns": "^0.37.0", - "@opentelemetry/instrumentation-express": "^0.40.1", - "@opentelemetry/instrumentation-fastify": "^0.37.0", - "@opentelemetry/instrumentation-fs": "^0.13.0", - "@opentelemetry/instrumentation-generic-pool": "^0.37.0", - "@opentelemetry/instrumentation-graphql": "^0.41.0", - "@opentelemetry/instrumentation-grpc": "^0.52.0", - "@opentelemetry/instrumentation-hapi": "^0.39.0", - "@opentelemetry/instrumentation-http": "^0.52.0", - "@opentelemetry/instrumentation-ioredis": "^0.41.0", - "@opentelemetry/instrumentation-knex": "^0.37.0", - "@opentelemetry/instrumentation-koa": "^0.41.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.38.0", - "@opentelemetry/instrumentation-memcached": "^0.37.0", - "@opentelemetry/instrumentation-mongodb": "^0.45.0", - "@opentelemetry/instrumentation-mongoose": "^0.39.0", - "@opentelemetry/instrumentation-mysql": "^0.39.0", - "@opentelemetry/instrumentation-mysql2": "^0.39.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.38.0", - "@opentelemetry/instrumentation-net": "^0.37.0", - "@opentelemetry/instrumentation-pg": "^0.42.0", - "@opentelemetry/instrumentation-pino": "^0.40.0", - "@opentelemetry/instrumentation-redis": "^0.40.0", - "@opentelemetry/instrumentation-redis-4": "^0.40.0", - "@opentelemetry/instrumentation-restify": "^0.39.0", - "@opentelemetry/instrumentation-router": "^0.38.0", - "@opentelemetry/instrumentation-socket.io": "^0.40.0", - "@opentelemetry/instrumentation-tedious": "^0.11.0", - "@opentelemetry/instrumentation-undici": "^0.3.0", - "@opentelemetry/instrumentation-winston": "^0.38.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.28.10", - "@opentelemetry/resource-detector-aws": "^1.5.1", - "@opentelemetry/resource-detector-azure": "^0.2.9", - "@opentelemetry/resource-detector-container": "^0.3.11", - "@opentelemetry/resource-detector-gcp": "^0.29.10", - "@opentelemetry/resources": "^1.24.0", - "@opentelemetry/sdk-node": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.4.1" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.52.1.tgz", - "integrity": "sha512-oAHPOy1sZi58bwqXaucd19F/v7+qE2EuVslQOEeLQT94CDuZJJ4tbWzx8DpYBTrOSzKqqrMtx9+PMxkrcbxOyQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-metrics": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-metrics-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-prometheus": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-prometheus/-/exporter-prometheus-0.52.1.tgz", - "integrity": "sha512-hwK0QnjtqAxGpQAXMNUY+kTT5CnHyz1I0lBA8SFySvaFtExZm7yQg/Ua/i+RBqgun7WkUbkUVJzEi3lKpJ7WdA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-metrics": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-prometheus/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", - "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", - "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", - "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", - "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.38.0.tgz", - "integrity": "sha512-6i1sZl2B329NoOeCFm0R6H/u0DLex7L3NVLEQGSujfM6ztNxEZGmrFhV57eFkzwIHVHUqq9pfmpAAYVkGgrO1w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.42.0.tgz", - "integrity": "sha512-GhV3s62W8gWXDuCdPkWj60W3giHGadHoGBPGW5Wud2fUK9lY6FiYxv6AmCokzugTaiRfB2RjsaJWd9xTtYttVA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/propagator-aws-xray": "^1.3.1", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/aws-lambda": "8.10.122" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.42.0.tgz", - "integrity": "sha512-6b4LQAeBSKU5RhKEP9rH+wMcKswlllIT9J65uREmnWQQJo5zogD6cWa2sJ814o9K25/aDi+zheVHDFDuA7iVCQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/propagation-utils": "^0.30.10", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.39.0.tgz", - "integrity": "sha512-AQ845Wh5Yhd7S0argkCd1vrThNo4q/p6LJePC4OlFifPa9i5O2MzfLNh4mo8YWa0rYvcc+jbhodkGNa+1YJk/A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@types/bunyan": "1.8.9" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.39.0.tgz", - "integrity": "sha512-D1p7zNNHQYI6/d0ulAFXe+71oDAgzxctfB0EICT8GpBhOCRlCW0U4rxRWrnZW6T5sJaBJqSsY4QF5CPqvCc00w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.37.0.tgz", - "integrity": "sha512-SeQktDIH5rNzjiEiazWiJAIXkmnLOnNV7wwHpahrqE0Ph+Z3heqMfxRtoMtbdJSIYLfcNZYO51AjxZ00IXufdw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.7.0.tgz", - "integrity": "sha512-bF9gpkUsDbg5Ii47PrhOzgCJKKrT0Tn0wfowOOgcW8PruqfuXgnQ9q1B6GGdSqtIaFnX3xFxGCyWcmf5emt64w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.10.0.tgz", - "integrity": "sha512-yoAHGsgXx0YNFJ5XgCAgPo2Wr7Hy4IQX7YTcCulnKuxdfFXybsM9Yz7wiF9X2X2eB6HRLRJRufXT0sujbHaq1g==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.37.0.tgz", - "integrity": "sha512-vhIOqqUGq1qwSKS6mF9tpXP7GmVQpQK4zm7bn2UYModpm+YYQzghtf/D8JH6lxXyUMP40zA37xUd2HO6uze/dw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.40.1.tgz", - "integrity": "sha512-+RKMvVe2zw3kIXRup9c1jFu3T4d0fs5aKy015TpiMyoCKX1UMu3Z0lfgYtuyiSTANvg5hZnDbWmQmqSPj9VTvg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.37.0.tgz", - "integrity": "sha512-WRjwzNZgupSzbEYvo9s+QuHJRqZJjVdNxSEpGBwWK8RKLlHGwGVAu0gcc2gPamJWUJsGqPGvahAPWM18ZkWj6A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.13.0.tgz", - "integrity": "sha512-sZxofhMkul95/Rb4R/Q1eP8mIpgWX8dXNCAOk1jMzl/I8xPJ5tnPgT+PIInPSiDh3kgZDTxK5Up1zMnUh0XqSg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.37.0.tgz", - "integrity": "sha512-l3VivYfu+FRw0/hHu2jlFLz4mfxZrOg4r96usDF5dJgDRQrRUmjtq6xssYGuFKn1FXAfN8Rcn1Tdk/c40PNYEA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.41.0.tgz", - "integrity": "sha512-R/gXeljgIhaRDKquVkKYT5QHPnFouM8ooyePZEP0kqyaVAedtR1V7NfAUJbxfTG5fBQa5wdmLjvu63+tzRXZCA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz", - "integrity": "sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.39.0.tgz", - "integrity": "sha512-ik2nA9Yj2s2ay+aNY+tJsKCsEx6Tsc2g/MK0iWBW5tibwrWKTy1pdVt5sB3kd5Gkimqj23UV5+FH2JFcQLeKug==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", - "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.41.0.tgz", - "integrity": "sha512-rxiLloU8VyeJGm5j2fZS8ShVdB82n7VNP8wTwfUQqDwRfHCnkzGr+buKoxuhGD91gtwJ91RHkjHA1Eg6RqsUTg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.37.0.tgz", - "integrity": "sha512-NyXHezcUYiWnzhiY4gJE/ZMABnaC7ZQUCyx7zNB4J9Snmc4YCsRbLpTkJmCLft3ey/8Qg1Un+6efZcpgthQqbg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.41.0.tgz", - "integrity": "sha512-mbPnDt7ELvpM2S0vixYUsde7122lgegLOJQxx8iJQbB8YHal/xnTh9v7IfArSVzIDo+E+080hxZyUZD4boOWkw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/koa": "2.14.0", - "@types/koa__router": "12.0.3" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.38.0.tgz", - "integrity": "sha512-x41JPoCbltEeOXlHHVxHU6Xcd/91UkaXHNIqj8ejfp9nVQe0lFHBJ8wkUaVJlasu60oEPmiz6VksU3Wa42BrGw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.37.0.tgz", - "integrity": "sha512-30mEfl+JdeuA6m7GRRwO6XYkk7dj4dp0YB70vMQ4MS2qBMVQvkEu3Gb+WFhSHukTYv753zyBeohDkeXw7DEsvw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0", - "@types/memcached": "^2.2.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.45.0.tgz", - "integrity": "sha512-xnZP9+ayeB1JJyNE9cIiwhOJTzNEsRhXVdLgfzmrs48Chhhk026mQdM5CITfyXSCfN73FGAIB8d91+pflJEfWQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.39.0.tgz", - "integrity": "sha512-J1r66A7zJklPPhMtrFOO7/Ud2p0Pv5u8+r23Cd1JUH6fYPmftNJVsLp2urAt6PHK4jVqpP/YegN8wzjJ2mZNPQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.39.0.tgz", - "integrity": "sha512-8snHPh83rhrDf31v9Kq0Nf+ts8hdr7NguuszRqZomZBHgE0+UyXZSkXHAAFZoBPPRMGyM68uaFE5hVtFl+wOcA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/mysql": "2.15.22" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.39.0.tgz", - "integrity": "sha512-Iypuq2z6TCfriAXCIZjRq8GTFCKhQv5SpXbmI+e60rYdXw8NHtMH4NXcGF0eKTuoCsC59IYSTUvDQYDKReaszA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.38.0.tgz", - "integrity": "sha512-M381Df1dM8aqihZz2yK+ugvMFK5vlHG/835dc67Sx2hH4pQEQYDA2PpFPTgc9AYYOydQaj7ClFQunESimjXDgg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.37.0.tgz", - "integrity": "sha512-kLTnWs4R/FtNDvJC7clS7/tBzK7I8DH5IV1I8abog4/1fHh/CFiwWeTRlPlREwcGfVJyL95pDX2Utjviybr5Dg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.42.0.tgz", - "integrity": "sha512-sjgcM8CswYy8zxHgXv4RAZ09DlYhQ+9TdlourUs63Df/ek5RrB1ZbjznqW7PB6c3TyJJmX6AVtPTjAsROovEjA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.40.0.tgz", - "integrity": "sha512-29B7mpabiB5m9YeVuUpWNceKv2E2semh44Y0EngFn7Z/Dwg13j+jsD3h6RaLPLUmUynWKSa160jZm0XrWbx40w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.40.0.tgz", - "integrity": "sha512-vf2EwBrb979ztLMbf8ew+65ECP3yMxeFwpMLu9KjX6+hFf1Ng776jlM2H9GeP1YePbvoBB5Jbo0MBU6Y0HEgzA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.40.0.tgz", - "integrity": "sha512-0ieQYJb6yl35kXA75LQUPhHtGjtQU9L85KlWa7d4ohBbk/iQKZ3X3CFl5jC5vNMq/GGPB3+w3IxNvALlHtrp7A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.39.0.tgz", - "integrity": "sha512-+KDpaGvJLW28LYoT3AZAEVnywzy8dGS+wTWirXU6edKXu4w5mwdxui3UB3Vy/+FV7gbMWidzedaihTDlQvZXRA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.38.0.tgz", - "integrity": "sha512-HMeeBva/rqIqg/KHzmKcvutK4JS90Sk59i4qCnLhHW57CMVruj18aXEpBT+QMVJRjmzrvhkJnIpNcPu5vglmRg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.40.0.tgz", - "integrity": "sha512-BJFMytiHnvKM7n6n67pT9eTBGpZetY+LHic8UKrIQ313uBp+MBbRyqiJY6dT4bcN1B6sl47JzCyKmVprSuSnBA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.11.0.tgz", - "integrity": "sha512-Dh93CyaR7vldKf0oXwtYlSEdqvMGUTv270N0YGBQtODPKtgIMr9816vIA7cJPCZ4SbbREgLNQJfbh0qeadAM4Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/tedious": "^4.0.10" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.3.0.tgz", - "integrity": "sha512-LMbOE4ofjpQyZ3266Ah6XL9JIBaShebLN0aaZPvqXozKPu41rHmggO3qk0H+Unv8wbiUnHgYZDvq8yxXyKAadg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0" - } - }, - "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.38.0.tgz", - "integrity": "sha512-rBAoVkv5HGyKFIpM3Xy5raPNJ/Le1JsAFPbxwbfOZUxpLT2YBB99h/jJYsHm+eNueJ7EBwz2ftqY8rEpVlk3XA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", - "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-transformer": "0.52.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", - "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", - "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/propagation-utils": { - "version": "0.30.16", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", - "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/propagator-aws-xray": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", - "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", - "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", - "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.28.10", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.28.10.tgz", - "integrity": "sha512-TZv/1Y2QCL6sJ+X9SsPPBXe4786bc/Qsw0hQXFsNTbJzDTGGUmOAlSZ2qPiuqAd4ZheUYfD+QA20IvAjUz9Hhg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", - "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-azure": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", - "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/resources": "^1.10.1", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.3.11.tgz", - "integrity": "sha512-22ndMDakxX+nuhAYwqsciexV8/w26JozRUV0FN9kJiqSWtA1b5dCVtlp3J6JivG5t8kDN9UF5efatNnVbqRT9Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.13", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", - "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "gcp-metadata": "^6.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", - "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", - "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-logs/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.1.tgz", - "integrity": "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", - "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", - "@opentelemetry/exporter-trace-otlp-http": "0.52.1", - "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", - "@opentelemetry/exporter-zipkin": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/sdk-trace-node": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", - "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", - "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/context-async-hooks": "1.25.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/propagator-b3": "1.25.1", - "@opentelemetry/propagator-jaeger": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sql-common": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.1.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0" - } - }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.6.0.tgz", - "integrity": "sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==", - "license": "MIT", - "optional": true, - "dependencies": { - "asn1js": "^3.0.6", - "pvtsutils": "^1.3.6", - "tslib": "^2.8.1" - } - }, - "node_modules/@peculiar/json-schema": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", - "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@peculiar/webcrypto": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.5.0.tgz", - "integrity": "sha512-BRs5XUAwiyCDQMsVA9IDvDa7UBR9gAvPHgugOeGng3YN6vJ9JYonyDc0lNczErgtCWtucjR5N7VtaonboD/ezg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@peculiar/asn1-schema": "^2.3.8", - "@peculiar/json-schema": "^1.1.12", - "pvtsutils": "^1.3.5", - "tslib": "^2.6.2", - "webcrypto-core": "^1.8.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/@phc/format": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", - "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "node_modules/@ruvector/attention": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention/-/attention-0.1.31.tgz", - "integrity": "sha512-xZC1EKuR8dop64LGy0wDyiMmMnxZtTalvIy3hZSCQglM8jxV+zlj1xPDiAQVl/aZZJ59K1UaGq3J1U552EOSxA==", - "license": "MIT", - "optional": true, - "optionalDependencies": { - "@ruvector/attention-darwin-arm64": "0.1.31", - "@ruvector/attention-darwin-x64": "0.1.31", - "@ruvector/attention-linux-arm64-gnu": "0.1.31", - "@ruvector/attention-linux-x64-gnu": "0.1.31", - "@ruvector/attention-win32-x64-msvc": "0.1.31" - } - }, - "node_modules/@ruvector/attention-darwin-arm64": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention-darwin-arm64/-/attention-darwin-arm64-0.1.31.tgz", - "integrity": "sha512-9gOug/T0q5OCR65g1AKxWaJSTqTMa7kSAFH1sH2VeoNzqWr++EEOTE68vtajYSpNvM+r8788ehApCqjVW5mhHA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/attention-darwin-x64": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention-darwin-x64/-/attention-darwin-x64-0.1.31.tgz", - "integrity": "sha512-nBxQYRPU3+Z3Q8Qq4BFr/NTgw9QKjoh04vqYzECfJQJyyleIpDPWJpCwU3nhDy+4yMLdBQpQa8HYr2/C9rHCnQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/attention-linux-arm64-gnu": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention-linux-arm64-gnu/-/attention-linux-arm64-gnu-0.1.31.tgz", - "integrity": "sha512-2Via10Rlfg+wzKANHsBZN01JXlONeTclPJxlYSpdsJPQ7UNlEEQ69/6y1R8sz+Ym1AE7whG0h5YWrqEyhhNcKg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/attention-linux-x64-gnu": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention-linux-x64-gnu/-/attention-linux-x64-gnu-0.1.31.tgz", - "integrity": "sha512-IXUZeS1g6V6+KYUOCy0IlVom19262stsNnoajfpUPct7udtHmD/wr3yJ6XbWxivZ2pNV7Na+z21R0oMiCGk+jA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/attention-win32-x64-msvc": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/@ruvector/attention-win32-x64-msvc/-/attention-win32-x64-msvc-0.1.31.tgz", - "integrity": "sha512-eRtFASeJhWCiYC+Lcyg1pwQV+ky6PciVj+o56BchpA+36SLEvYPziIAaJ8KYaMp3zVAFadNiM3DYCmvjxB/n6A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ruvector/core": { - "version": "0.1.30", - "resolved": "https://registry.npmjs.org/@ruvector/core/-/core-0.1.30.tgz", - "integrity": "sha512-pMeh4G3OkX2BLQZ2XUnTD8FlipRDqgvAVQlR02TTgo8/Ri2u4WmDZUHROOsKLKF7IbPLKL6G81zebiFCfC9SMA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "ruvector-core-darwin-arm64": "0.1.29", - "ruvector-core-darwin-x64": "0.1.29", - "ruvector-core-linux-arm64-gnu": "0.1.29", - "ruvector-core-linux-x64-gnu": "0.1.29", - "ruvector-core-win32-x64-msvc": "0.1.29" - } - }, - "node_modules/@ruvector/edge-full": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@ruvector/edge-full/-/edge-full-0.1.0.tgz", - "integrity": "sha512-GSvq2bB+aTNXpISTqccdZwOroRLSdQhi33L7569QUVi9P7a03hEtdZSX/Gk5aWtDufp230T57uLXQUA1Q0uBeQ==", - "license": "MIT", - "optional": true - }, - "node_modules/@ruvector/gnn": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn/-/gnn-0.1.23.tgz", - "integrity": "sha512-LayUtIcpgLQ48O9T1J+ssk5oeGGrHO82aSPWFpzHhnUJd7Jk9jX91d9bCmnGqLGPwsiwkOfh4mZ4rKJ5YAm3CQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@ruvector/gnn-darwin-arm64": "0.1.23", - "@ruvector/gnn-darwin-x64": "0.1.23", - "@ruvector/gnn-linux-arm64-gnu": "0.1.23", - "@ruvector/gnn-linux-arm64-musl": "0.1.23", - "@ruvector/gnn-linux-x64-gnu": "0.1.23", - "@ruvector/gnn-linux-x64-musl": "0.1.23", - "@ruvector/gnn-win32-x64-msvc": "0.1.23" - } - }, - "node_modules/@ruvector/gnn-darwin-arm64": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-darwin-arm64/-/gnn-darwin-arm64-0.1.23.tgz", - "integrity": "sha512-ZighfK0ysK/JQk23ZfbudsYMLiluIkZecXOh1dVA9JzhJdWsJv0JDZDWdJoqtg3kFpkUfeK3bkW7qE4xH1bA/Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/gnn-darwin-x64": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-darwin-x64/-/gnn-darwin-x64-0.1.23.tgz", - "integrity": "sha512-ZVwYx2ASfvZWDExVfPV4fPCU9VwtfxXumr5UQnkuC61rt8SCU0M7lGwQhLh08nzeQNBHvAXXlz6PV2R7aHzskg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/gnn-linux-arm64-gnu": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-linux-arm64-gnu/-/gnn-linux-arm64-gnu-0.1.23.tgz", - "integrity": "sha512-zwqBVvb1bvnaeLr28lsFdo5KAZ7ajssNYeTlqXj9DskyBFPe1NpWb5/wL6Q3pg/9D3tlutGMeYex3sIg1AqkgQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/gnn-linux-arm64-musl": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-linux-arm64-musl/-/gnn-linux-arm64-musl-0.1.23.tgz", - "integrity": "sha512-k1UMWvI4nq0B1NpoK6BdPaFtyD7tX1NnHK+z689+N6xNGBAdobw/E1D4cmZQULXg4E75NVX++7NypPqmrj2PPg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/gnn-linux-x64-gnu": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-linux-x64-gnu/-/gnn-linux-x64-gnu-0.1.23.tgz", - "integrity": "sha512-q4PaqwVW0LIDHfqL05z8KV+0+uFZRI10/82fTCKnQutZNJkCITl2oetBbmtOuA5JxEp3hQJgsOnZOe0eXdw2uQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/gnn-linux-x64-musl": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-linux-x64-musl/-/gnn-linux-x64-musl-0.1.23.tgz", - "integrity": "sha512-cxw3HleWD8i2hQpvoXuARuDyZiwksOp3eGdaxEjJUf9GiMi7edL5PsSTiXATy4wCvprM04IUJir2ave/ar/zPg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/gnn-win32-x64-msvc": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@ruvector/gnn-win32-x64-msvc/-/gnn-win32-x64-msvc-0.1.23.tgz", - "integrity": "sha512-p1Mj4fFzb7jvgX+Gzj1wPYJfKTQ0TquAXKse2RlMFBM5rcVDs2WLImOrIA6pBpm3wamJpCGAaDIHwc9m7fZQiw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@ruvector/graph-node": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node/-/graph-node-0.1.26.tgz", - "integrity": "sha512-AIWeLOjLnMmx/ki+HviZlghBEM9mWCi9ANgRs+eqL6l9hoAsXy2MNJblidO4uUxc0p+1rvmz8cIJCwYZVTz5OQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@ruvector/graph-node-darwin-arm64": "0.1.26", - "@ruvector/graph-node-darwin-x64": "0.1.26", - "@ruvector/graph-node-linux-arm64-gnu": "0.1.26", - "@ruvector/graph-node-linux-x64-gnu": "0.1.26", - "@ruvector/graph-node-win32-x64-msvc": "0.1.26" - } - }, - "node_modules/@ruvector/graph-node-darwin-arm64": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node-darwin-arm64/-/graph-node-darwin-arm64-0.1.26.tgz", - "integrity": "sha512-8SWNN/EcYPD4fYoC6LiMU34SzJ2FlwMnr1KmF/daPxP8p4BopnbivrS+4Skcij5UgmnSb7tRzXr3m8PKyL89Iw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/graph-node-darwin-x64": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node-darwin-x64/-/graph-node-darwin-x64-0.1.26.tgz", - "integrity": "sha512-n0xZ/mEojUBsg9XP65v472507FUGMj3hZhqj2mnm7jFixuJEQoIYE1oGW85Lwi+yf26/jR3DfUBRygjRLE+zcg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/graph-node-linux-arm64-gnu": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node-linux-arm64-gnu/-/graph-node-linux-arm64-gnu-0.1.26.tgz", - "integrity": "sha512-WyhMaZZGKhTDf98ln6hzkN9yfnuK3asr/Y+VUyG5f0SQSXroq9RMpjy5sUYZI4Zo+wXyczDfOQmQo/NK8ZiZAQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/graph-node-linux-x64-gnu": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node-linux-x64-gnu/-/graph-node-linux-x64-gnu-0.1.26.tgz", - "integrity": "sha512-iZfcxvtN9ogysrfNjJ0qTgB8wsQqUhlNRgOLMKrWAMSz6ZvkNKu+raoznlTr7ic+aguwfUCewmCm4mITyK7www==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ruvector/graph-node-win32-x64-msvc": { - "version": "0.1.26", - "resolved": "https://registry.npmjs.org/@ruvector/graph-node-win32-x64-msvc/-/graph-node-win32-x64-msvc-0.1.26.tgz", - "integrity": "sha512-JuB6ff4opUhehaRiWJnKY39snLDAs1EPJRV32+NCS40cqBc7OJ5ywVqVBMIL1XGMAMEsByypvAv1JU7C1pQeRw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ruvector/router": { - "version": "0.1.28", - "resolved": "https://registry.npmjs.org/@ruvector/router/-/router-0.1.28.tgz", - "integrity": "sha512-bXqZF3wMypjnCm989fkty2H7LnmDw4sAJ0ClXzDjBwjV2wg7oZPdk8NiioLZh72CEZBsTll3NkLzZRyi6CiyBQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@ruvector/router-darwin-arm64": "0.1.27", - "@ruvector/router-darwin-x64": "0.1.27", - "@ruvector/router-linux-arm64-gnu": "0.1.27", - "@ruvector/router-linux-x64-gnu": "0.1.27", - "@ruvector/router-win32-x64-msvc": "0.1.27" - } - }, - "node_modules/@ruvector/router-darwin-arm64": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@ruvector/router-darwin-arm64/-/router-darwin-arm64-0.1.27.tgz", - "integrity": "sha512-T2iEdhNb83vxVVToNJQJLRo/EwHe4h1PmUf7WhAMLBEVE4HBaLTvRDTGfa4r2MPXvAplGSinWJpIE5MAfobSsQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/router-darwin-x64": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@ruvector/router-darwin-x64/-/router-darwin-x64-0.1.27.tgz", - "integrity": "sha512-4NrPdv6Isy68m60K8IW7242S1fm9JIYe5a/gBdtKLRFzPtwt69LwW1U8BGz77lchLIL9rGu2sxL2g7tTCrBn0A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/router-linux-arm64-gnu": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@ruvector/router-linux-arm64-gnu/-/router-linux-arm64-gnu-0.1.27.tgz", - "integrity": "sha512-e034ieW9RZ9Mbk1WkJPVSK4emgjQH8PdSFcl3LIEJsVntDZ5FzjujbLWkcCe0L+41Q0AwTV1V9pCaS2qrXyE0g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/router-linux-x64-gnu": { - "version": "0.1.28", - "resolved": "https://registry.npmjs.org/@ruvector/router-linux-x64-gnu/-/router-linux-x64-gnu-0.1.28.tgz", - "integrity": "sha512-AuhAY/WKdmMPD5fxNuTYKHa7nXAIi/nV+LnNepIo+glZRE/nat+EYteh39F0EdMLY1dFjBk93LpYdiJmKvefXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/router-win32-x64-msvc": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@ruvector/router-win32-x64-msvc/-/router-win32-x64-msvc-0.1.27.tgz", - "integrity": "sha512-dt5xGLvmHsfRbX6+pogHb9xpRBNFpBbWtR9FfptWT9vefMHdd5imYJF4QWyOxQsF9OHl9IATnlx7kvGIijgKfg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/router/node_modules/@ruvector/router-linux-x64-gnu": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/@ruvector/router-linux-x64-gnu/-/router-linux-x64-gnu-0.1.27.tgz", - "integrity": "sha512-YxAU8qqTizX3eK4P/w5DJcdH1a+8aSuc/hCyd8FKbacf1u0Ij6YlDD1GplvYmPo/1n1aVDgyIB/CtcoRvB7IvQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm/-/ruvllm-0.2.4.tgz", - "integrity": "sha512-cNAkcKZIqqy+3fxOb1z8bS1cJzJgsUpqNIdMk29RDr+a5g/fLgmHTVEzdBW6kHfDTc5tFUr10Juh9K6w0cKufg==", - "license": "MIT OR Apache-2.0", - "optional": true, - "dependencies": { - "chalk": "^4.1.2", - "commander": "^12.0.0", - "ora": "^5.4.1" - }, - "bin": { - "ruvllm": "bin/cli.js" - }, - "engines": { - "node": ">= 18" - }, - "optionalDependencies": { - "@ruvector/ruvllm-darwin-arm64": "0.2.0", - "@ruvector/ruvllm-darwin-x64": "0.2.0", - "@ruvector/ruvllm-linux-arm64-gnu": "0.2.0", - "@ruvector/ruvllm-linux-x64-gnu": "0.2.0", - "@ruvector/ruvllm-win32-x64-msvc": "0.2.0" - } - }, - "node_modules/@ruvector/ruvllm-darwin-arm64": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm-darwin-arm64/-/ruvllm-darwin-arm64-0.2.0.tgz", - "integrity": "sha512-3oEMNEoGJqfTJXf1Th49HPTlETMxLzlBc1yBY1RqCMoqSrNKsM66+3Npx0O/GdYfFnKRU2wa/mlLPuBY2lUqYQ==", - "cpu": [ - "arm64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm-darwin-x64": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm-darwin-x64/-/ruvllm-darwin-x64-0.2.0.tgz", - "integrity": "sha512-Niu9oG9hkbDJ1IpfXluRRfO4vwPwCdISW+ff1H+NjmIk8028CIg2w5iq3qbIaj6WzTQ9YqA68V5aMD9t0w8A6g==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm-linux-arm64-gnu": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm-linux-arm64-gnu/-/ruvllm-linux-arm64-gnu-0.2.0.tgz", - "integrity": "sha512-ykOqwiqRbf29idXYMmuDdZqOsRMbYgzpWhmk/BcSRVBMUsO4W2Q0UkgLZgt6PIKxSf1k2qt8x8uSmO5tYTD8Iw==", - "cpu": [ - "arm64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm-linux-x64-gnu": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm-linux-x64-gnu/-/ruvllm-linux-x64-gnu-0.2.0.tgz", - "integrity": "sha512-8JHH7ft00rqCRyiP0wuAThOVwSodj0gaTZcG1jBBqtnwApmdmTWN8EpuffrHHhhRO+Uvny6T5r7TiAh+Xu+QuQ==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm-win32-x64-msvc": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@ruvector/ruvllm-win32-x64-msvc/-/ruvllm-win32-x64-msvc-0.2.0.tgz", - "integrity": "sha512-ksm+AZVqkkYLVq2Rbc7Rx+gSH7egFWlcH3E5dQpro98Oslc7jUH+uNDRjDVUS3lZXchV+Ot5WPLM4pClRxFm9w==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/@ruvector/ruvllm/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", - "optional": true, - "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/@ruvector/ruvllm/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "optional": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "optional": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ruvector/ruvllm/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@ruvector/rvf": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ruvector/rvf/-/rvf-0.1.9.tgz", - "integrity": "sha512-W40NLeSj/+FwIHT0+v3soFrtk4pnAZL5Ghx93qAsZkuwriNw2y6vGPnsapflQyp34WgMN362syIRiACXx3KW8g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@ruvector/rvf-node": "^0.1.7" - }, - "optionalDependencies": { - "@ruvector/rvf-solver": "^0.1.0", - "@ruvector/rvf-wasm": "^0.1.5" - } - }, - "node_modules/@ruvector/rvf-node": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node/-/rvf-node-0.1.7.tgz", - "integrity": "sha512-VHfEKBew62gNpi3lST0bxMw+ynRTM1xDdqca2d5A1qyW6jSCyTFJ9TAYP00uzfnTKKxezNcrzEkyQWj+gs/Pzw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 16" - }, - "optionalDependencies": { - "@ruvector/rvf-node-darwin-arm64": "0.1.7", - "@ruvector/rvf-node-darwin-x64": "0.1.7", - "@ruvector/rvf-node-linux-arm64-gnu": "0.1.7", - "@ruvector/rvf-node-linux-x64-gnu": "0.1.7", - "@ruvector/rvf-node-win32-x64-msvc": "0.1.7" - } - }, - "node_modules/@ruvector/rvf-node-darwin-arm64": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node-darwin-arm64/-/rvf-node-darwin-arm64-0.1.7.tgz", - "integrity": "sha512-vll3WJwDn3oOfy1PB10IG7/f3zBpFiMNHL2/2tdJmeRR8La/rSPJ0ZH5MDIsfleiVtaWzh9bvVCtVkZ6uo2jeg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/rvf-node-darwin-x64": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node-darwin-x64/-/rvf-node-darwin-x64-0.1.7.tgz", - "integrity": "sha512-Qi/l2bVuVz5YQ2RcYPYF0LNZVkytiIZHzvWhS71+Tt5GEIrsToauHQIcnJQmDNypvwxO8wYk+EeT2xcHR3ZSQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/rvf-node-linux-arm64-gnu": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node-linux-arm64-gnu/-/rvf-node-linux-arm64-gnu-0.1.7.tgz", - "integrity": "sha512-oZwrtfs7XqRVaDP6iiw6G52l7+NdP3NbTwR2iM+EP8r8X4e1+p4opwV2Ig+lyT7wAz72wcyOpkzpu1MlbK4NKA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/rvf-node-linux-x64-gnu": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node-linux-x64-gnu/-/rvf-node-linux-x64-gnu-0.1.7.tgz", - "integrity": "sha512-CRq9nc7dIj8QbcY9sSXvVau7cr1ESh3VnYUPp1IodzZ4SegN0H3oeieF5nUMNYyq+43MkBR4yrEwFgDBZ00QHQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/rvf-node-win32-x64-msvc": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-node-win32-x64-msvc/-/rvf-node-win32-x64-msvc-0.1.7.tgz", - "integrity": "sha512-sgnoNphOnbD4d3+YyQ83MlGO7sX4kbcDwsFNz7p2mlTaDR8coQXoudSaPrMeMpeUojFUqoxeDvVly/un3jADig==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ruvector/rvf-solver": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-solver/-/rvf-solver-0.1.7.tgz", - "integrity": "sha512-wJvw+0deGnaVpsPxGNIy/QzQN47oPkFKD4koHJGVTMHgPAe8eRbzp5g8t9cB8qbHd8K6NRAAd4hr/VYEA3QHVw==", - "license": "MIT", - "optional": true - }, - "node_modules/@ruvector/rvf-wasm": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@ruvector/rvf-wasm/-/rvf-wasm-0.1.6.tgz", - "integrity": "sha512-hdxRgMJqqDR5jsYBepYrdc0odGGjlwE7QsKOfKlrIWN3kC/pNulCppqKwropJsME0/ZzlLBF90YmWmSXw1AXkg==", - "license": "MIT", - "optional": true - }, - "node_modules/@ruvector/sona": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona/-/sona-0.1.5.tgz", - "integrity": "sha512-XHQbphnWsRzWRWGK/HxK+RreY6OdlggMrOvrfkWlEq8EctHVy2ASwps7hk25Somx8Umj7+CkNuyQEbHcNcl/oQ==", - "license": "MIT OR Apache-2.0", - "optional": true, - "engines": { - "node": ">= 16" - }, - "optionalDependencies": { - "@ruvector/sona-darwin-arm64": "0.1.5", - "@ruvector/sona-darwin-x64": "0.1.5", - "@ruvector/sona-linux-arm64-gnu": "0.1.5", - "@ruvector/sona-linux-x64-gnu": "0.1.5", - "@ruvector/sona-linux-x64-musl": "0.1.5", - "@ruvector/sona-win32-arm64-msvc": "0.1.5", - "@ruvector/sona-win32-x64-msvc": "0.1.5" - } - }, - "node_modules/@ruvector/sona-darwin-arm64": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-darwin-arm64/-/sona-darwin-arm64-0.1.5.tgz", - "integrity": "sha512-+bXB7+WdbkiNbcw0Xh5VENNILgDVpuma7fyx8NwGylWaYRe1niM03k/rezdM3zbpf4qGSqp6fVKIIDU8/H9lHw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/sona-darwin-x64": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-darwin-x64/-/sona-darwin-x64-0.1.5.tgz", - "integrity": "sha512-wnr1oxeZqaHomjRevdqvciy8BSLyxF9pjkcZ7G5rszmmNNQf+YcM9IUUEbxno4b4MXj1HJC/ZtS602PBNvf5PA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@ruvector/sona-linux-arm64-gnu": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-linux-arm64-gnu/-/sona-linux-arm64-gnu-0.1.5.tgz", - "integrity": "sha512-Kp895NJC52HfRlSjg+vZ32/8+v9eIDSbJXKMrjZNdA7aep4tsFTcE5bQG2Iru+zoIeFi+jcx0AVeqDPBS/9HHA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/sona-linux-x64-gnu": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-linux-x64-gnu/-/sona-linux-x64-gnu-0.1.5.tgz", - "integrity": "sha512-fmYlrJx9IQBHxeNX2Tu0ihHr3xsb3NwhgMmasOTOHBv/42fnxuuYrwhfHtMA6J6JtjyVxoBw1XLD6QJy4Y9BsA==", - "cpu": [ - "x64" - ], - "license": "MIT OR Apache-2.0", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/sona-linux-x64-musl": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-linux-x64-musl/-/sona-linux-x64-musl-0.1.5.tgz", - "integrity": "sha512-q0hzfilUUCQNsx2QTZ0H07FKuwdfaxh7mNuv01oq5fGCC/0beBENiL5UKxm0YHtTmMPNze83Vwp1fGT9ObOQ3g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@ruvector/sona-win32-arm64-msvc": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-win32-arm64-msvc/-/sona-win32-arm64-msvc-0.1.5.tgz", - "integrity": "sha512-kk7aiedLw/Z8Xogv+sQfoYQp8Y+om7/X4Ycbl830RSNpVBXEKkQpI7vMbK55eaQ9zjBbqjtgcoZNWXzGUmbTeA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ruvector/sona-win32-x64-msvc": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@ruvector/sona-win32-x64-msvc/-/sona-win32-x64-msvc-0.1.5.tgz", - "integrity": "sha512-ifB2meo3GeguivC5Dcq50UZEupc+F/yFZ1+cg2mVgUpoqNN9lzJ+k3IdGgdYyMu7YAM8CrgTswfp/krUwx8BLQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@ruvector/tiny-dancer": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer/-/tiny-dancer-0.1.17.tgz", - "integrity": "sha512-Jv5R6fAhjtJfgTMkBxFHW4uQiUTF0/DRdYVMKFuCBHHO4Rv+uRaI67woFStbZc+N4OCsuvLJjFh2hE9GmDGIYg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@ruvector/tiny-dancer-darwin-arm64": "0.1.15", - "@ruvector/tiny-dancer-darwin-x64": "0.1.15", - "@ruvector/tiny-dancer-linux-arm64-gnu": "0.1.17", - "@ruvector/tiny-dancer-linux-x64-gnu": "0.1.15", - "@ruvector/tiny-dancer-win32-x64-msvc": "0.1.15" - } - }, - "node_modules/@ruvector/tiny-dancer-darwin-arm64": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer-darwin-arm64/-/tiny-dancer-darwin-arm64-0.1.15.tgz", - "integrity": "sha512-99vy9OLjppPj3kjusQnirgLvOnBt6Jrt2pij3Fvs5pzyp+zh04gb1np0tFR4JCxftKnuoKYqN7bCtQvgQbBBSg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ruvector/tiny-dancer-darwin-x64": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer-darwin-x64/-/tiny-dancer-darwin-x64-0.1.15.tgz", - "integrity": "sha512-KxxhkiJwjRoUBeK0pwxuY8dKYpMrxpItss7CfNYhsbJc1YLmUzw1TG2Klga4vO1X7dsg/CYuHC+KKrgfSvEVwA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ruvector/tiny-dancer-linux-arm64-gnu": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer-linux-arm64-gnu/-/tiny-dancer-linux-arm64-gnu-0.1.17.tgz", - "integrity": "sha512-bvjYL0/tyonot6KFQPAbtOdw3TGL6fIxakmn8ED6gRRcwPJ3V6VZ0WgLZfOlXiWc4I/eQvcNldgJ+3QOXurgMw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ruvector/tiny-dancer-linux-x64-gnu": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer-linux-x64-gnu/-/tiny-dancer-linux-x64-gnu-0.1.15.tgz", - "integrity": "sha512-lEknFh2p73KkHz6d51cP/Y5D10AATiXRsoQEDRkOjrO0Eb5blyxal4wzdqbylyXEH7UbRePCBrCCk5BkfZD1fA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@ruvector/tiny-dancer-win32-x64-msvc": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/@ruvector/tiny-dancer-win32-x64-msvc/-/tiny-dancer-win32-x64-msvc-0.1.15.tgz", - "integrity": "sha512-f465GiIh+CWv58d3eixWKJOi8kSqcRk5heH2SRwj2Q4wWjWru4esr96NXb1VCj0EKFfDWs9D+aPW2OU4xFeoPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "license": "MIT", - "optional": true - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "license": "MIT", - "optional": true - }, - "node_modules/@supabase/auth-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.97.0.tgz", - "integrity": "sha512-2Og/1lqp+AIavr8qS2X04aSl8RBY06y4LrtIAGxat06XoXYiDxKNQMQzWDAKm1EyZFZVRNH48DO5YvIZ7la5fQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/functions-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.97.0.tgz", - "integrity": "sha512-fSaA0ZeBUS9hMgpGZt5shIZvfs3Mvx2ZdajQT4kv/whubqDBAp3GU5W8iIXy21MRvKmO2NpAj8/Q6y+ZkZyF/w==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/postgrest-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.97.0.tgz", - "integrity": "sha512-g4Ps0eaxZZurvfv/KGoo2XPZNpyNtjth9aW8eho9LZWM0bUuBtxPZw3ZQ6ERSpEGogshR+XNgwlSPIwcuHCNww==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.97.0.tgz", - "integrity": "sha512-37Jw0NLaFP0CZd7qCan97D1zWutPrTSpgWxAw6Yok59JZoxp4IIKMrPeftJ3LZHmf+ILQOPy3i0pRDHM9FY36Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/phoenix": "^1.6.6", - "@types/ws": "^8.18.1", - "tslib": "2.8.1", - "ws": "^8.18.2" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.97.0.tgz", - "integrity": "sha512-9f6NniSBfuMxOWKwEFb+RjJzkfMdJUwv9oHuFJKfe/5VJR8cd90qw68m6Hn0ImGtwG37TUO+QHtoOechxRJ1Yg==", - "license": "MIT", - "optional": true, - "dependencies": { - "iceberg-js": "^0.8.1", - "tslib": "2.8.1" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.97.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.97.0.tgz", - "integrity": "sha512-kTD91rZNO4LvRUHv4x3/4hNmsEd2ofkYhuba2VMUPRVef1RCmnHtm7rIws38Fg0yQnOSZOplQzafn0GSiy6GVg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@supabase/auth-js": "2.97.0", - "@supabase/functions-js": "2.97.0", - "@supabase/postgrest-js": "2.97.0", - "@supabase/realtime-js": "2.97.0", - "@supabase/storage-js": "2.97.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@tokenizer/inflate": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", - "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.4.3", - "token-types": "^6.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/inflate/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@tokenizer/inflate/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", - "optional": true - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT", - "optional": true - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.122", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", - "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bunyan": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", - "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.9.tgz", - "integrity": "sha512-8uYXI3Gw35MhiVYhG3s295oihrxRyytcRHjSjqnqZVDDy/xcGBRny7+Xj1Wgfhv5QzRtN2hB2dVRBUX9XW3UcQ==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/cookies": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.9.2.tgz", - "integrity": "sha512-1AvkDdZM2dbyFybL4fxpuNCaWyv//0AwsuUk2DWeXyM1/5ZKm6W3z6mQi24RZ4l2ucY+bkSHzbDVpySqPGuV8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.1.tgz", - "integrity": "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-assert": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.6.tgz", - "integrity": "sha512-TTEwmtjgVbYAzZYWyeHPrrtWnfVkm8tQkP8P21uQifPgMRgjrow3XDEYqucuC8SKZJT7pUnhU/JymvjggxO9vw==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/http-proxy": { - "version": "1.17.17", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.17.tgz", - "integrity": "sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/keygrip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.6.tgz", - "integrity": "sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/koa": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.14.0.tgz", - "integrity": "sha512-DTDUyznHGNHAl+wd1n0z1jxNajduyTh8R53xoewuerdBzGo6Ogj6F2299BFtrexJw4NtgjsI5SMPCmV9gZwGXA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__router": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/@types/koa__router/-/koa__router-12.0.3.tgz", - "integrity": "sha512-5YUJVv6NwM1z7m6FuYpKfNLTZ932Z6EF6xy2BbtpJSyn13DKNQEkXVffFVSnJHxvwwWh2SAeumpjAYUELqgjyw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.9.tgz", - "integrity": "sha512-BroAZ9FTvPiCy0Pi8tjD1OfJ7bgU1gQf0eR6e1Vm+JJATy9eKOG3hQMFtMciMawiSOVnLMdmUOC46s7HBhSTsA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/memcached": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", - "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mysql": { - "version": "2.15.22", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", - "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "undici-types": "~7.18.0" - } - }, - "node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/pg-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", - "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/pg": "*" - } - }, - "node_modules/@types/phoenix": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.7.tgz", - "integrity": "sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", - "license": "MIT", - "optional": true - }, - "node_modules/@types/tedious": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@xenova/transformers": { - "version": "2.17.2", - "resolved": "https://registry.npmjs.org/@xenova/transformers/-/transformers-2.17.2.tgz", - "integrity": "sha512-lZmHqzrVIkSvZdKZEx7IYY51TK0WDrC8eR0c5IMnBsO8di8are1zzw8BlLhyO2TklZKLN5UffNGs1IJwT6oOqQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@huggingface/jinja": "^0.2.2", - "onnxruntime-web": "1.14.0", - "sharp": "^0.32.0" - }, - "optionalDependencies": { - "onnxruntime-node": "1.14.0" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC", - "optional": 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": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - "license": "MIT", - "optional": true, - "peer": true, - "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==", - "license": "MIT", - "optional": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/adm-zip": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", - "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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", - "optional": true - }, - "node_modules/agentdb": { - "version": "2.0.0-alpha.3.4", - "resolved": "https://registry.npmjs.org/agentdb/-/agentdb-2.0.0-alpha.3.4.tgz", - "integrity": "sha512-bUqO5o2VpWomh2xGOHdQoX00CGrPcIAH6zDCt5oa0SeJWAO+bbB7SiElb1TxwcrJQKe96HkiSh2T8z4vFypsxg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.20.1", - "@opentelemetry/api": "^1.9.0", - "@ruvector/attention": "^0.1.2", - "@ruvector/gnn": "^0.1.22", - "@ruvector/graph-node": "^0.1.15", - "@ruvector/router": "^0.1.15", - "@ruvector/ruvllm": "^0.2.4", - "@ruvector/sona": "^0.1.4", - "ajv": "^8.17.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.0", - "commander": "^12.1.0", - "dotenv": "^16.4.7", - "inquirer": "^9.3.8", - "jsonwebtoken": "^9.0.2", - "marked-terminal": "^6.0.0", - "ora": "^7.0.0", - "ruvector": "^0.1.30", - "ruvector-attention-wasm": "^0.1.0", - "sql.js": "^1.13.0", - "zod": "^3.25.76" - }, - "bin": { - "agentdb": "dist/src/cli/agentdb-cli.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "@opentelemetry/auto-instrumentations-node": "^0.47.0", - "@opentelemetry/exporter-metrics-otlp-http": "^0.52.0", - "@opentelemetry/exporter-prometheus": "^0.52.0", - "@opentelemetry/exporter-trace-otlp-http": "^0.52.0", - "@opentelemetry/resources": "^1.25.0", - "@opentelemetry/sdk-metrics": "^1.25.0", - "@opentelemetry/sdk-node": "^0.52.0", - "@opentelemetry/sdk-trace-base": "^1.25.0", - "@opentelemetry/semantic-conventions": "^1.25.0", - "@xenova/transformers": "^2.17.2", - "argon2": "^0.44.0", - "bcrypt": "^6.0.0", - "better-sqlite3": "^11.8.1", - "express-rate-limit": "^8.2.1", - "helmet": "^8.1.0", - "hnswlib-node": "^3.0.0", - "sharp": "^0.32.6", - "sqlite": "^5.1.1", - "sqlite3": "^5.1.7" - } - }, - "node_modules/agentdb/node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/agentic-flow": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/agentic-flow/-/agentic-flow-2.0.7.tgz", - "integrity": "sha512-g2fFIi6mp4LdauRtwGfaa0ddIRDBcPSwa7TvqV4ttQgQwZR+l8LYH3v7Rg9QTKizGXROmbNCm0nKYRE4pmq5Kg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@anthropic-ai/claude-agent-sdk": "^0.1.5", - "@anthropic-ai/sdk": "^0.65.0", - "@google/genai": "^1.22.0", - "@ruvector/core": "^0.1.29", - "@ruvector/edge-full": "^0.1.0", - "@ruvector/router": "^0.1.25", - "@ruvector/ruvllm": "^0.2.3", - "@ruvector/tiny-dancer": "0.1.17", - "@supabase/supabase-js": "^2.78.0", - "@xenova/transformers": "^2.17.2", - "agentdb": "^2.0.0-alpha.2.20", - "axios": "^1.12.2", - "dotenv": "^16.4.5", - "express": "^5.1.0", - "fastmcp": "^3.19.0", - "gun": "^0.2020.1241", - "http-proxy-middleware": "^3.0.5", - "onnxruntime-node": "^1.23.2", - "ruvector": "^0.1.69", - "ruvector-onnx-embeddings-wasm": "^0.1.2", - "tiktoken": "^1.0.22", - "ulid": "^3.0.1", - "ws": "^8.18.3", - "yaml": "^2.8.1", - "zod": "^3.25.76" - }, - "bin": { - "agentdb": "dist/agentdb/cli/agentdb-cli.js", - "agentic-flow": "dist/cli-proxy.js" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "better-sqlite3": "^11.10.0", - "sql.js": "^1.11.0" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "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/agentic-flow/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/agentic-flow/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agentic-flow/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", - "optional": true - }, - "node_modules/agentic-flow/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "optional": true, - "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/agentic-flow/node_modules/fastmcp": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/fastmcp/-/fastmcp-3.33.0.tgz", - "integrity": "sha512-jmp1uwPMp1fMWF3vjSeWDbQKd2WlBjREKzd4Ro7Ww4Z7fzF9rWcOJN4D2zjR+rSIk44U2/0mu4pFNT/CkMPZyg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.24.3", - "@standard-schema/spec": "^1.0.0", - "execa": "^9.6.1", - "file-type": "^21.1.1", - "fuse.js": "^7.1.0", - "hono": "^4.11.5", - "mcp-proxy": "^6.4.0", - "strict-event-emitter-types": "^2.0.0", - "undici": "^7.16.0", - "uri-templates": "^0.2.0", - "xsschema": "0.4.0-beta.5", - "yargs": "^18.0.0", - "zod": "^4.1.13", - "zod-to-json-schema": "^3.25.0" - }, - "bin": { - "fastmcp": "dist/bin/fastmcp.js" - }, - "peerDependencies": { - "jose": "^5.0.0" - }, - "peerDependenciesMeta": { - "jose": { - "optional": true - } - } - }, - "node_modules/agentic-flow/node_modules/fastmcp/node_modules/xsschema": { - "version": "0.4.0-beta.5", - "resolved": "https://registry.npmjs.org/xsschema/-/xsschema-0.4.0-beta.5.tgz", - "integrity": "sha512-73pYwf1hMy++7SnOkghJdgdPaGi+Y5I0SaO6rIlxb1ouV6tEyDbEcXP82kyr32KQVTlUbFj6qewi9eUVEiXm+g==", - "license": "MIT", - "optional": true, - "peerDependencies": { - "@valibot/to-json-schema": "^1.0.0", - "arktype": "^2.1.20", - "effect": "^3.16.0", - "sury": "^10.0.0", - "zod": "^3.25.0 || ^4.0.0", - "zod-to-json-schema": "^3.24.5" - }, - "peerDependenciesMeta": { - "@valibot/to-json-schema": { - "optional": true - }, - "arktype": { - "optional": true - }, - "effect": { - "optional": true - }, - "sury": { - "optional": true - }, - "zod": { - "optional": true - }, - "zod-to-json-schema": { - "optional": true - } - } - }, - "node_modules/agentic-flow/node_modules/fastmcp/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", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "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/agentic-flow/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", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/agentic-flow/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", - "optional": true - }, - "node_modules/agentic-flow/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", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/node_modules/onnxruntime-common": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.24.2.tgz", - "integrity": "sha512-S0FFhJaI05jr1c3HVJ/DuPFB/aYdXmnUBuuQfuvLtcNn7WAfpm2ewSXn1vHs9Wa1l8T8OznhfCEdFv8qCn0/xw==", - "license": "MIT", - "optional": true - }, - "node_modules/agentic-flow/node_modules/onnxruntime-node": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.24.2.tgz", - "integrity": "sha512-ZtTkUHNNk+Xpi2Sq2BcFjzc9Vx4n3o5RxYLgRvdrFzCBsGUU1dQRFf4LM9tCc7vFhPSoZqbvzZtkzRMXoDqKNg==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "adm-zip": "^0.5.16", - "global-agent": "^3.0.0", - "onnxruntime-common": "1.24.2" - } - }, - "node_modules/agentic-flow/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "optional": true, - "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/agentic-flow/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", - "optional": true, - "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/agentic-flow/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", - "optional": true, - "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/agentic-flow/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", - "optional": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/agentic-flow/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", - "optional": true, - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agentic-flow/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/agentic-flow/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/agentic-flow/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "optional": true, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/agentkeepalive": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz", - "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "license": "MIT", - "optional": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "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", - "optional": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "license": "MIT", - "optional": 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", - "optional": true - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/argon2": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.44.0.tgz", - "integrity": "sha512-zHPGN3S55sihSQo0dBbK0A5qpi2R31z7HZDZnry3ifOyj8bZZnpZND2gpmhnRGO1V/d555RwBqIK5W4Mrmv3ig==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@phc/format": "^1.0.0", - "cross-env": "^10.0.0", - "node-addon-api": "^8.5.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">=16.17.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/asn1js": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.7.tgz", - "integrity": "sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.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", - "optional": true - }, - "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", - "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", - "license": "Apache-2.0", - "optional": true, - "peerDependencies": { - "react-native-b4a": "*" - }, - "peerDependenciesMeta": { - "react-native-b4a": { - "optional": true - } - } - }, - "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==", - "license": "MIT", - "optional": true - }, - "node_modules/bare-events": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", - "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", - "license": "Apache-2.0", - "optional": true, - "peerDependencies": { - "bare-abort-controller": "*" - }, - "peerDependenciesMeta": { - "bare-abort-controller": { - "optional": true - } - } - }, - "node_modules/bare-fs": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", - "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4", - "bare-url": "^2.2.2", - "fast-fifo": "^1.3.2" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", - "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.21.0", - "teex": "^1.0.1" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, - "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-path": "^3.0.0" - } - }, - "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", - "optional": true - }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/bcrypt/node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT", - "optional": true - }, - "node_modules/better-sqlite3": { - "version": "11.10.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz", - "integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "prebuild-install": "^7.1.1" - } - }, - "node_modules/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.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", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause", - "optional": 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", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "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/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "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", - "optional": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chardet": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.1.tgz", - "integrity": "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==", - "license": "MIT", - "optional": true - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "license": "MIT", - "optional": true - }, - "node_modules/claude-flow": { - "version": "3.0.0-alpha.190", - "resolved": "https://registry.npmjs.org/claude-flow/-/claude-flow-3.0.0-alpha.190.tgz", - "integrity": "sha512-vy7T0Ld+KmQo88aOdxturjhLzLuU8siC4IomHfR1uoEh6FiSuqxxACdfGQB5y/L1EMwKvwg+Rlgb9s4Q2P0GDA==", - "license": "MIT", - "dependencies": { - "zod": "^3.22.4" - }, - "bin": { - "claude-flow": "v3/@claude-flow/cli/bin/cli.js" - }, - "engines": { - "node": ">=20.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ruvnet" - }, - "optionalDependencies": { - "@claude-flow/plugin-gastown-bridge": "^0.1.0", - "@ruvector/attention": "^0.1.3", - "@ruvector/core": "^0.1.30", - "@ruvector/router": "^0.1.27", - "@ruvector/router-linux-x64-gnu": "^0.1.27", - "@ruvector/sona": "^0.1.5", - "agentdb": "2.0.0-alpha.3.4", - "agentic-flow": "^2.0.1-alpha.80", - "bcrypt": "^5.1.1" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "license": "MIT", - "optional": true, - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "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", - "optional": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">= 12" - } - }, - "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", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "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", - "optional": true, - "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/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.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", - "optional": true, - "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", - "optional": true - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "engines": { - "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==", - "license": "MIT", - "optional": true - }, - "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", - "optional": true - }, - "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/cookies": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", - "integrity": "sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw==", - "license": "MIT", - "optional": true, - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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-env": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", - "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@epic-web/invariant": "^1.0.0", - "cross-spawn": "^7.0.6" - }, - "bin": { - "cross-env": "dist/bin/cross-env.js", - "cross-env-shell": "dist/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=20" - } - }, - "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", - "optional": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 12" - } - }, - "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/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", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "license": "MIT", - "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", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "license": "MIT", - "optional": true, - "dependencies": { - "clone": "^1.0.2" - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "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", - "optional": true - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "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", - "optional": true - }, - "node_modules/emojilib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", - "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", - "license": "MIT", - "optional": true - }, - "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/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/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", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "license": "MIT", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT", - "optional": true - }, - "node_modules/events-universal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", - "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.7.0" - } - }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "optional": true, - "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", - "optional": true, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/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", - "optional": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expand-template": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", - "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "license": "(MIT OR WTFPL)", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "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", - "peer": true, - "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": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "ip-address": "10.0.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, - "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", - "optional": true - }, - "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-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "license": "MIT", - "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/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "optional": true, - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/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", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-type": { - "version": "21.3.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.0.tgz", - "integrity": "sha512-8kPJMIGz1Yt/aPEwOsrR97ZyZaD1Iqm8PClb1nYFclUCkBi0Ma5IsYNQzvSFS9ib51lWyIw5mIT9rWzI/xjpzA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tokenizer/inflate": "^0.4.1", - "strtok3": "^10.3.4", - "token-types": "^6.1.1", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "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==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": "1.12.0", - "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-1.12.0.tgz", - "integrity": "sha512-c7CZADjRcl6j0PlvFy0ZqXQ67qSEZfrVPynmnL+2zPc+NtMvrF8Y0QceMo7QqnSPc7+uWjUIAbvCQ5WIKlMVdQ==", - "license": "SEE LICENSE IN LICENSE.txt", - "optional": true - }, - "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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/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", - "optional": true, - "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", - "optional": true, - "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/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "license": "MIT", - "optional": true, - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "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-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "license": "MIT", - "optional": true - }, - "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", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "license": "ISC", - "optional": true - }, - "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/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gaxios/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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gaxios/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/gaxios/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==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gaxios/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", - "optional": true - }, - "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "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", - "optional": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "license": "MIT", - "optional": true, - "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-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/github-from-package": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob 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 exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/google-auth-library": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", - "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.0.0", - "gcp-metadata": "^8.0.0", - "google-logging-utils": "^1.0.0", - "gtoken": "^8.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/google-auth-library/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "optional": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/google-auth-library/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/google-auth-library/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/google-auth-library/node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2", - "rimraf": "^5.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/google-auth-library/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob 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 exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/google-auth-library/node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-auth-library/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==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/google-auth-library/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/google-auth-library/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/google-auth-library/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", - "optional": true - }, - "node_modules/google-auth-library/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "optional": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/google-auth-library/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "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", - "optional": true - }, - "node_modules/gtoken": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", - "license": "MIT", - "optional": true, - "dependencies": { - "gaxios": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gtoken/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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gtoken/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "optional": true, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/gtoken/node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/gtoken/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/gtoken/node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2", - "rimraf": "^5.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/gtoken/node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob 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 exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gtoken/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==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/gtoken/node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/gtoken/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/gtoken/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", - "optional": true - }, - "node_modules/gtoken/node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "license": "MIT", - "optional": true, - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/gtoken/node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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", - "optional": true - }, - "node_modules/gun": { - "version": "0.2020.1241", - "resolved": "https://registry.npmjs.org/gun/-/gun-0.2020.1241.tgz", - "integrity": "sha512-rmGqLuJj4fAuZ/0lddCvXHbENPkEnBOBYpq+kXHrwQ5RdNtQ5p0Io99lD1qUXMFmtwNacQ/iqo3VTmjmMyAYZg==", - "license": "(Zlib OR MIT OR Apache-2.0)", - "optional": true, - "dependencies": { - "ws": "^7.2.1" - }, - "engines": { - "node": ">=0.8.4" - }, - "optionalDependencies": { - "@peculiar/webcrypto": "^1.1.1" - } - }, - "node_modules/gun/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true - }, - "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/helmet": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", - "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/hnswlib-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hnswlib-node/-/hnswlib-node-3.0.0.tgz", - "integrity": "sha512-fypn21qvVORassppC8/qNfZ5KAOspZpm/IbUkAtlqvbtDNnF5VVk5RWF7O5V6qwr7z+T3s1ePej6wQt5wRQ4Cg==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^8.0.0" - } - }, - "node_modules/hono": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.2.tgz", - "integrity": "sha512-gJnaDHXKDayjt8ue0n8Gs0A007yKXj4Xzb8+cNjZeYsSzzwKc0Lr+OZgYwVfB0pHfUs17EPoLvrOsEaJ9mj+Tg==", - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "license": "MIT", - "optional": true, - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-assert/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "optional": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-assert/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", - "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", - "license": "BSD-2-Clause", - "optional": 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": { - "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/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/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", - "optional": true - }, - "node_modules/http-proxy-middleware": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", - "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/http-proxy-middleware/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/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", - "optional": true - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/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", - "optional": true - }, - "node_modules/human-readable-ids": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/human-readable-ids/-/human-readable-ids-1.0.4.tgz", - "integrity": "sha512-h1zwThTims8A/SpqFGWyTx+jG1+WRMJaEeZgbtPGrIpj2AZjsOgy8Y+iNzJ0yAyN669Q6F02EK66WMWcst+2FA==", - "license": "Apache2", - "optional": true, - "dependencies": { - "knuth-shuffle": "^1.0.0" - } - }, - "node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/iceberg-js": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", - "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=20.0.0" - } - }, - "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/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", - "optional": true - }, - "node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "license": "ISC", - "optional": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "optional": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "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", - "optional": true - }, - "node_modules/inquirer": { - "version": "9.3.8", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.8.tgz", - "integrity": "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w==", - "license": "MIT", - "optional": true, - "dependencies": { - "@inquirer/external-editor": "^1.0.2", - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/inquirer/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/inquirer/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", - "optional": true, - "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/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "optional": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "optional": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 12" - } - }, - "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-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT", - "optional": true - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "optional": true, - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "license": "MIT", - "optional": true - }, - "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==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "optional": true - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=12" - }, - "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", - "optional": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "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", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "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", - "optional": true, - "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==", - "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", - "optional": true - }, - "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", - "optional": true - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "optional": true, - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/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", - "optional": true - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "optional": true, - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/knuth-shuffle": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/knuth-shuffle/-/knuth-shuffle-1.0.8.tgz", - "integrity": "sha512-IdC4Hpp+mx53zTt6VAGsAtbGM0g4BV9fP8tTcviCosSwocHcRDw9uG5Rnv6wLWckF4r72qeXFoK9NkvV1gUJCQ==", - "license": "(MIT OR Apache-2.0)", - "optional": true - }, - "node_modules/koa": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-3.1.1.tgz", - "integrity": "sha512-KDDuvpfqSK0ZKEO2gCPedNjl5wYpfj+HNiuVRlbhd1A88S3M0ySkdf2V/EJ4NWt5dwh5PXCdcenrKK2IQJAxsg==", - "license": "MIT", - "optional": true, - "dependencies": { - "accepts": "^1.3.8", - "content-disposition": "~0.5.4", - "content-type": "^1.0.5", - "cookies": "~0.9.1", - "delegates": "^1.0.0", - "destroy": "^1.2.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.5.0", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "mime-types": "^3.0.1", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "license": "MIT", - "optional": true - }, - "node_modules/koa-router": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-14.0.0.tgz", - "integrity": "sha512-Ue8f/PRsLLNm6b7y+eS6xkqvsG2xH11d2VB1HPcfdfW6p5736kCHf2pXaq8q9XPQ01x0Dk7V/P5Il9pe+tGTxA==", - "deprecated": "Please use @koa/router instead, starting from v9! ", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.4.1", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "path-to-regexp": "^8.2.0" - }, - "engines": { - "node": ">= 20" - } - }, - "node_modules/koa-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", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/koa-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", - "optional": true - }, - "node_modules/koa-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", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/koa/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", - "optional": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/koa/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", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/koa/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", - "optional": true, - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/koa/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", - "optional": true, - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT", - "optional": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT", - "optional": true - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", - "license": "MIT", - "optional": true, - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "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", - "optional": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "license": "ISC", - "optional": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/marked": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", - "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/marked-terminal": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-6.2.0.tgz", - "integrity": "sha512-ubWhwcBFHnXsjYNsu+Wndpg0zhY4CahSpPlA70PlO0rR9r2sZpkyU+rkCsOWH+KMEkx847UpALON+HWgxowFtw==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.3.0", - "cli-table3": "^0.6.3", - "node-emoji": "^2.1.3", - "supports-hyperlinks": "^3.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "marked": ">=1 <12" - } - }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "optional": true, - "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/mcp-proxy": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/mcp-proxy/-/mcp-proxy-6.4.0.tgz", - "integrity": "sha512-GHDgP1MCzDeWddGEPu/5lxTi/BiD+/3R9xg4gzK65GHSbeiWZEEWTsr0N6mhH3+5A0Gj0M7bDpvPsBPJzz+vnQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "pipenet": "^1.3.0" - }, - "bin": { - "mcp-proxy": "dist/bin/mcp-proxy.mjs" - } - }, - "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/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/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "optional": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.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-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=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", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.3.tgz", - "integrity": "sha512-M2GCs7Vk83NxkUyQV1bkABc4yxgz9kILhHImZiBPAZ9ybuvCb0/H7lEl5XvIg3g+9d4eNotkZA5IWwYl0tibaA==", - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "license": "MIT", - "optional": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "optional": true, - "dependencies": { - "minipass": "^3.0.0", - "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", - "optional": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "license": "MIT", - "optional": true - }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "license": "MIT", - "optional": true - }, - "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/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "license": "ISC", - "optional": true, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/napi-build-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", - "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", - "license": "MIT", - "optional": true - }, - "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-abi": { - "version": "3.87.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz", - "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "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", - "optional": true, - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-emoji": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", - "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", - "license": "MIT", - "optional": true, - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "char-regex": "^1.0.2", - "emojilib": "^2.4.0", - "skin-tone": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "optional": true, - "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": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", - "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", - "license": "MIT", - "optional": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^9.1.0", - "nopt": "^5.0.0", - "npmlog": "^6.0.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "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", - "optional": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/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", - "optional": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/node-gyp/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", - "optional": true, - "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/node-gyp/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", - "optional": true, - "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/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "license": "MIT", - "optional": true, - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "optional": true, - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.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", - "optional": true, - "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", - "optional": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/onnx-proto": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/onnx-proto/-/onnx-proto-4.0.4.tgz", - "integrity": "sha512-aldMOB3HRoo6q/phyB6QRQxSt895HNNw82BNyZ2CMh4bjeKv7g/c+VpAFtJuEMVfYLMbRx61hbuqnKceLeDcDA==", - "license": "MIT", - "optional": true, - "dependencies": { - "protobufjs": "^6.8.8" - } - }, - "node_modules/onnx-proto/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/onnx-proto/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "optional": true, - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/onnxruntime-common": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-common/-/onnxruntime-common-1.14.0.tgz", - "integrity": "sha512-3LJpegM2iMNRX2wUmtYfeX/ytfOzNwAWKSq1HbRrKc9+uqG/FsEA0bbKZl1btQeZaXhC26l44NWpNUeXPII7Ew==", - "license": "MIT", - "optional": true - }, - "node_modules/onnxruntime-node": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-node/-/onnxruntime-node-1.14.0.tgz", - "integrity": "sha512-5ba7TWomIV/9b6NH/1x/8QEeowsb+jBEvFzU6z0T4mNsFwdPqXeFUM7uxC6QeSRkEbWu3qEB0VMjrvzN/0S9+w==", - "license": "MIT", - "optional": true, - "os": [ - "win32", - "darwin", - "linux" - ], - "dependencies": { - "onnxruntime-common": "~1.14.0" - } - }, - "node_modules/onnxruntime-web": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/onnxruntime-web/-/onnxruntime-web-1.14.0.tgz", - "integrity": "sha512-Kcqf43UMfW8mCydVGcX9OMXI2VN17c0p6XvR7IPSZzBf/6lteBzXHvcEVWDPmCKuGombl997HgLqj91F11DzXw==", - "license": "MIT", - "optional": true, - "dependencies": { - "flatbuffers": "^1.12.0", - "guid-typescript": "^1.0.9", - "long": "^4.0.0", - "onnx-proto": "^4.0.4", - "onnxruntime-common": "~1.14.0", - "platform": "^1.3.6" - } - }, - "node_modules/onnxruntime-web/node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/ora": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", - "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", - "license": "MIT", - "optional": true, - "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.9.0", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.3.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "string-width": "^6.1.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "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", - "optional": true - }, - "node_modules/ora/node_modules/string-width": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", - "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^10.2.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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", - "optional": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "optional": true - }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT", - "optional": true - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC", - "optional": true - }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", - "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "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/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", - "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "optional": true, - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pipenet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pipenet/-/pipenet-1.4.0.tgz", - "integrity": "sha512-Uc3EH2i8hnJUD0Eupj9z2jaZPjjAbooaiHGh0iFdExbE8/BDt6Lf0919Dtwx5VM83elHNWFzCOsvzsViTD5YZg==", - "optional": true, - "dependencies": { - "axios": "^1.7.3", - "debug": "^4.3.6", - "human-readable-ids": "^1.0.4", - "koa": "^3.1.1", - "koa-router": "^14.0.0", - "pump": "^3.0.3", - "tldjs": "^2.3.2", - "yargs": "^18.0.0" - }, - "bin": { - "pipenet": "dist/cli.js" - }, - "engines": { - "node": ">=22.0.0" - } - }, - "node_modules/pipenet/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/pipenet/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", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pipenet/node_modules/cliui": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", - "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^7.2.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/pipenet/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/pipenet/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", - "optional": true - }, - "node_modules/pipenet/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", - "optional": true - }, - "node_modules/pipenet/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", - "optional": true, - "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/pipenet/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", - "optional": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/pipenet/node_modules/wrap-ansi": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", - "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/pipenet/node_modules/yargs": { - "version": "18.0.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", - "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", - "license": "MIT", - "optional": true, - "dependencies": { - "cliui": "^9.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "string-width": "^7.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^22.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "node_modules/pipenet/node_modules/yargs-parser": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", - "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", - "license": "ISC", - "optional": true, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=23" - } - }, - "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", - "optional": true, - "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", - "optional": true - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prebuild-install": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", - "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", - "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.0", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^2.0.0", - "node-abi": "^3.3.0", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^4.0.0", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "license": "ISC", - "optional": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "license": "MIT", - "optional": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/promise-retry/node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "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", - "optional": true, - "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", - "optional": true - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", - "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", - "optional": true, - "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", - "optional": true, - "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)", - "optional": true, - "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", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "esprima": "~4.0.0" - } - }, - "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", - "optional": true, - "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/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/require-in-the-middle/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "optional": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/require-in-the-middle/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", - "optional": true - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "license": "MIT", - "optional": true - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true, - "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", - "optional": true - }, - "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", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/ruvector": { - "version": "0.1.99", - "resolved": "https://registry.npmjs.org/ruvector/-/ruvector-0.1.99.tgz", - "integrity": "sha512-aYr88JDXHSs/sdvySJlQDsyS0dd8XR9Z6wMavgZgJyzvRFuRW8IPuOMgVVFtdSvPQk+5kTz2E0nQ9TZ7rcmVfg==", - "license": "MIT", - "optional": true, - "dependencies": { - "@modelcontextprotocol/sdk": "^1.0.0", - "@ruvector/attention": "^0.1.3", - "@ruvector/core": "^0.1.25", - "@ruvector/gnn": "^0.1.22", - "@ruvector/sona": "^0.1.4", - "chalk": "^4.1.2", - "commander": "^11.1.0", - "ora": "^5.4.1" - }, - "bin": { - "ruvector": "bin/cli.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@ruvector/rvf": "^0.1.0" - } - }, - "node_modules/ruvector-attention-wasm": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/ruvector-attention-wasm/-/ruvector-attention-wasm-0.1.32.tgz", - "integrity": "sha512-2pt5dhcpHXXhNEVXeeDPzshXlGo3X8vWVuMfLA+fjUuXYFsW2YYrmUSgHOvEuqVxxow2Rgn9sZpxWQSBuT470g==", - "license": "MIT OR Apache-2.0", - "optional": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/ruvector-core-darwin-arm64": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/ruvector-core-darwin-arm64/-/ruvector-core-darwin-arm64-0.1.29.tgz", - "integrity": "sha512-gjZ1/J/0Nh9Mn74VdifIIkPLP/M4FqD/g+QVxWcfWcNFWhHVz+zHyxGjc6gJgrfYBquiMyP5jLfvyR3TffLanQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/ruvector-core-darwin-x64": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/ruvector-core-darwin-x64/-/ruvector-core-darwin-x64-0.1.29.tgz", - "integrity": "sha512-SNq2DrIBWM53qG3YSYcNV/BnBbAoJouafAADOjG3PkM8+RPrIucTeUDBavf148DNo5ZI337IS8TK1/0HpJEwFg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/ruvector-core-linux-arm64-gnu": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/ruvector-core-linux-arm64-gnu/-/ruvector-core-linux-arm64-gnu-0.1.29.tgz", - "integrity": "sha512-gcA2qSQD9nEeHR8pIXr5SKpQAiHMxu4EyBUwUSG4UnWOxVQnnU0l2kA/Z2NZ6B+JWLrb5+nhkkv7AaSmb8YAsg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/ruvector-core-linux-x64-gnu": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/ruvector-core-linux-x64-gnu/-/ruvector-core-linux-x64-gnu-0.1.29.tgz", - "integrity": "sha512-GcYCVNRbAmiXmEaMNvVnA78ZIM469H0VwP2JFGfibwiSASBgWGX3BT+mqflX+gtBynbtQqslj8XcqVdDxEkEBg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/ruvector-core-win32-x64-msvc": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/ruvector-core-win32-x64-msvc/-/ruvector-core-win32-x64-msvc-0.1.29.tgz", - "integrity": "sha512-nqHrlUAKpTreGO87jQLtFVrQUBT/7J/dBsPD5/mV9Fet/shncN0QMij7YqBTrlhR9qtQ2gAUGrG0zw69T60AiQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/ruvector-onnx-embeddings-wasm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ruvector-onnx-embeddings-wasm/-/ruvector-onnx-embeddings-wasm-0.1.2.tgz", - "integrity": "sha512-U1Xx7BivMkbAns+bXl1J3b2bey4HZzdOwL3CCElxkNXKqP5BMZDYiVnzHmcaYwQ74Qg3iPNpPH5LHR4UOoUMIQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/ruvector/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/ruvector/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/ruvector/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", - "optional": true, - "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/ruvector/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "license": "MIT", - "optional": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ruvector/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/ruvector/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ruvector/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ruvector/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "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", - "optional": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "node_modules/ruvector/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", - "optional": true, "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ruvector/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "license": "MIT", - "optional": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "tslib": "^2.1.0" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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==", + "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/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", - "license": "ISC", - "optional": true, - "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", - "optional": true - }, - "node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "node_modules/body-parser": { + "version": "1.20.8", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.8.tgz", + "integrity": "sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA==", "license": "MIT", "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", "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", + "destroy": "~1.2.0", "http-errors": "~2.0.1", - "mime": "1.6.0", - "ms": "2.1.3", + "iconv-lite": "~0.4.24", "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", - "optional": true, - "dependencies": { - "type-fest": "^0.13.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/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)", - "optional": true, - "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", - "optional": true - }, - "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.32.6", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", - "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.2", - "node-addon-api": "^6.1.0", - "prebuild-install": "^7.1.1", - "semver": "^7.5.4", - "simple-get": "^4.0.1", - "tar-fs": "^3.0.4", - "tunnel-agent": "^0.6.0" + "qs": "~6.16.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=14.15.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - } - }, - "node_modules/sharp/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", - "optional": true - }, - "node_modules/sharp/node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", - "license": "MIT", - "optional": true, - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/sharp/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "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==", + "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", - "optional": true, "dependencies": { - "shebang-regex": "^3.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.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", - "optional": true, - "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "license": "BSD-2-Clause", - "optional": true - }, - "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==", + "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": { - "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": ">= 0.8" } }, - "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==", + "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", - "object-inspect": "^1.13.3" + "function-bind": "^1.1.2" }, "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==", + "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-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -11325,422 +128,328 @@ "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==", + "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": { - "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" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "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", - "optional": true - }, - "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", - "optional": true - }, - "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" - } - ], + "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", - "optional": true, - "dependencies": { - "decompress-response": "^6.0.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/skin-tone": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", - "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "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", - "optional": true, "dependencies": { - "unicode-emoji-modifier-base": "^1.0.0" + "object-assign": "^4", + "vary": "^1" }, "engines": { - "node": ">=8" + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "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", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/socks": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", - "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "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", - "optional": true, - "dependencies": { - "ip-address": "^10.0.1", - "smart-buffer": "^4.2.0" - }, "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" + "node": ">= 0.8" } }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, "engines": { - "node": ">= 10" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "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", - "optional": true, "dependencies": { - "ms": "^2.1.3" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.4" } }, - "node_modules/socks-proxy-agent/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", - "optional": true - }, - "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", - "optional": true - }, - "node_modules/sql.js": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.14.0.tgz", - "integrity": "sha512-NXYh+kFqLiYRCNAaHD0PcbjFgXyjuolEKLMk5vRt2DgPENtF1kkNzzMlg42dUk5wIsH8MhUzsRhaUxIisoSlZQ==", - "license": "MIT", - "optional": 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/sqlite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", - "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "optional": true - }, - "node_modules/sqlite3": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz", - "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "bindings": "^1.5.0", - "node-addon-api": "^7.0.0", - "prebuild-install": "^7.1.1", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } + "engines": { + "node": ">= 0.8" } }, - "node_modules/sqlite3/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==", + "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", - "optional": true - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, "engines": { - "node": ">= 8" + "node": ">= 0.4" } }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "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.8" + "node": ">= 0.4" } }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", - "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "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", - "optional": true, "dependencies": { - "bl": "^5.0.0" + "es-errors": "^1.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", - "license": "MIT", - "optional": true, - "dependencies": { - "events-universal": "^1.0.0", - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" + "node": ">= 0.4" } }, - "node_modules/strict-event-emitter-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz", - "integrity": "sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==", - "license": "ISC", - "optional": true + "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/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==", + "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", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" + "engines": { + "node": ">= 0.6" } }, - "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==", + "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", - "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "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": ">=8" + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "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==", + "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.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "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", - "optional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "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==", + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "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", - "optional": true, - "engines": { - "node": ">=18" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=0.10.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strtok3": { - "version": "10.3.4", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", - "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", + "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", - "optional": true, "dependencies": { - "@tokenizer/token": "^0.3.0" + "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": ">=18" + "node": ">= 0.4" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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", - "optional": true, "dependencies": { - "has-flag": "^4.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/supports-hyperlinks": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", - "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "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", - "optional": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, "engines": { - "node": ">=14.18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "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", - "optional": true, "engines": { "node": ">= 0.4" }, @@ -11748,657 +457,459 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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 exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "optional": true, + "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": { - "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" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "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", - "optional": true, "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "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/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "license": "ISC", - "optional": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "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", - "optional": true, "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/tar-stream/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.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/tar-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "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", - "optional": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "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", - "optional": true, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/teex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", - "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "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/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", - "optional": true, - "dependencies": { - "streamx": "^2.12.5" + "engines": { + "node": ">= 0.4" } }, - "node_modules/text-decoder": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", - "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "b4a": "^1.6.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/tiktoken": { - "version": "1.0.22", - "resolved": "https://registry.npmjs.org/tiktoken/-/tiktoken-1.0.22.tgz", - "integrity": "sha512-PKvy1rVF1RibfF3JlXBSP0Jrcw2uq3yXdgcEXtKTYn3QJ/cBRBHDnrJ5jHky+MENZ6DIPwNUGWpkVx+7joCpNA==", + "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", - "optional": true + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/tldjs": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tldjs/-/tldjs-2.3.2.tgz", - "integrity": "sha512-EORDwFMSZKrHPUVDhejCMDeAovRS5d8jZKiqALFiPp3cjKjEldPkxBY39ZSx3c45awz3RpKwJD1cCgGxEfy8/A==", - "hasInstallScript": 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", - "optional": true, - "dependencies": { - "punycode": "^2.0.0" - }, "engines": { - "node": ">= 20" + "node": ">= 0.6" } }, - "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==", + "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", - "optional": true, - "dependencies": { - "is-number": "^7.0.0" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8.0" + "node": ">=4" } }, - "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==", + "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": ">= 0.6" } }, - "node_modules/token-types": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", - "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", + "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", - "optional": true, "dependencies": { - "@borewit/text-codec": "^0.2.1", - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">= 0.6" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT", - "optional": true - }, - "node_modules/ts-algebra": { + "node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-algebra/-/ts-algebra-2.0.0.tgz", - "integrity": "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==", - "license": "MIT", - "optional": true - }, - "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 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "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", - "optional": true, - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "license": "(MIT OR CC0-1.0)", - "optional": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.6" } }, - "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==", + "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", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/uint8array-extras": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", - "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", + "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", - "optional": true, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ulid": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/ulid/-/ulid-3.0.2.tgz", - "integrity": "sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==", - "license": "MIT", - "optional": true, - "bin": { - "ulid": "dist/cli.js" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/undici": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.22.0.tgz", - "integrity": "sha512-RqslV2Us5BrllB+JeiZnK4peryVTndy9Dnqq62S3yYRRTj0tFQCwEniUy2167skdGOy3vqRzEvl1Dm4sV2ReDg==", + "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", - "optional": true, + "dependencies": { + "ee-first": "1.1.1" + }, "engines": { - "node": ">=20.18.1" + "node": ">= 0.8" } }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "license": "MIT", - "optional": true - }, - "node_modules/unicode-emoji-modifier-base": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", - "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "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", - "optional": true, "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "node_modules/path-to-regexp": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.8.tgz", + "integrity": "sha512-5nnx0yGyVUcY6t9RnWcARWtwT9F1D8O9rt08htPvnd49W1IgZtmLkhu9WfMzQj1cFxjHIO6connUNVW5k7AVyQ==", "license": "MIT", - "optional": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, "engines": { - "node": ">=18" + "node": ">= 0.10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "license": "ISC", - "optional": true, - "dependencies": { - "unique-slug": "^2.0.0" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "license": "ISC", - "optional": true, + "node_modules/qs": { + "version": "6.16.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.16.0.tgz", + "integrity": "sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==", + "license": "BSD-3-Clause", "dependencies": { - "imurmurhash": "^0.1.4" + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "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.8" + "node": ">= 0.6" } }, - "node_modules/uri-templates": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", - "integrity": "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==", - "license": "http://geraintluff.github.io/tv4/LICENSE.txt", - "optional": true - }, - "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", - "optional": true - }, - "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==", + "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.4.0" + "node": ">=0.10.0" } }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "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": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" + { + "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", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "license": "MIT" }, - "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/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/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", "license": "MIT", - "optional": true, "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "license": "MIT", - "optional": true, + "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": ">= 8" + "node": ">= 0.8.0" } }, - "node_modules/webcrypto-core": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.8.1.tgz", - "integrity": "sha512-P+x1MvlNCXlKbLSOY4cYrdreqPG5hbzkmawbcXLKN/mf6DZW0SdNNkZ+sjwsqVkI4A4Ko2sPZmkZtCKY58w83A==", + "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/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", "license": "MIT", - "optional": true, "dependencies": { - "@peculiar/asn1-schema": "^2.3.13", - "@peculiar/json-schema": "^1.1.12", - "asn1js": "^3.0.5", - "pvtsutils": "^1.3.5", - "tslib": "^2.7.0" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "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==", - "license": "BSD-2-Clause", - "optional": true + "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/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "license": "MIT", - "optional": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "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", - "optional": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "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", - "optional": true, - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "license": "MIT", - "optional": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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", - "optional": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wrappy": { + "node_modules/side-channel-weakmap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC", - "optional": 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==", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "license": "MIT", - "optional": true, - "engines": { - "node": ">=10.0.0" + "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" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "license": "MIT", - "optional": true, "engines": { - "node": ">=0.4" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "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", - "optional": true - }, - "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", - "license": "ISC", - "optional": true, - "bin": { - "yaml": "bin.mjs" - }, + "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": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" + "node": ">=0.6" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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", - "optional": true, "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" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "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", - "optional": true, - "engines": { - "node": ">=12" + "node": ">= 0.6" } }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "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", - "optional": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "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", - "optional": true, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4.0" } }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "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", - "peer": true, - "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", - "optional": true, - "peer": true, - "peerDependencies": { - "zod": "^3.25 || ^4" + "engines": { + "node": ">= 0.8" } } } diff --git a/package.json b/package.json index 6e156d3..f641a6c 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ }, "dependencies": { "ajv": "^8.17.1", - "claude-flow": "^3.0.0-alpha.179", "cors": "^2.8.5", "express": "^4.21.2" + }, + "overrides": { + "qs": "6.16.0" } } diff --git a/test.js b/test.js index a35a10d..fab104b 100644 --- a/test.js +++ b/test.js @@ -1,6 +1,7 @@ 'use strict'; const http = require('http'); +process.env.CORS_ALLOWED_ORIGINS = 'https://console.example.com'; const { handler } = require('./index'); const PORT = 0; // Random available port @@ -22,7 +23,7 @@ function request(method, path, body, extraHeaders) { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { - resolve({ status: res.statusCode, body: JSON.parse(data) }); + resolve({ status: res.statusCode, headers: res.headers, body: JSON.parse(data) }); }); }); req.on('error', reject); @@ -177,6 +178,22 @@ async function runTests() { assert(we.status === 200, 'status 200'); const wed = we.body.signal.payload.data; assert(wed.confidence > w.body.signal.payload.data.confidence, 'more evidence produces higher confidence'); + + // ---- CORS allowlist ---- + console.log('\n[11] CORS exact-origin allowlist'); + const allowedOrigin = await request('GET', '/health', null, { Origin: 'https://console.example.com' }); + assert(allowedOrigin.status === 200, 'allowed origin request succeeds'); + assert(allowedOrigin.headers['access-control-allow-origin'] === 'https://console.example.com', 'configured origin receives CORS header'); + assert(allowedOrigin.headers['access-control-allow-credentials'] === 'true', 'configured origin may use credentials'); + + const deniedOrigin = await request('GET', '/health', null, { Origin: 'https://attacker.example' }); + assert(deniedOrigin.status === 200, 'unconfigured origin does not affect server-to-server behavior'); + assert(!deniedOrigin.headers['access-control-allow-origin'], 'unconfigured origin receives no CORS header'); + assert(!deniedOrigin.headers['access-control-allow-credentials'], 'unconfigured origin receives no credential permission'); + + const noOrigin = await request('GET', '/health'); + assert(noOrigin.status === 200, 'request without Origin succeeds'); + assert(!noOrigin.headers['access-control-allow-origin'], 'request without Origin does not advertise browser access'); } // Boot server and run From 7ae4c4d2892c37ec6c5a2665c48e7e49fc76467f Mon Sep 17 00:00:00 2001 From: Nick Ruest <127058086+nicholas-ruest@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:06:56 -0400 Subject: [PATCH 2/5] ci: restore deterministic Rust validation --- .github/workflows/cd.yml | 2 +- .github/workflows/ci.yml | 77 +++- Cargo.lock | 36 +- Cargo.toml | 8 +- Dockerfile | 2 +- README.md | 4 +- benches/latency.rs | 14 +- benches/throughput.rs | 45 +-- docker-compose.yml | 2 +- .../2026-10-09-cors-supply-chain.md | 55 ++- rust-toolchain.toml | 2 +- src/adapters/intelligence.rs | 75 ++-- src/adapters/latency_lens.rs | 4 +- src/adapters/memory_graph.rs | 90 +++-- src/adapters/mod.rs | 39 +- src/adapters/observatory.rs | 38 +- src/adapters/router.rs | 61 ++- src/adapters/ruvvector.rs | 190 +++++---- src/benchmarks/adapters.rs | 124 +++++- src/benchmarks/io.rs | 12 +- src/benchmarks/markdown.rs | 32 +- src/cli/commands.rs | 378 ++++++++++++------ src/cli/mod.rs | 7 +- src/config/chaos.rs | 139 ++++--- src/config/latency.rs | 120 +++--- src/config/mod.rs | 103 +++-- src/config/models.rs | 2 +- src/config/security.rs | 57 +-- src/engine/chaos.rs | 104 ++--- src/engine/generator.rs | 166 ++++++-- src/engine/mod.rs | 258 +++++++----- src/engine/state.rs | 25 +- src/error.rs | 19 +- src/infra/cache.rs | 27 +- src/infra/mod.rs | 4 +- src/infra/retry.rs | 30 +- src/latency/mod.rs | 30 +- src/latency/sampler.rs | 16 +- src/lib.rs | 22 +- src/main.rs | 27 +- src/providers/anthropic.rs | 19 +- src/providers/google.rs | 42 +- src/providers/mod.rs | 27 +- src/providers/openai.rs | 68 ++-- src/sdk/builder.rs | 77 ++-- src/sdk/client.rs | 92 +++-- src/sdk/config.rs | 5 +- src/sdk/error.rs | 54 ++- src/sdk/mod.rs | 9 +- src/sdk/streaming.rs | 36 +- src/security/api_key.rs | 53 ++- src/security/headers.rs | 17 +- src/security/middleware.rs | 34 +- src/security/mod.rs | 4 +- src/security/rate_limit.rs | 48 ++- src/server/handlers.rs | 141 ++++--- src/server/middleware.rs | 30 +- src/server/mod.rs | 61 ++- src/server/routes.rs | 5 +- src/server/shutdown.rs | 8 +- src/server/state.rs | 4 +- src/server/streaming.rs | 99 +++-- src/telemetry/metrics.rs | 98 +++-- src/telemetry/mod.rs | 31 +- src/telemetry/tracing_ext.rs | 83 +++- src/types/messages.rs | 48 ++- src/types/request.rs | 20 +- src/types/response.rs | 23 +- src/types/streaming.rs | 22 +- tests/integration/anthropic_tests.rs | 32 +- tests/integration/common.rs | 14 +- tests/integration/failure_tests.rs | 25 +- tests/integration/google_tests.rs | 27 +- tests/integration/mod.rs | 8 +- tests/integration/openai_tests.rs | 38 +- tests/integration/security_tests.rs | 2 +- tests/integration/streaming_tests.rs | 19 +- tests/property/config_tests.rs | 10 +- tests/property/latency_tests.rs | 7 +- tests/property/mod.rs | 2 +- tests/property/serialization_tests.rs | 3 +- 81 files changed, 2456 insertions(+), 1435 deletions(-) diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 13bfa55..53936fe 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -51,7 +51,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + toolchain: 1.83.0 override: true - name: Build release binary diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd3849a..fa2a31b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,24 +28,29 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + toolchain: 1.83.0 components: rustfmt, clippy override: true + - name: Setup Protocol Buffers compiler + uses: arduino/setup-protoc@v3 + with: + version: '25.1' + - name: Cache cargo registry - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo/git key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} @@ -70,11 +75,13 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + # cargo-audit 0.22.2 needs Rust 1.88 and can audit an older-MSRV + # lockfile independently of the project's build toolchain. + toolchain: 1.88.0 override: true - name: Install cargo-audit - run: cargo install cargo-audit + run: cargo install cargo-audit --version 0.22.2 --locked - name: Run security audit run: cargo audit @@ -82,6 +89,31 @@ jobs: - name: Run cargo-deny uses: EmbarkStudios/cargo-deny-action@v1 + # ---------------------------------------------------------------------------- + # Node API Regression and Supply-chain Checks + # ---------------------------------------------------------------------------- + node: + name: Node API Tests and Audit + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: npm + + - name: Install locked dependencies + run: npm ci + + - name: Run Node regression tests + run: npm test + + - name: Audit production dependencies + run: npm audit --omit=dev + # ---------------------------------------------------------------------------- # Build and Test # ---------------------------------------------------------------------------- @@ -89,9 +121,10 @@ jobs: name: Build and Test runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] - rust: [1.75.0] + rust: [1.83.0] steps: - name: Checkout code uses: actions/checkout@v4 @@ -104,19 +137,19 @@ jobs: override: true - name: Cache cargo registry - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo/git key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} @@ -129,7 +162,7 @@ jobs: - name: Upload build artifacts if: matrix.os == 'ubuntu-latest' - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: llm-simulator-${{ matrix.os }} path: target/release/llm-simulator @@ -149,11 +182,16 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + toolchain: 1.83.0 override: true + - name: Setup Protocol Buffers compiler + uses: arduino/setup-protoc@v3 + with: + version: '25.1' + - name: Install tarpaulin - run: cargo install cargo-tarpaulin + run: cargo install cargo-tarpaulin --version 0.31.3 --locked - name: Generate coverage run: cargo tarpaulin --verbose --all-features --workspace --timeout 300 --out Xml @@ -171,7 +209,7 @@ jobs: docker: name: Docker Build and Push runs-on: ubuntu-latest - needs: [lint, security, build] + needs: [lint, security, node, build] permissions: contents: read packages: write @@ -238,7 +276,7 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + toolchain: 1.83.0 override: true - name: Run integration tests @@ -261,14 +299,14 @@ jobs: uses: actions-rs/toolchain@v1 with: profile: minimal - toolchain: 1.75.0 + toolchain: 1.83.0 override: true - name: Run benchmarks run: cargo bench --no-fail-fast - name: Upload benchmark results - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: benchmark-results path: target/criterion @@ -313,7 +351,8 @@ jobs: - name: Validate Kubernetes manifests run: | - kubectl apply --dry-run=client -f deploy/kubernetes/ + # Parse manifests locally; kubeval below performs schema validation. + kubectl apply --dry-run=client --validate=false -f deploy/kubernetes/ - name: Install kubeval run: | @@ -330,7 +369,7 @@ jobs: notify: name: Notify runs-on: ubuntu-latest - needs: [lint, security, build, docker, integration, helm, k8s] + needs: [lint, security, node, build, docker, integration, helm, k8s] if: always() steps: - name: Send Slack notification diff --git a/Cargo.lock b/Cargo.lock index d26145f..5d78346 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "adler2" @@ -475,9 +475,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cast" @@ -760,9 +760,9 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.18" +version = "0.9.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" dependencies = [ "crossbeam-utils", ] @@ -946,7 +946,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1270,9 +1270,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.12" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +checksum = "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27" dependencies = [ "atomic-waker", "bytes", @@ -1521,7 +1521,7 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2 0.4.12", + "h2 0.4.16", "http 1.4.0", "http-body 1.0.1", "httparse", @@ -1591,7 +1591,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.1", + "socket2 0.5.10", "system-configuration 0.6.1", "tokio", "tower-service", @@ -1802,7 +1802,7 @@ checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -1890,7 +1890,7 @@ checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "llm-latency-lens-core" version = "0.1.0" -source = "git+https://github.com/LLM-Dev-Ops/latency-lens?branch=main#22b825ef309c2cbb14e1ba528945b853c3aeccde" +source = "git+https://github.com/LLM-Dev-Ops/latency-lens?rev=22b825ef309c2cbb14e1ba528945b853c3aeccde#22b825ef309c2cbb14e1ba528945b853c3aeccde" dependencies = [ "anyhow", "chrono", @@ -1906,7 +1906,7 @@ dependencies = [ [[package]] name = "llm-memory-graph" version = "0.1.0" -source = "git+https://github.com/LLM-Dev-Ops/memory-graph?branch=main#c34247bccf443f1dbaa678c9e146c42f7eda5478" +source = "git+https://github.com/LLM-Dev-Ops/memory-graph?rev=9acd0228098df03b50361769993571fa5ab549bf#9acd0228098df03b50361769993571fa5ab549bf" dependencies = [ "anyhow", "async-stream", @@ -1944,7 +1944,7 @@ dependencies = [ [[package]] name = "llm-memory-graph-types" version = "0.1.0" -source = "git+https://github.com/LLM-Dev-Ops/memory-graph?branch=main#c34247bccf443f1dbaa678c9e146c42f7eda5478" +source = "git+https://github.com/LLM-Dev-Ops/memory-graph?rev=9acd0228098df03b50361769993571fa5ab549bf#9acd0228098df03b50361769993571fa5ab549bf" dependencies = [ "bincode", "chrono", @@ -1962,7 +1962,7 @@ dependencies = [ [[package]] name = "llm-observatory-core" version = "0.1.1" -source = "git+https://github.com/LLM-Dev-Ops/observatory?branch=main#6813701693cc85094ea6c52cb00ad4911446b096" +source = "git+https://github.com/LLM-Dev-Ops/observatory?rev=6813701693cc85094ea6c52cb00ad4911446b096#6813701693cc85094ea6c52cb00ad4911446b096" dependencies = [ "anyhow", "async-trait", @@ -3235,7 +3235,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -3688,7 +3688,7 @@ dependencies = [ "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys 0.52.0", ] [[package]] @@ -4595,7 +4595,7 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.61.2", + "windows-sys 0.48.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9cc6d2e..871a9d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ license = "LicenseRef-LLM-DevOps" repository = "https://github.com/llm-devops/llm-simulator" keywords = ["llm", "simulator", "testing", "api", "openai"] categories = ["development-tools", "simulation", "web-programming"] -rust-version = "1.75" +rust-version = "1.83" [features] default = [] @@ -87,9 +87,9 @@ validator = { version = "0.16", features = ["derive"] } # LLM-Dev-Ops Phase 2B Dependencies (compile-time only, optional features) # These are gated behind feature flags due to upstream compilation status -llm-latency-lens-core = { git = "https://github.com/LLM-Dev-Ops/latency-lens", branch = "main", optional = true } -llm-observatory-core = { git = "https://github.com/LLM-Dev-Ops/observatory", branch = "main", optional = true } -llm-memory-graph = { git = "https://github.com/LLM-Dev-Ops/memory-graph", branch = "main", optional = true } +llm-latency-lens-core = { git = "https://github.com/LLM-Dev-Ops/latency-lens", rev = "22b825ef309c2cbb14e1ba528945b853c3aeccde", optional = true } +llm-observatory-core = { git = "https://github.com/LLM-Dev-Ops/observatory", rev = "6813701693cc85094ea6c52cb00ad4911446b096", optional = true } +llm-memory-graph = { git = "https://github.com/LLM-Dev-Ops/memory-graph", rev = "9acd0228098df03b50361769993571fa5ab549bf", optional = true } # HTTP client (for health checks and SDK) reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls", "stream"] } diff --git a/Dockerfile b/Dockerfile index ffb6702..516ecf3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ # Multi-stage build for minimal production image # Build stage -FROM rust:1.75-bookworm AS builder +FROM rust:1.83-bookworm AS builder WORKDIR /app diff --git a/README.md b/README.md index 83beaec..478bb04 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Enterprise-grade offline LLM API simulator for testing and development. -[![Rust](https://img.shields.io/badge/rust-1.75%2B-orange.svg)](https://www.rust-lang.org/) +[![Rust](https://img.shields.io/badge/rust-1.83%2B-orange.svg)](https://www.rust-lang.org/) [![License](https://img.shields.io/badge/license-LLM--DevOps-blue.svg)](LICENSE) ## Overview @@ -59,7 +59,7 @@ cargo build --release ``` ### Requirements -- Rust 1.75 or later +- Rust 1.83 or later - Linux, macOS, or Windows ## Quick Start diff --git a/benches/latency.rs b/benches/latency.rs index 92ea2ba..cb8ee59 100644 --- a/benches/latency.rs +++ b/benches/latency.rs @@ -2,7 +2,7 @@ use criterion::{black_box, criterion_group, criterion_main, Criterion}; use llm_simulator::config::{LatencyConfig, LatencyDistribution}; -use llm_simulator::latency::{LatencySimulator, DistributionSampler}; +use llm_simulator::latency::{DistributionSampler, LatencySimulator}; fn bench_distribution_sampling(c: &mut Criterion) { let sampler = DistributionSampler::with_seed(42); @@ -11,18 +11,14 @@ fn bench_distribution_sampling(c: &mut Criterion) { // Fixed distribution let fixed = LatencyDistribution::Fixed { value_ms: 100.0 }; - group.bench_function("fixed", |b| { - b.iter(|| black_box(sampler.sample(&fixed))) - }); + group.bench_function("fixed", |b| b.iter(|| black_box(sampler.sample(&fixed)))); // Normal distribution let normal = LatencyDistribution::Normal { mean_ms: 100.0, std_dev_ms: 20.0, }; - group.bench_function("normal", |b| { - b.iter(|| black_box(sampler.sample(&normal))) - }); + group.bench_function("normal", |b| b.iter(|| black_box(sampler.sample(&normal)))); // Log-normal distribution let log_normal = LatencyDistribution::LogNormal { @@ -53,9 +49,7 @@ fn bench_distribution_sampling(c: &mut Criterion) { scale_ms: 10.0, shape: 2.0, }; - group.bench_function("pareto", |b| { - b.iter(|| black_box(sampler.sample(&pareto))) - }); + group.bench_function("pareto", |b| b.iter(|| black_box(sampler.sample(&pareto)))); group.finish(); } diff --git a/benches/throughput.rs b/benches/throughput.rs index a27948c..a18e1a5 100644 --- a/benches/throughput.rs +++ b/benches/throughput.rs @@ -1,8 +1,8 @@ //! Throughput benchmarks for LLM-Simulator use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput}; -use llm_simulator::{SimulatorConfig, SimulationEngine}; -use llm_simulator::types::{Message, ChatCompletionRequest}; +use llm_simulator::types::{ChatCompletionRequest, Message}; +use llm_simulator::{SimulationEngine, SimulatorConfig}; use tokio::runtime::Runtime; fn create_engine() -> SimulationEngine { @@ -29,11 +29,7 @@ fn bench_chat_completion(c: &mut Criterion) { group.throughput(Throughput::Elements(1)); group.bench_function("single_request", |b| { - b.iter(|| { - rt.block_on(async { - black_box(engine.chat_completion(&request).await.unwrap()) - }) - }) + b.iter(|| rt.block_on(async { black_box(engine.chat_completion(&request).await.unwrap()) })) }); group.finish(); @@ -43,10 +39,7 @@ fn bench_concurrent_requests(c: &mut Criterion) { let rt = Runtime::new().unwrap(); let engine = std::sync::Arc::new(create_engine()); - let request = ChatCompletionRequest::new( - "gpt-4", - vec![Message::user("Hello")], - ); + let request = ChatCompletionRequest::new("gpt-4", vec![Message::user("Hello")]); let mut group = c.benchmark_group("concurrent_requests"); @@ -55,13 +48,13 @@ fn bench_concurrent_requests(c: &mut Criterion) { group.bench_function(format!("concurrent_{}", concurrency), |b| { b.iter(|| { rt.block_on(async { - let tasks: Vec<_> = (0..*concurrency).map(|_| { - let engine = engine.clone(); - let req = request.clone(); - tokio::spawn(async move { - engine.chat_completion(&req).await.unwrap() + let tasks: Vec<_> = (0..*concurrency) + .map(|_| { + let engine = engine.clone(); + let req = request.clone(); + tokio::spawn(async move { engine.chat_completion(&req).await.unwrap() }) }) - }).collect(); + .collect(); for task in tasks { black_box(task.await.unwrap()); @@ -78,7 +71,7 @@ fn bench_embeddings(c: &mut Criterion) { let rt = Runtime::new().unwrap(); let engine = create_engine(); - use llm_simulator::types::{EmbeddingsRequest, EmbeddingInput}; + use llm_simulator::types::{EmbeddingInput, EmbeddingsRequest}; let request = EmbeddingsRequest { model: "text-embedding-ada-002".to_string(), @@ -92,11 +85,7 @@ fn bench_embeddings(c: &mut Criterion) { group.throughput(Throughput::Elements(1)); group.bench_function("single_embedding", |b| { - b.iter(|| { - rt.block_on(async { - black_box(engine.embeddings(&request).await.unwrap()) - }) - }) + b.iter(|| rt.block_on(async { black_box(engine.embeddings(&request).await.unwrap()) })) }); // Batch embeddings @@ -117,9 +106,7 @@ fn bench_embeddings(c: &mut Criterion) { group.throughput(Throughput::Elements(5)); group.bench_function("batch_5_embeddings", |b| { b.iter(|| { - rt.block_on(async { - black_box(engine.embeddings(&batch_request).await.unwrap()) - }) + rt.block_on(async { black_box(engine.embeddings(&batch_request).await.unwrap()) }) }) }); @@ -127,8 +114,8 @@ fn bench_embeddings(c: &mut Criterion) { } fn bench_response_generation(c: &mut Criterion) { - use llm_simulator::engine::ResponseGenerator; use llm_simulator::config::GenerationConfig; + use llm_simulator::engine::ResponseGenerator; let generator = ResponseGenerator::with_seed(42); let messages = vec![Message::user("Hello!")]; @@ -139,9 +126,7 @@ fn bench_response_generation(c: &mut Criterion) { for token_count in [100, 500, 1000, 2000].iter() { group.throughput(Throughput::Elements(*token_count as u64)); group.bench_function(format!("generate_{}_tokens", token_count), |b| { - b.iter(|| { - black_box(generator.generate_response(&messages, *token_count, &config)) - }) + b.iter(|| black_box(generator.generate_response(&messages, *token_count, &config))) }); } diff --git a/docker-compose.yml b/docker-compose.yml index d2a66d6..73e35a4 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,7 +20,7 @@ services: dockerfile: Dockerfile target: runtime args: - - RUST_VERSION=1.75 + - RUST_VERSION=1.83 container_name: llm-simulator hostname: llm-simulator restart: unless-stopped diff --git a/docs/metaharness/2026-10-09-cors-supply-chain.md b/docs/metaharness/2026-10-09-cors-supply-chain.md index 3d80e1d..18c17f1 100644 --- a/docs/metaharness/2026-10-09-cors-supply-chain.md +++ b/docs/metaharness/2026-10-09-cors-supply-chain.md @@ -12,6 +12,9 @@ The candidate is accepted only if all of the following remain true: nor `Access-Control-Allow-Credentials`. 4. Requests without an `Origin` header continue to work. 5. Production audit findings and dependency count do not regress. +6. Rust formatting and strict all-target/all-feature Clippy pass. +7. The release unit, integration, property, and doc-test suites pass. +8. CI remains Linux-first and validates every OS matrix entry without fail-fast cancellation. The project source change is separate from Darwin's harness-policy search. The evaluation model was fixed as a deterministic proposer with no LLM call. @@ -34,10 +37,42 @@ evaluation model was fixed as a deterministic proposer with no LLM call. | Production dependency total | 903 | 75 | | Test command exit | 0 | 0 | | Audit command exit | 1 | 0 | +| `cargo fmt --all -- --check` | 1 | 0 | +| `cargo clippy --locked --all-targets --all-features -- -D warnings` | blocked by baseline format/dependency drift | 0 | +| `cargo test --locked --release` | not reproducible under the declared 1.75 toolchain | 352 passed, 0 failed, 8 ignored | +| `cargo +1.88.0 audit --no-fetch` | 10 vulnerabilities | 7 vulnerabilities (gate failed) | The dependency reduction removes unused `claude-flow`; `index.js` imports none of its modules. The remaining production tree passes `npm ls --all --omit=dev`. +## CI and Rust reproducibility repair + +- Pins the minimum Rust toolchain at `1.83.0`, the lowest version satisfying the + committed graph; the previous CI pin (`1.75.0`) could not build crates requiring + Rust 1.81–1.83. +- Pins the optional organization dependencies to immutable revisions: + `latency-lens@22b825ef309c2cbb14e1ba528945b853c3aeccde`, + `observatory@6813701693cc85094ea6c52cb00ad4911446b096`, and + `memory-graph@9acd0228098df03b50361769993571fa5ab549bf`. +- Restores the all-feature gate without suppressing it. The later Memory Graph + revisions `c34247b` and `57d08ce` were rejected after real compilation produced + 118 source errors and one undeclared `tempfile` import respectively. +- Runs the current CVSS 4.0-capable `cargo-audit@0.22.2` under its isolated + Rust 1.88 toolchain while preserving Rust 1.83 as the project MSRV; pins + `cargo-tarpaulin@0.31.3` and `protoc@25.1`; updates + cache/artifact actions to v4; prevents matrix fail-fast cancellation; adds the + missing Node test/audit job; and keeps local kubectl parsing followed by kubeval + schema validation. +- Applies Rust 1.83 formatting and machine-applicable Clippy fixes. One real + serialization defect was exposed and fixed by emitting `SignalPayload` variant + tags in snake case, matching the existing contract test. +- Updates compatible locked transitive releases for `bytes`, `crossbeam-epoch`, + and `h2` 0.4, eliminating three RustSec findings. The attempted `time` update + was rejected because its Edition 2024 manifest does not parse under the frozen + Rust 1.83 MSRV. Seven findings remain through `time` and older major-version + graphs (`h2` 0.3, `idna` 0.4, `protobuf` 2, and `rustls-webpki` 0.101); no + advisory was ignored. + ## Darwin and Flywheel ledger Darwin real-repository sandbox invocation: @@ -46,21 +81,25 @@ Darwin real-repository sandbox invocation: metaharness-darwin evolve --generations 1 --children 2 --concurrency 1 --seed 1009 --sandbox real --mutator deterministic ``` -The repository-test substrate scored the baseline and both children at `0.985`; +The current repository-test substrate scored the baseline and both children at `0.985`; neither child was promoted. A second real surface-code run with `--sandbox agent` scored all three at `0.618333`; both children were rejected because neither beat the parent by the frozen `0.05` delta. No harness-policy change was retained. -Flywheel evaluated live tests, audit output, the CORS probe, and the frozen -functional anchor. Its default `meetsPromotionRule` fingerprint was +Flywheel evaluated live tests, Node and Rust audit output, the CORS probe, Rust +formatting, and the frozen functional anchor. Its default `meetsPromotionRule` +fingerprint was `c5942e7c9bf8f28fe7af47a6ec3887d11eeb3f8c8e8601cc6a7a54969ea0b981`. -The combined candidate moved primary score `0.513 -> 1.000`, no-op rate `1 -> 0`, -and cost per passing test `14.109375 -> 1.041667`; the functional anchor remained -`1.0`. The signed replay passed with chain `gen1(candidate) -> gen0(root)`. +The combined candidate moved primary score `0.3078 -> 0.8000` and cost per +passing test `14.109375 -> 1.041667`, but retained no-op/regression state `1/true` +because RustSec still reports seven vulnerabilities. Flywheel correctly rejected +promotion and retained `gen0(root)`; the signed replay passed. This supersedes an +earlier Node-only evaluation that had promoted the candidate before the RustSec +CVSS 4.0 parser incompatibility was discovered. ## Rollback -Revert the improvement commit. This restores the previous lockfile, dependency, -and permissive CORS behavior. If browser callers need access after rollout, set +Revert the improvement commits. This restores the previous lockfile, toolchain, +CI, dependency, and permissive CORS behavior. If browser callers need access after rollout, set `CORS_ALLOWED_ORIGINS` to their exact HTTPS origins; do not use a wildcard with credentials. diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 73cb934..80afd2d 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "stable" +channel = "1.83.0" components = ["rustfmt", "clippy"] diff --git a/src/adapters/intelligence.rs b/src/adapters/intelligence.rs index cff0ad0..e6b4bbb 100644 --- a/src/adapters/intelligence.rs +++ b/src/adapters/intelligence.rs @@ -19,15 +19,15 @@ //! - MAX_TOKENS: 2500 //! - MAX_LATENCY_MS: 5000 -use std::sync::Arc; -use std::time::{Duration, Instant}; use async_trait::async_trait; use parking_lot::RwLock; use serde::{Deserialize, Serialize}; -use tracing::{info, warn, instrument}; +use std::sync::Arc; +use std::time::Instant; +use tracing::{info, instrument}; -use crate::adapters::ruvvector::{RuvVectorAdapter, RuvVectorConsumer, RuvVectorError}; -use crate::infra::{Cache, CacheConfig, RetryPolicy, RetryConfig}; +use crate::adapters::ruvvector::{RuvVectorConsumer, RuvVectorError}; +use crate::infra::{Cache, CacheConfig, RetryConfig, RetryPolicy}; // ============================================================================ // Performance Budget Constants @@ -91,7 +91,7 @@ pub struct DecisionSignal { /// Payload variants for different signal types #[derive(Debug, Clone, Serialize, Deserialize)] -#[serde(tag = "type", content = "data")] +#[serde(tag = "type", content = "data", rename_all = "snake_case")] pub enum SignalPayload { /// Hypothesis signal payload Hypothesis(HypothesisPayload), @@ -292,7 +292,11 @@ impl std::fmt::Display for IntelligenceError { write!(f, "Token budget exceeded: {} > {} max", used, max) } Self::LatencyBudgetExceeded { latency_ms, max_ms } => { - write!(f, "Latency budget exceeded: {}ms > {}ms max", latency_ms, max_ms) + write!( + f, + "Latency budget exceeded: {}ms > {}ms max", + latency_ms, max_ms + ) } Self::InvalidInput(msg) => write!(f, "Invalid input: {}", msg), Self::Internal(msg) => write!(f, "Internal error: {}", msg), @@ -317,8 +321,8 @@ impl From for IntelligenceError { pub struct IntelligenceAdapter { config: IntelligenceConfig, ruvvector: Arc, - cache: Option, - retry_policy: RetryPolicy, + _cache: Option, + _retry_policy: RetryPolicy, stats: Arc>, } @@ -351,9 +355,11 @@ impl IntelligenceAdapter { }; let retry_policy = if config.retry_enabled { - let mut retry_config = RetryConfig::default(); - retry_config.max_retries = config.max_retries; - retry_config.base_delay_ms = 100; + let retry_config = RetryConfig { + max_retries: config.max_retries, + base_delay_ms: 100, + ..Default::default() + }; RetryPolicy::from_config(&retry_config) } else { RetryPolicy::new() @@ -362,8 +368,8 @@ impl IntelligenceAdapter { Ok(Self { config, ruvvector, - cache, - retry_policy, + _cache: cache, + _retry_policy: retry_policy, stats: Arc::new(RwLock::new(IntelligenceStats::default())), }) } @@ -434,12 +440,14 @@ impl IntelligenceConsumer for IntelligenceAdapter { let query_result = self.ruvvector.query(&query_request).await?; // Build hypothesis from RuvVector results - let evidence: Vec = query_result.results + let evidence: Vec = query_result + .results .iter() .filter_map(|r| r.content.clone()) .collect(); - let confidence = query_result.results + let confidence = query_result + .results .first() .map(|r| r.score as f64) .unwrap_or(0.5); @@ -504,8 +512,7 @@ impl IntelligenceConsumer for IntelligenceAdapter { input: crate::adapters::ruvvector::SimulateInput::Messages(vec![ crate::adapters::ruvvector::SimulateMessage { role: "user".to_string(), - content: serde_json::to_string(&scenario.parameters) - .unwrap_or_default(), + content: serde_json::to_string(&scenario.parameters).unwrap_or_default(), }, ]), parameters: Some(crate::adapters::ruvvector::SimulateParameters { @@ -591,12 +598,14 @@ impl IntelligenceConsumer for IntelligenceAdapter { let query_result = self.ruvvector.query(&query_request).await?; // Calculate confidence delta based on state changes - let previous_confidence: f64 = assessment.previous_state + let previous_confidence: f64 = assessment + .previous_state .get("confidence") .and_then(|v| v.as_f64()) .unwrap_or(0.5); - let current_confidence: f64 = query_result.results + let current_confidence: f64 = query_result + .results .first() .map(|r| r.score as f64) .unwrap_or(previous_confidence); @@ -694,8 +703,11 @@ impl FeuIntelligenceConsumer for IntelligenceAdapter { context: &ReasoningContext, collector: &mut FeuSpanCollector, ) -> Result { - let span_id = collector.begin_agent_span("intelligence") - .map_err(|e: crate::telemetry::tracing_ext::FeuValidationError| IntelligenceError::Internal(e.to_string()))?; + let span_id = collector.begin_agent_span("intelligence").map_err( + |e: crate::telemetry::tracing_ext::FeuValidationError| { + IntelligenceError::Internal(e.to_string()) + }, + )?; match self.emit_hypothesis(context).await { Ok(signal) => { @@ -720,8 +732,11 @@ impl FeuIntelligenceConsumer for IntelligenceAdapter { scenario: &SimulationScenario, collector: &mut FeuSpanCollector, ) -> Result { - let span_id = collector.begin_agent_span("intelligence") - .map_err(|e: crate::telemetry::tracing_ext::FeuValidationError| IntelligenceError::Internal(e.to_string()))?; + let span_id = collector.begin_agent_span("intelligence").map_err( + |e: crate::telemetry::tracing_ext::FeuValidationError| { + IntelligenceError::Internal(e.to_string()) + }, + )?; match self.emit_simulation_outcome(scenario).await { Ok(signal) => { @@ -746,8 +761,11 @@ impl FeuIntelligenceConsumer for IntelligenceAdapter { assessment: &ConfidenceAssessment, collector: &mut FeuSpanCollector, ) -> Result { - let span_id = collector.begin_agent_span("intelligence") - .map_err(|e: crate::telemetry::tracing_ext::FeuValidationError| IntelligenceError::Internal(e.to_string()))?; + let span_id = collector.begin_agent_span("intelligence").map_err( + |e: crate::telemetry::tracing_ext::FeuValidationError| { + IntelligenceError::Internal(e.to_string()) + }, + )?; match self.emit_confidence_delta(assessment).await { Ok(signal) => { @@ -816,7 +834,10 @@ mod tests { #[test] fn test_intelligence_error_display() { - let err = IntelligenceError::TokenBudgetExceeded { used: 3000, max: 2500 }; + let err = IntelligenceError::TokenBudgetExceeded { + used: 3000, + max: 2500, + }; assert!(err.to_string().contains("3000")); assert!(err.to_string().contains("2500")); } diff --git a/src/adapters/latency_lens.rs b/src/adapters/latency_lens.rs index 2ffc990..86121d8 100644 --- a/src/adapters/latency_lens.rs +++ b/src/adapters/latency_lens.rs @@ -17,11 +17,11 @@ //! let profile = adapter.consume_latency_profile("gpt-4").await?; //! ``` +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; -use async_trait::async_trait; -use serde::{Deserialize, Serialize}; /// Latency profile data consumed from LLM-Latency-Lens #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/adapters/memory_graph.rs b/src/adapters/memory_graph.rs index 9348c8d..1fffb2a 100644 --- a/src/adapters/memory_graph.rs +++ b/src/adapters/memory_graph.rs @@ -18,11 +18,11 @@ //! let lineage = adapter.consume_prompt_lineage("prompt-123").await?; //! ``` +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; -use async_trait::async_trait; -use serde::{Deserialize, Serialize}; /// Prompt lineage data consumed from LLM-Memory-Graph #[derive(Debug, Clone, Serialize, Deserialize)] @@ -519,7 +519,9 @@ impl MemoryGraphConsumer for MemoryGraphAdapter { limit: usize, ) -> Result, AdapterError> { // Return cached sessions up to limit - let sessions: Vec<_> = self.session_cache.read() + let sessions: Vec<_> = self + .session_cache + .read() .values() .take(limit) .cloned() @@ -548,31 +550,42 @@ impl ConsumedPromptLineage { /// Get the depth in the lineage tree (0 for root) pub fn depth(&self) -> u32 { // Simplified - would need full tree traversal - if self.parent_id.is_none() { 0 } else { 1 } + if self.parent_id.is_none() { + 0 + } else { + 1 + } } } impl ConsumedGraphContext { /// Get nodes of a specific type pub fn nodes_of_type(&self, node_type: &NodeType) -> Vec<&ContextNode> { - self.nodes.iter() + self.nodes + .iter() .filter(|n| &n.node_type == node_type) .collect() } /// Get edges of a specific type pub fn edges_of_type(&self, edge_type: &EdgeType) -> Vec<&ContextEdge> { - self.edges.iter() + self.edges + .iter() .filter(|e| &e.edge_type == edge_type) .collect() } /// Get nodes connected to a given node pub fn connected_nodes(&self, node_id: &str) -> Vec<&str> { - self.edges.iter() + self.edges + .iter() .filter(|e| e.source == node_id || e.target == node_id) .map(|e| { - if e.source == node_id { e.target.as_str() } else { e.source.as_str() } + if e.source == node_id { + e.target.as_str() + } else { + e.source.as_str() + } }) .collect() } @@ -604,8 +617,11 @@ impl FeuMemoryGraphConsumer for MemoryGraphAdapter { agent_id: &str, collector: &mut FeuSpanCollector, ) -> Result, AdapterError> { - let span_id = collector.begin_agent_span("memory_graph") - .map_err(|e: crate::telemetry::tracing_ext::FeuValidationError| AdapterError::UpstreamError(e.to_string()))?; + let span_id = collector.begin_agent_span("memory_graph").map_err( + |e: crate::telemetry::tracing_ext::FeuValidationError| { + AdapterError::UpstreamError(e.to_string()) + }, + )?; match self.consume_agent_lineage(agent_id).await { Ok(Some(lineage)) => { @@ -651,9 +667,7 @@ impl ConsumedAgentLineage { /// Get successful tool invocations pub fn successful_tools(&self) -> Vec<&ToolInvocation> { - self.tool_invocations.iter() - .filter(|t| t.success) - .collect() + self.tool_invocations.iter().filter(|t| t.success).collect() } } @@ -730,14 +744,12 @@ mod tests { position: 1, }, ], - edges: vec![ - ContextEdge { - source: "node-1".to_string(), - target: "node-2".to_string(), - edge_type: EdgeType::PromptResponse, - weight: 1.0, - }, - ], + edges: vec![ContextEdge { + source: "node-1".to_string(), + target: "node-2".to_string(), + edge_type: EdgeType::PromptResponse, + weight: 1.0, + }], summary: None, token_count: 10, retrieved_at: 0, @@ -756,26 +768,22 @@ mod tests { name: "Test Agent".to_string(), config: AgentConfig::default(), status: AgentStatus::Completed, - actions: vec![ - AgentAction { - id: "action-1".to_string(), - action_type: "search".to_string(), - input: "query".to_string(), - output: Some("results".to_string()), - timestamp: 0, - }, - ], - tool_invocations: vec![ - ToolInvocation { - id: "tool-1".to_string(), - tool_name: "search".to_string(), - input: "{}".to_string(), - output: Some("{}".to_string()), - execution_time_ms: 100.0, - success: true, - timestamp: 0, - }, - ], + actions: vec![AgentAction { + id: "action-1".to_string(), + action_type: "search".to_string(), + input: "query".to_string(), + output: Some("results".to_string()), + timestamp: 0, + }], + tool_invocations: vec![ToolInvocation { + id: "tool-1".to_string(), + tool_name: "search".to_string(), + input: "{}".to_string(), + output: Some("{}".to_string()), + execution_time_ms: 100.0, + success: true, + timestamp: 0, + }], metrics: AgentMetrics::default(), }; diff --git a/src/adapters/mod.rs b/src/adapters/mod.rs index 7478176..d96734b 100644 --- a/src/adapters/mod.rs +++ b/src/adapters/mod.rs @@ -28,43 +28,43 @@ //! - Retry logic with exponential backoff for upstream calls //! - Shared infrastructure context across adapters +pub mod intelligence; pub mod latency_lens; +pub mod memory_graph; pub mod observatory; pub mod router; -pub mod memory_graph; pub mod ruvvector; -pub mod intelligence; // Re-export primary consumer traits pub use latency_lens::LatencyLensConsumer; +pub use memory_graph::MemoryGraphConsumer; pub use observatory::ObservatoryConsumer; pub use router::RouterConsumer; -pub use memory_graph::MemoryGraphConsumer; -pub use ruvvector::{RuvVectorConsumer, RuvVectorAdapter, RuvVectorConfig, RuvVectorError, OptionalRuvVectorAdapter}; +pub use ruvvector::{ + OptionalRuvVectorAdapter, RuvVectorAdapter, RuvVectorConfig, RuvVectorConsumer, RuvVectorError, +}; // Phase 7: Intelligence & Expansion (Layer 2) pub use intelligence::{ - IntelligenceConsumer, IntelligenceAdapter, IntelligenceConfig, IntelligenceError, - IntelligenceStats, OptionalIntelligenceAdapter, - SignalType, DecisionSignal, SignalPayload, - HypothesisPayload, SimulationOutcomePayload, ConfidenceDeltaPayload, - ReasoningContext, SimulationScenario, ConfidenceAssessment, - MAX_TOKENS, MAX_LATENCY_MS, + ConfidenceAssessment, ConfidenceDeltaPayload, DecisionSignal, HypothesisPayload, + IntelligenceAdapter, IntelligenceConfig, IntelligenceConsumer, IntelligenceError, + IntelligenceStats, OptionalIntelligenceAdapter, ReasoningContext, SignalPayload, SignalType, + SimulationOutcomePayload, SimulationScenario, MAX_LATENCY_MS, MAX_TOKENS, }; // FEU (Foundational Execution Unit) types -pub use observatory::FeuSpanKind; -pub use intelligence::FeuIntelligenceConsumer; -pub use memory_graph::FeuMemoryGraphConsumer; pub use crate::telemetry::tracing_ext::{ - FeuSpanCollector, FeuValidationError, ExecutionTrace, SpanArtifact, FEU_ROOT_PARENT, + ExecutionTrace, FeuSpanCollector, FeuValidationError, SpanArtifact, FEU_ROOT_PARENT, }; +pub use intelligence::FeuIntelligenceConsumer; +pub use memory_graph::FeuMemoryGraphConsumer; +pub use observatory::FeuSpanKind; -use std::sync::Arc; use parking_lot::RwLock; +use std::sync::Arc; use crate::adapters::observatory::SpanStatus; -use crate::infra::{SharedInfraContext, shared_infra_context}; +use crate::infra::{shared_infra_context, SharedInfraContext}; /// Unified adapter registry for managing all Phase 2B+ integrations pub struct AdapterRegistry { @@ -199,10 +199,7 @@ impl AdapterRegistry { /// Execute all registered adapters with FEU span tracking. /// Creates a repo-level span and one agent span per registered adapter. /// Returns the complete ExecutionTrace with all spans and artifacts. - pub fn execute_traced( - &self, - request_id: &str, - ) -> Result { + pub fn execute_traced(&self, request_id: &str) -> Result { let mut collector = FeuSpanCollector::new(Some(request_id.to_string())); if self.observatory.is_some() { @@ -274,8 +271,8 @@ mod tests { #[test] fn test_execute_traced_with_adapters() { - use crate::adapters::observatory::ObservatoryAdapter; use crate::adapters::memory_graph::MemoryGraphAdapter; + use crate::adapters::observatory::ObservatoryAdapter; let registry = AdapterRegistry::new() .with_observatory(Arc::new(ObservatoryAdapter::new())) diff --git a/src/adapters/observatory.rs b/src/adapters/observatory.rs index c4e421d..b5d8f3c 100644 --- a/src/adapters/observatory.rs +++ b/src/adapters/observatory.rs @@ -17,11 +17,11 @@ //! let spans = adapter.consume_trace_spans("request-123").await?; //! ``` +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; -use async_trait::async_trait; -use serde::{Deserialize, Serialize}; /// Classifies a span within the FEU (Foundational Execution Unit) hierarchy. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] @@ -208,16 +208,10 @@ pub enum MetricType { #[async_trait] pub trait ObservatoryConsumer: Send + Sync { /// Consume trace spans for a request - async fn consume_trace_spans( - &self, - trace_id: &str, - ) -> Result, AdapterError>; + async fn consume_trace_spans(&self, trace_id: &str) -> Result, AdapterError>; /// Consume a specific span by ID - async fn consume_span( - &self, - span_id: &str, - ) -> Result, AdapterError>; + async fn consume_span(&self, span_id: &str) -> Result, AdapterError>; /// Consume state transitions for a time range async fn consume_state_transitions( @@ -343,10 +337,7 @@ impl Default for ObservatoryAdapter { #[async_trait] impl ObservatoryConsumer for ObservatoryAdapter { - async fn consume_trace_spans( - &self, - trace_id: &str, - ) -> Result, AdapterError> { + async fn consume_trace_spans(&self, trace_id: &str) -> Result, AdapterError> { // Check cache first if let Some(cached) = self.span_cache.read().get(trace_id) { return Ok(cached.clone()); @@ -357,10 +348,7 @@ impl ObservatoryConsumer for ObservatoryAdapter { Ok(Vec::new()) } - async fn consume_span( - &self, - _span_id: &str, - ) -> Result, AdapterError> { + async fn consume_span(&self, _span_id: &str) -> Result, AdapterError> { // Single span lookup Ok(None) } @@ -386,7 +374,9 @@ impl ObservatoryConsumer for ObservatoryAdapter { &self, ) -> Result { // Create subscription for real-time updates - Ok(StateTransitionSubscription::new(uuid::Uuid::new_v4().to_string())) + Ok(StateTransitionSubscription::new( + uuid::Uuid::new_v4().to_string(), + )) } async fn health_check(&self) -> Result { @@ -414,9 +404,8 @@ impl ConsumedSpan { /// Get duration in milliseconds pub fn duration_ms(&self) -> Option { - self.latency_ms.or_else(|| { - self.end_time.map(|end| (end - self.start_time) as f64) - }) + self.latency_ms + .or_else(|| self.end_time.map(|end| (end - self.start_time) as f64)) } } @@ -553,6 +542,9 @@ mod tests { }; assert!(!transition.is_error_transition()); - assert_eq!(transition.transition_duration(), Some(Duration::from_millis(100))); + assert_eq!( + transition.transition_duration(), + Some(Duration::from_millis(100)) + ); } } diff --git a/src/adapters/router.rs b/src/adapters/router.rs index 4749a1e..8bdbfd1 100644 --- a/src/adapters/router.rs +++ b/src/adapters/router.rs @@ -23,11 +23,11 @@ //! let decision = adapter.consume_routing_decision(&request).await?; //! ``` +use async_trait::async_trait; +use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; -use async_trait::async_trait; -use serde::{Deserialize, Serialize}; /// Routing decision consumed from external routing service #[derive(Debug, Clone, Serialize, Deserialize)] @@ -271,9 +271,9 @@ pub struct RouterAdapter { /// Cache TTL cache_ttl: Duration, /// Default provider - default_provider: String, + _default_provider: String, /// Default model - default_model: String, + _default_model: String, } impl RouterAdapter { @@ -282,8 +282,8 @@ impl RouterAdapter { Self { rules_cache: Arc::new(parking_lot::RwLock::new(None)), cache_ttl: Duration::from_secs(60), - default_provider: "openai".to_string(), - default_model: "gpt-4".to_string(), + _default_provider: "openai".to_string(), + _default_model: "gpt-4".to_string(), } } @@ -292,8 +292,8 @@ impl RouterAdapter { Self { rules_cache: Arc::new(parking_lot::RwLock::new(None)), cache_ttl: Duration::from_secs(60), - default_provider: provider.into(), - default_model: model.into(), + _default_provider: provider.into(), + _default_model: model.into(), } } @@ -306,15 +306,17 @@ impl RouterAdapter { /// Evaluate a condition against context fn evaluate_condition(condition: &BranchCondition, context: &RoutingContext) -> bool { match condition { - BranchCondition::ModelMatch(pattern) => { - context.model.as_ref().map_or(false, |m| m.contains(pattern)) - } + BranchCondition::ModelMatch(pattern) => context + .model + .as_ref() + .map_or(false, |m| m.contains(pattern)), BranchCondition::ProviderMatch(provider) => { context.provider.as_ref().map_or(false, |p| p == provider) } - BranchCondition::HeaderMatch { name, pattern } => { - context.headers.get(name).map_or(false, |v| v.contains(pattern)) - } + BranchCondition::HeaderMatch { name, pattern } => context + .headers + .get(name) + .map_or(false, |v| v.contains(pattern)), BranchCondition::TokenThreshold { min, max } => { let tokens = context.input_tokens.unwrap_or(0); let above_min = min.map_or(true, |m| tokens >= m); @@ -325,7 +327,9 @@ impl RouterAdapter { BranchCondition::CapabilityRequired(_) => true, // Simplified BranchCondition::PercentageSplit { percentage, .. } => { // Simplified: use hash of client_id for deterministic split - let hash = context.client_id.as_ref() + let hash = context + .client_id + .as_ref() .map(|id| { let mut h: u64 = 0; for b in id.bytes() { @@ -336,7 +340,10 @@ impl RouterAdapter { .unwrap_or(0); (hash % 100) < (*percentage * 100.0) as u64 } - BranchCondition::TimeWindow { start_hour, end_hour } => { + BranchCondition::TimeWindow { + start_hour, + end_hour, + } => { let current_hour = (chrono::Utc::now().timestamp() / 3600 % 24) as u8; current_hour >= *start_hour && current_hour < *end_hour } @@ -363,10 +370,14 @@ impl RouterConsumer for RouterAdapter { if let Some(rules) = rules { // Evaluate rules in priority order - let mut matched_rules: Vec<_> = rules.rules.iter() + let mut matched_rules: Vec<_> = rules + .rules + .iter() .filter(|r| r.enabled) .filter(|r| { - r.conditions.iter().all(|c| Self::evaluate_condition(c, context)) + r.conditions + .iter() + .all(|c| Self::evaluate_condition(c, context)) }) .collect(); @@ -414,7 +425,9 @@ impl RouterConsumer for RouterAdapter { if let Some(rules) = rules.as_ref() { if let Some(rule) = rules.rules.iter().find(|r| r.id == rule_id) { - let all_match = rule.conditions.iter() + let all_match = rule + .conditions + .iter() .all(|c| Self::evaluate_condition(c, context)); return Ok(all_match); } @@ -526,7 +539,10 @@ mod tests { // Token threshold assert!(RouterAdapter::evaluate_condition( - &BranchCondition::TokenThreshold { min: Some(100), max: Some(1000) }, + &BranchCondition::TokenThreshold { + min: Some(100), + max: Some(1000) + }, &context )); @@ -559,7 +575,10 @@ mod tests { assert_eq!(context.provider, Some("openai".to_string())); assert_eq!(context.input_tokens, Some(500)); assert!(context.streaming); - assert_eq!(context.headers.get("X-Request-ID"), Some(&"req-123".to_string())); + assert_eq!( + context.headers.get("X-Request-ID"), + Some(&"req-123".to_string()) + ); assert_eq!(context.client_id, Some("client-456".to_string())); } diff --git a/src/adapters/ruvvector.rs b/src/adapters/ruvvector.rs index 7361f37..1b40e68 100644 --- a/src/adapters/ruvvector.rs +++ b/src/adapters/ruvvector.rs @@ -94,19 +94,24 @@ impl Default for RuvVectorConfig { impl RuvVectorConfig { /// Create configuration from environment variables pub fn from_env() -> Result { - let service_url = std::env::var(RUVVECTOR_SERVICE_URL_ENV) - .map_err(|_| RuvVectorError::ConfigError( - format!("Environment variable {} not set", RUVVECTOR_SERVICE_URL_ENV) - ))?; + let service_url = std::env::var(RUVVECTOR_SERVICE_URL_ENV).map_err(|_| { + RuvVectorError::ConfigError(format!( + "Environment variable {} not set", + RUVVECTOR_SERVICE_URL_ENV + )) + })?; if service_url.is_empty() { - return Err(RuvVectorError::ConfigError( - format!("{} is empty", RUVVECTOR_SERVICE_URL_ENV) - )); + return Err(RuvVectorError::ConfigError(format!( + "{} is empty", + RUVVECTOR_SERVICE_URL_ENV + ))); } - let mut config = Self::default(); - config.service_url = service_url; + let mut config = Self { + service_url, + ..Default::default() + }; // Optional environment overrides if let Ok(timeout) = std::env::var("RUVVECTOR_TIMEOUT_SECS") { @@ -137,15 +142,13 @@ impl RuvVectorConfig { pub fn validate(&self) -> Result<(), RuvVectorError> { if self.service_url.is_empty() { return Err(RuvVectorError::ConfigError( - "service_url is required".to_string() + "service_url is required".to_string(), )); } // Validate URL format url::Url::parse(&self.service_url) - .map_err(|e| RuvVectorError::ConfigError( - format!("Invalid service_url: {}", e) - ))?; + .map_err(|e| RuvVectorError::ConfigError(format!("Invalid service_url: {}", e)))?; Ok(()) } @@ -161,10 +164,7 @@ pub enum RuvVectorError { ConnectionFailed(String), #[error("Request failed: {status} - {message}")] - RequestFailed { - status: u16, - message: String, - }, + RequestFailed { status: u16, message: String }, #[error("Service unavailable: {0}")] ServiceUnavailable(String), @@ -236,8 +236,12 @@ pub struct QueryRequest { pub include_metadata: bool, } -fn default_top_k() -> usize { 10 } -fn default_true() -> bool { true } +fn default_top_k() -> usize { + 10 +} +fn default_true() -> bool { + true +} impl Default for QueryRequest { fn default() -> Self { @@ -461,7 +465,8 @@ pub trait RuvVectorConsumer: Send + Sync { async fn query(&self, request: &QueryRequest) -> Result; /// Run simulation via the service - async fn simulate(&self, request: &SimulateRequest) -> Result; + async fn simulate(&self, request: &SimulateRequest) + -> Result; /// Check service health async fn health_check(&self) -> Result; @@ -492,9 +497,9 @@ impl RuvVectorAdapter { .connect_timeout(Duration::from_secs(config.connect_timeout_secs)) .pool_max_idle_per_host(10) .build() - .map_err(|e| RuvVectorError::ConfigError( - format!("Failed to create HTTP client: {}", e) - ))?; + .map_err(|e| { + RuvVectorError::ConfigError(format!("Failed to create HTTP client: {}", e)) + })?; let cache = if config.cache_enabled { Some(Arc::new(Cache::new(CacheConfig { @@ -567,36 +572,43 @@ impl RuvVectorAdapter { ) -> Result { let url = self.endpoint_url(endpoint); - let result = self.retry_policy.retry(|| async { - let response = self.client - .post(&url) - .json(body) - .send() - .await - .map_err(|e| { - if e.is_timeout() { - RuvVectorError::Timeout(Duration::from_secs(self.config.timeout_secs)) - } else if e.is_connect() { - RuvVectorError::ConnectionFailed(e.to_string()) - } else { - RuvVectorError::RequestFailed { - status: 0, - message: e.to_string(), + let result = self + .retry_policy + .retry(|| async { + let response = self + .client + .post(&url) + .json(body) + .send() + .await + .map_err(|e| { + if e.is_timeout() { + RuvVectorError::Timeout(Duration::from_secs(self.config.timeout_secs)) + } else if e.is_connect() { + RuvVectorError::ConnectionFailed(e.to_string()) + } else { + RuvVectorError::RequestFailed { + status: 0, + message: e.to_string(), + } } - } - })?; - - let status = response.status(); - - if status.is_success() { - response.json::().await.map_err(|e| { - RuvVectorError::InvalidResponse(format!("Failed to parse response: {}", e)) - }) - } else { - let message = response.text().await.unwrap_or_else(|_| "Unknown error".to_string()); - Err(self.map_status_to_error(status, message)) - } - }).await; + })?; + + let status = response.status(); + + if status.is_success() { + response.json::().await.map_err(|e| { + RuvVectorError::InvalidResponse(format!("Failed to parse response: {}", e)) + }) + } else { + let message = response + .text() + .await + .unwrap_or_else(|_| "Unknown error".to_string()); + Err(self.map_status_to_error(status, message)) + } + }) + .await; result.map_err(|e| match e { crate::infra::RetryError::MaxRetriesExceeded { last_error, .. } => last_error, @@ -610,18 +622,13 @@ impl RuvVectorAdapter { /// Execute a GET request with retry logic #[instrument(skip(self), fields(endpoint = %endpoint))] - async fn get Deserialize<'de>>( - &self, - endpoint: &str, - ) -> Result { + async fn get Deserialize<'de>>(&self, endpoint: &str) -> Result { let url = self.endpoint_url(endpoint); - let result = self.retry_policy.retry(|| async { - let response = self.client - .get(&url) - .send() - .await - .map_err(|e| { + let result = self + .retry_policy + .retry(|| async { + let response = self.client.get(&url).send().await.map_err(|e| { if e.is_timeout() { RuvVectorError::Timeout(Duration::from_secs(self.config.timeout_secs)) } else if e.is_connect() { @@ -634,17 +641,21 @@ impl RuvVectorAdapter { } })?; - let status = response.status(); - - if status.is_success() { - response.json::().await.map_err(|e| { - RuvVectorError::InvalidResponse(format!("Failed to parse response: {}", e)) - }) - } else { - let message = response.text().await.unwrap_or_else(|_| "Unknown error".to_string()); - Err(self.map_status_to_error(status, message)) - } - }).await; + let status = response.status(); + + if status.is_success() { + response.json::().await.map_err(|e| { + RuvVectorError::InvalidResponse(format!("Failed to parse response: {}", e)) + }) + } else { + let message = response + .text() + .await + .unwrap_or_else(|_| "Unknown error".to_string()); + Err(self.map_status_to_error(status, message)) + } + }) + .await; result.map_err(|e| match e { crate::infra::RetryError::MaxRetriesExceeded { last_error, .. } => last_error, @@ -659,16 +670,16 @@ impl RuvVectorAdapter { /// Map HTTP status to error type fn map_status_to_error(&self, status: StatusCode, message: String) -> RuvVectorError { match status { - StatusCode::SERVICE_UNAVAILABLE | StatusCode::BAD_GATEWAY | StatusCode::GATEWAY_TIMEOUT => { - RuvVectorError::ServiceUnavailable(message) - } + StatusCode::SERVICE_UNAVAILABLE + | StatusCode::BAD_GATEWAY + | StatusCode::GATEWAY_TIMEOUT => RuvVectorError::ServiceUnavailable(message), StatusCode::REQUEST_TIMEOUT => { RuvVectorError::Timeout(Duration::from_secs(self.config.timeout_secs)) } _ => RuvVectorError::RequestFailed { status: status.as_u16(), message, - } + }, } } @@ -712,7 +723,10 @@ impl RuvVectorConsumer for RuvVectorAdapter { } #[instrument(skip(self, request), fields(model = %request.model))] - async fn simulate(&self, request: &SimulateRequest) -> Result { + async fn simulate( + &self, + request: &SimulateRequest, + ) -> Result { // Simulation requests are not cached as they should produce varied results self.post("/simulate", request).await } @@ -761,7 +775,10 @@ impl OptionalRuvVectorAdapter { } /// Query with fallback to None if not configured - pub async fn query(&self, request: &QueryRequest) -> Option> { + pub async fn query( + &self, + request: &QueryRequest, + ) -> Option> { if let Some(adapter) = &self.inner { Some(adapter.query(request).await) } else { @@ -773,7 +790,10 @@ impl OptionalRuvVectorAdapter { /// /// Returns `NotConfigured` error instead of None when the adapter is not configured. /// Use this when `require_ruvvector: true` in the configuration. - pub async fn query_required(&self, request: &QueryRequest) -> Result { + pub async fn query_required( + &self, + request: &QueryRequest, + ) -> Result { if let Some(adapter) = &self.inner { adapter.query(request).await } else { @@ -782,7 +802,10 @@ impl OptionalRuvVectorAdapter { } /// Simulate with fallback to None if not configured - pub async fn simulate(&self, request: &SimulateRequest) -> Option> { + pub async fn simulate( + &self, + request: &SimulateRequest, + ) -> Option> { if let Some(adapter) = &self.inner { Some(adapter.simulate(request).await) } else { @@ -794,7 +817,10 @@ impl OptionalRuvVectorAdapter { /// /// Returns `NotConfigured` error instead of None when the adapter is not configured. /// Use this when `require_ruvvector: true` in the configuration. - pub async fn simulate_required(&self, request: &SimulateRequest) -> Result { + pub async fn simulate_required( + &self, + request: &SimulateRequest, + ) -> Result { if let Some(adapter) = &self.inner { adapter.simulate(request).await } else { diff --git a/src/benchmarks/adapters.rs b/src/benchmarks/adapters.rs index b9492c9..94314aa 100644 --- a/src/benchmarks/adapters.rs +++ b/src/benchmarks/adapters.rs @@ -3,13 +3,12 @@ //! Implements the canonical BenchTarget trait and provides adapters //! for all simulator benchmark targets. -use std::time::{Duration, Instant}; +use std::time::Instant; -use crate::config::{LatencyConfig, LatencyDistribution, GenerationConfig, GenerationStrategy}; -use crate::engine::{ResponseGenerator, SimulationEngine}; +use crate::config::{GenerationConfig, GenerationStrategy, LatencyConfig, LatencyDistribution}; +use crate::engine::ResponseGenerator; use crate::latency::{DistributionSampler, LatencySimulator, LatencyStats}; use crate::types::Message; -use crate::SimulatorConfig; use super::{BenchmarkResult, BenchmarkResultBuilder}; @@ -68,6 +67,12 @@ pub struct LatencySamplingBenchmark { seed: u64, } +impl Default for LatencySamplingBenchmark { + fn default() -> Self { + Self::new() + } +} + impl LatencySamplingBenchmark { pub fn new() -> Self { Self { @@ -118,6 +123,12 @@ pub struct TtftSamplingBenchmark { seed: u64, } +impl Default for TtftSamplingBenchmark { + fn default() -> Self { + Self::new() + } +} + impl TtftSamplingBenchmark { pub fn new() -> Self { Self { @@ -178,6 +189,12 @@ pub struct ItlSamplingBenchmark { seed: u64, } +impl Default for ItlSamplingBenchmark { + fn default() -> Self { + Self::new() + } +} + impl ItlSamplingBenchmark { pub fn new() -> Self { Self { @@ -229,6 +246,12 @@ pub struct ScheduleGenerationBenchmark { seed: u64, } +impl Default for ScheduleGenerationBenchmark { + fn default() -> Self { + Self::new() + } +} + impl ScheduleGenerationBenchmark { pub fn new() -> Self { Self { @@ -292,6 +315,12 @@ pub struct DistributionSamplingBenchmark { seed: u64, } +impl Default for DistributionSamplingBenchmark { + fn default() -> Self { + Self::new() + } +} + impl DistributionSamplingBenchmark { pub fn new() -> Self { Self { @@ -393,6 +422,12 @@ pub struct TokenThroughputBenchmark { seed: u64, } +impl Default for TokenThroughputBenchmark { + fn default() -> Self { + Self::new() + } +} + impl TokenThroughputBenchmark { pub fn new() -> Self { Self { @@ -447,7 +482,10 @@ impl BenchTarget for TokenThroughputBenchmark { let elapsed = start.elapsed(); BenchmarkResultBuilder::new(self.id()) - .metric("total_iterations", self.iterations * self.token_counts.len()) + .metric( + "total_iterations", + self.iterations * self.token_counts.len(), + ) .metric("total_tokens", total_tokens) .duration_ms("total_duration", elapsed) .throughput(total_tokens as f64 / elapsed.as_secs_f64()) @@ -462,6 +500,12 @@ pub struct ResponseGenerationBenchmark { seed: u64, } +impl Default for ResponseGenerationBenchmark { + fn default() -> Self { + Self::new() + } +} + impl ResponseGenerationBenchmark { pub fn new() -> Self { Self { @@ -539,6 +583,12 @@ pub struct TokenizationBenchmark { seed: u64, } +impl Default for TokenizationBenchmark { + fn default() -> Self { + Self::new() + } +} + impl TokenizationBenchmark { pub fn new() -> Self { Self { @@ -586,7 +636,10 @@ impl BenchTarget for TokenizationBenchmark { .metric("total_chars", total_chars) .duration_ms("total_duration", elapsed) .throughput(total_chars as f64 / elapsed.as_secs_f64()) - .metric("avg_chars_per_token", total_chars as f64 / total_tokens as f64) + .metric( + "avg_chars_per_token", + total_chars as f64 / total_tokens as f64, + ) .build() } } @@ -601,6 +654,12 @@ pub struct ConcurrentRequestBenchmark { seed: u64, } +impl Default for ConcurrentRequestBenchmark { + fn default() -> Self { + Self::new() + } +} + impl ConcurrentRequestBenchmark { pub fn new() -> Self { Self { @@ -660,6 +719,12 @@ pub struct LargeContextBenchmark { seed: u64, } +impl Default for LargeContextBenchmark { + fn default() -> Self { + Self::new() + } +} + impl LargeContextBenchmark { pub fn new() -> Self { Self { @@ -716,9 +781,15 @@ impl BenchTarget for LargeContextBenchmark { let elapsed = start.elapsed(); BenchmarkResultBuilder::new(self.id()) - .metric("total_iterations", self.iterations * self.context_sizes.len()) + .metric( + "total_iterations", + self.iterations * self.context_sizes.len(), + ) .duration_ms("total_duration", elapsed) - .metric("context_results", serde_json::Value::Object(context_results)) + .metric( + "context_results", + serde_json::Value::Object(context_results), + ) .build() } } @@ -734,6 +805,12 @@ pub struct EmbeddingGenerationBenchmark { seed: u64, } +impl Default for EmbeddingGenerationBenchmark { + fn default() -> Self { + Self::new() + } +} + impl EmbeddingGenerationBenchmark { pub fn new() -> Self { Self { @@ -780,7 +857,10 @@ impl BenchTarget for EmbeddingGenerationBenchmark { .metric("total_elements", total_elements) .duration_ms("total_duration", elapsed) .throughput(self.iterations as f64 / elapsed.as_secs_f64()) - .metric("elements_per_sec", total_elements as f64 / elapsed.as_secs_f64()) + .metric( + "elements_per_sec", + total_elements as f64 / elapsed.as_secs_f64(), + ) .build() } } @@ -793,6 +873,12 @@ pub struct BatchEmbeddingBenchmark { seed: u64, } +impl Default for BatchEmbeddingBenchmark { + fn default() -> Self { + Self::new() + } +} + impl BatchEmbeddingBenchmark { pub fn new() -> Self { Self { @@ -866,6 +952,12 @@ pub struct ProfileLookupBenchmark { iterations: usize, } +impl Default for ProfileLookupBenchmark { + fn default() -> Self { + Self::new() + } +} + impl ProfileLookupBenchmark { pub fn new() -> Self { Self { @@ -886,7 +978,9 @@ impl BenchTarget for ProfileLookupBenchmark { fn run(&self) -> BenchmarkResult { let config = LatencyConfig::default(); let simulator = LatencySimulator::new(config); - let profiles = ["fast", "standard", "slow", "gpt4", "claude", "gemini", "instant"]; + let profiles = [ + "fast", "standard", "slow", "gpt4", "claude", "gemini", "instant", + ]; let nonexistent = "nonexistent_profile"; let start = Instant::now(); @@ -914,8 +1008,14 @@ impl BenchTarget for ProfileLookupBenchmark { .metric("hit_lookups", hit_lookups) .metric("miss_lookups", self.iterations) .duration_ms("total_duration", elapsed) - .metric("hit_ops_per_sec", hit_lookups as f64 / hit_elapsed.as_secs_f64()) - .metric("miss_ops_per_sec", self.iterations as f64 / miss_elapsed.as_secs_f64()) + .metric( + "hit_ops_per_sec", + hit_lookups as f64 / hit_elapsed.as_secs_f64(), + ) + .metric( + "miss_ops_per_sec", + self.iterations as f64 / miss_elapsed.as_secs_f64(), + ) .build() } } diff --git a/src/benchmarks/io.rs b/src/benchmarks/io.rs index aa798e6..7da15de 100644 --- a/src/benchmarks/io.rs +++ b/src/benchmarks/io.rs @@ -54,8 +54,8 @@ pub fn write_raw_result(result: &BenchmarkResult) -> Result { ); let path = raw_output_dir().join(&filename); - let file = File::create(&path) - .with_context(|| format!("Failed to create result file: {:?}", path))?; + let file = + File::create(&path).with_context(|| format!("Failed to create result file: {:?}", path))?; let writer = BufWriter::new(file); serde_json::to_writer_pretty(writer, result) @@ -99,8 +99,8 @@ pub fn write_latest_results(results: &[BenchmarkResult]) -> Result { /// Read benchmark results from a JSON file pub fn read_results(path: &Path) -> Result> { - let file = File::open(path) - .with_context(|| format!("Failed to open results file: {:?}", path))?; + let file = + File::open(path).with_context(|| format!("Failed to open results file: {:?}", path))?; let reader = BufReader::new(file); let results: Vec = serde_json::from_reader(reader) @@ -158,8 +158,8 @@ pub fn write_output_file(filename: &str, content: &str) -> Result { ensure_output_dirs()?; let path = output_dir().join(filename); - let mut file = File::create(&path) - .with_context(|| format!("Failed to create file: {:?}", path))?; + let mut file = + File::create(&path).with_context(|| format!("Failed to create file: {:?}", path))?; file.write_all(content.as_bytes()) .with_context(|| format!("Failed to write to: {:?}", path))?; diff --git a/src/benchmarks/markdown.rs b/src/benchmarks/markdown.rs index a097ca4..219e5d0 100644 --- a/src/benchmarks/markdown.rs +++ b/src/benchmarks/markdown.rs @@ -2,7 +2,7 @@ //! //! Generates markdown-formatted benchmark reports and summaries. -use chrono::{DateTime, Utc}; +use chrono::Utc; use super::BenchmarkResult; @@ -91,14 +91,18 @@ pub fn generate_summary(results: &[BenchmarkResult]) -> String { let passed = results.iter().filter(|r| !has_error(&r.metrics)).count(); let failed = results.len() - passed; - summary.push_str(&format!("## Results: {}/{} Passed\n\n", passed, results.len())); + summary.push_str(&format!( + "## Results: {}/{} Passed\n\n", + passed, + results.len() + )); if failed > 0 { summary.push_str("### Failed Benchmarks\n\n"); for result in results.iter().filter(|r| has_error(&r.metrics)) { summary.push_str(&format!("- {}\n", result.target_id)); } - summary.push_str("\n"); + summary.push('\n'); } summary.push_str("### Benchmark Targets\n\n"); @@ -109,7 +113,10 @@ pub fn generate_summary(results: &[BenchmarkResult]) -> String { "[x]" }; let metrics = extract_key_metrics(&result.metrics); - summary.push_str(&format!("- {} **{}**: {}\n", status_icon, result.target_id, metrics)); + summary.push_str(&format!( + "- {} **{}**: {}\n", + status_icon, result.target_id, metrics + )); } summary @@ -127,11 +134,15 @@ pub fn result_to_markdown(result: &BenchmarkResult) -> String { if let Some(obj) = result.metrics.as_object() { for (key, value) in obj { - md.push_str(&format!("- **{}**: {}\n", format_key(key), format_value(value))); + md.push_str(&format!( + "- **{}**: {}\n", + format_key(key), + format_value(value) + )); } } - md.push_str("\n"); + md.push('\n'); md } @@ -269,14 +280,19 @@ mod tests { #[test] fn test_format_key() { - assert_eq!(format_key("throughput_ops_per_sec"), "Throughput Ops Per Sec"); + assert_eq!( + format_key("throughput_ops_per_sec"), + "Throughput Ops Per Sec" + ); assert_eq!(format_key("latency_avg_ms"), "Latency Avg Ms"); } #[test] fn test_has_error() { assert!(!has_error(&serde_json::json!({"value": 100}))); - assert!(has_error(&serde_json::json!({"error": "something went wrong"}))); + assert!(has_error( + &serde_json::json!({"error": "something went wrong"}) + )); assert!(has_error(&serde_json::json!({"success": false}))); assert!(!has_error(&serde_json::json!({"success": true}))); } diff --git a/src/cli/commands.rs b/src/cli/commands.rs index 7eca5e5..df71acf 100644 --- a/src/cli/commands.rs +++ b/src/cli/commands.rs @@ -2,22 +2,21 @@ //! //! Implementations for all CLI subcommands. -use std::io::{self, Write, BufRead}; +use std::io::{self, BufRead, Write}; use std::path::PathBuf; -use std::time::{Duration, Instant}; -use std::sync::atomic::{AtomicUsize, AtomicU64, Ordering}; +use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; use std::sync::Arc; +use std::time::{Duration, Instant}; -use anyhow::{Result, Context, bail}; +use anyhow::{bail, Context, Result}; use tokio::sync::Semaphore; -use crate::{SimulatorConfig, SimulationEngine, VERSION}; use crate::types::*; +use crate::{SimulationEngine, SimulatorConfig, VERSION}; use super::{ - Cli, Commands, ServeCommand, GenerateCommand, GenerateAction, - ConfigCommand, ConfigAction, HealthCommand, ModelsCommand, - BenchmarkCommand, ClientCommand, ClientAction, RunCommand, + BenchmarkCommand, Cli, ClientAction, ClientCommand, Commands, ConfigAction, ConfigCommand, + GenerateAction, GenerateCommand, HealthCommand, ModelsCommand, RunCommand, ServeCommand, }; /// Execute the CLI command @@ -91,7 +90,9 @@ async fn execute_serve(cmd: ServeCommand, mut config: SimulatorConfig, quiet: bo } // Validate configuration - config.validate().context("Configuration validation failed")?; + config + .validate() + .context("Configuration validation failed")?; // Print startup banner if !quiet { @@ -127,17 +128,16 @@ async fn execute_generate(cmd: GenerateCommand, config: SimulatorConfig) -> Resu } messages.push(Message::user(&message)); - let request = ChatCompletionRequest::new(model.clone(), messages) - .with_options( - Some(temperature), - None, - Some(max_tokens), - false, - None, - None, - None, - None, - ); + let request = ChatCompletionRequest::new(model.clone(), messages).with_options( + Some(temperature), + None, + Some(max_tokens), + false, + None, + None, + None, + None, + ); let response = engine.chat_completion(&request).await?; @@ -195,7 +195,9 @@ async fn execute_generate(cmd: GenerateCommand, config: SimulatorConfig) -> Resu } "base64" => { if let Some(data) = response.data.first() { - let bytes: Vec = data.embedding.iter() + let bytes: Vec = data + .embedding + .iter() .flat_map(|f| f.to_le_bytes()) .collect(); let encoded = base64_encode(&bytes); @@ -252,7 +254,11 @@ async fn execute_generate(cmd: GenerateCommand, config: SimulatorConfig) -> Resu } /// Execute the config command -async fn execute_config(cmd: ConfigCommand, config: SimulatorConfig, _config_path: Option) -> Result<()> { +async fn execute_config( + cmd: ConfigCommand, + config: SimulatorConfig, + _config_path: Option, +) -> Result<()> { match cmd.action { ConfigAction::Show { format } => { let output = match format.as_str() { @@ -269,14 +275,35 @@ async fn execute_config(cmd: ConfigCommand, config: SimulatorConfig, _config_pat config.validate()?; println!("Configuration at {:?} is valid", file); println!(" Models: {}", config.models.len()); - println!(" Latency: {}", if config.latency.enabled { "enabled" } else { "disabled" }); - println!(" Chaos: {}", if config.chaos.enabled { "enabled" } else { "disabled" }); + println!( + " Latency: {}", + if config.latency.enabled { + "enabled" + } else { + "disabled" + } + ); + println!( + " Chaos: {}", + if config.chaos.enabled { + "enabled" + } else { + "disabled" + } + ); Ok(()) } - ConfigAction::Init { output, preset, force } => { + ConfigAction::Init { + output, + preset, + force, + } => { if output.exists() && !force { - bail!("File {:?} already exists. Use --force to overwrite.", output); + bail!( + "File {:?} already exists. Use --force to overwrite.", + output + ); } let config = match preset.as_str() { @@ -299,7 +326,10 @@ async fn execute_config(cmd: ConfigCommand, config: SimulatorConfig, _config_pat continue; } } - println!("{:40} {:10} ctx:{:>6}", id, model_config.provider, model_config.context_length); + println!( + "{:40} {:10} ctx:{:>6}", + id, model_config.provider, model_config.context_length + ); } Ok(()) } @@ -307,21 +337,51 @@ async fn execute_config(cmd: ConfigCommand, config: SimulatorConfig, _config_pat ConfigAction::Env => { println!("Environment Variable Mappings:"); println!(); - println!(" {:<40} {}", "LLM_SIMULATOR_CONFIG", "Configuration file path"); - println!(" {:<40} {}", "LLM_SIMULATOR_PORT", "Server port (default: 8080)"); - println!(" {:<40} {}", "LLM_SIMULATOR_HOST", "Server host (default: 0.0.0.0)"); - println!(" {:<40} {}", "LLM_SIMULATOR_CHAOS", "Enable chaos engineering"); - println!(" {:<40} {}", "LLM_SIMULATOR_CHAOS_PROBABILITY", "Chaos probability (0.0-1.0)"); - println!(" {:<40} {}", "LLM_SIMULATOR_NO_LATENCY", "Disable latency simulation"); - println!(" {:<40} {}", "LLM_SIMULATOR_LATENCY_MULTIPLIER", "Latency multiplier"); - println!(" {:<40} {}", "LLM_SIMULATOR_SEED", "Random seed for determinism"); - println!(" {:<40} {}", "LLM_SIMULATOR_LOG_LEVEL", "Log level (trace/debug/info/warn/error)"); - println!(" {:<40} {}", "LLM_SIMULATOR_JSON_LOGS", "Enable JSON log format"); - println!(" {:<40} {}", "LLM_SIMULATOR_API_KEY", "API key for authentication"); - println!(" {:<40} {}", "LLM_SIMULATOR_REQUIRE_AUTH", "Require API key authentication"); - println!(" {:<40} {}", "LLM_SIMULATOR_MAX_CONCURRENT", "Max concurrent requests"); - println!(" {:<40} {}", "LLM_SIMULATOR_TIMEOUT", "Request timeout (seconds)"); - println!(" {:<40} {}", "OTEL_EXPORTER_OTLP_ENDPOINT", "OpenTelemetry OTLP endpoint"); + println!(" {:<40} Configuration file path", "LLM_SIMULATOR_CONFIG"); + println!(" {:<40} Server port (default: 8080)", "LLM_SIMULATOR_PORT"); + println!( + " {:<40} Server host (default: 0.0.0.0)", + "LLM_SIMULATOR_HOST" + ); + println!(" {:<40} Enable chaos engineering", "LLM_SIMULATOR_CHAOS"); + println!( + " {:<40} Chaos probability (0.0-1.0)", + "LLM_SIMULATOR_CHAOS_PROBABILITY" + ); + println!( + " {:<40} Disable latency simulation", + "LLM_SIMULATOR_NO_LATENCY" + ); + println!( + " {:<40} Latency multiplier", + "LLM_SIMULATOR_LATENCY_MULTIPLIER" + ); + println!(" {:<40} Random seed for determinism", "LLM_SIMULATOR_SEED"); + println!( + " {:<40} Log level (trace/debug/info/warn/error)", + "LLM_SIMULATOR_LOG_LEVEL" + ); + println!(" {:<40} Enable JSON log format", "LLM_SIMULATOR_JSON_LOGS"); + println!( + " {:<40} API key for authentication", + "LLM_SIMULATOR_API_KEY" + ); + println!( + " {:<40} Require API key authentication", + "LLM_SIMULATOR_REQUIRE_AUTH" + ); + println!( + " {:<40} Max concurrent requests", + "LLM_SIMULATOR_MAX_CONCURRENT" + ); + println!( + " {:<40} Request timeout (seconds)", + "LLM_SIMULATOR_TIMEOUT" + ); + println!( + " {:<40} OpenTelemetry OTLP endpoint", + "OTEL_EXPORTER_OTLP_ENDPOINT" + ); Ok(()) } } @@ -357,8 +417,13 @@ async fn execute_health(cmd: HealthCommand) -> Result<()> { } _ => { let status_emoji = if status.is_success() { "✓" } else { "✗" }; - println!("{} {} - Status: {} - Latency: {:?}", - status_emoji, url, status.as_u16(), latency); + println!( + "{} {} - Status: {} - Latency: {:?}", + status_emoji, + url, + status.as_u16(), + latency + ); if let Some(health_status) = body.get("status") { println!(" Health: {}", health_status); } @@ -366,7 +431,9 @@ async fn execute_health(cmd: HealthCommand) -> Result<()> { } if !cmd.watch { - return if status.is_success() { Ok(()) } else { + return if status.is_success() { + Ok(()) + } else { bail!("Health check failed with status {}", status) }; } @@ -409,7 +476,9 @@ async fn execute_models(cmd: ModelsCommand, config: SimulatorConfig) -> Result<( .json() .await?; - response.data.into_iter() + response + .data + .into_iter() .map(|m| ModelInfo { id: m.id.clone(), provider: m.owned_by.clone(), @@ -419,7 +488,9 @@ async fn execute_models(cmd: ModelsCommand, config: SimulatorConfig) -> Result<( .collect() } else { // Use local configuration - config.models.iter() + config + .models + .iter() .map(|(id, mc)| { let mut capabilities = vec!["chat".to_string()]; if mc.supports_streaming { @@ -440,7 +511,8 @@ async fn execute_models(cmd: ModelsCommand, config: SimulatorConfig) -> Result<( }; // Apply filters - let filtered: Vec<_> = models.into_iter() + let filtered: Vec<_> = models + .into_iter() .filter(|m| { if let Some(ref p) = cmd.provider { if !m.provider.to_lowercase().contains(&p.to_lowercase()) { @@ -465,11 +537,19 @@ async fn execute_models(cmd: ModelsCommand, config: SimulatorConfig) -> Result<( } _ => { // Table format - println!("{:<45} {:<12} {:>10} {}", "MODEL", "PROVIDER", "CONTEXT", "CAPABILITIES"); + println!( + "{:<45} {:<12} {:>10} CAPABILITIES", + "MODEL", "PROVIDER", "CONTEXT" + ); println!("{}", "-".repeat(90)); for m in filtered { - println!("{:<45} {:<12} {:>10} {}", - m.id, m.provider, m.context_length, m.capabilities.join(", ")); + println!( + "{:<45} {:<12} {:>10} {}", + m.id, + m.provider, + m.context_length, + m.capabilities.join(", ") + ); } } } @@ -488,10 +568,15 @@ async fn execute_benchmark(cmd: BenchmarkCommand) -> Result<()> { // Warmup eprintln!("Warming up with {} requests...", cmd.warmup); for _ in 0..cmd.warmup { - let _ = send_benchmark_request(&client, base_url, &cmd.model, &cmd.request_type, cmd.stream).await; + let _ = + send_benchmark_request(&client, base_url, &cmd.model, &cmd.request_type, cmd.stream) + .await; } - eprintln!("Running benchmark: {} requests, {} concurrent", cmd.requests, cmd.concurrency); + eprintln!( + "Running benchmark: {} requests, {} concurrent", + cmd.requests, cmd.concurrency + ); let semaphore = Arc::new(Semaphore::new(cmd.concurrency)); let success_count = Arc::new(AtomicUsize::new(0)); @@ -544,9 +629,18 @@ async fn execute_benchmark(cmd: BenchmarkCommand) -> Result<()> { let rps = success as f64 / elapsed.as_secs_f64(); latencies.sort(); - let p50 = latencies.get(latencies.len() / 2).copied().unwrap_or_default(); - let p95 = latencies.get(latencies.len() * 95 / 100).copied().unwrap_or_default(); - let p99 = latencies.get(latencies.len() * 99 / 100).copied().unwrap_or_default(); + let p50 = latencies + .get(latencies.len() / 2) + .copied() + .unwrap_or_default(); + let p95 = latencies + .get(latencies.len() * 95 / 100) + .copied() + .unwrap_or_default(); + let p99 = latencies + .get(latencies.len() * 99 / 100) + .copied() + .unwrap_or_default(); let avg_latency = if !latencies.is_empty() { Duration::from_micros(total_latency_us.load(Ordering::Relaxed) / latencies.len() as u64) @@ -573,9 +667,18 @@ async fn execute_benchmark(cmd: BenchmarkCommand) -> Result<()> { } "csv" => { println!("requests,success,errors,duration_secs,rps,avg_ms,p50_ms,p95_ms,p99_ms"); - println!("{},{},{},{:.2},{:.2},{},{},{},{}", - cmd.requests, success, errors, elapsed.as_secs_f64(), rps, - avg_latency.as_millis(), p50.as_millis(), p95.as_millis(), p99.as_millis()); + println!( + "{},{},{},{:.2},{:.2},{},{},{},{}", + cmd.requests, + success, + errors, + elapsed.as_secs_f64(), + rps, + avg_latency.as_millis(), + p50.as_millis(), + p95.as_millis(), + p99.as_millis() + ); } _ => { println!(); @@ -625,17 +728,25 @@ async fn execute_client(cmd: ClientCommand) -> Result<()> { message }; - let (endpoint, body) = build_chat_request(&provider, &model, &msg, system.as_deref(), max_tokens, temperature, stream); + let (endpoint, body) = build_chat_request( + &provider, + &model, + &msg, + system.as_deref(), + max_tokens, + temperature, + stream, + ); - let mut req = client.post(format!("{}{}", base_url, endpoint)) - .json(&body); + let mut req = client.post(format!("{}{}", base_url, endpoint)).json(&body); if let Some(key) = api_key { req = req.header("Authorization", format!("Bearer {}", key)); } if provider == "anthropic" { - req = req.header("x-api-key", "test-key") + req = req + .header("x-api-key", "test-key") .header("anthropic-version", "2023-06-01"); } @@ -677,7 +788,8 @@ async fn execute_client(cmd: ClientCommand) -> Result<()> { "input": text, }); - let mut req = client.post(format!("{}/v1/embeddings", base_url)) + let mut req = client + .post(format!("{}/v1/embeddings", base_url)) .json(&body); if let Some(key) = api_key { @@ -688,13 +800,11 @@ async fn execute_client(cmd: ClientCommand) -> Result<()> { if raw { println!("{}", serde_json::to_string_pretty(&response)?); - } else { - if let Some(data) = response["data"].as_array() { - if let Some(first) = data.first() { - if let Some(embedding) = first["embedding"].as_array() { - println!("Dimensions: {}", embedding.len()); - println!("First 5 values: {:?}", &embedding[..5.min(embedding.len())]); - } + } else if let Some(data) = response["data"].as_array() { + if let Some(first) = data.first() { + if let Some(embedding) = first["embedding"].as_array() { + println!("Dimensions: {}", embedding.len()); + println!("First 5 values: {:?}", &embedding[..5.min(embedding.len())]); } } } @@ -752,7 +862,8 @@ async fn execute_client(cmd: ClientCommand) -> Result<()> { "messages": messages, }); - let mut req = client.post(format!("{}/v1/chat/completions", base_url)) + let mut req = client + .post(format!("{}/v1/chat/completions", base_url)) .json(&body); if let Some(ref key) = api_key { @@ -803,15 +914,15 @@ fn execute_version() -> Result<()> { /// Execute the run command (canonical benchmarks) async fn execute_run(cmd: RunCommand) -> Result<()> { use crate::benchmarks::{ - run_all_benchmarks, run_benchmark, list_benchmarks, - generate_report, run_and_save_benchmarks, + generate_report, list_benchmarks, run_all_benchmarks, run_and_save_benchmarks, + run_benchmark, }; // List available benchmarks if cmd.list { let benchmarks = list_benchmarks(); println!("Available Benchmark Targets:\n"); - println!("{:<30} {}", "TARGET ID", "DESCRIPTION"); + println!("{:<30} DESCRIPTION", "TARGET ID"); println!("{}", "-".repeat(70)); for (id, desc) in benchmarks { println!("{:<30} {}", id, desc); @@ -869,7 +980,10 @@ async fn execute_run(cmd: RunCommand) -> Result<()> { for result in &results { println!("Target: {}", result.target_id); - println!(" Timestamp: {}", result.timestamp.format("%Y-%m-%d %H:%M:%S UTC")); + println!( + " Timestamp: {}", + result.timestamp.format("%Y-%m-%d %H:%M:%S UTC") + ); if let Some(obj) = result.metrics.as_object() { for (key, value) in obj { @@ -912,7 +1026,8 @@ async fn execute_run(cmd: RunCommand) -> Result<()> { // Helper functions fn print_banner(config: &SimulatorConfig) { - println!(r#" + println!( + r#" ╔═══════════════════════════════════════════════════════════════╗ ║ ║ ║ ██╗ ██╗ ███╗ ███╗ ███████╗██╗███╗ ███╗ ║ @@ -926,21 +1041,58 @@ fn print_banner(config: &SimulatorConfig) { ║ Enterprise-grade offline LLM API simulator ║ ║ ║ ╚═══════════════════════════════════════════════════════════════╝ -"#, VERSION); +"#, + VERSION + ); println!("Configuration:"); - println!(" • Server: {}:{}", config.server.host, config.server.port); + println!( + " • Server: {}:{}", + config.server.host, config.server.port + ); println!(" • Models: {} configured", config.models.len()); - println!(" • Latency: {}", if config.latency.enabled { "enabled" } else { "disabled" }); - println!(" • Chaos: {}", if config.chaos.enabled { "enabled" } else { "disabled" }); - println!(" • Seed: {}", config.seed.map_or("random".to_string(), |s| s.to_string())); + println!( + " • Latency: {}", + if config.latency.enabled { + "enabled" + } else { + "disabled" + } + ); + println!( + " • Chaos: {}", + if config.chaos.enabled { + "enabled" + } else { + "disabled" + } + ); + println!( + " • Seed: {}", + config.seed.map_or("random".to_string(), |s| s.to_string()) + ); println!(); println!("Endpoints:"); - println!(" • OpenAI: http://{}:{}/v1/chat/completions", config.server.host, config.server.port); - println!(" • Anthropic: http://{}:{}/v1/messages", config.server.host, config.server.port); - println!(" • Google: http://{}:{}/v1/models/{{model}}:generateContent", config.server.host, config.server.port); - println!(" • Health: http://{}:{}/health", config.server.host, config.server.port); - println!(" • Metrics: http://{}:{}/metrics", config.server.host, config.server.port); + println!( + " • OpenAI: http://{}:{}/v1/chat/completions", + config.server.host, config.server.port + ); + println!( + " • Anthropic: http://{}:{}/v1/messages", + config.server.host, config.server.port + ); + println!( + " • Google: http://{}:{}/v1/models/{{model}}:generateContent", + config.server.host, config.server.port + ); + println!( + " • Health: http://{}:{}/health", + config.server.host, config.server.port + ); + println!( + " • Metrics: http://{}:{}/metrics", + config.server.host, config.server.port + ); println!(); } @@ -990,7 +1142,8 @@ async fn send_benchmark_request( "model": "text-embedding-ada-002", "input": "Hello, world!" }); - client.post(format!("{}/v1/embeddings", base_url)) + client + .post(format!("{}/v1/embeddings", base_url)) .json(&body) .send() .await? @@ -1003,7 +1156,8 @@ async fn send_benchmark_request( "max_tokens": 10, "stream": stream }); - client.post(format!("{}/v1/chat/completions", base_url)) + client + .post(format!("{}/v1/chat/completions", base_url)) .json(&body) .send() .await? @@ -1077,32 +1231,26 @@ fn build_chat_request( fn extract_content(provider: &str, body: &serde_json::Value) -> String { match provider { - "anthropic" => { - body["content"] - .as_array() - .and_then(|arr| arr.first()) - .and_then(|c| c["text"].as_str()) - .unwrap_or("") - .to_string() - } - "google" => { - body["candidates"] - .as_array() - .and_then(|arr| arr.first()) - .and_then(|c| c["content"]["parts"].as_array()) - .and_then(|parts| parts.first()) - .and_then(|p| p["text"].as_str()) - .unwrap_or("") - .to_string() - } - _ => { - body["choices"] - .as_array() - .and_then(|arr| arr.first()) - .and_then(|c| c["message"]["content"].as_str()) - .unwrap_or("") - .to_string() - } + "anthropic" => body["content"] + .as_array() + .and_then(|arr| arr.first()) + .and_then(|c| c["text"].as_str()) + .unwrap_or("") + .to_string(), + "google" => body["candidates"] + .as_array() + .and_then(|arr| arr.first()) + .and_then(|c| c["content"]["parts"].as_array()) + .and_then(|parts| parts.first()) + .and_then(|p| p["text"].as_str()) + .unwrap_or("") + .to_string(), + _ => body["choices"] + .as_array() + .and_then(|arr| arr.first()) + .and_then(|c| c["message"]["content"].as_str()) + .unwrap_or("") + .to_string(), } } diff --git a/src/cli/mod.rs b/src/cli/mod.rs index cecfa3d..888a855 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -28,7 +28,12 @@ pub struct Cli { pub config: Option, /// Global log level (trace, debug, info, warn, error) - #[arg(long, global = true, env = "LLM_SIMULATOR_LOG_LEVEL", default_value = "info")] + #[arg( + long, + global = true, + env = "LLM_SIMULATOR_LOG_LEVEL", + default_value = "info" + )] pub log_level: String, /// Enable JSON log output diff --git a/src/config/chaos.rs b/src/config/chaos.rs index 3c0d106..8491ab4 100644 --- a/src/config/chaos.rs +++ b/src/config/chaos.rs @@ -1,9 +1,9 @@ //! Chaos engineering configuration +use crate::error::{InjectedErrorType, SimulationError, SimulatorResult}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::time::Duration; -use crate::error::{InjectedErrorType, SimulationError, SimulatorResult}; /// Chaos engineering configuration #[derive(Debug, Clone, Serialize, Deserialize)] @@ -106,7 +106,11 @@ impl ErrorInjectionRule { /// Check if this rule applies to the given model pub fn applies_to_model(&self, model: &str) -> bool { - self.models.is_empty() || self.models.iter().any(|m| m == model || model.starts_with(m)) + self.models.is_empty() + || self + .models + .iter() + .any(|m| m == model || model.starts_with(m)) } /// Check if this rule applies to the given endpoint @@ -189,22 +193,31 @@ impl Default for RateLimitConfig { let mut model_limits = HashMap::new(); // GPT-4 class models (lower limits) - model_limits.insert("gpt-4".to_string(), ModelRateLimit { - requests_per_minute: 500, - tokens_per_minute: 40_000, - }); + model_limits.insert( + "gpt-4".to_string(), + ModelRateLimit { + requests_per_minute: 500, + tokens_per_minute: 40_000, + }, + ); // GPT-3.5 class models (higher limits) - model_limits.insert("gpt-3.5".to_string(), ModelRateLimit { - requests_per_minute: 3500, - tokens_per_minute: 90_000, - }); + model_limits.insert( + "gpt-3.5".to_string(), + ModelRateLimit { + requests_per_minute: 3500, + tokens_per_minute: 90_000, + }, + ); // Claude models - model_limits.insert("claude".to_string(), ModelRateLimit { - requests_per_minute: 1000, - tokens_per_minute: 100_000, - }); + model_limits.insert( + "claude".to_string(), + ModelRateLimit { + requests_per_minute: 1000, + tokens_per_minute: 100_000, + }, + ); Self { enabled: false, @@ -258,6 +271,8 @@ pub struct ModelRateLimit { impl ModelRateLimit { /// Calculate retry-after duration based on tokens used + // `max().min()` intentionally maps NaN to the one-second floor; `clamp()` would preserve NaN. + #[allow(clippy::manual_clamp)] pub fn retry_after(&self, tokens_used: u32) -> Duration { if self.tokens_per_minute == 0 { return Duration::from_secs(60); @@ -296,54 +311,48 @@ impl ChaosScenario { } Self::IntermittentTimeouts => { config.enabled = true; - config.errors = vec![ - ErrorInjectionRule { - name: "random_timeout".to_string(), - error_type: InjectedErrorType::Timeout, - probability: 0.05, - models: vec![], - endpoints: vec![], - message: Some("Request timed out".to_string()), - status_code: Some(504), - delay_ms: Some(30000), - enabled: true, - }, - ]; + config.errors = vec![ErrorInjectionRule { + name: "random_timeout".to_string(), + error_type: InjectedErrorType::Timeout, + probability: 0.05, + models: vec![], + endpoints: vec![], + message: Some("Request timed out".to_string()), + status_code: Some(504), + delay_ms: Some(30000), + enabled: true, + }]; } Self::RateLimitStress => { config.enabled = true; config.rate_limiting.enabled = true; config.rate_limiting.requests_per_minute = 10; config.rate_limiting.tokens_per_minute = 1000; - config.errors = vec![ - ErrorInjectionRule { - name: "rate_limit".to_string(), - error_type: InjectedErrorType::RateLimit, - probability: 0.3, - models: vec![], - endpoints: vec![], - message: Some("Rate limit exceeded".to_string()), - status_code: Some(429), - delay_ms: None, - enabled: true, - }, - ]; + config.errors = vec![ErrorInjectionRule { + name: "rate_limit".to_string(), + error_type: InjectedErrorType::RateLimit, + probability: 0.3, + models: vec![], + endpoints: vec![], + message: Some("Rate limit exceeded".to_string()), + status_code: Some(429), + delay_ms: None, + enabled: true, + }]; } Self::HighLatency => { config.enabled = true; - config.errors = vec![ - ErrorInjectionRule { - name: "high_latency".to_string(), - error_type: InjectedErrorType::Timeout, - probability: 0.0, // No actual errors, just delay - models: vec![], - endpoints: vec![], - message: None, - status_code: None, - delay_ms: Some(5000), - enabled: true, - }, - ]; + config.errors = vec![ErrorInjectionRule { + name: "high_latency".to_string(), + error_type: InjectedErrorType::Timeout, + probability: 0.0, // No actual errors, just delay + models: vec![], + endpoints: vec![], + message: None, + status_code: None, + delay_ms: Some(5000), + enabled: true, + }]; } Self::PartialOutage => { config.enabled = true; @@ -375,19 +384,17 @@ impl ChaosScenario { } Self::FullOutage => { config.enabled = true; - config.errors = vec![ - ErrorInjectionRule { - name: "full_outage".to_string(), - error_type: InjectedErrorType::ServiceUnavailable, - probability: 1.0, - models: vec![], - endpoints: vec![], - message: Some("Service is currently unavailable".to_string()), - status_code: Some(503), - delay_ms: None, - enabled: true, - }, - ]; + config.errors = vec![ErrorInjectionRule { + name: "full_outage".to_string(), + error_type: InjectedErrorType::ServiceUnavailable, + probability: 1.0, + models: vec![], + endpoints: vec![], + message: Some("Service is currently unavailable".to_string()), + status_code: Some(503), + delay_ms: None, + enabled: true, + }]; } Self::Custom => { // No changes - use existing config diff --git a/src/config/latency.rs b/src/config/latency.rs index 2c521b3..f19a775 100644 --- a/src/config/latency.rs +++ b/src/config/latency.rs @@ -1,9 +1,9 @@ //! Latency simulation configuration +use crate::error::{SimulationError, SimulatorResult}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::time::Duration; -use crate::error::{SimulationError, SimulatorResult}; /// Latency simulation configuration #[derive(Debug, Clone, Serialize, Deserialize)] @@ -24,53 +24,74 @@ impl Default for LatencyConfig { let mut profiles = HashMap::new(); // Fast profile (local/edge) - profiles.insert("fast".to_string(), LatencyProfile { - ttft: LatencyDistribution::normal(50.0, 10.0), - itl: LatencyDistribution::normal(15.0, 3.0), - overhead: Duration::from_millis(5), - }); + profiles.insert( + "fast".to_string(), + LatencyProfile { + ttft: LatencyDistribution::normal(50.0, 10.0), + itl: LatencyDistribution::normal(15.0, 3.0), + overhead: Duration::from_millis(5), + }, + ); // Standard profile (typical cloud) - profiles.insert("standard".to_string(), LatencyProfile { - ttft: LatencyDistribution::normal(200.0, 50.0), - itl: LatencyDistribution::normal(30.0, 8.0), - overhead: Duration::from_millis(10), - }); + profiles.insert( + "standard".to_string(), + LatencyProfile { + ttft: LatencyDistribution::normal(200.0, 50.0), + itl: LatencyDistribution::normal(30.0, 8.0), + overhead: Duration::from_millis(10), + }, + ); // Slow profile (congested/distant) - profiles.insert("slow".to_string(), LatencyProfile { - ttft: LatencyDistribution::normal(500.0, 100.0), - itl: LatencyDistribution::normal(60.0, 15.0), - overhead: Duration::from_millis(20), - }); + profiles.insert( + "slow".to_string(), + LatencyProfile { + ttft: LatencyDistribution::normal(500.0, 100.0), + itl: LatencyDistribution::normal(60.0, 15.0), + overhead: Duration::from_millis(20), + }, + ); // GPT-4 realistic profile - profiles.insert("gpt4".to_string(), LatencyProfile { - ttft: LatencyDistribution::log_normal(300.0, 150.0), - itl: LatencyDistribution::log_normal(40.0, 15.0), - overhead: Duration::from_millis(15), - }); + profiles.insert( + "gpt4".to_string(), + LatencyProfile { + ttft: LatencyDistribution::log_normal(300.0, 150.0), + itl: LatencyDistribution::log_normal(40.0, 15.0), + overhead: Duration::from_millis(15), + }, + ); // Claude realistic profile - profiles.insert("claude".to_string(), LatencyProfile { - ttft: LatencyDistribution::log_normal(250.0, 100.0), - itl: LatencyDistribution::log_normal(35.0, 12.0), - overhead: Duration::from_millis(12), - }); + profiles.insert( + "claude".to_string(), + LatencyProfile { + ttft: LatencyDistribution::log_normal(250.0, 100.0), + itl: LatencyDistribution::log_normal(35.0, 12.0), + overhead: Duration::from_millis(12), + }, + ); // Gemini realistic profile - profiles.insert("gemini".to_string(), LatencyProfile { - ttft: LatencyDistribution::log_normal(200.0, 80.0), - itl: LatencyDistribution::log_normal(25.0, 10.0), - overhead: Duration::from_millis(10), - }); + profiles.insert( + "gemini".to_string(), + LatencyProfile { + ttft: LatencyDistribution::log_normal(200.0, 80.0), + itl: LatencyDistribution::log_normal(25.0, 10.0), + overhead: Duration::from_millis(10), + }, + ); // Zero latency (for testing) - profiles.insert("instant".to_string(), LatencyProfile { - ttft: LatencyDistribution::fixed(0.0), - itl: LatencyDistribution::fixed(0.0), - overhead: Duration::from_millis(0), - }); + profiles.insert( + "instant".to_string(), + LatencyProfile { + ttft: LatencyDistribution::fixed(0.0), + itl: LatencyDistribution::fixed(0.0), + overhead: Duration::from_millis(0), + }, + ); Self { enabled: true, @@ -96,10 +117,12 @@ impl LatencyConfig { }); } for (name, profile) in &self.profiles { - profile.validate().map_err(|e| SimulationError::Validation { - message: format!("Invalid latency profile '{}': {}", name, e), - param: Some(format!("latency.profiles.{}", name)), - })?; + profile + .validate() + .map_err(|e| SimulationError::Validation { + message: format!("Invalid latency profile '{}': {}", name, e), + param: Some(format!("latency.profiles.{}", name)), + })?; } Ok(()) } @@ -111,7 +134,8 @@ impl LatencyConfig { /// Get the default latency profile pub fn default_profile(&self) -> &LatencyProfile { - self.profiles.get(&self.default_profile) + self.profiles + .get(&self.default_profile) .expect("Default profile should always exist") } } @@ -160,11 +184,17 @@ impl LatencyDistribution { } pub fn normal(mean_ms: f64, std_dev_ms: f64) -> Self { - Self::Normal { mean_ms, std_dev_ms } + Self::Normal { + mean_ms, + std_dev_ms, + } } pub fn log_normal(mean_ms: f64, std_dev_ms: f64) -> Self { - Self::LogNormal { mean_ms, std_dev_ms } + Self::LogNormal { + mean_ms, + std_dev_ms, + } } pub fn uniform(min_ms: f64, max_ms: f64) -> Self { @@ -211,9 +241,7 @@ impl LatencyDistribution { Self::LogNormal { mean_ms, .. } => *mean_ms, Self::Uniform { min_ms, max_ms } => (min_ms + max_ms) / 2.0, Self::Exponential { mean_ms } => *mean_ms, - Self::Pareto { scale_ms, shape } if *shape > 1.0 => { - (shape * scale_ms) / (shape - 1.0) - } + Self::Pareto { scale_ms, shape } if *shape > 1.0 => (shape * scale_ms) / (shape - 1.0), Self::Pareto { .. } => f64::INFINITY, } } diff --git a/src/config/mod.rs b/src/config/mod.rs index 03546b8..0aee7fd 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -6,22 +6,22 @@ //! - Runtime reconfiguration //! - Validation -mod models; -mod latency; mod chaos; +mod latency; +mod models; pub mod security; -pub use models::*; -pub use latency::*; pub use chaos::*; +pub use latency::*; +pub use models::*; pub use security::SecurityConfig; +use crate::error::{SimulationError, SimulatorResult}; +use crate::types::Provider; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::path::Path; use std::time::Duration; -use crate::error::{SimulationError, SimulatorResult}; -use crate::types::Provider; /// Configuration for Phase 7 Intelligence & Expansion (Layer 2) #[derive(Debug, Clone, Serialize, Deserialize)] @@ -47,8 +47,8 @@ impl Default for IntelligenceIntegrationConfig { fn default() -> Self { Self { enabled: true, - max_tokens: 2500, // Phase 7 budget - max_latency_ms: 5000, // Phase 7 budget + max_tokens: 2500, // Phase 7 budget + max_latency_ms: 5000, // Phase 7 budget cache_enabled: true, cache_ttl_secs: 300, retry_enabled: true, @@ -102,7 +102,7 @@ pub struct RuvVectorIntegrationConfig { impl Default for RuvVectorIntegrationConfig { fn default() -> Self { Self { - enabled: true, // RuvVector-first: enabled by default + enabled: true, // RuvVector-first: enabled by default service_url: None, // Will use RUVVECTOR_SERVICE_URL env var timeout_secs: 30, cache_enabled: false, // RuvVector owns caching per SPARC @@ -111,7 +111,7 @@ impl Default for RuvVectorIntegrationConfig { max_retries: 3, fallback_to_mock: false, // RuvVector-first: no fallback by default require_ruvvector: true, // RuvVector-first: require RuvVector by default - allow_mocks: false, // RuvVector-first: no mocks by default + allow_mocks: false, // RuvVector-first: no mocks by default } } } @@ -119,7 +119,8 @@ impl Default for RuvVectorIntegrationConfig { impl RuvVectorIntegrationConfig { /// Check if integration should be attempted pub fn should_integrate(&self) -> bool { - self.enabled && (self.service_url.is_some() || std::env::var("RUVVECTOR_SERVICE_URL").is_ok()) + self.enabled + && (self.service_url.is_some() || std::env::var("RUVVECTOR_SERVICE_URL").is_ok()) } /// Convert to adapter configuration @@ -128,7 +129,9 @@ impl RuvVectorIntegrationConfig { return None; } - let service_url = self.service_url.clone() + let service_url = self + .service_url + .clone() .or_else(|| std::env::var("RUVVECTOR_SERVICE_URL").ok())?; Some(crate::adapters::ruvvector::RuvVectorConfig { @@ -184,19 +187,43 @@ impl Default for SimulatorConfig { models.insert("gpt-3.5-turbo".to_string(), ModelConfig::gpt35_turbo()); // Default Anthropic models - models.insert("claude-3-5-sonnet-20241022".to_string(), ModelConfig::claude_35_sonnet()); - models.insert("claude-3-opus-20240229".to_string(), ModelConfig::claude_3_opus()); - models.insert("claude-3-sonnet-20240229".to_string(), ModelConfig::claude_3_sonnet()); - models.insert("claude-3-haiku-20240307".to_string(), ModelConfig::claude_3_haiku()); + models.insert( + "claude-3-5-sonnet-20241022".to_string(), + ModelConfig::claude_35_sonnet(), + ); + models.insert( + "claude-3-opus-20240229".to_string(), + ModelConfig::claude_3_opus(), + ); + models.insert( + "claude-3-sonnet-20240229".to_string(), + ModelConfig::claude_3_sonnet(), + ); + models.insert( + "claude-3-haiku-20240307".to_string(), + ModelConfig::claude_3_haiku(), + ); // Default Google models models.insert("gemini-1.5-pro".to_string(), ModelConfig::gemini_15_pro()); - models.insert("gemini-1.5-flash".to_string(), ModelConfig::gemini_15_flash()); + models.insert( + "gemini-1.5-flash".to_string(), + ModelConfig::gemini_15_flash(), + ); // Default embedding models - models.insert("text-embedding-ada-002".to_string(), ModelConfig::embedding_ada()); - models.insert("text-embedding-3-small".to_string(), ModelConfig::embedding_3_small()); - models.insert("text-embedding-3-large".to_string(), ModelConfig::embedding_3_large()); + models.insert( + "text-embedding-ada-002".to_string(), + ModelConfig::embedding_ada(), + ); + models.insert( + "text-embedding-3-small".to_string(), + ModelConfig::embedding_3_small(), + ); + models.insert( + "text-embedding-3-large".to_string(), + ModelConfig::embedding_3_large(), + ); Self { server: ServerConfig::default(), @@ -227,9 +254,11 @@ impl SimulatorConfig { .map_err(|e| SimulationError::Config(format!("TOML parse error: {}", e)))?, Some("json") => serde_json::from_str(&content) .map_err(|e| SimulationError::Config(format!("JSON parse error: {}", e)))?, - _ => return Err(SimulationError::Config( - "Unsupported config file format. Use .yaml, .toml, or .json".to_string() - )), + _ => { + return Err(SimulationError::Config( + "Unsupported config file format. Use .yaml, .toml, or .json".to_string(), + )) + } }; config.validate()?; @@ -242,9 +271,9 @@ impl SimulatorConfig { // Override with environment variables if let Ok(port) = std::env::var("LLM_SIMULATOR_PORT") { - config.server.port = port.parse().map_err(|_| { - SimulationError::Config("Invalid port number".to_string()) - })?; + config.server.port = port + .parse() + .map_err(|_| SimulationError::Config("Invalid port number".to_string()))?; } if let Ok(host) = std::env::var("LLM_SIMULATOR_HOST") { @@ -252,9 +281,10 @@ impl SimulatorConfig { } if let Ok(seed) = std::env::var("LLM_SIMULATOR_SEED") { - config.seed = Some(seed.parse().map_err(|_| { - SimulationError::Config("Invalid seed value".to_string()) - })?); + config.seed = Some( + seed.parse() + .map_err(|_| SimulationError::Config("Invalid seed value".to_string()))?, + ); } if let Ok(val) = std::env::var("LLM_SIMULATOR_CHAOS_ENABLED") { @@ -338,7 +368,10 @@ impl SimulatorConfig { pub fn minimal() -> Self { let mut models = HashMap::new(); models.insert("gpt-4".to_string(), ModelConfig::gpt4()); - models.insert("text-embedding-ada-002".to_string(), ModelConfig::embedding_ada()); + models.insert( + "text-embedding-ada-002".to_string(), + ModelConfig::embedding_ada(), + ); Self { server: ServerConfig::default(), @@ -496,15 +529,19 @@ mod humantime_serde { fn parse_duration(s: &str) -> Result { let s = s.trim(); if let Some(secs) = s.strip_suffix('s') { - secs.trim().parse::() + secs.trim() + .parse::() .map(Duration::from_secs) .map_err(|_| format!("Invalid duration: {}", s)) } else if let Some(millis) = s.strip_suffix("ms") { - millis.trim().parse::() + millis + .trim() + .parse::() .map(Duration::from_millis) .map_err(|_| format!("Invalid duration: {}", s)) } else if let Some(mins) = s.strip_suffix('m') { - mins.trim().parse::() + mins.trim() + .parse::() .map(|m| Duration::from_secs(m * 60)) .map_err(|_| format!("Invalid duration: {}", s)) } else { diff --git a/src/config/models.rs b/src/config/models.rs index 53a4a28..3b340d3 100644 --- a/src/config/models.rs +++ b/src/config/models.rs @@ -1,7 +1,7 @@ //! Model configuration definitions -use serde::{Deserialize, Serialize}; use crate::types::Provider; +use serde::{Deserialize, Serialize}; /// Configuration for a specific model #[derive(Debug, Clone, Serialize, Deserialize)] diff --git a/src/config/security.rs b/src/config/security.rs index 53f7e89..fc71ae4 100644 --- a/src/config/security.rs +++ b/src/config/security.rs @@ -14,6 +14,7 @@ use std::time::Duration; /// Security configuration #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] +#[derive(Default)] pub struct SecurityConfig { /// API key authentication settings pub api_keys: ApiKeyConfig, @@ -27,18 +28,6 @@ pub struct SecurityConfig { pub headers: SecurityHeadersConfig, } -impl Default for SecurityConfig { - fn default() -> Self { - Self { - api_keys: ApiKeyConfig::default(), - admin: AdminConfig::default(), - cors: CorsConfig::default(), - rate_limiting: RateLimitConfig::default(), - headers: SecurityHeadersConfig::default(), - } - } -} - impl SecurityConfig { /// Validate the security configuration pub fn validate(&self) -> Result<(), String> { @@ -268,10 +257,9 @@ impl CorsConfig { self.allowed_origins.iter().any(|allowed| { if allowed == "*" { true - } else if allowed.starts_with("*.") { + } else if let Some(domain) = allowed.strip_prefix("*.") { // Wildcard subdomain matching - let domain = &allowed[2..]; - origin.ends_with(domain) || origin == &allowed[2..] + origin.ends_with(domain) || origin == domain } else { origin == allowed } @@ -399,7 +387,7 @@ impl Default for SecurityHeadersConfig { fn default() -> Self { Self { enabled: true, - hsts_enabled: false, // Disabled by default, enable when behind TLS + hsts_enabled: false, // Disabled by default, enable when behind TLS hsts_max_age: 31536000, // 1 year hsts_include_subdomains: true, hsts_preload: false, @@ -434,15 +422,19 @@ mod humantime_serde_duration { fn parse_duration(s: &str) -> Result { let s = s.trim(); if let Some(secs) = s.strip_suffix('s') { - secs.trim().parse::() + secs.trim() + .parse::() .map(Duration::from_secs) .map_err(|_| format!("Invalid duration: {}", s)) } else if let Some(millis) = s.strip_suffix("ms") { - millis.trim().parse::() + millis + .trim() + .parse::() .map(Duration::from_millis) .map_err(|_| format!("Invalid duration: {}", s)) } else if let Some(mins) = s.strip_suffix('m') { - mins.trim().parse::() + mins.trim() + .parse::() .map(|m| Duration::from_secs(m * 60)) .map_err(|_| format!("Invalid duration: {}", s)) } else { @@ -468,8 +460,10 @@ mod tests { #[test] fn test_api_key_validation() { - let mut config = ApiKeyConfig::default(); - config.enabled = true; + let mut config = ApiKeyConfig { + enabled: true, + ..Default::default() + }; assert!(config.validate().is_err()); config.keys.push(ApiKeyEntry { @@ -503,9 +497,24 @@ mod tests { fn test_rate_limit_tiers() { let config = RateLimitConfig::default(); - assert_eq!(config.get_tier_config(RateLimitTier::Standard).requests_per_minute, 60); - assert_eq!(config.get_tier_config(RateLimitTier::Premium).requests_per_minute, 600); - assert_eq!(config.get_tier_config(RateLimitTier::Admin).requests_per_minute, 1000); + assert_eq!( + config + .get_tier_config(RateLimitTier::Standard) + .requests_per_minute, + 60 + ); + assert_eq!( + config + .get_tier_config(RateLimitTier::Premium) + .requests_per_minute, + 600 + ); + assert_eq!( + config + .get_tier_config(RateLimitTier::Admin) + .requests_per_minute, + 1000 + ); } #[test] diff --git a/src/engine/chaos.rs b/src/engine/chaos.rs index cade85e..19257bc 100644 --- a/src/engine/chaos.rs +++ b/src/engine/chaos.rs @@ -1,13 +1,13 @@ //! Chaos engineering implementation +use parking_lot::RwLock; use rand::prelude::*; +use std::collections::HashMap; use std::sync::atomic::{AtomicU64, Ordering}; use std::time::Instant; -use parking_lot::RwLock; -use std::collections::HashMap; -use crate::config::{ChaosConfig, ErrorInjectionRule, CircuitBreakerConfig}; -use crate::error::{SimulationError, InjectedErrorType}; +use crate::config::{ChaosConfig, CircuitBreakerConfig, ErrorInjectionRule}; +use crate::error::{InjectedErrorType, SimulationError}; /// Chaos engineering engine for error injection and circuit breaking pub struct ChaosEngine { @@ -82,20 +82,20 @@ impl ChaosEngine { /// Create an error from a rule fn create_error(&self, rule: &ErrorInjectionRule) -> SimulationError { - let message = rule.message.clone() + let message = rule + .message + .clone() .unwrap_or_else(|| format!("Injected {} error", rule.error_type)); - let status_code = rule.status_code.unwrap_or_else(|| { - match rule.error_type { - InjectedErrorType::RateLimit => 429, - InjectedErrorType::Timeout => 504, - InjectedErrorType::ServerError => 500, - InjectedErrorType::BadGateway => 502, - InjectedErrorType::ServiceUnavailable => 503, - InjectedErrorType::AuthenticationError => 401, - InjectedErrorType::InvalidRequest => 400, - InjectedErrorType::ContextLengthExceeded => 400, - } + let status_code = rule.status_code.unwrap_or(match rule.error_type { + InjectedErrorType::RateLimit => 429, + InjectedErrorType::Timeout => 504, + InjectedErrorType::ServerError => 500, + InjectedErrorType::BadGateway => 502, + InjectedErrorType::ServiceUnavailable => 503, + InjectedErrorType::AuthenticationError => 401, + InjectedErrorType::InvalidRequest => 400, + InjectedErrorType::ContextLengthExceeded => 400, }); SimulationError::Injected { @@ -114,13 +114,13 @@ impl ChaosEngine { }; let mut breakers = self.circuit_breakers.write(); - let breaker = breakers.entry(key).or_insert_with(|| { - CircuitBreaker::new(self.config.circuit_breaker.clone()) - }); + let breaker = breakers + .entry(key) + .or_insert_with(|| CircuitBreaker::new(self.config.circuit_breaker.clone())); if breaker.is_open() { Some(SimulationError::ServiceUnavailable( - "Circuit breaker is open".to_string() + "Circuit breaker is open".to_string(), )) } else { None @@ -189,9 +189,7 @@ impl ChaosEngine { "global".to_string() }; - self.circuit_breakers.read() - .get(&key) - .map(|b| b.status()) + self.circuit_breakers.read().get(&key).map(|b| b.status()) } /// Reset all circuit breakers @@ -338,25 +336,29 @@ mod tests { let engine = ChaosEngine::new(config); assert!(!engine.is_active()); - assert!(engine.maybe_inject_error("gpt-4", "/chat/completions").is_none()); + assert!(engine + .maybe_inject_error("gpt-4", "/chat/completions") + .is_none()); } #[test] fn test_chaos_engine_enabled() { - let mut config = ChaosConfig::default(); - config.enabled = true; - config.global_probability = 1.0; - config.errors = vec![ErrorInjectionRule { - name: "always_fail".to_string(), - error_type: InjectedErrorType::ServerError, - probability: 1.0, - models: vec![], - endpoints: vec![], - message: Some("Test error".to_string()), - status_code: Some(500), - delay_ms: None, + let config = ChaosConfig { enabled: true, - }]; + global_probability: 1.0, + errors: vec![ErrorInjectionRule { + name: "always_fail".to_string(), + error_type: InjectedErrorType::ServerError, + probability: 1.0, + models: vec![], + endpoints: vec![], + message: Some("Test error".to_string()), + status_code: Some(500), + delay_ms: None, + enabled: true, + }], + ..Default::default() + }; let engine = ChaosEngine::new(config); assert!(engine.is_active()); @@ -367,20 +369,22 @@ mod tests { #[test] fn test_model_filter() { - let mut config = ChaosConfig::default(); - config.enabled = true; - config.global_probability = 1.0; - config.errors = vec![ErrorInjectionRule { - name: "gpt4_only".to_string(), - error_type: InjectedErrorType::ServerError, - probability: 1.0, - models: vec!["gpt-4".to_string()], - endpoints: vec![], - message: None, - status_code: None, - delay_ms: None, + let config = ChaosConfig { enabled: true, - }]; + global_probability: 1.0, + errors: vec![ErrorInjectionRule { + name: "gpt4_only".to_string(), + error_type: InjectedErrorType::ServerError, + probability: 1.0, + models: vec!["gpt-4".to_string()], + endpoints: vec![], + message: None, + status_code: None, + delay_ms: None, + enabled: true, + }], + ..Default::default() + }; let engine = ChaosEngine::new(config); diff --git a/src/engine/generator.rs b/src/engine/generator.rs index 86ac656..021ac14 100644 --- a/src/engine/generator.rs +++ b/src/engine/generator.rs @@ -58,11 +58,11 @@ impl ResponseGenerator { crate::config::GenerationStrategy::Echo => { self.generate_echo(messages, target_tokens as usize) } - crate::config::GenerationStrategy::Fixed => { - config.templates.first() - .cloned() - .unwrap_or_else(|| "This is a simulated response.".to_string()) - } + crate::config::GenerationStrategy::Fixed => config + .templates + .first() + .cloned() + .unwrap_or_else(|| "This is a simulated response.".to_string()), crate::config::GenerationStrategy::Random => { generate_random_text(target_tokens as usize, &mut rng) } @@ -121,7 +121,8 @@ impl ResponseGenerator { let paragraphs = if last_message.contains('?') { QUESTION_RESPONSES } else if last_message.to_lowercase().contains("code") - || last_message.to_lowercase().contains("program") { + || last_message.to_lowercase().contains("program") + { CODE_RESPONSES } else if last_message.to_lowercase().contains("explain") { EXPLANATION_RESPONSES @@ -134,9 +135,7 @@ impl ResponseGenerator { /// Generate echo response fn generate_echo(&self, messages: &[Message], target_tokens: usize) -> String { - let last_message = messages.last() - .map(|m| m.text()) - .unwrap_or_default(); + let last_message = messages.last().map(|m| m.text()).unwrap_or_default(); let response = format!( "I understand you're asking about: \"{}\"\n\nHere's my response to that:", @@ -146,10 +145,8 @@ impl ResponseGenerator { // Pad to target length let target_chars = target_tokens * 4; if response.len() < target_chars { - let padding = generate_lorem( - (target_chars - response.len()) / 4, - &mut rand::thread_rng(), - ); + let padding = + generate_lorem((target_chars - response.len()) / 4, &mut rand::thread_rng()); format!("{}\n\n{}", response, padding) } else { response @@ -164,9 +161,7 @@ impl ResponseGenerator { let seed = hasher.finish(); let mut rng = StdRng::seed_from_u64(seed); - let mut embedding: Vec = (0..dimensions) - .map(|_| rng.gen_range(-1.0..1.0)) - .collect(); + let mut embedding: Vec = (0..dimensions).map(|_| rng.gen_range(-1.0..1.0)).collect(); // Normalize to unit vector let magnitude: f32 = embedding.iter().map(|x| x * x).sum::().sqrt(); @@ -187,11 +182,11 @@ impl ResponseGenerator { for c in text.chars() { current.push(c); // Split on spaces, punctuation, or every ~4 chars - if c.is_whitespace() || c.is_ascii_punctuation() || current.len() >= 4 { - if !current.is_empty() { - tokens.push(current.clone()); - current.clear(); - } + if (c.is_whitespace() || c.is_ascii_punctuation() || current.len() >= 4) + && !current.is_empty() + { + tokens.push(current.clone()); + current.clear(); } } @@ -218,14 +213,68 @@ fn estimate_tokens(text: &str) -> u32 { /// Generate lorem ipsum text fn generate_lorem(target_tokens: usize, rng: &mut R) -> String { let words = [ - "lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", - "sed", "do", "eiusmod", "tempor", "incididunt", "ut", "labore", "et", "dolore", - "magna", "aliqua", "enim", "ad", "minim", "veniam", "quis", "nostrud", - "exercitation", "ullamco", "laboris", "nisi", "aliquip", "ex", "ea", "commodo", - "consequat", "duis", "aute", "irure", "in", "reprehenderit", "voluptate", - "velit", "esse", "cillum", "fugiat", "nulla", "pariatur", "excepteur", "sint", - "occaecat", "cupidatat", "non", "proident", "sunt", "culpa", "qui", "officia", - "deserunt", "mollit", "anim", "id", "est", "laborum", + "lorem", + "ipsum", + "dolor", + "sit", + "amet", + "consectetur", + "adipiscing", + "elit", + "sed", + "do", + "eiusmod", + "tempor", + "incididunt", + "ut", + "labore", + "et", + "dolore", + "magna", + "aliqua", + "enim", + "ad", + "minim", + "veniam", + "quis", + "nostrud", + "exercitation", + "ullamco", + "laboris", + "nisi", + "aliquip", + "ex", + "ea", + "commodo", + "consequat", + "duis", + "aute", + "irure", + "in", + "reprehenderit", + "voluptate", + "velit", + "esse", + "cillum", + "fugiat", + "nulla", + "pariatur", + "excepteur", + "sint", + "occaecat", + "cupidatat", + "non", + "proident", + "sunt", + "culpa", + "qui", + "officia", + "deserunt", + "mollit", + "anim", + "id", + "est", + "laborum", ]; let mut result = Vec::new(); @@ -262,12 +311,57 @@ fn generate_lorem(target_tokens: usize, rng: &mut R) -> String { /// Generate random text from a vocabulary fn generate_random_text(target_tokens: usize, rng: &mut StdRng) -> String { let vocab = [ - "the", "a", "is", "are", "was", "were", "have", "has", "had", "do", "does", - "did", "will", "would", "could", "should", "may", "might", "must", "can", - "this", "that", "these", "those", "it", "they", "we", "you", "he", "she", - "system", "data", "model", "process", "function", "result", "value", "type", - "input", "output", "request", "response", "error", "success", "status", - "configuration", "parameter", "option", "setting", "property", "attribute", + "the", + "a", + "is", + "are", + "was", + "were", + "have", + "has", + "had", + "do", + "does", + "did", + "will", + "would", + "could", + "should", + "may", + "might", + "must", + "can", + "this", + "that", + "these", + "those", + "it", + "they", + "we", + "you", + "he", + "she", + "system", + "data", + "model", + "process", + "function", + "result", + "value", + "type", + "input", + "output", + "request", + "response", + "error", + "success", + "status", + "configuration", + "parameter", + "option", + "setting", + "property", + "attribute", ]; let words: Vec<&str> = (0..target_tokens) @@ -364,7 +458,7 @@ mod tests { }; let (response, _) = gen.generate_response(&messages, 100, &config); - assert!(response.to_lowercase().contains("lorem") || response.len() > 0); + assert!(response.to_lowercase().contains("lorem") || !response.is_empty()); } #[test] diff --git a/src/engine/mod.rs b/src/engine/mod.rs index ba82fc4..605b222 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -6,27 +6,29 @@ //! - Injecting errors for chaos testing //! - Managing deterministic behavior with seeds -mod generator; mod chaos; +mod generator; mod state; -pub use generator::*; pub use chaos::*; +pub use generator::*; pub use state::*; -use std::sync::Arc; +use parking_lot::RwLock; use std::sync::atomic::{AtomicU64, Ordering}; +use std::sync::Arc; use std::time::{Duration, Instant}; -use parking_lot::RwLock; use tracing::{debug, info, warn}; use uuid::Uuid; -use crate::adapters::ruvvector::{OptionalRuvVectorAdapter, SimulateRequest, SimulateInput, SimulateMessage, SimulateParameters}; use crate::adapters::observatory::SpanStatus; -use crate::telemetry::tracing_ext::{FeuSpanCollector, ExecutionTrace, SpanArtifact}; -use crate::config::{SimulatorConfig, ModelConfig}; +use crate::adapters::ruvvector::{ + OptionalRuvVectorAdapter, SimulateInput, SimulateMessage, SimulateParameters, SimulateRequest, +}; +use crate::config::{ModelConfig, SimulatorConfig}; use crate::error::{SimulationError, SimulatorResult}; -use crate::latency::{LatencySimulator, LatencySchedule}; +use crate::latency::{LatencySchedule, LatencySimulator}; +use crate::telemetry::tracing_ext::{ExecutionTrace, FeuSpanCollector, SpanArtifact}; use crate::types::*; /// The main simulation engine @@ -118,7 +120,10 @@ impl SimulationEngine { self.state.increment_requests(); // Check for chaos injection - if let Some(error) = self.chaos_engine.maybe_inject_error(&request.model, "/chat/completions") { + if let Some(error) = self + .chaos_engine + .maybe_inject_error(&request.model, "/chat/completions") + { self.state.increment_errors(); return Err(error); } @@ -127,10 +132,12 @@ impl SimulationEngine { let model_config = self.get_model_config(&request.model)?; // Validate request - request.validate().map_err(|e| SimulationError::Validation { - message: e, - param: None, - })?; + request + .validate() + .map_err(|e| SimulationError::Validation { + message: e, + param: None, + })?; // Check context length let input_tokens = request.estimate_input_tokens(); @@ -142,16 +149,23 @@ impl SimulationEngine { } // Generate response - let id = format!("chatcmpl-{}", Uuid::new_v4().to_string().replace("-", "")[..24].to_string()); - let max_tokens = request.effective_max_tokens().min(model_config.max_output_tokens as u32); + let id = format!( + "chatcmpl-{}", + &Uuid::new_v4().to_string().replace("-", "")[..24] + ); + let max_tokens = request + .effective_max_tokens() + .min(model_config.max_output_tokens as u32); // Try RuvVector service first if configured, then fall back to local generator - let (content, output_tokens) = self.generate_content_with_fallback( - &request.messages, - &request.model, - max_tokens, - &model_config, - ).await?; + let (content, output_tokens) = self + .generate_content_with_fallback( + &request.messages, + &request.model, + max_tokens, + &model_config, + ) + .await?; let usage = Usage::new(input_tokens as u32, output_tokens); @@ -165,7 +179,8 @@ impl SimulationEngine { let response = ChatCompletionResponse::simple(id, request.model.clone(), content, usage); self.state.record_latency(start.elapsed()); - self.state.add_tokens(input_tokens as u64, output_tokens as u64); + self.state + .add_tokens(input_tokens as u64, output_tokens as u64); Ok(response) } @@ -178,7 +193,10 @@ impl SimulationEngine { self.state.increment_requests(); // Check for chaos injection - if let Some(error) = self.chaos_engine.maybe_inject_error(&request.model, "/chat/completions") { + if let Some(error) = self + .chaos_engine + .maybe_inject_error(&request.model, "/chat/completions") + { self.state.increment_errors(); return Err(error); } @@ -194,10 +212,12 @@ impl SimulationEngine { } // Validate request - request.validate().map_err(|e| SimulationError::Validation { - message: e, - param: None, - })?; + request + .validate() + .map_err(|e| SimulationError::Validation { + message: e, + param: None, + })?; // Check context length let input_tokens = request.estimate_input_tokens(); @@ -209,16 +229,23 @@ impl SimulationEngine { } // Generate response tokens - let id = format!("chatcmpl-{}", Uuid::new_v4().to_string().replace("-", "")[..24].to_string()); - let max_tokens = request.effective_max_tokens().min(model_config.max_output_tokens as u32); + let id = format!( + "chatcmpl-{}", + &Uuid::new_v4().to_string().replace("-", "")[..24] + ); + let max_tokens = request + .effective_max_tokens() + .min(model_config.max_output_tokens as u32); // Try RuvVector service first if configured, then fall back to local generator - let (content, output_tokens) = self.generate_content_with_fallback( - &request.messages, - &request.model, - max_tokens, - &model_config, - ).await?; + let (content, output_tokens) = self + .generate_content_with_fallback( + &request.messages, + &request.model, + max_tokens, + &model_config, + ) + .await?; // Tokenize for streaming let tokens = self.generator.tokenize(&content); @@ -228,7 +255,8 @@ impl SimulationEngine { let schedule = self.latency_sim.generate_schedule(tokens.len(), profile); let usage = Usage::new(input_tokens as u32, output_tokens); - self.state.add_tokens(input_tokens as u64, output_tokens as u64); + self.state + .add_tokens(input_tokens as u64, output_tokens as u64); Ok(StreamingResponse { id, @@ -240,12 +268,18 @@ impl SimulationEngine { } /// Generate embeddings - pub async fn embeddings(&self, request: &EmbeddingsRequest) -> SimulatorResult { + pub async fn embeddings( + &self, + request: &EmbeddingsRequest, + ) -> SimulatorResult { let start = Instant::now(); self.state.increment_requests(); // Check for chaos injection - if let Some(error) = self.chaos_engine.maybe_inject_error(&request.model, "/embeddings") { + if let Some(error) = self + .chaos_engine + .maybe_inject_error(&request.model, "/embeddings") + { self.state.increment_errors(); return Err(error); } @@ -261,7 +295,8 @@ impl SimulationEngine { } let inputs = request.input.to_vec(); - let dimensions = request.dimensions + let dimensions = request + .dimensions .map(|d| d as usize) .or(model_config.embedding_dimensions) .unwrap_or(1536); @@ -291,7 +326,9 @@ impl SimulationEngine { /// List available models pub fn list_models(&self) -> ModelsResponse { let config = self.config.read(); - let models: Vec = config.models.iter() + let models: Vec = config + .models + .iter() .map(|(id, mc)| ModelObject::new(id, mc.provider.to_string())) .collect(); ModelsResponse::new(models) @@ -300,14 +337,18 @@ impl SimulationEngine { /// Get a specific model pub fn get_model(&self, model_id: &str) -> Option { let config = self.config.read(); - config.models.get(model_id) + config + .models + .get(model_id) .map(|mc| ModelObject::new(model_id, mc.provider.to_string())) } /// Get model configuration fn get_model_config(&self, model_id: &str) -> SimulatorResult { let config = self.config.read(); - config.models.get(model_id) + config + .models + .get(model_id) .cloned() .ok_or_else(|| SimulationError::ModelNotFound(model_id.to_string())) } @@ -362,7 +403,7 @@ impl SimulationEngine { // Check if RuvVector is configured if !self.ruvvector.is_configured() { return Err(SimulationError::ServiceUnavailable( - "RuvVector is required but RUVVECTOR_SERVICE_URL is not configured".to_string() + "RuvVector is required but RUVVECTOR_SERVICE_URL is not configured".to_string(), )); } @@ -376,11 +417,10 @@ impl SimulationEngine { ); Ok(()) } - Err(e) => { - Err(SimulationError::ServiceUnavailable( - format!("RuvVector is required but health check failed: {}", e) - )) - } + Err(e) => Err(SimulationError::ServiceUnavailable(format!( + "RuvVector is required but health check failed: {}", + e + ))), } } @@ -401,7 +441,8 @@ impl SimulationEngine { ) -> SimulatorResult<(ChatCompletionResponse, ExecutionTrace)> { let mut collector = FeuSpanCollector::new(None); - let engine_span_id = collector.begin_agent_span("engine") + let engine_span_id = collector + .begin_agent_span("engine") .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; let result = self.chat_completion(request).await; @@ -425,7 +466,8 @@ impl SimulationEngine { } } - let trace = collector.finalize() + let trace = collector + .finalize() .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; result.map(|response| (response, trace)) @@ -439,7 +481,8 @@ impl SimulationEngine { ) -> SimulatorResult<(EmbeddingsResponse, ExecutionTrace)> { let mut collector = FeuSpanCollector::new(None); - let engine_span_id = collector.begin_agent_span("engine") + let engine_span_id = collector + .begin_agent_span("engine") .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; let result = self.embeddings(request).await; @@ -462,7 +505,8 @@ impl SimulationEngine { } } - let trace = collector.finalize() + let trace = collector + .finalize() .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; result.map(|response| (response, trace)) @@ -476,7 +520,8 @@ impl SimulationEngine { ) -> SimulatorResult<(StreamingResponse, ExecutionTrace)> { let mut collector = FeuSpanCollector::new(None); - let engine_span_id = collector.begin_agent_span("engine") + let engine_span_id = collector + .begin_agent_span("engine") .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; let result = self.chat_completion_stream(request).await; @@ -500,7 +545,8 @@ impl SimulationEngine { } } - let trace = collector.finalize() + let trace = collector + .finalize() .map_err(|e| SimulationError::FeuValidation(e.to_string()))?; result.map(|response| (response, trace)) @@ -534,26 +580,29 @@ impl SimulationEngine { // Check if RuvVector is required but not available if require_ruvvector && !self.ruvvector.is_configured() { return Err(SimulationError::ServiceUnavailable( - "RuvVector is required but not configured".to_string() + "RuvVector is required but not configured".to_string(), )); } // Try RuvVector service if available if self.ruvvector.is_configured() { // Convert messages to RuvVector format - let simulate_messages: Vec = messages.iter().map(|m| { - let role_str = match m.role { - Role::System => "system", - Role::User => "user", - Role::Assistant => "assistant", - Role::Tool => "tool", - Role::Function => "function", - }; - SimulateMessage { - role: role_str.to_string(), - content: m.text(), - } - }).collect(); + let simulate_messages: Vec = messages + .iter() + .map(|m| { + let role_str = match m.role { + Role::System => "system", + Role::User => "user", + Role::Assistant => "assistant", + Role::Tool => "tool", + Role::Function => "function", + }; + SimulateMessage { + role: role_str.to_string(), + content: m.text(), + } + }) + .collect(); let request = SimulateRequest { model: model.to_string(), @@ -586,9 +635,10 @@ impl SimulationEngine { // Check if we can fall back to mocks if !fallback_to_mock || !allow_mocks { - return Err(SimulationError::ServiceUnavailable( - format!("RuvVector service failed and mocks not allowed: {}", e) - )); + return Err(SimulationError::ServiceUnavailable(format!( + "RuvVector service failed and mocks not allowed: {}", + e + ))); } // Fall through to local generator } @@ -597,7 +647,7 @@ impl SimulationEngine { // RuvVector not configured, check if we can use mocks if !allow_mocks { return Err(SimulationError::ServiceUnavailable( - "RuvVector not configured and mocks not allowed".to_string() + "RuvVector not configured and mocks not allowed".to_string(), )); } } @@ -605,7 +655,8 @@ impl SimulationEngine { // RuvVector not configured at all if !allow_mocks { return Err(SimulationError::ServiceUnavailable( - "No data source available: RuvVector not configured and mocks not allowed".to_string() + "No data source available: RuvVector not configured and mocks not allowed" + .to_string(), )); } } @@ -616,11 +667,9 @@ impl SimulationEngine { // Increment mock activation counter self.mock_activation_count.fetch_add(1, Ordering::Relaxed); - Ok(self.generator.generate_response( - messages, - max_tokens, - &model_config.generation, - )) + Ok(self + .generator + .generate_response(messages, max_tokens, &model_config.generation)) } } @@ -661,17 +710,19 @@ impl StreamingResponse { token.clone(), 0, ); - let delay = self.schedule.token_delays.get(i).copied().unwrap_or(Duration::ZERO); + let delay = self + .schedule + .token_delays + .get(i) + .copied() + .unwrap_or(Duration::ZERO); chunks.push((delay, chunk)); } // Final chunk with finish reason - let final_chunk = ChatCompletionChunk::finish( - self.id.clone(), - self.model.clone(), - FinishReason::Stop, - 0, - ).with_usage(self.usage); + let final_chunk = + ChatCompletionChunk::finish(self.id.clone(), self.model.clone(), FinishReason::Stop, 0) + .with_usage(self.usage); chunks.push((Duration::ZERO, final_chunk)); chunks @@ -706,10 +757,7 @@ mod tests { #[tokio::test] async fn test_chat_completion() { let engine = test_engine(); - let request = ChatCompletionRequest::new( - "gpt-4", - vec![Message::user("Hello!")], - ); + let request = ChatCompletionRequest::new("gpt-4", vec![Message::user("Hello!")]); let response = engine.chat_completion(&request).await.unwrap(); assert!(!response.id.is_empty()); @@ -720,10 +768,8 @@ mod tests { #[tokio::test] async fn test_model_not_found() { let engine = SimulationEngine::default_config(); - let request = ChatCompletionRequest::new( - "nonexistent-model", - vec![Message::user("Hello!")], - ); + let request = + ChatCompletionRequest::new("nonexistent-model", vec![Message::user("Hello!")]); let result = engine.chat_completion(&request).await; assert!(matches!(result, Err(SimulationError::ModelNotFound(_)))); @@ -774,10 +820,7 @@ mod tests { #[tokio::test] async fn test_stats() { let engine = test_engine(); - let request = ChatCompletionRequest::new( - "gpt-4", - vec![Message::user("Hello!")], - ); + let request = ChatCompletionRequest::new("gpt-4", vec![Message::user("Hello!")]); engine.chat_completion(&request).await.unwrap(); @@ -789,10 +832,7 @@ mod tests { #[tokio::test] async fn test_chat_completion_traced() { let engine = test_engine(); - let request = ChatCompletionRequest::new( - "gpt-4", - vec![Message::user("Hello!")], - ); + let request = ChatCompletionRequest::new("gpt-4", vec![Message::user("Hello!")]); let (response, trace) = engine.chat_completion_traced(&request).await.unwrap(); assert!(!response.id.is_empty()); @@ -812,10 +852,8 @@ mod tests { #[tokio::test] async fn test_chat_completion_traced_failure() { let engine = test_engine(); - let request = ChatCompletionRequest::new( - "nonexistent-model", - vec![Message::user("Hello!")], - ); + let request = + ChatCompletionRequest::new("nonexistent-model", vec![Message::user("Hello!")]); let result = engine.chat_completion_traced(&request).await; assert!(result.is_err()); @@ -844,12 +882,12 @@ mod tests { // Test that with default (RuvVector-first) config, requests fail // when RuvVector is not available let engine = SimulationEngine::default_config(); - let request = ChatCompletionRequest::new( - "gpt-4", - vec![Message::user("Hello!")], - ); + let request = ChatCompletionRequest::new("gpt-4", vec![Message::user("Hello!")]); let result = engine.chat_completion(&request).await; - assert!(matches!(result, Err(SimulationError::ServiceUnavailable(_)))); + assert!(matches!( + result, + Err(SimulationError::ServiceUnavailable(_)) + )); } } diff --git a/src/engine/state.rs b/src/engine/state.rs index 5fa64e5..a6053a4 100644 --- a/src/engine/state.rs +++ b/src/engine/state.rs @@ -1,9 +1,9 @@ //! Engine state and statistics tracking -use std::sync::atomic::{AtomicU64, Ordering}; -use std::time::Duration; use parking_lot::RwLock; use serde::{Deserialize, Serialize}; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::Duration; /// Thread-safe engine state tracking pub struct EngineState { @@ -38,7 +38,8 @@ impl EngineState { /// Add token counts pub fn add_tokens(&self, input: u64, output: u64) { self.total_input_tokens.fetch_add(input, Ordering::Relaxed); - self.total_output_tokens.fetch_add(output, Ordering::Relaxed); + self.total_output_tokens + .fetch_add(output, Ordering::Relaxed); } /// Record a latency measurement @@ -76,7 +77,7 @@ impl Default for EngineState { } /// Engine statistics -#[derive(Debug, Clone, Serialize, Deserialize)] +#[derive(Debug, Clone, Serialize, Deserialize, Default)] pub struct EngineStats { pub total_requests: u64, pub total_errors: u64, @@ -105,18 +106,6 @@ impl EngineStats { } } -impl Default for EngineStats { - fn default() -> Self { - Self { - total_requests: 0, - total_errors: 0, - total_input_tokens: 0, - total_output_tokens: 0, - latency: LatencyStats::default(), - } - } -} - /// Tracks latency measurements with reservoir sampling struct LatencyTracker { samples: Vec, @@ -171,7 +160,9 @@ impl LatencyTracker { let mean = self.sum.as_secs_f64() * 1000.0 / self.count as f64; // Calculate percentiles from samples - let mut sorted: Vec = self.samples.iter() + let mut sorted: Vec = self + .samples + .iter() .map(|d| d.as_secs_f64() * 1000.0) .collect(); sorted.sort_by(|a, b| a.partial_cmp(b).unwrap()); diff --git a/src/error.rs b/src/error.rs index 4436d34..0121101 100644 --- a/src/error.rs +++ b/src/error.rs @@ -201,10 +201,8 @@ impl SimulationError { pub fn to_error_response(&self) -> ErrorResponse { let mut response = ErrorResponse::new(self.error_type(), &self.to_string()); - if let Self::Validation { param, .. } = self { - if let Some(p) = param { - response = response.with_param(p); - } + if let Self::Validation { param: Some(p), .. } = self { + response = response.with_param(p); } if let Self::RateLimitExceeded { .. } = self { @@ -231,11 +229,14 @@ impl IntoResponse for SimulationError { } // Add retry-after header for RuvVector unavailable - if let SimulationError::RuvVectorUnavailable { retry_after_secs: Some(secs), .. } = &self { - response.headers_mut().insert( - "retry-after", - secs.to_string().parse().unwrap(), - ); + if let SimulationError::RuvVectorUnavailable { + retry_after_secs: Some(secs), + .. + } = &self + { + response + .headers_mut() + .insert("retry-after", secs.to_string().parse().unwrap()); } response diff --git a/src/infra/cache.rs b/src/infra/cache.rs index 7464671..b786345 100644 --- a/src/infra/cache.rs +++ b/src/infra/cache.rs @@ -180,7 +180,12 @@ impl Cache { } /// Set a value in the cache with optional custom TTL - pub fn set(&self, key: &str, value: T, ttl: Option) -> Result<(), CacheError> { + pub fn set( + &self, + key: &str, + value: T, + ttl: Option, + ) -> Result<(), CacheError> { let ttl = ttl.unwrap_or(self.config.default_ttl); // Serialize the value @@ -192,7 +197,10 @@ impl Cache { let mut entries = self.entries.write(); // Check capacity if not updating existing entry - if !entries.contains_key(key) && self.config.max_entries > 0 && entries.len() >= self.config.max_entries { + if !entries.contains_key(key) + && self.config.max_entries > 0 + && entries.len() >= self.config.max_entries + { // Try to evict expired entries first self.cleanup_expired_locked(&mut entries); @@ -245,7 +253,12 @@ impl Cache { } /// Get a value or compute it if not present - pub fn get_or_insert(&self, key: &str, ttl: Option, compute: F) -> Result + pub fn get_or_insert( + &self, + key: &str, + ttl: Option, + compute: F, + ) -> Result where T: Serialize + for<'de> Deserialize<'de> + Clone, F: FnOnce() -> T, @@ -443,11 +456,15 @@ mod tests { fn test_get_or_insert() { let cache = Cache::default(); - let value: String = cache.get_or_insert("key1", None, || "computed".to_string()).unwrap(); + let value: String = cache + .get_or_insert("key1", None, || "computed".to_string()) + .unwrap(); assert_eq!(value, "computed"); // Should return cached value - let value: String = cache.get_or_insert("key1", None, || "different".to_string()).unwrap(); + let value: String = cache + .get_or_insert("key1", None, || "different".to_string()) + .unwrap(); assert_eq!(value, "computed"); } } diff --git a/src/infra/mod.rs b/src/infra/mod.rs index 51e5e08..305f941 100644 --- a/src/infra/mod.rs +++ b/src/infra/mod.rs @@ -28,10 +28,10 @@ pub mod cache; pub mod retry; pub use cache::{Cache, CacheConfig, CacheEntry, CacheError, CacheStats}; -pub use retry::{RetryPolicy, RetryConfig, RetryError, Backoff}; +pub use retry::{Backoff, RetryConfig, RetryError, RetryPolicy}; -use std::sync::Arc; use parking_lot::RwLock; +use std::sync::Arc; /// Unified infrastructure context for Phase 2B integrations /// diff --git a/src/infra/retry.rs b/src/infra/retry.rs index 35798fd..bf2a7bd 100644 --- a/src/infra/retry.rs +++ b/src/infra/retry.rs @@ -131,7 +131,12 @@ pub struct Backoff { impl Backoff { /// Create a new backoff calculator - pub fn new(base_delay: Duration, max_delay: Duration, strategy: BackoffStrategy, jitter: f64) -> Self { + pub fn new( + base_delay: Duration, + max_delay: Duration, + strategy: BackoffStrategy, + jitter: f64, + ) -> Self { Self { base_delay, max_delay, @@ -329,7 +334,11 @@ impl RetryPolicy { } /// Execute with retry but bail on non-retryable errors - pub async fn retry_if(&self, mut operation: F, should_retry: P) -> Result> + pub async fn retry_if( + &self, + mut operation: F, + should_retry: P, + ) -> Result> where F: FnMut() -> Fut, Fut: Future>, @@ -521,9 +530,17 @@ mod tests { .max_retries(2) .base_delay(Duration::from_millis(10)); - let result: Result<(), RetryError<&str>> = policy.retry(|| async { Err("always fail") }).await; + let result: Result<(), RetryError<&str>> = + policy.retry(|| async { Err("always fail") }).await; - assert!(matches!(result, Err(RetryError::MaxRetriesExceeded { max: 2, attempts: 3, .. }))); + assert!(matches!( + result, + Err(RetryError::MaxRetriesExceeded { + max: 2, + attempts: 3, + .. + }) + )); } #[test] @@ -566,7 +583,10 @@ mod tests { .await; // Should stop on non-retryable error - assert!(matches!(result, Err(RetryError::OperationFailed("not_retryable")))); + assert!(matches!( + result, + Err(RetryError::OperationFailed("not_retryable")) + )); assert_eq!(attempts.load(Ordering::SeqCst), 3); } } diff --git a/src/latency/mod.rs b/src/latency/mod.rs index 3bb51b2..50c7762 100644 --- a/src/latency/mod.rs +++ b/src/latency/mod.rs @@ -7,8 +7,8 @@ mod sampler; pub use sampler::*; -use std::time::Duration; use crate::config::{LatencyConfig, LatencyProfile}; +use std::time::Duration; /// Latency simulator that generates realistic timing #[derive(Debug, Clone)] @@ -92,7 +92,11 @@ impl LatencySimulator { } /// Generate a complete latency schedule for a streaming response - pub fn generate_schedule(&self, token_count: usize, profile_name: Option<&str>) -> LatencySchedule { + pub fn generate_schedule( + &self, + token_count: usize, + profile_name: Option<&str>, + ) -> LatencySchedule { let ttft = self.sample_ttft(profile_name); let overhead = self.overhead(profile_name); @@ -156,7 +160,10 @@ impl LatencySchedule { if index == 0 { self.ttft + self.overhead } else { - self.token_delays.get(index).copied().unwrap_or(Duration::ZERO) + self.token_delays + .get(index) + .copied() + .unwrap_or(Duration::ZERO) } } @@ -228,8 +235,10 @@ mod tests { #[test] fn test_disabled_simulator() { - let mut config = LatencyConfig::default(); - config.enabled = false; + let config = LatencyConfig { + enabled: false, + ..Default::default() + }; let sim = LatencySimulator::new(config); assert_eq!(sim.sample_ttft(None), Duration::ZERO); @@ -266,12 +275,13 @@ mod tests { #[test] fn test_multiplier() { - let mut config = LatencyConfig::default(); - config.multiplier = 2.0; - let sim_2x = LatencySimulator::with_seed(config.clone(), 42); + let config_2x = LatencyConfig { + multiplier: 2.0, + ..Default::default() + }; + let sim_2x = LatencySimulator::with_seed(config_2x, 42); - config.multiplier = 1.0; - let sim_1x = LatencySimulator::with_seed(config, 42); + let sim_1x = LatencySimulator::with_seed(LatencyConfig::default(), 42); // 2x multiplier should approximately double the latency let ttft_1x = sim_1x.sample_ttft(Some("instant")); diff --git a/src/latency/sampler.rs b/src/latency/sampler.rs index aed8386..9fcec5c 100644 --- a/src/latency/sampler.rs +++ b/src/latency/sampler.rs @@ -1,8 +1,8 @@ //! Distribution sampling implementations +use crate::config::LatencyDistribution; use rand::prelude::*; use rand_distr::{Distribution, Exp, LogNormal, Normal, Pareto, Uniform}; -use crate::config::LatencyDistribution; /// Sampler for latency distributions pub struct DistributionSampler { @@ -36,7 +36,10 @@ impl DistributionSampler { match dist { LatencyDistribution::Fixed { value_ms } => *value_ms, - LatencyDistribution::Normal { mean_ms, std_dev_ms } => { + LatencyDistribution::Normal { + mean_ms, + std_dev_ms, + } => { if *std_dev_ms <= 0.0 { return *mean_ms; } @@ -44,7 +47,10 @@ impl DistributionSampler { normal.sample(rng).max(0.0) } - LatencyDistribution::LogNormal { mean_ms, std_dev_ms } => { + LatencyDistribution::LogNormal { + mean_ms, + std_dev_ms, + } => { if *std_dev_ms <= 0.0 || *mean_ms <= 0.0 { return mean_ms.max(0.0); } @@ -87,7 +93,9 @@ impl DistributionSampler { /// Sample multiple values and return statistics pub fn sample_n(&self, dist: &LatencyDistribution, n: usize) -> Vec { let mut rng = self.rng.clone(); - (0..n).map(|_| self.sample_with_rng(dist, &mut rng)).collect() + (0..n) + .map(|_| self.sample_with_rng(dist, &mut rng)) + .collect() } } diff --git a/src/lib.rs b/src/lib.rs index 032147a..c95805f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,30 +45,28 @@ pub mod types; pub use config::SimulatorConfig; pub use engine::SimulationEngine; pub use error::{SimulationError, SimulatorResult}; -pub use infra::{Cache, CacheConfig, InfraContext, RetryPolicy, RetryConfig}; +pub use infra::{Cache, CacheConfig, InfraContext, RetryConfig, RetryPolicy}; pub use server::run_server; // Re-export RuvVector adapter types for easy integration pub use adapters::ruvvector::{ - RuvVectorAdapter, RuvVectorConfig, RuvVectorError, RuvVectorConsumer, - OptionalRuvVectorAdapter, QueryRequest, QueryResponse, QueryResult, - SimulateRequest, SimulateResponse, RUVVECTOR_SERVICE_URL_ENV, + OptionalRuvVectorAdapter, QueryRequest, QueryResponse, QueryResult, RuvVectorAdapter, + RuvVectorConfig, RuvVectorConsumer, RuvVectorError, SimulateRequest, SimulateResponse, + RUVVECTOR_SERVICE_URL_ENV, }; // Re-export FEU (Foundational Execution Unit) types +pub use adapters::observatory::FeuSpanKind; pub use telemetry::{ - FeuSpanCollector, FeuValidationError, ExecutionTrace, SpanArtifact, FEU_ROOT_PARENT, + ExecutionTrace, FeuSpanCollector, FeuValidationError, SpanArtifact, FEU_ROOT_PARENT, }; -pub use adapters::observatory::FeuSpanKind; // Re-export Phase 7 Intelligence & Expansion (Layer 2) types pub use adapters::intelligence::{ - IntelligenceAdapter, IntelligenceConfig, IntelligenceError, IntelligenceConsumer, - IntelligenceStats, OptionalIntelligenceAdapter, - SignalType, DecisionSignal, SignalPayload, - HypothesisPayload, SimulationOutcomePayload, ConfidenceDeltaPayload, - ReasoningContext, SimulationScenario, ConfidenceAssessment, - MAX_TOKENS, MAX_LATENCY_MS, + ConfidenceAssessment, ConfidenceDeltaPayload, DecisionSignal, HypothesisPayload, + IntelligenceAdapter, IntelligenceConfig, IntelligenceConsumer, IntelligenceError, + IntelligenceStats, OptionalIntelligenceAdapter, ReasoningContext, SignalPayload, SignalType, + SimulationOutcomePayload, SimulationScenario, MAX_LATENCY_MS, MAX_TOKENS, }; /// Library version diff --git a/src/main.rs b/src/main.rs index 067831a..95f7a5c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ use clap::Parser; -use llm_simulator::cli::{Cli, execute}; +use llm_simulator::cli::{execute, Cli}; #[tokio::main] async fn main() -> anyhow::Result<()> { @@ -28,10 +28,13 @@ mod tests { let cli = Cli::try_parse_from([ "llm-simulator", "serve", - "--port", "9090", + "--port", + "9090", "--chaos", - "--seed", "42", - ]).unwrap(); + "--seed", + "42", + ]) + .unwrap(); if let Commands::Serve(cmd) = cli.command { assert_eq!(cmd.port, 9090); @@ -44,23 +47,17 @@ mod tests { #[test] fn test_cli_generate() { - let cli = Cli::try_parse_from([ - "llm-simulator", - "generate", - "chat", - "--message", "Hello", - ]).unwrap(); + let cli = Cli::try_parse_from(["llm-simulator", "generate", "chat", "--message", "Hello"]) + .unwrap(); assert!(matches!(cli.command, Commands::Generate(_))); } #[test] fn test_cli_health() { - let cli = Cli::try_parse_from([ - "llm-simulator", - "health", - "--url", "http://localhost:8080", - ]).unwrap(); + let cli = + Cli::try_parse_from(["llm-simulator", "health", "--url", "http://localhost:8080"]) + .unwrap(); assert!(matches!(cli.command, Commands::Health(_))); } diff --git a/src/providers/anthropic.rs b/src/providers/anthropic.rs index 7956af5..c24d6fb 100644 --- a/src/providers/anthropic.rs +++ b/src/providers/anthropic.rs @@ -1,8 +1,8 @@ //! Anthropic provider implementation -use async_trait::async_trait; -use crate::types::Provider; use super::ProviderHandler; +use crate::types::Provider; +use async_trait::async_trait; /// Anthropic API handler pub struct AnthropicHandler { @@ -50,8 +50,7 @@ impl ProviderHandler for AnthropicHandler { } fn supports_model(&self, model: &str) -> bool { - self.models.iter().any(|m| m == model) - || Self::matches_pattern(model) + self.models.iter().any(|m| m == model) || Self::matches_pattern(model) } fn supported_models(&self) -> Vec { @@ -127,12 +126,12 @@ pub mod anthropic_utils { response: AnthropicMessagesResponse, request_model: &str, ) -> ChatCompletionResponse { - let content = response.content.iter() - .filter_map(|block| { - match block { - AnthropicContentBlock::Text { text } => Some(text.clone()), - _ => None, - } + let content = response + .content + .iter() + .filter_map(|block| match block { + AnthropicContentBlock::Text { text } => Some(text.clone()), + _ => None, }) .collect::>() .join(""); diff --git a/src/providers/google.rs b/src/providers/google.rs index 58c23b8..4aa36c3 100644 --- a/src/providers/google.rs +++ b/src/providers/google.rs @@ -1,8 +1,8 @@ //! Google provider implementation -use async_trait::async_trait; -use crate::types::Provider; use super::ProviderHandler; +use crate::types::Provider; +use async_trait::async_trait; /// Google/Gemini API handler pub struct GoogleHandler { @@ -61,8 +61,7 @@ impl ProviderHandler for GoogleHandler { } fn supports_model(&self, model: &str) -> bool { - self.models.iter().any(|m| m == model) - || Self::matches_pattern(model) + self.models.iter().any(|m| m == model) || Self::matches_pattern(model) } fn supported_models(&self) -> Vec { @@ -122,21 +121,28 @@ pub mod google_utils { response: GeminiResponse, request_model: &str, ) -> ChatCompletionResponse { - let content = response.candidates + let content = response + .candidates .first() .map(|c| { - c.content.parts.iter() + c.content + .parts + .iter() .map(|p| p.text.clone()) .collect::>() .join("") }) .unwrap_or_default(); - let (input_tokens, output_tokens) = response.usage_metadata + let (input_tokens, output_tokens) = response + .usage_metadata .map(|u| (u.prompt_token_count, u.candidates_token_count)) .unwrap_or((0, 0)); - let id = format!("chatcmpl-gemini-{}", uuid::Uuid::new_v4().to_string().replace("-", "")[..12].to_string()); + let id = format!( + "chatcmpl-gemini-{}", + &uuid::Uuid::new_v4().to_string().replace("-", "")[..12] + ); ChatCompletionResponse::simple( id, @@ -184,10 +190,7 @@ mod tests { fn test_message_conversion() { use crate::types::Message; - let messages = vec![ - Message::user("Hello"), - Message::assistant("Hi!"), - ]; + let messages = vec![Message::user("Hello"), Message::assistant("Hi!")]; let converted = google_utils::convert_messages(&messages); @@ -199,8 +202,17 @@ mod tests { #[test] fn test_finish_reason_mapping() { use crate::types::FinishReason; - assert_eq!(google_utils::map_finish_reason(Some("STOP")), FinishReason::Stop); - assert_eq!(google_utils::map_finish_reason(Some("MAX_TOKENS")), FinishReason::Length); - assert_eq!(google_utils::map_finish_reason(Some("SAFETY")), FinishReason::ContentFilter); + assert_eq!( + google_utils::map_finish_reason(Some("STOP")), + FinishReason::Stop + ); + assert_eq!( + google_utils::map_finish_reason(Some("MAX_TOKENS")), + FinishReason::Length + ); + assert_eq!( + google_utils::map_finish_reason(Some("SAFETY")), + FinishReason::ContentFilter + ); } } diff --git a/src/providers/mod.rs b/src/providers/mod.rs index d8e6d26..1f4fbcf 100644 --- a/src/providers/mod.rs +++ b/src/providers/mod.rs @@ -3,16 +3,16 @@ //! Provides a unified interface for different LLM API providers, //! handling request/response translation and provider-specific behaviors. -mod openai; mod anthropic; mod google; +mod openai; -pub use openai::*; pub use anthropic::*; pub use google::*; +pub use openai::*; -use async_trait::async_trait; use crate::types::Provider; +use async_trait::async_trait; /// Trait for provider implementations #[async_trait] @@ -95,11 +95,7 @@ pub mod model_utils { /// Check if model is a chat model (vs completion, embedding, etc.) pub fn is_chat_model(model: &str) -> bool { - let chat_prefixes = [ - "gpt-4", "gpt-3.5-turbo", - "claude-3", "claude-2", - "gemini", - ]; + let chat_prefixes = ["gpt-4", "gpt-3.5-turbo", "claude-3", "claude-2", "gemini"]; let lower = model.to_lowercase(); chat_prefixes.iter().any(|p| lower.starts_with(p)) @@ -121,8 +117,14 @@ mod tests { let registry = ProviderRegistry::new(); assert_eq!(registry.find_provider("gpt-4"), Some(Provider::OpenAI)); - assert_eq!(registry.find_provider("claude-3-opus-20240229"), Some(Provider::Anthropic)); - assert_eq!(registry.find_provider("gemini-1.5-pro"), Some(Provider::Google)); + assert_eq!( + registry.find_provider("claude-3-opus-20240229"), + Some(Provider::Anthropic) + ); + assert_eq!( + registry.find_provider("gemini-1.5-pro"), + Some(Provider::Google) + ); } #[test] @@ -134,7 +136,10 @@ mod tests { #[test] fn test_base_model() { assert_eq!(model_utils::base_model("gpt-4-0613"), "gpt-4"); - assert_eq!(model_utils::base_model("gpt-4-turbo-preview"), "gpt-4-turbo"); + assert_eq!( + model_utils::base_model("gpt-4-turbo-preview"), + "gpt-4-turbo" + ); assert_eq!(model_utils::base_model("gpt-4"), "gpt-4"); } diff --git a/src/providers/openai.rs b/src/providers/openai.rs index c6317dd..0fc4760 100644 --- a/src/providers/openai.rs +++ b/src/providers/openai.rs @@ -1,8 +1,8 @@ //! OpenAI provider implementation -use async_trait::async_trait; -use crate::types::Provider; use super::ProviderHandler; +use crate::types::Provider; +use async_trait::async_trait; /// OpenAI API handler pub struct OpenAIHandler { @@ -72,8 +72,7 @@ impl ProviderHandler for OpenAIHandler { } fn supports_model(&self, model: &str) -> bool { - self.models.iter().any(|m| m == model) - || Self::matches_pattern(model) + self.models.iter().any(|m| m == model) || Self::matches_pattern(model) } fn supported_models(&self) -> Vec { @@ -87,40 +86,43 @@ pub mod openai_utils { /// Convert internal messages to OpenAI format pub fn format_messages(messages: &[Message]) -> Vec { - messages.iter().map(|m| { - let mut msg = serde_json::json!({ - "role": match m.role { - Role::System => "system", - Role::User => "user", - Role::Assistant => "assistant", - Role::Tool => "tool", - Role::Function => "function", - }, - }); - - match &m.content { - MessageContent::Text(t) => { - msg["content"] = serde_json::Value::String(t.clone()); + messages + .iter() + .map(|m| { + let mut msg = serde_json::json!({ + "role": match m.role { + Role::System => "system", + Role::User => "user", + Role::Assistant => "assistant", + Role::Tool => "tool", + Role::Function => "function", + }, + }); + + match &m.content { + MessageContent::Text(t) => { + msg["content"] = serde_json::Value::String(t.clone()); + } + MessageContent::Parts(parts) => { + msg["content"] = serde_json::to_value(parts).unwrap_or_default(); + } } - MessageContent::Parts(parts) => { - msg["content"] = serde_json::to_value(parts).unwrap_or_default(); - } - } - if let Some(name) = &m.name { - msg["name"] = serde_json::Value::String(name.clone()); - } + if let Some(name) = &m.name { + msg["name"] = serde_json::Value::String(name.clone()); + } - if let Some(tool_calls) = &m.tool_calls { - msg["tool_calls"] = serde_json::to_value(tool_calls).unwrap_or_default(); - } + if let Some(tool_calls) = &m.tool_calls { + msg["tool_calls"] = serde_json::to_value(tool_calls).unwrap_or_default(); + } - if let Some(tool_call_id) = &m.tool_call_id { - msg["tool_call_id"] = serde_json::Value::String(tool_call_id.clone()); - } + if let Some(tool_call_id) = &m.tool_call_id { + msg["tool_call_id"] = serde_json::Value::String(tool_call_id.clone()); + } - msg - }).collect() + msg + }) + .collect() } /// Generate OpenAI-style completion ID diff --git a/src/sdk/builder.rs b/src/sdk/builder.rs index 91f01d3..a95f641 100644 --- a/src/sdk/builder.rs +++ b/src/sdk/builder.rs @@ -2,8 +2,8 @@ //! //! Fluent builder patterns for constructing API requests. -use crate::types::*; use super::{Client, SdkError, SdkResult}; +use crate::types::*; /// Chat completion request builder /// @@ -163,12 +163,14 @@ impl ChatBuilder { /// Build the request without sending pub fn build(self) -> SdkResult { - let model = self.model.ok_or_else(|| { - SdkError::InvalidRequest("Model is required".to_string()) - })?; + let model = self + .model + .ok_or_else(|| SdkError::InvalidRequest("Model is required".to_string()))?; if self.messages.is_empty() { - return Err(SdkError::InvalidRequest("At least one message is required".to_string())); + return Err(SdkError::InvalidRequest( + "At least one message is required".to_string(), + )); } let stop = self.stop.map(|s| { @@ -179,8 +181,8 @@ impl ChatBuilder { } }); - Ok(ChatCompletionRequest::new(model, self.messages.clone()) - .with_options( + Ok( + ChatCompletionRequest::new(model, self.messages.clone()).with_options( self.temperature, self.top_p, self.max_tokens, @@ -189,7 +191,8 @@ impl ChatBuilder { self.presence_penalty, stop, self.user, - )) + ), + ) } /// Send the request and get the response @@ -262,12 +265,14 @@ impl EmbeddingsBuilder { /// Build the request without sending pub fn build(self) -> SdkResult { - let model = self.model.ok_or_else(|| { - SdkError::InvalidRequest("Model is required".to_string()) - })?; + let model = self + .model + .ok_or_else(|| SdkError::InvalidRequest("Model is required".to_string()))?; if self.input.is_empty() { - return Err(SdkError::InvalidRequest("At least one input is required".to_string())); + return Err(SdkError::InvalidRequest( + "At least one input is required".to_string(), + )); } let input = if self.input.len() == 1 { @@ -306,7 +311,9 @@ impl ChatResponse { /// Get the response content pub fn content(&self) -> &str { - self.inner.choices.first() + self.inner + .choices + .first() .and_then(|c| c.message.content.as_deref()) .unwrap_or("") } @@ -348,17 +355,29 @@ impl ChatResponse { /// Get input tokens used pub fn input_tokens(&self) -> u32 { - self.inner.usage.as_ref().map(|u| u.prompt_tokens).unwrap_or(0) + self.inner + .usage + .as_ref() + .map(|u| u.prompt_tokens) + .unwrap_or(0) } /// Get output tokens used pub fn output_tokens(&self) -> u32 { - self.inner.usage.as_ref().map(|u| u.completion_tokens).unwrap_or(0) + self.inner + .usage + .as_ref() + .map(|u| u.completion_tokens) + .unwrap_or(0) } /// Get total tokens used pub fn total_tokens(&self) -> u32 { - self.inner.usage.as_ref().map(|u| u.total_tokens).unwrap_or(0) + self.inner + .usage + .as_ref() + .map(|u| u.total_tokens) + .unwrap_or(0) } /// Check if the response was truncated @@ -394,7 +413,11 @@ impl EmbeddingsResult { /// Get all embeddings pub fn embeddings(&self) -> Vec<&[f32]> { - self.inner.data.iter().map(|e| e.embedding.as_slice()).collect() + self.inner + .data + .iter() + .map(|e| e.embedding.as_slice()) + .collect() } /// Get the number of embeddings @@ -404,7 +427,9 @@ impl EmbeddingsResult { /// Get the embedding dimensions pub fn dimensions(&self) -> usize { - self.inner.data.first() + self.inner + .data + .first() .map(|e| e.embedding.len()) .unwrap_or(0) } @@ -465,16 +490,11 @@ mod tests { assert!(builder.model.is_none()); // Missing messages - let result = client.chat() - .model("gpt-4") - .build(); + let result = client.chat().model("gpt-4").build(); assert!(result.is_err()); // Valid request - let result = client.chat() - .model("gpt-4") - .message("Hello") - .build(); + let result = client.chat().model("gpt-4").message("Hello").build(); assert!(result.is_ok()); } @@ -483,13 +503,12 @@ mod tests { let client = Client::new("http://localhost:8080").unwrap(); // Missing input - let result = client.embeddings() - .model("text-embedding-ada-002") - .build(); + let result = client.embeddings().model("text-embedding-ada-002").build(); assert!(result.is_err()); // Valid request - let result = client.embeddings() + let result = client + .embeddings() .model("text-embedding-ada-002") .input("Hello, world!") .build(); diff --git a/src/sdk/client.rs b/src/sdk/client.rs index 4092626..1385dcb 100644 --- a/src/sdk/client.rs +++ b/src/sdk/client.rs @@ -8,8 +8,10 @@ use std::time::Duration; use reqwest::header::{HeaderMap, HeaderValue, AUTHORIZATION, CONTENT_TYPE, USER_AGENT}; use tracing::debug; +use super::{ + ChatBuilder, ClientConfig, EmbeddingsBuilder, Provider, SdkError, SdkResult, StreamingChat, +}; use crate::types::*; -use super::{ClientConfig, Provider, SdkError, SdkResult, ChatBuilder, EmbeddingsBuilder, StreamingChat}; /// LLM-Simulator SDK Client /// @@ -52,7 +54,11 @@ impl Client { pub fn with_config(config: ClientConfig) -> SdkResult { let mut headers = HeaderMap::new(); headers.insert(CONTENT_TYPE, HeaderValue::from_static("application/json")); - headers.insert(USER_AGENT, HeaderValue::from_str(&config.user_agent).unwrap_or_else(|_| HeaderValue::from_static("llm-simulator-sdk"))); + headers.insert( + USER_AGENT, + HeaderValue::from_str(&config.user_agent) + .unwrap_or_else(|_| HeaderValue::from_static("llm-simulator-sdk")), + ); let http = reqwest::Client::builder() .default_headers(headers) @@ -95,22 +101,37 @@ impl Client { /// List available models pub async fn list_models(&self) -> SdkResult { - let url = format!("{}{}", self.config.base_url, self.config.provider.models_endpoint()); - let response = self.execute_request(reqwest::Method::GET, &url, None::<&()>).await?; + let url = format!( + "{}{}", + self.config.base_url, + self.config.provider.models_endpoint() + ); + let response = self + .execute_request(reqwest::Method::GET, &url, None::<&()>) + .await?; Ok(response) } /// Get a specific model pub async fn get_model(&self, model_id: &str) -> SdkResult { - let url = format!("{}{}/{}", self.config.base_url, self.config.provider.models_endpoint(), model_id); - let response = self.execute_request(reqwest::Method::GET, &url, None::<&()>).await?; + let url = format!( + "{}{}/{}", + self.config.base_url, + self.config.provider.models_endpoint(), + model_id + ); + let response = self + .execute_request(reqwest::Method::GET, &url, None::<&()>) + .await?; Ok(response) } /// Check health of the simulator instance pub async fn health(&self) -> SdkResult { let url = format!("{}/health", self.config.base_url); - let response = self.execute_request(reqwest::Method::GET, &url, None::<&()>).await?; + let response = self + .execute_request(reqwest::Method::GET, &url, None::<&()>) + .await?; Ok(response) } @@ -124,31 +145,47 @@ impl Client { } /// Send a raw chat completion request - pub async fn chat_completion(&self, request: &ChatCompletionRequest) -> SdkResult { + pub async fn chat_completion( + &self, + request: &ChatCompletionRequest, + ) -> SdkResult { let endpoint = self.config.provider.chat_endpoint(&request.model); let url = format!("{}{}", self.config.base_url, endpoint); match self.config.provider { Provider::OpenAI => { - self.execute_request(reqwest::Method::POST, &url, Some(request)).await + self.execute_request(reqwest::Method::POST, &url, Some(request)) + .await } Provider::Anthropic => { let anthropic_request = convert_to_anthropic(request); - let response: serde_json::Value = self.execute_request(reqwest::Method::POST, &url, Some(&anthropic_request)).await?; + let response: serde_json::Value = self + .execute_request(reqwest::Method::POST, &url, Some(&anthropic_request)) + .await?; convert_from_anthropic(response) } Provider::Google => { let google_request = convert_to_google(request); - let response: serde_json::Value = self.execute_request(reqwest::Method::POST, &url, Some(&google_request)).await?; + let response: serde_json::Value = self + .execute_request(reqwest::Method::POST, &url, Some(&google_request)) + .await?; convert_from_google(response, &request.model) } } } /// Send a raw embeddings request - pub async fn create_embeddings(&self, request: &EmbeddingsRequest) -> SdkResult { - let url = format!("{}{}", self.config.base_url, self.config.provider.embeddings_endpoint()); - self.execute_request(reqwest::Method::POST, &url, Some(request)).await + pub async fn create_embeddings( + &self, + request: &EmbeddingsRequest, + ) -> SdkResult { + let url = format!( + "{}{}", + self.config.base_url, + self.config.provider.embeddings_endpoint() + ); + self.execute_request(reqwest::Method::POST, &url, Some(request)) + .await } /// Execute an HTTP request with retry logic @@ -201,7 +238,10 @@ impl Client { Ok(data) => return Ok(data), Err(e) => { last_error = Some(SdkError::Json(serde_json::Error::io( - std::io::Error::new(std::io::ErrorKind::InvalidData, e.to_string()) + std::io::Error::new( + std::io::ErrorKind::InvalidData, + e.to_string(), + ), ))); } } @@ -403,7 +443,9 @@ fn convert_from_anthropic(response: serde_json::Value) -> SdkResult serde_json::Value { - let contents: Vec = request.messages.iter() + let contents: Vec = request + .messages + .iter() .filter(|m| m.role != Role::System) .map(|m| { let role = match m.role { @@ -436,7 +478,10 @@ fn convert_to_google(request: &ChatCompletionRequest) -> serde_json::Value { body } -fn convert_from_google(response: serde_json::Value, model: &str) -> SdkResult { +fn convert_from_google( + response: serde_json::Value, + model: &str, +) -> SdkResult { let content = response["candidates"] .as_array() .and_then(|arr| arr.first()) @@ -446,8 +491,12 @@ fn convert_from_google(response: serde_json::Value, model: &str) -> SdkResult().unwrap(), Provider::OpenAI); - assert_eq!("anthropic".parse::().unwrap(), Provider::Anthropic); + assert_eq!( + "anthropic".parse::().unwrap(), + Provider::Anthropic + ); assert_eq!("claude".parse::().unwrap(), Provider::Anthropic); assert_eq!("google".parse::().unwrap(), Provider::Google); assert_eq!("gemini".parse::().unwrap(), Provider::Google); diff --git a/src/sdk/error.rs b/src/sdk/error.rs index f81a8c1..63b6fe9 100644 --- a/src/sdk/error.rs +++ b/src/sdk/error.rs @@ -36,9 +36,7 @@ pub enum SdkError { Authentication(String), /// Rate limit exceeded - RateLimit { - retry_after: Option, - }, + RateLimit { retry_after: Option }, /// Model not found ModelNotFound(String), @@ -60,7 +58,9 @@ impl fmt::Display for SdkError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { SdkError::Request(e) => write!(f, "Request error: {}", e), - SdkError::Response { status, message, .. } => { + SdkError::Response { + status, message, .. + } => { write!(f, "Response error ({}): {}", status, message) } SdkError::Json(e) => write!(f, "JSON error: {}", e), @@ -79,8 +79,15 @@ impl fmt::Display for SdkError { SdkError::ModelNotFound(model) => write!(f, "Model not found: {}", model), SdkError::InvalidRequest(msg) => write!(f, "Invalid request: {}", msg), SdkError::Stream(msg) => write!(f, "Stream error: {}", msg), - SdkError::RetryExhausted { attempts, last_error } => { - write!(f, "Retry exhausted after {} attempts: {}", attempts, last_error) + SdkError::RetryExhausted { + attempts, + last_error, + } => { + write!( + f, + "Retry exhausted after {} attempts: {}", + attempts, last_error + ) } } } @@ -144,9 +151,7 @@ impl SdkError { /// Get the retry-after duration if available pub fn retry_after(&self) -> Option { match self { - SdkError::RateLimit { retry_after } => { - retry_after.map(std::time::Duration::from_secs) - } + SdkError::RateLimit { retry_after } => retry_after.map(std::time::Duration::from_secs), _ => None, } } @@ -165,7 +170,11 @@ impl SdkError { if let Some(model) = body["error"]["param"].as_str() { SdkError::ModelNotFound(model.to_string()) } else { - SdkError::Response { status, message, body: Some(body) } + SdkError::Response { + status, + message, + body: Some(body), + } } } 429 => { @@ -174,7 +183,11 @@ impl SdkError { .or_else(|| body["retry_after"].as_u64()); SdkError::RateLimit { retry_after } } - _ => SdkError::Response { status, message, body: Some(body) } + _ => SdkError::Response { + status, + message, + body: Some(body), + }, } } } @@ -195,8 +208,16 @@ mod tests { #[test] fn test_retryable() { assert!(SdkError::Timeout.is_retryable()); - assert!(SdkError::RateLimit { retry_after: Some(5) }.is_retryable()); - assert!(SdkError::Response { status: 503, message: "Unavailable".to_string(), body: None }.is_retryable()); + assert!(SdkError::RateLimit { + retry_after: Some(5) + } + .is_retryable()); + assert!(SdkError::Response { + status: 503, + message: "Unavailable".to_string(), + body: None + } + .is_retryable()); assert!(!SdkError::Authentication("bad key".to_string()).is_retryable()); } @@ -210,6 +231,11 @@ mod tests { }); let err = SdkError::from_response(429, body); - assert!(matches!(err, SdkError::RateLimit { retry_after: Some(60) })); + assert!(matches!( + err, + SdkError::RateLimit { + retry_after: Some(60) + } + )); } } diff --git a/src/sdk/mod.rs b/src/sdk/mod.rs index 2e9ab09..c764eb4 100644 --- a/src/sdk/mod.rs +++ b/src/sdk/mod.rs @@ -32,21 +32,20 @@ //! } //! ``` +mod builder; mod client; mod config; -mod builder; mod error; mod streaming; +pub use builder::*; pub use client::*; pub use config::*; -pub use builder::*; pub use error::*; pub use streaming::*; // Re-export types for convenience pub use crate::types::{ - ChatCompletionRequest, ChatCompletionResponse, - EmbeddingsRequest, EmbeddingsResponse, - Message, Role, Usage, + ChatCompletionRequest, ChatCompletionResponse, EmbeddingsRequest, EmbeddingsResponse, Message, + Role, Usage, }; diff --git a/src/sdk/streaming.rs b/src/sdk/streaming.rs index 4d4df20..d81aa00 100644 --- a/src/sdk/streaming.rs +++ b/src/sdk/streaming.rs @@ -6,8 +6,8 @@ use futures::stream::{Stream, StreamExt}; use std::pin::Pin; use std::task::{Context, Poll}; -use crate::types::*; use super::{Client, SdkError, SdkResult}; +use crate::types::*; /// Streaming chat builder pub struct StreamingChat { @@ -65,31 +65,31 @@ impl StreamingChat { /// Start streaming and return a stream of chunks pub async fn start(self) -> SdkResult { - let model = self.model.ok_or_else(|| { - SdkError::InvalidRequest("Model is required".to_string()) - })?; + let model = self + .model + .ok_or_else(|| SdkError::InvalidRequest("Model is required".to_string()))?; if self.messages.is_empty() { - return Err(SdkError::InvalidRequest("At least one message is required".to_string())); + return Err(SdkError::InvalidRequest( + "At least one message is required".to_string(), + )); } - let request = ChatCompletionRequest::new(model.clone(), self.messages) - .with_options( - self.temperature, - None, // top_p - self.max_tokens, - true, // stream - None, // frequency_penalty - None, // presence_penalty - None, // stop - None, // user - ); + let request = ChatCompletionRequest::new(model.clone(), self.messages).with_options( + self.temperature, + None, // top_p + self.max_tokens, + true, // stream + None, // frequency_penalty + None, // presence_penalty + None, // stop + None, // user + ); let endpoint = self.client.config().provider.chat_endpoint(&model); let url = format!("{}{}", self.client.config().base_url, endpoint); - let mut req = self.client.http_client().post(&url) - .json(&request); + let mut req = self.client.http_client().post(&url).json(&request); if let Some(ref key) = self.client.config().api_key { req = req.header("Authorization", format!("Bearer {}", key)); diff --git a/src/security/api_key.rs b/src/security/api_key.rs index 84fa8de..851d7b2 100644 --- a/src/security/api_key.rs +++ b/src/security/api_key.rs @@ -5,7 +5,6 @@ //! - Role-based access control //! - Key rotation without restart -use std::sync::Arc; use axum::{ extract::{Request, State}, http::{HeaderMap, StatusCode}, @@ -13,6 +12,7 @@ use axum::{ response::{IntoResponse, Response}, Json, }; +use std::sync::Arc; use tracing::{info, warn}; use crate::config::security::{ApiKeyConfig, ApiKeyEntry, ApiKeyRole}; @@ -75,7 +75,10 @@ pub enum AuthError { /// Key is disabled KeyDisabled, /// Insufficient permissions - InsufficientPermissions { required: ApiKeyRole, actual: ApiKeyRole }, + InsufficientPermissions { + required: ApiKeyRole, + actual: ApiKeyRole, + }, } impl IntoResponse for AuthError { @@ -101,7 +104,10 @@ impl IntoResponse for AuthError { "authentication_error", "API key is disabled", ), - Self::InsufficientPermissions { required: _, actual: _ } => ( + Self::InsufficientPermissions { + required: _, + actual: _, + } => ( StatusCode::FORBIDDEN, "permission_error", "Insufficient permissions", @@ -167,25 +173,23 @@ pub async fn api_key_auth_middleware( } // Extract API key from headers - let api_key = extract_api_key(request.headers()) - .ok_or(AuthError::MissingHeader)?; + let api_key = extract_api_key(request.headers()).ok_or(AuthError::MissingHeader)?; // Validate the key - let key_entry = config.find_key(&api_key) - .ok_or_else(|| { - // Log with only key prefix for security - let key_prefix = if api_key.len() > 8 { - &api_key[..8] - } else { - &api_key - }; - warn!( - key_prefix = %key_prefix, - path = %path, - "Invalid API key attempt" - ); - AuthError::InvalidKey - })?; + let key_entry = config.find_key(&api_key).ok_or_else(|| { + // Log with only key prefix for security + let key_prefix = if api_key.len() > 8 { + &api_key[..8] + } else { + &api_key + }; + warn!( + key_prefix = %key_prefix, + path = %path, + "Invalid API key attempt" + ); + AuthError::InvalidKey + })?; // Check if key is enabled if !key_entry.enabled { @@ -231,7 +235,9 @@ pub async fn admin_auth_middleware( } // Get key info from extensions - let key_info = request.extensions().get::() + let key_info = request + .extensions() + .get::() .cloned() .unwrap_or_else(ApiKeyInfo::anonymous); @@ -273,7 +279,10 @@ mod tests { #[test] fn test_extract_api_key_bearer() { let mut headers = HeaderMap::new(); - headers.insert("authorization", HeaderValue::from_static("Bearer sk-test-key-123")); + headers.insert( + "authorization", + HeaderValue::from_static("Bearer sk-test-key-123"), + ); let key = extract_api_key(&headers); assert_eq!(key, Some("sk-test-key-123".to_string())); diff --git a/src/security/headers.rs b/src/security/headers.rs index 628cdab..9245e7c 100644 --- a/src/security/headers.rs +++ b/src/security/headers.rs @@ -8,13 +8,13 @@ //! - Content Security Policy //! - HTTP Strict Transport Security -use std::sync::Arc; use axum::{ extract::{Request, State}, http::HeaderValue, middleware::Next, response::Response, }; +use std::sync::Arc; use crate::config::security::SecurityHeadersConfig; @@ -66,26 +66,17 @@ pub async fn security_headers_middleware( if let Ok(value) = HeaderValue::from_str(&config.frame_options) { headers.insert("x-frame-options", value); } else { - headers.insert( - "x-frame-options", - STATIC_HEADERS.x_frame_options.clone(), - ); + headers.insert("x-frame-options", STATIC_HEADERS.x_frame_options.clone()); } // XSS protection (legacy browsers) - headers.insert( - "x-xss-protection", - STATIC_HEADERS.x_xss_protection.clone(), - ); + headers.insert("x-xss-protection", STATIC_HEADERS.x_xss_protection.clone()); // Referrer policy if let Ok(value) = HeaderValue::from_str(&config.referrer_policy) { headers.insert("referrer-policy", value); } else { - headers.insert( - "referrer-policy", - STATIC_HEADERS.referrer_policy.clone(), - ); + headers.insert("referrer-policy", STATIC_HEADERS.referrer_policy.clone()); } // Content Security Policy diff --git a/src/security/middleware.rs b/src/security/middleware.rs index 282aa42..23cdc6e 100644 --- a/src/security/middleware.rs +++ b/src/security/middleware.rs @@ -3,19 +3,16 @@ //! Combines all security middleware into a cohesive stack //! with proper ordering and configuration. +use axum::{middleware as axum_middleware, Router}; use std::sync::Arc; -use axum::{ - Router, - middleware as axum_middleware, -}; -use tower_http::cors::{CorsLayer, Any, AllowOrigin}; +use tower_http::cors::{AllowOrigin, Any, CorsLayer}; -use crate::config::security::{SecurityConfig, CorsConfig}; +use crate::config::security::{CorsConfig, SecurityConfig}; use super::{ - api_key::{api_key_auth_middleware, admin_auth_middleware}, - rate_limit::{rate_limit_middleware, RateLimiter}, + api_key::{admin_auth_middleware, api_key_auth_middleware}, headers::security_headers_middleware, + rate_limit::{rate_limit_middleware, RateLimiter}, }; /// Security state containing all security-related components @@ -60,26 +57,34 @@ pub fn build_cors_layer(config: &CorsConfig) -> CorsLayer { if config.allowed_origins.iter().any(|o| o == "*") { cors = cors.allow_origin(Any); } else { - let origins: Vec<_> = config.allowed_origins.iter() + let origins: Vec<_> = config + .allowed_origins + .iter() .filter_map(|o| o.parse().ok()) .collect(); cors = cors.allow_origin(AllowOrigin::list(origins)); } // Configure allowed methods - let methods: Vec<_> = config.allowed_methods.iter() + let methods: Vec<_> = config + .allowed_methods + .iter() .filter_map(|m| m.parse().ok()) .collect(); cors = cors.allow_methods(methods); // Configure allowed headers - let headers: Vec<_> = config.allowed_headers.iter() + let headers: Vec<_> = config + .allowed_headers + .iter() .filter_map(|h| h.parse().ok()) .collect(); cors = cors.allow_headers(headers); // Configure exposed headers - let exposed: Vec<_> = config.exposed_headers.iter() + let exposed: Vec<_> = config + .exposed_headers + .iter() .filter_map(|h| h.parse().ok()) .collect(); cors = cors.expose_headers(exposed); @@ -102,10 +107,7 @@ pub fn build_cors_layer(config: &CorsConfig) -> CorsLayer { /// 2. CORS (handle preflight requests) /// 3. Rate limiting (applied before expensive operations) /// 4. API key authentication (innermost - applied to requests) -pub fn apply_security_middleware( - router: Router, - security: SecurityState, -) -> Router +pub fn apply_security_middleware(router: Router, security: SecurityState) -> Router where S: Clone + Send + Sync + 'static, { diff --git a/src/security/mod.rs b/src/security/mod.rs index 766d44c..18f9cf0 100644 --- a/src/security/mod.rs +++ b/src/security/mod.rs @@ -8,11 +8,11 @@ //! - CORS configuration mod api_key; -mod rate_limit; mod headers; mod middleware; +mod rate_limit; pub use api_key::*; -pub use rate_limit::*; pub use headers::*; pub use middleware::*; +pub use rate_limit::*; diff --git a/src/security/rate_limit.rs b/src/security/rate_limit.rs index 629acd6..3b757ca 100644 --- a/src/security/rate_limit.rs +++ b/src/security/rate_limit.rs @@ -63,8 +63,14 @@ impl TokenBucket { return false; } - if self.tokens - .compare_exchange_weak(current, current - count, Ordering::AcqRel, Ordering::Relaxed) + if self + .tokens + .compare_exchange_weak( + current, + current - count, + Ordering::AcqRel, + Ordering::Relaxed, + ) .is_ok() { return true; @@ -90,7 +96,8 @@ impl TokenBucket { } // Try to update last_refill atomically - if self.last_refill + if self + .last_refill .compare_exchange_weak(last, now_nanos, Ordering::AcqRel, Ordering::Relaxed) .is_ok() { @@ -223,10 +230,7 @@ pub enum RateLimitResult { reset: Duration, }, /// Rate limit exceeded - Exceeded { - retry_after: Duration, - limit: u32, - }, + Exceeded { retry_after: Duration, limit: u32 }, } /// Rate limit error response @@ -238,20 +242,17 @@ pub struct RateLimitError { impl IntoResponse for RateLimitError { fn into_response(self) -> Response { - let body = ErrorResponse::new("rate_limit_error", "Rate limit exceeded. Please retry later."); + let body = ErrorResponse::new( + "rate_limit_error", + "Rate limit exceeded. Please retry later.", + ); let retry_after_secs = self.retry_after.as_secs().max(1); let mut response = (StatusCode::TOO_MANY_REQUESTS, Json(body)).into_response(); let headers = response.headers_mut(); - headers.insert( - "retry-after", - retry_after_secs.to_string().parse().unwrap(), - ); - headers.insert( - "x-ratelimit-limit", - self.limit.to_string().parse().unwrap(), - ); + headers.insert("retry-after", retry_after_secs.to_string().parse().unwrap()); + headers.insert("x-ratelimit-limit", self.limit.to_string().parse().unwrap()); headers.insert("x-ratelimit-remaining", "0".parse().unwrap()); response @@ -270,7 +271,9 @@ pub async fn rate_limit_middleware( } // Get key info from extensions (set by api_key_auth_middleware) - let key_info = request.extensions().get::() + let key_info = request + .extensions() + .get::() .cloned() .unwrap_or_else(ApiKeyInfo::anonymous); @@ -279,15 +282,16 @@ pub async fn rate_limit_middleware( // Check rate limit match limiter.try_acquire(rate_limit_key, key_info.tier) { - RateLimitResult::Allowed { remaining, limit, reset } => { + RateLimitResult::Allowed { + remaining, + limit, + reset, + } => { let mut response = next.run(request).await; // Add rate limit headers let headers = response.headers_mut(); - headers.insert( - "x-ratelimit-limit", - limit.to_string().parse().unwrap(), - ); + headers.insert("x-ratelimit-limit", limit.to_string().parse().unwrap()); headers.insert( "x-ratelimit-remaining", remaining.to_string().parse().unwrap(), diff --git a/src/server/handlers.rs b/src/server/handlers.rs index cc36b86..e1f7ad0 100644 --- a/src/server/handlers.rs +++ b/src/server/handlers.rs @@ -51,9 +51,7 @@ pub async fn openai_embeddings( } /// GET /v1/models -pub async fn list_models( - State(state): State, -) -> Json { +pub async fn list_models(State(state): State) -> Json { Json(state.engine.list_models()) } @@ -62,9 +60,11 @@ pub async fn get_model( State(state): State, Path(model_id): Path, ) -> Result, SimulationError> { - state.engine.get_model(&model_id) + state + .engine + .get_model(&model_id) .map(Json) - .ok_or_else(|| SimulationError::ModelNotFound(model_id)) + .ok_or(SimulationError::ModelNotFound(model_id)) } // ============== Anthropic Handlers ============== @@ -75,7 +75,9 @@ pub async fn anthropic_messages( Json(request): Json, ) -> Result { // Convert to internal format - let messages = request.messages.iter() + let messages = request + .messages + .iter() .map(|m| { let role = match m.role.as_str() { "user" => Role::User, @@ -124,7 +126,9 @@ pub async fn anthropic_messages( let response = state.engine.chat_completion(&chat_request).await?; // Convert to Anthropic format - let content = response.choices.first() + let content = response + .choices + .first() .and_then(|c| c.message.content.clone()) .unwrap_or_default(); @@ -132,8 +136,16 @@ pub async fn anthropic_messages( response.id, request.model, content, - response.usage.as_ref().map(|u| u.prompt_tokens).unwrap_or(0), - response.usage.as_ref().map(|u| u.completion_tokens).unwrap_or(0), + response + .usage + .as_ref() + .map(|u| u.prompt_tokens) + .unwrap_or(0), + response + .usage + .as_ref() + .map(|u| u.completion_tokens) + .unwrap_or(0), ); Ok(Json(anthropic_response).into_response()) @@ -149,14 +161,18 @@ pub async fn gemini_generate_content( Json(request): Json, ) -> Result, SimulationError> { // Convert to internal format - let messages = request.contents.iter() + let messages = request + .contents + .iter() .map(|c| { let role = match c.role.as_str() { "user" => Role::User, "model" => Role::Assistant, _ => Role::User, }; - let content = c.parts.iter() + let content = c + .parts + .iter() .filter_map(|p| p.text.clone()) .collect::>() .join(""); @@ -171,7 +187,8 @@ pub async fn gemini_generate_content( }) .collect::>(); - let max_tokens = request.generation_config + let max_tokens = request + .generation_config .as_ref() .and_then(|c| c.max_output_tokens) .unwrap_or(4096); @@ -179,7 +196,10 @@ pub async fn gemini_generate_content( let chat_request = ChatCompletionRequest { model: model_id.clone(), messages, - temperature: request.generation_config.as_ref().and_then(|c| c.temperature), + temperature: request + .generation_config + .as_ref() + .and_then(|c| c.temperature), top_p: request.generation_config.as_ref().and_then(|c| c.top_p), max_tokens: Some(max_tokens), stream: false, @@ -188,14 +208,24 @@ pub async fn gemini_generate_content( let response = state.engine.chat_completion(&chat_request).await?; - let content = response.choices.first() + let content = response + .choices + .first() .and_then(|c| c.message.content.clone()) .unwrap_or_default(); let gemini_response = GeminiResponse::new( content, - response.usage.as_ref().map(|u| u.prompt_tokens).unwrap_or(0), - response.usage.as_ref().map(|u| u.completion_tokens).unwrap_or(0), + response + .usage + .as_ref() + .map(|u| u.prompt_tokens) + .unwrap_or(0), + response + .usage + .as_ref() + .map(|u| u.completion_tokens) + .unwrap_or(0), ); Ok(Json(gemini_response)) @@ -208,14 +238,18 @@ pub async fn gemini_stream_generate_content( Json(request): Json, ) -> Result { // Convert to internal format (similar to above) - let messages = request.contents.iter() + let messages = request + .contents + .iter() .map(|c| { let role = match c.role.as_str() { "user" => Role::User, "model" => Role::Assistant, _ => Role::User, }; - let content = c.parts.iter() + let content = c + .parts + .iter() .filter_map(|p| p.text.clone()) .collect::>() .join(""); @@ -230,7 +264,8 @@ pub async fn gemini_stream_generate_content( }) .collect(); - let max_tokens = request.generation_config + let max_tokens = request + .generation_config .as_ref() .and_then(|c| c.max_output_tokens) .unwrap_or(4096); @@ -238,7 +273,10 @@ pub async fn gemini_stream_generate_content( let chat_request = ChatCompletionRequest { model: model_id.clone(), messages, - temperature: request.generation_config.as_ref().and_then(|c| c.temperature), + temperature: request + .generation_config + .as_ref() + .and_then(|c| c.temperature), max_tokens: Some(max_tokens), stream: true, ..ChatCompletionRequest::new(&model_id, vec![]) @@ -253,24 +291,18 @@ pub async fn gemini_stream_generate_content( // ============== Admin Handlers ============== /// GET /admin/stats -pub async fn get_stats( - State(state): State, -) -> Json { +pub async fn get_stats(State(state): State) -> Json { Json(state.engine.stats()) } /// POST /admin/stats/reset -pub async fn reset_stats( - State(state): State, -) -> StatusCode { +pub async fn reset_stats(State(state): State) -> StatusCode { state.engine.reset_stats(); StatusCode::NO_CONTENT } /// GET /admin/config -pub async fn get_config( - State(state): State, -) -> Json { +pub async fn get_config(State(state): State) -> Json { Json(state.engine.config()) } @@ -282,29 +314,23 @@ pub async fn update_config( // Note: Runtime config update requires mutable access // For now, return not implemented Err(SimulationError::Internal( - "Runtime config updates not yet supported".to_string() + "Runtime config updates not yet supported".to_string(), )) } /// POST /admin/chaos/enable -pub async fn enable_chaos( - State(_state): State, -) -> StatusCode { +pub async fn enable_chaos(State(_state): State) -> StatusCode { // Would need mutable access to engine StatusCode::NOT_IMPLEMENTED } /// POST /admin/chaos/disable -pub async fn disable_chaos( - State(_state): State, -) -> StatusCode { +pub async fn disable_chaos(State(_state): State) -> StatusCode { StatusCode::NOT_IMPLEMENTED } /// GET /admin/chaos/status -pub async fn chaos_status( - State(state): State, -) -> Json { +pub async fn chaos_status(State(state): State) -> Json { Json(ChaosStatusResponse { enabled: state.config.chaos.enabled, global_probability: state.config.chaos.global_probability, @@ -326,9 +352,7 @@ pub struct ChaosStatusResponse { // ============== Health Handlers ============== /// GET /health -pub async fn health_check( - State(state): State, -) -> Json { +pub async fn health_check(State(state): State) -> Json { let mut checks = std::collections::HashMap::new(); let mut overall_status = HealthStatus::Healthy; @@ -343,7 +367,9 @@ pub async fn health_check( let config_check = check_config(&state); if config_check.status == ComponentStatus::Fail { overall_status = HealthStatus::Unhealthy; - } else if config_check.status == ComponentStatus::Warn && overall_status == HealthStatus::Healthy { + } else if config_check.status == ComponentStatus::Warn + && overall_status == HealthStatus::Healthy + { overall_status = HealthStatus::Degraded; } checks.insert("config".to_string(), config_check); @@ -372,12 +398,15 @@ pub async fn health_check( // Check 6: Shutdown state if state.shutdown.is_draining() { overall_status = HealthStatus::Unhealthy; - checks.insert("shutdown".to_string(), ComponentHealth { - status: ComponentStatus::Fail, - message: Some("Server is draining".to_string()), - latency_ms: None, - value: None, - }); + checks.insert( + "shutdown".to_string(), + ComponentHealth { + status: ComponentStatus::Fail, + message: Some("Server is draining".to_string()), + latency_ms: None, + value: None, + }, + ); } Json(DetailedHealthResponse { @@ -390,9 +419,7 @@ pub async fn health_check( } /// GET /ready -pub async fn ready_check( - State(state): State, -) -> (StatusCode, Json) { +pub async fn ready_check(State(state): State) -> (StatusCode, Json) { // Not ready if draining if state.shutdown.is_draining() { return ( @@ -437,11 +464,11 @@ pub async fn ready_check( } /// GET /metrics -pub async fn metrics( - State(state): State, -) -> String { +pub async fn metrics(State(state): State) -> String { // Update queue metrics before export - state.metrics.set_queue_depth(state.shutdown.in_flight_count()); + state + .metrics + .set_queue_depth(state.shutdown.in_flight_count()); state.metrics.export() } @@ -628,7 +655,7 @@ mod tests { let response = VersionResponse { name: "test".to_string(), version: "1.0.0".to_string(), - rust_version: "1.75".to_string(), + rust_version: "1.83".to_string(), }; let json = serde_json::to_string(&response).unwrap(); diff --git a/src/server/middleware.rs b/src/server/middleware.rs index 73d025b..a4bda9b 100644 --- a/src/server/middleware.rs +++ b/src/server/middleware.rs @@ -5,21 +5,13 @@ #![allow(dead_code)] -use axum::{ - extract::Request, - middleware::Next, - response::Response, - http::StatusCode, -}; +use axum::{extract::Request, http::StatusCode, middleware::Next, response::Response}; use std::time::Instant; use tracing::{info, warn}; use uuid::Uuid; /// Request ID middleware -pub async fn request_id_middleware( - mut request: Request, - next: Next, -) -> Response { +pub async fn request_id_middleware(mut request: Request, next: Next) -> Response { let request_id = request .headers() .get("x-request-id") @@ -27,13 +19,17 @@ pub async fn request_id_middleware( .map(|s| s.to_string()) .unwrap_or_else(|| Uuid::new_v4().to_string()); - request.extensions_mut().insert(RequestId(request_id.clone())); + request + .extensions_mut() + .insert(RequestId(request_id.clone())); let mut response = next.run(request).await; response.headers_mut().insert( "x-request-id", - request_id.parse().unwrap_or_else(|_| "unknown".parse().unwrap()), + request_id + .parse() + .unwrap_or_else(|_| "unknown".parse().unwrap()), ); response @@ -44,10 +40,7 @@ pub async fn request_id_middleware( pub struct RequestId(pub String); /// Logging middleware -pub async fn logging_middleware( - request: Request, - next: Next, -) -> Response { +pub async fn logging_middleware(request: Request, next: Next) -> Response { let start = Instant::now(); let method = request.method().clone(); let uri = request.uri().clone(); @@ -94,10 +87,7 @@ pub async fn logging_middleware( } /// API key validation middleware -pub async fn api_key_middleware( - request: Request, - next: Next, -) -> Result { +pub async fn api_key_middleware(request: Request, next: Next) -> Result { // Check for API key in Authorization header let auth_header = request .headers() diff --git a/src/server/mod.rs b/src/server/mod.rs index 2284c1d..6366d32 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -3,34 +3,30 @@ //! Provides the Axum-based HTTP server with all API endpoints //! for OpenAI, Anthropic, and Google API compatibility. -mod routes; -mod middleware; mod handlers; +mod middleware; +mod routes; +pub mod shutdown; mod state; mod streaming; -pub mod shutdown; -pub use routes::*; pub use handlers::*; +pub use routes::*; +pub use shutdown::*; pub use state::*; pub use streaming::*; -pub use shutdown::*; use std::net::SocketAddr; use std::sync::Arc; use axum::Router; use tower::ServiceBuilder; -use tower_http::{ - timeout::TimeoutLayer, - trace::TraceLayer, - compression::CompressionLayer, -}; +use tower_http::{compression::CompressionLayer, timeout::TimeoutLayer, trace::TraceLayer}; use tracing::{info, warn}; use crate::config::SimulatorConfig; use crate::engine::SimulationEngine; -use crate::security::{SecurityState, apply_security_middleware, build_cors_layer}; +use crate::security::{apply_security_middleware, build_cors_layer, SecurityState}; use crate::telemetry::{init_telemetry, SimulatorMetrics}; /// Run the simulator server @@ -44,7 +40,10 @@ pub async fn run_server(config: SimulatorConfig) -> anyhow::Result<()> { // Validate RuvVector configuration on startup if config.ruvvector.require_ruvvector { - let service_url = config.ruvvector.service_url.clone() + let service_url = config + .ruvvector + .service_url + .clone() .or_else(|| std::env::var("RUVVECTOR_SERVICE_URL").ok()); if service_url.is_none() || service_url.as_ref().map(|s| s.is_empty()).unwrap_or(true) { @@ -93,10 +92,38 @@ pub async fn run_server(config: SimulatorConfig) -> anyhow::Result<()> { addr ); info!("Configured models: {}", config.models.len()); - info!("Latency simulation: {}", if config.latency.enabled { "enabled" } else { "disabled" }); - info!("Chaos engineering: {}", if config.chaos.enabled { "enabled" } else { "disabled" }); - info!("API key auth: {}", if config.security.api_keys.enabled { "enabled" } else { "disabled" }); - info!("Rate limiting: {}", if config.security.rate_limiting.enabled { "enabled" } else { "disabled" }); + info!( + "Latency simulation: {}", + if config.latency.enabled { + "enabled" + } else { + "disabled" + } + ); + info!( + "Chaos engineering: {}", + if config.chaos.enabled { + "enabled" + } else { + "disabled" + } + ); + info!( + "API key auth: {}", + if config.security.api_keys.enabled { + "enabled" + } else { + "disabled" + } + ); + info!( + "Rate limiting: {}", + if config.security.rate_limiting.enabled { + "enabled" + } else { + "disabled" + } + ); // Create and run the server let listener = tokio::net::TcpListener::bind(addr).await?; @@ -148,10 +175,10 @@ pub fn create_router(state: AppState, security: SecurityState) -> Router { #[cfg(test)] mod tests { use super::*; + use crate::security::SecurityState; use axum::body::Body; use axum::http::{Request, StatusCode}; use tower::ServiceExt; - use crate::security::SecurityState; fn test_state() -> AppState { AppState::new(SimulatorConfig::default()) diff --git a/src/server/routes.rs b/src/server/routes.rs index 43d3fab..7bf6e0e 100644 --- a/src/server/routes.rs +++ b/src/server/routes.rs @@ -12,7 +12,10 @@ use super::state::AppState; pub fn openai_routes() -> Router { Router::new() // Chat completions - .route("/v1/chat/completions", post(handlers::openai_chat_completions)) + .route( + "/v1/chat/completions", + post(handlers::openai_chat_completions), + ) // Embeddings .route("/v1/embeddings", post(handlers::openai_embeddings)) // Models diff --git a/src/server/shutdown.rs b/src/server/shutdown.rs index 4525623..8811979 100644 --- a/src/server/shutdown.rs +++ b/src/server/shutdown.rs @@ -210,9 +210,7 @@ pub async fn graceful_shutdown(shutdown_state: Arc) { } /// Admin endpoint to trigger drain manually -pub async fn admin_drain( - State(shutdown): State>, -) -> Json { +pub async fn admin_drain(State(shutdown): State>) -> Json { shutdown.start_drain(); Json(DrainStatus { @@ -224,9 +222,7 @@ pub async fn admin_drain( } /// Admin endpoint to get drain status -pub async fn admin_drain_status( - State(shutdown): State>, -) -> Json { +pub async fn admin_drain_status(State(shutdown): State>) -> Json { Json(DrainStatus { draining: shutdown.is_draining(), in_flight_requests: shutdown.in_flight_count(), diff --git a/src/server/state.rs b/src/server/state.rs index ec0eca7..2b9a873 100644 --- a/src/server/state.rs +++ b/src/server/state.rs @@ -1,10 +1,10 @@ //! Server state management -use std::sync::Arc; +use super::shutdown::ShutdownState; use crate::config::SimulatorConfig; use crate::engine::SimulationEngine; use crate::telemetry::SimulatorMetrics; -use super::shutdown::ShutdownState; +use std::sync::Arc; /// Shared application state #[derive(Clone)] diff --git a/src/server/streaming.rs b/src/server/streaming.rs index 2a73c19..df3b191 100644 --- a/src/server/streaming.rs +++ b/src/server/streaming.rs @@ -60,8 +60,16 @@ pub fn create_anthropic_sse_stream( let model = model.to_string(); let chunks = response.into_chunks(); let usage = Usage::new( - chunks.iter().map(|(_, c)| c.usage.as_ref().map(|u| u.prompt_tokens).unwrap_or(0)).max().unwrap_or(0), - chunks.iter().map(|(_, c)| c.usage.as_ref().map(|u| u.completion_tokens).unwrap_or(0)).max().unwrap_or(0), + chunks + .iter() + .map(|(_, c)| c.usage.as_ref().map(|u| u.prompt_tokens).unwrap_or(0)) + .max() + .unwrap_or(0), + chunks + .iter() + .map(|(_, c)| c.usage.as_ref().map(|u| u.completion_tokens).unwrap_or(0)) + .max() + .unwrap_or(0), ); Box::pin(stream::unfold( @@ -89,9 +97,7 @@ pub fn create_anthropic_sse_stream( }, }; let data = sanitize_sse_data(&serde_json::to_string(&event).unwrap_or_default()); - let sse_event = Event::default() - .event("message_start") - .data(data); + let sse_event = Event::default().event("message_start").data(data); return Some((Ok(sse_event), (iter, 0, id, model, usage, true, false))); } @@ -102,40 +108,61 @@ pub fn create_anthropic_sse_stream( } // Convert to Anthropic format - let content = chunk.choices.first() + let content = chunk + .choices + .first() .and_then(|c| c.delta.content.clone()) .unwrap_or_default(); - if content.is_empty() && chunk.choices.first().and_then(|c| c.finish_reason).is_none() { + if content.is_empty() + && chunk + .choices + .first() + .and_then(|c| c.finish_reason) + .is_none() + { // Skip empty deltas that aren't finish markers return Some(( Ok(Event::default().event("ping").data("{}")), - (iter, index, id, model, usage, started, false) + (iter, index, id, model, usage, started, false), )); } - if chunk.choices.first().and_then(|c| c.finish_reason).is_some() { + if chunk + .choices + .first() + .and_then(|c| c.finish_reason) + .is_some() + { // Send content_block_stop, message_delta, and message_stop let stop_event = AnthropicStreamEvent::ContentBlockStop { index: 0 }; - let data = sanitize_sse_data(&serde_json::to_string(&stop_event).unwrap_or_default()); - let sse_event = Event::default() - .event("content_block_stop") - .data(data); - return Some((Ok(sse_event), (iter, index, id, model, usage, started, true))); + let data = sanitize_sse_data( + &serde_json::to_string(&stop_event).unwrap_or_default(), + ); + let sse_event = Event::default().event("content_block_stop").data(data); + return Some(( + Ok(sse_event), + (iter, index, id, model, usage, started, true), + )); } // Send content_block_start if this is first content if index == 0 { let start_event = AnthropicStreamEvent::ContentBlockStart { index: 0, - content_block: AnthropicContentBlockType::Text { text: String::new() }, + content_block: AnthropicContentBlockType::Text { + text: String::new(), + }, }; - let data = sanitize_sse_data(&serde_json::to_string(&start_event).unwrap_or_default()); - let sse_event = Event::default() - .event("content_block_start") - .data(data); + let data = sanitize_sse_data( + &serde_json::to_string(&start_event).unwrap_or_default(), + ); + let sse_event = Event::default().event("content_block_start").data(data); // We need to send content delta next - return Some((Ok(sse_event), (iter, index + 1, id, model, usage, started, false))); + return Some(( + Ok(sse_event), + (iter, index + 1, id, model, usage, started, false), + )); } // Send content delta @@ -143,20 +170,24 @@ pub fn create_anthropic_sse_stream( index: 0, delta: AnthropicDelta::TextDelta { text: content }, }; - let data = sanitize_sse_data(&serde_json::to_string(&delta_event).unwrap_or_default()); - let sse_event = Event::default() - .event("content_block_delta") - .data(data); - Some((Ok(sse_event), (iter, index + 1, id, model, usage, started, false))) + let data = + sanitize_sse_data(&serde_json::to_string(&delta_event).unwrap_or_default()); + let sse_event = Event::default().event("content_block_delta").data(data); + Some(( + Ok(sse_event), + (iter, index + 1, id, model, usage, started, false), + )) } None => { // Send message_stop let event = AnthropicStreamEvent::MessageStop; - let data = sanitize_sse_data(&serde_json::to_string(&event).unwrap_or_default()); - let sse_event = Event::default() - .event("message_stop") - .data(data); - Some((Ok(sse_event), (iter, index, id, model, usage, started, true))) + let data = + sanitize_sse_data(&serde_json::to_string(&event).unwrap_or_default()); + let sse_event = Event::default().event("message_stop").data(data); + Some(( + Ok(sse_event), + (iter, index, id, model, usage, started, true), + )) } } }, @@ -178,7 +209,9 @@ pub fn create_gemini_sse_stream( sleep(delay).await; } - let content = chunk.choices.first() + let content = chunk + .choices + .first() .and_then(|c| c.delta.content.clone()) .unwrap_or_default(); @@ -191,7 +224,9 @@ pub fn create_gemini_sse_stream( role: "model".to_string(), parts: vec![GeminiResponsePart { text: content }], }, - finish_reason: chunk.choices.first() + finish_reason: chunk + .choices + .first() .and_then(|c| c.finish_reason) .map(|_| "STOP".to_string()), safety_ratings: None, diff --git a/src/telemetry/metrics.rs b/src/telemetry/metrics.rs index 44d12de..5047bf4 100644 --- a/src/telemetry/metrics.rs +++ b/src/telemetry/metrics.rs @@ -1,9 +1,9 @@ //! Prometheus metrics implementation -use std::sync::atomic::{AtomicU64, Ordering}; -use std::time::{Duration, Instant}; use parking_lot::RwLock; use std::collections::HashMap; +use std::sync::atomic::{AtomicU64, Ordering}; +use std::time::{Duration, Instant}; /// Global metrics registry pub struct MetricsRegistry { @@ -29,7 +29,8 @@ impl MetricsRegistry { } else { drop(counters); let mut counters = self.counters.write(); - counters.entry(name.to_string()) + counters + .entry(name.to_string()) .or_insert_with(|| AtomicU64::new(0)) .fetch_add(value, Ordering::Relaxed); } @@ -38,7 +39,8 @@ impl MetricsRegistry { /// Set a gauge value pub fn gauge_set(&self, name: &str, value: u64) { let mut gauges = self.gauges.write(); - gauges.entry(name.to_string()) + gauges + .entry(name.to_string()) .or_insert_with(|| AtomicU64::new(0)) .store(value, Ordering::Relaxed); } @@ -51,8 +53,9 @@ impl MetricsRegistry { } else { drop(histograms); let mut histograms = self.histograms.write(); - histograms.entry(name.to_string()) - .or_insert_with(Histogram::new) + histograms + .entry(name.to_string()) + .or_default() .observe(value); } } @@ -64,19 +67,13 @@ impl MetricsRegistry { // Export counters for (name, counter) in self.counters.read().iter() { let value = counter.load(Ordering::Relaxed); - output.push_str(&format!( - "# TYPE {} counter\n{} {}\n", - name, name, value - )); + output.push_str(&format!("# TYPE {} counter\n{} {}\n", name, name, value)); } // Export gauges for (name, gauge) in self.gauges.read().iter() { let value = gauge.load(Ordering::Relaxed); - output.push_str(&format!( - "# TYPE {} gauge\n{} {}\n", - name, name, value - )); + output.push_str(&format!("# TYPE {} gauge\n{} {}\n", name, name, value)); } // Export histograms @@ -87,7 +84,9 @@ impl MetricsRegistry { output.push_str(&format!("{}_sum {}\n", name, stats.sum)); // Buckets - let buckets = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0]; + let buckets = [ + 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0, 10.0, + ]; for bucket in buckets { let count = hist.count_below(bucket); output.push_str(&format!("{}_bucket{{le=\"{}\"}} {}\n", name, bucket, count)); @@ -148,7 +147,8 @@ impl Histogram { } pub fn count_below(&self, threshold: f64) -> u64 { - self.values.read() + self.values + .read() .iter() .filter(|&&v| v <= threshold) .count() as u64 @@ -271,8 +271,10 @@ impl SimulatorMetrics { self.registry.counter_inc(metric_names::REQUESTS_TOTAL, 1); let duration_key = format!("{}{{model=\"{}\"}}", metric_names::REQUESTS_DURATION, model); - self.registry.histogram_observe(&duration_key, duration.as_secs_f64()); - self.registry.histogram_observe(metric_names::REQUESTS_DURATION, duration.as_secs_f64()); + self.registry + .histogram_observe(&duration_key, duration.as_secs_f64()); + self.registry + .histogram_observe(metric_names::REQUESTS_DURATION, duration.as_secs_f64()); } /// Record a request with full labels (provider, model, status) @@ -285,67 +287,82 @@ impl SimulatorMetrics { ) { let key = format!( "{}{{provider=\"{}\",model=\"{}\",status=\"{}\"}}", - metric_names::REQUESTS_TOTAL, provider, model, status + metric_names::REQUESTS_TOTAL, + provider, + model, + status ); self.registry.counter_inc(&key, 1); self.registry.counter_inc(metric_names::REQUESTS_TOTAL, 1); let duration_key = format!( "{}{{provider=\"{}\",model=\"{}\"}}", - metric_names::REQUESTS_DURATION, provider, model + metric_names::REQUESTS_DURATION, + provider, + model ); - self.registry.histogram_observe(&duration_key, duration.as_secs_f64()); + self.registry + .histogram_observe(&duration_key, duration.as_secs_f64()); } /// Record token usage with labels pub fn record_tokens(&self, input: u32, output: u32) { - self.registry.counter_inc(metric_names::TOKENS_INPUT, input as u64); - self.registry.counter_inc(metric_names::TOKENS_OUTPUT, output as u64); + self.registry + .counter_inc(metric_names::TOKENS_INPUT, input as u64); + self.registry + .counter_inc(metric_names::TOKENS_OUTPUT, output as u64); } /// Record token usage with provider/model labels pub fn record_tokens_with_labels(&self, input: u32, output: u32, provider: &str, model: &str) { let input_key = format!( "{}{{provider=\"{}\",model=\"{}\"}}", - metric_names::TOKENS_INPUT, provider, model + metric_names::TOKENS_INPUT, + provider, + model ); let output_key = format!( "{}{{provider=\"{}\",model=\"{}\"}}", - metric_names::TOKENS_OUTPUT, provider, model + metric_names::TOKENS_OUTPUT, + provider, + model ); self.registry.counter_inc(&input_key, input as u64); self.registry.counter_inc(&output_key, output as u64); - self.registry.counter_inc(metric_names::TOKENS_INPUT, input as u64); - self.registry.counter_inc(metric_names::TOKENS_OUTPUT, output as u64); + self.registry + .counter_inc(metric_names::TOKENS_INPUT, input as u64); + self.registry + .counter_inc(metric_names::TOKENS_OUTPUT, output as u64); } /// Record an error with type label pub fn record_error(&self, error_type: &str) { - let key = format!("{}{{error_type=\"{}\"}}", metric_names::ERRORS_TOTAL, error_type); + let key = format!( + "{}{{error_type=\"{}\"}}", + metric_names::ERRORS_TOTAL, + error_type + ); self.registry.counter_inc(&key, 1); self.registry.counter_inc(metric_names::ERRORS_TOTAL, 1); } /// Record time to first token pub fn record_ttft(&self, ttft: Duration) { - self.registry.histogram_observe( - metric_names::TTFT_SECONDS, - ttft.as_secs_f64(), - ); + self.registry + .histogram_observe(metric_names::TTFT_SECONDS, ttft.as_secs_f64()); } /// Record inter-token latency pub fn record_itl(&self, itl: Duration) { - self.registry.histogram_observe( - metric_names::ITL_SECONDS, - itl.as_secs_f64(), - ); + self.registry + .histogram_observe(metric_names::ITL_SECONDS, itl.as_secs_f64()); } /// Set the number of active requests pub fn set_active_requests(&self, count: u64) { - self.registry.gauge_set(metric_names::ACTIVE_REQUESTS, count); + self.registry + .gauge_set(metric_names::ACTIVE_REQUESTS, count); } /// Set queue depth (new) @@ -355,14 +372,17 @@ impl SimulatorMetrics { /// Set queue capacity (new) pub fn set_queue_capacity(&self, capacity: u64) { - self.registry.gauge_set(metric_names::QUEUE_CAPACITY, capacity); + self.registry + .gauge_set(metric_names::QUEUE_CAPACITY, capacity); } /// Record cost in dollars (new) pub fn record_cost(&self, cost_dollars: f64, provider: &str, model: &str) { let key = format!( "{}{{provider=\"{}\",model=\"{}\"}}", - metric_names::COST_DOLLARS, provider, model + metric_names::COST_DOLLARS, + provider, + model ); // Store as micro-dollars to avoid floating point issues let micro_dollars = (cost_dollars * 1_000_000.0) as u64; diff --git a/src/telemetry/mod.rs b/src/telemetry/mod.rs index 71f37cf..e936a77 100644 --- a/src/telemetry/mod.rs +++ b/src/telemetry/mod.rs @@ -15,7 +15,7 @@ pub use tracing_ext::*; // FEU (Foundational Execution Unit) re-exports pub use tracing_ext::{ - FeuSpanCollector, FeuValidationError, ExecutionTrace, SpanArtifact, FEU_ROOT_PARENT, + ExecutionTrace, FeuSpanCollector, FeuValidationError, SpanArtifact, FEU_ROOT_PARENT, }; use std::time::Duration; @@ -31,12 +31,11 @@ pub fn init_telemetry(config: &TelemetryConfig) -> SimulatorResult<()> { } // Build the env filter - let env_filter = EnvFilter::try_from_default_env() - .unwrap_or_else(|_| EnvFilter::new(&config.log_level)); + let env_filter = + EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(&config.log_level)); // Build subscriber based on config - let subscriber = tracing_subscriber::registry() - .with(env_filter); + let subscriber = tracing_subscriber::registry().with(env_filter); if config.json_logs { let json_layer = tracing_subscriber::fmt::layer() @@ -69,8 +68,12 @@ pub fn init_telemetry(config: &TelemetryConfig) -> SimulatorResult<()> { /// Initialize OpenTelemetry tracing (optional) #[cfg(feature = "otel")] pub fn init_otel(config: &TelemetryConfig) -> SimulatorResult<()> { - use opentelemetry::sdk::trace::{self, RandomIdGenerator, Sampler}; use opentelemetry_otlp::WithExportConfig; + use opentelemetry_sdk::{ + runtime::Tokio, + trace::{self, RandomIdGenerator, Sampler}, + Resource, + }; if let Some(endpoint) = &config.otlp_endpoint { let tracer = opentelemetry_otlp::new_pipeline() @@ -78,24 +81,28 @@ pub fn init_otel(config: &TelemetryConfig) -> SimulatorResult<()> { .with_exporter( opentelemetry_otlp::new_exporter() .tonic() - .with_endpoint(endpoint) + .with_endpoint(endpoint), ) .with_trace_config( trace::config() .with_sampler(Sampler::AlwaysOn) .with_id_generator(RandomIdGenerator::default()) - .with_resource(opentelemetry::sdk::Resource::new(vec![ + .with_resource(Resource::new(vec![ opentelemetry::KeyValue::new("service.name", config.service_name.clone()), opentelemetry::KeyValue::new("service.version", env!("CARGO_PKG_VERSION")), - ])) + ])), ) - .install_batch(opentelemetry::runtime::Tokio) + .install_batch(Tokio) .map_err(|e| crate::error::SimulationError::Config(e.to_string()))?; - let otel_layer = tracing_opentelemetry::layer().with_tracer(tracer); + let _otel_layer = + tracing_opentelemetry::layer::().with_tracer(tracer); // Note: This needs to be integrated with the main subscriber - tracing::info!("OpenTelemetry tracing initialized with endpoint: {}", endpoint); + tracing::info!( + "OpenTelemetry tracing initialized with endpoint: {}", + endpoint + ); } Ok(()) diff --git a/src/telemetry/tracing_ext.rs b/src/telemetry/tracing_ext.rs index bb89e26..8d22f0e 100644 --- a/src/telemetry/tracing_ext.rs +++ b/src/telemetry/tracing_ext.rs @@ -6,9 +6,9 @@ //! - Request/response tracking //! - FEU (Foundational Execution Unit) span hierarchy and validation +use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::time::Instant; -use serde::{Deserialize, Serialize}; use tracing::{info_span, Span}; use crate::adapters::observatory::{ConsumedSpan, FeuSpanKind, SpanEvent, SpanStatus}; @@ -88,7 +88,8 @@ impl RequestSpan { /// Record latency pub fn record_latency(&self) { - self.span.record("latency_ms", self.start.elapsed().as_millis() as u64); + self.span + .record("latency_ms", self.start.elapsed().as_millis() as u64); } /// Get request ID @@ -285,7 +286,10 @@ impl FeuSpanCollector { /// Create a new collector. Generates trace_id and repo span automatically. pub fn new(trace_id: Option) -> Self { let trace_id = trace_id.unwrap_or_else(|| uuid::Uuid::new_v4().to_string()); - let repo_span_id = format!("repo_{}", uuid::Uuid::new_v4().to_string().replace('-', "")[..16].to_string()); + let repo_span_id = format!( + "repo_{}", + &uuid::Uuid::new_v4().to_string().replace('-', "")[..16] + ); let repo_span = ConsumedSpan { span_id: repo_span_id.clone(), @@ -337,8 +341,9 @@ impl FeuSpanCollector { } let span_id = format!( - "agent_{}_{}", agent_name, - uuid::Uuid::new_v4().to_string().replace('-', "")[..12].to_string() + "agent_{}_{}", + agent_name, + &uuid::Uuid::new_v4().to_string().replace('-', "")[..12] ); let span = ConsumedSpan { @@ -368,7 +373,11 @@ impl FeuSpanCollector { } /// Attach an artifact to a specific agent span. - pub fn attach_artifact(&mut self, span_id: &str, artifact: SpanArtifact) -> Result<(), FeuValidationError> { + pub fn attach_artifact( + &mut self, + span_id: &str, + artifact: SpanArtifact, + ) -> Result<(), FeuValidationError> { // Verify the span exists if !self.agent_spans.iter().any(|s| s.span_id == span_id) { return Err(FeuValidationError::SpanNotFound { @@ -385,8 +394,14 @@ impl FeuSpanCollector { } /// End an agent span with a given status. Records end_time. - pub fn end_agent_span(&mut self, span_id: &str, status: SpanStatus) -> Result<(), FeuValidationError> { - let span = self.agent_spans.iter_mut() + pub fn end_agent_span( + &mut self, + span_id: &str, + status: SpanStatus, + ) -> Result<(), FeuValidationError> { + let span = self + .agent_spans + .iter_mut() .find(|s| s.span_id == *span_id) .ok_or_else(|| FeuValidationError::SpanNotFound { span_id: span_id.to_string(), @@ -400,8 +415,14 @@ impl FeuSpanCollector { } /// Fail an agent span. Adds error event and propagates failure to the repo span. - pub fn fail_agent_span(&mut self, span_id: &str, error_msg: &str) -> Result<(), FeuValidationError> { - let span = self.agent_spans.iter_mut() + pub fn fail_agent_span( + &mut self, + span_id: &str, + error_msg: &str, + ) -> Result<(), FeuValidationError> { + let span = self + .agent_spans + .iter_mut() .find(|s| s.span_id == *span_id) .ok_or_else(|| FeuValidationError::SpanNotFound { span_id: span_id.to_string(), @@ -436,12 +457,14 @@ impl FeuSpanCollector { // Set repo span end_time self.repo_span.end_time = Some(chrono::Utc::now().timestamp_millis() as u64); - self.repo_span.latency_ms = Some( - (self.repo_span.end_time.unwrap() - self.repo_span.start_time) as f64, - ); + self.repo_span.latency_ms = + Some((self.repo_span.end_time.unwrap() - self.repo_span.start_time) as f64); // Derive overall status: if ANY agent span is Failed, repo is Failed - let has_failure = self.agent_spans.iter().any(|s| s.status == SpanStatus::Failed); + let has_failure = self + .agent_spans + .iter() + .any(|s| s.status == SpanStatus::Failed); if has_failure { self.repo_span.status = SpanStatus::Failed; } else if self.repo_span.status == SpanStatus::Unset { @@ -543,7 +566,10 @@ mod tests { let collector = FeuSpanCollector::new(Some("trace-001".to_string())); assert_eq!(collector.trace_id(), "trace-001"); assert!(collector.repo_span_id().starts_with("repo_")); - assert_eq!(collector.repo_span.parent_span_id, Some(FEU_ROOT_PARENT.to_string())); + assert_eq!( + collector.repo_span.parent_span_id, + Some(FEU_ROOT_PARENT.to_string()) + ); assert_eq!(collector.repo_span.span_kind, Some(FeuSpanKind::Repo)); assert_eq!(collector.repo_span.name, "repo_execution"); } @@ -555,7 +581,9 @@ mod tests { let span_id = collector.begin_agent_span("intelligence").unwrap(); - let agent_span = collector.agent_spans.iter() + let agent_span = collector + .agent_spans + .iter() .find(|s| s.span_id == span_id) .unwrap(); @@ -570,7 +598,10 @@ mod tests { collector.begin_agent_span("intelligence").unwrap(); let result = collector.begin_agent_span("intelligence"); - assert!(matches!(result, Err(FeuValidationError::DuplicateAgentSpan { .. }))); + assert!(matches!( + result, + Err(FeuValidationError::DuplicateAgentSpan { .. }) + )); } #[test] @@ -578,13 +609,17 @@ mod tests { let mut collector = FeuSpanCollector::new(None); let span_id = collector.begin_agent_span("engine").unwrap(); - collector.fail_agent_span(&span_id, "something broke").unwrap(); + collector + .fail_agent_span(&span_id, "something broke") + .unwrap(); // Repo span should be Failed due to propagation assert_eq!(collector.repo_span.status, SpanStatus::Failed); // Agent span should have error event - let agent_span = collector.agent_spans.iter() + let agent_span = collector + .agent_spans + .iter() .find(|s| s.span_id == span_id) .unwrap(); assert_eq!(agent_span.status, SpanStatus::Failed); @@ -677,7 +712,10 @@ mod tests { }; let result = FeuSpanCollector::validate_span(&span); - assert!(matches!(result, Err(FeuValidationError::MissingParentSpanId { .. }))); + assert!(matches!( + result, + Err(FeuValidationError::MissingParentSpanId { .. }) + )); } #[test] @@ -690,7 +728,10 @@ mod tests { }; let result = collector.attach_artifact("nonexistent", artifact); - assert!(matches!(result, Err(FeuValidationError::SpanNotFound { .. }))); + assert!(matches!( + result, + Err(FeuValidationError::SpanNotFound { .. }) + )); } #[test] diff --git a/src/types/messages.rs b/src/types/messages.rs index e3c7e62..4098207 100644 --- a/src/types/messages.rs +++ b/src/types/messages.rs @@ -1,7 +1,7 @@ //! Message types for chat completions -use serde::{Deserialize, Serialize}; use super::Role; +use serde::{Deserialize, Serialize}; /// A message in a chat conversation #[derive(Debug, Clone, Serialize, Deserialize)] @@ -56,18 +56,17 @@ impl Message { pub fn text(&self) -> String { match &self.content { MessageContent::Text(t) => t.clone(), - MessageContent::Parts(parts) => { - parts.iter() - .filter_map(|p| { - if let ContentPart::Text { text } = p { - Some(text.as_str()) - } else { - None - } - }) - .collect::>() - .join("") - } + MessageContent::Parts(parts) => parts + .iter() + .filter_map(|p| { + if let ContentPart::Text { text } = p { + Some(text.as_str()) + } else { + None + } + }) + .collect::>() + .join(""), } } @@ -98,18 +97,17 @@ impl MessageContent { pub fn text(&self) -> String { match self { MessageContent::Text(t) => t.clone(), - MessageContent::Parts(parts) => { - parts.iter() - .filter_map(|p| { - if let ContentPart::Text { text } = p { - Some(text.as_str()) - } else { - None - } - }) - .collect::>() - .join("") - } + MessageContent::Parts(parts) => parts + .iter() + .filter_map(|p| { + if let ContentPart::Text { text } = p { + Some(text.as_str()) + } else { + None + } + }) + .collect::>() + .join(""), } } } diff --git a/src/types/request.rs b/src/types/request.rs index a222cdb..933df5c 100644 --- a/src/types/request.rs +++ b/src/types/request.rs @@ -1,7 +1,7 @@ //! Request types for LLM APIs -use serde::{Deserialize, Serialize}; use super::{Message, ResponseFormat, Tool}; +use serde::{Deserialize, Serialize}; /// Chat completion request (OpenAI-compatible) #[derive(Debug, Clone, Serialize, Deserialize)] @@ -70,6 +70,8 @@ impl ChatCompletionRequest { } /// Configure options via a builder-style method + // Retained for source compatibility; callers can set the full OpenAI option group at once. + #[allow(clippy::too_many_arguments)] pub fn with_options( mut self, temperature: Option, @@ -237,12 +239,11 @@ impl AnthropicContent { pub fn text(&self) -> String { match self { Self::Text(t) => t.clone(), - Self::Blocks(blocks) => { - blocks.iter() - .filter_map(|b| b.get("text").and_then(|t| t.as_str())) - .collect::>() - .join("") - } + Self::Blocks(blocks) => blocks + .iter() + .filter_map(|b| b.get("text").and_then(|t| t.as_str())) + .collect::>() + .join(""), } } } @@ -312,6 +313,9 @@ mod tests { assert_eq!(single.to_vec(), vec!["stop".to_string()]); let multiple: StopSequence = serde_json::from_str(r#"["stop", "end"]"#).unwrap(); - assert_eq!(multiple.to_vec(), vec!["stop".to_string(), "end".to_string()]); + assert_eq!( + multiple.to_vec(), + vec!["stop".to_string(), "end".to_string()] + ); } } diff --git a/src/types/response.rs b/src/types/response.rs index aadd3c8..6dbda11 100644 --- a/src/types/response.rs +++ b/src/types/response.rs @@ -1,8 +1,8 @@ //! Response types for LLM APIs +use super::{FinishReason, Role, Usage}; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; -use super::{FinishReason, Role, Usage}; /// Chat completion response (OpenAI-compatible) #[derive(Debug, Clone, Serialize, Deserialize)] @@ -19,7 +19,12 @@ pub struct ChatCompletionResponse { } impl ChatCompletionResponse { - pub fn new(id: String, model: String, choices: Vec, usage: Usage) -> Self { + pub fn new( + id: String, + model: String, + choices: Vec, + usage: Usage, + ) -> Self { Self { id, object: "chat.completion".to_string(), @@ -27,7 +32,10 @@ impl ChatCompletionResponse { model, choices, usage: Some(usage), - system_fingerprint: Some(format!("fp_simulator_{}", env!("CARGO_PKG_VERSION").replace('.', ""))), + system_fingerprint: Some(format!( + "fp_simulator_{}", + env!("CARGO_PKG_VERSION").replace('.', "") + )), } } @@ -236,7 +244,9 @@ impl AnthropicMessagesResponse { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum AnthropicContentBlock { - Text { text: String }, + Text { + text: String, + }, ToolUse { id: String, name: String, @@ -345,7 +355,10 @@ mod tests { assert_eq!(response.id, "chatcmpl-123"); assert_eq!(response.choices.len(), 1); - assert_eq!(response.choices[0].message.content, Some("Hello!".to_string())); + assert_eq!( + response.choices[0].message.content, + Some("Hello!".to_string()) + ); } #[test] diff --git a/src/types/streaming.rs b/src/types/streaming.rs index 6e9a737..1b1c593 100644 --- a/src/types/streaming.rs +++ b/src/types/streaming.rs @@ -1,7 +1,7 @@ //! Streaming types for Server-Sent Events -use serde::{Deserialize, Serialize}; use super::{FinishReason, Role, Usage}; +use serde::{Deserialize, Serialize}; /// Streaming chat completion chunk (OpenAI-compatible) #[derive(Debug, Clone, Serialize, Deserialize)] @@ -26,7 +26,10 @@ impl ChatCompletionChunk { model, choices, usage: None, - system_fingerprint: Some(format!("fp_simulator_{}", env!("CARGO_PKG_VERSION").replace('.', ""))), + system_fingerprint: Some(format!( + "fp_simulator_{}", + env!("CARGO_PKG_VERSION").replace('.', "") + )), } } @@ -48,7 +51,10 @@ impl ChatCompletionChunk { /// Format as SSE data line pub fn to_sse_data(&self) -> String { - format!("data: {}\n\n", serde_json::to_string(self).unwrap_or_default()) + format!( + "data: {}\n\n", + serde_json::to_string(self).unwrap_or_default() + ) } } @@ -192,8 +198,14 @@ pub struct AnthropicStreamMessage { #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum AnthropicContentBlockType { - Text { text: String }, - ToolUse { id: String, name: String, input: serde_json::Value }, + Text { + text: String, + }, + ToolUse { + id: String, + name: String, + input: serde_json::Value, + }, } /// Anthropic delta diff --git a/tests/integration/anthropic_tests.rs b/tests/integration/anthropic_tests.rs index 44e821a..7f3c275 100644 --- a/tests/integration/anthropic_tests.rs +++ b/tests/integration/anthropic_tests.rs @@ -8,7 +8,10 @@ async fn test_anthropic_messages_basic() { let server = TestServer::spawn().await; let response = server - .post("/v1/messages", anthropic_request("claude-3-5-sonnet-20241022", "Hello!", 100)) + .post( + "/v1/messages", + anthropic_request("claude-3-5-sonnet-20241022", "Hello!", 100), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -40,7 +43,7 @@ async fn test_anthropic_messages_with_system() { assert_eq!(response.status().as_u16(), 200); let body: serde_json::Value = response.json().await.unwrap(); - assert!(body["content"].as_array().unwrap().len() > 0); + assert!(!body["content"].as_array().unwrap().is_empty()); } #[tokio::test] @@ -48,7 +51,10 @@ async fn test_anthropic_messages_claude_opus() { let server = TestServer::spawn().await; let response = server - .post("/v1/messages", anthropic_request("claude-3-opus-20240229", "Test", 50)) + .post( + "/v1/messages", + anthropic_request("claude-3-opus-20240229", "Test", 50), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -62,7 +68,10 @@ async fn test_anthropic_messages_claude_haiku() { let server = TestServer::spawn().await; let response = server - .post("/v1/messages", anthropic_request("claude-3-haiku-20240307", "Quick test", 50)) + .post( + "/v1/messages", + anthropic_request("claude-3-haiku-20240307", "Quick test", 50), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -77,7 +86,10 @@ async fn test_anthropic_messages_without_version_prefix() { // /messages endpoint without /v1 prefix let response = server - .post("/messages", anthropic_request("claude-3-5-sonnet-20241022", "Hello!", 100)) + .post( + "/messages", + anthropic_request("claude-3-5-sonnet-20241022", "Hello!", 100), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -109,7 +121,10 @@ async fn test_anthropic_usage_fields() { let server = TestServer::spawn().await; let response = server - .post("/v1/messages", anthropic_request("claude-3-5-sonnet-20241022", "Test usage", 100)) + .post( + "/v1/messages", + anthropic_request("claude-3-5-sonnet-20241022", "Test usage", 100), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -126,7 +141,10 @@ async fn test_anthropic_stop_reason() { let server = TestServer::spawn().await; let response = server - .post("/v1/messages", anthropic_request("claude-3-5-sonnet-20241022", "Hello", 100)) + .post( + "/v1/messages", + anthropic_request("claude-3-5-sonnet-20241022", "Hello", 100), + ) .await; assert_eq!(response.status().as_u16(), 200); diff --git a/tests/integration/common.rs b/tests/integration/common.rs index df2ed7a..e2a19ec 100644 --- a/tests/integration/common.rs +++ b/tests/integration/common.rs @@ -72,7 +72,12 @@ impl TestServer { // Wait for health endpoint for _ in 0..50 { - if client.get(format!("{}/health", base_url)).send().await.is_ok() { + if client + .get(format!("{}/health", base_url)) + .send() + .await + .is_ok() + { break; } tokio::time::sleep(Duration::from_millis(100)).await; @@ -107,7 +112,12 @@ impl TestServer { } /// Send a POST request with authorization - pub async fn post_with_auth(&self, path: &str, body: Value, api_key: &str) -> reqwest::Response { + pub async fn post_with_auth( + &self, + path: &str, + body: Value, + api_key: &str, + ) -> reqwest::Response { self.client .post(self.url(path)) .header("Authorization", format!("Bearer {}", api_key)) diff --git a/tests/integration/failure_tests.rs b/tests/integration/failure_tests.rs index 2e26da5..8b84f24 100644 --- a/tests/integration/failure_tests.rs +++ b/tests/integration/failure_tests.rs @@ -35,9 +35,12 @@ async fn test_missing_required_fields() { // Missing model field let response = server - .post("/v1/chat/completions", json!({ - "messages": [{"role": "user", "content": "Hello"}] - })) + .post( + "/v1/chat/completions", + json!({ + "messages": [{"role": "user", "content": "Hello"}] + }), + ) .await; assert!(response.status().is_client_error()); @@ -48,10 +51,13 @@ async fn test_empty_messages() { let server = TestServer::spawn().await; let response = server - .post("/v1/chat/completions", json!({ - "model": "gpt-4", - "messages": [] - })) + .post( + "/v1/chat/completions", + json!({ + "model": "gpt-4", + "messages": [] + }), + ) .await; // Empty messages might return error or succeed with empty response @@ -65,7 +71,10 @@ async fn test_model_not_found() { let server = TestServer::spawn().await; let response = server - .post("/v1/chat/completions", chat_request("nonexistent-model-xyz", "Test")) + .post( + "/v1/chat/completions", + chat_request("nonexistent-model-xyz", "Test"), + ) .await; assert_eq!(response.status().as_u16(), 404); diff --git a/tests/integration/google_tests.rs b/tests/integration/google_tests.rs index 78f5966..7b21bba 100644 --- a/tests/integration/google_tests.rs +++ b/tests/integration/google_tests.rs @@ -8,7 +8,10 @@ async fn test_gemini_generate_content_basic() { let server = TestServer::spawn().await; let response = server - .post("/v1/models/gemini-1.5-pro/generateContent", gemini_request("Hello!")) + .post( + "/v1/models/gemini-1.5-pro/generateContent", + gemini_request("Hello!"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -18,7 +21,7 @@ async fn test_gemini_generate_content_basic() { assert_json_field(&body, "usage_metadata"); let candidates = body["candidates"].as_array().unwrap(); - assert!(candidates.len() > 0); + assert!(!candidates.is_empty()); } #[tokio::test] @@ -26,7 +29,10 @@ async fn test_gemini_generate_content_flash() { let server = TestServer::spawn().await; let response = server - .post("/v1/models/gemini-1.5-flash/generateContent", gemini_request("Quick test")) + .post( + "/v1/models/gemini-1.5-flash/generateContent", + gemini_request("Quick test"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -63,7 +69,10 @@ async fn test_gemini_beta_endpoint() { // v1beta endpoint should also work let response = server - .post("/v1beta/models/gemini-1.5-pro/generateContent", gemini_request("Test")) + .post( + "/v1beta/models/gemini-1.5-pro/generateContent", + gemini_request("Test"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -74,7 +83,10 @@ async fn test_gemini_usage_metadata() { let server = TestServer::spawn().await; let response = server - .post("/v1/models/gemini-1.5-pro/generateContent", gemini_request("Test usage")) + .post( + "/v1/models/gemini-1.5-pro/generateContent", + gemini_request("Test usage"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -92,7 +104,10 @@ async fn test_gemini_candidate_content() { let server = TestServer::spawn().await; let response = server - .post("/v1/models/gemini-1.5-pro/generateContent", gemini_request("Hello")) + .post( + "/v1/models/gemini-1.5-pro/generateContent", + gemini_request("Hello"), + ) .await; assert_eq!(response.status().as_u16(), 200); diff --git a/tests/integration/mod.rs b/tests/integration/mod.rs index d6eec8b..1cffae9 100644 --- a/tests/integration/mod.rs +++ b/tests/integration/mod.rs @@ -2,10 +2,10 @@ //! //! Contains end-to-end tests for all API endpoints. -pub mod common; -pub mod openai_tests; pub mod anthropic_tests; +pub mod common; +pub mod failure_tests; pub mod google_tests; -pub mod streaming_tests; +pub mod openai_tests; pub mod security_tests; -pub mod failure_tests; +pub mod streaming_tests; diff --git a/tests/integration/openai_tests.rs b/tests/integration/openai_tests.rs index ab5d02e..46ef536 100644 --- a/tests/integration/openai_tests.rs +++ b/tests/integration/openai_tests.rs @@ -8,7 +8,10 @@ async fn test_chat_completions_basic() { let server = TestServer::spawn().await; let response = server - .post("/v1/chat/completions", chat_request("gpt-4", "Hello, world!")) + .post( + "/v1/chat/completions", + chat_request("gpt-4", "Hello, world!"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -20,7 +23,7 @@ async fn test_chat_completions_basic() { assert_json_field(&body, "usage"); assert_eq!(body["object"], "chat.completion"); - assert!(body["choices"].as_array().unwrap().len() > 0); + assert!(!body["choices"].as_array().unwrap().is_empty()); } #[tokio::test] @@ -67,7 +70,10 @@ async fn test_chat_completions_gpt35_turbo() { let server = TestServer::spawn().await; let response = server - .post("/v1/chat/completions", chat_request("gpt-3.5-turbo", "Test message")) + .post( + "/v1/chat/completions", + chat_request("gpt-3.5-turbo", "Test message"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -92,7 +98,10 @@ async fn test_chat_completions_invalid_model() { let server = TestServer::spawn().await; let response = server - .post("/v1/chat/completions", chat_request("nonexistent-model", "Test")) + .post( + "/v1/chat/completions", + chat_request("nonexistent-model", "Test"), + ) .await; assert_eq!(response.status().as_u16(), 404); @@ -106,7 +115,10 @@ async fn test_embeddings_basic() { let server = TestServer::spawn().await; let response = server - .post("/v1/embeddings", embeddings_request("text-embedding-ada-002", "Hello world")) + .post( + "/v1/embeddings", + embeddings_request("text-embedding-ada-002", "Hello world"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -117,8 +129,8 @@ async fn test_embeddings_basic() { assert_eq!(body["object"], "list"); let embeddings = body["data"].as_array().unwrap(); - assert!(embeddings.len() > 0); - assert!(embeddings[0]["embedding"].as_array().unwrap().len() > 0); + assert!(!embeddings.is_empty()); + assert!(!embeddings[0]["embedding"].as_array().unwrap().is_empty()); } #[tokio::test] @@ -126,7 +138,10 @@ async fn test_embeddings_3_small() { let server = TestServer::spawn().await; let response = server - .post("/v1/embeddings", embeddings_request("text-embedding-3-small", "Test embedding")) + .post( + "/v1/embeddings", + embeddings_request("text-embedding-3-small", "Test embedding"), + ) .await; assert_eq!(response.status().as_u16(), 200); @@ -146,13 +161,10 @@ async fn test_list_models() { assert_eq!(body["object"], "list"); let models = body["data"].as_array().unwrap(); - assert!(models.len() > 0); + assert!(!models.is_empty()); // Check that expected models exist - let model_ids: Vec<&str> = models - .iter() - .filter_map(|m| m["id"].as_str()) - .collect(); + let model_ids: Vec<&str> = models.iter().filter_map(|m| m["id"].as_str()).collect(); assert!(model_ids.contains(&"gpt-4")); assert!(model_ids.contains(&"gpt-3.5-turbo")); diff --git a/tests/integration/security_tests.rs b/tests/integration/security_tests.rs index 098250a..be6e0b0 100644 --- a/tests/integration/security_tests.rs +++ b/tests/integration/security_tests.rs @@ -2,8 +2,8 @@ use super::common::*; use llm_simulator::config::{ - SimulatorConfig, security::{ApiKeyConfig, ApiKeyEntry, ApiKeyRole, RateLimitTier}, + SimulatorConfig, }; fn config_with_auth() -> SimulatorConfig { diff --git a/tests/integration/streaming_tests.rs b/tests/integration/streaming_tests.rs index 1b642ad..a21c113 100644 --- a/tests/integration/streaming_tests.rs +++ b/tests/integration/streaming_tests.rs @@ -19,7 +19,12 @@ async fn test_openai_streaming_basic() { assert_eq!(response.status().as_u16(), 200); // Verify content-type is SSE - let content_type = response.headers().get("content-type").unwrap().to_str().unwrap(); + let content_type = response + .headers() + .get("content-type") + .unwrap() + .to_str() + .unwrap(); assert!(content_type.contains("text/event-stream")); } @@ -118,12 +123,20 @@ async fn test_gemini_streaming_basic() { let server = TestServer::spawn().await; let response = server - .post("/v1/models/gemini-1.5-pro/streamGenerateContent", gemini_request("Hello")) + .post( + "/v1/models/gemini-1.5-pro/streamGenerateContent", + gemini_request("Hello"), + ) .await; assert_eq!(response.status().as_u16(), 200); - let content_type = response.headers().get("content-type").unwrap().to_str().unwrap(); + let content_type = response + .headers() + .get("content-type") + .unwrap() + .to_str() + .unwrap(); assert!(content_type.contains("text/event-stream")); } diff --git a/tests/property/config_tests.rs b/tests/property/config_tests.rs index b45e273..b453914 100644 --- a/tests/property/config_tests.rs +++ b/tests/property/config_tests.rs @@ -1,7 +1,7 @@ //! Property-based tests for configuration validation -use proptest::prelude::*; use llm_simulator::config::SimulatorConfig; +use proptest::prelude::*; proptest! { /// Test that valid port numbers pass validation @@ -91,7 +91,11 @@ mod validation_tests { fn test_default_config_valid() { let config = SimulatorConfig::default(); let result = config.validate(); - assert!(result.is_ok(), "Default config should be valid: {:?}", result); + assert!( + result.is_ok(), + "Default config should be valid: {:?}", + result + ); } #[test] @@ -99,7 +103,7 @@ mod validation_tests { let config = SimulatorConfig::default(); // Should have default models - assert!(config.models.len() > 0); + assert!(!config.models.is_empty()); assert!(config.models.contains_key("gpt-4")); assert!(config.models.contains_key("claude-3-5-sonnet-20241022")); } diff --git a/tests/property/latency_tests.rs b/tests/property/latency_tests.rs index b1dc270..713debc 100644 --- a/tests/property/latency_tests.rs +++ b/tests/property/latency_tests.rs @@ -1,8 +1,8 @@ //! Property-based tests for latency distribution -use proptest::prelude::*; use llm_simulator::config::LatencyDistribution; use llm_simulator::latency::DistributionSampler; +use proptest::prelude::*; proptest! { /// Test that normal distribution produces positive values @@ -178,7 +178,10 @@ mod additional_tests { #[test] fn test_sample_n() { - let dist = LatencyDistribution::Normal { mean_ms: 100.0, std_dev_ms: 10.0 }; + let dist = LatencyDistribution::Normal { + mean_ms: 100.0, + std_dev_ms: 10.0, + }; let sampler = DistributionSampler::with_seed(42); let samples = sampler.sample_n(&dist, 100); diff --git a/tests/property/mod.rs b/tests/property/mod.rs index bfaf3ec..5574867 100644 --- a/tests/property/mod.rs +++ b/tests/property/mod.rs @@ -2,6 +2,6 @@ //! //! Tests statistical properties and invariants of the system. +pub mod config_tests; pub mod latency_tests; pub mod serialization_tests; -pub mod config_tests; diff --git a/tests/property/serialization_tests.rs b/tests/property/serialization_tests.rs index 0ab7f63..23a2764 100644 --- a/tests/property/serialization_tests.rs +++ b/tests/property/serialization_tests.rs @@ -12,8 +12,7 @@ fn model_strategy() -> impl Strategy { // Strategy for generating valid message content fn content_strategy() -> impl Strategy { - prop::string::string_regex("[a-zA-Z0-9 ,.!?]{1,100}") - .unwrap() + prop::string::string_regex("[a-zA-Z0-9 ,.!?]{1,100}").unwrap() } proptest! { From 26b4607bfce40629b140777a71185e3bcbe367da Mon Sep 17 00:00:00 2001 From: Nick Ruest <127058086+nicholas-ruest@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:09:13 -0400 Subject: [PATCH 3/5] ci: keep Kubernetes manifest parse offline --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fa2a31b..124a167 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -352,7 +352,7 @@ jobs: - name: Validate Kubernetes manifests run: | # Parse manifests locally; kubeval below performs schema validation. - kubectl apply --dry-run=client --validate=false -f deploy/kubernetes/ + kubectl create --dry-run=client --validate=false -f deploy/kubernetes/ - name: Install kubeval run: | From 1b2411b44f61a4f2e2b1088da77dd36e757316cd Mon Sep 17 00:00:00 2001 From: Nick Ruest <127058086+nicholas-ruest@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:11:19 -0400 Subject: [PATCH 4/5] ci: pin offline Kubernetes schema validation --- .github/workflows/ci.yml | 13 ++++--------- docs/metaharness/2026-10-09-cors-supply-chain.md | 4 ++-- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 124a167..7faf7da 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -346,17 +346,12 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup kubectl - uses: azure/setup-kubectl@v3 - - - name: Validate Kubernetes manifests - run: | - # Parse manifests locally; kubeval below performs schema validation. - kubectl create --dry-run=client --validate=false -f deploy/kubernetes/ - - name: Install kubeval run: | - wget https://github.com/instrumenta/kubeval/releases/latest/download/kubeval-linux-amd64.tar.gz + set -euo pipefail + wget https://github.com/instrumenta/kubeval/releases/download/v0.16.1/kubeval-linux-amd64.tar.gz + wget https://github.com/instrumenta/kubeval/releases/download/v0.16.1/checksums.txt + grep 'kubeval-linux-amd64.tar.gz$' checksums.txt | sha256sum -c - tar xf kubeval-linux-amd64.tar.gz sudo mv kubeval /usr/local/bin diff --git a/docs/metaharness/2026-10-09-cors-supply-chain.md b/docs/metaharness/2026-10-09-cors-supply-chain.md index 18c17f1..a9d0606 100644 --- a/docs/metaharness/2026-10-09-cors-supply-chain.md +++ b/docs/metaharness/2026-10-09-cors-supply-chain.md @@ -61,8 +61,8 @@ its modules. The remaining production tree passes `npm ls --all --omit=dev`. Rust 1.88 toolchain while preserving Rust 1.83 as the project MSRV; pins `cargo-tarpaulin@0.31.3` and `protoc@25.1`; updates cache/artifact actions to v4; prevents matrix fail-fast cancellation; adds the - missing Node test/audit job; and keeps local kubectl parsing followed by kubeval - schema validation. + missing Node test/audit job; and pins checksum-verified `kubeval@0.16.1` for + offline Kubernetes schema validation. - Applies Rust 1.83 formatting and machine-applicable Clippy fixes. One real serialization defect was exposed and fixed by emitting `SignalPayload` variant tags in snake case, matching the existing contract test. From 8c8d01c419cd0df3006601a83c8846f3ebff40d8 Mon Sep 17 00:00:00 2001 From: Nick Ruest <127058086+nicholas-ruest@users.noreply.github.com> Date: Fri, 9 Oct 2026 15:15:08 -0400 Subject: [PATCH 5/5] ci: pin Kubernetes schema source --- .github/workflows/ci.yml | 11 ++++++++++- docs/metaharness/2026-10-09-cors-supply-chain.md | 6 ++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7faf7da..8d91b40 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -356,7 +356,16 @@ jobs: sudo mv kubeval /usr/local/bin - name: Validate with kubeval - run: kubeval deploy/kubernetes/*.yaml + run: | + # Pin both the Kubernetes version and the immutable upstream schema tree. + # Custom resources are listed explicitly because their CRD schemas are + # not vendored in this repository; all 18 built-in resources are strict. + kubeval \ + --strict \ + --kubernetes-version 1.30.0 \ + --schema-location https://raw.githubusercontent.com/yannh/kubernetes-json-schema/5f1fa4f7908afc9b6641c62d282a4a22437626e1 \ + --skip-kinds VerticalPodAutoscaler,ScaledObject,ManagedCertificate,BackendConfig,VirtualService,Gateway \ + deploy/kubernetes/*.yaml # ---------------------------------------------------------------------------- # Notification diff --git a/docs/metaharness/2026-10-09-cors-supply-chain.md b/docs/metaharness/2026-10-09-cors-supply-chain.md index a9d0606..174aae9 100644 --- a/docs/metaharness/2026-10-09-cors-supply-chain.md +++ b/docs/metaharness/2026-10-09-cors-supply-chain.md @@ -61,8 +61,10 @@ its modules. The remaining production tree passes `npm ls --all --omit=dev`. Rust 1.88 toolchain while preserving Rust 1.83 as the project MSRV; pins `cargo-tarpaulin@0.31.3` and `protoc@25.1`; updates cache/artifact actions to v4; prevents matrix fail-fast cancellation; adds the - missing Node test/audit job; and pins checksum-verified `kubeval@0.16.1` for - offline Kubernetes schema validation. + missing Node test/audit job; and pins checksum-verified `kubeval@0.16.1`, + Kubernetes 1.30, and the immutable upstream schema tree at `5f1fa4f`. + Strict validation passes for all 18 built-in resources; six explicitly listed + custom resources remain warnings because their CRD schemas are not vendored. - Applies Rust 1.83 formatting and machine-applicable Clippy fixes. One real serialization defect was exposed and fixed by emitting `SignalPayload` variant tags in snake case, matching the existing contract test.