From 6176988c1ea387cf42116d21bafe52f7c8c73439 Mon Sep 17 00:00:00 2001 From: dtice25 Date: Mon, 16 Mar 2026 10:34:26 -0500 Subject: [PATCH 1/4] removes top/bottom 5% of results, removes min/max from scoring calculation --- METHODOLOGY.md | 10 +++++----- README.md | 2 +- src/benchmark.ts | 31 +++++++++++++++++++++---------- src/scoring.ts | 14 ++++---------- 4 files changed, 31 insertions(+), 26 deletions(-) diff --git a/METHODOLOGY.md b/METHODOLOGY.md index 4de5ca8..f7e04f8 100644 --- a/METHODOLOGY.md +++ b/METHODOLOGY.md @@ -204,15 +204,15 @@ A 200ms median scores 98. A 4,000ms median scores 60. Anything at or above 10s s The **timingScore** is a weighted sum of individual metric scores. The **successRate** (0–1) acts as a linear multiplier — a provider with 50% success has its score halved. +Before computing timing statistics, the bottom 5% and top 5% of successful iteration times are trimmed to reduce the influence of outliers caused by transient network issues or cold-start anomalies. Min and max values are still computed from the full dataset for display purposes but are not used in scoring. + **Timing weights** (sum to 1.0): | Metric | Weight | Rationale | |--------|--------|-----------| -| Median | 0.50 | Primary signal — typical developer experience | -| P95 | 0.20 | Tail latency — consistency matters | -| Max | 0.15 | Worst-case exposure | -| P99 | 0.10 | Extreme tail | -| Min | 0.05 | Best-case capability | +| Median | 0.60 | Primary signal — typical developer experience | +| P95 | 0.25 | Tail latency — consistency matters | +| P99 | 0.15 | Extreme tail — worst-case exposure | **Why multiplicative?** A provider with lower than 100% success rate shouldn't rank above a provider with 100% success and a slightly slower median. The multiplicative penalty ensures reliability is non-negotiable — a provider must be both fast *and* reliable to score well. diff --git a/README.md b/README.md index 321abd4..0483c3b 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ For each provider we report min, max, median, P95, P99, and average TTI, plus a ### Composite Score -Each timing metric is scored against a fixed 10-second ceiling: `score = 100 × (1 − value / 10,000ms)`. A 200ms median scores 98; anything ≥10s scores 0. These individual scores are combined with weighted emphasis on median (50%), P95 (20%), max (15%), P99 (10%), and min (5%), then multiplied by the provider's success rate (0–1). A provider with 90% success has its score reduced by 10% — reliability is non-negotiable. +Before computing timing statistics, the bottom 5% and top 5% of successful iterations are trimmed to reduce outlier influence from transient network issues or cold-start anomalies. Each timing metric is then scored against a fixed 10-second ceiling: `score = 100 × (1 − value / 10,000ms)`. A 200ms median scores 98; anything ≥10s scores 0. These individual scores are combined with weighted emphasis on median (60%), P95 (25%), and P99 (15%), then multiplied by the provider's success rate (0–1). A provider with 90% success has its score reduced by 10% — reliability is non-negotiable. All tests run on GitHub Actions at 00:00 UTC daily. Providers are tested using ComputeSDK — no gateway or proxy layer. diff --git a/src/benchmark.ts b/src/benchmark.ts index a9b2cc5..b8be6b9 100644 --- a/src/benchmark.ts +++ b/src/benchmark.ts @@ -5,22 +5,33 @@ export function percentile(sorted: number[], p: number): number { return sorted[Math.min(idx, sorted.length - 1)]; } -export function computeStats(values: number[]): Stats { +export function computeStats(values: number[], trimPercent: number = 0.05): Stats { if (values.length === 0) return { min: 0, max: 0, median: 0, p95: 0, p99: 0, avg: 0 }; const sorted = [...values].sort((a, b) => a - b); - const mid = Math.floor(sorted.length / 2); - const median = sorted.length % 2 === 0 - ? (sorted[mid - 1] + sorted[mid]) / 2 - : sorted[mid]; + + // min/max from the full dataset (used for display, not scoring) + const min = sorted[0]; + const max = sorted[sorted.length - 1]; + + // Trim outliers from both ends for statistical measures + const trimCount = Math.floor(sorted.length * trimPercent); + const trimmed = trimCount > 0 && sorted.length - 2 * trimCount > 0 + ? sorted.slice(trimCount, sorted.length - trimCount) + : sorted; + + const mid = Math.floor(trimmed.length / 2); + const median = trimmed.length % 2 === 0 + ? (trimmed[mid - 1] + trimmed[mid]) / 2 + : trimmed[mid]; return { - min: sorted[0], - max: sorted[sorted.length - 1], + min, + max, median, - p95: percentile(sorted, 95), - p99: percentile(sorted, 99), - avg: values.reduce((a, b) => a + b, 0) / values.length, + p95: percentile(trimmed, 95), + p99: percentile(trimmed, 99), + avg: trimmed.reduce((a, b) => a + b, 0) / trimmed.length, }; } diff --git a/src/scoring.ts b/src/scoring.ts index 32b2e1a..f5e6c11 100644 --- a/src/scoring.ts +++ b/src/scoring.ts @@ -8,16 +8,12 @@ export interface ScoringWeights { median: number; p95: number; p99: number; - min: number; - max: number; } export const DEFAULT_WEIGHTS: ScoringWeights = { - median: 0.50, - p95: 0.20, - p99: 0.10, - min: 0.05, - max: 0.15, + median: 0.60, + p95: 0.25, + p99: 0.15, }; /** Absolute ceiling in ms. Anything at or above this scores 0. */ @@ -51,9 +47,7 @@ function computeTimingScore( return ( weights.median * scoreMetric(stats.median) + weights.p95 * scoreMetric(stats.p95) + - weights.p99 * scoreMetric(stats.p99) + - weights.min * scoreMetric(stats.min) + - weights.max * scoreMetric(stats.max) + weights.p99 * scoreMetric(stats.p99) ); } From 54b3d4c9e1e4b2c7bca61a0a71c402932c74068b Mon Sep 17 00:00:00 2001 From: dtice25 Date: Mon, 16 Mar 2026 10:36:12 -0500 Subject: [PATCH 2/4] truncates results to date timestamp for deduplication on reruns --- src/merge-results.ts | 2 +- src/run.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/merge-results.ts b/src/merge-results.ts index d61e81e..9ad87da 100644 --- a/src/merge-results.ts +++ b/src/merge-results.ts @@ -123,7 +123,7 @@ async function main() { printResultsTable(deduped); // Write combined results - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + const timestamp = new Date().toISOString().slice(0, 10); const subDir = modeToDir(mode); const resultsDir = path.resolve(ROOT, `results/${subDir}`); fs.mkdirSync(resultsDir, { recursive: true }); diff --git a/src/run.ts b/src/run.ts index 90035af..82a8c60 100644 --- a/src/run.ts +++ b/src/run.ts @@ -92,7 +92,7 @@ async function runMode(mode: BenchmarkMode, toRun: typeof providers): Promise Date: Mon, 16 Mar 2026 10:52:36 -0500 Subject: [PATCH 3/4] removes min/max/avg --- METHODOLOGY.md | 8 +- package-lock.json | 243 +++++++++++-------------------------------- package.json | 2 +- src/benchmark.ts | 15 +-- src/concurrent.ts | 4 +- src/generate-svg.ts | 14 +-- src/staggered.ts | 4 +- src/table.ts | 15 +-- src/types.ts | 3 - src/update-readme.ts | 6 +- 10 files changed, 77 insertions(+), 237 deletions(-) diff --git a/METHODOLOGY.md b/METHODOLOGY.md index f7e04f8..b82a454 100644 --- a/METHODOLOGY.md +++ b/METHODOLOGY.md @@ -178,12 +178,9 @@ For each provider, we report: | Metric | Description | |--------|-------------| -| **Min** | Fastest iteration (best case) | -| **Max** | Slowest iteration (worst case) | | **Median** | Middle value (typical case) | | **P95** | 95th percentile (tail latency) | | **P99** | 99th percentile (extreme tail) | -| **Average** | Arithmetic mean | | **Success Rate** | Iterations completed without error | We emphasize **median** as the primary metric because it's robust to outliers and represents the typical developer experience. @@ -283,12 +280,9 @@ Each test mode generates its own SVG visualization: `sequential_tti.svg`, `stagg ], "summary": { "ttiMs": { - "min": 100.0, - "max": 150.0, "median": 125.0, "p95": 140.0, - "p99": 148.0, - "avg": 124.5 + "p99": 148.0 } }, "compositeScore": 96.85, diff --git a/package-lock.json b/package-lock.json index 78fa84a..5c7eb80 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "@computesdk/modal": "^1.8.29", "@computesdk/namespace": "^1.5.0", "@computesdk/runloop": "^1.3.36", - "@computesdk/sprites": "^0.1.0", + "@computesdk/sprites": "^0.1.1", "@computesdk/vercel": "^1.7.13", "computesdk": "^2.2.1", "dotenv": "^17.2.1" @@ -34,7 +34,6 @@ "resolved": "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.2.5.tgz", "integrity": "sha512-3NX/MpTdroi0aKz134A6RC2Gb2iXVECN4QaAXnvCIxxIm3C3AVB1mkUe8NaaiyvOpDfsrqWhYtj+Q6a62RrTsw==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -250,6 +249,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.996.0.tgz", "integrity": "sha512-BZsCeq8Sgqbm6xs8VfjyVVwhQZvxDR45P22dcbNNDFaGkkQ/TbJ5KxER19APR9aK+IC7l4KuLxInqeVab2DFfg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -1003,7 +1003,6 @@ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.1.tgz", "integrity": "sha512-k7vvKPbf7J2fZ5klGRD9AeKfUvojuZIQ3BT5u7Jfv+puwXkUBUT5PVyMDfJZpy30CBDXGMgw7fguK/lpOMBvgw==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/Borewit" @@ -1013,7 +1012,8 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.11.0.tgz", "integrity": "sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==", - "license": "(Apache-2.0 AND BSD-3-Clause)" + "license": "(Apache-2.0 AND BSD-3-Clause)", + "peer": true }, "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { "version": "2.2.0", @@ -1331,29 +1331,29 @@ } }, "node_modules/@computesdk/sprites": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@computesdk/sprites/-/sprites-0.1.0.tgz", - "integrity": "sha512-aZbfoEm4b+NLXQ88vPjtf1kmkio1OmeYugXHyCCaNZzqPCSr91bSSGbEKYul04Pw3CW0Da+cDnwvYgeX8G01Sw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@computesdk/sprites/-/sprites-0.1.1.tgz", + "integrity": "sha512-/YYo3saeLf5IKDur/7jQntndgHBmjQpLMVOwqqwH4Kt3t+QTjRHXAfR2hdr+gKhDTWz1jBCF1nS9M5jIxoeP1g==", "license": "MIT", "dependencies": { - "@computesdk/provider": "1.0.29", - "computesdk": "2.4.0" + "@computesdk/provider": "1.0.30", + "computesdk": "2.5.0" } }, "node_modules/@computesdk/sprites/node_modules/@computesdk/provider": { - "version": "1.0.29", - "resolved": "https://registry.npmjs.org/@computesdk/provider/-/provider-1.0.29.tgz", - "integrity": "sha512-F+2sFKDYksas99AsTZMCV8AQUjAQS7GWVo17SHCS2EHKkKC7/DrdYIihM1s0EBWJQsZUjnf7EswF2awR1C08Zw==", + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/@computesdk/provider/-/provider-1.0.30.tgz", + "integrity": "sha512-FQHXN/pYPXzw4O0hkcaJE9wt0yOOVMvdgMaDXb2EMNq106J6wOf+CnmI/G8dxBDvccfamL2Gvt7GY993JZrXuw==", "license": "MIT", "dependencies": { "@computesdk/cmd": "0.4.1", - "computesdk": "2.4.0" + "computesdk": "2.5.0" } }, "node_modules/@computesdk/sprites/node_modules/computesdk": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/computesdk/-/computesdk-2.4.0.tgz", - "integrity": "sha512-CS5jOf1sw6B2MmHvNUU1WYzMgrJ964DC1r+1brUqIopq0HuVBxeHYrgWUotYbrg0OxX30on1zhm25/Z4StyeEg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/computesdk/-/computesdk-2.5.0.tgz", + "integrity": "sha512-HDOSw1D6ogR7wwlBtr5ZZtRFhfNxdPBW1omLaApxDwAvdkBW4PGoIfYyMPX0N1LpaDl5NWwWALMvmtW2p4dafg==", "license": "MIT", "dependencies": { "@computesdk/cmd": "0.4.1" @@ -1376,6 +1376,7 @@ "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-2.0.0-rc.3.tgz", "integrity": "sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==", "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@bufbuild/protobuf": "^2.2.0" } @@ -1930,7 +1931,6 @@ "resolved": "https://registry.npmjs.org/@hey-api/codegen-core/-/codegen-core-0.7.0.tgz", "integrity": "sha512-HglL4B4QwpzocE+c8qDU6XK8zMf8W8Pcv0RpFDYxHuYALWLTnpDUuEsglC7NQ4vC1maoXsBpMbmwpco0N4QviA==", "license": "MIT", - "peer": true, "dependencies": { "@hey-api/types": "0.1.3", "ansi-colors": "4.1.3", @@ -1952,7 +1952,6 @@ "resolved": "https://registry.npmjs.org/@hey-api/json-schema-ref-parser/-/json-schema-ref-parser-1.3.1.tgz", "integrity": "sha512-7atnpUkT8TyUPHYPLk91j/GyaqMuwTEHanLOe50Dlx0EEvNuQqFD52Yjg8x4KU0UFL1mWlyhE+sUE/wAtQ1N2A==", "license": "MIT", - "peer": true, "dependencies": { "@jsdevtools/ono": "7.1.3", "@types/json-schema": "7.0.15", @@ -1998,7 +1997,6 @@ "resolved": "https://registry.npmjs.org/@hey-api/shared/-/shared-0.2.1.tgz", "integrity": "sha512-uWI9047e9OVe3Ss+6vPMnRiixjRcjcBbdgpeq4IQymet3+wsn0+N/4RLDHBz1h57SemaxayPRUA0JOOsuC1qyA==", "license": "MIT", - "peer": true, "dependencies": { "@hey-api/codegen-core": "0.7.0", "@hey-api/json-schema-ref-parser": "1.3.1", @@ -2023,7 +2021,6 @@ "resolved": "https://registry.npmjs.org/@hey-api/types/-/types-0.1.3.tgz", "integrity": "sha512-mZaiPOWH761yD4GjDQvtjS2ZYLu5o5pI1TVSvV/u7cmbybv51/FVtinFBeaE1kFQCKZ8OQpn2ezjLBJrKsGATw==", "license": "MIT", - "peer": true, "peerDependencies": { "typescript": ">=5.5.3" } @@ -2190,15 +2187,13 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@mixmark-io/domino": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==", - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.27.1", @@ -2247,7 +2242,6 @@ "hasInstallScript": true, "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "node-addon-api": "^8.5.0", "prebuild-install": "^7.1.3" @@ -2296,6 +2290,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -2317,6 +2312,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.2.0.tgz", "integrity": "sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==", "license": "Apache-2.0", + "peer": true, "engines": { "node": "^18.19.0 || >=20.6.0" }, @@ -2329,6 +2325,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.2.0.tgz", "integrity": "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, @@ -2644,6 +2641,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.207.0.tgz", "integrity": "sha512-y6eeli9+TLKnznrR8AZlQMSJT7wILpXH+6EYq5Vf/4Ao+huI7EedxQHwRgVUOMLFbe7VFDvHJrX9/f4lcwnJsA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.207.0", "import-in-the-middle": "^2.0.0", @@ -4843,6 +4841,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.2.0.tgz", "integrity": "sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/semantic-conventions": "^1.29.0" @@ -4945,6 +4944,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.1.tgz", "integrity": "sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@opentelemetry/core": "2.5.1", "@opentelemetry/resources": "2.5.1", @@ -5027,6 +5027,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=14" } @@ -6313,7 +6314,6 @@ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz", "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==", "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" @@ -6330,8 +6330,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/connect": { "version": "3.4.38", @@ -6347,8 +6346,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/mysql": { "version": "2.15.26", @@ -6517,6 +6515,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6583,7 +6582,6 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "license": "BSD-3-Clause OR MIT", - "peer": true, "engines": { "node": ">=0.4.2" } @@ -6593,7 +6591,6 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -6603,7 +6600,6 @@ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "license": "MIT", - "peer": true, "dependencies": { "environment": "^1.0.0" }, @@ -6788,8 +6784,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/async": { "version": "3.2.6", @@ -6817,7 +6812,6 @@ "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz", "integrity": "sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg==", "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -6920,7 +6914,6 @@ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -6933,7 +6926,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -6949,7 +6941,6 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7137,7 +7128,6 @@ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "license": "MIT", - "peer": true, "dependencies": { "run-applescript": "^7.0.0" }, @@ -7173,7 +7163,6 @@ "resolved": "https://registry.npmjs.org/c12/-/c12-3.3.3.tgz", "integrity": "sha512-750hTRvgBy5kcMNPdh95Qo+XUBeGo8C7nsKSmedDmaQI+E0r82DwHeM6vBewDe4rGFbnxoa4V9pw+sPh5+Iz8Q==", "license": "MIT", - "peer": true, "dependencies": { "chokidar": "^5.0.0", "confbox": "^0.2.2", @@ -7311,7 +7300,6 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "license": "MIT", - "peer": true, "dependencies": { "readdirp": "^5.0.0" }, @@ -7336,7 +7324,6 @@ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", "license": "MIT", - "peer": true, "dependencies": { "consola": "^3.2.3" } @@ -7352,7 +7339,6 @@ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -7365,7 +7351,6 @@ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "license": "MIT", - "peer": true, "dependencies": { "restore-cursor": "^4.0.0" }, @@ -7408,7 +7393,6 @@ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.1.1.tgz", "integrity": "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==", "license": "MIT", - "peer": true, "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" @@ -7425,7 +7409,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -7438,7 +7421,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" @@ -7455,7 +7437,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", - "peer": true, "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" @@ -7472,7 +7453,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -7555,7 +7535,6 @@ "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "license": "MIT", - "peer": true, "dependencies": { "convert-to-spaces": "^2.0.1" }, @@ -7586,7 +7565,6 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "license": "ISC", - "peer": true, "bin": { "color-support": "bin.js" } @@ -7608,7 +7586,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" } @@ -7689,7 +7666,6 @@ "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", "integrity": "sha512-jpKJjBTretQACTGLNuvnozP1JdP2ZLrjdGdBgk/tz1VfXlUcBhhSZW6vEsuThmeot/yjvSrPQKEgfF3X2Lpi8Q==", "license": "GPL", - "peer": true, "dependencies": { "amdefine": "~1.0.0", "commander": "~2.8.1" @@ -7703,7 +7679,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", "license": "MIT", - "peer": true, "dependencies": { "graceful-readlink": ">= 1.0.0" }, @@ -7724,15 +7699,13 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "license": "MIT", - "peer": true, "engines": { "node": "^14.18.0 || >=16.10.0" } @@ -7764,7 +7737,6 @@ "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -7931,7 +7903,6 @@ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -7948,7 +7919,6 @@ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=4.0.0" } @@ -7967,7 +7937,6 @@ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", "license": "MIT", - "peer": true, "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" @@ -7984,7 +7953,6 @@ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8014,7 +7982,6 @@ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8026,8 +7993,7 @@ "version": "6.1.4", "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -8051,8 +8017,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/detect-libc": { "version": "2.1.2", @@ -8069,7 +8034,6 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -8274,7 +8238,6 @@ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "once": "^1.4.0" } @@ -8284,7 +8247,6 @@ "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8342,7 +8304,6 @@ "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz", "integrity": "sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==", "license": "MIT", - "peer": true, "workspaces": [ "docs", "benchmarks" @@ -8410,7 +8371,6 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8514,7 +8474,6 @@ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", "license": "(MIT OR WTFPL)", "optional": true, - "peer": true, "engines": { "node": ">=6" } @@ -8536,6 +8495,7 @@ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -8596,8 +8556,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -8696,7 +8655,6 @@ "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.3.1.tgz", "integrity": "sha512-SrzXX46I/zsRDjTb82eucsGg0ODq2NpGDp4HcsFKApPy8P8vACjpJRDoGGMfEzhFC0ry61ajd7f72J3603anBA==", "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.4", @@ -8879,8 +8837,7 @@ "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, - "peer": true + "optional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -8991,7 +8948,6 @@ "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", "license": "MIT", - "peer": true, "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", @@ -9009,8 +8965,7 @@ "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, - "peer": true + "optional": true }, "node_modules/gl-matrix": { "version": "2.8.1", @@ -9073,8 +9028,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/has-ansi": { "version": "2.0.0", @@ -9171,6 +9125,7 @@ "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.7.tgz", "integrity": "sha512-jq9l1DM0zVIvsm3lv9Nw9nlJnMNPOcAtsbsgiUhWcFzPE99Gvo6yRTlszSLLYacMeQ6quHD6hMfId8crVHvexw==", "license": "MIT", + "peer": true, "engines": { "node": ">=16.9.0" } @@ -9257,7 +9212,6 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9276,7 +9230,6 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", "license": "ISC", - "peer": true, "engines": { "node": "^20.17.0 || >=22.9.0" } @@ -9286,7 +9239,6 @@ "resolved": "https://registry.npmjs.org/ink/-/ink-6.8.0.tgz", "integrity": "sha512-sbl1RdLOgkO9isK42WCZlJCFN9hb++sX9dsklOvfd1YQ3bQ2AiFu12Q6tFlr0HvEUvzraJntQCCpfEoUe9DSzA==", "license": "MIT", - "peer": true, "dependencies": { "@alcalzone/ansi-tokenize": "^0.2.4", "ansi-escapes": "^7.3.0", @@ -9336,7 +9288,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -9348,15 +9299,13 @@ "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", - "peer": true + "license": "ISC" }, "node_modules/ink/node_modules/string-width": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", - "peer": true, "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" @@ -9373,7 +9322,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -9451,7 +9399,6 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "license": "MIT", - "peer": true, "bin": { "is-docker": "cli.js" }, @@ -9476,7 +9423,6 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "license": "MIT", - "peer": true, "dependencies": { "get-east-asian-width": "^1.3.1" }, @@ -9523,7 +9469,6 @@ "resolved": "https://registry.npmjs.org/is-in-ci/-/is-in-ci-2.0.0.tgz", "integrity": "sha512-cFeerHriAnhrQSbpAxL37W1wcJKUUX07HyLWZCW1URJT/ra3GyUTzBgUnh24TMVfNTV2Hij2HLxkPHFZfOZy5w==", "license": "MIT", - "peer": true, "bin": { "is-in-ci": "cli.js" }, @@ -9539,7 +9484,6 @@ "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -9552,7 +9496,6 @@ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", - "peer": true, "dependencies": { "is-docker": "^3.0.0" }, @@ -9655,7 +9598,6 @@ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", "license": "MIT", - "peer": true, "dependencies": { "is-inside-container": "^1.0.0" }, @@ -9719,7 +9661,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "license": "MIT", - "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -9738,7 +9679,6 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -9769,7 +9709,6 @@ "resolved": "https://registry.npmjs.org/just-bash/-/just-bash-2.12.6.tgz", "integrity": "sha512-VZcGKO7Q8TjOpuuNvCcQlJkScQMWFevHrbKmXhLtCkA+WlR/TjKDUJAgujRe3tTI0SN8Uc83uaa1ywMrDx9CJA==", "license": "Apache-2.0", - "peer": true, "dependencies": { "compressjs": "^1.0.3", "diff": "^8.0.2", @@ -9800,7 +9739,6 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "brace-expansion": "^5.0.2" }, @@ -9935,6 +9873,7 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "license": "MIT", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -10073,7 +10012,6 @@ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -10096,7 +10034,6 @@ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=10" }, @@ -10125,7 +10062,6 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "license": "MIT", "optional": true, - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10156,8 +10092,7 @@ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/modal": { "version": "0.6.3", @@ -10178,7 +10113,6 @@ "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.5.tgz", "integrity": "sha512-YTefgdpKKFgoTDbEUqXqgUJct2OG6/4hs4XWLsxcHkDLj/x/V8WmKIRppPnXP5feQ7d1vuYWSp3qKkxfwaFaxA==", "license": "MIT", - "peer": true, "engines": { "node": ">=18.0.0" } @@ -10200,8 +10134,7 @@ "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, - "peer": true + "optional": true }, "node_modules/negotiator": { "version": "1.0.0", @@ -10238,7 +10171,6 @@ "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -10252,7 +10184,6 @@ "integrity": "sha512-gBVjCaqDlRUk0EwoPNKzIr9KkS9041G/q31IBShPs1Xz6UTA+EXdZADbzqAJQrpDRq71CIMnOP5VMut3SL0z5Q==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": "^18 || ^20 || >= 21" } @@ -10310,8 +10241,7 @@ "version": "1.6.7", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-gyp-build": { "version": "4.8.4", @@ -10347,7 +10277,6 @@ "hasInstallScript": true, "license": "LGPL-3.0", "optional": true, - "peer": true, "dependencies": { "node-addon-api": "^8.5.0", "node-gyp-build": "^4.8.4" @@ -10389,7 +10318,6 @@ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.5.tgz", "integrity": "sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==", "license": "MIT", - "peer": true, "dependencies": { "citty": "^0.2.0", "pathe": "^2.0.3", @@ -10406,8 +10334,7 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/citty/-/citty-0.2.1.tgz", "integrity": "sha512-kEV95lFBhQgtogAPlQfJJ0WGVSokvLr/UEoFPiKKOXF7pl98HfUVUD0ejsuTCld/9xH9vogSywZ5KqHzXrZpqg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/object-assign": { "version": "4.1.1", @@ -10434,8 +10361,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/on-finished": { "version": "2.4.1", @@ -10463,7 +10389,6 @@ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "license": "MIT", - "peer": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -10479,7 +10404,6 @@ "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", "license": "MIT", - "peer": true, "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", @@ -10669,8 +10593,7 @@ "version": "5.5.3", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/parse-passwd": { "version": "1.0.0", @@ -10695,7 +10618,6 @@ "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz", "integrity": "sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==", "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -10777,8 +10699,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-2.1.0.tgz", "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/pg-int8": { "version": "1.0.1", @@ -10866,7 +10787,6 @@ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", "license": "MIT", - "peer": true, "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", @@ -10941,7 +10861,6 @@ "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -10956,7 +10875,6 @@ "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -11042,7 +10960,6 @@ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -11113,7 +11030,6 @@ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", "optional": true, - "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11129,15 +11045,13 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", "license": "MIT", - "peer": true, "dependencies": { "defu": "^6.1.4", "destr": "^2.0.3" @@ -11147,8 +11061,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/re2js/-/re2js-1.2.2.tgz", "integrity": "sha512-xvy4uuynAZWg9SuHbg0lgQncOuK6wssLmbHs8L8+YRbWLKY8Pe1avaHjNaFLOjErq8Oh0HvwQRWqIOCRL7uDDw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react": { "version": "19.2.4", @@ -11165,7 +11078,6 @@ "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.33.0.tgz", "integrity": "sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==", "license": "MIT", - "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -11229,7 +11141,6 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "license": "MIT", - "peer": true, "engines": { "node": ">= 20.19.0" }, @@ -11320,7 +11231,6 @@ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "license": "MIT", - "peer": true, "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -11336,8 +11246,7 @@ "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", - "peer": true + "license": "ISC" }, "node_modules/retry": { "version": "0.13.1", @@ -11379,7 +11288,6 @@ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -11466,8 +11374,7 @@ "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/semver": { "version": "7.7.3", @@ -11692,8 +11599,7 @@ } ], "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/simple-get": { "version": "4.0.1", @@ -11715,7 +11621,6 @@ ], "license": "MIT", "optional": true, - "peer": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -11727,7 +11632,6 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" @@ -11770,22 +11674,19 @@ "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", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/sql.js": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.14.1.tgz", "integrity": "sha512-gcj8zBWU5cFsi9WUP+4bFNXAyF1iRpA3LLyS/DP5xlrNzGmPIizUeBggKa8DbDwdqaKwUcTEnChtd2grWo/x/A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "license": "MIT", - "peer": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -12001,7 +11902,6 @@ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -12023,7 +11923,6 @@ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.4.tgz", "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", "license": "MIT", - "peer": true, "dependencies": { "@tokenizer/token": "^0.3.0" }, @@ -12078,7 +11977,6 @@ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", "license": "MIT", - "peer": true, "engines": { "node": ">=20" }, @@ -12108,7 +12006,6 @@ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -12121,8 +12018,7 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "license": "ISC", - "optional": true, - "peer": true + "optional": true }, "node_modules/tar-fs/node_modules/readable-stream": { "version": "3.6.2", @@ -12130,7 +12026,6 @@ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12146,7 +12041,6 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -12157,7 +12051,6 @@ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "license": "MIT", "optional": true, - "peer": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -12190,7 +12083,6 @@ "resolved": "https://registry.npmjs.org/terminal-size/-/terminal-size-4.0.1.tgz", "integrity": "sha512-avMLDQpUI9I5XFrklECw1ZEUPJhqzcwSWsyyI8blhRLT+8N1jLJWLWWYQpB2q2xthq8xDvjZPISVh53T/+CLYQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -12212,7 +12104,6 @@ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -12243,7 +12134,6 @@ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz", "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==", "license": "MIT", - "peer": true, "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", @@ -12307,7 +12197,6 @@ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "license": "Apache-2.0", "optional": true, - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -12320,7 +12209,6 @@ "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.2.tgz", "integrity": "sha512-1F7db8BiExOKxjSMU2b7if62D/XOyQyZbPKq/nUwopfgnHlqXHqQ0lvfUTeUIr1lZJzOPFn43dODyMSIfvWRKQ==", "license": "MIT", - "peer": true, "dependencies": { "@mixmark-io/domino": "^2.2.0" } @@ -12330,7 +12218,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.4.tgz", "integrity": "sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==", "license": "(MIT OR CC0-1.0)", - "peer": true, "dependencies": { "tagged-tag": "^1.0.0" }, @@ -12373,7 +12260,6 @@ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz", "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -12547,7 +12433,6 @@ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-6.0.0.tgz", "integrity": "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA==", "license": "MIT", - "peer": true, "dependencies": { "string-width": "^8.1.0" }, @@ -12563,7 +12448,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12576,7 +12460,6 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.0.tgz", "integrity": "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw==", "license": "MIT", - "peer": true, "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" @@ -12593,7 +12476,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12618,7 +12500,6 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", @@ -12690,7 +12571,6 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -12702,15 +12582,13 @@ "version": "10.6.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/wrap-ansi/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", - "peer": true, "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", @@ -12728,7 +12606,6 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -12750,6 +12627,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -12771,7 +12649,6 @@ "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", "license": "MIT", - "peer": true, "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" @@ -12912,8 +12789,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/yoga-layout/-/yoga-layout-3.2.1.tgz", "integrity": "sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/zip-stream": { "version": "6.0.1", @@ -12983,6 +12859,7 @@ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index a689fc1..7a649d4 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@computesdk/modal": "^1.8.29", "@computesdk/namespace": "^1.5.0", "@computesdk/runloop": "^1.3.36", - "@computesdk/sprites": "^0.1.0", + "@computesdk/sprites": "^0.1.1", "@computesdk/vercel": "^1.7.13", "computesdk": "^2.2.1", "dotenv": "^17.2.1" diff --git a/src/benchmark.ts b/src/benchmark.ts index b8be6b9..3418d01 100644 --- a/src/benchmark.ts +++ b/src/benchmark.ts @@ -6,15 +6,11 @@ export function percentile(sorted: number[], p: number): number { } export function computeStats(values: number[], trimPercent: number = 0.05): Stats { - if (values.length === 0) return { min: 0, max: 0, median: 0, p95: 0, p99: 0, avg: 0 }; + if (values.length === 0) return { median: 0, p95: 0, p99: 0 }; const sorted = [...values].sort((a, b) => a - b); - // min/max from the full dataset (used for display, not scoring) - const min = sorted[0]; - const max = sorted[sorted.length - 1]; - - // Trim outliers from both ends for statistical measures + // Trim outliers from both ends const trimCount = Math.floor(sorted.length * trimPercent); const trimmed = trimCount > 0 && sorted.length - 2 * trimCount > 0 ? sorted.slice(trimCount, sorted.length - trimCount) @@ -26,12 +22,9 @@ export function computeStats(values: number[], trimPercent: number = 0.05): Stat : trimmed[mid]; return { - min, - max, median, p95: percentile(trimmed, 95), p99: percentile(trimmed, 99), - avg: trimmed.reduce((a, b) => a + b, 0) / trimmed.length, }; } @@ -44,7 +37,7 @@ export async function runBenchmark(config: ProviderConfig): PromiseProvider Score Median TTI - Min - Max P95 P99 Status @@ -272,8 +268,6 @@ ${sponsorImage ? ` ${formatProviderName(r.provider)} ${score} ${formatSeconds(medianMs)} - ${formatSeconds(r.summary.ttiMs.min)} - ${formatSeconds(r.summary.ttiMs.max)} ${formatSeconds(r.summary.ttiMs.p95)} ${formatSeconds(r.summary.ttiMs.p99)} ${ok}/${total} diff --git a/src/staggered.ts b/src/staggered.ts index d54f67b..0186aea 100644 --- a/src/staggered.ts +++ b/src/staggered.ts @@ -18,7 +18,7 @@ export async function runStaggeredBenchmark(config: StaggeredConfig): Promise a.launchedAt - b.launchedAt), diff --git a/src/table.ts b/src/table.ts index efdd750..b251db4 100644 --- a/src/table.ts +++ b/src/table.ts @@ -20,8 +20,6 @@ export function printResultsTable(results: BenchmarkResult[]): void { pad('Provider', nameWidth), pad('Score', 8), pad('Median (s)', colWidth), - pad('Min (s)', colWidth), - pad('Max (s)', colWidth), pad('P95 (s)', colWidth), pad('P99 (s)', colWidth), pad('Status', 10), @@ -33,8 +31,6 @@ export function printResultsTable(results: BenchmarkResult[]): void { '-'.repeat(colWidth), '-'.repeat(colWidth), '-'.repeat(colWidth), - '-'.repeat(colWidth), - '-'.repeat(colWidth), '-'.repeat(10), ].join('-+-'); @@ -61,13 +57,11 @@ export function printResultsTable(results: BenchmarkResult[]): void { pad('--', colWidth), pad('--', colWidth), pad('--', colWidth), - pad('--', colWidth), - pad('--', colWidth), pad(`FAILED`, 10), ].join(' | ')); continue; } - + // Truly skipped (missing env vars, etc.) if (result.skipped) { console.log([ @@ -76,8 +70,6 @@ export function printResultsTable(results: BenchmarkResult[]): void { pad('--', colWidth), pad('--', colWidth), pad('--', colWidth), - pad('--', colWidth), - pad('--', colWidth), pad('SKIPPED', 10), ].join(' | ')); continue; @@ -90,8 +82,6 @@ export function printResultsTable(results: BenchmarkResult[]): void { pad(result.provider, nameWidth), pad(score, 8), pad(formatSeconds(result.summary.ttiMs.median), colWidth), - pad(formatSeconds(result.summary.ttiMs.min), colWidth), - pad(formatSeconds(result.summary.ttiMs.max), colWidth), pad(formatSeconds(result.summary.ttiMs.p95), colWidth), pad(formatSeconds(result.summary.ttiMs.p99), colWidth), pad(`${successful}/${total} OK`, 10), @@ -169,12 +159,9 @@ export async function writeResultsJson(results: BenchmarkResult[], outPath: stri })), summary: { ttiMs: { - min: round(r.summary.ttiMs.min), - max: round(r.summary.ttiMs.max), median: round(r.summary.ttiMs.median), p95: round(r.summary.ttiMs.p95), p99: round(r.summary.ttiMs.p99), - avg: round(r.summary.ttiMs.avg), }, }, ...(r.compositeScore !== undefined ? { compositeScore: round(r.compositeScore) } : {}), diff --git a/src/types.ts b/src/types.ts index 77dc570..56e695b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -21,12 +21,9 @@ export interface TimingResult { } export interface Stats { - min: number; - max: number; median: number; p95: number; p99: number; - avg: number; } export type BenchmarkMode = 'sequential' | 'staggered' | 'burst' | 'concurrent'; diff --git a/src/update-readme.ts b/src/update-readme.ts index cc7cd32..4639002 100644 --- a/src/update-readme.ts +++ b/src/update-readme.ts @@ -57,8 +57,6 @@ function buildTable(results: BenchmarkResult[]): string { lines.push('Provider'); lines.push('Score'); lines.push('Median TTI'); - lines.push('Min'); - lines.push('Max'); lines.push('P95'); lines.push('P99'); lines.push('Status'); @@ -68,13 +66,13 @@ function buildTable(results: BenchmarkResult[]): string { for (const r of sorted) { if (r.skipped) { - lines.push(`${capitalize(r.provider)}------------Skipped`); + lines.push(`${capitalize(r.provider)}--------Skipped`); } else { const ok = r.iterations.filter(i => !i.error).length; const total = r.iterations.length; const score = r.compositeScore !== undefined ? r.compositeScore.toFixed(1) : '--'; lines.push( - `${capitalize(r.provider)}${score}${formatSeconds(r.summary.ttiMs.median)}${formatSeconds(r.summary.ttiMs.min)}${formatSeconds(r.summary.ttiMs.max)}${formatSeconds(r.summary.ttiMs.p95)}${formatSeconds(r.summary.ttiMs.p99)}${ok}/${total}` + `${capitalize(r.provider)}${score}${formatSeconds(r.summary.ttiMs.median)}${formatSeconds(r.summary.ttiMs.p95)}${formatSeconds(r.summary.ttiMs.p99)}${ok}/${total}` ); } } From d5d4d5a993528466889a7472dd7b5cfebf1b8436 Mon Sep 17 00:00:00 2001 From: dtice25 Date: Mon, 16 Mar 2026 11:03:58 -0500 Subject: [PATCH 4/4] update methodology with new command --- METHODOLOGY.md | 6 +++--- README.md | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/METHODOLOGY.md b/METHODOLOGY.md index b82a454..9601bdc 100644 --- a/METHODOLOGY.md +++ b/METHODOLOGY.md @@ -51,7 +51,7 @@ const start = performance.now(); const sandbox = await compute.sandbox.create(); // 3. Execute a trivial command to confirm interactivity -await sandbox.runCommand('echo "benchmark"'); +await sandbox.runCommand('node -v'); // 4. Stop timer const ttiMs = performance.now() - start; @@ -60,13 +60,13 @@ const ttiMs = performance.now() - start; await sandbox.destroy(); ``` -### Why `echo "benchmark"`? +### Why `node -v`? We use a minimal command to isolate sandbox startup time from command complexity. The command: - Has negligible execution time -- Requires no file system access - Produces deterministic output - Validates the full request/response cycle +- Confirms the Node.js runtime is available and functional ## Test Modes diff --git a/README.md b/README.md index 0483c3b..81c8c24 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ API Request → Provisioning → Boot → Ready → First Command └───────────────────── TTI ─────────────────────┘ ``` -Each benchmark creates a fresh sandbox, runs `echo "benchmark"`, and records wall-clock time. 100 iterations per provider, every day, fully automated. +Each benchmark creates a fresh sandbox, runs `node -v`, and records wall-clock time. 100 iterations per provider, every day, fully automated. **Powered by ComputeSDK** — We use [ComputeSDK](https://github.com/computesdk/computesdk), a multi-provider SDK, to test all sandbox providers with the same code. One API, multiple providers, fair comparison. Interested in multi-provider failover, sandbox packing, and warm pooling? [Check out ComputeSDK](https://github.com/computesdk/computesdk). @@ -30,7 +30,7 @@ Each benchmark creates a fresh sandbox, runs `echo "benchmark"`, and records wal ## Methodology -Each benchmark creates a fresh sandbox, runs `echo "benchmark"`, and records wall-clock time. We run three test modes daily: +Each benchmark creates a fresh sandbox, runs `node -v`, and records wall-clock time. We run three test modes daily: **Sequential** — Sandboxes are created one at a time. Each is created, tested, and destroyed before the next begins. 100 iterations per provider. This is the baseline — isolated cold-start performance with no contention.