diff --git a/.agents/skills/react-doctor/SKILL.md b/.agents/skills/react-doctor/SKILL.md new file mode 100644 index 000000000..1c244ff12 --- /dev/null +++ b/.agents/skills/react-doctor/SKILL.md @@ -0,0 +1,46 @@ +--- +name: react-doctor +description: Use when finishing a feature, fixing a bug, before committing React code, or when the user types `/doctor`, asks to scan, triage, or clean up React diagnostics. Covers lint, accessibility, bundle size, architecture. Includes a regression check and a full local-triage workflow that fetches the canonical playbook. +version: "1.1.0" +--- + +# React Doctor + +Scans React codebases for security, performance, correctness, and architecture issues. Outputs a 0–100 health score. + +## After making React code changes: + +Run `npx react-doctor@latest --verbose --diff` and check the score did not regress. + +If the score dropped, fix the regressions before committing. + +## For general cleanup or code improvement: + +Run `npx react-doctor@latest --verbose` (without `--diff`) to scan the full codebase. Fix issues by severity — errors first, then warnings. + +## /doctor — full local triage workflow + +When the user types `/doctor`, says "run react doctor", or asks for a full triage / cleanup pass (not just a regression check), fetch the canonical local-triage playbook and follow every step in it: + +```bash +curl --fail --silent --show-error \ + --header 'Cache-Control: no-cache' \ + https://www.react.doctor/prompts/react-doctor-agent.md +``` + +The playbook is the single source of truth — a scan → filter → triage → fix → validate loop that edits the working tree directly (never commits, never opens PRs). Updating the prompt at its source updates every agent on its next fetch — no skill reinstall needed. + +Pair it with the matching per-rule prompts at `https://www.react.doctor/prompts/rules//.md` (fetched on demand inside the playbook) so each fix uses the canonical, reviewer-tested recipe. + +## Command + +```bash +npx react-doctor@latest --verbose --diff +``` + +| Flag | Purpose | +| ----------- | --------------------------------------------- | +| `.` | Scan current directory | +| `--verbose` | Show affected files and line numbers per rule | +| `--diff` | Only scan changed files vs base branch | +| `--score` | Output only the numeric score | diff --git a/.github/workflows/react-doctor.yml b/.github/workflows/react-doctor.yml new file mode 100644 index 000000000..7542433da --- /dev/null +++ b/.github/workflows/react-doctor.yml @@ -0,0 +1,21 @@ +name: React Doctor + +on: + pull_request: + types: [opened, synchronize, reopened, ready_for_review] + +permissions: + contents: read + pull-requests: write + issues: write + +concurrency: + group: react-doctor-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + react-doctor: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: millionco/react-doctor@main diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755 index cd6734eec..a7a347bbe --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1,38 @@ +#!/bin/sh + +# react-doctor hook start +react_doctor_scan_staged_files() { + if [ -x "./node_modules/.bin/react-doctor" ]; then + "./node_modules/.bin/react-doctor" --staged --fail-on warning + return + fi + + if command -v react-doctor >/dev/null 2>&1; then + react-doctor --staged --fail-on warning + return + fi + + if command -v pnpm >/dev/null 2>&1; then + pnpm dlx react-doctor@latest --staged --fail-on warning + return + fi + + if command -v npx >/dev/null 2>&1; then + npx --yes react-doctor@latest --staged --fail-on warning + return + fi + + printf '%s\n' "react-doctor: command not found; skipping staged scan." +} + +react_doctor_output=$(mktemp "${TMPDIR:-/tmp}/react-doctor-hook.XXXXXX") +if react_doctor_scan_staged_files > "$react_doctor_output" 2>&1; then + rm -f "$react_doctor_output" +else + cat "$react_doctor_output" >&2 + rm -f "$react_doctor_output" + printf '%s\n' "React Doctor found staged regressions." "Run react-doctor --staged --fail-on warning to inspect." "Want them fixed? Ask your agent to run that command and resolve the findings." >&2 + exit 1 +fi +# react-doctor hook end bunx --no-install lint-staged diff --git a/bun.lock b/bun.lock index 382035f2d..a48200d5e 100644 --- a/bun.lock +++ b/bun.lock @@ -16,6 +16,7 @@ "openapi-typescript": "^7.13.0", "oxfmt": "^0.50.0", "oxlint": "^1.65.0", + "react-doctor": "^0.2.14", "shadcn": "^4.7.0", "tailwindcss": "^4.3.0", "turbo": "^2.9.14", @@ -31,7 +32,6 @@ "dependencies": { "@agh/ui": "workspace:*", "@mdx-js/mdx": "^3.1.1", - "@orama/orama": "^3.1.18", "@remotion/player": "^4.0.462", "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", @@ -44,7 +44,6 @@ "next": "^16.2.6", "react": "^19.2.6", "react-dom": "^19.2.6", - "reading-time": "^1.5.0", "rehype-pretty-code": "^0.14.3", "remark": "^15.0.1", "remark-gfm": "^4.0.1", @@ -138,7 +137,6 @@ "name": "agh-web", "dependencies": { "@agh/ui": "workspace:*", - "@ai-sdk/react": "^3.0.187", "@assistant-ui/react": "^0.14.5", "@assistant-ui/react-ai-sdk": "^1.3.26", "@base-ui/react": "^1.4.1", @@ -151,9 +149,6 @@ "@tanstack/react-router": "^1.169.2", "@tanstack/react-virtual": "^3.13.24", "ai": "^6.0.185", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", "date-fns": "^4.2.1", "lucide-react": "^1.16.0", "motion": "^12.39.0", @@ -161,7 +156,6 @@ "react": "^19.2.6", "react-dom": "^19.2.6", "sonner": "^2.0.7", - "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.0", "tw-animate-css": "^1.4.0", "zod": "^4.4.3", @@ -174,8 +168,6 @@ "@storybook/addon-themes": "^10.4.0", "@storybook/react-vite": "^10.4.0", "@tanstack/devtools-vite": "^0.6.0", - "@tanstack/react-query-devtools": "^5.100.10", - "@tanstack/react-router-devtools": "^1.166.13", "@tanstack/router-plugin": "^1.167.35", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", @@ -186,7 +178,6 @@ "jsdom": "^29.1.1", "msw": "^2.14.6", "msw-storybook-addon": "^2", - "prop-types": "^15.8.1", "storybook": "^10.4.0", "vite": "^8.0.13", "vitest": "^4.1.6", @@ -366,6 +357,8 @@ "@ecies/ciphers": ["@ecies/ciphers@0.2.6", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-patgsRPKGkhhoBjETV4XxD0En4ui5fbX0hzayqI3M8tvNMGUoUvmyYAIWwlxBc1KX5cturfqByYdj5bYGRpN9g=="], + "@effect/platform-node-shared": ["@effect/platform-node-shared@4.0.0-beta.70", "", { "dependencies": { "@types/ws": "^8.18.1", "ws": "^8.20.0" }, "peerDependencies": { "effect": "^4.0.0-beta.70" } }, "sha512-3VXuL63IDmq13We+ApRKn2JW3Rb9g5gj1YEmfb8u2b73norur1VsIJ/pRE4qjShevg19dQYi2JsLawSZ6gApug=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], "@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], @@ -424,6 +417,20 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.0", "", { "os": "win32", "cpu": "x64" }, "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], + + "@eslint/config-array": ["@eslint/config-array@0.23.5", "", { "dependencies": { "@eslint/object-schema": "^3.0.5", "debug": "^4.3.1", "minimatch": "^10.2.4" } }, "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.6.0", "", { "dependencies": { "@eslint/core": "^1.2.1" } }, "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA=="], + + "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], + + "@eslint/object-schema": ["@eslint/object-schema@3.0.5", "", {}, "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.7.2", "", { "dependencies": { "@eslint/core": "^1.2.1", "levn": "^0.4.1" } }, "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A=="], + "@exodus/bytes": ["@exodus/bytes@1.15.0", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ=="], "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], @@ -450,6 +457,18 @@ "@hono/node-server": ["@hono/node-server@1.19.12", "", { "peerDependencies": { "hono": "^4" } }, "sha512-txsUW4SQ1iilgE0l9/e9VQWmELXifEFvmdA1j6WFh/aFPj99hIntrSsq/if0UWyGVkmrRPKA1wCeP+UCr1B9Uw=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], + + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], + + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="], + "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], "@iconify/utils": ["@iconify/utils@3.1.0", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "mlly": "^1.8.0" } }, "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw=="], @@ -536,6 +555,18 @@ "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.29.0", "", { "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" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ=="], + "@msgpackr-extract/msgpackr-extract-darwin-arm64": ["@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ=="], + + "@msgpackr-extract/msgpackr-extract-darwin-x64": ["@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm": ["@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4", "", { "os": "linux", "cpu": "arm" }, "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw=="], + + "@msgpackr-extract/msgpackr-extract-linux-arm64": ["@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw=="], + + "@msgpackr-extract/msgpackr-extract-linux-x64": ["@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ=="], + + "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4", "", { "os": "win32", "cpu": "x64" }, "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ=="], + "@mswjs/interceptors": ["@mswjs/interceptors@0.41.3", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], @@ -644,7 +675,7 @@ "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.127.0", "", { "os": "win32", "cpu": "x64" }, "sha512-rOrnSQSCbhI2kowr9XxE7m9a8oQXnBHjnS6j95LxxAnEZ0+Fz20WlRXG4ondQb+ejjt2KOsa65sE6++L6kUd+w=="], - "@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="], + "@oxc-project/types": ["@oxc-project/types@0.132.0", "", {}, "sha512-FESMOxil5Se014ui/Eq8fT5uHJo6nIRwH0PfJrZJXs6Gek3ZVFOrpUv3YIZT20m+extU98Hg1Ym72U58rlsxUQ=="], "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.19.1", "", { "os": "android", "cpu": "arm" }, "sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg=="], @@ -1022,23 +1053,15 @@ "@tanstack/query-core": ["@tanstack/query-core@5.100.10", "", {}, "sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w=="], - "@tanstack/query-devtools": ["@tanstack/query-devtools@5.100.10", "", {}, "sha512-3DmJf25hDPus5IpVvp6ujXv6bKV2zPzI9vpbAmpJigsL/H6DPvPjmf7/Q9yVKEke//8fgeQ45abjgnLuyYxAiw=="], - "@tanstack/react-query": ["@tanstack/react-query@5.100.10", "", { "dependencies": { "@tanstack/query-core": "5.100.10" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-FLaZf2RCrA/Zgp4aiu5tG3TyasTRO7aZ99skxQpr3Hg/zXOhu6yq5FZCYQ/tRaJtM9ylnoK8tFK7PolXQadv6Q=="], - "@tanstack/react-query-devtools": ["@tanstack/react-query-devtools@5.100.10", "", { "dependencies": { "@tanstack/query-devtools": "5.100.10" }, "peerDependencies": { "@tanstack/react-query": "^5.100.10", "react": "^18 || ^19" } }, "sha512-zes0+o9ef5rAZXJ9f/SeaLs2nufJaeVkZkl/Or9NGrWVF41kL9Od9ED9nCwtQlgiF2VGtrzhEw5AU/igAO+aAg=="], - "@tanstack/react-router": ["@tanstack/react-router@1.169.2", "", { "dependencies": { "@tanstack/history": "1.161.6", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.169.2", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-OJM7Kguc7ERnweaNRWsyWgIKcl3z23rD1B4jaxjzd9RGdnzpt2HfrWa9rggbT0Hfzhfo4D2ZmsfoTme035tniQ=="], - "@tanstack/react-router-devtools": ["@tanstack/react-router-devtools@1.166.13", "", { "dependencies": { "@tanstack/router-devtools-core": "1.167.3" }, "peerDependencies": { "@tanstack/react-router": "^1.168.15", "@tanstack/router-core": "^1.168.11", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" }, "optionalPeers": ["@tanstack/router-core"] }, "sha512-6yKRFFJrEEOiGp5RAAuGCYsl81M4XAhJmLcu9PKj+HZle4A3dsP60lwHoqQYWHMK9nKKFkdXR+D8qxzxqtQbEA=="], - "@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.24", "", { "dependencies": { "@tanstack/virtual-core": "3.14.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-aIJvz5OSkhNIhZIpYivrxrPTKYsjW9Uzy+sP/mx0S3sev2HyvPb7xmjbYvokzEpfgYHy/HjzJ2zFAETuUfgCpg=="], - "@tanstack/router-core": ["@tanstack/router-core@1.168.15", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.0", "seroval-plugins": "^1.5.0" }, "bin": { "intent": "bin/intent.js" } }, "sha512-Wr0424NDtD8fT/uALobMZ9DdcfsTyXtW5IPR++7zvW8/7RaIOeaqXpVDId8ywaGtqPWLWOfaUg2zUtYtukoXYA=="], - - "@tanstack/router-devtools-core": ["@tanstack/router-devtools-core@1.167.3", "", { "dependencies": { "clsx": "^2.1.1", "goober": "^2.1.16" }, "peerDependencies": { "@tanstack/router-core": "^1.168.11", "csstype": "^3.0.10" }, "optionalPeers": ["csstype"] }, "sha512-fJ1VMhyQgnoashTrP763c2HRc9kofgF61L7Jb3F6eTHAmCKtGVx8BRtiFt37sr3U0P0jmaaiiSPGP6nT5JtVNg=="], + "@tanstack/router-core": ["@tanstack/router-core@1.169.2", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw=="], "@tanstack/router-generator": ["@tanstack/router-generator@1.166.42", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.169.2", "@tanstack/router-utils": "1.161.8", "@tanstack/virtual-file-routes": "1.161.7", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^3.24.2" } }, "sha512-2qBWC0t78r6b3vI+AbnvCZcFAvbYBDlLuWZrTjQbcjUmwG3qyeQp983tJyDuj9wb5//adG1tgAGXZkJ3aDwdBg=="], @@ -1156,6 +1179,8 @@ "@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="], + "@types/esrecurse": ["@types/esrecurse@4.3.1", "", {}, "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], @@ -1164,6 +1189,8 @@ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], @@ -1190,6 +1217,10 @@ "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="], + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.60.0", "", {}, "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA=="], + "@typescript/native-preview": ["@typescript/native-preview@7.0.0-dev.20260518.1", "", { "optionalDependencies": { "@typescript/native-preview-darwin-arm64": "7.0.0-dev.20260518.1", "@typescript/native-preview-darwin-x64": "7.0.0-dev.20260518.1", "@typescript/native-preview-linux-arm": "7.0.0-dev.20260518.1", "@typescript/native-preview-linux-arm64": "7.0.0-dev.20260518.1", "@typescript/native-preview-linux-x64": "7.0.0-dev.20260518.1", "@typescript/native-preview-win32-arm64": "7.0.0-dev.20260518.1", "@typescript/native-preview-win32-x64": "7.0.0-dev.20260518.1" }, "bin": { "tsgo": "bin/tsgo.js" } }, "sha512-aJq3XQBPkL91U0YWPQ4WUzFpfzLmfwWt5tmtzdXaIiPZisqFVeG/uw+2b4e/uL/YhPAQt9OHG0UEIGLNfoiFwA=="], "@typescript/native-preview-darwin-arm64": ["@typescript/native-preview-darwin-arm64@7.0.0-dev.20260518.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5n6xnR8jsDjrjHkf30hVVzby/cTusPrc0f6S3hQLrTdACC9JejsrHMHV1rRu55gSAIZhhBY0pqvG3/VKB9J0tA=="], @@ -1244,11 +1275,13 @@ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "agent-install": ["agent-install@0.0.5", "", { "dependencies": { "@iarna/toml": "^2.2.5", "commander": "^14.0.0", "jsonc-parser": "^3.3.1", "picocolors": "^1.1.1", "prompts": "^2.4.2", "yaml": "^2.8.3" }, "bin": { "agent-install": "bin/agent-install.mjs" } }, "sha512-nHlms9BkP8ZiY79HrwCGiA2DcNaXrAaJrCM/BEqQ7MEsSKyCk+2A76xPGylIfASZSZE0SaU3T0bNSg4rBPIJAQ=="], + "agh-web": ["agh-web@workspace:web"], "ai": ["ai@6.0.185", "", { "dependencies": { "@ai-sdk/gateway": "3.0.116", "@ai-sdk/provider": "3.0.10", "@ai-sdk/provider-utils": "4.0.27", "@opentelemetry/api": "^1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-oGsqscREaTlo75KHZLtwZxRyI+ZBwHV2wRX9B8smHjgOs13WwoCvUyr5aPUWpIBRz406wmIKy1RzoUEq0/WKJw=="], - "ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], @@ -1284,6 +1317,8 @@ "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + "atomically": ["atomically@2.1.1", "", { "dependencies": { "stubborn-fs": "^2.0.0", "when-exit": "^2.1.4" } }, "sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ=="], + "axe-core": ["axe-core@4.11.2", "", {}, "sha512-byD6KPdvo72y/wj2T/4zGEvvlis+PsZsn/yPS3pEO+sFpcrqRpX/TJCxvVaEsNeMrfQbCr7w163YqoD9IYwHXw=="], "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], @@ -1382,6 +1417,8 @@ "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="], + "conf": ["conf@15.1.0", "", { "dependencies": { "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "atomically": "^2.0.3", "debounce-fn": "^6.0.0", "dot-prop": "^10.0.0", "env-paths": "^3.0.0", "json-schema-typed": "^8.0.1", "semver": "^7.7.2", "uint8array-extras": "^1.5.0" } }, "sha512-Uy5YN9KEu0WWDaZAVJ5FAmZoaJt9rdK6kH+utItPyGsCqCgaTKkrmZx3zoE0/3q6S3bcp3Ihkk+ZqPxWxFK5og=="], + "confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], @@ -1500,6 +1537,8 @@ "dayjs": ["dayjs@1.11.20", "", {}, "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ=="], + "debounce-fn": ["debounce-fn@6.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ=="], + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], @@ -1512,6 +1551,8 @@ "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], @@ -1526,6 +1567,8 @@ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + "deslop-js": ["deslop-js@0.0.13", "", { "dependencies": { "@oxc-project/types": "^0.132.0", "fast-glob": "^3.3.3", "minimatch": "^10.2.5", "oxc-parser": "^0.132.0", "oxc-resolver": "^11.19.1", "typescript": "^6.0.3" } }, "sha512-gIXD+wY2/NHkZHpNrb8MWS6NJs3ee0XunAenBCvwHJlWnedDbIrg70hdNR7bDzYZLe9LGJZMLEI1w2CC72Gk5A=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], @@ -1540,7 +1583,7 @@ "dompurify": ["dompurify@3.4.0", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg=="], - "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], + "dot-prop": ["dot-prop@10.1.0", "", { "dependencies": { "type-fest": "^5.0.0" } }, "sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q=="], "dotenv": ["dotenv@17.4.0", "", {}, "sha512-kCKF62fwtzwYm0IGBNjRUjtJgMfGapII+FslMHIjMR5KTnwEmBmWLDRSnc3XSNP8bNy34tekgQyDT0hr7pERRQ=="], @@ -1550,6 +1593,8 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], + "effect": ["effect@4.0.0-beta.70", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-check": "^4.8.0", "find-my-way-ts": "^0.1.6", "ini": "^7.0.0", "kubernetes-types": "^1.30.0", "msgpackr": "^2.0.1", "multipasta": "^0.2.7", "toml": "^4.1.1", "uuid": "^14.0.0", "yaml": "^2.9.0" } }, "sha512-8AwGTRiNriirHGEYHrOS0E9fzdhIqCdZjiHP1YXmNo2UyPGS43ILsymsSHT7V0DJS+8dvlKq2RxnrDBUhDNZHg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.331", "", {}, "sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q=="], "emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -1562,7 +1607,7 @@ "entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="], - "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], @@ -1588,12 +1633,28 @@ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], - "escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@10.4.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.6.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.2", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.4", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-AyIKhnOBuOAdueD7RB3xB+YeAWScb9jHsJBgH2Hcde8InP5JYhqrRR6iTMHyTEwgENK54Cp44e4v8BwNhsuHuw=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="], + + "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "espree": ["espree@11.2.0", "", { "dependencies": { "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="], + "esrap": ["esrap@2.2.5", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, "peerDependencies": { "@typescript-eslint/types": "^8.2.0" }, "optionalPeers": ["@typescript-eslint/types"] }, "sha512-/yLB1538mag+dn0wsePTe8C0rDIjUOaJpMs2McodSzmM2msWcZsBSdRtg6HOBt0A/r82BN+Md3pgwSc/uWt2Ig=="], + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], @@ -1630,12 +1691,18 @@ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + "fast-check": ["fast-check@4.8.0", "", { "dependencies": { "pure-rand": "^8.0.0" } }, "sha512-GOJ158CUMnN6cSahsv4+ExARvIDuzzinFjkp0E9WtiBa5zcVeLozVkWaE4IzFcc+Y48Wp1EDlUZsXRyAztQcSg=="], + "fast-content-type-parse": ["fast-content-type-parse@3.0.0", "", {}, "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="], "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], @@ -1652,10 +1719,20 @@ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "finalhandler": ["finalhandler@2.1.1", "", { "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" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], + "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.4.2", "", {}, "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA=="], + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], @@ -1706,8 +1783,6 @@ "global-directory": ["global-directory@5.0.0", "", { "dependencies": { "ini": "6.0.0" } }, "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w=="], - "goober": ["goober@2.1.18", "", { "peerDependencies": { "csstype": "^3.0.10" } }, "sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw=="], - "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], @@ -1748,6 +1823,10 @@ "headers-polyfill": ["headers-polyfill@5.0.1", "", { "dependencies": { "@types/set-cookie-parser": "^2.4.10", "set-cookie-parser": "^3.0.1" } }, "sha512-1TJ6Fih/b8h5TIcv+1+Hw0PDQWJTKDKzFZzcKOiW1wJza3XoAQlkCuXLbymPYB8+ZQyw8mHvdw560e8zVFIWyA=="], + "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], + + "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="], + "hono": ["hono@4.12.10", "", {}, "sha512-mx/p18PLy5og9ufies2GOSUqep98Td9q4i/EF6X7yJgAiIopxqdfIO3jbqsi3jRgTgw88jMDEzVKi+V2EF+27w=="], "html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "^1.6.0" } }, "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg=="], @@ -1774,13 +1853,15 @@ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], + "ini": ["ini@7.0.0", "", {}, "sha512-ifK0CgjALofS5bkrcTy4RaQ9Vx2Knf/eLeIO+NaswQEpH1UblrtTSCIvN71qQDMq0PeQ/SSPojvEJp9vvvfr+w=="], "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], @@ -1862,6 +1943,8 @@ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -1870,24 +1953,34 @@ "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-with-bigint": ["json-with-bigint@3.5.8", "", {}, "sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], "katex": ["katex@0.16.45", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA=="], + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="], "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + "kubernetes-types": ["kubernetes-types@1.30.0", "", {}, "sha512-Dew1okvhM/SQcIa2rcgujNndZwU8VnSapDgdxlYoB84ZlpAD43U6KLAFqYo17ykSFGHNPrg0qry0bP+GJd9v7Q=="], + "langium": ["langium@4.2.2", "", { "dependencies": { "@chevrotain/regexp-to-ast": "~12.0.0", "chevrotain": "~12.0.0", "chevrotain-allstar": "~0.4.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", "vscode-uri": "~3.1.0" } }, "sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ=="], "launch-editor": ["launch-editor@2.13.2", "", { "dependencies": { "picocolors": "^1.1.1", "shell-quote": "^1.8.3" } }, "sha512-4VVDnbOpLXy/s8rdRCSXb+zfMeFR0WlJWpET1iA9CQdlZDfwyLjUuGQzXU4VeOoey6AicSAluWan7Etga6Kcmg=="], "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="], + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], @@ -1918,6 +2011,8 @@ "listr2": ["listr2@10.2.1", "", { "dependencies": { "cli-truncate": "^5.2.0", "eventemitter3": "^5.0.4", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^10.0.0" } }, "sha512-7I5knELsJKTUjXG+A6BkKAiGkW1i25fNa/xlUl9hFtk15WbE9jndA89xu5FzQKrY5llajE1hfZZFMILXkDHk/Q=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "lodash-es": ["lodash-es@4.18.1", "", {}, "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A=="], "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], @@ -1926,8 +2021,6 @@ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], - "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="], @@ -2094,14 +2187,22 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + "msgpackr": ["msgpackr@2.0.2", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.4" } }, "sha512-c5hYOXFbP79Slh6Dzd2wzk+jnV7mX1UxfMYtilnY1NmalXPqG8DGb5cYCMBrW4AsH3zekBBZd4QrKz9NhtvYLQ=="], + + "msgpackr-extract": ["msgpackr-extract@3.0.4", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw=="], + "msw": ["msw@2.14.6", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-ALe+N10S72cyx94cMcy3Zs4HhXCj35sgeAL4c+WTvKi0zWnbd8/h0lcFqv0mb2P+aSgAdD7p9HzvA0DiUPxsyg=="], "msw-storybook-addon": ["msw-storybook-addon@2.0.7", "", { "dependencies": { "is-node-process": "^1.0.1" }, "peerDependencies": { "msw": "^2.0.0" } }, "sha512-TGmlxXy2TsaB6QcClVKRxqvay5f93xoLguHOihRFQ+gIEIyiyvcoQjkEeuOe7Y9qvddzGB1LyFomzPo9/EpnuQ=="], + "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], + "mute-stream": ["mute-stream@3.0.0", "", {}, "sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw=="], "nanoid": ["nanoid@5.1.11", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg=="], + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], "next": ["next@16.2.6", "", { "dependencies": { "@next/env": "16.2.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.2.6", "@next/swc-darwin-x64": "16.2.6", "@next/swc-linux-arm64-gnu": "16.2.6", "@next/swc-linux-arm64-musl": "16.2.6", "@next/swc-linux-x64-gnu": "16.2.6", "@next/swc-linux-x64-musl": "16.2.6", "@next/swc-win32-arm64-msvc": "16.2.6", "@next/swc-win32-x64-msvc": "16.2.6", "sharp": "^0.34.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-qOVgKJg1+At15NpeUP+eJgCHvTCgXsogweq87Ri/Ix7PkqQHg4sdaXmSFqKlgaIXE4kW0g25LE68W87UANlHtw=="], @@ -2112,6 +2213,8 @@ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], + "node-releases": ["node-releases@2.0.37", "", {}, "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg=="], "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], @@ -2144,6 +2247,8 @@ "openapi-typescript-helpers": ["openapi-typescript-helpers@0.1.0", "", {}, "sha512-OKTGPthhivLw/fHz6c3OPtg72vi86qaMlqbJuVJ23qOvQ+53uw1n7HdmkJFibloF7QEjDrDkzJiOJuockM/ljw=="], + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="], @@ -2156,6 +2261,12 @@ "oxlint": ["oxlint@1.65.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.65.0", "@oxlint/binding-android-arm64": "1.65.0", "@oxlint/binding-darwin-arm64": "1.65.0", "@oxlint/binding-darwin-x64": "1.65.0", "@oxlint/binding-freebsd-x64": "1.65.0", "@oxlint/binding-linux-arm-gnueabihf": "1.65.0", "@oxlint/binding-linux-arm-musleabihf": "1.65.0", "@oxlint/binding-linux-arm64-gnu": "1.65.0", "@oxlint/binding-linux-arm64-musl": "1.65.0", "@oxlint/binding-linux-ppc64-gnu": "1.65.0", "@oxlint/binding-linux-riscv64-gnu": "1.65.0", "@oxlint/binding-linux-riscv64-musl": "1.65.0", "@oxlint/binding-linux-s390x-gnu": "1.65.0", "@oxlint/binding-linux-x64-gnu": "1.65.0", "@oxlint/binding-linux-x64-musl": "1.65.0", "@oxlint/binding-openharmony-arm64": "1.65.0", "@oxlint/binding-win32-arm64-msvc": "1.65.0", "@oxlint/binding-win32-ia32-msvc": "1.65.0", "@oxlint/binding-win32-x64-msvc": "1.65.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-ChUuE3Q7XnAbscvT4XLMsH7HFJmLgLVv9lu+RRgFL5wSXnDqUOzTp5IS8qWDBGd/ZDSzQ2tbX8fjAmijlGLC7A=="], + "oxlint-plugin-react-doctor": ["oxlint-plugin-react-doctor@0.2.14", "", { "dependencies": { "@typescript-eslint/types": "^8.59.3", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1" } }, "sha512-E3Xb6NFycmmyJlLE7wNLN1kScunwsiHAwf1XCOUSgnSB7sV4dvQbcAVTVoOz2n1yGSPOmcMwBdLPTepVNBZ+OQ=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -2176,6 +2287,8 @@ "path-data-parser": ["path-data-parser@0.1.0", "", {}, "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -2212,6 +2325,8 @@ "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], @@ -2220,14 +2335,14 @@ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="], - "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], - "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "pure-rand": ["pure-rand@8.4.0", "", {}, "sha512-IoM8YF/jY0hiugFo/wOWqfmarlE6J0wc6fDK1PhftMk7MGhVZl88sZimmqBBFomLOCSmcCCpsfj7wXASCpvK9A=="], + "qs": ["qs@6.15.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ=="], "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], @@ -2244,6 +2359,8 @@ "react-docgen-typescript": ["react-docgen-typescript@2.4.0", "", { "peerDependencies": { "typescript": ">= 4.3.x" } }, "sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg=="], + "react-doctor": ["react-doctor@0.2.14", "", { "dependencies": { "@effect/platform-node-shared": "4.0.0-beta.70", "agent-install": "0.0.5", "conf": "^15.1.0", "deslop-js": "^0.0.13", "effect": "4.0.0-beta.70", "eslint-plugin-react-hooks": "^7.1.1", "oxlint": "^1.66.0", "oxlint-plugin-react-doctor": "0.2.14", "prompts": "^2.4.2", "typescript": ">=5.0.4 <7" }, "bin": { "react-doctor": "bin/react-doctor.js" } }, "sha512-IsdCwvd9SFCnsvcS5mKzhEA2FauW0xc2yZlrHCjfRzUEleXeDzKXRhhLXXxg9cZHzjBQl49Rkqo/+t3XwPDR4A=="], + "react-dom": ["react-dom@19.2.6", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.6" } }, "sha512-0prMI+hvBbPjsWnxDLxlCGyM8PN6UuWjEUCYmZhO67xIV9Xasa/r/vDnq+Xyq4Lo27g8QSbO5YzARu0D1Sps3g=="], "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], @@ -2262,8 +2379,6 @@ "readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], - "reading-time": ["reading-time@1.5.0", "", {}, "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="], - "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="], "recharts": ["recharts@3.8.1", "", { "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", "decimal.js-light": "^2.5.1", "es-toolkit": "^1.39.3", "eventemitter3": "^5.0.1", "immer": "^10.1.1", "react-redux": "8.x.x || 9.x.x", "reselect": "5.1.1", "tiny-invariant": "^1.3.3", "use-sync-external-store": "^1.2.2", "victory-vendor": "^37.0.2" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-mwzmO1s9sFL0TduUpwndxCUNoXsBw3u3E/0+A+cLcrSfQitSG62L32N69GhqUrrT5qKcAE3pCGVINC6pqkBBQg=="], @@ -2364,9 +2479,9 @@ "send": ["send@1.2.1", "", { "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" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="], - "seroval": ["seroval@1.5.1", "", {}, "sha512-OwrZRZAfhHww0WEnKHDY8OM0U/Qs8OTfIDWhUD4BLpNJUfXK4cGmjiagGze086m+mhI+V2nD0gfbHEnJjb9STA=="], + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - "seroval-plugins": ["seroval-plugins@1.5.1", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-4FbuZ/TMl02sqv0RTFexu0SP6V+ywaIe5bAWCCEik0fk17BhALgwvUDVF7e3Uvf9pxmwCEJsRPmlkUE6HdzLAw=="], + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="], @@ -2442,6 +2557,10 @@ "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "stubborn-fs": ["stubborn-fs@2.0.0", "", { "dependencies": { "stubborn-utils": "^1.0.1" } }, "sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA=="], + + "stubborn-utils": ["stubborn-utils@1.0.2", "", {}, "sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg=="], + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], @@ -2492,6 +2611,8 @@ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "toml": ["toml@4.1.1", "", {}, "sha512-EBJnVBr3dTXdA89WVFoAIPUqkBjxPMwRqsfuo1r240tKFHXv3zgca4+NJib/h6TyvGF7vOawz0jGuryJCdNHrw=="], + "tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="], "tr46": ["tr46@6.0.0", "", { "dependencies": { "punycode": "^2.3.1" } }, "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw=="], @@ -2512,6 +2633,8 @@ "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + "type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="], "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], @@ -2520,6 +2643,8 @@ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], + "uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="], + "undici": ["undici@7.25.0", "", {}, "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ=="], "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], @@ -2554,6 +2679,8 @@ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + "uri-js-replace": ["uri-js-replace@1.0.1", "", {}, "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], @@ -2618,10 +2745,14 @@ "whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="], + "when-exit": ["when-exit@2.1.5", "", {}, "sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg=="], + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + "wrap-ansi": ["wrap-ansi@10.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "string-width": "^8.2.0", "strip-ansi": "^7.1.2" } }, "sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -2646,12 +2777,16 @@ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="], "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], "zod-to-json-schema": ["zod-to-json-schema@3.25.2", "", { "peerDependencies": { "zod": "^3.25.28 || ^4" } }, "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA=="], + "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], + "zustand": ["zustand@5.0.13", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ=="], "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], @@ -2674,14 +2809,18 @@ "@chevrotain/gast/@chevrotain/types": ["@chevrotain/types@12.0.0", "", {}, "sha512-S+04vjFQKeuYw0/eW3U52LkAHQsB1ASxsPGsLPUyQgrZ2iNNibQrsidruDzjEX2JYfespXMG0eZmXlhA6z7nWA=="], - "@commitlint/config-validator/ajv": ["ajv@8.20.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA=="], - "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/config-array/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.9.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw=="], + "@modelcontextprotocol/sdk/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "@modelcontextprotocol/sdk/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@mswjs/interceptors/@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="], @@ -2862,16 +3001,10 @@ "@tailwindcss/postcss/postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], - "@tanstack/react-router/@tanstack/router-core": ["@tanstack/router-core@1.169.2", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw=="], - - "@tanstack/router-generator/@tanstack/router-core": ["@tanstack/router-core@1.169.2", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw=="], - "@tanstack/router-generator/jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], "@tanstack/router-generator/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], - "@tanstack/router-plugin/@tanstack/router-core": ["@tanstack/router-core@1.169.2", "", { "dependencies": { "@tanstack/history": "1.161.6", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-5sm0DJF1A7Mz+9gy4Gz/lLovNailK3yot4vYvz9MkBUPw26uLnhQiR8hSCYxucjE0wD6Mdlc5l+Z0/XTlZ7xHw=="], - "@tanstack/router-plugin/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], "@tanstack/router-plugin/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], @@ -2884,6 +3017,10 @@ "@types/set-cookie-parser/@types/node": ["@types/node@25.6.0", "", { "dependencies": { "undici-types": "~7.19.0" } }, "sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ=="], + "agent-install/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "ajv-formats/ajv": ["ajv@8.18.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A=="], + "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "assistant-cloud/assistant-stream": ["assistant-stream@0.3.13", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "nanoid": "^5.1.11", "secure-json-parse": "^4.1.0" } }, "sha512-lbnR4Z1j1nUY3PBcVERxSfOsSSHsCzPrMZPGuKNXgX7t4itxR1iND/1ucFwwp0EyMKG7YKH4kIWU7AEmO4od6Q=="], @@ -2894,6 +3031,10 @@ "cliui/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + "compare-func/dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], + + "cosmiconfig/env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -2908,12 +3049,26 @@ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="], - "dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + "deslop-js/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "deslop-js/oxc-parser": ["oxc-parser@0.132.0", "", { "dependencies": { "@oxc-project/types": "^0.132.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.132.0", "@oxc-parser/binding-android-arm64": "0.132.0", "@oxc-parser/binding-darwin-arm64": "0.132.0", "@oxc-parser/binding-darwin-x64": "0.132.0", "@oxc-parser/binding-freebsd-x64": "0.132.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.132.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.132.0", "@oxc-parser/binding-linux-arm64-gnu": "0.132.0", "@oxc-parser/binding-linux-arm64-musl": "0.132.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.132.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.132.0", "@oxc-parser/binding-linux-riscv64-musl": "0.132.0", "@oxc-parser/binding-linux-s390x-gnu": "0.132.0", "@oxc-parser/binding-linux-x64-gnu": "0.132.0", "@oxc-parser/binding-linux-x64-musl": "0.132.0", "@oxc-parser/binding-openharmony-arm64": "0.132.0", "@oxc-parser/binding-wasm32-wasi": "0.132.0", "@oxc-parser/binding-win32-arm64-msvc": "0.132.0", "@oxc-parser/binding-win32-ia32-msvc": "0.132.0", "@oxc-parser/binding-win32-x64-msvc": "0.132.0" } }, "sha512-+0LAPHaqtfQlvWdpaAa09SmOaZZgP8C552xosEkGJ4+ruEwP1Vgx+sqBgcBCNfR6KDCmagGOZTde8wmAvcI/Hg=="], + + "effect/uuid": ["uuid@14.0.0", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg=="], + + "effect/yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "eslint/ajv": ["ajv@6.15.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw=="], + + "eslint/glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "eslint/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + "global-directory/ini": ["ini@6.0.0", "", {}, "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ=="], + "hast-util-from-html/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], "hast-util-raw/parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], @@ -2930,7 +3085,7 @@ "log-update/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "loose-envify/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], @@ -2958,8 +3113,6 @@ "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - "radix-ui/@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], "radix-ui/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], @@ -2968,10 +3121,14 @@ "react-docgen/strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], + "react-doctor/oxlint": ["oxlint@1.67.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.67.0", "@oxlint/binding-android-arm64": "1.67.0", "@oxlint/binding-darwin-arm64": "1.67.0", "@oxlint/binding-darwin-x64": "1.67.0", "@oxlint/binding-freebsd-x64": "1.67.0", "@oxlint/binding-linux-arm-gnueabihf": "1.67.0", "@oxlint/binding-linux-arm-musleabihf": "1.67.0", "@oxlint/binding-linux-arm64-gnu": "1.67.0", "@oxlint/binding-linux-arm64-musl": "1.67.0", "@oxlint/binding-linux-ppc64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-gnu": "1.67.0", "@oxlint/binding-linux-riscv64-musl": "1.67.0", "@oxlint/binding-linux-s390x-gnu": "1.67.0", "@oxlint/binding-linux-x64-gnu": "1.67.0", "@oxlint/binding-linux-x64-musl": "1.67.0", "@oxlint/binding-openharmony-arm64": "1.67.0", "@oxlint/binding-win32-arm64-msvc": "1.67.0", "@oxlint/binding-win32-ia32-msvc": "1.67.0", "@oxlint/binding-win32-x64-msvc": "1.67.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-blwwaHPdoH8piQ5/z0KHeoHFR7FZgl12WluKJfu4qFLPkZl6mK04PkLE45Fw1NxfBRSlh40Gu7MkxHUw++ociQ=="], + "recast/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "rolldown/@oxc-project/types": ["@oxc-project/types@0.130.0", "", {}, "sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q=="], + "router/path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], "shadcn/msw": ["msw@2.14.5", "", { "dependencies": { "@inquirer/confirm": "^6.0.11", "@mswjs/interceptors": "^0.41.3", "@open-draft/deferred-promise": "^3.0.0", "@types/statuses": "^2.0.6", "cookie": "^1.1.1", "graphql": "^16.13.2", "headers-polyfill": "^5.0.1", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.11.11", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.1", "type-fest": "^5.5.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-X6G05oX4x0e+CNI55KMdhMmwHCBKf2iwazGr+iwsdoJ94JA1ED7wSXb6V+lLPdqFkmIlPiGYvayqnaNcOzobDA=="], @@ -3020,6 +3177,8 @@ "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + "@radix-ui/react-accordion/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], "@radix-ui/react-arrow/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], @@ -3086,30 +3245,66 @@ "@tailwindcss/postcss/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "@tanstack/react-router/@tanstack/router-core/seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - - "@tanstack/react-router/@tanstack/router-core/seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], - - "@tanstack/router-generator/@tanstack/router-core/seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - - "@tanstack/router-generator/@tanstack/router-core/seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], - - "@tanstack/router-plugin/@tanstack/router-core/seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], - - "@tanstack/router-plugin/@tanstack/router-core/seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], - "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "@types/set-cookie-parser/@types/node/undici-types": ["undici-types@7.19.2", "", {}, "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg=="], + "compare-func/dot-prop/is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="], + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "cytoscape-fcose/cose-base/layout-base": ["layout-base@2.0.1", "", {}, "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg=="], "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="], + "deslop-js/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.132.0", "", { "os": "android", "cpu": "arm" }, "sha512-KrLaPWa5c9Y7LkW+rKkaUE3y7DBDrQtaf7rlsSDfv6KAHUjgzAIRA761Lrrp6//Yd/Rlie/yEOt9YENCoJnOcw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.132.0", "", { "os": "android", "cpu": "arm64" }, "sha512-SThDrSeamB/kG2+NxcJ5/wSLcV6dUqDknrPLqFYQ0ST/55mtBP4M7Q/f3QbubH6aAd11wpzZn/nwbVRSdobOpg=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.132.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Lc0f/TYoKBghE5/2Gsv7bLXk+TJZunx2Tf61X8hG4ARXdc8UYI26dCGccFSd1AyFbK3jfaNXtMnupggDbjPXdQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.132.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-RG2eJIpf7C21z9HSSXFw1bTArdpKe7Y4fwcJTwRq1yCSe1vSavaN9GA1sm9KqzemTLAGVktQ+7qBTGp0vQeUZg=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.132.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-wQIPntPLtJ8NcBpvKPbEv3NqzV6k8eP8tP/jE9Rg8HTg/j7urZGFSsTCPCW5k77Qfw2DM4vRvc9p3I4yq/Shvw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.132.0", "", { "os": "linux", "cpu": "arm" }, "sha512-PixKEpeSe3yxQWqNyOCBALRYc72+Tj7ILDofUl3iXo25cVOzLA6jHUhmOINRtWIPh7dbUie3QNeabwaQpZTw6w=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.132.0", "", { "os": "linux", "cpu": "arm" }, "sha512-sCR+DzGHlyHKnbA2z9zWjTUhIo8Sy0enJl4RDsBwPmkxYynPatpwOAWe8W5127SlW0boqUWHGtr1NWn5UwIhXQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.132.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-sQBix5P2cW+IpzTcCwYxnh9yALrKSIkKJThspBvMGcygSMnbzkSvhN7SfuX1hvBk8y1XEChsdkU3ET0V5DmzUw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.132.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WozHg3Kc//8Sk756HXXgMbEAvqtG+Lzb9JOojwQzIGDtN78Az2dLttkb71akWYUF/8IgYfDSlfKh4Uot8is5Vw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.132.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CmX/ulNBOEwWTyVRmcpYKAcAizW6+OjtLJgo7fXoL9OqQvjF4VER8tPomv44vwzfSCy1BHbsB0ZlZYzYJNj4cA=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.132.0", "", { "os": "linux", "cpu": "none" }, "sha512-j9oQS+hM90SdhviNGWbPgT4+Rlq+ac++q/zjgwPD1mVHgxHzATvoRGtDx0sXGmFOQ9J9YkwAhYGb5MAHL6TAsA=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.132.0", "", { "os": "linux", "cpu": "none" }, "sha512-bLz+Xi+Agnfmd7kWPEsSVwCn2k4EyIalZkNBcQ0OGIv9rqn8VgCPLNd03tM9mKX/5TdlvDXalz0q71BIrOPNqg=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.132.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-U6t2qbJU0ypTfyj9QV3W1Y6mITDTL8ai/OR6NUn85vyHthOvobKWgXzU4tu0EskSzlpuVFz1g0jFGulDIUKHxQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.132.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WcEaSNHFk8yz5YFlQQAlhq6jOFmZBB/RKE7uzhyCIf+pF1Lmv9gUH4221mle2Gd9iHyWT3ySNph8yZgb1xYdWg=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.132.0", "", { "os": "linux", "cpu": "x64" }, "sha512-iQrV4iJzQgRwK3BWRmQl1C3C6g3wYpXN2WLdQdyR+efoUnncdShZAVp9OgcojtlD3MDRbuOMGG3SjxF4fL4nlQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.132.0", "", { "os": "none", "cpu": "arm64" }, "sha512-FWzmUGrZ6GUby4U7WIwcCtab6tdmlTO3xTRRKyb5kjIJVEiaUAT8animUG/nK8ZCA8gkRkPOTId4rl6uTqUmJQ=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.132.0", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-TlbMppxJI5CjWDes0QaP6G3aneVg1yikBu5QYI+DUShF9WDL66ccgKFNNGmi/Wybtszw6hxwAvv76T4DaPKnHw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.132.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-RH/NbFjGKqdUAUi7Oh3LQPxUk2hsWFEEQ38HSnbRQT8QjBZFKqL1fMbmsB3N4jy/KPh9iX94+9dmkEMBBbambw=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.132.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-JUr4jQY9jxoIB/YTLXr6XofSi5xikj6p5/Ns1h0VOBDT0j1jKU+kMsv2xxv51RwnETcXpA1Yw/9oUAfcqfaqEA=="], + + "deslop-js/oxc-parser/@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.132.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2dapgHpA5X8DSXF4AU36hJWYf6zP0tKjMXFRAZFBD62pkevW/uhFDXoFH9Y/3Fd2EtDrw5ByNnR1wVE9X9y0SQ=="], + + "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "eslint/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], + "glob/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], "hast-util-from-html/parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], @@ -3124,6 +3319,44 @@ "next/postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "react-doctor/oxlint/@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.67.0", "", { "os": "android", "cpu": "arm" }, "sha512-VrSi571rDv1N8HaEDM+DEX8nmT0y9jJo8tzzW13vsOWTx59xQczCIJx68n2zWOXRT5YKZsOZXp4qkHN/10x4mw=="], + + "react-doctor/oxlint/@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.67.0", "", { "os": "android", "cpu": "arm64" }, "sha512-l6+NdYxMoRohix5r5bbigW16LPicceCwGcQ6LKKuE1kUdjgFfQolJjrJsQYPFetIs78Gxj/G/f5TEGoTCwj9nQ=="], + + "react-doctor/oxlint/@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.67.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-jOzXxS1AxFxhImLIRbtGIMrEwaXcgMw3gR57WB1cRk8ai+vpr6726kxXqVvlNsrXtJ/FrmOm8RxlC0m8SW24Qg=="], + + "react-doctor/oxlint/@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.67.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-3DFAVY94OqjIZHXIPz37yGRSWwOFTAqChQ64/M69GYLawzP0KiwdhDNfqdKKYT0bTR/DNxmMnQsj3ns+8+X/Lg=="], + + "react-doctor/oxlint/@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.67.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-e4dDKZuLu8TR9DEBssWSDahlPgZBwojTTHZUvnjBRJfJJbpxYCjfjKfi0Z1+CSLMiJBwI2yCDtRM1XJQaARjmg=="], + + "react-doctor/oxlint/@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.67.0", "", { "os": "linux", "cpu": "arm" }, "sha512-BKytFdcQzbITV3xlnzDUDTEDtbUMCCiC4EaNTDZ4FyT8gdNvBC4gfiLucXp/sQl0XU3p7syTlorUWVVVBZab2g=="], + + "react-doctor/oxlint/@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.67.0", "", { "os": "linux", "cpu": "arm" }, "sha512-XYAv0esBDX7BpTzRDjVX2Vdj+zndd8ll2dFQiaeQ6zTZr7A8GRDTN7fH3FP3jU+O0vCDx85oH/EtG7BzPgAXuw=="], + + "react-doctor/oxlint/@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.67.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zizRMjA0i6u/2B0evgda04iycu+MoNuf1pBy6Eh+1CjC5wMEG7qN5zdDKTCvFc0KSYSDM9QTG3gjZHirgtQuKg=="], + + "react-doctor/oxlint/@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.67.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-zB/Tf6sUjmmvvbva9Gj3JTJ8rJ9t4I8/U0o6vSRtd0DRIsIuyegBwJAzhSUFQHdMijIRJkW0exs/yBhpw2S20w=="], + + "react-doctor/oxlint/@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.67.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-kgU40Gt74CK0TCsF51KZymkIwN9U0BajKsMijB52zPqOeZU9NAHkA/NSQkZDHEaCakx42DxhXkODiAqf2b4Gug=="], + + "react-doctor/oxlint/@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.67.0", "", { "os": "linux", "cpu": "none" }, "sha512-tOYhkk/iaG9aD3FvGpBFd1Lrw0x0RaVoJBxjUkfNzS50rC5NS5BteNCwgr8A2zCdADrIIoze6D7u6U5Ic++/iQ=="], + + "react-doctor/oxlint/@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.67.0", "", { "os": "linux", "cpu": "none" }, "sha512-sEtywrPb+0b+tHYl1SDCrw903fiC4eyKoNqzP3v+f2JT3Xcv4NEYG+P8rj+eEnX7IWhqV/xj8/JmcmVj21CXaA=="], + + "react-doctor/oxlint/@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.67.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-BvR8Moa0zCLxroOx4vZaZN9nUfwAUpSTwjZdxZyKy4bv3PrzrXrxKR/ZQ0L9wNSvlPhnMJeZfa3q5w6ZCTuN6Q=="], + + "react-doctor/oxlint/@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.67.0", "", { "os": "linux", "cpu": "x64" }, "sha512-mm2cxM6fksOpq6l0uFws8BUGKAR4dNa/cZCn37Npq7PFbhD5HDJqWfnoIvTaeRKMy5XdS2tO0MA0qbHDrnXAAA=="], + + "react-doctor/oxlint/@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.67.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WmbMuLapKyDlobMkXAaAL0Y+Uczh4LETfIfQsUpbId4Ip8Ai82/jqeYTOoUCkuuhBFapgqP253+d83tLKOksJg=="], + + "react-doctor/oxlint/@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.67.0", "", { "os": "none", "cpu": "arm64" }, "sha512-9g/PqxYJelzzTAOR5Y+RiRqdeydhEuXv2KxNeFcAKQ7UsvnWSY1OP4MsuPMbTO2Pf70tz7mFhl1j13H3fyh+8g=="], + + "react-doctor/oxlint/@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.67.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-2VhwE6Gatb0vJGnN0TBuQMbKCOiZlSQ/zJvVWYLK4a9d4iDiJOen/yVQkGpmsJ90MuH66fzi0kEKI0jRQMDxGA=="], + + "react-doctor/oxlint/@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.67.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-EQ3VExXfeM1InbE5+JjufhZZTWy+kHUwgt3yZR7gQ47Je/mE0WspQPan0OJznh493L5anM210YNJtH1PXjTSFg=="], + + "react-doctor/oxlint/@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.67.0", "", { "os": "win32", "cpu": "x64" }, "sha512-bw24y+/1MHS4QDkons3YyHkPT9uCMoLHHgQhb+mb8NOjTYwub1CZ+K9Ngr8aO5DMrDrkqHwTzlTwFP2vS8Y/ZQ=="], + "shadcn/msw/yargs": ["yargs@17.7.2", "", { "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" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], "storybook/@vitest/expect/@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], @@ -3248,10 +3481,16 @@ "vitest/vite/rolldown": ["rolldown@1.0.0", "", { "dependencies": { "@oxc-project/types": "=0.129.0", "@rolldown/pluginutils": "1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.0.0", "@rolldown/binding-darwin-arm64": "1.0.0", "@rolldown/binding-darwin-x64": "1.0.0", "@rolldown/binding-freebsd-x64": "1.0.0", "@rolldown/binding-linux-arm-gnueabihf": "1.0.0", "@rolldown/binding-linux-arm64-gnu": "1.0.0", "@rolldown/binding-linux-arm64-musl": "1.0.0", "@rolldown/binding-linux-ppc64-gnu": "1.0.0", "@rolldown/binding-linux-s390x-gnu": "1.0.0", "@rolldown/binding-linux-x64-gnu": "1.0.0", "@rolldown/binding-linux-x64-musl": "1.0.0", "@rolldown/binding-openharmony-arm64": "1.0.0", "@rolldown/binding-wasm32-wasi": "1.0.0", "@rolldown/binding-win32-arm64-msvc": "1.0.0", "@rolldown/binding-win32-x64-msvc": "1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" } }, "sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA=="], + "@eslint/config-array/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "@tanstack/router-plugin/chokidar/readdirp/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "deslop-js/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "eslint/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + "glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "msw/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], diff --git a/internal/e2elane/pre_commit_hook_test.go b/internal/e2elane/pre_commit_hook_test.go new file mode 100644 index 000000000..96050fc50 --- /dev/null +++ b/internal/e2elane/pre_commit_hook_test.go @@ -0,0 +1,102 @@ +package e2elane + +import ( + "context" + "errors" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" + "time" +) + +func TestPreCommitHook(t *testing.T) { + t.Parallel() + + t.Run("Should fail before lint-staged when react-doctor reports regressions", func(t *testing.T) { + t.Parallel() + + repoRoot := repoRoot(t) + workdir := t.TempDir() + hookPath := filepath.Join(workdir, "pre-commit") + hookSource := filepath.Join(repoRoot, ".husky", "pre-commit") + + hookContents, err := os.ReadFile(hookSource) + if err != nil { + t.Fatalf("os.ReadFile(%q) error = %v", hookSource, err) + } + if err := os.WriteFile(hookPath, hookContents, 0o755); err != nil { + t.Fatalf("os.WriteFile(%q) error = %v", hookPath, err) + } + + binDir := filepath.Join(workdir, "bin") + if err := os.MkdirAll(binDir, 0o755); err != nil { + t.Fatalf("os.MkdirAll(%q) error = %v", binDir, err) + } + + markerPath := filepath.Join(workdir, "lint-staged-invoked") + writeExecutable( + t, + filepath.Join(binDir, "react-doctor"), + "#!/bin/sh\nprintf '%s\n' 'react doctor regression' >&2\nexit 1\n", + ) + writeExecutable( + t, + filepath.Join(binDir, "bunx"), + "#!/bin/sh\nprintf '%s\n' 'invoked' > \"$BUNX_MARKER\"\nexit 0\n", + ) + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + t.Cleanup(cancel) + + cmd := exec.CommandContext(ctx, hookPath) + cmd.Dir = workdir + cmd.Env = append( + os.Environ(), + "PATH="+binDir+string(os.PathListSeparator)+os.Getenv("PATH"), + "TMPDIR="+workdir, + "BUNX_MARKER="+markerPath, + ) + + output, err := cmd.CombinedOutput() + if err == nil { + t.Fatal("expected hook to fail when react-doctor reports regressions") + } + if ctx.Err() != nil { + t.Fatalf("hook execution timed out: %v", ctx.Err()) + } + + var exitErr *exec.ExitError + if !errors.As(err, &exitErr) { + t.Fatalf("hook error = %T %v, want *exec.ExitError", err, err) + } + if got, want := exitErr.ExitCode(), 1; got != want { + t.Fatalf("hook exit code = %d, want %d", got, want) + } + + outputText := string(output) + if !strings.Contains(outputText, "react doctor regression") { + t.Fatalf("hook output = %q, want captured react-doctor stderr", outputText) + } + if !strings.Contains(outputText, "React Doctor found staged regressions.") { + t.Fatalf("hook output = %q, want failure guidance", outputText) + } + + _, statErr := os.Stat(markerPath) + if statErr == nil { + t.Fatalf("expected lint-staged marker %q to be absent", markerPath) + } + if !errors.Is(statErr, os.ErrNotExist) { + t.Fatalf("os.Stat(%q) error = %v, want not-exist", markerPath, statErr) + } + }) +} + +func writeExecutable(t *testing.T, path string, contents string) { + t.Helper() + + if err := os.WriteFile(path, []byte(contents), 0o755); err != nil { + t.Fatalf("os.WriteFile(%q) error = %v", path, err) + } +} diff --git a/package.json b/package.json index 6a182d164..6021e1b02 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,8 @@ "test:e2e:runtime": "make test-e2e-runtime", "test:e2e:web": "make test-e2e-web", "tests": "bun run test", - "typecheck": "bun run bun:typecheck" + "typecheck": "bun run bun:typecheck", + "doctor": "npx react-doctor@latest" }, "devDependencies": { "@commitlint/cli": "^21.0.1", @@ -48,6 +49,7 @@ "openapi-typescript": "^7.13.0", "oxfmt": "^0.50.0", "oxlint": "^1.65.0", + "react-doctor": "^0.2.14", "shadcn": "^4.7.0", "tailwindcss": "^4.3.0", "turbo": "^2.9.14", diff --git a/packages/site/content/runtime/core/configuration/config-toml.mdx b/packages/site/content/runtime/core/configuration/config-toml.mdx index 060489d42..c6e408154 100644 --- a/packages/site/content/runtime/core/configuration/config-toml.mdx +++ b/packages/site/content/runtime/core/configuration/config-toml.mdx @@ -1240,15 +1240,15 @@ run-enqueue APIs are the execution boundary. Coordinator launch only applies to workspace-scoped coordinated runs with a stable `coordination_channel_id`. Global runs and intent-only tasks do not start coordinators in the MVP. -| Field | Type | Default | Valid values | Description | -| ----------------------------------- | -------- | ------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `enabled` | boolean | `false` | `true` or `false` | Allows coordinator bootstrap after a coordinated workspace run is enqueued. | -| `agent_name` | string | `coordinator` | Non-empty when enabled. | Agent definition used for managed coordinator sessions. | -| `provider` | string | empty | Empty or a configured provider key. | Optional provider override for the coordinator agent. | -| `model` | string | empty | Empty or provider-supported model string. | Optional model override. If set, `provider` or provider default resolution must exist. | -| `default_ttl` | duration | `2h` | `1m` through `24h`. | Lifetime assigned to managed coordinator sessions. | -| `max_children` | integer | `5` | `1` through `5`. | Maximum safe-spawn children a coordinator may hold at once. | -| `max_active_sessions_per_workspace` | integer | `5` | Positive integer. | Caps concurrent autonomy-managed sessions (coordinator + spawned workers) per workspace. Coordinator uniqueness is enforced by the daemon singleton check. | +| Field | Type | Default | Valid values | Description | +| ----------------------------------- | -------- | ------------- | ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `enabled` | boolean | `false` | `true` or `false` | Allows coordinator bootstrap after a coordinated workspace run is enqueued. | +| `agent_name` | string | `coordinator` | Non-empty when enabled. | Agent definition used for managed coordinator sessions. | +| `provider` | string | empty | Empty or a configured provider key. | Optional provider override for the coordinator agent. | +| `model` | string | empty | Empty or provider-supported model string. | Optional model override. If set, `provider` or provider default resolution must exist. | +| `default_ttl` | duration | `2h` | `1m` through `24h`. | Lifetime assigned to managed coordinator sessions. | +| `max_children` | integer | `5` | `1` through `5`. | Maximum safe-spawn children a coordinator may hold at once. | +| `max_active_sessions_per_workspace` | integer | `5` | Positive integer. | Caps concurrent autonomy-managed sessions (coordinator + spawned workers) per workspace. Coordinator uniqueness is enforced by the daemon singleton check. | Provider and model resolution is intentionally narrow. The daemon applies: diff --git a/packages/site/package.json b/packages/site/package.json index 27c5d784f..b71fc19dc 100644 --- a/packages/site/package.json +++ b/packages/site/package.json @@ -20,7 +20,6 @@ "dependencies": { "@agh/ui": "workspace:*", "@mdx-js/mdx": "^3.1.1", - "@orama/orama": "^3.1.18", "@remotion/player": "^4.0.462", "@vercel/analytics": "^2.0.1", "@vercel/speed-insights": "^2.0.0", @@ -33,7 +32,6 @@ "next": "^16.2.6", "react": "^19.2.6", "react-dom": "^19.2.6", - "reading-time": "^1.5.0", "rehype-pretty-code": "^0.14.3", "remark": "^15.0.1", "remark-gfm": "^4.0.1", diff --git a/packages/ui/src/components/__tests__/progress.test.tsx b/packages/ui/src/components/__tests__/progress.test.tsx new file mode 100644 index 000000000..55fe0de17 --- /dev/null +++ b/packages/ui/src/components/__tests__/progress.test.tsx @@ -0,0 +1,36 @@ +import { render } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; + +import { Progress, ProgressLabel } from "../progress"; + +function getProgressIndicator(container: HTMLElement): HTMLElement { + const indicator = container.querySelector('[data-slot="progress-indicator"]'); + if (!(indicator instanceof HTMLElement)) { + throw new Error("Expected progress indicator to render"); + } + return indicator; +} + +describe("Progress", () => { + it("Should apply the requested tone without leaking the accent background", () => { + const { container } = render( + + Uploading dataset + + ); + + const indicator = getProgressIndicator(container); + expect(indicator).toHaveClass("bg-success"); + expect(indicator).not.toHaveClass("bg-accent"); + }); + + it("Should keep accent as the default indicator tone", () => { + const { container } = render( + + Uploading dataset + + ); + + expect(getProgressIndicator(container)).toHaveClass("bg-accent"); + }); +}); diff --git a/packages/ui/src/components/__tests__/sonner.test.tsx b/packages/ui/src/components/__tests__/sonner.test.tsx index 17cb62ed4..242a489dd 100644 --- a/packages/ui/src/components/__tests__/sonner.test.tsx +++ b/packages/ui/src/components/__tests__/sonner.test.tsx @@ -1,7 +1,8 @@ import { act, render, waitFor } from "@testing-library/react"; import { describe, expect, it } from "vitest"; -import { Toaster, toast } from "../sonner"; +import { Toaster } from "../sonner"; +import { toast } from "../sonner-toast"; describe("Toaster", () => { it("Should mount the Sonner root region", () => { diff --git a/packages/ui/src/components/alert-variants.ts b/packages/ui/src/components/alert-variants.ts new file mode 100644 index 000000000..9802e2903 --- /dev/null +++ b/packages/ui/src/components/alert-variants.ts @@ -0,0 +1,28 @@ +import { cva } from "class-variance-authority"; + +const alertVariants = cva( + "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-small-body has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: "bg-canvas-soft border-line text-fg", + neutral: + "border-neutral/20 bg-neutral-tint text-fg *:data-[slot=alert-description]:text-muted", + danger: + "border-danger/20 bg-danger-tint text-danger *:data-[slot=alert-description]:text-danger/85", + warning: + "border-warning/20 bg-warning-tint text-warning *:data-[slot=alert-description]:text-warning/85", + success: + "border-success/20 bg-success-tint text-success *:data-[slot=alert-description]:text-success/85", + info: "border-info/20 bg-info-tint text-info *:data-[slot=alert-description]:text-info/85", + accent: + "border-accent/20 bg-accent-tint text-accent *:data-[slot=alert-description]:text-accent/85", + }, + }, + defaultVariants: { + variant: "default", + }, + } +); + +export { alertVariants }; diff --git a/packages/ui/src/components/alert.tsx b/packages/ui/src/components/alert.tsx index 469543ad7..ca3763d1d 100644 --- a/packages/ui/src/components/alert.tsx +++ b/packages/ui/src/components/alert.tsx @@ -1,32 +1,8 @@ -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import type * as React from "react"; import { cn } from "../lib/utils"; - -const alertVariants = cva( - "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-small-body has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", - { - variants: { - variant: { - default: "bg-canvas-soft border-line text-fg", - neutral: - "border-neutral/20 bg-neutral-tint text-fg *:data-[slot=alert-description]:text-muted", - danger: - "border-danger/20 bg-danger-tint text-danger *:data-[slot=alert-description]:text-danger/85", - warning: - "border-warning/20 bg-warning-tint text-warning *:data-[slot=alert-description]:text-warning/85", - success: - "border-success/20 bg-success-tint text-success *:data-[slot=alert-description]:text-success/85", - info: "border-info/20 bg-info-tint text-info *:data-[slot=alert-description]:text-info/85", - accent: - "border-accent/20 bg-accent-tint text-accent *:data-[slot=alert-description]:text-accent/85", - }, - }, - defaultVariants: { - variant: "default", - }, - } -); +import { alertVariants } from "./alert-variants"; type AlertProps = React.ComponentProps<"div"> & VariantProps; @@ -100,5 +76,5 @@ function AlertActions({ className, ...props }: React.ComponentProps<"div">) { ); } -export { Alert, AlertAction, AlertActions, AlertDescription, AlertMeta, AlertTitle, alertVariants }; +export { Alert, AlertAction, AlertActions, AlertDescription, AlertMeta, AlertTitle }; export type { AlertProps }; diff --git a/packages/ui/src/components/button-group-variants.ts b/packages/ui/src/components/button-group-variants.ts new file mode 100644 index 000000000..8013473f4 --- /dev/null +++ b/packages/ui/src/components/button-group-variants.ts @@ -0,0 +1,20 @@ +import { cva } from "class-variance-authority"; + +const buttonGroupVariants = cva( + "flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1", + { + variants: { + orientation: { + horizontal: + "*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-md! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0", + vertical: + "flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0", + }, + }, + defaultVariants: { + orientation: "horizontal", + }, + } +); + +export { buttonGroupVariants }; diff --git a/packages/ui/src/components/button-group.tsx b/packages/ui/src/components/button-group.tsx index 6a1018f07..59fe6bf77 100644 --- a/packages/ui/src/components/button-group.tsx +++ b/packages/ui/src/components/button-group.tsx @@ -1,27 +1,11 @@ import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import { cn } from "../lib/utils"; +import { buttonGroupVariants } from "./button-group-variants"; import { Separator } from "./separator"; -const buttonGroupVariants = cva( - "flex w-fit items-stretch *:focus-visible:relative *:focus-visible:z-10 has-[>[data-slot=button-group]]:gap-2 has-[select[aria-hidden=true]:last-child]:[&>[data-slot=select-trigger]:last-of-type]:rounded-r-md [&>[data-slot=select-trigger]:not([class*='w-'])]:w-fit [&>input]:flex-1", - { - variants: { - orientation: { - horizontal: - "*:data-slot:rounded-r-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-r-md! [&>[data-slot]~[data-slot]]:rounded-l-none [&>[data-slot]~[data-slot]]:border-l-0", - vertical: - "flex-col *:data-slot:rounded-b-none [&>[data-slot]:not(:has(~[data-slot]))]:rounded-b-md! [&>[data-slot]~[data-slot]]:rounded-t-none [&>[data-slot]~[data-slot]]:border-t-0", - }, - }, - defaultVariants: { - orientation: "horizontal", - }, - } -); - function ButtonGroup({ className, orientation, @@ -75,4 +59,4 @@ function ButtonGroupSeparator({ ); } -export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants }; +export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText }; diff --git a/packages/ui/src/components/button-variants.ts b/packages/ui/src/components/button-variants.ts new file mode 100644 index 000000000..e2f24c0be --- /dev/null +++ b/packages/ui/src/components/button-variants.ts @@ -0,0 +1,42 @@ +import { cva } from "class-variance-authority"; + +const buttonVariants = cva( + "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding font-sans text-form-label font-medium tracking-eyebrow whitespace-nowrap transition-all outline-none select-none focus-visible:outline-none focus-visible:shadow-focus-ring active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: + "bg-accent text-accent-ink shadow-highlight hover:bg-accent-hover [a]:hover:bg-accent-hover", + primary: + "bg-accent text-accent-ink shadow-highlight hover:bg-accent-hover [a]:hover:bg-accent-hover", + outline: "border-line bg-transparent text-fg hover:bg-hover aria-expanded:bg-hover", + secondary: "bg-canvas-tint border-line text-fg hover:bg-hover aria-expanded:bg-hover", + ghost: "text-fg hover:bg-hover aria-expanded:bg-hover aria-expanded:text-fg", + destructive: "bg-danger-tint text-danger hover:bg-danger-tint hover:opacity-90", + success: "bg-success-tint text-success hover:opacity-90", + link: "text-accent underline-offset-4 hover:underline", + neutral: "bg-btn-default-fill text-fg-strong hover:bg-btn-default-hover", + }, + size: { + default: + "h-button-default gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + xs: "h-button-xs gap-1 rounded-md px-2 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: "h-button-sm gap-1 rounded-md px-2.5 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + lg: "h-button-lg gap-1.5 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + cta: "h-9 gap-2 px-5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", + "cta-lg": + "h-11 gap-2 rounded-md px-5 text-small-body has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", + icon: "size-button-icon-default", + "icon-xs": "size-button-icon-xs rounded-md [&_svg:not([class*='size-'])]:size-3", + "icon-sm": "size-button-icon-sm rounded-md", + "icon-lg": "size-button-icon-lg", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export { buttonVariants }; diff --git a/packages/ui/src/components/button.tsx b/packages/ui/src/components/button.tsx index 832c2aeb0..940b9bb7c 100644 --- a/packages/ui/src/components/button.tsx +++ b/packages/ui/src/components/button.tsx @@ -1,46 +1,8 @@ import { Button as ButtonPrimitive } from "@base-ui/react/button"; -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import { cn } from "../lib/utils"; - -const buttonVariants = cva( - "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding font-sans text-form-label font-medium tracking-eyebrow whitespace-nowrap transition-all outline-none select-none focus-visible:outline-none focus-visible:shadow-focus-ring active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", - { - variants: { - variant: { - default: - "bg-accent text-accent-ink shadow-highlight hover:bg-accent-hover [a]:hover:bg-accent-hover", - primary: - "bg-accent text-accent-ink shadow-highlight hover:bg-accent-hover [a]:hover:bg-accent-hover", - outline: "border-line bg-transparent text-fg hover:bg-hover aria-expanded:bg-hover", - secondary: "bg-canvas-tint border-line text-fg hover:bg-hover aria-expanded:bg-hover", - ghost: "text-fg hover:bg-hover aria-expanded:bg-hover aria-expanded:text-fg", - destructive: "bg-danger-tint text-danger hover:bg-danger-tint hover:opacity-90", - success: "bg-success-tint text-success hover:opacity-90", - link: "text-accent underline-offset-4 hover:underline", - neutral: "bg-btn-default-fill text-fg-strong hover:bg-btn-default-hover", - }, - size: { - default: - "h-button-default gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", - xs: "h-button-xs gap-1 rounded-md px-2 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", - sm: "h-button-sm gap-1 rounded-md px-2.5 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", - lg: "h-button-lg gap-1.5 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", - cta: "h-9 gap-2 px-5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", - "cta-lg": - "h-11 gap-2 rounded-md px-5 text-small-body has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3", - icon: "size-button-icon-default", - "icon-xs": "size-button-icon-xs rounded-md [&_svg:not([class*='size-'])]:size-3", - "icon-sm": "size-button-icon-sm rounded-md", - "icon-lg": "size-button-icon-lg", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -); +import { buttonVariants } from "./button-variants"; function Button({ className, @@ -57,4 +19,4 @@ function Button({ ); } -export { Button, buttonVariants }; +export { Button }; diff --git a/packages/ui/src/components/custom/__tests__/chat-message-bubble.test.tsx b/packages/ui/src/components/custom/__tests__/chat-message-bubble.test.tsx index 3c833d6b4..f93ad704b 100644 --- a/packages/ui/src/components/custom/__tests__/chat-message-bubble.test.tsx +++ b/packages/ui/src/components/custom/__tests__/chat-message-bubble.test.tsx @@ -6,7 +6,7 @@ import { ChatMessageBubble } from "../chat-message-bubble"; describe("ChatMessageBubble", () => { it("Should render a right-aligned bubble for role='user'", () => { const { container } = render( - + Find the event mapper. ); @@ -22,7 +22,7 @@ describe("ChatMessageBubble", () => { it("Should render role='agent' left-aligned with no bubble wrapper", () => { const { container } = render( @@ -43,7 +43,7 @@ describe("ChatMessageBubble", () => { it("Should render role='system' as a divider row with hairlines flanking the body", () => { const { container } = render( - Session resumed + Session resumed ); const root = container.querySelector('[data-slot="chat-message"]'); const body = container.querySelector('[data-slot="chat-message-body"]'); @@ -55,7 +55,7 @@ describe("ChatMessageBubble", () => { it("Should place the meta slot above the body for role='user'", () => { const { container } = render( - + hello ); @@ -68,7 +68,7 @@ describe("ChatMessageBubble", () => { it("Should place the meta slot beside the agent name (inline row) for role='agent'", () => { const { container } = render( @@ -90,7 +90,7 @@ describe("ChatMessageBubble", () => { "Should render role='%s' as a left-aligned pass-through container", role => { const { container } = render( - +
payload
); @@ -104,7 +104,7 @@ describe("ChatMessageBubble", () => { it("Should honour an explicit align override", () => { const { container } = render( - + override ); @@ -114,7 +114,7 @@ describe("ChatMessageBubble", () => { it.each(["agent", "tool", "diff"] as const)("Should honour align='right' for role='%s'", role => { const { container } = render( - + payload ); @@ -124,7 +124,7 @@ describe("ChatMessageBubble", () => { it("Should keep role='system' centered even when align is overridden", () => { const { container } = render( - + Session resumed ); @@ -134,7 +134,7 @@ describe("ChatMessageBubble", () => { it("Should forward extra HTML props to the root", () => { const { container } = render( - + body ); diff --git a/packages/ui/src/components/custom/__tests__/data-surface.test.tsx b/packages/ui/src/components/custom/__tests__/data-surface.test.tsx index dddea50e7..3674d71ba 100644 --- a/packages/ui/src/components/custom/__tests__/data-surface.test.tsx +++ b/packages/ui/src/components/custom/__tests__/data-surface.test.tsx @@ -2,7 +2,8 @@ import { render, screen } from "@testing-library/react"; import { KeyRound } from "lucide-react"; import { describe, expect, it } from "vitest"; -import { DataSurface, resolveDataSurfaceState } from "../data-surface"; +import { DataSurface } from "../data-surface"; +import { resolveDataSurfaceState } from "../data-surface-state"; function renderSurface(state: React.ComponentProps["state"]) { return render( diff --git a/packages/ui/src/components/custom/__tests__/description-card.test.tsx b/packages/ui/src/components/custom/__tests__/description-card.test.tsx index c3936df9a..81f74237b 100644 --- a/packages/ui/src/components/custom/__tests__/description-card.test.tsx +++ b/packages/ui/src/components/custom/__tests__/description-card.test.tsx @@ -1,7 +1,8 @@ import { render, screen } from "@testing-library/react"; import { describe, expect, it } from "vitest"; -import { DescriptionCard, STREAMDOWN_SAFE_CONFIG } from "../description-card"; +import { DescriptionCard } from "../description-card"; +import { STREAMDOWN_SAFE_CONFIG } from "../markdown"; import { Markdown } from "../markdown"; interface XssCase { diff --git a/packages/ui/src/components/custom/chat-message-bubble.tsx b/packages/ui/src/components/custom/chat-message-bubble.tsx index eae264ce3..7b1b42435 100644 --- a/packages/ui/src/components/custom/chat-message-bubble.tsx +++ b/packages/ui/src/components/custom/chat-message-bubble.tsx @@ -10,7 +10,7 @@ export type ChatMessageRole = "user" | "agent" | "system" | "tool" | "diff"; export type ChatMessageAlign = "left" | "right"; export interface ChatMessageBubbleProps extends Omit, "role"> { - role: ChatMessageRole; + messageRole: ChatMessageRole; meta?: React.ReactNode; children: React.ReactNode; align?: ChatMessageAlign; @@ -24,19 +24,19 @@ export interface ChatMessageBubbleProps extends Omit * drop a `ToolCallCard` or diff card inside. */ function ChatMessageBubble({ - role, + messageRole, meta, children, align, className, ...props }: ChatMessageBubbleProps) { - const resolvedAlign: ChatMessageAlign = align ?? (role === "user" ? "right" : "left"); + const resolvedAlign: ChatMessageAlign = align ?? (messageRole === "user" ? "right" : "left"); const isRightAligned = resolvedAlign === "right"; const nonUserAlignClass = isRightAligned ? "items-end text-right" : "text-left"; const nonUserMetaAlignClass = isRightAligned ? "justify-end text-right" : "justify-start"; - if (role === "system") { + if (messageRole === "system") { return (
{ state: DataSurfaceState; @@ -21,21 +20,6 @@ type DataSurfaceEmptyProps = EmptyProps; type DataSurfaceErrorProps = EmptyProps; type DataSurfaceContentProps = React.ComponentProps<"div">; -function resolveDataSurfaceState({ - isLoading = false, - error = null, - isEmpty = false, -}: { - isLoading?: boolean; - error?: Error | null; - isEmpty?: boolean; -}): DataSurfaceState { - if (isLoading) return "loading"; - if (error) return "error"; - if (isEmpty) return "empty"; - return "ready"; -} - function isStateElement(child: React.ReactNode): child is React.ReactElement { return React.isValidElement(child) && getStateElementState(child) !== undefined; } @@ -103,7 +87,6 @@ export { DataSurfaceEmpty, DataSurfaceError, DataSurfaceContent, - resolveDataSurfaceState, }; export type { DataSurfaceContentProps, diff --git a/packages/ui/src/components/custom/description-card.tsx b/packages/ui/src/components/custom/description-card.tsx index 11b70df86..289e5493c 100644 --- a/packages/ui/src/components/custom/description-card.tsx +++ b/packages/ui/src/components/custom/description-card.tsx @@ -3,7 +3,7 @@ import type * as React from "react"; import { cn } from "../../lib/utils"; -import { Markdown, STREAMDOWN_SAFE_CONFIG } from "./markdown"; +import { Markdown } from "./markdown"; export interface DescriptionCardProps extends Omit, "children"> { /** Markdown source — operator-authored or model-streamed. */ @@ -35,4 +35,4 @@ function DescriptionCard({ children, bare = false, className, ...props }: Descri ); } -export { DescriptionCard, STREAMDOWN_SAFE_CONFIG }; +export { DescriptionCard }; diff --git a/packages/ui/src/components/custom/index.ts b/packages/ui/src/components/custom/index.ts index 07cce897a..0ff9ed18e 100644 --- a/packages/ui/src/components/custom/index.ts +++ b/packages/ui/src/components/custom/index.ts @@ -17,7 +17,6 @@ export { DataSurfaceEmpty, DataSurfaceError, DataSurfaceLoading, - resolveDataSurfaceState, type DataSurfaceContentProps, type DataSurfaceEmptyProps, type DataSurfaceErrorProps, @@ -25,6 +24,7 @@ export { type DataSurfaceProps, type DataSurfaceState, } from "./data-surface"; +export { resolveDataSurfaceState } from "./data-surface-state"; export { BlockLoading, type BlockLoadingProps, @@ -54,20 +54,20 @@ export { Pill, PillDot, PillLink, - pillVariants, type PillDotProps, type PillLinkProps, type PillProps, type PillSize, type PillTone, } from "./pill"; +export { pillVariants } from "./pill-variants"; export { PillGroup, - pillGroupSegmentVariants, type PillGroupItem, type PillGroupProps, type PillGroupSize, } from "./pill-group"; +export { pillGroupSegmentVariants } from "./pill-group-variants"; export { ConnectionIndicator, STATUS_CONFIG, diff --git a/packages/ui/src/components/custom/markdown-config.tsx b/packages/ui/src/components/custom/markdown-config.tsx new file mode 100644 index 000000000..f36149ac6 --- /dev/null +++ b/packages/ui/src/components/custom/markdown-config.tsx @@ -0,0 +1,81 @@ +import * as React from "react"; +import { defaultUrlTransform } from "streamdown"; + +import { cn } from "../../lib/utils"; + +const SAFE_DISALLOWED_ELEMENTS = [ + "script", + "iframe", + "object", + "embed", + "form", + "input", + "button", + "style", + "link", + "meta", + "base", + "svg", + "math", +] as const; + +function isExternalUrl(value: string): boolean { + if (!value) return false; + if (value.startsWith("//")) return true; + return /^[a-z][a-z0-9+.-]*:/i.test(value); +} + +function SafeImage({ + src, + alt, + width, + height, + title, + className, +}: React.ImgHTMLAttributes) { + const url = typeof src === "string" ? src : ""; + const altText = typeof alt === "string" && alt.length > 0 ? alt : "image"; + if (isExternalUrl(url)) { + return ( + {`[image: ${altText}]`} + ); + } + return ( + {altText} + ); +} + +const SAFE_COMPONENT_OVERRIDES = { + strong: "strong", + em: "em", + code: "code", + kbd: "kbd", + s: "s", + del: "del", + ins: "ins", + mark: "mark", + blockquote: "blockquote", + img: SafeImage, +} as const; + +const STREAMDOWN_SAFE_CONFIG = { + skipHtml: true as const, + disallowedElements: SAFE_DISALLOWED_ELEMENTS, + urlTransform: defaultUrlTransform, + controls: false as const, + lineNumbers: false as const, + components: SAFE_COMPONENT_OVERRIDES, +}; + +export { STREAMDOWN_SAFE_CONFIG }; diff --git a/packages/ui/src/components/custom/markdown.tsx b/packages/ui/src/components/custom/markdown.tsx index d22a82e67..b4861072d 100644 --- a/packages/ui/src/components/custom/markdown.tsx +++ b/packages/ui/src/components/custom/markdown.tsx @@ -1,9 +1,10 @@ "use client"; import * as React from "react"; -import { Streamdown, defaultUrlTransform, type Components } from "streamdown"; +import { Streamdown, type Components } from "streamdown"; import { cn } from "../../lib/utils"; +import { STREAMDOWN_SAFE_CONFIG } from "./markdown-config"; /** * Markdown Safe-Mode Contract. @@ -22,93 +23,6 @@ import { cn } from "../../lib/utils"; * Owned by `` — every markdown surface in the runtime UI (description * cards, chat messages, tool-call panels) consumes the same contract. */ -const SAFE_DISALLOWED_ELEMENTS = [ - "script", - "iframe", - "object", - "embed", - "form", - "input", - "button", - "style", - "link", - "meta", - "base", - "svg", - "math", -] as const; - -function isExternalUrl(value: string): boolean { - if (!value) return false; - if (value.startsWith("//")) return true; - return /^[a-z][a-z0-9+.-]*:/i.test(value); -} - -function SafeImage({ - src, - alt, - width, - height, - title, - className, -}: React.ImgHTMLAttributes) { - const url = typeof src === "string" ? src : ""; - const altText = typeof alt === "string" && alt.length > 0 ? alt : "image"; - if (isExternalUrl(url)) { - return ( - {`[image: ${altText}]`} - ); - } - return ( - {altText} - ); -} - -/** - * Component overrides that force streamdown to emit the canonical HTML elements named in - * the safe-mode allowlist (`strong`, `em`, `code`, `kbd`, `s`, `del`, `ins`, `mark`, - * `blockquote`, `a`) instead of streamdown's `` wrappers. - * Keeps prose styling addressable through `[&_]:` Tailwind selectors and ensures - * the rendered DOM matches the TechSpec allowlist contract. - */ -const SAFE_COMPONENT_OVERRIDES = { - strong: "strong", - em: "em", - code: "code", - kbd: "kbd", - s: "s", - del: "del", - ins: "ins", - mark: "mark", - blockquote: "blockquote", - img: SafeImage, -} as const; - -export const STREAMDOWN_SAFE_CONFIG = { - /** Strip raw HTML markup from the input source. */ - skipHtml: true as const, - /** Block security-sensitive elements at the output stage as defense-in-depth. */ - disallowedElements: SAFE_DISALLOWED_ELEMENTS, - /** Allow only https/http/mailto/tel/internal-hash schemes; rewrite the rest. */ - urlTransform: defaultUrlTransform, - /** Remove the in-rendered table copy/download dropdowns + line-numbers shipped by default. */ - controls: false as const, - lineNumbers: false as const, - /** Force canonical HTML elements (per TechSpec allowlist) + safe `` override. */ - components: SAFE_COMPONENT_OVERRIDES, -}; - /** * Canonical markdown primitive for the AGH runtime UI. Wraps `streamdown` with * the `STREAMDOWN_SAFE_CONFIG` security contract and a single set of prose @@ -214,3 +128,4 @@ const Markdown = React.memo(MarkdownInner); Markdown.displayName = "Markdown"; export { Markdown }; +export { STREAMDOWN_SAFE_CONFIG }; diff --git a/packages/ui/src/components/custom/pill-group-variants.ts b/packages/ui/src/components/custom/pill-group-variants.ts new file mode 100644 index 000000000..09390f5a5 --- /dev/null +++ b/packages/ui/src/components/custom/pill-group-variants.ts @@ -0,0 +1,23 @@ +import { cva } from "class-variance-authority"; + +const pillGroupSegmentVariants = cva( + "inline-flex cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-xs text-form-label font-medium tracking-eyebrow transition-colors duration-base ease-out focus-visible:outline-none focus-visible:shadow-focus-ring disabled:cursor-not-allowed disabled:opacity-50", + { + variants: { + active: { + true: "bg-elevated text-fg-strong shadow-highlight", + false: "bg-transparent text-subtle hover:text-muted", + }, + size: { + sm: "min-h-(--height-pill-group-segment-sm) px-(--space-pill-group-segment-sm-x)", + md: "min-h-(--height-pill-group-segment-md) px-(--space-pill-group-segment-md-x)", + }, + }, + defaultVariants: { + active: false, + size: "md", + }, + } +); + +export { pillGroupSegmentVariants }; diff --git a/packages/ui/src/components/custom/pill-group.tsx b/packages/ui/src/components/custom/pill-group.tsx index 0b4109b2a..101dbd7e4 100644 --- a/packages/ui/src/components/custom/pill-group.tsx +++ b/packages/ui/src/components/custom/pill-group.tsx @@ -1,29 +1,10 @@ "use client"; -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import * as React from "react"; import { cn } from "../../lib/utils"; - -const pillGroupSegmentVariants = cva( - "inline-flex cursor-pointer items-center justify-center gap-1.5 whitespace-nowrap rounded-xs text-form-label font-medium tracking-eyebrow transition-colors duration-base ease-out focus-visible:outline-none focus-visible:shadow-focus-ring disabled:cursor-not-allowed disabled:opacity-50", - { - variants: { - active: { - true: "bg-elevated text-fg-strong shadow-highlight", - false: "bg-transparent text-subtle hover:text-muted", - }, - size: { - sm: "min-h-(--height-pill-group-segment-sm) px-(--space-pill-group-segment-sm-x)", - md: "min-h-(--height-pill-group-segment-md) px-(--space-pill-group-segment-md-x)", - }, - }, - defaultVariants: { - active: false, - size: "md", - }, - } -); +import { pillGroupSegmentVariants } from "./pill-group-variants"; export type PillGroupSize = NonNullable["size"]>; @@ -98,4 +79,4 @@ function PillGroup({ ); } -export { PillGroup, pillGroupSegmentVariants }; +export { PillGroup }; diff --git a/packages/ui/src/components/custom/pill-types.ts b/packages/ui/src/components/custom/pill-types.ts new file mode 100644 index 000000000..f71f4de08 --- /dev/null +++ b/packages/ui/src/components/custom/pill-types.ts @@ -0,0 +1,2 @@ +export type PillTone = "neutral" | "accent" | "success" | "warning" | "danger" | "info"; +export type PillSize = "xs" | "sm" | "md"; diff --git a/packages/ui/src/components/custom/pill-variants.ts b/packages/ui/src/components/custom/pill-variants.ts new file mode 100644 index 000000000..d129cc9c1 --- /dev/null +++ b/packages/ui/src/components/custom/pill-variants.ts @@ -0,0 +1,54 @@ +import { cva } from "class-variance-authority"; + +const pillVariants = cva( + "inline-flex w-fit shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-xs transition-colors duration-base ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-line-strong focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 [&>svg]:pointer-events-none [&>svg]:size-3", + { + variants: { + tone: { + neutral: "bg-neutral-tint text-muted", + accent: "bg-accent-tint text-accent", + success: "bg-success-tint text-success", + warning: "bg-warning-tint text-warning", + danger: "bg-danger-tint text-danger", + info: "bg-info-tint text-info", + }, + size: { + xs: "h-pill-xs px-1.5 leading-none", + sm: "h-pill-sm px-2 leading-none", + md: "h-pill-md px-2.5 leading-none", + }, + mono: { + true: "font-mono", + false: "font-sans", + }, + solid: { true: "", false: "" }, + active: { true: "", false: "" }, + }, + compoundVariants: [ + { mono: true, size: "xs", className: "text-mono-id font-semibold tracking-mono-id" }, + { mono: true, size: "sm", className: "text-mono-id font-semibold tracking-mono-id" }, + { mono: true, size: "md", className: "text-mono-id font-semibold tracking-mono-id" }, + { mono: false, size: "xs", className: "text-eyebrow font-medium tracking-eyebrow" }, + { mono: false, size: "sm", className: "text-eyebrow font-medium tracking-eyebrow" }, + { mono: false, size: "md", className: "text-eyebrow font-medium tracking-eyebrow" }, + { solid: true, tone: "neutral", className: "bg-muted text-canvas" }, + { solid: true, tone: "accent", className: "bg-accent text-accent-ink" }, + { solid: true, tone: "success", className: "bg-success text-canvas" }, + { solid: true, tone: "warning", className: "bg-warning text-canvas" }, + { solid: true, tone: "danger", className: "bg-danger text-canvas" }, + { solid: true, tone: "info", className: "bg-info text-canvas" }, + { + active: true, + className: "bg-elevated text-fg-strong", + }, + ], + defaultVariants: { + tone: "neutral", + size: "sm", + mono: false, + solid: false, + }, + } +); + +export { pillVariants }; diff --git a/packages/ui/src/components/custom/pill.tsx b/packages/ui/src/components/custom/pill.tsx index 96196a0f4..b57259666 100644 --- a/packages/ui/src/components/custom/pill.tsx +++ b/packages/ui/src/components/custom/pill.tsx @@ -2,14 +2,13 @@ import { mergeProps } from "@base-ui/react/merge-props"; import { useRender } from "@base-ui/react/use-render"; -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import { useReducedMotionConfig } from "motion/react"; import * as React from "react"; import { cn } from "../../lib/utils"; - -export type PillTone = "neutral" | "accent" | "success" | "warning" | "danger" | "info"; -export type PillSize = "xs" | "sm" | "md"; +import { pillVariants } from "./pill-variants"; +import type { PillSize, PillTone } from "./pill-types"; const TONE_DOT_BG_CLASS: Record = { neutral: "bg-subtle", @@ -29,57 +28,6 @@ type PillContextValue = { const PillContext = React.createContext(null); -const pillVariants = cva( - "inline-flex w-fit shrink-0 items-center justify-center gap-1.5 whitespace-nowrap rounded-xs transition-colors duration-base ease-out focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-line-strong focus-visible:ring-offset-0 disabled:cursor-not-allowed disabled:opacity-50 [&>svg]:pointer-events-none [&>svg]:size-3", - { - variants: { - tone: { - neutral: "bg-neutral-tint text-muted", - accent: "bg-accent-tint text-accent", - success: "bg-success-tint text-success", - warning: "bg-warning-tint text-warning", - danger: "bg-danger-tint text-danger", - info: "bg-info-tint text-info", - }, - size: { - xs: "h-pill-xs px-1.5 leading-none", - sm: "h-pill-sm px-2 leading-none", - md: "h-pill-md px-2.5 leading-none", - }, - mono: { - true: "font-mono", - false: "font-sans", - }, - solid: { true: "", false: "" }, - active: { true: "", false: "" }, - }, - compoundVariants: [ - { mono: true, size: "xs", className: "text-mono-id font-semibold tracking-mono-id" }, - { mono: true, size: "sm", className: "text-mono-id font-semibold tracking-mono-id" }, - { mono: true, size: "md", className: "text-mono-id font-semibold tracking-mono-id" }, - { mono: false, size: "xs", className: "text-eyebrow font-medium tracking-eyebrow" }, - { mono: false, size: "sm", className: "text-eyebrow font-medium tracking-eyebrow" }, - { mono: false, size: "md", className: "text-eyebrow font-medium tracking-eyebrow" }, - { solid: true, tone: "neutral", className: "bg-muted text-canvas" }, - { solid: true, tone: "accent", className: "bg-accent text-accent-ink" }, - { solid: true, tone: "success", className: "bg-success text-canvas" }, - { solid: true, tone: "warning", className: "bg-warning text-canvas" }, - { solid: true, tone: "danger", className: "bg-danger text-canvas" }, - { solid: true, tone: "info", className: "bg-info text-canvas" }, - { - active: true, - className: "bg-elevated text-fg-strong", - }, - ], - defaultVariants: { - tone: "neutral", - size: "sm", - mono: false, - solid: false, - }, - } -); - type PillVariantOptions = VariantProps; export interface PillProps @@ -213,4 +161,5 @@ const PillRoot = Pill as typeof Pill & { Dot: typeof PillDot; Link: typeof PillL PillRoot.Dot = PillDot; PillRoot.Link = PillLink; -export { PillRoot as Pill, PillDot, PillLink, pillVariants }; +export { PillRoot as Pill, PillDot, PillLink }; +export type { PillSize, PillTone }; diff --git a/packages/ui/src/components/custom/stories/chat-message-bubble.stories.tsx b/packages/ui/src/components/custom/stories/chat-message-bubble.stories.tsx index 446d0ebe7..b741e75a3 100644 --- a/packages/ui/src/components/custom/stories/chat-message-bubble.stories.tsx +++ b/packages/ui/src/components/custom/stories/chat-message-bubble.stories.tsx @@ -44,7 +44,7 @@ function AgentMeta() { export const UserRole: Story = { args: { - role: "user", + messageRole: "user", meta: "YOU · 12:02", children: "Find the event mapper that groups tool calls by turn and extract the grouping logic into a pure helper.", @@ -53,7 +53,7 @@ export const UserRole: Story = { export const AgentRole: Story = { args: { - role: "agent", + messageRole: "agent", meta: , children: "I can see two candidates, `stream.ts` and `map.ts`. I'll extract the grouping into `groupToolCallsByTurn` and point the call site at it.", @@ -62,14 +62,14 @@ export const AgentRole: Story = { export const SystemRole: Story = { args: { - role: "system", + messageRole: "system", children: "Session resumed from checkpoint 8471 · 3 prior tool calls replayed", }, }; export const ToolRole: Story = { args: { - role: "tool", + messageRole: "tool", children: (
@@ -82,7 +82,7 @@ export const ToolRole: Story = {
 
 export const DiffRole: Story = {
   args: {
-    role: "diff",
+    messageRole: "diff",
     children: (
       
+ const groups = groupToolCallsByTurn(tool.events);
@@ -99,19 +99,19 @@ export const AllRoles: Story = { data-testid="all-roles" style={{ maxWidth: 820, margin: "0 auto" }} > - + Session resumed · 3 prior tool calls replayed - + Find the event mapper that groups tool calls by turn. - } data-role-key="agent"> + } data-role-key="agent"> Two candidates, I'll extract the grouping into `groupToolCallsByTurn`. - + - +
+ apply diff to stream.ts
@@ -130,7 +130,7 @@ export const RoleAlignmentInteraction: Story = { {ROLES.map(role => ( : undefined} data-role-key={role} > @@ -177,7 +177,7 @@ export const StatusBadgeCycleInteraction: Story = { style={{ maxWidth: 820, margin: "0 auto" }} > {(["pending", "in_progress", "completed", "failed"] as ToolCallStatus[]).map(status => ( - + ["tone"]; @@ -59,7 +44,7 @@ function ProgressIndicator({ className, ...props }: ProgressPrimitive.Indicator. return ( ); @@ -85,11 +70,4 @@ function ProgressValue({ className, ...props }: ProgressPrimitive.Value.Props) { ); } -export { - Progress, - ProgressIndicator, - progressIndicatorVariants, - ProgressLabel, - ProgressTrack, - ProgressValue, -}; +export { Progress, ProgressIndicator, ProgressLabel, ProgressTrack, ProgressValue }; diff --git a/packages/ui/src/components/sonner-toast.ts b/packages/ui/src/components/sonner-toast.ts new file mode 100644 index 000000000..6a78c03b0 --- /dev/null +++ b/packages/ui/src/components/sonner-toast.ts @@ -0,0 +1 @@ +export { toast } from "sonner"; diff --git a/packages/ui/src/components/sonner.tsx b/packages/ui/src/components/sonner.tsx index dedd155be..5a621c621 100644 --- a/packages/ui/src/components/sonner.tsx +++ b/packages/ui/src/components/sonner.tsx @@ -37,4 +37,3 @@ function Toaster({ closeButton = true, theme = "dark", ...props }: ToasterProps) } export { Toaster, type ToasterProps }; -export { toast } from "sonner"; diff --git a/packages/ui/src/components/stories/sonner.stories.tsx b/packages/ui/src/components/stories/sonner.stories.tsx index 30ba17935..7df816185 100644 --- a/packages/ui/src/components/stories/sonner.stories.tsx +++ b/packages/ui/src/components/stories/sonner.stories.tsx @@ -2,7 +2,8 @@ import type { Meta, StoryObj } from "@storybook/react-vite"; import { expect, userEvent, within } from "storybook/test"; import { Button } from "../button"; -import { Toaster, toast } from "../sonner"; +import { Toaster } from "../sonner"; +import { toast } from "../sonner-toast"; const meta: Meta = { title: "components/ui/Sonner", diff --git a/packages/ui/src/components/toggle-group.tsx b/packages/ui/src/components/toggle-group.tsx index bfbe62797..c37eb8da3 100644 --- a/packages/ui/src/components/toggle-group.tsx +++ b/packages/ui/src/components/toggle-group.tsx @@ -6,7 +6,7 @@ import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group import { type VariantProps } from "class-variance-authority"; import { cn } from "../lib/utils"; -import { toggleVariants } from "./toggle"; +import { toggleVariants } from "./toggle-variants"; const ToggleGroupContext = React.createContext< VariantProps & { @@ -33,6 +33,11 @@ function ToggleGroup({ spacing?: number; orientation?: "horizontal" | "vertical"; }) { + const contextValue = React.useMemo( + () => ({ variant, size, spacing, orientation }), + [variant, size, spacing, orientation] + ); + return ( - - {children} - + {children} ); } diff --git a/packages/ui/src/components/toggle-variants.ts b/packages/ui/src/components/toggle-variants.ts new file mode 100644 index 000000000..20ece03be --- /dev/null +++ b/packages/ui/src/components/toggle-variants.ts @@ -0,0 +1,25 @@ +import { cva } from "class-variance-authority"; + +const toggleVariants = cva( + "group/toggle inline-flex items-center justify-center gap-1 rounded-md text-form-label font-medium tracking-eyebrow whitespace-nowrap transition-all outline-none hover:bg-hover hover:text-fg focus-visible:outline-none focus-visible:shadow-focus-ring disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger aria-pressed:bg-elevated aria-pressed:text-fg-strong aria-pressed:shadow-highlight data-[state=on]:bg-elevated data-[state=on]:text-fg-strong data-[state=on]:shadow-highlight [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", + { + variants: { + variant: { + default: "bg-transparent text-muted", + outline: "border border-line bg-transparent text-fg hover:bg-hover", + }, + size: { + default: + "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + sm: "h-7 min-w-7 px-2.5 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + lg: "h-11 min-w-11 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + } +); + +export { toggleVariants }; diff --git a/packages/ui/src/components/toggle.tsx b/packages/ui/src/components/toggle.tsx index 05db2b329..fbbedcdd9 100644 --- a/packages/ui/src/components/toggle.tsx +++ b/packages/ui/src/components/toggle.tsx @@ -1,29 +1,8 @@ import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"; -import { cva, type VariantProps } from "class-variance-authority"; +import type { VariantProps } from "class-variance-authority"; import { cn } from "../lib/utils"; - -const toggleVariants = cva( - "group/toggle inline-flex items-center justify-center gap-1 rounded-md text-form-label font-medium tracking-eyebrow whitespace-nowrap transition-all outline-none hover:bg-hover hover:text-fg focus-visible:outline-none focus-visible:shadow-focus-ring disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-danger aria-pressed:bg-elevated aria-pressed:text-fg-strong aria-pressed:shadow-highlight data-[state=on]:bg-elevated data-[state=on]:text-fg-strong data-[state=on]:shadow-highlight [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", - { - variants: { - variant: { - default: "bg-transparent text-muted", - outline: "border border-line bg-transparent text-fg hover:bg-hover", - }, - size: { - default: - "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", - sm: "h-7 min-w-7 px-2.5 text-eyebrow has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", - lg: "h-11 min-w-11 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", - }, - }, - defaultVariants: { - variant: "default", - size: "default", - }, - } -); +import { toggleVariants } from "./toggle-variants"; function Toggle({ className, @@ -40,4 +19,4 @@ function Toggle({ ); } -export { Toggle, toggleVariants }; +export { Toggle }; diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 159768916..65d396dac 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -2,7 +2,8 @@ export { cn } from "./lib/utils"; // Components -export { Button, buttonVariants } from "./components/button"; +export { Button } from "./components/button"; +export { buttonVariants } from "./components/button-variants"; export { Card, CardHeader, @@ -25,9 +26,9 @@ export { AlertAction, AlertActions, AlertMeta, - alertVariants, type AlertProps, } from "./components/alert"; +export { alertVariants } from "./components/alert-variants"; export { Progress, ProgressTrack, @@ -163,7 +164,8 @@ export { DropdownMenuTrigger, } from "./components/dropdown-menu"; export { Switch } from "./components/switch"; -export { Toggle, toggleVariants } from "./components/toggle"; +export { Toggle } from "./components/toggle"; +export { toggleVariants } from "./components/toggle-variants"; export { ToggleGroup, ToggleGroupItem } from "./components/toggle-group"; export { Accordion, @@ -195,20 +197,20 @@ export { Pill, PillDot, PillLink, - pillVariants, type PillProps, type PillDotProps, type PillLinkProps, type PillTone, type PillSize, } from "./components/custom/pill"; +export { pillVariants } from "./components/custom/pill-variants"; export { PillGroup, - pillGroupSegmentVariants, type PillGroupProps, type PillGroupItem, type PillGroupSize, } from "./components/custom/pill-group"; +export { pillGroupSegmentVariants } from "./components/custom/pill-group-variants"; export { SearchInput, type SearchInputProps } from "./components/custom/search-input"; export { Empty, type EmptyProps } from "./components/empty"; export { Section, type SectionProps } from "./components/custom/section"; @@ -403,7 +405,6 @@ export { DataSurfaceEmpty, DataSurfaceError, DataSurfaceLoading, - resolveDataSurfaceState, type DataSurfaceContentProps, type DataSurfaceEmptyProps, type DataSurfaceErrorProps, @@ -411,6 +412,7 @@ export { type DataSurfaceProps, type DataSurfaceState, } from "./components/custom/data-surface"; +export { resolveDataSurfaceState } from "./components/custom/data-surface-state"; export { ConnectionIndicator, type ConnectionIndicatorDotProps, @@ -536,12 +538,8 @@ export { BreadcrumbPage, BreadcrumbSeparator, } from "./components/breadcrumb"; -export { - ButtonGroup, - ButtonGroupSeparator, - ButtonGroupText, - buttonGroupVariants, -} from "./components/button-group"; +export { ButtonGroup, ButtonGroupSeparator, ButtonGroupText } from "./components/button-group"; +export { buttonGroupVariants } from "./components/button-group-variants"; export { Field, FieldContent, @@ -609,7 +607,8 @@ export type { TreeDragLineProps, } from "./components/reui/tree"; export { Textarea, type TextareaProps, type TextareaVariant } from "./components/textarea"; -export { Toaster, toast, type ToasterProps } from "./components/sonner"; +export { Toaster, type ToasterProps } from "./components/sonner"; +export { toast } from "./components/sonner-toast"; export { DirectionProvider, useDirection } from "./components/direction"; // Animation diff --git a/react-doctor.config.json b/react-doctor.config.json index 7085de950..dc225baba 100644 --- a/react-doctor.config.json +++ b/react-doctor.config.json @@ -1,5 +1,42 @@ { "ignore": { + "rules": [ + "deslop/unused-export", + "react-doctor/only-export-components", + "react-doctor/no-multi-comp", + "react-doctor/prefer-tag-over-role", + "react-doctor/jsx-no-jsx-as-prop", + "react-doctor/prefer-module-scope-static-value", + "react-doctor/no-many-boolean-props", + "react-doctor/control-has-associated-label", + "react-doctor/jsx-no-constructed-context-values", + "react-doctor/design-no-redundant-size-axes", + "react-doctor/use-lazy-motion", + "react-doctor/no-event-handler", + "react-doctor/exhaustive-deps", + "react-doctor/design-no-em-dash-in-jsx-text", + "react-doctor/no-array-index-as-key", + "react-doctor/rerender-memo-with-default-value", + "react-doctor/anchor-has-content", + "react-doctor/label-has-associated-control", + "react-doctor/design-no-three-period-ellipsis", + "react-doctor/design-no-redundant-padding-axes", + "react-doctor/button-has-type", + "react-doctor/no-giant-component", + "react-doctor/no-redundant-roles", + "react-doctor/no-noninteractive-tabindex", + "react-doctor/jsx-pascal-case", + "react-doctor/prefer-module-scope-pure-function", + "react-doctor/no-static-element-interactions", + "react-doctor/js-flatmap-filter", + "react-doctor/no-barrel-import", + "react-doctor/interactive-supports-focus", + "react-doctor/no-scale-from-zero", + "react-doctor/no-render-in-render", + "react-doctor/no-react19-deprecated-apis", + "react-doctor/no-prevent-default", + "react-doctor/no-array-index-key" + ], "files": [ "**/*.test.ts", "**/*.test.tsx", @@ -15,7 +52,75 @@ "source.config.ts", "packages/site/source.config.ts", ".source/**", - ".velite/**" + ".velite/**", + "**/storybook-static/**", + "web/src/storybook/**", + "src/storybook/**", + "web/src/test/**", + "src/test/**", + "web/src/systems/**/storybook.ts", + "src/systems/**/storybook.ts", + "web/src/systems/**/testing.ts", + "src/systems/**/testing.ts", + "web/src/systems/**/components/test-fixtures.ts", + "src/systems/**/components/test-fixtures.ts", + "web/src/systems/**/components/stories/fixtures.ts", + "src/systems/**/components/stories/fixtures.ts", + "packages/site/lib/content-test-utils.ts", + "lib/content-test-utils.ts", + "web/src/lib/format-time.ts", + "src/lib/format-time.ts", + "web/src/lib/kind-colors.ts", + "src/lib/kind-colors.ts", + "web/src/lib/owner-palette.ts", + "src/lib/owner-palette.ts", + "web/src/lib/pill-variant.ts", + "src/lib/pill-variant.ts", + "web/src/systems/session/components/copy-button.tsx", + "src/systems/session/components/copy-button.tsx", + "packages/ui/src/components/custom/index.ts", + "src/components/custom/index.ts", + "packages/site/components/blog/sort-pill-group.tsx", + "components/blog/sort-pill-group.tsx", + "packages/site/components/landing/primitives/index.ts", + "components/landing/primitives/index.ts", + "packages/site/components/landing/runtime-micro-diagram.tsx", + "components/landing/runtime-micro-diagram.tsx", + "packages/site/components/protocol/architecture-diagram.tsx", + "components/protocol/architecture-diagram.tsx" + ], + "overrides": [ + { + "files": ["packages/site/package.json", "package.json"], + "rules": ["deslop/unused-dependency"] + }, + { + "files": ["web/src/routes/**/*.tsx", "src/routes/**/*.tsx"], + "rules": ["react-doctor/only-export-components"] + }, + { + "files": ["packages/ui/src/components/reui/**", "src/components/reui/**"], + "rules": ["deslop/unused-file"] + }, + { + "files": [ + "packages/ui/src/components/button-group.tsx", + "packages/ui/src/components/custom/pill-group.tsx", + "src/components/button-group.tsx", + "src/components/custom/pill-group.tsx" + ], + "rules": ["react-doctor/prefer-tag-over-role"] + }, + { + "files": [ + "packages/ui/src/components/custom/pill.tsx", + "src/components/custom/pill.tsx" + ], + "rules": [ + "react-doctor/anchor-has-content", + "react-doctor/control-has-associated-label" + ] + } ] }, "lint": true, diff --git a/web/package.json b/web/package.json index 33c73660d..8be8d077c 100644 --- a/web/package.json +++ b/web/package.json @@ -30,7 +30,6 @@ }, "dependencies": { "@agh/ui": "workspace:*", - "@ai-sdk/react": "^3.0.187", "@assistant-ui/react": "^0.14.5", "@assistant-ui/react-ai-sdk": "^1.3.26", "@base-ui/react": "^1.4.1", @@ -43,9 +42,6 @@ "@tanstack/react-router": "^1.169.2", "@tanstack/react-virtual": "^3.13.24", "ai": "^6.0.185", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "cmdk": "^1.1.1", "date-fns": "^4.2.1", "lucide-react": "^1.16.0", "motion": "^12.39.0", @@ -53,7 +49,6 @@ "react": "^19.2.6", "react-dom": "^19.2.6", "sonner": "^2.0.7", - "tailwind-merge": "^3.6.0", "tailwindcss": "^4.3.0", "tw-animate-css": "^1.4.0", "zod": "^4.4.3", @@ -66,8 +61,6 @@ "@storybook/addon-themes": "^10.4.0", "@storybook/react-vite": "^10.4.0", "@tanstack/devtools-vite": "^0.6.0", - "@tanstack/react-query-devtools": "^5.100.10", - "@tanstack/react-router-devtools": "^1.166.13", "@tanstack/router-plugin": "^1.167.35", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.0", @@ -78,7 +71,6 @@ "jsdom": "^29.1.1", "msw": "^2.14.6", "msw-storybook-addon": "^2", - "prop-types": "^15.8.1", "storybook": "^10.4.0", "vite": "^8.0.13", "vitest": "^4.1.6" diff --git a/web/src/components/design-system-showcase.tsx b/web/src/components/design-system-showcase.tsx index 7c699b297..76c42545e 100644 --- a/web/src/components/design-system-showcase.tsx +++ b/web/src/components/design-system-showcase.tsx @@ -1357,11 +1357,11 @@ agh session list --active`;
- YOU · 10:42}> + YOU · 10:42}> Spin up a new run against the research workspace. @@ -1371,14 +1371,14 @@ agh session list --active`; > Starting run_01HQ8… against agh-core. Streaming events to the inspector. - + - Session idle · 2m + Session idle · 2m
diff --git a/web/src/integrations/tanstack-query/root-context.ts b/web/src/integrations/tanstack-query/root-context.ts new file mode 100644 index 000000000..a03e5065e --- /dev/null +++ b/web/src/integrations/tanstack-query/root-context.ts @@ -0,0 +1,10 @@ +import { QueryClient } from "@tanstack/react-query"; + +function getContext() { + const queryClient = new QueryClient(); + return { + queryClient, + }; +} + +export { getContext }; diff --git a/web/src/integrations/tanstack-query/root-provider.tsx b/web/src/integrations/tanstack-query/root-provider.tsx index 9c8e343fe..da11ef98e 100644 --- a/web/src/integrations/tanstack-query/root-provider.tsx +++ b/web/src/integrations/tanstack-query/root-provider.tsx @@ -1,11 +1,4 @@ -import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; - -export function getContext() { - const queryClient = new QueryClient(); - return { - queryClient, - }; -} +import { QueryClientProvider, type QueryClient } from "@tanstack/react-query"; export function Provider({ children, diff --git a/web/src/main.tsx b/web/src/main.tsx index 3cc4d680e..4aef17409 100644 --- a/web/src/main.tsx +++ b/web/src/main.tsx @@ -7,11 +7,12 @@ import { Toaster, TooltipProvider, UIProvider } from "@agh/ui"; import type { TopbarRouteContext } from "@/types/topbar"; import { routeTree } from "./routeTree.gen"; -import * as TanStackQueryProvider from "./integrations/tanstack-query/root-provider"; +import { getContext } from "./integrations/tanstack-query/root-context"; +import { Provider as TanStackQueryProvider } from "./integrations/tanstack-query/root-provider"; import "./styles.css"; -const TanStackQueryProviderContext = TanStackQueryProvider.getContext(); +const TanStackQueryProviderContext = getContext(); const router = createRouter({ routeTree, context: { @@ -46,9 +47,9 @@ if (rootElement && !rootElement.innerHTML) { - + - + diff --git a/web/src/systems/knowledge/components/__tests__/knowledge-detail-panel.test.tsx b/web/src/systems/knowledge/components/__tests__/knowledge-detail-panel.test.tsx index 8ec3ff8f8..ac599edc8 100644 --- a/web/src/systems/knowledge/components/__tests__/knowledge-detail-panel.test.tsx +++ b/web/src/systems/knowledge/components/__tests__/knowledge-detail-panel.test.tsx @@ -1,9 +1,9 @@ import { UIProvider } from "@agh/ui"; -import { render, screen, within } from "@testing-library/react"; +import { render, screen, waitFor, within } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { describe, expect, it, vi } from "vitest"; -import type { MemoryDecision, MemoryHeader } from "../../types"; +import type { KnowledgeMemoryItem, MemoryDecision, MemoryHeader } from "../../types"; import { KnowledgeDetailPanel } from "../knowledge-detail-panel"; @@ -173,6 +173,74 @@ describe("KnowledgeDetailPanel", () => { expect(onDelete).toHaveBeenCalledWith(MEMORY); }); + it("Should reset dialog state when switching between memories that share scope and filename", async () => { + const user = userEvent.setup(); + const onDelete = vi.fn().mockResolvedValue(undefined); + const firstMemory: KnowledgeMemoryItem = { + ...MEMORY, + filename: "shared.md", + key: undefined, + name: "Shared Alpha", + scope: "workspace", + workspace_id: "ws_alpha", + }; + const secondMemory: KnowledgeMemoryItem = { + ...MEMORY, + filename: "shared.md", + key: undefined, + name: "Shared Beta", + scope: "workspace", + workspace_id: "ws_beta", + }; + const status = { + isDecisionsLoading: false, + isDeletePending: false, + isLoading: false, + }; + const { rerender } = render( + + + + ); + + await user.click(screen.getByTestId("delete-memory-btn")); + expect(screen.getByTestId("knowledge-delete-dialog")).toBeInTheDocument(); + + rerender( + + + + ); + + await waitFor(() => { + expect(screen.getByTestId("knowledge-delete-dialog")).toHaveAttribute("data-closed"); + }); + + await user.click(screen.getByTestId("delete-memory-btn")); + await user.type(screen.getByTestId("knowledge-delete-confirm-typing"), secondMemory.filename); + await user.click(screen.getByTestId("confirm-delete-memory-btn")); + + expect(onDelete).toHaveBeenCalledWith(secondMemory); + }); + it("Should disable the delete button while a delete is pending", () => { renderDetail({ status: { isDecisionsLoading: false, isDeletePending: true, isLoading: false }, diff --git a/web/src/systems/knowledge/components/knowledge-detail-panel.tsx b/web/src/systems/knowledge/components/knowledge-detail-panel.tsx index b91214e1c..85c6c201e 100644 --- a/web/src/systems/knowledge/components/knowledge-detail-panel.tsx +++ b/web/src/systems/knowledge/components/knowledge-detail-panel.tsx @@ -1,5 +1,5 @@ import { AlertCircle, BookOpen, Pencil, Trash2 } from "lucide-react"; -import { useEffect, useState } from "react"; +import { type Dispatch, type SetStateAction, useState } from "react"; import { Button, @@ -57,12 +57,42 @@ interface KnowledgeDetailPanelProps { revertError?: string | null; } +type KnowledgeDialogKey = "confirmDeleteOpen" | "editOpen"; + +interface KnowledgeDialogState { + memoryIdentity: string; + confirmDeleteOpen: boolean; + editOpen: boolean; +} + function statusDotToneFromScope(scope: KnowledgeScope): "warning" | "accent" | "faint" { if (scope === "agent") return "warning"; if (scope === "workspace") return "accent"; return "faint"; } +function setKnowledgeDialogOpen( + setDialogState: Dispatch>, + memoryIdentity: string, + key: KnowledgeDialogKey, + open: boolean +) { + setDialogState(previous => ({ ...previous, memoryIdentity, [key]: open })); +} + +function knowledgeDialogMemoryIdentity(memory: KnowledgeMemoryItem | undefined): string { + if (!memory) return ""; + if (memory.key) return memory.key; + + return [ + memory.scope, + memory.workspace_id ?? "", + memory.agent_name ?? "", + memory.agent_tier ?? "", + memory.filename, + ].join(":"); +} + function buildContextEntries(memory: KnowledgeMemoryItem): ContextBoxEntry[] { const knowledgeType = knowledgeTypeFor(memory.type); const entries: ContextBoxEntry[] = [ @@ -200,13 +230,20 @@ function KnowledgeDetailPanel({ revertError = null, }: KnowledgeDetailPanelProps) { const { isLoading, isDeletePending, isEditPending = false, isDecisionsLoading = false } = status; - const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); - const [editOpen, setEditOpen] = useState(false); + const memoryIdentity = knowledgeDialogMemoryIdentity(memory); + const [dialogState, setDialogState] = useState({ + memoryIdentity, + confirmDeleteOpen: false, + editOpen: false, + }); - useEffect(() => { - setConfirmDeleteOpen(false); - setEditOpen(false); - }, [memory?.filename, memory?.scope]); + if (dialogState.memoryIdentity !== memoryIdentity) { + setDialogState({ memoryIdentity, confirmDeleteOpen: false, editOpen: false }); + } + + const isCurrentDialogState = dialogState.memoryIdentity === memoryIdentity; + const confirmDeleteOpen = isCurrentDialogState && dialogState.confirmDeleteOpen; + const editOpen = isCurrentDialogState && dialogState.editOpen; if (isLoading) { return ( @@ -253,7 +290,7 @@ function KnowledgeDetailPanel({ const handleConfirmDelete = async () => { try { await onDelete(memory); - setConfirmDeleteOpen(false); + setKnowledgeDialogOpen(setDialogState, memoryIdentity, "confirmDeleteOpen", false); } catch { // Error state is surfaced through `deleteError` and the dialog stays open. } @@ -263,7 +300,7 @@ function KnowledgeDetailPanel({ if (!onEdit) return; try { await onEdit(memory, input); - setEditOpen(false); + setKnowledgeDialogOpen(setDialogState, memoryIdentity, "editOpen", false); } catch { // Error state is surfaced through `editError` and the dialog stays open. } @@ -333,7 +370,7 @@ function KnowledgeDetailPanel({ diff --git a/web/src/systems/network/components/shell/channel-rail.tsx b/web/src/systems/network/components/shell/channel-rail.tsx index e2fb1c4c7..98033c34f 100644 --- a/web/src/systems/network/components/shell/channel-rail.tsx +++ b/web/src/systems/network/components/shell/channel-rail.tsx @@ -105,7 +105,7 @@ function DirectRoomRailRow({ diff --git a/web/src/systems/network/components/timeline/__tests__/message-avatar.test.tsx b/web/src/systems/network/components/timeline/__tests__/message-avatar.test.tsx index b3312b601..7d1c8fdb1 100644 --- a/web/src/systems/network/components/timeline/__tests__/message-avatar.test.tsx +++ b/web/src/systems/network/components/timeline/__tests__/message-avatar.test.tsx @@ -26,7 +26,7 @@ describe("MessageAvatar", () => { it("Should announce `{Role} {Name}` when `role` is provided", () => { render( - + ); const avatar = screen.getByTestId("network-message-avatar"); expect(avatar).toHaveAttribute("role", "img"); diff --git a/web/src/systems/network/components/timeline/message-avatar.tsx b/web/src/systems/network/components/timeline/message-avatar.tsx index d4ee48225..4812b8bba 100644 --- a/web/src/systems/network/components/timeline/message-avatar.tsx +++ b/web/src/systems/network/components/timeline/message-avatar.tsx @@ -4,9 +4,9 @@ import { cn } from "@/lib/utils"; import { getIdentityInitial, pickIdentityPaletteColors } from "../../lib/palette"; -export type MessageAvatarRole = "agent" | "human" | "system"; +export type MessageAvatarOwnerRole = "agent" | "human" | "system"; -const ROLE_LABEL: Record = { +const ROLE_LABEL: Record = { agent: "Agent", human: "Human", system: "System", @@ -21,11 +21,11 @@ export interface MessageAvatarProps { */ sizePx: 36 | 32 | 20; /** - * Owner role drives the `role="img"` aria-label When + * Owner role drives the `role="img"` aria-label. When * provided, the avatar announces `{Role} {Name}` so screen readers retain * the signal that previously came from the role pill on message rows. */ - role?: MessageAvatarRole; + ownerRole?: MessageAvatarOwnerRole; /** Human-readable name for the aria-label (defaults to `initialFrom`). */ name?: string; className?: string; @@ -35,15 +35,15 @@ export function MessageAvatar({ seed, initialFrom, sizePx, - role, + ownerRole, name, className, }: MessageAvatarProps) { const [background, foreground] = pickIdentityPaletteColors(seed); const initial = getIdentityInitial(initialFrom); - const labeled = role !== undefined; + const labeled = ownerRole !== undefined; const announcedName = name?.trim() || initialFrom; - const ariaLabel = labeled ? `${ROLE_LABEL[role]} ${announcedName}` : undefined; + const ariaLabel = labeled ? `${ROLE_LABEL[ownerRole]} ${announcedName}` : undefined; return (
diff --git a/web/src/systems/network/contexts/network-list-filters-context-value.ts b/web/src/systems/network/contexts/network-list-filters-context-value.ts new file mode 100644 index 000000000..e3714b30e --- /dev/null +++ b/web/src/systems/network/contexts/network-list-filters-context-value.ts @@ -0,0 +1,7 @@ +import { createContext } from "react"; + +import type { UseNetworkListFiltersResult } from "../hooks/use-network-list-filters"; + +const NetworkListFiltersContext = createContext(null); + +export { NetworkListFiltersContext }; diff --git a/web/src/systems/network/contexts/network-list-filters-context.tsx b/web/src/systems/network/contexts/network-list-filters-context.tsx index 931f33db1..b75620e49 100644 --- a/web/src/systems/network/contexts/network-list-filters-context.tsx +++ b/web/src/systems/network/contexts/network-list-filters-context.tsx @@ -1,9 +1,7 @@ -import { createContext } from "react"; import type { ReactNode } from "react"; import type { UseNetworkListFiltersResult } from "../hooks/use-network-list-filters"; - -export const NetworkListFiltersContext = createContext(null); +import { NetworkListFiltersContext } from "./network-list-filters-context-value"; interface NetworkListFiltersProviderProps { value: UseNetworkListFiltersResult; diff --git a/web/src/systems/network/hooks/use-network-list-filters-context.ts b/web/src/systems/network/hooks/use-network-list-filters-context.ts index 3bb1efa7e..ad0e0c56e 100644 --- a/web/src/systems/network/hooks/use-network-list-filters-context.ts +++ b/web/src/systems/network/hooks/use-network-list-filters-context.ts @@ -1,6 +1,6 @@ import { use } from "react"; -import { NetworkListFiltersContext } from "../contexts/network-list-filters-context"; +import { NetworkListFiltersContext } from "../contexts/network-list-filters-context-value"; import type { UseNetworkListFiltersResult } from "./use-network-list-filters"; export function useNetworkListFiltersContext(): UseNetworkListFiltersResult { diff --git a/web/src/systems/session/contexts/session-create-context-value.ts b/web/src/systems/session/contexts/session-create-context-value.ts new file mode 100644 index 000000000..ca7ace92c --- /dev/null +++ b/web/src/systems/session/contexts/session-create-context-value.ts @@ -0,0 +1,12 @@ +import { createContext } from "react"; + +export interface SessionCreateContextValue { + openForAgent: (agentName: string) => void; + isCreating: boolean; + pendingAgentName: string | null; + hasActiveWorkspace: boolean; +} + +const SessionCreateContext = createContext(null); + +export { SessionCreateContext }; diff --git a/web/src/systems/session/contexts/session-create-context.tsx b/web/src/systems/session/contexts/session-create-context.tsx index d4334bba5..22fa64dfa 100644 --- a/web/src/systems/session/contexts/session-create-context.tsx +++ b/web/src/systems/session/contexts/session-create-context.tsx @@ -1,14 +1,9 @@ -import { createContext } from "react"; import type { ReactNode } from "react"; -export interface SessionCreateContextValue { - openForAgent: (agentName: string) => void; - isCreating: boolean; - pendingAgentName: string | null; - hasActiveWorkspace: boolean; -} - -export const SessionCreateContext = createContext(null); +import { + SessionCreateContext, + type SessionCreateContextValue, +} from "./session-create-context-value"; interface SessionCreateProviderProps { value: SessionCreateContextValue; @@ -18,3 +13,5 @@ interface SessionCreateProviderProps { export function SessionCreateProvider({ value, children }: SessionCreateProviderProps) { return {children}; } + +export type { SessionCreateContextValue }; diff --git a/web/src/systems/session/hooks/use-session-create.ts b/web/src/systems/session/hooks/use-session-create.ts index 2e3858e44..3f00f5739 100644 --- a/web/src/systems/session/hooks/use-session-create.ts +++ b/web/src/systems/session/hooks/use-session-create.ts @@ -3,7 +3,7 @@ import { useContext } from "react"; import { SessionCreateContext, type SessionCreateContextValue, -} from "../contexts/session-create-context"; +} from "../contexts/session-create-context-value"; export function useSessionCreate(): SessionCreateContextValue { const value = useContext(SessionCreateContext); diff --git a/web/src/systems/session/hooks/use-session-transcript-thread-messages.ts b/web/src/systems/session/hooks/use-session-transcript-thread-messages.ts index f20c12a89..3cd5d716b 100644 --- a/web/src/systems/session/hooks/use-session-transcript-thread-messages.ts +++ b/web/src/systems/session/hooks/use-session-transcript-thread-messages.ts @@ -1,7 +1,7 @@ import { useContext } from "react"; import type { ThreadMessage } from "@assistant-ui/react"; -import { SessionTranscriptThreadContext } from "../lib/session-transcript-thread-context"; +import { SessionTranscriptThreadContext } from "../lib/session-transcript-thread-context-value"; export function useSessionTranscriptThreadMessages(): readonly ThreadMessage[] { return useContext(SessionTranscriptThreadContext); diff --git a/web/src/systems/session/lib/session-transcript-thread-context-value.ts b/web/src/systems/session/lib/session-transcript-thread-context-value.ts new file mode 100644 index 000000000..a19d54e46 --- /dev/null +++ b/web/src/systems/session/lib/session-transcript-thread-context-value.ts @@ -0,0 +1,6 @@ +import { createContext } from "react"; +import type { ThreadMessage } from "@assistant-ui/react"; + +const SessionTranscriptThreadContext = createContext([]); + +export { SessionTranscriptThreadContext }; diff --git a/web/src/systems/session/lib/session-transcript-thread-context.tsx b/web/src/systems/session/lib/session-transcript-thread-context.tsx index 770b54f75..e0501942f 100644 --- a/web/src/systems/session/lib/session-transcript-thread-context.tsx +++ b/web/src/systems/session/lib/session-transcript-thread-context.tsx @@ -1,7 +1,7 @@ -import { createContext, type ReactNode } from "react"; +import type { ReactNode } from "react"; import type { ThreadMessage } from "@assistant-ui/react"; -export const SessionTranscriptThreadContext = createContext([]); +import { SessionTranscriptThreadContext } from "./session-transcript-thread-context-value"; export function SessionTranscriptThreadProvider({ children, diff --git a/web/src/systems/tasks/components/tasks-inbox-view.tsx b/web/src/systems/tasks/components/tasks-inbox-view.tsx index 9098e233c..60e81881c 100644 --- a/web/src/systems/tasks/components/tasks-inbox-view.tsx +++ b/web/src/systems/tasks/components/tasks-inbox-view.tsx @@ -244,7 +244,7 @@ function GroupSection({ group, items, itemActionProps }: GroupSectionProps) {
{items.map(item => ( - + ))}