From 9aff44e37a2d66d9828dac2f0d1dd34c993b3392 Mon Sep 17 00:00:00 2001 From: saturn Date: Mon, 16 Mar 2026 21:48:57 +0800 Subject: [PATCH] refactor: analysis workflow architecture fix: NEXTAUTH_URL fix: prevent project model edits from affecting default model --- .env.example | 7 +- docker-compose.yml | 6 +- package-lock.json | 396 +- package.json | 1 - pnpm-lock.yaml | 6197 +---------------- prisma/schema.prisma | 6 + .../hooks/useRebuildConfirm.ts | 6 +- .../api/novel-promotion/[projectId]/route.ts | 27 - src/lib/ark-api.ts | 3 +- src/lib/env.ts | 22 +- src/lib/gemini-batch-utils.ts | 3 +- src/lib/generators/image/gemini-compatible.ts | 3 +- src/lib/generators/image/google.ts | 3 +- src/lib/llm-observe/config.ts | 6 +- src/lib/llm/vision.ts | 3 +- src/lib/model-gateway/openai-compat/common.ts | 3 +- .../stages/voice-stage-runtime/types.ts | 2 +- .../useVoiceRuntimeSync.ts | 10 +- src/lib/query/hooks/useTaskStatus.ts | 4 +- src/lib/run-runtime/graph-executor.ts | 172 - src/lib/run-runtime/langgraph-pipeline.ts | 89 - src/lib/run-runtime/pipeline-graph.ts | 16 - src/lib/run-runtime/quick-run-graph.ts | 31 - src/lib/run-runtime/service.ts | 165 +- src/lib/run-runtime/types.ts | 7 + src/lib/run-runtime/workflow-lease.ts | 72 + src/lib/storage/utils.ts | 3 +- src/lib/task/client.ts | 4 +- src/lib/task/publisher.ts | 8 + src/lib/task/queues.ts | 9 + src/lib/task/service.ts | 20 +- src/lib/task/state-service.ts | 4 +- src/lib/task/submitter.ts | 61 +- src/lib/task/types.ts | 1 + src/lib/workers/handlers/llm-stream.ts | 25 +- .../workers/handlers/script-to-storyboard.ts | 824 +-- src/lib/workers/handlers/story-to-script.ts | 632 +- src/lib/workers/shared.ts | 163 +- src/lib/workflow-engine/dependencies.ts | 95 + .../workflows/script-to-storyboard/graph.ts | 110 - src/lib/workflows/story-to-script/graph.ts | 103 - .../api/contract/run-cancel.route.test.ts | 96 + .../api/contract/task-infra-routes.test.ts | 5 +- ...otion-project-art-style-validation.test.ts | 18 +- .../billing/submitter.integration.test.ts | 158 +- tests/integration/chain/text.chain.test.ts | 25 +- .../retry-failed-step.integration.test.ts | 343 + tests/system/helpers/tasks.ts | 1 + tests/unit/helpers/task-state-service.test.ts | 22 + .../voice-runtime-sync.test.ts | 44 + tests/unit/run-runtime/graph-executor.test.ts | 140 - .../run-runtime/langgraph-pipeline.test.ts | 136 - .../task/publisher.direct-run-events.test.ts | 128 + tests/unit/worker/llm-stream.test.ts | 32 + .../unit/worker/script-to-storyboard.test.ts | 34 +- .../worker/shared.direct-run-events.test.ts | 175 + tests/unit/worker/story-to-script.test.ts | 33 +- tests/unit/workspace/rebuild-confirm.test.ts | 26 + 58 files changed, 2753 insertions(+), 7985 deletions(-) delete mode 100644 src/lib/run-runtime/graph-executor.ts delete mode 100644 src/lib/run-runtime/langgraph-pipeline.ts delete mode 100644 src/lib/run-runtime/pipeline-graph.ts delete mode 100644 src/lib/run-runtime/quick-run-graph.ts create mode 100644 src/lib/run-runtime/workflow-lease.ts create mode 100644 src/lib/workflow-engine/dependencies.ts delete mode 100644 src/lib/workflows/script-to-storyboard/graph.ts delete mode 100644 src/lib/workflows/story-to-script/graph.ts create mode 100644 tests/integration/api/contract/run-cancel.route.test.ts create mode 100644 tests/integration/run-runtime/retry-failed-step.integration.test.ts delete mode 100644 tests/unit/run-runtime/graph-executor.test.ts delete mode 100644 tests/unit/run-runtime/langgraph-pipeline.test.ts create mode 100644 tests/unit/task/publisher.direct-run-events.test.ts create mode 100644 tests/unit/worker/shared.direct-run-events.test.ts diff --git a/.env.example b/.env.example index 41646d9..c7aacf5 100644 --- a/.env.example +++ b/.env.example @@ -26,10 +26,15 @@ MINIO_FORCE_PATH_STYLE=true # ==================== 认证 ==================== # 本地开发模式(方式三):使用 http://localhost:3000 -# Docker 容器模式(方式一、二):改为 https://localhost(配合 Caddy)或 http://localhost:13000 +# Docker 容器模式(方式一、二):由 docker-compose.yml 注入为 http://localhost:13000 NEXTAUTH_URL=http://localhost:3000 NEXTAUTH_SECRET=please-change-this-to-a-random-string +# ==================== 应用内部自调用地址 ==================== +# 仅用于服务端内部 fetch 本应用 API / 文件。 +# 本地开发模式通常与 NEXTAUTH_URL 一致;Docker 模式由 docker-compose.yml 注入为 http://127.0.0.1:3000 +INTERNAL_APP_URL=http://127.0.0.1:3000 + # ==================== 内部密钥 ==================== CRON_SECRET=please-change-this-cron-secret INTERNAL_TASK_TOKEN=please-change-this-task-token diff --git a/docker-compose.yml b/docker-compose.yml index 2c44f31..d6f0f4e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -82,8 +82,10 @@ services: MINIO_ACCESS_KEY: "minioadmin" MINIO_SECRET_KEY: "minioadmin" MINIO_FORCE_PATH_STYLE: "true" - # 认证 - NEXTAUTH_URL: "http://localhost:3000" + # 外部访问地址(浏览器实际访问) + NEXTAUTH_URL: "http://localhost:13000" + # 容器内自调用地址(服务端 fetch 自己的 API / 文件) + INTERNAL_APP_URL: "http://127.0.0.1:3000" NEXTAUTH_SECRET: "waoowaoo-default-secret-2026" # 内部密钥 CRON_SECRET: "waoowaoo-docker-cron-secret" diff --git a/package-lock.json b/package-lock.json index eecebb4..d91ee0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@dnd-kit/sortable": "^10.0.0", "@fal-ai/client": "^1.7.2", "@google/genai": "^1.34.0", - "@langchain/langgraph": "^1.2.0", "@next-auth/prisma-adapter": "^1.0.7", "@openrouter/sdk": "^0.3.11", "@prisma/client": "^6.19.2", @@ -1226,6 +1225,7 @@ "resolved": "https://registry.npmmirror.com/@cfworker/json-schema/-/json-schema-4.1.1.tgz", "integrity": "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==", "license": "MIT", + "optional": true, "peer": true }, "node_modules/@dnd-kit/accessibility": { @@ -2772,197 +2772,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@langchain/core": { - "version": "1.1.30", - "resolved": "https://registry.npmmirror.com/@langchain/core/-/core-1.1.30.tgz", - "integrity": "sha512-tPjY7TUI/w5Jby93TBCENH3QlcuUi0cuq2hpQ3WO1rd3x3WULvdmtfDzLcLQC427oPMlOFuDI1NIvR89jxD6Ng==", - "license": "MIT", - "peer": true, - "dependencies": { - "@cfworker/json-schema": "^4.0.2", - "@standard-schema/spec": "^1.1.0", - "ansi-styles": "^5.0.0", - "camelcase": "6", - "decamelize": "1.2.0", - "js-tiktoken": "^1.0.12", - "langsmith": ">=0.5.0 <1.0.0", - "mustache": "^4.2.0", - "p-queue": "^6.6.2", - "uuid": "^11.1.0", - "zod": "^3.25.76 || ^4" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@langchain/core/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@langchain/core/node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/@langchain/langgraph": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/@langchain/langgraph/-/langgraph-1.2.0.tgz", - "integrity": "sha512-wyqKIzXTAfXX3L1d8R7icM+HmRQBTbuNLWtUlpRJ/JP/ux1ei/sOSt6p8f90ARoOP2iJVlM70wOBYWaGErdBlA==", - "license": "MIT", - "dependencies": { - "@langchain/langgraph-checkpoint": "^1.0.0", - "@langchain/langgraph-sdk": "~1.6.5", - "@standard-schema/spec": "1.1.0", - "uuid": "^10.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@langchain/core": "^1.1.16", - "zod": "^3.25.32 || ^4.2.0", - "zod-to-json-schema": "^3.x" - }, - "peerDependenciesMeta": { - "zod-to-json-schema": { - "optional": true - } - } - }, - "node_modules/@langchain/langgraph-checkpoint": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/@langchain/langgraph-checkpoint/-/langgraph-checkpoint-1.0.0.tgz", - "integrity": "sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==", - "license": "MIT", - "dependencies": { - "uuid": "^10.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@langchain/core": "^1.0.1" - } - }, - "node_modules/@langchain/langgraph-checkpoint/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@langchain/langgraph-sdk": { - "version": "1.6.5", - "resolved": "https://registry.npmmirror.com/@langchain/langgraph-sdk/-/langgraph-sdk-1.6.5.tgz", - "integrity": "sha512-JjprmbhgCnoNJ9DUKcvrEU+C9FfKsNGyT3ooqWxAY5Cx2qofhXmDJOpTCqqbxfDHPKG0RjTs5HgVK3WW5M6Big==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.15", - "p-queue": "^9.0.1", - "p-retry": "^7.1.1", - "uuid": "^13.0.0" - }, - "peerDependencies": { - "@langchain/core": "^1.1.16", - "react": "^18 || ^19", - "react-dom": "^18 || ^19" - }, - "peerDependenciesMeta": { - "@langchain/core": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/@langchain/langgraph-sdk/node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, - "node_modules/@langchain/langgraph-sdk/node_modules/p-queue": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/p-queue/-/p-queue-9.1.0.tgz", - "integrity": "sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1", - "p-timeout": "^7.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@langchain/langgraph-sdk/node_modules/p-timeout": { - "version": "7.0.1", - "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-7.0.1.tgz", - "integrity": "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@langchain/langgraph-sdk/node_modules/uuid": { - "version": "13.0.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-13.0.0.tgz", - "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist-node/bin/uuid" - } - }, - "node_modules/@langchain/langgraph/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@medv/finder": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@medv/finder/-/finder-4.0.2.tgz", @@ -6061,13 +5870,6 @@ "optional": true, "peer": true }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "license": "MIT", - "peer": true - }, "node_modules/@types/yauzl": { "version": "2.10.3", "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", @@ -7921,19 +7723,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/camelize/-/camelize-1.0.1.tgz", @@ -8317,16 +8106,6 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-table-printer": { - "version": "2.15.0", - "resolved": "https://registry.npmmirror.com/console-table-printer/-/console-table-printer-2.15.0.tgz", - "integrity": "sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==", - "license": "MIT", - "peer": true, - "dependencies": { - "simple-wcswidth": "^1.1.2" - } - }, "node_modules/content-disposition": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-1.0.1.tgz", @@ -8670,16 +8449,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decimal.js": { "version": "10.6.0", "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz", @@ -9723,13 +9492,6 @@ "node": ">=6" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT", - "peer": true - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", @@ -11382,18 +11144,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/is-network-error/-/is-network-error-1.3.1.tgz", - "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-node-process": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/is-node-process/-/is-node-process-1.2.0.tgz", @@ -11805,16 +11555,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/js-tiktoken": { - "version": "1.0.21", - "resolved": "https://registry.npmmirror.com/js-tiktoken/-/js-tiktoken-1.0.21.tgz", - "integrity": "sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==", - "license": "MIT", - "peer": true, - "dependencies": { - "base64-js": "^1.5.1" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", @@ -12030,68 +11770,6 @@ "node": ">=6" } }, - "node_modules/langsmith": { - "version": "0.5.7", - "resolved": "https://registry.npmmirror.com/langsmith/-/langsmith-0.5.7.tgz", - "integrity": "sha512-FjYf2oBGMoSXnaT4SRaFguIiGJaonZ5VKWKJDPl9awLZjz2RkN29AcQWceecSINVzXzTvtRWPOjAWT+XggqNNg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@types/uuid": "^10.0.0", - "chalk": "^5.6.2", - "console-table-printer": "^2.12.1", - "p-queue": "^6.6.2", - "semver": "^7.6.3", - "uuid": "^10.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "*", - "@opentelemetry/exporter-trace-otlp-proto": "*", - "@opentelemetry/sdk-trace-base": "*", - "openai": "*" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "@opentelemetry/exporter-trace-otlp-proto": { - "optional": true - }, - "@opentelemetry/sdk-trace-base": { - "optional": true - }, - "openai": { - "optional": true - } - } - }, - "node_modules/langsmith/node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "license": "MIT", - "peer": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/langsmith/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmmirror.com/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -12975,16 +12653,6 @@ "node": ">=16" } }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "license": "MIT", - "peer": true, - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/mute-stream": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/mute-stream/-/mute-stream-2.0.0.tgz", @@ -13726,16 +13394,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", @@ -13768,51 +13426,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmmirror.com/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/p-retry/-/p-retry-7.1.1.tgz", - "integrity": "sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==", - "license": "MIT", - "dependencies": { - "is-network-error": "^1.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "license": "MIT", - "peer": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", @@ -15437,13 +15050,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-wcswidth": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/simple-wcswidth/-/simple-wcswidth-1.1.2.tgz", - "integrity": "sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==", - "license": "MIT", - "peer": true - }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/package.json b/package.json index 5677119..af8f596 100644 --- a/package.json +++ b/package.json @@ -121,7 +121,6 @@ "@dnd-kit/sortable": "^10.0.0", "@fal-ai/client": "^1.7.2", "@google/genai": "^1.34.0", - "@langchain/langgraph": "^1.2.0", "@next-auth/prisma-adapter": "^1.0.7", "@openrouter/sdk": "^0.3.11", "@prisma/client": "^6.19.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca2cd23..c70d92f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: dependencies: '@ai-sdk/google': specifier: ^3.0.22 - version: 3.0.22(zod@3.22.3) + version: 3.0.22(zod@3.25.76) '@ai-sdk/openai': specifier: ^3.0.26 - version: 3.0.26(zod@3.22.3) + version: 3.0.26(zod@3.25.76) '@ai-sdk/react': - specifier: ^3.0.77 - version: 3.0.118(react@19.1.0)(zod@3.22.3) + specifier: ^3.0.118 + version: 3.0.118(react@19.2.4)(zod@3.25.76) '@aws-sdk/client-s3': specifier: ^3.883.0 version: 3.1000.0 @@ -31,58 +31,34 @@ importers: version: 6.17.0 '@dnd-kit/core': specifier: ^6.3.1 - version: 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@dnd-kit/sortable': specifier: ^10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) '@fal-ai/client': specifier: ^1.7.2 version: 1.9.0 '@google/genai': specifier: ^1.34.0 - version: 1.40.0(@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.22.3)) - '@langchain/core': - specifier: ^1.1.30 - version: 1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)) - '@langchain/langgraph': - specifier: ^1.2.0 - version: 1.2.0(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod-to-json-schema@3.25.1(zod@3.22.3))(zod@3.22.3) + version: 1.40.0(@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76)) '@next-auth/prisma-adapter': specifier: ^1.0.7 - version: 1.0.7(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(next-auth@4.24.13(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)) + version: 1.0.7(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(next-auth@4.24.13(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4)) '@openrouter/sdk': specifier: ^0.3.11 version: 0.3.16 '@prisma/client': specifier: ^6.19.2 version: 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) - '@radix-ui/react-use-controllable-state': - specifier: ^1.2.2 - version: 1.2.2(@types/react@19.2.13)(react@19.1.0) '@remotion/cli': specifier: ^4.0.405 - version: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@remotion/player': specifier: ^4.0.405 - version: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rive-app/react-webgl2': - specifier: ^4.27.0 - version: 4.27.0(react@19.1.0) - '@streamdown/cjk': - specifier: ^1.0.2 - version: 1.0.2(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.1.0)(unified@11.0.5) - '@streamdown/code': - specifier: ^1.0.3 - version: 1.0.3(react@19.1.0) - '@streamdown/math': - specifier: ^1.0.2 - version: 1.0.2(react@19.1.0) - '@streamdown/mermaid': - specifier: ^1.0.2 - version: 1.0.2(react@19.1.0) + version: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@tanstack/react-query': specifier: ^5.90.20 - version: 5.90.20(react@19.1.0) + version: 5.90.20(react@19.2.4) '@types/archiver': specifier: ^7.0.0 version: 7.0.0 @@ -95,15 +71,9 @@ importers: '@vercel/og': specifier: ^0.8.6 version: 0.8.6 - '@xyflow/react': - specifier: ^12.10.1 - version: 12.10.1(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ai: - specifier: ^6.0.77 - version: 6.0.77(zod@3.22.3) - ansi-to-react: - specifier: ^6.2.6 - version: 6.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: ^6.0.116 + version: 6.0.116(zod@3.25.76) archiver: specifier: ^7.0.1 version: 7.0.1 @@ -113,21 +83,9 @@ importers: bullmq: specifier: ^5.67.3 version: 5.67.3 - class-variance-authority: - specifier: ^0.7.1 - version: 0.7.1 - clsx: - specifier: ^2.1.1 - version: 2.1.1 - cmdk: - specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) cos-nodejs-sdk-v5: specifier: ^2.15.4 version: 2.15.4 - embla-carousel-react: - specifier: ^8.6.0 - version: 8.6.0(react@19.1.0) express: specifier: ^5.2.1 version: 5.2.1 @@ -148,79 +106,52 @@ importers: version: 11.2.6 lucide-react: specifier: ^0.575.0 - version: 0.575.0(react@19.1.0) + version: 0.575.0(react@19.2.4) mammoth: specifier: ^1.11.0 version: 1.11.0 - media-chrome: - specifier: ^4.18.0 - version: 4.18.0(react@19.1.0) - motion: - specifier: ^12.35.0 - version: 12.35.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) mysql2: specifier: ^3.15.1 version: 3.16.3 - nanoid: - specifier: ^5.1.6 - version: 5.1.6 next: specifier: ^15.5.7 - version: 15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-auth: specifier: ^4.24.11 - version: 4.24.13(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.24.13(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-intl: specifier: ^4.7.0 - version: 4.8.2(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.9.3) + version: 4.8.2(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3) openai: specifier: ^6.8.1 - version: 6.18.0(ws@8.19.0)(zod@3.22.3) + version: 6.18.0(ws@8.19.0)(zod@3.25.76) prisma: specifier: ^6.19.2 version: 6.19.2(magicast@0.3.5)(typescript@5.9.3) - radix-ui: - specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: - specifier: 19.1.0 - version: 19.1.0 + specifier: ^19.1.2 + version: 19.2.4 react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) + specifier: ^19.1.2 + version: 19.2.4(react@19.2.4) react-grab: specifier: ^0.1.20 - version: 0.1.20(@types/react@19.2.13)(react@19.1.0) + version: 0.1.20(@types/react@19.2.13)(react@19.2.4) react-hot-toast: specifier: ^2.6.0 - version: 2.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react-jsx-parser: - specifier: ^2.4.1 - version: 2.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 2.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) remotion: specifier: ^4.0.405 - version: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + version: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) sharp: specifier: ^0.34.5 version: 0.34.5 - shiki: - specifier: ^4.0.1 - version: 4.0.1 - streamdown: - specifier: ^2.3.0 - version: 2.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tailwind-merge: - specifier: ^3.5.0 - version: 3.5.0 - tokenlens: - specifier: ^1.3.1 - version: 1.3.1 undici: specifier: ^7.22.0 version: 7.22.0 - use-stick-to-bottom: - specifier: ^1.1.3 - version: 1.1.3(react@19.1.0) + zod: + specifier: ^3.25.76 + version: 3.25.76 devDependencies: '@eslint/eslintrc': specifier: ^3 @@ -255,21 +186,18 @@ importers: eslint-config-next: specifier: 15.5.4 version: 15.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3) + husky: + specifier: ^9.1.7 + version: 9.1.7 rimraf: specifier: ^6.1.2 version: 6.1.2 - shadcn: - specifier: ^3.8.5 - version: 3.8.5(@cfworker/json-schema@4.1.1)(@types/node@20.19.33)(typescript@5.9.3) tailwindcss: specifier: ^4 version: 4.1.18 tsx: specifier: ^4.20.5 version: 4.21.0 - tw-animate-css: - specifier: ^1.4.0 - version: 1.4.0 typescript: specifier: ^5 version: 5.9.3 @@ -279,12 +207,6 @@ importers: packages: - '@ai-sdk/gateway@3.0.39': - resolution: {integrity: sha512-SeCZBAdDNbWpVUXiYgOAqis22p5MEYfrjRw0hiBa5hM+7sDGYQpMinUjkM8kbPXMkY+AhKLrHleBl+SuqpzlgA==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@3.0.66': resolution: {integrity: sha512-SIQ0YY0iMuv+07HLsZ+bB990zUJ6S4ujORAh+Jv1V2KGNn73qQKnGO0JBk+w+Res8YqOFSycwDoWcFlQrVxS4A==} engines: {node: '>=18'} @@ -333,13 +255,6 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} - - '@antfu/ni@25.0.0': - resolution: {integrity: sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA==} - hasBin: true - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -507,72 +422,6 @@ packages: resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} - '@babel/code-frame@7.29.0': - resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.0': - resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.0': - resolution: {integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.29.1': - resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} - - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} @@ -581,14 +430,6 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.24.1': resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} @@ -599,48 +440,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.28.6': - resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.28.6': - resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.28.6': - resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.28.5': - resolution: {integrity: sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.29.0': - resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} - engines: {node: '>=6.9.0'} - '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} @@ -648,9 +451,6 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@braintree/sanitize-url@7.1.2': - resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} - '@bull-board/api@6.17.0': resolution: {integrity: sha512-nnYzOu74KRimG+WmZ8j4r3+i3FpwbXrSekrMyNsne9I7bj5XqpkacFg7HA8+IwG9ysPqrWdy/KEl2XG1vCR4Fw==} peerDependencies: @@ -665,21 +465,6 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - '@chevrotain/cst-dts-gen@11.1.2': - resolution: {integrity: sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q==} - - '@chevrotain/gast@11.1.2': - resolution: {integrity: sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g==} - - '@chevrotain/regexp-to-ast@11.1.2': - resolution: {integrity: sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw==} - - '@chevrotain/types@11.1.2': - resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} - - '@chevrotain/utils@11.1.2': - resolution: {integrity: sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA==} - '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} peerDependencies: @@ -702,16 +487,6 @@ packages: peerDependencies: react: '>=16.8.0' - '@dotenvx/dotenvx@1.52.0': - resolution: {integrity: sha512-CaQcc8JvtzQhUSm9877b6V4Tb7HCotkcyud9X2YwdqtQKwgljkMRwU96fVYKnzN3V0Hj74oP7Es+vZ0mS+Aa1w==} - hasBin: true - - '@ecies/ciphers@0.2.5': - resolution: {integrity: sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A==} - engines: {bun: '>=1', deno: '>=2', node: '>=16'} - peerDependencies: - '@noble/ciphers': ^1.0.0 - '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -1210,21 +985,6 @@ packages: resolution: {integrity: sha512-okIXfgrjiRlens0CGbg50LFR0cZYfIG+DehC5ObTQUwSziOzqlytkFDi98dqbgvtfu4Ecbtjz90rj5/EVSEZog==} engines: {node: '>=18.0.0'} - '@floating-ui/core@1.7.5': - resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - - '@floating-ui/dom@1.7.6': - resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - - '@floating-ui/react-dom@2.1.8': - resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.11': - resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@formatjs/ecma402-abstract@3.1.1': resolution: {integrity: sha512-jhZbTwda+2tcNrs4kKvxrPLPjx8QsBCLCUgrrJ/S+G9YrGHWLhAyFMMBHJBnBoOwuLHd7L14FgYudviKaxkO2Q==} @@ -1274,12 +1034,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} - '@img/colour@1.0.0': resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} engines: {node: '>=18'} @@ -1506,47 +1260,9 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@langchain/core@1.1.30': - resolution: {integrity: sha512-tPjY7TUI/w5Jby93TBCENH3QlcuUi0cuq2hpQ3WO1rd3x3WULvdmtfDzLcLQC427oPMlOFuDI1NIvR89jxD6Ng==} - engines: {node: '>=20'} - - '@langchain/langgraph-checkpoint@1.0.0': - resolution: {integrity: sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': ^1.0.1 - - '@langchain/langgraph-sdk@1.6.5': - resolution: {integrity: sha512-JjprmbhgCnoNJ9DUKcvrEU+C9FfKsNGyT3ooqWxAY5Cx2qofhXmDJOpTCqqbxfDHPKG0RjTs5HgVK3WW5M6Big==} - peerDependencies: - '@langchain/core': ^1.1.16 - react: ^18 || ^19 - react-dom: ^18 || ^19 - peerDependenciesMeta: - '@langchain/core': - optional: true - react: - optional: true - react-dom: - optional: true - - '@langchain/langgraph@1.2.0': - resolution: {integrity: sha512-wyqKIzXTAfXX3L1d8R7icM+HmRQBTbuNLWtUlpRJ/JP/ux1ei/sOSt6p8f90ARoOP2iJVlM70wOBYWaGErdBlA==} - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': ^1.1.16 - zod: ^3.25.32 || ^4.2.0 - zod-to-json-schema: ^3.x - peerDependenciesMeta: - zod-to-json-schema: - optional: true - '@medv/finder@4.0.2': resolution: {integrity: sha512-RraNY9SCcx4KZV0Dh6BEW6XEW2swkqYca74pkFFRw6hHItSHiy+O/xMnpbofjYbzXj0tSpBGthUF1hHTsr3vIQ==} - '@mermaid-js/parser@1.0.0': - resolution: {integrity: sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==} - '@modelcontextprotocol/sdk@1.27.1': resolution: {integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==} engines: {node: '>=18'} @@ -1662,18 +1378,6 @@ packages: cpu: [x64] os: [win32] - '@noble/ciphers@1.3.0': - resolution: {integrity: sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1861,696 +1565,6 @@ packages: '@protobufjs/utf8@1.1.0': resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} - '@radix-ui/number@1.1.1': - resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} - - '@radix-ui/primitive@1.1.3': - resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} - - '@radix-ui/react-accessible-icon@1.1.7': - resolution: {integrity: sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-accordion@1.2.12': - resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-alert-dialog@1.1.15': - resolution: {integrity: sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-arrow@1.1.7': - resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-aspect-ratio@1.1.7': - resolution: {integrity: sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-avatar@1.1.10': - resolution: {integrity: sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-checkbox@1.3.3': - resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collapsible@1.1.12': - resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-collection@1.1.7': - resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.2': - resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context-menu@2.2.16': - resolution: {integrity: sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-context@1.1.2': - resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dialog@1.1.15': - resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-direction@1.1.1': - resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.11': - resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-dropdown-menu@2.1.16': - resolution: {integrity: sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-focus-guards@1.1.3': - resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-focus-scope@1.1.7': - resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-form@0.1.8': - resolution: {integrity: sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-hover-card@1.1.15': - resolution: {integrity: sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-id@1.1.1': - resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.7': - resolution: {integrity: sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menu@2.1.16': - resolution: {integrity: sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-menubar@1.1.16': - resolution: {integrity: sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-navigation-menu@1.2.14': - resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-one-time-password-field@0.1.8': - resolution: {integrity: sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-password-toggle-field@0.1.3': - resolution: {integrity: sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popover@1.1.15': - resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.8': - resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.9': - resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.5': - resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.1.3': - resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-progress@1.1.7': - resolution: {integrity: sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-radio-group@1.3.8': - resolution: {integrity: sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-roving-focus@1.1.11': - resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-scroll-area@1.2.10': - resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-select@2.2.6': - resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-separator@1.1.7': - resolution: {integrity: sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slider@1.3.6': - resolution: {integrity: sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.2.3': - resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-switch@1.2.6': - resolution: {integrity: sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tabs@1.1.13': - resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toast@1.2.15': - resolution: {integrity: sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle-group@1.1.11': - resolution: {integrity: sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toggle@1.1.10': - resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-toolbar@1.1.11': - resolution: {integrity: sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-tooltip@1.2.8': - resolution: {integrity: sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.1': - resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.2.2': - resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-effect-event@0.0.2': - resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.1': - resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-is-hydrated@0.1.0': - resolution: {integrity: sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.1': - resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-previous@1.1.1': - resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.1': - resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.1': - resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.2.3': - resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.1': - resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@remotion/bundler@4.0.419': resolution: {integrity: sha512-gHs12YFHWppFRKrmu1y598BmjWFJqtHwvXyRy03ZvLPVxOZOFUR0FHeAUkp9NzmYCp/XQtZzrHRwNBiB4yvvYw==} peerDependencies: @@ -2660,14 +1674,6 @@ packages: resolution: {integrity: sha512-C7c51Nn4yTxXFKvgh2txJFNweaVcfUPQxwEUFw4aWsCmfiBDJsTSwviIF8EcwjQ6k8bPyMWCl1vw4BdxE569Cg==} engines: {node: '>= 10'} - '@rive-app/react-webgl2@4.27.0': - resolution: {integrity: sha512-OxIRJiTPJtvPDeUWXfXIx2WZ/6OqaTFWTaS9OE0oekHz80yT9kl41MEUZw7GlgY4l4Pzke7bkn8xEeVnDgPFIg==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0 - - '@rive-app/webgl2@2.35.0': - resolution: {integrity: sha512-T6fIVmsn9KiN0pMKOvuODhpnOzJHnhFU6injYmVkzsxKn+VIDhTC0FvR2vr520tR+JsZUBy04KUn61cxZCnUgA==} - '@rollup/rollup-android-arm-eabi@4.59.0': resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} cpu: [arm] @@ -2815,67 +1821,11 @@ packages: '@schummar/icu-type-parser@1.21.5': resolution: {integrity: sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw==} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - - '@shikijs/core@3.23.0': - resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==} - - '@shikijs/core@4.0.1': - resolution: {integrity: sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg==} - engines: {node: '>=20'} - - '@shikijs/engine-javascript@3.23.0': - resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==} - - '@shikijs/engine-javascript@4.0.1': - resolution: {integrity: sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg==} - engines: {node: '>=20'} - - '@shikijs/engine-oniguruma@3.23.0': - resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - - '@shikijs/engine-oniguruma@4.0.1': - resolution: {integrity: sha512-oCWdCTDch3J8Kc0OZJ98KuUPC02O1VqIE3W/e2uvrHqTxYRR21RGEJMtchrgrxhsoJJCzmIciKsqG+q/yD+Cxg==} - engines: {node: '>=20'} - - '@shikijs/langs@3.23.0': - resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - - '@shikijs/langs@4.0.1': - resolution: {integrity: sha512-v/mluaybWdnGJR4GqAR6zh8qAZohW9k+cGYT28Y7M8+jLbC0l4yG085O1A+WkseHTn+awd+P3UBymb2+MXFc8w==} - engines: {node: '>=20'} - - '@shikijs/primitive@4.0.1': - resolution: {integrity: sha512-ns0hHZc5eWZuvuIEJz2pTx3Qecz0aRVYumVQJ8JgWY2tq/dH8WxdcVM49Fc2NsHEILNIT6vfdW9MF26RANWiTA==} - engines: {node: '>=20'} - - '@shikijs/themes@3.23.0': - resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - - '@shikijs/themes@4.0.1': - resolution: {integrity: sha512-FW41C/D6j/yKQkzVdjrRPiJCtgeDaYRJFEyCKFCINuRJRj9WcmubhP4KQHPZ4+9eT87jruSrYPyoblNRyDFzvA==} - engines: {node: '>=20'} - - '@shikijs/types@3.23.0': - resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} - - '@shikijs/types@4.0.1': - resolution: {integrity: sha512-EaygPEn57+jJ76mw+nTLvIpJMAcMPokFbrF8lufsZP7Ukk+ToJYEcswN1G0e49nUZAq7aCQtoeW219A8HK1ZOw==} - engines: {node: '>=20'} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@shuding/opentype.js@1.4.0-beta.0': resolution: {integrity: sha512-3NgmNyH3l/Hv6EvsWJbsvpcpUba6R8IREQ83nH83cyakCw7uM1arZKNfHwv1Wz6jgqrF/j4x5ELvR6PnK9nTcA==} engines: {node: '>= 8.0.0'} hasBin: true - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@smithy/abort-controller@4.2.10': resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} engines: {node: '>=18.0.0'} @@ -3095,26 +2045,6 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@streamdown/cjk@1.0.2': - resolution: {integrity: sha512-5OOuZjj2Lnae92Zmg2gA5hloSbcKj25gv+QY4iKbYI+iRsiGWbgmYxmgxNUSO9SR6BKOCy783UHN1HM/QEUpdw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - '@streamdown/code@1.0.3': - resolution: {integrity: sha512-3Ym5TCLcGhrHY2qBaUVWpqNRtxnZvqh4Y5Qm/pTIKA4AmEWwAAoYjZnxG7mOsvOpWVWiDwETjUtchNL1XzQEAw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - '@streamdown/math@1.0.2': - resolution: {integrity: sha512-r8Ur9/lBuFnzZAFdEWrLUF2s/gRwRRRwruqltdZibyjbCBnuW7SJbFm26nXqvpJPW/gzpBUMrBVBzd88z05D5g==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - '@streamdown/mermaid@1.0.2': - resolution: {integrity: sha512-Fr/4sBWnAeSnxM3PcrV/+DiZe5oPMq9gOkUIAH7ZauJeuwrZ/DVzD4g0zlav6AH0axh2m/sOfrfLtY5aLT7niw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - '@swc/core-darwin-arm64@1.15.11': resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} engines: {node: '>=10'} @@ -3297,21 +2227,6 @@ packages: peerDependencies: react: ^18 || ^19 - '@tokenlens/core@1.3.0': - resolution: {integrity: sha512-d8YNHNC+q10bVpi95fELJwJyPVf1HfvBEI18eFQxRSZTdByXrP+f/ZtlhSzkx0Jl0aEmYVeBA5tPeeYRioLViQ==} - - '@tokenlens/fetch@1.3.0': - resolution: {integrity: sha512-RONDRmETYly9xO8XMKblmrZjKSwCva4s5ebJwQNfNlChZoA5kplPoCgnWceHnn1J1iRjLVlrCNB43ichfmGBKQ==} - - '@tokenlens/helpers@1.3.1': - resolution: {integrity: sha512-t6yL8N6ES8337E6eVSeH4hCKnPdWkZRFpupy9w5E66Q9IeqQ9IO7XQ6gh12JKjvWiRHuyyJ8MBP5I549Cr41EQ==} - - '@tokenlens/models@1.3.0': - resolution: {integrity: sha512-9mx7ZGeewW4ndXAiD7AT1bbCk4OpJeortbjHHyNkgap+pMPPn1chY6R5zqe1ggXIUzZ2l8VOAKfPqOvpcrisJw==} - - '@ts-morph/common@0.27.0': - resolution: {integrity: sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==} - '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -3328,102 +2243,6 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/d3-array@3.2.2': - resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} - - '@types/d3-axis@3.0.6': - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - - '@types/d3-brush@3.0.6': - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - - '@types/d3-chord@3.0.6': - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-contour@3.0.6': - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - - '@types/d3-delaunay@6.0.4': - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - - '@types/d3-dispatch@3.0.7': - resolution: {integrity: sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==} - - '@types/d3-drag@3.0.7': - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - - '@types/d3-dsv@3.0.7': - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-fetch@3.0.7': - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - - '@types/d3-force@3.0.10': - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - - '@types/d3-format@3.0.4': - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - - '@types/d3-hierarchy@3.1.7': - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.1': - resolution: {integrity: sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==} - - '@types/d3-polygon@3.0.2': - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - - '@types/d3-quadtree@3.0.6': - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - - '@types/d3-scale-chromatic@3.1.0': - resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} - - '@types/d3-scale@4.0.9': - resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} - - '@types/d3-selection@3.0.11': - resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - - '@types/d3-shape@3.1.8': - resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==} - - '@types/d3-time-format@4.0.3': - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - - '@types/d3-time@3.0.4': - resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/d3-transition@3.0.9': - resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} - - '@types/d3-zoom@3.0.8': - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - - '@types/d3@7.4.3': - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/dom-mediacapture-transform@0.1.11': resolution: {integrity: sha512-Y2p+nGf1bF2XMttBnsVPHUWzRRZzqUoJAKmiP10b5umnO6DDrWI0BrGDJy1pOHoOULVmGSfFNkQrAlC5dcj6nQ==} @@ -3436,9 +2255,6 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree-jsx@1.0.5': - resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -3451,12 +2267,6 @@ packages: '@types/file-saver@2.0.7': resolution: {integrity: sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==} - '@types/geojson@7946.0.16': - resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -3466,32 +2276,15 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/katex@0.16.8': - resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - - '@types/mdast@4.0.4': - resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - - '@types/ms@2.1.0': - resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@20.19.33': resolution: {integrity: sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - '@types/qs@6.14.0': resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/react-dom@18.3.7': - resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==} - peerDependencies: - '@types/react': ^18.0.0 - '@types/react-dom@19.2.3': resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: @@ -3502,9 +2295,6 @@ packages: peerDependencies: '@types/react': '*' - '@types/react@18.3.28': - resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} - '@types/react@19.2.13': resolution: {integrity: sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ==} @@ -3520,21 +2310,6 @@ packages: '@types/statuses@2.0.6': resolution: {integrity: sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA==} - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/unist@2.0.11': - resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/validate-npm-package-name@4.0.2': - resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} - '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -3597,9 +2372,6 @@ packages: resolution: {integrity: sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.0': - resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -3804,15 +2576,6 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - '@xyflow/react@12.10.1': - resolution: {integrity: sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==} - peerDependencies: - react: '>=17' - react-dom: '>=17' - - '@xyflow/system@0.0.75': - resolution: {integrity: sha512-iXs+AGFLi8w/VlAoc/iSxk+CxfT6o64Uw/k0CKASOPqjqz6E0rb5jFZgJtXGZCpfQI6OQpu5EnumP5fGxQheaQ==} - abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3831,11 +2594,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -3846,12 +2604,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - ai@6.0.77: - resolution: {integrity: sha512-tyyhrRpCRFVlivdNIFLK8cexSBB2jwTqO0z1qJQagk+UxZ+MW8h5V8xsvvb+xdKDY482Y8KAm0mr7TDnPKvvlw==} - engines: {node: '>=18'} - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - ajv-formats@1.6.1: resolution: {integrity: sha512-4CjkH20If1lhR5CGtqkrVg3bbOtFEG80X9v6jDOIUhbzzbB+UzPBGy8GQhUNVZ0yvMHdMpawCOcy5ydGMsagGQ==} peerDependencies: @@ -3895,9 +2647,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - anser@2.3.5: - resolution: {integrity: sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3910,24 +2659,10 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - ansi-to-react@6.2.6: - resolution: {integrity: sha512-Eqi0iaMK5OZ3jsVFxWvU2B74UZBnGuHlkflKMX6wTOeH+luy9KE2O0gUkc2PxhIP1R4IO0xohv62UMFInQOSeg==} - peerDependencies: - react: ^16.3.2 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.3.2 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - ansis@4.2.0: - resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} - engines: {node: '>=14'} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -3942,10 +2677,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-hidden@1.2.6: - resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} - engines: {node: '>=10'} - aria-query@5.3.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -4044,9 +2775,6 @@ packages: react-native-b4a: optional: true - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -4139,10 +2867,6 @@ packages: bullmq@5.67.3: resolution: {integrity: sha512-eeQobOJn8M0Rj8tcZCVFLrimZgJQallJH1JpclOoyut2nDNkDwTEPMVcZzLeSR2fGeIVbfJTjU96F563Qkge5A==} - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -4175,10 +2899,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} @@ -4188,14 +2908,6 @@ packages: caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - ce-la-react@0.3.2: - resolution: {integrity: sha512-QJ6k4lOD/btI08xG8jBPxRCGXvCnusGGkTsiXk0u3NqUu/W+BXRnFD4PYjwtqh8AWmGa5LDbGk0fLQsqr0nSMA==} - peerDependencies: - react: '>=17.0.0' - chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -4204,34 +2916,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - check-error@2.1.3: resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} - chevrotain-allstar@0.3.1: - resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} - peerDependencies: - chevrotain: ^11.0.0 - - chevrotain@11.1.2: - resolution: {integrity: sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg==} - chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -4246,20 +2934,6 @@ packages: citty@0.2.0: resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} - class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} - - classcat@5.0.5: - resolution: {integrity: sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==} - - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} @@ -4271,23 +2945,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} - cmdk@1.1.1: - resolution: {integrity: sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg==} - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - react-dom: ^18 || ^19 || ^19.0.0-rc - - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -4299,28 +2960,9 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - compress-commons@6.0.2: resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} engines: {node: '>= 14'} @@ -4337,9 +2979,6 @@ packages: resolution: {integrity: sha512-rLSiilO85qHgaTBIIHQpsv8z+NnVfZq3cKuYNCXN1AOqPzced0GWZEe/A517VldRLyQYXUMyV+vszavE2jSAqw==} engines: {node: '>=10'} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} @@ -4347,9 +2986,6 @@ packages: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} - console-table-printer@2.15.0: - resolution: {integrity: sha512-SrhBq4hYVjLCkBVOWaTzceJalvn5K1Zq5aQA6wXC/cYjI3frKWNPEMK3sZsJfNNQApvCQmgBcc13ZKmFj8qExw==} - content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -4358,9 +2994,6 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.2: resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} engines: {node: '>=6.6.0'} @@ -4387,21 +3020,6 @@ packages: resolution: {integrity: sha512-TP/iYTvKKKhRK89on9SRfSMGEw/9SFAAU8EC1kdT5Fmpx7dAwaCNM2+R2H1TSYoQt+03rwOs8QEfNkX8GOHjHQ==} engines: {node: '>= 6'} - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - - cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - - cosmiconfig@9.0.1: - resolution: {integrity: sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - crc-32@1.2.2: resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} engines: {node: '>=0.8'} @@ -4455,162 +3073,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape-fcose@2.2.0: - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.33.1: - resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.2: - resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==} - engines: {node: '>=12'} - - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.1.0: - resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - - d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} - - dagre-d3-es@7.0.13: - resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==} - damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -4634,9 +3096,6 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - dayjs@1.11.19: - resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} - debounce-fn@4.0.0: resolution: {integrity: sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==} engines: {node: '>=10'} @@ -4658,24 +3117,9 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-named-character-reference@1.3.0: - resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} - - dedent@1.7.2: - resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -4687,18 +3131,6 @@ packages: resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} engines: {node: '>=16.0.0'} - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.5.0: - resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} - engines: {node: '>=18'} - define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -4707,10 +3139,6 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -4718,9 +3146,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delaunator@5.0.1: - resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -4744,16 +3169,6 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-node-es@1.1.0: - resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} - engines: {node: '>=0.3.1'} - dingbat-to-unicode@1.0.1: resolution: {integrity: sha512-98l0sW87ZT58pU4i61wa2OHwxbiYSbuxsCBozaVnYX2iCnr3bLM3fIes1/ej7h1YdOKuKt/MLs706TVnALA65w==} @@ -4761,9 +3176,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.3.1: - resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} - dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -4772,10 +3184,6 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.3.1: - resolution: {integrity: sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==} - engines: {node: '>=12'} - dotenv@9.0.2: resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} engines: {node: '>=10'} @@ -4796,10 +3204,6 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - eciesjs@0.4.17: - resolution: {integrity: sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w==} - engines: {bun: '>=1', deno: '>=2', node: '>=16'} - ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -4814,26 +3218,10 @@ packages: electron-to-chromium@1.5.286: resolution: {integrity: sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==} - embla-carousel-react@8.6.0: - resolution: {integrity: sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==} - peerDependencies: - react: ^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - - embla-carousel-reactive-utils@8.6.0: - resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} - peerDependencies: - embla-carousel: 8.6.0 - - embla-carousel@8.6.0: - resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} - emoji-regex-xs@2.0.1: resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} engines: {node: '>=10.0.0'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4859,17 +3247,10 @@ packages: resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} engines: {node: '>=10.13.0'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -4924,9 +3305,6 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-carriage@1.3.1: - resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} - escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} @@ -4934,10 +3312,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - eslint-config-next@15.5.4: resolution: {integrity: sha512-BzgVVuT3kfJes8i2GHenC1SRJ+W3BTML11lAOYFOOPzrk2xp66jBOAGEFRw+3LkYCln5UzvFsLhojrshb5Zfaw==} peerDependencies: @@ -5063,9 +3437,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -5081,12 +3452,6 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -5110,10 +3475,6 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - expect-type@1.3.0: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} @@ -5157,10 +3518,6 @@ packages: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -5200,10 +3557,6 @@ packages: fflate@0.7.4: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -5260,28 +3613,10 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - framer-motion@12.35.0: - resolution: {integrity: sha512-w8hghCMQ4oq10j6aZh3U2yeEQv5K69O/seDI/41PK4HtgkLrcBovUNc0ayBC3UyyU7V1mrY2yLzvYdWJX9pGZQ==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} - fs-extra@11.3.4: - resolution: {integrity: sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA==} - engines: {node: '>=14.14'} - fs-monkey@1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} @@ -5300,12 +3635,6 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - fuzzysort@3.1.0: - resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} - - fzf@0.5.2: - resolution: {integrity: sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q==} - gaxios@7.1.3: resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} engines: {node: '>=18'} @@ -5321,30 +3650,14 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: - resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} - engines: {node: '>=18'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} - get-nonce@1.0.1: - resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} - engines: {node: '>=6'} - - get-own-enumerable-keys@1.0.0: - resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} - engines: {node: '>=14.16'} - get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -5357,10 +3670,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5430,9 +3739,6 @@ packages: resolution: {integrity: sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==} engines: {node: '>=18'} - hachure-fill@0.5.2: - resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} - har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} engines: {node: '>=4'} @@ -5469,48 +3775,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-dom@5.0.1: - resolution: {integrity: sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - - hast-util-from-html@2.0.3: - resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} - - hast-util-from-parse5@8.0.3: - resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} - - hast-util-is-element@3.0.0: - resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.1.0: - resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} - - hast-util-sanitize@5.0.2: - resolution: {integrity: sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==} - - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-to-jsx-runtime@2.3.6: - resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} - - hast-util-to-parse5@8.0.1: - resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} - - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@9.0.1: - resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} - headers-polyfill@4.0.3: resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} @@ -5525,12 +3789,6 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - html-url-attributes@3.0.1: - resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -5547,13 +3805,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true iconv-lite@0.7.2: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} @@ -5593,20 +3848,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inline-style-parser@0.2.7: - resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - intl-messageformat@11.1.2: resolution: {integrity: sha512-ucSrQmZGAxfiBHfBRXW/k7UC8MaGFlEj4Ry1tKiDcmgwQm1y3EDl40u+4VNHYomxJQMJi9NEI3riDRlth96jKg==} @@ -5622,19 +3867,10 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -5666,19 +3902,11 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} hasBin: true - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -5699,22 +3927,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -5723,10 +3935,6 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} - is-network-error@1.3.1: - resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} - engines: {node: '>=16'} - is-node-process@1.2.0: resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} @@ -5742,14 +3950,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - is-obj@3.0.0: - resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} - engines: {node: '>=12'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -5760,10 +3960,6 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-regexp@3.1.0: - resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==} - engines: {node: '>=12'} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -5776,10 +3972,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -5795,14 +3987,6 @@ packages: is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -5819,10 +4003,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-wsl@3.1.1: - resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} - engines: {node: '>=16'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -5832,10 +4012,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.5: - resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} - engines: {node: '>=18'} - isstream@0.1.2: resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} @@ -5881,9 +4057,6 @@ packages: jose@6.2.0: resolution: {integrity: sha512-xsfE1TcSCbUdo6U07tR0mvhg0flGxU8tPLbF03mirl2ukGQENhUg4ubGYQnhVH0b5stLlPM+WOqDkEl1R1y5sQ==} - js-tiktoken@1.0.21: - resolution: {integrity: sha512-biOj/6M5qdgx5TKjDnFT1ymSpM5tbd3ylwDtrQvFQSu0Z7bBYko2dF+W/aUkXUPuk6IVpRxk/3Q2sHOzGlS36g==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5894,11 +4067,6 @@ packages: jsbn@0.1.1: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - json-bigint@1.0.0: resolution: {integrity: sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==} @@ -5938,9 +4106,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - jsonrepair@3.13.2: resolution: {integrity: sha512-Leuly0nbM4R+S5SVJk3VHfw1oxnlEK9KygdZvfUtEtTawNDyzB4qa1xWTmFt1aeoA7sXZkVTRuIixJ8bAvqVUg==} hasBin: true @@ -5962,45 +4127,13 @@ packages: jws@4.0.1: resolution: {integrity: sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==} - katex@0.16.33: - resolution: {integrity: sha512-q3N5u+1sY9Bu7T4nlXoiRBXWfwSefNGoKeOwekV+gw0cAXQlz2Ww6BLcmBxVDeXBMUDQv6fK5bcNaJLxob3ZQA==} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - langium@4.2.1: - resolution: {integrity: sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==} - engines: {node: '>=20.10.0', npm: '>=10.2.3'} - - langsmith@0.5.7: - resolution: {integrity: sha512-FjYf2oBGMoSXnaT4SRaFguIiGJaonZ5VKWKJDPl9awLZjz2RkN29AcQWceecSINVzXzTvtRWPOjAWT+XggqNNg==} - peerDependencies: - '@opentelemetry/api': '*' - '@opentelemetry/exporter-trace-otlp-proto': '*' - '@opentelemetry/sdk-trace-base': '*' - openai: '*' - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@opentelemetry/exporter-trace-otlp-proto': - optional: true - '@opentelemetry/sdk-trace-base': - optional: true - openai: - optional: true - language-subtag-registry@0.3.23: resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} @@ -6008,12 +4141,6 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -6102,12 +4229,6 @@ packages: linebreak@1.1.0: resolution: {integrity: sha512-MHp03UImeVhB7XZtjd0E4n6+3xr5Dq/9xI/5FptGk5FrbDR3zagPa2DS6U8ks/3HjbKWG9Q1M2ufOzxV2qLYSQ==} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - loader-runner@4.3.1: resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} @@ -6124,9 +4245,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.23: - resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} - lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -6142,16 +4260,9 @@ packages: lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -6169,9 +4280,6 @@ packages: resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} engines: {node: 20 || >=22} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -6208,74 +4316,10 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - markdown-table@3.0.4: - resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - - marked@16.4.2: - resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} - engines: {node: '>= 20'} - hasBin: true - - marked@17.0.4: - resolution: {integrity: sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==} - engines: {node: '>= 20'} - hasBin: true - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdast-util-find-and-replace@3.0.2: - resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} - - mdast-util-from-markdown@2.0.3: - resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} - - mdast-util-gfm-autolink-literal@2.0.1: - resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} - - mdast-util-gfm-footnote@2.1.0: - resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.1.0: - resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} - - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - - mdast-util-mdx-expression@2.0.1: - resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} - - mdast-util-mdx-jsx@3.2.0: - resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - - mdast-util-phrasing@4.1.0: - resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - - mdast-util-to-markdown@2.1.2: - resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - media-chrome@4.18.0: - resolution: {integrity: sha512-OQmpUCeMMWtUcbar3CiY7V0S6j43HaDhwa6uRUyYiWdfPIj3riWp0agu3x6EcIlDRFIf8iDGZiGeb26ll+mz0g==} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} @@ -6298,125 +4342,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - mermaid@11.12.3: - resolution: {integrity: sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==} - - micromark-core-commonmark@2.0.3: - resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - - micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3: - resolution: {integrity: sha512-gSPnxgHDDqXYOBvQRq6lerrq9mjDhdtKn+7XETuXjxWcL62yZEfUdA28Ml1I2vDIPfAOIKLa0h2XDSGkInGHFQ==} - engines: {node: '>=16'} - peerDependencies: - micromark: ^4.0.0 - micromark-util-types: ^2.0.0 - peerDependenciesMeta: - micromark-util-types: - optional: true - - micromark-extension-cjk-friendly-util@2.1.1: - resolution: {integrity: sha512-egs6+12JU2yutskHY55FyR48ZiEcFOJFyk9rsiyIhcJ6IvWB6ABBqVrBw8IobqJTDZ/wdSr9eoXDPb5S2nW1bg==} - engines: {node: '>=16'} - peerDependencies: - micromark-util-types: '*' - peerDependenciesMeta: - micromark-util-types: - optional: true - - micromark-extension-cjk-friendly@1.2.3: - resolution: {integrity: sha512-gRzVLUdjXBLX6zNPSnHGDoo+ZTp5zy+MZm0g3sv+3chPXY7l9gW+DnrcHcZh/jiPR6MjPKO4AEJNp4Aw6V9z5Q==} - engines: {node: '>=16'} - peerDependencies: - micromark: ^4.0.0 - micromark-util-types: ^2.0.0 - peerDependenciesMeta: - micromark-util-types: - optional: true - - micromark-extension-gfm-autolink-literal@2.1.0: - resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - - micromark-extension-gfm-footnote@2.1.0: - resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - - micromark-extension-gfm-strikethrough@2.1.0: - resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - - micromark-extension-gfm-table@2.1.1: - resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.1.0: - resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - - micromark-factory-destination@2.0.1: - resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - - micromark-factory-label@2.0.1: - resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - - micromark-factory-space@2.0.1: - resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - - micromark-factory-title@2.0.1: - resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - - micromark-factory-whitespace@2.0.1: - resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - - micromark-util-character@2.1.1: - resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - - micromark-util-chunked@2.0.1: - resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - - micromark-util-classify-character@2.0.1: - resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - - micromark-util-combine-extensions@2.0.1: - resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - - micromark-util-decode-numeric-character-reference@2.0.2: - resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - - micromark-util-decode-string@2.0.1: - resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - - micromark-util-encode@2.0.1: - resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - - micromark-util-html-tag-name@2.0.1: - resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - - micromark-util-normalize-identifier@2.0.1: - resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - - micromark-util-resolve-all@2.0.1: - resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - - micromark-util-sanitize-uri@2.0.1: - resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - - micromark-util-subtokenize@2.1.0: - resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - - micromark-util-symbol@2.0.1: - resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - - micromark-util-types@2.0.2: - resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - - micromark@4.0.2: - resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -6445,10 +4370,6 @@ packages: resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} engines: {node: '>=8'} - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - minimatch@10.1.2: resolution: {integrity: sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw==} engines: {node: 20 || >=22} @@ -6478,29 +4399,6 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.1: - resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} - - motion-dom@12.35.0: - resolution: {integrity: sha512-FFMLEnIejK/zDABn+vqGVAUN4T0+3fw+cVAY8MMT65yR+j5uMuvWdd4npACWhh94OVWQs79CrBBuwOwGRZAQiA==} - - motion-utils@12.29.2: - resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} - - motion@12.35.0: - resolution: {integrity: sha512-BQUhNUIGvUcwXCzwmnT1JpjUqab34lIwxHnXUyWRht1WC1vAyp7/4qgMiUXxN3K6hgUhyoR+HNnLeQMwUZjVjw==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -6521,10 +4419,6 @@ packages: typescript: optional: true - mustache@4.2.0: - resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} - hasBin: true - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -6542,11 +4436,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - nanoid@5.1.6: - resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} - engines: {node: ^18 || >=20} - hasBin: true - napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -6643,10 +4532,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - nypm@0.6.5: resolution: {integrity: sha512-K6AJy1GMVyfyMXRVB88700BJqNUkByijGJM8kEHpLdcAt+vSQAVfkWWHYzuRXHSY6xA2sNc5RjTj0p9rE2izVQ==} engines: {node: '>=18'} @@ -6674,10 +4559,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object-treeify@1.1.33: - resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} - engines: {node: '>= 10'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -6716,20 +4597,6 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - oniguruma-parser@0.12.1: - resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==} - - oniguruma-to-es@4.3.4: - resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==} - - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} - engines: {node: '>=20'} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -6756,10 +4623,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - ora@8.2.0: - resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} - engines: {node: '>=18'} - outvariant@1.4.3: resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} @@ -6767,10 +4630,6 @@ packages: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6787,26 +4646,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-queue@9.1.0: - resolution: {integrity: sha512-O/ZPaXuQV29uSLbxWBGGZO1mCQXV2BLIwUr59JUU9SoH76mnYvtms7aafH/isNSNGwuEfP6W/4xD0/TJXxrizw==} - engines: {node: '>=20'} - - p-retry@7.1.1: - resolution: {integrity: sha512-J5ApzjyRkkf601HpEeykoiCvzHQjWxPAHhyjFcEUP2SWq0+35NKh8TLhpLw+Dkq5TZBFvUM6UigdE9hIVYTl5w==} - engines: {node: '>=20'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - p-timeout@7.0.1: - resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} - engines: {node: '>=20'} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6814,9 +4653,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.6.0: - resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} - pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} @@ -6830,30 +4666,10 @@ packages: parse-css-color@0.2.1: resolution: {integrity: sha512-bwS/GGIFV3b6KS4uwpzCFj4w297Yl3uqnSgIPsoQkx7GMLROXfMnWvxfNkL0oh8HVhZA4hvJoEoEIqonfJ3BWg==} - parse-entities@4.0.2: - resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - - parse5@7.3.0: - resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - - path-data-parser@0.1.0: - resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -6870,10 +4686,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -6925,9 +4737,6 @@ packages: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} @@ -6938,12 +4747,6 @@ packages: po-parser@2.1.1: resolution: {integrity: sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ==} - points-on-curve@0.2.0: - resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} - - points-on-path@0.2.1: - resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -6987,10 +4790,6 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} - preact-render-to-string@5.2.6: resolution: {integrity: sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==} peerDependencies: @@ -7006,10 +4805,6 @@ packages: pretty-format@3.8.0: resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - prisma@6.19.2: resolution: {integrity: sha512-XTKeKxtQElcq3U9/jHyxSPgiRgeYDKxWTPOf6NkXA0dNj5j40MfEsZkMbyNpwDWCUv7YBFUl7I2VK/6ALbmhEg==} engines: {node: '>=18.18'} @@ -7034,9 +4829,6 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - property-information@7.1.0: - resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} - protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} engines: {node: '>=12.0.0'} @@ -7069,19 +4861,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - radix-ui@1.4.3: - resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} - 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 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -7096,10 +4875,10 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + react-dom@19.2.4: + resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: - react: ^19.1.0 + react: ^19.2.4 react-grab@0.1.20: resolution: {integrity: sha512-Sa3l6X4ooMBTHRXN7kA2jX6v/Yl3upKQconTBMeL68lsf8pPP6AWNASXtONxujM5RXWM+ysvjVK2VDFcTrvQPw==} @@ -7119,49 +4898,12 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-jsx-parser@2.4.1: - resolution: {integrity: sha512-gE25DiHseuKmSbb5O1K1IkyQ/bwth3zl4z3EdW8XMhwrb2agUpuh8GvqHFvGwh/wdZjDDuadGrSR2lEgjcOvqQ==} - engines: {bun: ^1.1.27} - peerDependencies: - react: '>=18' - react-dom: '>=18' - react-refresh@0.9.0: resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} engines: {node: '>=0.10.0'} - react-remove-scroll-bar@2.3.8: - resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - - react-remove-scroll@2.7.2: - resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react-style-singleton@2.2.3: - resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} + react@19.2.4: + resolution: {integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==} engines: {node: '>=0.10.0'} readable-stream@2.3.8: @@ -7197,69 +4939,10 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - rehype-harden@1.1.8: - resolution: {integrity: sha512-Qn7vR1xrf6fZCrkm9TDWi/AB4ylrHy+jqsNm1EHOAmbARYA6gsnVJBq/sdBh6kmT4NEZxH5vgIjrscefJAOXcw==} - - rehype-katex@7.0.1: - resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} - - remark-cjk-friendly-gfm-strikethrough@1.2.3: - resolution: {integrity: sha512-bXfMZtsaomK6ysNN/UGRIcasQAYkC10NtPmP0oOHOV8YOhA2TXmwRXCku4qOzjIFxAPfish5+XS0eIug2PzNZA==} - engines: {node: '>=16'} - peerDependencies: - '@types/mdast': ^4.0.0 - unified: ^11.0.0 - peerDependenciesMeta: - '@types/mdast': - optional: true - - remark-cjk-friendly@1.2.3: - resolution: {integrity: sha512-UvAgxwlNk+l9Oqgl/9MWK2eWRS7zgBW/nXX9AthV7nd/3lNejF138E7Xbmk9Zs4WjTJGs721r7fAEc7tNFoH7g==} - engines: {node: '>=16'} - peerDependencies: - '@types/mdast': ^4.0.0 - unified: ^11.0.0 - peerDependenciesMeta: - '@types/mdast': - optional: true - - remark-gfm@4.0.1: - resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} - - remark-math@6.0.0: - resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-rehype@11.1.2: - resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - remend@1.2.1: - resolution: {integrity: sha512-4wC12bgXsfKAjF1ewwkNIQz5sqewz/z1xgIgjEMb3r1pEytQ37F0Cm6i+OhbTWEvguJD7lhOUJhK5fSasw9f0w==} - remotion@4.0.419: resolution: {integrity: sha512-h00WpNrcksePPfpyC5RZhZKBIUqGWERN6RTtVjLWvHijTpGKgO0LkXkCpihzJ5y2l+V2CIOvRINl/KykcaQDRg==} peerDependencies: @@ -7295,10 +4978,6 @@ packages: resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} hasBin: true - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - rettime@0.10.1: resolution: {integrity: sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw==} @@ -7318,31 +4997,18 @@ packages: robot3@0.4.1: resolution: {integrity: sha512-hzjy826lrxzx8eRgv80idkf8ua1JAepRc9Efdtj03N3KNJuznQCPlyCJ7gnUmDFwZCLQjxy567mQVKmdv2BsXQ==} - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.59.0: resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - roughjs@4.6.6: - resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - router@2.2.0: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -7371,8 +5037,8 @@ packages: resolution: {integrity: sha512-ZvHN3ygzZ8FuxjSNB+mKBiF/NIoqHzlBGbD0MJiT+MvSsFOvotnWOhdTjxKzhHRT2wPC1QbhLzx2q/Y83VhfYQ==} engines: {node: '>=16'} - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -7443,10 +5109,6 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - shadcn@3.8.5: - resolution: {integrity: sha512-jPRx44e+eyeV7xwY3BLJXcfrks00+M0h5BGB9l6DdcBW4BpAj4x3lVmVy0TXPEs2iHEisxejr62sZAAw6B1EVA==} - hasBin: true - sharp@0.34.5: resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -7463,13 +5125,6 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - shiki@3.23.0: - resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==} - - shiki@4.0.1: - resolution: {integrity: sha512-EkAEhDTN5WhpoQFXFw79OHIrSAfHhlImeCdSyg4u4XvrpxKEmdo/9x/HWSowujAnUrFsGOwWiE58a6GVentMnQ==} - engines: {node: '>=20'} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -7496,9 +5151,6 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-wcswidth@1.1.2: - resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} - sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -7525,9 +5177,6 @@ packages: engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -7556,20 +5205,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} - streamdown@2.3.0: - resolution: {integrity: sha512-OqS3by/lt91lSicE8RQP2nTsYI6Q/dQgGP2vcyn9YesCmRHhNjswAuBAZA1z0F4+oBU3II/eV51LqjCqwTb1lw==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - streamx@2.23.0: resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} @@ -7584,10 +5223,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - string.prototype.codepointat@0.2.1: resolution: {integrity: sha512-2cBVCj6I4IOvEnjgO/hWqXjqBGsY+zwPmHl12Srk9IXSZ56Jwwmy+66XO5Iut/oQVR7t5ihYdLB0GMa4alEUcg==} @@ -7620,13 +5255,6 @@ packages: string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - - stringify-object@5.0.0: - resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==} - engines: {node: '>=14.16'} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -7643,10 +5271,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -7663,12 +5287,6 @@ packages: peerDependencies: webpack: ^5.27.0 - style-to-js@1.1.21: - resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} - - style-to-object@1.0.14: - resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} - styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -7682,9 +5300,6 @@ packages: babel-plugin-macros: optional: true - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -7706,9 +5321,6 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwind-merge@3.5.0: - resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} - tailwindcss@4.1.18: resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} @@ -7798,9 +5410,6 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tokenlens@1.3.1: - resolution: {integrity: sha512-7oxmsS5PNCX3z+b+z07hL5vCzlgHKkCGrEQjQmWl5l+v5cUrtL7S1cuST4XThaL1XyjbTX8J5hfP0cjDJRkaLA==} - tough-cookie@2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -7816,32 +5425,15 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.2.0: - resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} - ts-api-utils@2.4.0: resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-morph@26.0.0: - resolution: {integrity: sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==} - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -7853,9 +5445,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tw-animate-css@1.4.0: - resolution: {integrity: sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==} - tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} @@ -7892,12 +5481,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -7915,38 +5498,6 @@ packages: unicode-trie@2.0.0: resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - unified@11.0.5: - resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - - unist-util-is@6.0.1: - resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@6.0.2: - resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} - - unist-util-visit@5.1.0: - resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} @@ -7966,36 +5517,11 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-callback-ref@1.3.3: - resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - use-intl@4.8.2: resolution: {integrity: sha512-3VNXZgDnPFqhIYosQ9W1Hc6K5q+ZelMfawNbexdwL/dY7BTHbceLUBX5Eeex9lgogxTp0pf1SjHuhYNAjr9H3g==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 - use-sidecar@1.1.3: - resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - use-stick-to-bottom@1.1.3: - resolution: {integrity: sha512-GgRLdeGhxBxpcbrBbEIEoOKUQ9d46/eaSII+wyv1r9Du+NbCn1W/OE+VddefvRP4+5w/1kATN/6g2/BAC/yowQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - use-sync-external-store@1.6.0: resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: @@ -8004,18 +5530,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} - hasBin: true - uuid@11.1.0: resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} hasBin: true - uuid@13.0.0: - resolution: {integrity: sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==} - hasBin: true - uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -8025,10 +5543,6 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - validate-npm-package-name@7.0.2: - resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} - engines: {node: ^20.17.0 || >=22.9.0} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -8037,15 +5551,6 @@ packages: resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} engines: {'0': node >=0.6.0} - vfile-location@5.0.3: - resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@2.1.9: resolution: {integrity: sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -8107,33 +5612,10 @@ packages: jsdom: optional: true - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true - - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} - watchpack@2.5.1: resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -8179,11 +5661,6 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} - hasBin: true - why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -8232,10 +5709,6 @@ packages: utf-8-validate: optional: true - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} - engines: {node: '>=20'} - xmlbuilder@10.1.1: resolution: {integrity: sha512-OyzrcFLL/nb6fMGHbiRDuPup9ljBycsdCypwuyg5AAHvyWzGfChJpCXMG88AGTIMFhGZ9RccFN1e6lhg3hkwKg==} engines: {node: '>=4.0'} @@ -8244,9 +5717,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -8269,10 +5739,6 @@ packages: resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} engines: {node: '>=18'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} @@ -8291,79 +5757,51 @@ packages: zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - - zustand@4.5.7: - resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} - engines: {node: '>=12.7.0'} - peerDependencies: - '@types/react': '>=16.8' - immer: '>=9.0.6' - react: '>=16.8' - peerDependenciesMeta: - '@types/react': - optional: true - immer: - optional: true - react: - optional: true - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - snapshots: - '@ai-sdk/gateway@3.0.39(zod@3.22.3)': + '@ai-sdk/gateway@3.0.66(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@3.22.3) + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) '@vercel/oidc': 3.1.0 - zod: 3.22.3 + zod: 3.25.76 - '@ai-sdk/gateway@3.0.66(zod@3.22.3)': + '@ai-sdk/google@3.0.22(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.22.3) - '@vercel/oidc': 3.1.0 - zod: 3.22.3 + '@ai-sdk/provider-utils': 4.0.14(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/google@3.0.22(zod@3.22.3)': + '@ai-sdk/openai@3.0.26(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@3.22.3) - zod: 3.22.3 + '@ai-sdk/provider-utils': 4.0.14(zod@3.25.76) + zod: 3.25.76 - '@ai-sdk/openai@3.0.26(zod@3.22.3)': - dependencies: - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@3.22.3) - zod: 3.22.3 - - '@ai-sdk/provider-utils@4.0.14(zod@3.22.3)': + '@ai-sdk/provider-utils@4.0.14(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 - zod: 3.22.3 + zod: 3.25.76 - '@ai-sdk/provider-utils@4.0.19(zod@3.22.3)': + '@ai-sdk/provider-utils@4.0.19(zod@3.25.76)': dependencies: '@ai-sdk/provider': 3.0.8 '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 - zod: 3.22.3 + zod: 3.25.76 '@ai-sdk/provider@3.0.8': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@3.0.118(react@19.1.0)(zod@3.22.3)': + '@ai-sdk/react@3.0.118(react@19.2.4)(zod@3.25.76)': dependencies: - '@ai-sdk/provider-utils': 4.0.19(zod@3.22.3) - ai: 6.0.116(zod@3.22.3) - react: 19.1.0 - swr: 2.4.1(react@19.1.0) + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) + ai: 6.0.116(zod@3.25.76) + react: 19.2.4 + swr: 2.4.1(react@19.2.4) throttleit: 2.1.0 transitivePeerDependencies: - zod @@ -8375,18 +5813,6 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@antfu/install-pkg@1.1.0': - dependencies: - package-manager-detector: 1.6.0 - tinyexec: 1.0.2 - - '@antfu/ni@25.0.0': - dependencies: - ansis: 4.2.0 - fzf: 0.5.2 - package-manager-detector: 1.6.0 - tinyexec: 1.0.2 - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -8847,125 +6273,10 @@ snapshots: '@aws/lambda-invoke-store@0.2.3': {} - '@babel/code-frame@7.29.0': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.0': {} - - '@babel/core@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.29.1': - dependencies: - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.29.0 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.29.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.29.0 - - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-replace-supers@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.29.0 - '@babel/types': 7.29.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.27.1': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - '@babel/parser@7.24.1': dependencies: '@babel/types': 7.29.0 @@ -8974,66 +6285,8 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.0) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.28.5(@babel/core@7.29.0)': - dependencies: - '@babel/core': 7.29.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.29.0) - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - transitivePeerDependencies: - - supports-color - '@babel/runtime@7.28.6': {} - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/types': 7.29.0 - - '@babel/traverse@7.29.0': - dependencies: - '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.1 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 - '@babel/template': 7.28.6 - '@babel/types': 7.29.0 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9041,8 +6294,6 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@braintree/sanitize-url@7.1.2': {} - '@bull-board/api@6.17.0(@bull-board/ui@6.17.0)': dependencies: '@bull-board/ui': 6.17.0 @@ -9061,66 +6312,34 @@ snapshots: dependencies: '@bull-board/api': 6.17.0(@bull-board/ui@6.17.0) - '@cfworker/json-schema@4.1.1': {} + '@cfworker/json-schema@4.1.1': + optional: true - '@chevrotain/cst-dts-gen@11.1.2': + '@dnd-kit/accessibility@3.1.1(react@19.2.4)': dependencies: - '@chevrotain/gast': 11.1.2 - '@chevrotain/types': 11.1.2 - lodash-es: 4.17.23 - - '@chevrotain/gast@11.1.2': - dependencies: - '@chevrotain/types': 11.1.2 - lodash-es: 4.17.23 - - '@chevrotain/regexp-to-ast@11.1.2': {} - - '@chevrotain/types@11.1.2': {} - - '@chevrotain/utils@11.1.2': {} - - '@dnd-kit/accessibility@3.1.1(react@19.1.0)': - dependencies: - react: 19.1.0 + react: 19.2.4 tslib: 2.8.1 - '@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@dnd-kit/accessibility': 3.1.1(react@19.1.0) - '@dnd-kit/utilities': 3.2.2(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + '@dnd-kit/accessibility': 3.1.1(react@19.2.4) + '@dnd-kit/utilities': 3.2.2(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@dnd-kit/utilities': 3.2.2(react@19.1.0) - react: 19.1.0 + '@dnd-kit/core': 6.3.1(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@dnd-kit/utilities': 3.2.2(react@19.2.4) + react: 19.2.4 tslib: 2.8.1 - '@dnd-kit/utilities@3.2.2(react@19.1.0)': + '@dnd-kit/utilities@3.2.2(react@19.2.4)': dependencies: - react: 19.1.0 + react: 19.2.4 tslib: 2.8.1 - '@dotenvx/dotenvx@1.52.0': - dependencies: - commander: 11.1.0 - dotenv: 17.3.1 - eciesjs: 0.4.17 - execa: 5.1.1 - fdir: 6.5.0(picomatch@4.0.3) - ignore: 5.3.2 - object-treeify: 1.1.33 - picomatch: 4.0.3 - which: 4.0.0 - - '@ecies/ciphers@0.2.5(@noble/ciphers@1.3.0)': - dependencies: - '@noble/ciphers': 1.3.0 - '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 @@ -9413,23 +6632,6 @@ snapshots: eventsource-parser: 1.1.2 robot3: 0.4.1 - '@floating-ui/core@1.7.5': - dependencies: - '@floating-ui/utils': 0.2.11 - - '@floating-ui/dom@1.7.6': - dependencies: - '@floating-ui/core': 1.7.5 - '@floating-ui/utils': 0.2.11 - - '@floating-ui/react-dom@2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@floating-ui/dom': 1.7.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@floating-ui/utils@0.2.11': {} - '@formatjs/ecma402-abstract@3.1.1': dependencies: '@formatjs/fast-memoize': 3.1.0 @@ -9461,13 +6663,13 @@ snapshots: '@formatjs/fast-memoize': 3.1.0 tslib: 2.8.1 - '@google/genai@1.40.0(@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.22.3))': + '@google/genai@1.40.0(@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76))': dependencies: google-auth-library: 10.5.0 protobufjs: 7.5.4 ws: 8.19.0 optionalDependencies: - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.22.3) + '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76) transitivePeerDependencies: - bufferutil - supports-color @@ -9476,6 +6678,7 @@ snapshots: '@hono/node-server@1.19.11(hono@4.12.5)': dependencies: hono: 4.12.5 + optional: true '@humanfs/core@0.19.1': {} @@ -9488,14 +6691,6 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify/types@2.0.0': {} - - '@iconify/utils@3.1.0': - dependencies: - '@antfu/install-pkg': 1.1.0 - '@iconify/types': 2.0.0 - mlly: 1.8.1 - '@img/colour@1.0.0': {} '@img/sharp-darwin-arm64@0.34.5': @@ -9592,7 +6787,8 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/ansi@1.0.2': {} + '@inquirer/ansi@1.0.2': + optional: true '@inquirer/confirm@5.1.21(@types/node@20.19.33)': dependencies: @@ -9600,6 +6796,7 @@ snapshots: '@inquirer/type': 3.0.10(@types/node@20.19.33) optionalDependencies: '@types/node': 20.19.33 + optional: true '@inquirer/core@10.3.2(@types/node@20.19.33)': dependencies: @@ -9613,12 +6810,15 @@ snapshots: yoctocolors-cjs: 2.1.3 optionalDependencies: '@types/node': 20.19.33 + optional: true - '@inquirer/figures@1.0.15': {} + '@inquirer/figures@1.0.15': + optional: true '@inquirer/type@3.0.10(@types/node@20.19.33)': optionalDependencies: '@types/node': 20.19.33 + optional: true '@ioredis/commands@1.5.0': {} @@ -9663,86 +6863,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3))': - dependencies: - '@cfworker/json-schema': 4.1.1 - '@standard-schema/spec': 1.1.0 - ansi-styles: 5.2.0 - camelcase: 6.3.0 - decamelize: 1.2.0 - js-tiktoken: 1.0.21 - langsmith: 0.5.7(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)) - mustache: 4.2.0 - p-queue: 6.6.2 - uuid: 11.1.0 - zod: 4.3.6 - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - openai - - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)))': - dependencies: - '@langchain/core': 1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)) - uuid: 10.0.0 - - '@langchain/langgraph-sdk@1.6.5(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@types/json-schema': 7.0.15 - p-queue: 9.1.0 - p-retry: 7.1.1 - uuid: 13.0.0 - optionalDependencies: - '@langchain/core': 1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - '@langchain/langgraph@1.2.0(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod-to-json-schema@3.25.1(zod@3.22.3))(zod@3.22.3)': - dependencies: - '@langchain/core': 1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)) - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3))) - '@langchain/langgraph-sdk': 1.6.5(@langchain/core@1.1.30(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@standard-schema/spec': 1.1.0 - uuid: 10.0.0 - zod: 3.22.3 - optionalDependencies: - zod-to-json-schema: 3.25.1(zod@3.22.3) - transitivePeerDependencies: - - react - - react-dom - '@medv/finder@4.0.2': {} - '@mermaid-js/parser@1.0.0': - dependencies: - langium: 4.2.1 - - '@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.22.3)': - dependencies: - '@hono/node-server': 1.19.11(hono@4.12.5) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.6 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 8.2.1(express@5.2.1) - hono: 4.12.5 - jose: 6.2.0 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 3.22.3 - zod-to-json-schema: 3.25.1(zod@3.22.3) - optionalDependencies: - '@cfworker/json-schema': 4.1.1 - transitivePeerDependencies: - - supports-color - optional: true - '@modelcontextprotocol/sdk@1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76)': dependencies: '@hono/node-server': 1.19.11(hono@4.12.5) @@ -9766,6 +6888,7 @@ snapshots: '@cfworker/json-schema': 4.1.1 transitivePeerDependencies: - supports-color + optional: true '@msgpack/msgpack@3.1.3': {} @@ -9795,6 +6918,7 @@ snapshots: is-node-process: 1.2.0 outvariant: 1.4.3 strict-event-emitter: 0.5.1 + optional: true '@napi-rs/wasm-runtime@0.2.12': dependencies: @@ -9803,10 +6927,10 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(next-auth@4.24.13(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0))': + '@next-auth/prisma-adapter@1.0.7(@prisma/client@6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3))(next-auth@4.24.13(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4))': dependencies: '@prisma/client': 6.19.2(prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3))(typescript@5.9.3) - next-auth: 4.24.13(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next-auth: 4.24.13(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@next/env@15.5.12': {} @@ -9838,14 +6962,6 @@ snapshots: '@next/swc-win32-x64-msvc@15.5.12': optional: true - '@noble/ciphers@1.3.0': {} - - '@noble/curves@1.9.7': - dependencies: - '@noble/hashes': 1.8.0 - - '@noble/hashes@1.8.0': {} - '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -9860,18 +6976,21 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@open-draft/deferred-promise@2.2.0': {} + '@open-draft/deferred-promise@2.2.0': + optional: true '@open-draft/logger@0.3.0': dependencies: is-node-process: 1.2.0 outvariant: 1.4.3 + optional: true - '@open-draft/until@2.1.0': {} + '@open-draft/until@2.1.0': + optional: true '@openrouter/sdk@0.3.16': dependencies: - zod: 4.3.6 + zod: 3.25.76 '@opentelemetry/api@1.9.0': {} @@ -9998,766 +7117,19 @@ snapshots: '@protobufjs/utf8@1.1.0': {} - '@radix-ui/number@1.1.1': {} - - '@radix-ui/primitive@1.1.3': {} - - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-context@1.1.2(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-direction@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-id@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@floating-ui/react-dom': 2.1.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/rect': 1.1.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - aria-hidden: 1.2.6 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-remove-scroll: 2.7.2(@types/react@19.2.13)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/number': 1.1.1 - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-slot@1.2.3(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - use-sync-external-store: 1.6.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/rect': 1.1.1 - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.13)(react@19.1.0)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - react: 19.1.0 - optionalDependencies: - '@types/react': 19.2.13 - - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - - '@radix-ui/rect@1.1.1': {} - - '@remotion/bundler@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/bundler@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@remotion/media-parser': 4.0.419 - '@remotion/studio': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio-shared': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - css-loader: 5.2.7(webpack@5.96.1(esbuild@0.25.0)) + '@remotion/studio': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + css-loader: 5.2.7(webpack@5.96.1) esbuild: 0.25.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) react-refresh: 0.9.0 - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) source-map: 0.7.3 - style-loader: 4.0.0(webpack@5.96.1(esbuild@0.25.0)) + style-loader: 4.0.0(webpack@5.96.1) webpack: 5.96.1(esbuild@0.25.0) transitivePeerDependencies: - '@swc/core' @@ -10767,21 +7139,21 @@ snapshots: - utf-8-validate - webpack-cli - '@remotion/cli@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/cli@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@remotion/bundler': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/media-utils': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/player': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/renderer': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio-server': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio-shared': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@remotion/bundler': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/media-utils': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-server': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) dotenv: 9.0.2 minimist: 1.2.6 prompts: 2.4.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@swc/core' - bufferutil @@ -10815,30 +7187,30 @@ snapshots: '@remotion/media-parser@4.0.419': {} - '@remotion/media-utils@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/media-utils@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@remotion/media-parser': 4.0.419 '@remotion/webcodecs': 4.0.419 mediabunny: 1.29.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@remotion/player@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/player@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@remotion/renderer@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/renderer@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@remotion/licensing': 4.0.419 '@remotion/streaming': 4.0.419 execa: 5.1.1 extract-zip: 2.0.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) source-map: 0.8.0-beta.0 ws: 8.17.1 optionalDependencies: @@ -10856,16 +7228,16 @@ snapshots: '@remotion/streaming@4.0.419': {} - '@remotion/studio-server@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/studio-server@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/parser': 7.24.1 - '@remotion/bundler': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/renderer': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio-shared': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@remotion/bundler': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) memfs: 3.4.3 open: 8.4.2 recast: 0.23.11 - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) semver: 7.5.3 source-map: 0.7.3 transitivePeerDependencies: @@ -10878,27 +7250,27 @@ snapshots: - utf-8-validate - webpack-cli - '@remotion/studio-shared@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/studio-shared@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - react - react-dom - '@remotion/studio@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/studio@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@remotion/media-utils': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/player': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/renderer': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/studio-shared': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/web-renderer': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@remotion/zod-types': 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@3.22.3) + '@remotion/media-utils': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/player': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/renderer': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/studio-shared': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/web-renderer': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@remotion/zod-types': 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.22.3) mediabunny: 1.29.0 memfs: 3.4.3 open: 8.4.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) semver: 7.5.3 source-map: 0.7.3 zod: 3.22.3 @@ -10907,21 +7279,21 @@ snapshots: - supports-color - utf-8-validate - '@remotion/web-renderer@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@remotion/web-renderer@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@remotion/licensing': 4.0.419 mediabunny: 1.29.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@remotion/webcodecs@4.0.419': dependencies: '@remotion/media-parser': 4.0.419 - '@remotion/zod-types@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(zod@3.22.3)': + '@remotion/zod-types@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(zod@3.22.3)': dependencies: - remotion: 4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + remotion: 4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4) zod: 3.22.3 transitivePeerDependencies: - react @@ -10929,13 +7301,6 @@ snapshots: '@resvg/resvg-wasm@2.4.0': {} - '@rive-app/react-webgl2@4.27.0(react@19.1.0)': - dependencies: - '@rive-app/webgl2': 2.35.0 - react: 19.1.0 - - '@rive-app/webgl2@2.35.0': {} - '@rollup/rollup-android-arm-eabi@4.59.0': optional: true @@ -11017,86 +7382,11 @@ snapshots: '@schummar/icu-type-parser@1.21.5': {} - '@sec-ant/readable-stream@0.4.1': {} - - '@shikijs/core@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/core@4.0.1': - dependencies: - '@shikijs/primitive': 4.0.1 - '@shikijs/types': 4.0.1 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 - - '@shikijs/engine-javascript@4.0.1': - dependencies: - '@shikijs/types': 4.0.1 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 4.3.4 - - '@shikijs/engine-oniguruma@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/engine-oniguruma@4.0.1': - dependencies: - '@shikijs/types': 4.0.1 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - - '@shikijs/langs@4.0.1': - dependencies: - '@shikijs/types': 4.0.1 - - '@shikijs/primitive@4.0.1': - dependencies: - '@shikijs/types': 4.0.1 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/themes@3.23.0': - dependencies: - '@shikijs/types': 3.23.0 - - '@shikijs/themes@4.0.1': - dependencies: - '@shikijs/types': 4.0.1 - - '@shikijs/types@3.23.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/types@4.0.1': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - '@shikijs/vscode-textmate@10.0.2': {} - '@shuding/opentype.js@1.4.0-beta.0': dependencies: fflate: 0.7.4 string.prototype.codepointat: 0.2.1 - '@sindresorhus/merge-streams@4.0.0': {} - '@smithy/abort-controller@4.2.10': dependencies: '@smithy/types': 4.13.0 @@ -11437,37 +7727,6 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@streamdown/cjk@1.0.2(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.1.0)(unified@11.0.5)': - dependencies: - react: 19.1.0 - remark-cjk-friendly: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) - remark-cjk-friendly-gfm-strikethrough: 1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) - unist-util-visit: 5.1.0 - transitivePeerDependencies: - - '@types/mdast' - - micromark - - micromark-util-types - - unified - - '@streamdown/code@1.0.3(react@19.1.0)': - dependencies: - react: 19.1.0 - shiki: 3.23.0 - - '@streamdown/math@1.0.2(react@19.1.0)': - dependencies: - katex: 0.16.33 - react: 19.1.0 - rehype-katex: 7.0.1 - remark-math: 6.0.0 - transitivePeerDependencies: - - supports-color - - '@streamdown/mermaid@1.0.2(react@19.1.0)': - dependencies: - mermaid: 11.12.3 - react: 19.1.0 - '@swc/core-darwin-arm64@1.15.11': optional: true @@ -11595,31 +7854,10 @@ snapshots: '@tanstack/query-core@5.90.20': {} - '@tanstack/react-query@5.90.20(react@19.1.0)': + '@tanstack/react-query@5.90.20(react@19.2.4)': dependencies: '@tanstack/query-core': 5.90.20 - react: 19.1.0 - - '@tokenlens/core@1.3.0': {} - - '@tokenlens/fetch@1.3.0': - dependencies: - '@tokenlens/core': 1.3.0 - - '@tokenlens/helpers@1.3.1': - dependencies: - '@tokenlens/core': 1.3.0 - '@tokenlens/fetch': 1.3.0 - - '@tokenlens/models@1.3.0': - dependencies: - '@tokenlens/core': 1.3.0 - - '@ts-morph/common@0.27.0': - dependencies: - fast-glob: 3.3.3 - minimatch: 10.2.4 - path-browserify: 1.0.1 + react: 19.2.4 '@tybys/wasm-util@0.10.1': dependencies: @@ -11643,127 +7881,6 @@ snapshots: dependencies: '@types/node': 20.19.33 - '@types/d3-array@3.2.2': {} - - '@types/d3-axis@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-brush@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-chord@3.0.6': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-contour@3.0.6': - dependencies: - '@types/d3-array': 3.2.2 - '@types/geojson': 7946.0.16 - - '@types/d3-delaunay@6.0.4': {} - - '@types/d3-dispatch@3.0.7': {} - - '@types/d3-drag@3.0.7': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-dsv@3.0.7': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-fetch@3.0.7': - dependencies: - '@types/d3-dsv': 3.0.7 - - '@types/d3-force@3.0.10': {} - - '@types/d3-format@3.0.4': {} - - '@types/d3-geo@3.1.0': - dependencies: - '@types/geojson': 7946.0.16 - - '@types/d3-hierarchy@3.1.7': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.1': {} - - '@types/d3-polygon@3.0.2': {} - - '@types/d3-quadtree@3.0.6': {} - - '@types/d3-random@3.0.3': {} - - '@types/d3-scale-chromatic@3.1.0': {} - - '@types/d3-scale@4.0.9': - dependencies: - '@types/d3-time': 3.0.4 - - '@types/d3-selection@3.0.11': {} - - '@types/d3-shape@3.1.8': - dependencies: - '@types/d3-path': 3.1.1 - - '@types/d3-time-format@4.0.3': {} - - '@types/d3-time@3.0.4': {} - - '@types/d3-timer@3.0.2': {} - - '@types/d3-transition@3.0.9': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-zoom@3.0.8': - dependencies: - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.11 - - '@types/d3@7.4.3': - dependencies: - '@types/d3-array': 3.2.2 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.7 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.10 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.1 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.9 - '@types/d3-scale-chromatic': 3.1.0 - '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.8 - '@types/d3-time': 3.0.4 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 2.1.0 - '@types/dom-mediacapture-transform@0.1.11': dependencies: '@types/dom-webcodecs': 0.1.13 @@ -11780,10 +7897,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/estree-jsx@1.0.5': - dependencies: - '@types/estree': 1.0.8 - '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.1.1': @@ -11801,42 +7914,20 @@ snapshots: '@types/file-saver@2.0.7': {} - '@types/geojson@7946.0.16': {} - - '@types/hast@3.0.4': - dependencies: - '@types/unist': 3.0.3 - '@types/http-errors@2.0.5': {} '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/katex@0.16.8': {} - - '@types/mdast@4.0.4': - dependencies: - '@types/unist': 3.0.3 - - '@types/ms@2.1.0': {} - '@types/node@20.19.33': dependencies: undici-types: 6.21.0 - '@types/prop-types@15.7.15': - optional: true - '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/react-dom@18.3.7(@types/react@18.3.28)': - dependencies: - '@types/react': 18.3.28 - optional: true - '@types/react-dom@19.2.3(@types/react@19.2.13)': dependencies: '@types/react': 19.2.13 @@ -11845,12 +7936,6 @@ snapshots: dependencies: '@types/react': 19.2.13 - '@types/react@18.3.28': - dependencies: - '@types/prop-types': 15.7.15 - csstype: 3.2.3 - optional: true - '@types/react@19.2.13': dependencies: csstype: 3.2.3 @@ -11868,19 +7953,9 @@ snapshots: '@types/http-errors': 2.0.5 '@types/node': 20.19.33 - '@types/statuses@2.0.6': {} - - '@types/trusted-types@2.0.7': + '@types/statuses@2.0.6': optional: true - '@types/unist@2.0.11': {} - - '@types/unist@3.0.3': {} - - '@types/uuid@10.0.0': {} - - '@types/validate-npm-package-name@4.0.2': {} - '@types/yauzl@2.10.3': dependencies: '@types/node': 20.19.33 @@ -11977,8 +8052,6 @@ snapshots: '@typescript-eslint/types': 8.54.0 eslint-visitor-keys: 4.2.1 - '@ungap/structured-clone@1.3.0': {} - '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -12186,29 +8259,6 @@ snapshots: '@xtuc/long@4.2.2': {} - '@xyflow/react@12.10.1(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@xyflow/system': 0.0.75 - classcat: 5.0.5 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - zustand: 4.5.7(@types/react@19.2.13)(react@19.1.0) - transitivePeerDependencies: - - '@types/react' - - immer - - '@xyflow/system@0.0.75': - dependencies: - '@types/d3-drag': 3.0.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.11 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-zoom: 3.0.0 - abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -12224,25 +8274,15 @@ snapshots: acorn@8.15.0: {} - acorn@8.16.0: {} - agent-base@7.1.4: {} - ai@6.0.116(zod@3.22.3): + ai@6.0.116(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 3.0.66(zod@3.22.3) + '@ai-sdk/gateway': 3.0.66(zod@3.25.76) '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.19(zod@3.22.3) + '@ai-sdk/provider-utils': 4.0.19(zod@3.25.76) '@opentelemetry/api': 1.9.0 - zod: 3.22.3 - - ai@6.0.77(zod@3.22.3): - dependencies: - '@ai-sdk/gateway': 3.0.39(zod@3.22.3) - '@ai-sdk/provider': 3.0.8 - '@ai-sdk/provider-utils': 4.0.14(zod@3.22.3) - '@opentelemetry/api': 1.9.0 - zod: 3.22.3 + zod: 3.25.76 ajv-formats@1.6.1(ajv@7.2.4): optionalDependencies: @@ -12255,6 +8295,7 @@ snapshots: ajv-formats@3.0.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 + optional: true ajv-keywords@3.5.2(ajv@6.12.6): dependencies: @@ -12286,8 +8327,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - anser@2.3.5: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -12296,20 +8335,8 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.3: {} - ansi-to-react@6.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - anser: 2.3.5 - escape-carriage: 1.3.1 - linkify-it: 3.0.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - - ansis@4.2.0: {} - archiver-utils@5.0.2: dependencies: glob: 10.4.5 @@ -12339,10 +8366,6 @@ snapshots: argparse@2.0.1: {} - aria-hidden@1.2.6: - dependencies: - tslib: 2.8.1 - aria-query@5.3.2: {} array-buffer-byte-length@1.0.2: @@ -12450,8 +8473,6 @@ snapshots: b4a@1.7.3: {} - bail@2.0.2: {} - balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -12474,10 +8495,10 @@ snapshots: bignumber.js@9.3.1: {} - bippy@0.5.30(@types/react@19.2.13)(react@19.1.0): + bippy@0.5.30(@types/react@19.2.13)(react@19.2.4): dependencies: '@types/react-reconciler': 0.28.9(@types/react@19.2.13) - react: 19.1.0 + react: 19.2.4 transitivePeerDependencies: - '@types/react' @@ -12549,10 +8570,6 @@ snapshots: transitivePeerDependencies: - supports-color - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - bytes@3.1.2: {} c12@3.1.0(magicast@0.3.5): @@ -12593,20 +8610,12 @@ snapshots: callsites@3.1.0: {} - camelcase@6.3.0: {} - camelize@1.0.1: {} caniuse-lite@1.0.30001769: {} caseless@0.12.0: {} - ccount@2.0.1: {} - - ce-la-react@0.3.2(react@19.1.0): - dependencies: - react: 19.1.0 - chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -12620,32 +8629,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.6.2: {} - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - check-error@2.1.3: {} - chevrotain-allstar@0.3.1(chevrotain@11.1.2): - dependencies: - chevrotain: 11.1.2 - lodash-es: 4.17.23 - - chevrotain@11.1.2: - dependencies: - '@chevrotain/cst-dts-gen': 11.1.2 - '@chevrotain/gast': 11.1.2 - '@chevrotain/regexp-to-ast': 11.1.2 - '@chevrotain/types': 11.1.2 - '@chevrotain/utils': 11.1.2 - lodash-es: 4.17.23 - chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -12658,19 +8643,8 @@ snapshots: citty@0.2.0: {} - class-variance-authority@0.7.1: - dependencies: - clsx: 2.1.1 - - classcat@5.0.5: {} - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@2.9.2: {} - - cli-width@4.1.0: {} + cli-width@4.1.0: + optional: true client-only@0.0.1: {} @@ -12680,24 +8654,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clsx@2.1.1: {} - cluster-key-slot@1.1.2: {} - cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - transitivePeerDependencies: - - '@types/react' - - '@types/react-dom' - - code-block-writer@13.0.3: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -12708,18 +8666,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 - comma-separated-tokens@2.0.3: {} - - commander@11.1.0: {} - - commander@14.0.3: {} - commander@2.20.3: {} - commander@7.2.0: {} - - commander@8.3.0: {} - compress-commons@6.0.2: dependencies: crc-32: 1.2.2 @@ -12753,27 +8701,20 @@ snapshots: pkg-up: 3.1.0 semver: 7.7.4 - confbox@0.1.8: {} - confbox@0.2.4: {} consola@3.4.2: {} - console-table-printer@2.15.0: - dependencies: - simple-wcswidth: 1.1.2 - content-disposition@1.0.1: {} content-type@1.0.5: {} - convert-source-map@2.0.0: {} - cookie-signature@1.2.2: {} cookie@0.7.2: {} - cookie@1.1.1: {} + cookie@1.1.1: + optional: true core-util-is@1.0.2: {} @@ -12783,6 +8724,7 @@ snapshots: dependencies: object-assign: 4.1.1 vary: 1.1.2 + optional: true cos-nodejs-sdk-v5@2.15.4: dependencies: @@ -12791,23 +8733,6 @@ snapshots: mime-types: 2.1.35 request: 2.88.2 - cose-base@1.0.3: - dependencies: - layout-base: 1.0.2 - - cose-base@2.2.0: - dependencies: - layout-base: 2.0.1 - - cosmiconfig@9.0.1(typescript@5.9.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.9.3 - crc-32@1.2.2: {} crc32-stream@6.0.0: @@ -12838,7 +8763,7 @@ snapshots: css-gradient-parser@0.0.16: {} - css-loader@5.2.7(webpack@5.96.1(esbuild@0.25.0)): + css-loader@5.2.7(webpack@5.96.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -12862,190 +8787,6 @@ snapshots: csstype@3.2.3: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.33.1 - - cytoscape-fcose@2.2.0(cytoscape@3.33.1): - dependencies: - cose-base: 2.2.0 - cytoscape: 3.33.1 - - cytoscape@3.33.1: {} - - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-axis@3.0.0: {} - - d3-brush@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3-chord@3.0.1: - dependencies: - d3-path: 3.1.0 - - d3-color@3.1.0: {} - - d3-contour@4.0.2: - dependencies: - d3-array: 3.2.4 - - d3-delaunay@6.0.4: - dependencies: - delaunator: 5.0.1 - - d3-dispatch@3.0.1: {} - - d3-drag@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - - d3-dsv@3.0.1: - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - - d3-ease@3.0.1: {} - - d3-fetch@3.0.1: - dependencies: - d3-dsv: 3.0.1 - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-format@3.1.2: {} - - d3-geo@3.1.1: - dependencies: - d3-array: 3.2.4 - - d3-hierarchy@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@1.0.9: {} - - d3-path@3.1.0: {} - - d3-polygon@3.0.1: {} - - d3-quadtree@3.0.1: {} - - d3-random@3.0.1: {} - - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - - d3-scale-chromatic@3.1.0: - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.2 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-selection@3.0.0: {} - - d3-shape@1.3.7: - dependencies: - d3-path: 1.0.9 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d3-transition@3.0.1(d3-selection@3.0.0): - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - - d3-zoom@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3@7.9.0: - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.2 - d3-geo: 3.1.1 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.1.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - - dagre-d3-es@7.0.13: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.23 - damerau-levenshtein@1.0.8: {} dashdash@1.14.1: @@ -13072,8 +8813,6 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - dayjs@1.11.19: {} - debounce-fn@4.0.0: dependencies: mimic-fn: 3.1.0 @@ -13086,31 +8825,14 @@ snapshots: dependencies: ms: 2.1.3 - decamelize@1.2.0: {} - decimal.js@10.6.0: {} - decode-named-character-reference@1.3.0: - dependencies: - character-entities: 2.0.2 - - dedent@1.7.2: {} - deep-eql@5.0.2: {} deep-is@0.1.4: {} deepmerge-ts@7.1.5: {} - deepmerge@4.3.1: {} - - default-browser-id@5.0.1: {} - - default-browser@5.5.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 - define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -13119,8 +8841,6 @@ snapshots: define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -13129,10 +8849,6 @@ snapshots: defu@6.1.4: {} - delaunator@5.0.1: - dependencies: - robust-predicates: 3.0.2 - delayed-stream@1.0.0: {} denque@2.1.0: {} @@ -13145,32 +8861,18 @@ snapshots: detect-libc@2.1.2: {} - detect-node-es@1.1.0: {} - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - diff@8.0.3: {} - dingbat-to-unicode@1.0.1: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 - dompurify@3.3.1: - optionalDependencies: - '@types/trusted-types': 2.0.7 - dot-prop@6.0.1: dependencies: is-obj: 2.0.0 dotenv@16.6.1: {} - dotenv@17.3.1: {} - dotenv@9.0.2: {} duck@0.1.12: @@ -13194,13 +8896,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - eciesjs@0.4.17: - dependencies: - '@ecies/ciphers': 0.2.5(@noble/ciphers@1.3.0) - '@noble/ciphers': 1.3.0 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - ee-first@1.1.1: {} effect@3.18.4: @@ -13214,22 +8909,8 @@ snapshots: electron-to-chromium@1.5.286: {} - embla-carousel-react@8.6.0(react@19.1.0): - dependencies: - embla-carousel: 8.6.0 - embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) - react: 19.1.0 - - embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): - dependencies: - embla-carousel: 8.6.0 - - embla-carousel@8.6.0: {} - emoji-regex-xs@2.0.1: {} - emoji-regex@10.6.0: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -13249,14 +8930,8 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 - entities@6.0.1: {} - env-paths@2.2.1: {} - error-ex@1.3.4: - dependencies: - is-arrayish: 0.2.1 - es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -13445,14 +9120,10 @@ snapshots: escalade@3.2.0: {} - escape-carriage@1.3.1: {} - escape-html@1.0.3: {} escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-config-next@15.5.4(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 15.5.4 @@ -13656,8 +9327,6 @@ snapshots: estraverse@5.3.0: {} - estree-util-is-identifier-name@3.0.0: {} - estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -13668,10 +9337,6 @@ snapshots: event-target-shim@5.0.1: {} - eventemitter3@4.0.7: {} - - eventemitter3@5.0.4: {} - events-universal@1.0.1: dependencies: bare-events: 2.8.2 @@ -13687,6 +9352,7 @@ snapshots: eventsource@3.0.7: dependencies: eventsource-parser: 3.0.6 + optional: true execa@5.1.1: dependencies: @@ -13700,27 +9366,13 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 - expect-type@1.3.0: {} express-rate-limit@8.2.1(express@5.2.1): dependencies: express: 5.2.1 ip-address: 10.0.1 + optional: true express@5.2.1: dependencies: @@ -13787,14 +9439,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -13828,10 +9472,6 @@ snapshots: fflate@0.7.4: {} - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -13896,23 +9536,8 @@ snapshots: forwarded@0.2.0: {} - framer-motion@12.35.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - motion-dom: 12.35.0 - motion-utils: 12.29.2 - tslib: 2.8.1 - optionalDependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - fresh@2.0.0: {} - fs-extra@11.3.4: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 - fs-monkey@1.0.3: {} fsevents@2.3.3: @@ -13931,10 +9556,6 @@ snapshots: functions-have-names@1.2.3: {} - fuzzysort@3.1.0: {} - - fzf@0.5.2: {} - gaxios@7.1.3: dependencies: extend: 3.0.2 @@ -13958,12 +9579,8 @@ snapshots: generator-function@2.0.1: {} - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -13977,10 +9594,6 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-nonce@1.0.1: {} - - get-own-enumerable-keys@1.0.0: {} - get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -13992,11 +9605,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -14074,7 +9682,8 @@ snapshots: graceful-fs@4.2.11: {} - graphql@16.13.1: {} + graphql@16.13.1: + optional: true gtoken@8.0.0: dependencies: @@ -14083,8 +9692,6 @@ snapshots: transitivePeerDependencies: - supports-color - hachure-fill@0.5.2: {} - har-schema@2.0.0: {} har-validator@5.1.5: @@ -14114,144 +9721,16 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-from-dom@5.0.1: - dependencies: - '@types/hast': 3.0.4 - hastscript: 9.0.1 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-dom: 5.0.1 - hast-util-from-html: 2.0.3 - unist-util-remove-position: 5.0.0 - - hast-util-from-html@2.0.3: - dependencies: - '@types/hast': 3.0.4 - devlop: 1.1.0 - hast-util-from-parse5: 8.0.3 - parse5: 7.3.0 - vfile: 6.0.3 - vfile-message: 4.0.3 - - hast-util-from-parse5@8.0.3: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - devlop: 1.1.0 - hastscript: 9.0.1 - property-information: 7.1.0 - vfile: 6.0.3 - vfile-location: 5.0.3 - web-namespaces: 2.0.1 - - hast-util-is-element@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.4 - - hast-util-raw@9.1.0: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - '@ungap/structured-clone': 1.3.0 - hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.1 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - parse5: 7.3.0 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-sanitize@5.0.2: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.3.0 - unist-util-position: 5.0.0 - - hast-util-to-html@9.0.5: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - comma-separated-tokens: 2.0.3 - hast-util-whitespace: 3.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.2.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - stringify-entities: 4.0.4 - zwitch: 2.0.4 - - hast-util-to-jsx-runtime@2.3.6: - dependencies: - '@types/estree': 1.0.8 - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - style-to-js: 1.1.21 - unist-util-position: 5.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-text@4.0.2: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.4 - - hastscript@9.0.1: - dependencies: - '@types/hast': 3.0.4 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 7.1.0 - space-separated-tokens: 2.0.2 - - headers-polyfill@4.0.3: {} + headers-polyfill@4.0.3: + optional: true hex-rgb@4.3.0: {} - hono@4.12.5: {} + hono@4.12.5: + optional: true html-escaper@2.0.2: {} - html-url-attributes@3.0.1: {} - - html-void-elements@3.0.0: {} - http-errors@2.0.1: dependencies: depd: 2.0.0 @@ -14275,11 +9754,7 @@ snapshots: human-signals@2.1.0: {} - human-signals@8.0.1: {} - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 + husky@9.1.7: {} iconv-lite@0.7.2: dependencies: @@ -14310,18 +9785,12 @@ snapshots: inherits@2.0.4: {} - inline-style-parser@0.2.7: {} - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 - internmap@1.0.1: {} - - internmap@2.0.3: {} - intl-messageformat@11.1.2: dependencies: '@formatjs/ecma402-abstract': 3.1.1 @@ -14343,25 +9812,17 @@ snapshots: transitivePeerDependencies: - supports-color - ip-address@10.0.1: {} + ip-address@10.0.1: + optional: true ipaddr.js@1.9.1: {} - is-alphabetical@2.0.1: {} - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -14400,12 +9861,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-decimal@2.0.1: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -14426,23 +9883,12 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-hexadecimal@2.0.1: {} - - is-in-ssh@1.0.0: {} - - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - - is-interactive@2.0.0: {} - is-map@2.0.3: {} is-negative-zero@2.0.3: {} - is-network-error@1.3.1: {} - - is-node-process@1.2.0: {} + is-node-process@1.2.0: + optional: true is-number-object@1.1.1: dependencies: @@ -14453,10 +9899,6 @@ snapshots: is-obj@2.0.0: {} - is-obj@3.0.0: {} - - is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} is-property@1.0.2: {} @@ -14468,8 +9910,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - is-regexp@3.1.0: {} - is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -14478,8 +9918,6 @@ snapshots: is-stream@2.0.1: {} - is-stream@4.0.1: {} - is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -14497,10 +9935,6 @@ snapshots: is-typedarray@1.0.0: {} - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} - is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -14516,18 +9950,12 @@ snapshots: dependencies: is-docker: 2.2.1 - is-wsl@3.1.1: - dependencies: - is-inside-container: 1.0.0 - isarray@1.0.0: {} isarray@2.0.5: {} isexe@2.0.0: {} - isexe@3.1.5: {} - isstream@0.1.2: {} istanbul-lib-coverage@3.2.2: {} @@ -14582,11 +10010,8 @@ snapshots: jose@4.15.9: {} - jose@6.2.0: {} - - js-tiktoken@1.0.21: - dependencies: - base64-js: 1.5.1 + jose@6.2.0: + optional: true js-tokens@4.0.0: {} @@ -14596,8 +10021,6 @@ snapshots: jsbn@0.1.1: {} - jsesc@3.1.0: {} - json-bigint@1.0.0: dependencies: bignumber.js: 9.3.1 @@ -14612,7 +10035,8 @@ snapshots: json-schema-typed@7.0.3: {} - json-schema-typed@8.0.2: {} + json-schema-typed@8.0.2: + optional: true json-schema@0.4.0: {} @@ -14626,12 +10050,6 @@ snapshots: json5@2.2.3: {} - jsonfile@6.2.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - jsonrepair@3.13.2: {} jsprim@1.4.2: @@ -14666,50 +10084,18 @@ snapshots: jwa: 2.0.1 safe-buffer: 5.2.1 - katex@0.16.33: - dependencies: - commander: 8.3.0 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - khroma@2.1.0: {} - kleur@3.0.3: {} - kleur@4.1.5: {} - - langium@4.2.1: - dependencies: - chevrotain: 11.1.2 - chevrotain-allstar: 0.3.1(chevrotain@11.1.2) - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.1.0 - - langsmith@0.5.7(@opentelemetry/api@1.9.0)(openai@6.18.0(ws@8.19.0)(zod@3.22.3)): - dependencies: - '@types/uuid': 10.0.0 - chalk: 5.6.2 - console-table-printer: 2.15.0 - p-queue: 6.6.2 - semver: 7.7.4 - uuid: 10.0.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - openai: 6.18.0(ws@8.19.0)(zod@3.22.3) - language-subtag-registry@0.3.23: {} language-tags@1.0.9: dependencies: language-subtag-registry: 0.3.23 - layout-base@1.0.2: {} - - layout-base@2.0.1: {} - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 @@ -14777,12 +10163,6 @@ snapshots: base64-js: 0.0.8 unicode-trie: 2.0.0 - lines-and-columns@1.2.4: {} - - linkify-it@3.0.3: - dependencies: - uc.micro: 1.0.6 - loader-runner@4.3.1: {} loader-utils@2.0.4: @@ -14800,8 +10180,6 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.23: {} - lodash.defaults@4.2.0: {} lodash.isarguments@3.1.0: {} @@ -14812,15 +10190,8 @@ snapshots: lodash@4.17.23: {} - log-symbols@6.0.0: - dependencies: - chalk: 5.6.2 - is-unicode-supported: 1.3.0 - long@5.3.2: {} - longest-streak@3.1.0: {} - loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -14837,19 +10208,15 @@ snapshots: lru-cache@11.2.6: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 lru.min@1.1.4: {} - lucide-react@0.575.0(react@19.1.0): + lucide-react@0.575.0(react@19.2.4): dependencies: - react: 19.1.0 + react: 19.2.4 luxon@3.7.2: {} @@ -14884,185 +10251,8 @@ snapshots: underscore: 1.13.7 xmlbuilder: 10.1.1 - markdown-table@3.0.4: {} - - marked@16.4.2: {} - - marked@17.0.4: {} - math-intrinsics@1.1.0: {} - mdast-util-find-and-replace@3.0.2: - dependencies: - '@types/mdast': 4.0.4 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - mdast-util-from-markdown@2.0.3: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.2 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-decode-string: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.1: - dependencies: - '@types/mdast': 4.0.4 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.2 - micromark-util-character: 2.1.1 - - mdast-util-gfm-footnote@2.1.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - micromark-util-normalize-identifier: 2.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.1.0: - dependencies: - mdast-util-from-markdown: 2.0.3 - mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-math@3.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-expression@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@3.2.0: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.3 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.5 - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 - mdast-util-to-markdown: 2.1.2 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@4.1.0: - dependencies: - '@types/mdast': 4.0.4 - unist-util-is: 6.0.1 - - mdast-util-to-hast@13.2.1: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - '@ungap/structured-clone': 1.3.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.1 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.1.0 - vfile: 6.0.3 - - mdast-util-to-markdown@2.1.2: - dependencies: - '@types/mdast': 4.0.4 - '@types/unist': 3.0.3 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.1.0 - mdast-util-to-string: 4.0.0 - micromark-util-classify-character: 2.0.1 - micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.1.0 - zwitch: 2.0.4 - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.4 - - media-chrome@4.18.0(react@19.1.0): - dependencies: - ce-la-react: 0.3.2(react@19.1.0) - transitivePeerDependencies: - - react - media-typer@1.1.0: {} mediabunny@1.29.0: @@ -15080,262 +10270,6 @@ snapshots: merge2@1.4.1: {} - mermaid@11.12.3: - dependencies: - '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.0 - '@mermaid-js/parser': 1.0.0 - '@types/d3': 7.4.3 - cytoscape: 3.33.1 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1) - cytoscape-fcose: 2.2.0(cytoscape@3.33.1) - d3: 7.9.0 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.13 - dayjs: 1.11.19 - dompurify: 3.3.1 - katex: 0.16.33 - khroma: 2.1.0 - lodash-es: 4.17.23 - marked: 16.4.2 - roughjs: 4.6.6 - stylis: 4.3.6 - ts-dedent: 2.2.0 - uuid: 11.1.0 - - micromark-core-commonmark@2.0.3: - dependencies: - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-factory-destination: 2.0.1 - micromark-factory-label: 2.0.1 - micromark-factory-space: 2.0.1 - micromark-factory-title: 2.0.1 - micromark-factory-whitespace: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-html-tag-name: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-cjk-friendly-gfm-strikethrough@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): - dependencies: - devlop: 1.1.0 - get-east-asian-width: 1.5.0 - micromark: 4.0.2 - micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - optionalDependencies: - micromark-util-types: 2.0.2 - - micromark-extension-cjk-friendly-util@2.1.1(micromark-util-types@2.0.2): - dependencies: - get-east-asian-width: 1.5.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - optionalDependencies: - micromark-util-types: 2.0.2 - - micromark-extension-cjk-friendly@1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2): - dependencies: - devlop: 1.1.0 - micromark: 4.0.2 - micromark-extension-cjk-friendly-util: 2.1.1(micromark-util-types@2.0.2) - micromark-util-chunked: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - optionalDependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-autolink-literal@2.1.0: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-footnote@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-strikethrough@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-classify-character: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-table@2.1.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.2 - - micromark-extension-gfm-task-list-item@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.1.0 - micromark-extension-gfm-footnote: 2.1.0 - micromark-extension-gfm-strikethrough: 2.1.0 - micromark-extension-gfm-table: 2.1.1 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.1.0 - micromark-util-combine-extensions: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.8 - devlop: 1.1.0 - katex: 0.16.33 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-destination@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-label@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-space@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-types: 2.0.2 - - micromark-factory-title@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-factory-whitespace@2.0.1: - dependencies: - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-character@2.1.1: - dependencies: - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-chunked@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-classify-character@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-combine-extensions@2.0.1: - dependencies: - micromark-util-chunked: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-decode-numeric-character-reference@2.0.2: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-decode-string@2.0.1: - dependencies: - decode-named-character-reference: 1.3.0 - micromark-util-character: 2.1.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-symbol: 2.0.1 - - micromark-util-encode@2.0.1: {} - - micromark-util-html-tag-name@2.0.1: {} - - micromark-util-normalize-identifier@2.0.1: - dependencies: - micromark-util-symbol: 2.0.1 - - micromark-util-resolve-all@2.0.1: - dependencies: - micromark-util-types: 2.0.2 - - micromark-util-sanitize-uri@2.0.1: - dependencies: - micromark-util-character: 2.1.1 - micromark-util-encode: 2.0.1 - micromark-util-symbol: 2.0.1 - - micromark-util-subtokenize@2.1.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.1 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - - micromark-util-symbol@2.0.1: {} - - micromark-util-types@2.0.2: {} - - micromark@4.0.2: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.3 - decode-named-character-reference: 1.3.0 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.3 - micromark-factory-space: 2.0.1 - micromark-util-character: 2.1.1 - micromark-util-chunked: 2.0.1 - micromark-util-combine-extensions: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.2 - micromark-util-encode: 2.0.1 - micromark-util-normalize-identifier: 2.0.1 - micromark-util-resolve-all: 2.0.1 - micromark-util-sanitize-uri: 2.0.1 - micromark-util-subtokenize: 2.1.0 - micromark-util-symbol: 2.0.1 - micromark-util-types: 2.0.2 - transitivePeerDependencies: - - supports-color - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -15357,8 +10291,6 @@ snapshots: mimic-fn@3.1.0: {} - mimic-function@5.0.1: {} - minimatch@10.1.2: dependencies: '@isaacs/brace-expansion': 5.0.1 @@ -15385,27 +10317,6 @@ snapshots: minipass@7.1.2: {} - mlly@1.8.1: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.3 - - motion-dom@12.35.0: - dependencies: - motion-utils: 12.29.2 - - motion-utils@12.29.2: {} - - motion@12.35.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - framer-motion: 12.35.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tslib: 2.8.1 - optionalDependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - ms@2.1.3: {} msgpackr-extract@3.0.3: @@ -15448,10 +10359,10 @@ snapshots: typescript: 5.9.3 transitivePeerDependencies: - '@types/node' + optional: true - mustache@4.2.0: {} - - mute-stream@2.0.0: {} + mute-stream@2.0.0: + optional: true mysql2@3.16.3: dependencies: @@ -15471,8 +10382,6 @@ snapshots: nanoid@3.3.11: {} - nanoid@5.1.6: {} - napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} @@ -15481,49 +10390,49 @@ snapshots: neo-async@2.6.2: {} - next-auth@4.24.13(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next-auth@4.24.13(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@babel/runtime': 7.28.6 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.28.3 preact-render-to-string: 5.2.6(preact@10.28.3) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) uuid: 8.3.2 next-intl-swc-plugin-extractor@4.8.2: {} - next-intl@4.8.2(next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react@19.1.0)(typescript@5.9.3): + next-intl@4.8.2(next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@parcel/watcher': 2.5.6 '@swc/core': 1.15.11 icu-minify: 4.8.2 negotiator: 1.0.0 - next: 15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + next: 15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-intl-swc-plugin-extractor: 4.8.2 po-parser: 2.1.1 - react: 19.1.0 - use-intl: 4.8.2(react@19.1.0) + react: 19.2.4 + use-intl: 4.8.2(react@19.2.4) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@swc/helpers' - next@15.5.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + next@15.5.12(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: '@next/env': 15.5.12 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001769 postcss: 8.4.31 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - styled-jsx: 5.1.6(@babel/core@7.29.0)(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + styled-jsx: 5.1.6(react@19.2.4) optionalDependencies: '@next/swc-darwin-arm64': 15.5.12 '@next/swc-darwin-x64': 15.5.12 @@ -15566,11 +10475,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - nypm@0.6.5: dependencies: citty: 0.2.0 @@ -15589,8 +10493,6 @@ snapshots: object-keys@1.1.1: {} - object-treeify@1.1.33: {} - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -15643,37 +10545,16 @@ snapshots: dependencies: mimic-fn: 2.1.0 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - - oniguruma-parser@0.12.1: {} - - oniguruma-to-es@4.3.4: - dependencies: - oniguruma-parser: 0.12.1 - regex: 6.1.0 - regex-recursion: 6.0.2 - - open@11.0.0: - dependencies: - default-browser: 5.5.0 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - openai@6.18.0(ws@8.19.0)(zod@3.22.3): + openai@6.18.0(ws@8.19.0)(zod@3.25.76): optionalDependencies: ws: 8.19.0 - zod: 3.22.3 + zod: 3.25.76 openid-client@5.7.1: dependencies: @@ -15693,19 +10574,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - ora@8.2.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.2.0 - strip-ansi: 7.1.2 - - outvariant@1.4.3: {} + outvariant@1.4.3: + optional: true own-keys@1.0.1: dependencies: @@ -15713,8 +10583,6 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - p-finally@1.0.0: {} - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -15731,32 +10599,10 @@ snapshots: dependencies: p-limit: 3.1.0 - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-queue@9.1.0: - dependencies: - eventemitter3: 5.0.4 - p-timeout: 7.0.1 - - p-retry@7.1.1: - dependencies: - is-network-error: 1.3.1 - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - p-timeout@7.0.1: {} - p-try@2.2.0: {} package-json-from-dist@1.0.1: {} - package-manager-detector@1.6.0: {} - pako@0.2.9: {} pako@1.0.11: {} @@ -15770,35 +10616,8 @@ snapshots: color-name: 1.1.4 hex-rgb: 4.3.0 - parse-entities@4.0.2: - dependencies: - '@types/unist': 2.0.11 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.3.0 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.29.0 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-ms@4.0.0: {} - - parse5@7.3.0: - dependencies: - entities: 6.0.1 - parseurl@1.3.3: {} - path-browserify@1.0.1: {} - - path-data-parser@0.1.0: {} - path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -15807,8 +10626,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-scurry@1.11.1: @@ -15821,7 +10638,8 @@ snapshots: lru-cache: 11.2.6 minipass: 7.1.2 - path-to-regexp@6.3.0: {} + path-to-regexp@6.3.0: + optional: true path-to-regexp@8.3.0: {} @@ -15843,13 +10661,8 @@ snapshots: picomatch@4.0.3: {} - pkce-challenge@5.0.1: {} - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.1 - pathe: 2.0.3 + pkce-challenge@5.0.1: + optional: true pkg-types@2.3.0: dependencies: @@ -15863,13 +10676,6 @@ snapshots: po-parser@2.1.1: {} - points-on-curve@0.2.0: {} - - points-on-path@0.2.1: - dependencies: - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - possible-typed-array-names@1.1.0: {} postcss-modules-extract-imports@3.1.0(postcss@8.5.6): @@ -15912,8 +10718,6 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - powershell-utils@0.1.0: {} - preact-render-to-string@5.2.6(preact@10.28.3): dependencies: preact: 10.28.3 @@ -15925,10 +10729,6 @@ snapshots: pretty-format@3.8.0: {} - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 - prisma@6.19.2(magicast@0.3.5)(typescript@5.9.3): dependencies: '@prisma/config': 6.19.2(magicast@0.3.5) @@ -15953,8 +10753,6 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 - property-information@7.1.0: {} - protobufjs@7.5.4: dependencies: '@protobufjs/aspromise': 1.1.2 @@ -15996,69 +10794,6 @@ snapshots: queue-microtask@1.2.3: {} - radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.13)(react@19.1.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.13))(@types/react@19.2.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - '@types/react-dom': 19.2.3(@types/react@19.2.13) - randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -16077,70 +10812,33 @@ snapshots: defu: 6.1.4 destr: 2.0.5 - react-dom@19.1.0(react@19.1.0): + react-dom@19.2.4(react@19.2.4): dependencies: - react: 19.1.0 - scheduler: 0.26.0 + react: 19.2.4 + scheduler: 0.27.0 - react-grab@0.1.20(@types/react@19.2.13)(react@19.1.0): + react-grab@0.1.20(@types/react@19.2.13)(react@19.2.4): dependencies: '@medv/finder': 4.0.2 - bippy: 0.5.30(@types/react@19.2.13)(react@19.1.0) + bippy: 0.5.30(@types/react@19.2.13)(react@19.2.4) solid-js: 1.9.11 optionalDependencies: - react: 19.1.0 + react: 19.2.4 transitivePeerDependencies: - '@types/react' - react-hot-toast@2.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + react-hot-toast@2.6.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: csstype: 3.2.3 goober: 2.1.18(csstype@3.2.3) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) react-is@16.13.1: {} - react-jsx-parser@2.4.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - optionalDependencies: - '@types/react': 18.3.28 - '@types/react-dom': 18.3.7(@types/react@18.3.28) - react-refresh@0.9.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.2.13)(react@19.1.0): - dependencies: - react: 19.1.0 - react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.1.0) - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.13 - - react-remove-scroll@2.7.2(@types/react@19.2.13)(react@19.1.0): - dependencies: - react: 19.1.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.13)(react@19.1.0) - react-style-singleton: 2.2.3(@types/react@19.2.13)(react@19.1.0) - tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.13)(react@19.1.0) - use-sidecar: 1.1.3(@types/react@19.2.13)(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - - react-style-singleton@2.2.3(@types/react@19.2.13)(react@19.1.0): - dependencies: - get-nonce: 1.0.1 - react: 19.1.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.13 - - react@19.1.0: {} + react@19.2.4: {} readable-stream@2.3.8: dependencies: @@ -16195,16 +10893,6 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 - regex-recursion@6.0.2: - dependencies: - regex-utilities: 2.3.0 - - regex-utilities@2.3.0: {} - - regex@6.1.0: - dependencies: - regex-utilities: 2.3.0 - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -16214,100 +10902,10 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - rehype-harden@1.1.8: + remotion@4.0.419(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - unist-util-visit: 5.1.0 - - rehype-katex@7.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.8 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.33 - unist-util-visit-parents: 6.0.2 - vfile: 6.0.3 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-raw: 9.1.0 - vfile: 6.0.3 - - rehype-sanitize@6.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-sanitize: 5.0.2 - - remark-cjk-friendly-gfm-strikethrough@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): - dependencies: - micromark-extension-cjk-friendly-gfm-strikethrough: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) - unified: 11.0.5 - optionalDependencies: - '@types/mdast': 4.0.4 - transitivePeerDependencies: - - micromark - - micromark-util-types - - remark-cjk-friendly@1.2.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): - dependencies: - micromark-extension-cjk-friendly: 1.2.3(micromark-util-types@2.0.2)(micromark@4.0.2) - unified: 11.0.5 - optionalDependencies: - '@types/mdast': 4.0.4 - transitivePeerDependencies: - - micromark - - micromark-util-types - - remark-gfm@4.0.1: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-math@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 - micromark-extension-math: 3.1.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 - micromark-util-types: 2.0.2 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - - remark-rehype@11.1.2: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - mdast-util-to-hast: 13.2.1 - unified: 11.0.5 - vfile: 6.0.3 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-to-markdown: 2.1.2 - unified: 11.0.5 - - remend@1.2.1: {} - - remotion@4.0.419(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) request@2.88.2: dependencies: @@ -16352,12 +10950,8 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - - rettime@0.10.1: {} + rettime@0.10.1: + optional: true reusify@1.1.0: {} @@ -16372,8 +10966,6 @@ snapshots: robot3@0.4.1: {} - robust-predicates@3.0.2: {} - rollup@4.59.0: dependencies: '@types/estree': 1.0.8 @@ -16405,13 +10997,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 - roughjs@4.6.6: - dependencies: - hachure-fill: 0.5.2 - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - points-on-path: 0.2.1 - router@2.2.0: dependencies: debug: 4.4.3 @@ -16422,14 +11007,10 @@ snapshots: transitivePeerDependencies: - supports-color - run-applescript@7.1.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - rw@1.3.3: {} - rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -16473,7 +11054,7 @@ snapshots: postcss-value-parser: 4.2.0 yoga-layout: 3.2.1 - scheduler@0.26.0: {} + scheduler@0.27.0: {} schema-utils@3.3.0: dependencies: @@ -16561,50 +11142,6 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@3.8.5(@cfworker/json-schema@4.1.1)(@types/node@20.19.33)(typescript@5.9.3): - dependencies: - '@antfu/ni': 25.0.0 - '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) - '@dotenvx/dotenvx': 1.52.0 - '@modelcontextprotocol/sdk': 1.27.1(@cfworker/json-schema@4.1.1)(zod@3.25.76) - '@types/validate-npm-package-name': 4.0.2 - browserslist: 4.28.1 - commander: 14.0.3 - cosmiconfig: 9.0.1(typescript@5.9.3) - dedent: 1.7.2 - deepmerge: 4.3.1 - diff: 8.0.3 - execa: 9.6.1 - fast-glob: 3.3.3 - fs-extra: 11.3.4 - fuzzysort: 3.1.0 - https-proxy-agent: 7.0.6 - kleur: 4.1.5 - msw: 2.12.10(@types/node@20.19.33)(typescript@5.9.3) - node-fetch: 3.3.2 - open: 11.0.0 - ora: 8.2.0 - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - prompts: 2.4.2 - recast: 0.23.11 - stringify-object: 5.0.0 - tailwind-merge: 3.5.0 - ts-morph: 26.0.0 - tsconfig-paths: 4.2.0 - validate-npm-package-name: 7.0.2 - zod: 3.25.76 - zod-to-json-schema: 3.25.1(zod@3.25.76) - transitivePeerDependencies: - - '@cfworker/json-schema' - - '@types/node' - - babel-plugin-macros - - supports-color - - typescript - sharp@0.34.5: dependencies: '@img/colour': 1.0.0 @@ -16644,28 +11181,6 @@ snapshots: shell-quote@1.8.3: {} - shiki@3.23.0: - dependencies: - '@shikijs/core': 3.23.0 - '@shikijs/engine-javascript': 3.23.0 - '@shikijs/engine-oniguruma': 3.23.0 - '@shikijs/langs': 3.23.0 - '@shikijs/themes': 3.23.0 - '@shikijs/types': 3.23.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - - shiki@4.0.1: - dependencies: - '@shikijs/core': 4.0.1 - '@shikijs/engine-javascript': 4.0.1 - '@shikijs/engine-oniguruma': 4.0.1 - '@shikijs/langs': 4.0.1 - '@shikijs/themes': 4.0.1 - '@shikijs/types': 4.0.1 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -16700,8 +11215,6 @@ snapshots: signal-exit@4.1.0: {} - simple-wcswidth@1.1.2: {} - sisteransi@1.0.5: {} solid-js@1.9.11: @@ -16725,8 +11238,6 @@ snapshots: dependencies: whatwg-url: 7.1.0 - space-separated-tokens@2.0.2: {} - sprintf-js@1.0.3: {} sqlstring@2.3.3: {} @@ -16753,35 +11264,11 @@ snapshots: std-env@3.10.0: {} - stdin-discarder@0.2.2: {} - stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 - streamdown@2.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - clsx: 2.1.1 - hast-util-to-jsx-runtime: 2.3.6 - html-url-attributes: 3.0.1 - marked: 17.0.4 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - rehype-harden: 1.1.8 - rehype-raw: 7.0.0 - rehype-sanitize: 6.0.0 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 - remark-rehype: 11.1.2 - remend: 1.2.1 - tailwind-merge: 3.5.0 - unified: 11.0.5 - unist-util-visit: 5.1.0 - unist-util-visit-parents: 6.0.2 - transitivePeerDependencies: - - supports-color - streamx@2.23.0: dependencies: events-universal: 1.0.1 @@ -16791,7 +11278,8 @@ snapshots: - bare-abort-controller - react-native-b4a - strict-event-emitter@0.5.1: {} + strict-event-emitter@0.5.1: + optional: true string-width@4.2.3: dependencies: @@ -16805,12 +11293,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.5.0 - strip-ansi: 7.1.2 - string.prototype.codepointat@0.2.1: {} string.prototype.includes@2.0.1: @@ -16871,17 +11353,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - stringify-object@5.0.0: - dependencies: - get-own-enumerable-keys: 1.0.0 - is-obj: 3.0.0 - is-regexp: 3.1.0 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -16894,34 +11365,20 @@ snapshots: strip-final-newline@2.0.0: {} - strip-final-newline@4.0.0: {} - strip-json-comments@3.1.1: {} strnum@1.1.2: {} strnum@2.2.0: {} - style-loader@4.0.0(webpack@5.96.1(esbuild@0.25.0)): + style-loader@4.0.0(webpack@5.96.1): dependencies: webpack: 5.96.1(esbuild@0.25.0) - style-to-js@1.1.21: - dependencies: - style-to-object: 1.0.14 - - style-to-object@1.0.14: - dependencies: - inline-style-parser: 0.2.7 - - styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.1.0): + styled-jsx@5.1.6(react@19.2.4): dependencies: client-only: 0.0.1 - react: 19.1.0 - optionalDependencies: - '@babel/core': 7.29.0 - - stylis@4.3.6: {} + react: 19.2.4 supports-color@7.2.0: dependencies: @@ -16933,15 +11390,14 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swr@2.4.1(react@19.1.0): + swr@2.4.1(react@19.2.4): dependencies: dequal: 2.0.3 - react: 19.1.0 - use-sync-external-store: 1.6.0(react@19.1.0) + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) - tagged-tag@1.0.0: {} - - tailwind-merge@3.5.0: {} + tagged-tag@1.0.0: + optional: true tailwindcss@4.1.18: {} @@ -17009,11 +11465,13 @@ snapshots: tinyspy@3.0.2: {} - tldts-core@7.0.24: {} + tldts-core@7.0.24: + optional: true tldts@7.0.24: dependencies: tldts-core: 7.0.24 + optional: true to-regex-range@5.0.1: dependencies: @@ -17021,13 +11479,6 @@ snapshots: toidentifier@1.0.1: {} - tokenlens@1.3.1: - dependencies: - '@tokenlens/core': 1.3.0 - '@tokenlens/fetch': 1.3.0 - '@tokenlens/helpers': 1.3.1 - '@tokenlens/models': 1.3.0 - tough-cookie@2.5.0: dependencies: psl: 1.15.0 @@ -17036,6 +11487,7 @@ snapshots: tough-cookie@6.0.0: dependencies: tldts: 7.0.24 + optional: true tr46@1.0.1: dependencies: @@ -17043,21 +11495,10 @@ snapshots: tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - - trough@2.2.0: {} - ts-api-utils@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 - ts-dedent@2.2.0: {} - - ts-morph@26.0.0: - dependencies: - '@ts-morph/common': 0.27.0 - code-block-writer: 13.0.3 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -17065,12 +11506,6 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsconfig-paths@4.2.0: - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - tslib@2.8.1: {} tsx@4.21.0: @@ -17084,8 +11519,6 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tw-animate-css@1.4.0: {} - tweetnacl@0.14.5: {} type-check@0.4.0: @@ -17095,6 +11528,7 @@ snapshots: type-fest@5.4.4: dependencies: tagged-tag: 1.0.0 + optional: true type-is@2.0.1: dependencies: @@ -17137,10 +11571,6 @@ snapshots: typescript@5.9.3: {} - uc.micro@1.0.6: {} - - ufo@1.6.3: {} - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -17159,53 +11589,6 @@ snapshots: pako: 0.2.9 tiny-inflate: 1.0.3 - unicorn-magic@0.3.0: {} - - unified@11.0.5: - dependencies: - '@types/unist': 3.0.3 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.2.0 - vfile: 6.0.3 - - unist-util-find-after@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - - unist-util-is@6.0.1: - dependencies: - '@types/unist': 3.0.3 - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.1.0 - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.3 - - unist-util-visit-parents@6.0.2: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - - unist-util-visit@5.1.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.1 - unist-util-visit-parents: 6.0.2 - - universalify@2.0.1: {} - unpipe@1.0.0: {} unrs-resolver@1.11.1: @@ -17232,7 +11615,8 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - until-async@3.0.2: {} + until-async@3.0.2: + optional: true update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: @@ -17244,51 +11628,26 @@ snapshots: dependencies: punycode: 2.3.1 - use-callback-ref@1.3.3(@types/react@19.2.13)(react@19.1.0): - dependencies: - react: 19.1.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.13 - - use-intl@4.8.2(react@19.1.0): + use-intl@4.8.2(react@19.2.4): dependencies: '@formatjs/fast-memoize': 3.1.0 '@schummar/icu-type-parser': 1.21.5 icu-minify: 4.8.2 intl-messageformat: 11.1.2 - react: 19.1.0 + react: 19.2.4 - use-sidecar@1.1.3(@types/react@19.2.13)(react@19.1.0): + use-sync-external-store@1.6.0(react@19.2.4): dependencies: - detect-node-es: 1.1.0 - react: 19.1.0 - tslib: 2.8.1 - optionalDependencies: - '@types/react': 19.2.13 - - use-stick-to-bottom@1.1.3(react@19.1.0): - dependencies: - react: 19.1.0 - - use-sync-external-store@1.6.0(react@19.1.0): - dependencies: - react: 19.1.0 + react: 19.2.4 util-deprecate@1.0.2: {} - uuid@10.0.0: {} - uuid@11.1.0: {} - uuid@13.0.0: {} - uuid@3.4.0: {} uuid@8.3.2: {} - validate-npm-package-name@7.0.2: {} - vary@1.1.2: {} verror@1.10.0: @@ -17297,21 +11656,6 @@ snapshots: core-util-is: 1.0.2 extsprintf: 1.3.0 - vfile-location@5.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile: 6.0.3 - - vfile-message@4.0.3: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 - vite-node@2.1.9(@types/node@20.19.33)(lightningcss@1.30.2)(terser@5.46.0): dependencies: cac: 6.7.14 @@ -17376,30 +11720,11 @@ snapshots: - supports-color - terser - vscode-jsonrpc@8.2.0: {} - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-languageserver@9.0.1: - dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-uri@3.1.0: {} - watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - web-namespaces@2.0.1: {} - web-streams-polyfill@3.3.3: {} webidl-conversions@4.0.2: {} @@ -17487,10 +11812,6 @@ snapshots: dependencies: isexe: 2.0.0 - which@4.0.0: - dependencies: - isexe: 3.1.5 - why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 @@ -17503,6 +11824,7 @@ snapshots: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + optional: true wrap-ansi@7.0.0: dependencies: @@ -17522,17 +11844,10 @@ snapshots: ws@8.19.0: {} - wsl-utils@0.3.1: - dependencies: - is-wsl: 3.1.1 - powershell-utils: 0.1.0 - xmlbuilder@10.1.1: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yargs-parser@21.1.1: {} @@ -17554,9 +11869,8 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors-cjs@2.1.3: {} - - yoctocolors@2.1.2: {} + yoctocolors-cjs@2.1.3: + optional: true yoga-layout@3.2.1: {} @@ -17566,26 +11880,11 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-to-json-schema@3.25.1(zod@3.22.3): - dependencies: - zod: 3.22.3 - optional: true - zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 + optional: true zod@3.22.3: {} zod@3.25.76: {} - - zod@4.3.6: {} - - zustand@4.5.7(@types/react@19.2.13)(react@19.1.0): - dependencies: - use-sync-external-store: 1.6.0(react@19.1.0) - optionalDependencies: - '@types/react': 19.2.13 - react: 19.1.0 - - zwitch@2.0.4: {} diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 27b1fe9..4d7a0f9 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -658,6 +658,10 @@ model GraphRun { errorCode String? errorMessage String? @db.Text cancelRequestedAt DateTime? + leaseOwner String? + leaseExpiresAt DateTime? + heartbeatAt DateTime? + workflowVersion Int @default(1) queuedAt DateTime @default(now()) startedAt DateTime? finishedAt DateTime? @@ -675,6 +679,8 @@ model GraphRun { @@index([userId, createdAt]) @@index([taskId]) @@index([targetType, targetId]) + @@index([workflowType, targetType, targetId, status]) + @@index([leaseExpiresAt]) @@map("graph_runs") } diff --git a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/hooks/useRebuildConfirm.ts b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/hooks/useRebuildConfirm.ts index 515c68a..680d01c 100644 --- a/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/hooks/useRebuildConfirm.ts +++ b/src/app/[locale]/workspace/[projectId]/modes/novel-promotion/hooks/useRebuildConfirm.ts @@ -91,7 +91,11 @@ export function useRebuildConfirm({ try { const downstream = await checkStoryboardDownstreamData() if (!downstream.shouldConfirm) { - await action() + try { + await action() + } finally { + setPendingActionType((current) => (current === actionType ? null : current)) + } return } diff --git a/src/app/api/novel-promotion/[projectId]/route.ts b/src/app/api/novel-promotion/[projectId]/route.ts index 11e7e41..2adb988 100644 --- a/src/app/api/novel-promotion/[projectId]/route.ts +++ b/src/app/api/novel-promotion/[projectId]/route.ts @@ -330,33 +330,6 @@ export const PATCH = apiHandler(async ( where: { projectId }, data: updateData}) - // 同步更新用户偏好配置(配置字段) - const preferenceFields = [ - 'analysisModel', 'characterModel', 'locationModel', 'storyboardModel', - 'editModel', 'videoModel', 'audioModel', 'videoRatio', 'artStyle', 'ttsRate', - ] as const - const preferenceUpdate: Record = {} - for (const field of preferenceFields) { - if (body[field] !== undefined) { - if ((MODEL_FIELDS as readonly string[]).includes(field)) { - validateModelKeyField(field as typeof MODEL_FIELDS[number], body[field]) - } - if (field === 'artStyle') { - preferenceUpdate[field] = validateArtStyleField(body[field]) - continue - } - preferenceUpdate[field] = body[field] - } - } - if (Object.keys(preferenceUpdate).length > 0) { - await prisma.userPreference.upsert({ - where: { userId: session.user.id }, - update: preferenceUpdate, - create: { - userId: session.user.id, - ...preferenceUpdate}}) - } - const novelPromotionDataWithSignedUrls = await attachMediaFieldsToProject(updatedNovelPromotionData) const fullProject = { diff --git a/src/lib/ark-api.ts b/src/lib/ark-api.ts index 4ae3f05..20da128 100644 --- a/src/lib/ark-api.ts +++ b/src/lib/ark-api.ts @@ -1,3 +1,4 @@ +import { getInternalBaseUrl } from '@/lib/env' import { logInfo as _ulogInfo, logError as _ulogError } from '@/lib/logging/core' /** * 火山引擎 API 统一调用工具 @@ -265,7 +266,7 @@ async function fetchWithTimeout( let fullUrl = url if (url.startsWith('/')) { // 服务端 fetch 需要完整 URL,使用 localhost:3000 作为基础地址 - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() fullUrl = `${baseUrl}${url}` } diff --git a/src/lib/env.ts b/src/lib/env.ts index 23f3654..4e72e07 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -3,12 +3,26 @@ * 集中管理环境变量的获取,避免到处重复 */ +export function getPublicBaseUrl(): string { + return process.env.NEXTAUTH_URL || 'http://localhost:3000' +} + /** - * 获取应用 baseUrl - * 用于内部 API 调用、webhook 回调等场景 + * 获取应用内部 baseUrl。 + * 用于容器内自调用、服务端 fetch 本应用 API、拉取本地 /api/files 资源等场景。 + */ +export function getInternalBaseUrl(): string { + return process.env.INTERNAL_APP_URL + || process.env.INTERNAL_TASK_API_BASE_URL + || process.env.NEXTAUTH_URL + || 'http://localhost:3000' +} + +/** + * 向后兼容:当前仓库中 getBaseUrl 主要用于服务端内部调用,因此默认返回内部地址。 */ export function getBaseUrl(): string { - return process.env.NEXTAUTH_URL || 'http://localhost:3000' + return getInternalBaseUrl() } /** @@ -16,7 +30,7 @@ export function getBaseUrl(): string { * @param path API 路径,如 '/api/user/balance' */ export function getApiUrl(path: string): string { - const baseUrl = getBaseUrl() + const baseUrl = getInternalBaseUrl() // 确保 path 以 / 开头 const normalizedPath = path.startsWith('/') ? path : `/${path}` return `${baseUrl}${normalizedPath}` diff --git a/src/lib/gemini-batch-utils.ts b/src/lib/gemini-batch-utils.ts index a0b50ee..25b299d 100644 --- a/src/lib/gemini-batch-utils.ts +++ b/src/lib/gemini-batch-utils.ts @@ -10,6 +10,7 @@ */ import { GoogleGenAI } from '@google/genai' +import { getInternalBaseUrl } from '@/lib/env' import { getImageBase64Cached } from './image-cache' import { logInternal } from './logging/semantic' @@ -89,7 +90,7 @@ export async function submitGeminiBatch( // 🔧 本地模式修复:相对路径需要补全完整 URL let fullUrl = imageData if (imageData.startsWith('/')) { - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() fullUrl = `${baseUrl}${imageData}` } const base64DataUrl = await getImageBase64Cached(fullUrl) diff --git a/src/lib/generators/image/gemini-compatible.ts b/src/lib/generators/image/gemini-compatible.ts index 6eca898..4929e1c 100644 --- a/src/lib/generators/image/gemini-compatible.ts +++ b/src/lib/generators/image/gemini-compatible.ts @@ -1,5 +1,6 @@ import { GoogleGenAI, HarmBlockThreshold, HarmCategory } from '@google/genai' import { getProviderConfig } from '@/lib/api-config' +import { getInternalBaseUrl } from '@/lib/env' import { getImageBase64Cached } from '@/lib/image-cache' import { BaseImageGenerator, type GenerateResult, type ImageGenerateParams } from '../base' import { setProxy } from '../../../../lib/prompts/proxy' @@ -16,7 +17,7 @@ type GeminiCompatibleOptions = { function toAbsoluteUrlIfNeeded(value: string): string { if (!value.startsWith('/')) return value - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() return `${baseUrl}${value}` } diff --git a/src/lib/generators/image/google.ts b/src/lib/generators/image/google.ts index aa8f161..49b5040 100644 --- a/src/lib/generators/image/google.ts +++ b/src/lib/generators/image/google.ts @@ -9,6 +9,7 @@ import { logInfo as _ulogInfo, logWarn as _ulogWarn } from '@/lib/logging/core' */ import { GoogleGenAI, HarmCategory, HarmBlockThreshold } from '@google/genai' +import { getInternalBaseUrl } from '@/lib/env' import { BaseImageGenerator, ImageGenerateParams, GenerateResult } from '../base' import { getProviderConfig } from '@/lib/api-config' import { getImageBase64Cached } from '@/lib/image-cache' @@ -94,7 +95,7 @@ export class GoogleGeminiImageGenerator extends BaseImageGenerator { // 🔧 本地模式修复:相对路径需要补全完整 URL let fullUrl = imageData if (imageData.startsWith('/')) { - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() fullUrl = `${baseUrl}${imageData}` } const base64DataUrl = await getImageBase64Cached(fullUrl) diff --git a/src/lib/llm-observe/config.ts b/src/lib/llm-observe/config.ts index 49f1daa..e131cc2 100644 --- a/src/lib/llm-observe/config.ts +++ b/src/lib/llm-observe/config.ts @@ -36,4 +36,8 @@ export const LLM_OBSERVE_REASONING_VISIBLE = parseBoolean( true, ) export const INTERNAL_TASK_TOKEN = process.env.INTERNAL_TASK_TOKEN || '' -export const INTERNAL_TASK_API_BASE_URL = process.env.INTERNAL_TASK_API_BASE_URL || process.env.NEXTAUTH_URL || 'http://127.0.0.1:3000' +export const INTERNAL_TASK_API_BASE_URL = + process.env.INTERNAL_TASK_API_BASE_URL + || process.env.INTERNAL_APP_URL + || process.env.NEXTAUTH_URL + || 'http://127.0.0.1:3000' diff --git a/src/lib/llm/vision.ts b/src/lib/llm/vision.ts index 5f809a0..68629f5 100644 --- a/src/lib/llm/vision.ts +++ b/src/lib/llm/vision.ts @@ -1,5 +1,6 @@ import OpenAI from 'openai' import { GoogleGenAI } from '@google/genai' +import { getInternalBaseUrl } from '@/lib/env' import { getProviderConfig, getProviderKey, @@ -246,7 +247,7 @@ export async function chatCompletionWithVision( _ulogInfo('[LLM Vision] 转换本地图片为 Base64') } catch (e) { _ulogError('[LLM Vision] 转换本地图片失败:', e) - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() finalUrl = `${baseUrl}${url}` } } diff --git a/src/lib/model-gateway/openai-compat/common.ts b/src/lib/model-gateway/openai-compat/common.ts index 38ae6f5..2de16fb 100644 --- a/src/lib/model-gateway/openai-compat/common.ts +++ b/src/lib/model-gateway/openai-compat/common.ts @@ -1,11 +1,12 @@ import OpenAI, { toFile } from 'openai' import { getProviderConfig } from '@/lib/api-config' +import { getInternalBaseUrl } from '@/lib/env' import { getImageBase64Cached } from '@/lib/image-cache' import type { OpenAICompatClientConfig } from '../types' function toAbsoluteUrlIfNeeded(value: string): string { if (!value.startsWith('/')) return value - const baseUrl = process.env.NEXTAUTH_URL || 'http://localhost:3000' + const baseUrl = getInternalBaseUrl() return `${baseUrl}${value}` } diff --git a/src/lib/novel-promotion/stages/voice-stage-runtime/types.ts b/src/lib/novel-promotion/stages/voice-stage-runtime/types.ts index 0a63aa1..fe61ac9 100644 --- a/src/lib/novel-promotion/stages/voice-stage-runtime/types.ts +++ b/src/lib/novel-promotion/stages/voice-stage-runtime/types.ts @@ -20,7 +20,7 @@ export interface VoiceLine { matchedPanelIndex?: number | null } -export type PendingVoiceTaskStatus = 'queued' | 'processing' | 'completed' | 'failed' | null +export type PendingVoiceTaskStatus = 'queued' | 'processing' | 'completed' | 'failed' | 'canceled' | null export interface PendingVoiceGenerationState { submittedUpdatedAt: string | null diff --git a/src/lib/novel-promotion/stages/voice-stage-runtime/useVoiceRuntimeSync.ts b/src/lib/novel-promotion/stages/voice-stage-runtime/useVoiceRuntimeSync.ts index a9235a2..21d7f7a 100644 --- a/src/lib/novel-promotion/stages/voice-stage-runtime/useVoiceRuntimeSync.ts +++ b/src/lib/novel-promotion/stages/voice-stage-runtime/useVoiceRuntimeSync.ts @@ -72,7 +72,13 @@ async function fetchTaskStatus(taskId: string): Promise<{ : typeof payload.task?.errorMessage === 'string' ? payload.task.errorMessage : null - if (status === 'queued' || status === 'processing' || status === 'completed' || status === 'failed') { + if ( + status === 'queued' + || status === 'processing' + || status === 'completed' + || status === 'failed' + || status === 'canceled' + ) { return { status, errorMessage } } return { status: null, errorMessage } @@ -97,7 +103,7 @@ export function useVoiceRuntimeSync({ useEffect(() => { for (const [lineId, pending] of pendingEntries) { - if (pending.taskStatus !== 'failed') continue + if (pending.taskStatus !== 'failed' && pending.taskStatus !== 'canceled') continue const failureKey = pending.taskId || lineId if (reportedFailedTaskIdsRef.current.has(failureKey)) continue reportedFailedTaskIdsRef.current.add(failureKey) diff --git a/src/lib/query/hooks/useTaskStatus.ts b/src/lib/query/hooks/useTaskStatus.ts index 27b69da..0631ba0 100644 --- a/src/lib/query/hooks/useTaskStatus.ts +++ b/src/lib/query/hooks/useTaskStatus.ts @@ -186,7 +186,9 @@ export function useTaskStatus(params: { const data = useMemo(() => { const tasks = query.data || [] const latest = snapshotQuery.data || tasks[0] || null - const lastFailed = latest?.status === 'failed' ? (latest.error || null) : null + const lastFailed = latest?.status === 'failed' || latest?.status === 'canceled' + ? (latest.error || null) + : null return { active: tasks, hasActive: tasks.length > 0, diff --git a/src/lib/run-runtime/graph-executor.ts b/src/lib/run-runtime/graph-executor.ts deleted file mode 100644 index 1e78bb9..0000000 --- a/src/lib/run-runtime/graph-executor.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { normalizeAnyError } from '@/lib/errors/normalize' -import { buildLeanState, createCheckpoint, getRunById } from './service' -import type { StateRef } from './types' - -type JsonRecord = Record - -export type GraphExecutorState = { - refs: StateRef - meta: JsonRecord -} - -export type GraphNodeContext = { - runId: string - projectId: string - userId: string - nodeKey: string - attempt: number - state: TState -} - -export type GraphNodeResult = { - output?: JsonRecord - checkpointRefs?: StateRef - checkpointMeta?: JsonRecord -} - -export type GraphNode = { - key: string - title: string - maxAttempts?: number - timeoutMs?: number - run: (context: GraphNodeContext) => Promise -} - -export type GraphExecutorInput = { - runId: string - projectId: string - userId: string - state: TState - nodes: GraphNode[] -} - -export class GraphCancellationError extends Error { - constructor(message = 'run canceled') { - super(message) - this.name = 'GraphCancellationError' - } -} - -function wait(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -function withTimeout(task: Promise, timeoutMs: number): Promise { - if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) { - return task - } - - return new Promise((resolve, reject) => { - const timer = setTimeout(() => { - reject(new Error(`node timeout after ${Math.floor(timeoutMs)}ms`)) - }, timeoutMs) - - task - .then((value) => { - clearTimeout(timer) - resolve(value) - }) - .catch((error: unknown) => { - clearTimeout(timer) - reject(error) - }) - }) -} - -function computeBackoffMs(attempt: number): number { - const base = Math.min(1_000 * Math.pow(2, Math.max(0, attempt - 1)), 10_000) - const jitter = Math.floor(Math.random() * 200) - return base + jitter -} - -async function assertRunActive(runId: string, userId: string) { - const run = await getRunById(runId) - if (!run || run.userId !== userId) { - throw new GraphCancellationError('run not found') - } - if (run.status === 'canceling' || run.status === 'canceled') { - throw new GraphCancellationError('run canceled') - } -} - -function mergeRefs(base: StateRef, next: StateRef | undefined): StateRef { - if (!next) return base - return { - scriptId: next.scriptId || base.scriptId, - storyboardId: next.storyboardId || base.storyboardId, - voiceLineBatchId: next.voiceLineBatchId || base.voiceLineBatchId, - versionHash: next.versionHash || base.versionHash, - cursor: next.cursor || base.cursor, - } -} - -export async function executePipelineGraph( - input: GraphExecutorInput, -): Promise { - const { nodes, runId, projectId, userId, state } = input - - for (const node of nodes) { - const maxAttempts = Number.isFinite(node.maxAttempts || 1) - ? Math.max(1, Math.floor(node.maxAttempts || 1)) - : 1 - - let attempt = 1 - while (attempt <= maxAttempts) { - await assertRunActive(runId, userId) - - try { - const result = await withTimeout( - node.run({ - runId, - projectId, - userId, - nodeKey: node.key, - attempt, - state, - }), - node.timeoutMs || 0, - ) - - state.refs = mergeRefs(state.refs, result?.checkpointRefs) - if (result?.checkpointMeta) { - state.meta = { - ...state.meta, - ...result.checkpointMeta, - } - } - - await createCheckpoint({ - runId, - nodeKey: node.key, - version: attempt, - state: buildLeanState({ - refs: state.refs, - meta: { - ...state.meta, - nodeTitle: node.title, - nodeAttempt: attempt, - ...(result?.output ? { output: result.output } : {}), - }, - }), - }) - - break - } catch (error) { - if (error instanceof GraphCancellationError) { - throw error - } - - const normalized = normalizeAnyError(error, { context: 'worker' }) - const shouldRetry = normalized.retryable && attempt < maxAttempts - if (!shouldRetry) { - throw error - } - - await wait(computeBackoffMs(attempt)) - attempt += 1 - } - } - } - - return state -} diff --git a/src/lib/run-runtime/langgraph-pipeline.ts b/src/lib/run-runtime/langgraph-pipeline.ts deleted file mode 100644 index 523c05a..0000000 --- a/src/lib/run-runtime/langgraph-pipeline.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { Annotation, END, START, StateGraph } from '@langchain/langgraph' -import { - executePipelineGraph, - type GraphExecutorInput, - type GraphExecutorState, -} from './graph-executor' - -function assertUniqueNodeKeys(input: GraphExecutorInput) { - const seen = new Set() - for (const node of input.nodes) { - if (seen.has(node.key)) { - throw new Error(`LANGGRAPH_NODE_KEY_DUPLICATE: ${node.key}`) - } - seen.add(node.key) - } -} - -function createStateAnnotation(initialState: TState) { - return Annotation.Root({ - pipelineState: Annotation({ - reducer: (_current, update) => update, - default: () => initialState, - }), - }) -} - -function readPipelineState(value: unknown): TState { - if (!value || typeof value !== 'object') { - throw new Error('LANGGRAPH_STATE_INVALID: state object missing') - } - const pipelineState = (value as { pipelineState?: unknown }).pipelineState - if (!pipelineState || typeof pipelineState !== 'object') { - throw new Error('LANGGRAPH_STATE_INVALID: pipelineState missing') - } - return pipelineState as TState -} - -function addEdgeUnsafe( - graphBuilder: unknown, - source: string, - target: string, -) { - const writable = graphBuilder as unknown as { - addEdge: (nextSource: string, nextTarget: string) => unknown - } - writable.addEdge(source, target) -} - -export async function runLangGraphPipeline( - input: GraphExecutorInput, -): Promise { - if (input.nodes.length === 0) { - return input.state - } - - assertUniqueNodeKeys(input) - - const stateAnnotation = createStateAnnotation(input.state) - const graphBuilder = new StateGraph(stateAnnotation) - - for (const node of input.nodes) { - graphBuilder.addNode(node.key, async (state: { pipelineState: unknown }) => { - const pipelineState = readPipelineState({ pipelineState: state.pipelineState }) - await executePipelineGraph({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - state: pipelineState, - nodes: [node], - }) - return { - pipelineState, - } - }) - } - - addEdgeUnsafe(graphBuilder, START, input.nodes[0].key) - for (let index = 0; index < input.nodes.length; index += 1) { - const currentKey = input.nodes[index].key - const nextKey = input.nodes[index + 1]?.key - addEdgeUnsafe(graphBuilder, currentKey, nextKey || END) - } - - const compiled = graphBuilder.compile() - const result = await compiled.invoke({ - pipelineState: input.state, - }) - return readPipelineState(result) -} diff --git a/src/lib/run-runtime/pipeline-graph.ts b/src/lib/run-runtime/pipeline-graph.ts deleted file mode 100644 index 893fd81..0000000 --- a/src/lib/run-runtime/pipeline-graph.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { - type GraphExecutorInput, - type GraphExecutorState, - type GraphNode, -} from './graph-executor' -import { runLangGraphPipeline } from './langgraph-pipeline' - -export type PipelineGraphState = GraphExecutorState -export type PipelineGraphNode = GraphNode -export type PipelineGraphInput = GraphExecutorInput - -export async function runPipelineGraph( - input: PipelineGraphInput, -): Promise { - return await runLangGraphPipeline(input) -} diff --git a/src/lib/run-runtime/quick-run-graph.ts b/src/lib/run-runtime/quick-run-graph.ts deleted file mode 100644 index e6c5a99..0000000 --- a/src/lib/run-runtime/quick-run-graph.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { runPipelineGraph, type PipelineGraphNode, type PipelineGraphState } from './pipeline-graph' - -type QuickRunInput = { - runId: string - projectId: string - userId: string - nodeKey: string - nodeTitle: string - state: TState - run: PipelineGraphNode['run'] - maxAttempts?: number - timeoutMs?: number -} - -export async function runQuickRunGraph(input: QuickRunInput) { - return await runPipelineGraph({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - state: input.state, - nodes: [ - { - key: input.nodeKey, - title: input.nodeTitle, - maxAttempts: input.maxAttempts, - timeoutMs: input.timeoutMs, - run: input.run, - }, - ], - }) -} diff --git a/src/lib/run-runtime/service.ts b/src/lib/run-runtime/service.ts index 9014918..3e9e762 100644 --- a/src/lib/run-runtime/service.ts +++ b/src/lib/run-runtime/service.ts @@ -1,4 +1,5 @@ import { prisma } from '@/lib/prisma' +import { resolveRetryInvalidationStepKeys } from '@/lib/workflow-engine/dependencies' import { RUN_EVENT_TYPE, RUN_STATE_MAX_BYTES, @@ -30,6 +31,10 @@ type GraphRunRow = { errorCode: string | null errorMessage: string | null cancelRequestedAt: Date | null + leaseOwner: string | null + leaseExpiresAt: Date | null + heartbeatAt: Date | null + workflowVersion: number queuedAt: Date startedAt: Date | null finishedAt: Date | null @@ -121,6 +126,7 @@ type GraphCheckpointModel = { type GraphArtifactModel = { upsert: (args: unknown) => Promise findMany: (args: unknown) => Promise + deleteMany: (args: unknown) => Promise<{ count: number }> } type GraphRuntimeTx = { @@ -226,6 +232,10 @@ function mapRunRow(run: GraphRunRow) { errorCode: run.errorCode, errorMessage: run.errorMessage, cancelRequestedAt: toIso(run.cancelRequestedAt), + leaseOwner: run.leaseOwner, + leaseExpiresAt: toIso(run.leaseExpiresAt), + heartbeatAt: toIso(run.heartbeatAt), + workflowVersion: run.workflowVersion, queuedAt: run.queuedAt.toISOString(), startedAt: toIso(run.startedAt), finishedAt: toIso(run.finishedAt), @@ -457,6 +467,8 @@ async function applyRunProjection(tx: GraphRuntimeTx, input: RunEventInput) { status: RUN_STATUS.COMPLETED, output: payload, finishedAt: now, + leaseOwner: null, + leaseExpiresAt: null, }, }) await tx.graphStep.updateMany({ @@ -482,6 +494,8 @@ async function applyRunProjection(tx: GraphRuntimeTx, input: RunEventInput) { errorCode: readString(payload, 'errorCode'), errorMessage: resolveErrorMessage(payload), finishedAt: now, + leaseOwner: null, + leaseExpiresAt: null, }, }) await tx.graphStep.updateMany({ @@ -507,6 +521,8 @@ async function applyRunProjection(tx: GraphRuntimeTx, input: RunEventInput) { data: { status: RUN_STATUS.CANCELED, finishedAt: now, + leaseOwner: null, + leaseExpiresAt: null, }, }) await tx.graphStep.updateMany({ @@ -651,6 +667,10 @@ export async function createRun(input: CreateRunInput) { targetId: input.targetId, status: RUN_STATUS.QUEUED, input: input.input || null, + leaseOwner: null, + leaseExpiresAt: null, + heartbeatAt: null, + workflowVersion: 1, queuedAt: new Date(), lastSeq: 0, }, @@ -676,6 +696,112 @@ export async function getRunById(runId: string) { return mapRunRow(row) } +export async function findReusableActiveRun(params: { + userId: string + projectId: string + workflowType: string + targetType: string + targetId: string +}) { + const rows = await runtimeClient.graphRun.findMany({ + where: { + userId: params.userId, + projectId: params.projectId, + workflowType: params.workflowType, + targetType: params.targetType, + targetId: params.targetId, + status: { + in: [RUN_STATUS.QUEUED, RUN_STATUS.RUNNING, RUN_STATUS.CANCELING], + }, + }, + orderBy: [ + { updatedAt: 'desc' }, + { createdAt: 'desc' }, + ], + take: 1, + }) + const row = rows[0] + return row ? mapRunRow(row) : null +} + +export async function claimRunLease(params: { + runId: string + userId: string + workerId: string + leaseMs: number +}) { + const now = new Date() + const leaseExpiresAt = new Date(now.getTime() + Math.max(5_000, Math.floor(params.leaseMs))) + const result = await runtimeClient.graphRun.updateMany({ + where: { + id: params.runId, + userId: params.userId, + status: { + in: [RUN_STATUS.QUEUED, RUN_STATUS.RUNNING, RUN_STATUS.CANCELING], + }, + OR: [ + { leaseOwner: null }, + { leaseOwner: params.workerId }, + { leaseExpiresAt: null }, + { leaseExpiresAt: { lt: now } }, + ], + }, + data: { + leaseOwner: params.workerId, + leaseExpiresAt, + heartbeatAt: now, + }, + }) + if (result.count === 0) { + return null + } + return await getRunById(params.runId) +} + +export async function renewRunLease(params: { + runId: string + userId: string + workerId: string + leaseMs: number +}) { + const now = new Date() + const leaseExpiresAt = new Date(now.getTime() + Math.max(5_000, Math.floor(params.leaseMs))) + const result = await runtimeClient.graphRun.updateMany({ + where: { + id: params.runId, + userId: params.userId, + leaseOwner: params.workerId, + status: { + in: [RUN_STATUS.QUEUED, RUN_STATUS.RUNNING, RUN_STATUS.CANCELING], + }, + }, + data: { + leaseExpiresAt, + heartbeatAt: now, + }, + }) + if (result.count === 0) { + return null + } + return await getRunById(params.runId) +} + +export async function releaseRunLease(params: { + runId: string + workerId: string +}) { + await runtimeClient.graphRun.updateMany({ + where: { + id: params.runId, + leaseOwner: params.workerId, + }, + data: { + leaseOwner: null, + leaseExpiresAt: null, + }, + }) +} + export async function getRunSnapshot(runId: string) { const [run, steps] = await Promise.all([ runtimeClient.graphRun.findUnique({ @@ -977,8 +1103,21 @@ export async function retryFailedStep(params: { throw new Error('RUN_STEP_NOT_FAILED') } + const steps = await tx.graphStep.findMany({ + where: { runId: params.runId }, + orderBy: [ + { stepIndex: 'asc' }, + { updatedAt: 'asc' }, + ], + }) const now = new Date() const nextAttempt = Math.max(1, step.currentAttempt + 1) + const invalidatedStepKeys = resolveRetryInvalidationStepKeys({ + workflowType: run.workflowType, + stepKey, + existingStepKeys: steps.map((item) => item.stepKey), + }) + const updatedRun = await tx.graphRun.update({ where: { id: params.runId }, data: { @@ -990,6 +1129,20 @@ export async function retryFailedStep(params: { startedAt: run.startedAt || now, }, }) + await tx.graphStep.updateMany({ + where: { + runId: params.runId, + stepKey: { in: invalidatedStepKeys }, + }, + data: { + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 0, + startedAt: null, + finishedAt: null, + lastErrorCode: null, + lastErrorMessage: null, + }, + }) const updatedStep = await tx.graphStep.update({ where: { runId_stepKey: { @@ -998,12 +1151,13 @@ export async function retryFailedStep(params: { }, }, data: { - status: RUN_STEP_STATUS.PENDING, currentAttempt: nextAttempt, - startedAt: now, - finishedAt: null, - lastErrorCode: null, - lastErrorMessage: null, + }, + }) + await tx.graphArtifact.deleteMany({ + where: { + runId: params.runId, + stepKey: { in: invalidatedStepKeys }, }, }) @@ -1011,6 +1165,7 @@ export async function retryFailedStep(params: { run: mapRunRow(updatedRun), step: mapStepRow(updatedStep), retryAttempt: nextAttempt, + invalidatedStepKeys, } }) } diff --git a/src/lib/run-runtime/types.ts b/src/lib/run-runtime/types.ts index a0cd098..b722c4a 100644 --- a/src/lib/run-runtime/types.ts +++ b/src/lib/run-runtime/types.ts @@ -69,6 +69,13 @@ export type CreateRunInput = { input?: Record | null } +export type RunLeaseState = { + leaseOwner?: string | null + leaseExpiresAt?: string | null + heartbeatAt?: string | null + workflowVersion?: number +} + export type ListRunsInput = { userId: string projectId?: string diff --git a/src/lib/run-runtime/workflow-lease.ts b/src/lib/run-runtime/workflow-lease.ts new file mode 100644 index 0000000..950e0a5 --- /dev/null +++ b/src/lib/run-runtime/workflow-lease.ts @@ -0,0 +1,72 @@ +import { TaskTerminatedError } from '@/lib/task/errors' +import { RUN_STATUS } from './types' +import { claimRunLease, getRunById, releaseRunLease, renewRunLease } from './service' + +const DEFAULT_RUN_LEASE_MS = 30_000 + +export function getDefaultRunLeaseMs() { + return DEFAULT_RUN_LEASE_MS +} + +export async function assertWorkflowRunActive(params: { + runId: string + workerId: string + stage: string +}) { + const run = await getRunById(params.runId) + if (!run) { + throw new TaskTerminatedError(params.runId, `Run terminated during ${params.stage}: run not found`) + } + if (run.leaseOwner !== params.workerId) { + throw new TaskTerminatedError(params.runId, `Run terminated during ${params.stage}: lease lost`) + } + if ( + run.status === RUN_STATUS.CANCELING + || run.status === RUN_STATUS.CANCELED + || run.status === RUN_STATUS.COMPLETED + || run.status === RUN_STATUS.FAILED + ) { + throw new TaskTerminatedError(params.runId, `Run terminated during ${params.stage}`) + } +} + +export async function withWorkflowRunLease(params: { + runId: string + userId: string + workerId: string + leaseMs?: number + run: () => Promise +}): Promise<{ claimed: boolean; result: T | null }> { + const leaseMs = params.leaseMs ?? DEFAULT_RUN_LEASE_MS + const claimed = await claimRunLease({ + runId: params.runId, + userId: params.userId, + workerId: params.workerId, + leaseMs, + }) + if (!claimed) { + return { claimed: false, result: null } + } + + const heartbeatTimer = setInterval(() => { + void renewRunLease({ + runId: params.runId, + userId: params.userId, + workerId: params.workerId, + leaseMs, + }) + }, Math.max(5_000, Math.floor(leaseMs / 3))) + + try { + return { + claimed: true, + result: await params.run(), + } + } finally { + clearInterval(heartbeatTimer) + await releaseRunLease({ + runId: params.runId, + workerId: params.workerId, + }) + } +} diff --git a/src/lib/storage/utils.ts b/src/lib/storage/utils.ts index a336ea5..fc4a392 100644 --- a/src/lib/storage/utils.ts +++ b/src/lib/storage/utils.ts @@ -1,9 +1,10 @@ import { StorageConfigError } from './errors' +import { getInternalBaseUrl } from '@/lib/env' export const DEFAULT_SIGNED_URL_EXPIRES_SECONDS = 24 * 60 * 60 export function resolveBaseUrl(): string { - return process.env.NEXTAUTH_URL || 'http://localhost:3000' + return getInternalBaseUrl() } export function toFetchableUrl(inputUrl: string): string { diff --git a/src/lib/task/client.ts b/src/lib/task/client.ts index 11648cd..7444c03 100644 --- a/src/lib/task/client.ts +++ b/src/lib/task/client.ts @@ -1,7 +1,7 @@ import { resolveTaskErrorMessage } from './error-message' import { apiFetch } from '@/lib/api-fetch' -type TaskStatus = 'queued' | 'processing' | 'completed' | 'failed' +type TaskStatus = 'queued' | 'processing' | 'completed' | 'failed' | 'canceled' type TaskSnapshot = { id: string @@ -63,7 +63,7 @@ export async function waitForTaskResult(taskId: string, options: WaitTaskOptions if (task.status === 'completed') { return task.result || { success: true } } - if (task.status === 'failed') { + if (task.status === 'failed' || task.status === 'canceled') { throw new Error(resolveTaskErrorMessage(task, `Task ${task.status}`)) } if (task.status !== 'queued' && task.status !== 'processing') { diff --git a/src/lib/task/publisher.ts b/src/lib/task/publisher.ts index dd18ff4..478e417 100644 --- a/src/lib/task/publisher.ts +++ b/src/lib/task/publisher.ts @@ -3,6 +3,7 @@ import { redis } from '@/lib/redis' import { TASK_EVENT_TYPE, TASK_SSE_EVENT_TYPE, + TASK_TYPE, type TaskEventType, type TaskLifecycleEventType, type SSEEvent, @@ -13,6 +14,10 @@ import { publishRunEvent } from '@/lib/run-runtime/publisher' const CHANNEL_PREFIX = 'task-events:project:' const STREAM_EPHEMERAL_ENABLED = process.env.LLM_STREAM_EPHEMERAL_ENABLED !== 'false' +const TASK_TYPES_WITH_DIRECT_RUN_EVENTS = new Set([ + TASK_TYPE.STORY_TO_SCRIPT_RUN, + TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, +]) type TaskEventRow = { id: number @@ -221,6 +226,9 @@ export function getProjectChannel(projectId: string) { } async function mirrorTaskEventToRun(message: SSEEvent) { + if (message.taskType && TASK_TYPES_WITH_DIRECT_RUN_EVENTS.has(message.taskType)) { + return + } const runEvents = mapTaskSSEEventToRunEvents(message) if (runEvents.length === 0) return for (const event of runEvents) { diff --git a/src/lib/task/queues.ts b/src/lib/task/queues.ts index d196e57..8ee66c2 100644 --- a/src/lib/task/queues.ts +++ b/src/lib/task/queues.ts @@ -59,6 +59,11 @@ const VOICE_TYPES = new Set([ TASK_TYPE.ASSET_HUB_VOICE_DESIGN, ]) +const SINGLE_ATTEMPT_TASK_TYPES = new Set([ + TASK_TYPE.STORY_TO_SCRIPT_RUN, + TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, +]) + export function getQueueTypeByTaskType(type: TaskType): QueueType { if (IMAGE_TYPES.has(type)) return 'image' if (VIDEO_TYPES.has(type)) return 'video' @@ -84,10 +89,14 @@ export async function addTaskJob(data: TaskJobData, opts?: JobsOptions) { const queueType = getQueueTypeByTaskType(data.type) const queue = getQueueByType(queueType) const priority = typeof opts?.priority === 'number' ? opts.priority : 0 + const attempts = SINGLE_ATTEMPT_TASK_TYPES.has(data.type) + ? 1 + : (typeof opts?.attempts === 'number' ? opts.attempts : undefined) return await queue.add(data.type, data, { jobId: data.taskId, priority, ...(opts || {}), + ...(attempts !== undefined ? { attempts } : {}), }) } diff --git a/src/lib/task/service.ts b/src/lib/task/service.ts index 4a90839..f40f428 100644 --- a/src/lib/task/service.ts +++ b/src/lib/task/service.ts @@ -469,6 +469,20 @@ export async function tryMarkTaskFailed(taskId: string, errorCode: string, error return result.count > 0 } +export async function tryMarkTaskCanceled(taskId: string, errorCode: string, errorMessage: string) { + const result = await taskModel.updateMany({ + where: activeTaskWhere(taskId), + data: { + status: TASK_STATUS.CANCELED, + errorCode: errorCode.slice(0, 80), + errorMessage: errorMessage.slice(0, 2000), + finishedAt: new Date(), + heartbeatAt: null, + }, + }) + return result.count > 0 +} + export async function markTaskProcessing(taskId: string, externalId?: string | null) { return await tryMarkTaskProcessing(taskId, externalId) } @@ -485,6 +499,10 @@ export async function markTaskFailed(taskId: string, errorCode: string, errorMes return await tryMarkTaskFailed(taskId, errorCode, errorMessage) } +export async function markTaskCanceled(taskId: string, errorCode: string, errorMessage: string) { + return await tryMarkTaskCanceled(taskId, errorCode, errorMessage) +} + export async function cancelTask(taskId: string, reason = 'Task cancelled by user') { const snapshot = await taskModel.findUnique({ where: { id: taskId }, @@ -514,7 +532,7 @@ export async function cancelTask(taskId: string, reason = 'Task cancelled by use } const failure = resolveCompensationFailure(rollbackResult, 'TASK_CANCELLED', reason) - const cancelled = await tryMarkTaskFailed(taskId, failure.errorCode, failure.errorMessage) + const cancelled = await tryMarkTaskCanceled(taskId, failure.errorCode, failure.errorMessage) const task = await taskModel.findUnique({ where: { id: taskId } }) return { task, diff --git a/src/lib/task/state-service.ts b/src/lib/task/state-service.ts index 0930192..8ad3381 100644 --- a/src/lib/task/state-service.ts +++ b/src/lib/task/state-service.ts @@ -125,7 +125,7 @@ export function resolveTargetState( const running = filtered.find((task) => ACTIVE_STATUS.has(task.status)) || null const terminal = filtered.find((task) => - task.status === 'completed' || task.status === 'failed' + task.status === 'completed' || task.status === 'failed' || task.status === 'canceled' ) || null const latest = running || terminal @@ -240,7 +240,7 @@ export async function queryTaskTargetStates(params: { targetId: item.targetId, })), status: { - in: ['queued', 'processing', 'completed', 'failed'], + in: ['queued', 'processing', 'completed', 'failed', 'canceled'], }, ...typeFilter, }, diff --git a/src/lib/task/submitter.ts b/src/lib/task/submitter.ts index af2997e..96b9258 100644 --- a/src/lib/task/submitter.ts +++ b/src/lib/task/submitter.ts @@ -3,6 +3,7 @@ import { addTaskJob } from './queues' import { publishTaskEvent } from './publisher' import { createTask, + getTaskById, markTaskEnqueueFailed, markTaskEnqueued, markTaskFailed, @@ -10,7 +11,7 @@ import { updateTaskBillingInfo, updateTaskPayload, } from './service' -import { TASK_EVENT_TYPE, type TaskBillingInfo, type TaskType } from './types' +import { TASK_EVENT_TYPE, TASK_STATUS, TASK_TYPE, type TaskBillingInfo, type TaskType } from './types' import { buildDefaultTaskBillingInfo, getBillingMode, @@ -21,9 +22,18 @@ import { import { ApiError } from '@/lib/api-errors' import { getTaskFlowMeta } from '@/lib/llm-observe/stage-pipeline' import type { Locale } from '@/i18n/routing' -import { attachTaskToRun, createRun } from '@/lib/run-runtime/service' +import { attachTaskToRun, createRun, findReusableActiveRun } from '@/lib/run-runtime/service' import { isAiTaskType, workflowTypeFromTaskType } from '@/lib/run-runtime/workflow' +const RUN_CENTRIC_TASK_TYPES = new Set([ + TASK_TYPE.STORY_TO_SCRIPT_RUN, + TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, +]) + +function isRunCentricTaskType(type: TaskType): boolean { + return RUN_CENTRIC_TASK_TYPES.has(type) +} + export function toObject(value: unknown): Record { if (!value || typeof value !== 'object' || Array.isArray(value)) return {} return value as Record @@ -125,6 +135,34 @@ export async function submitTask(params: { ? buildDefaultTaskBillingInfo(params.type, normalizedPayload) : null const resolvedBillingInfo = computedBillingInfo || params.billingInfo || null + const runCentricTask = isRunCentricTaskType(params.type) + const workflowType = workflowTypeFromTaskType(params.type) + const reusableRun = runCentricTask + ? await findReusableActiveRun({ + userId: params.userId, + projectId: params.projectId, + workflowType, + targetType: params.targetType, + targetId: params.targetId, + }) + : null + + if (runCentricTask && reusableRun?.taskId) { + const existingTask = await getTaskById(reusableRun.taskId) + if ( + existingTask + && (existingTask.status === TASK_STATUS.QUEUED || existingTask.status === TASK_STATUS.PROCESSING) + ) { + return { + success: true, + async: true, + taskId: existingTask.id, + runId: reusableRun.id, + status: existingTask.status, + deduped: true as const, + } + } + } const { task, deduped } = await createTask({ userId: params.userId, @@ -134,18 +172,29 @@ export async function submitTask(params: { targetType: params.targetType, targetId: params.targetId, payload: normalizedPayload, - dedupeKey: params.dedupeKey || null, + dedupeKey: runCentricTask ? null : (params.dedupeKey || null), priority: params.priority, maxAttempts: params.maxAttempts, billingInfo: resolvedBillingInfo || null, }) - let runId = resolveRunIdFromPayload(task.payload) - if (!deduped && isAiTaskType(params.type) && !runId) { + let runId = reusableRun?.id || resolveRunIdFromPayload(task.payload) + if (!deduped && reusableRun && runId) { + const payloadWithRunId = { + ...normalizedPayload, + runId, + meta: { + ...toObject(normalizedPayload.meta), + runId, + }, + } + await updateTaskPayload(task.id, payloadWithRunId) + await attachTaskToRun(runId, task.id) + } else if (!deduped && isAiTaskType(params.type) && !runId) { const run = await createRun({ userId: params.userId, projectId: params.projectId, episodeId: params.episodeId || null, - workflowType: workflowTypeFromTaskType(params.type), + workflowType, taskType: params.type, taskId: task.id, targetType: params.targetType, diff --git a/src/lib/task/types.ts b/src/lib/task/types.ts index 3f7633c..da7b6fb 100644 --- a/src/lib/task/types.ts +++ b/src/lib/task/types.ts @@ -5,6 +5,7 @@ export const TASK_STATUS = { PROCESSING: 'processing', COMPLETED: 'completed', FAILED: 'failed', + CANCELED: 'canceled', DISMISSED: 'dismissed', } as const diff --git a/src/lib/workers/handlers/llm-stream.ts b/src/lib/workers/handlers/llm-stream.ts index 8ad85d8..71d23e3 100644 --- a/src/lib/workers/handlers/llm-stream.ts +++ b/src/lib/workers/handlers/llm-stream.ts @@ -16,6 +16,11 @@ export type WorkerInternalLLMStreamCallbacks = InternalLLMStreamCallbacks & { flush: () => Promise } +export type WorkerLLMActiveController = { + assertActive?: (stage: string) => Promise + isActive?: () => Promise +} + export function createWorkerLLMStreamContext(job: Job, label = 'worker'): WorkerLLMStreamContext { return { streamRunId: `run:${job.data.taskId}:${label}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`, @@ -33,6 +38,7 @@ function nextWorkerStreamSeq(streamContext: WorkerLLMStreamContext, stepId: stri export function createWorkerLLMStreamCallbacks( job: Job, streamContext: WorkerLLMStreamContext, + activeController?: WorkerLLMActiveController, ): WorkerInternalLLMStreamCallbacks { const maxChunkChars = 128 const activeProbeIntervalMs = 600 @@ -54,13 +60,28 @@ export function createWorkerLLMStreamCallbacks( if (terminatedError) throw terminatedError } + const assertActive = async (stage: string) => { + if (activeController?.assertActive) { + await activeController.assertActive(stage) + return + } + await assertTaskActive(job, stage) + } + + const probeActive = async () => { + if (activeController?.isActive) { + return await activeController.isActive() + } + return await isTaskActive(job.data.taskId) + } + const scheduleActiveProbe = () => { if (terminatedError || checkingActive) return const now = Date.now() if (now - lastActiveProbeAt < activeProbeIntervalMs) return checkingActive = true lastActiveProbeAt = now - void isTaskActive(job.data.taskId) + void probeActive() .then((active) => { if (!active) { markTerminated('worker_llm_stream_probe') @@ -78,7 +99,7 @@ export function createWorkerLLMStreamCallbacks( .catch(() => undefined) .then(async () => { ensureActiveOrThrow(stage) - await assertTaskActive(job, stage) + await assertActive(stage) await work() }) .catch((error) => { diff --git a/src/lib/workers/handlers/script-to-storyboard.ts b/src/lib/workers/handlers/script-to-storyboard.ts index 4633d6e..2cb6447 100644 --- a/src/lib/workers/handlers/script-to-storyboard.ts +++ b/src/lib/workers/handlers/script-to-storyboard.ts @@ -11,12 +11,13 @@ import { onProjectNameAvailable } from '@/lib/logging/file-writer' import { buildCharactersIntroduction } from '@/lib/constants' import { TaskTerminatedError } from '@/lib/task/errors' import { reportTaskProgress } from '@/lib/workers/shared' -import { assertTaskActive } from '@/lib/workers/utils' import { + JsonParseError, + runScriptToStoryboardOrchestrator, type ScriptToStoryboardStepMeta, type ScriptToStoryboardStepOutput, + type ScriptToStoryboardOrchestratorResult, } from '@/lib/novel-promotion/script-to-storyboard/orchestrator' -import { runScriptToStoryboardGraph } from '@/lib/workflows/script-to-storyboard/graph' import { createWorkerLLMStreamCallbacks, createWorkerLLMStreamContext } from './llm-stream' import type { TaskJobData } from '@/lib/task/types' import { @@ -32,6 +33,7 @@ import { import { buildPrompt, getPromptTemplate, PROMPT_IDS } from '@/lib/prompt-i18n' import { resolveAnalysisModel } from './resolve-analysis-model' import { createArtifact } from '@/lib/run-runtime/service' +import { assertWorkflowRunActive, withWorkflowRunLease } from '@/lib/run-runtime/workflow-lease' import { parseStoryboardRetryTarget, runScriptToStoryboardAtomicRetry, @@ -40,6 +42,10 @@ import { type AnyObj = Record const MAX_VOICE_ANALYZE_ATTEMPTS = 2 +function buildWorkflowWorkerId(job: Job, label: string) { + return `${label}:${job.queueName}:${job.data.taskId}` +} + function isReasoningEffort(value: unknown): value is 'minimal' | 'low' | 'medium' | 'high' { return value === 'minimal' || value === 'low' || value === 'medium' || value === 'high' } @@ -135,19 +141,44 @@ export async function handleScriptToStoryboardTask(job: Job) { const reasoningEffort = requestedReasoningEffort || (isReasoningEffort(capabilityReasoningEffort) ? capabilityReasoningEffort : 'high') - await reportTaskProgress(job, 10, { - stage: 'script_to_storyboard_prepare', - stageLabel: 'progress.stage.scriptToStoryboardPrepare', - displayMode: 'detail', - }) - const phase1PlanTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_STORYBOARD_PLAN, job.data.locale) const phase2CinematographyTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_CINEMATOGRAPHER, job.data.locale) const phase2ActingTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_ACTING_DIRECTION, job.data.locale) const phase3DetailTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_STORYBOARD_DETAIL, job.data.locale) - + const payloadMeta = typeof payload.meta === 'object' && payload.meta !== null + ? (payload.meta as AnyObj) + : {} + const runId = typeof payload.runId === 'string' && payload.runId.trim() + ? payload.runId.trim() + : (typeof payloadMeta.runId === 'string' ? payloadMeta.runId.trim() : '') + if (!runId) { + throw new Error('runId is required for script_to_storyboard pipeline') + } + const workerId = buildWorkflowWorkerId(job, 'script_to_storyboard') + const assertRunActive = async (stage: string) => { + await assertWorkflowRunActive({ + runId, + workerId, + stage, + }) + } const streamContext = createWorkerLLMStreamContext(job, 'script_to_storyboard') - const callbacks = createWorkerLLMStreamCallbacks(job, streamContext) + const callbacks = createWorkerLLMStreamCallbacks(job, streamContext, { + assertActive: async (stage) => { + await assertRunActive(stage) + }, + isActive: async () => { + try { + await assertRunActive('worker_llm_stream_probe') + return true + } catch (error) { + if (error instanceof TaskTerminatedError) { + return false + } + throw error + } + }, + }) const runStep = async ( meta: ScriptToStoryboardStepMeta, @@ -158,7 +189,7 @@ export async function handleScriptToStoryboardTask(job: Job) { void _maxOutputTokens const stepAttempt = meta.stepAttempt || (retryStepKey && meta.stepId === retryStepKey ? retryStepAttempt : 1) - await assertTaskActive(job, `script_to_storyboard_step:${meta.stepId}`) + await assertRunActive(`script_to_storyboard_step:${meta.stepId}`) const progress = 15 + Math.min(70, Math.floor((meta.stepIndex / Math.max(1, meta.stepTotal)) * 70)) await reportTaskProgress(job, progress, { stage: 'script_to_storyboard_step', @@ -177,7 +208,6 @@ export async function handleScriptToStoryboardTask(job: Job) { blockedBy: Array.isArray(meta.blockedBy) ? meta.blockedBy : [], }) - // Log prompt input logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { action: `SCRIPT_TO_STORYBOARD_PROMPT:${action}`, input: { stepId: meta.stepId, stepTitle: meta.stepTitle, prompt }, @@ -198,10 +228,8 @@ export async function handleScriptToStoryboardTask(job: Job) { reasoning, reasoningEffort, }) - // Ensure this step's stream terminal events are flushed before entering dependent steps. await callbacks.flush() - // Log AI response output (full raw text included for JSON parse debugging) logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { action: `SCRIPT_TO_STORYBOARD_OUTPUT:${action}`, output: { @@ -220,405 +248,415 @@ export async function handleScriptToStoryboardTask(job: Job) { } } - const payloadMeta = typeof payload.meta === 'object' && payload.meta !== null - ? (payload.meta as AnyObj) - : {} - const runId = typeof payload.runId === 'string' && payload.runId.trim() - ? payload.runId.trim() - : (typeof payloadMeta.runId === 'string' ? payloadMeta.runId.trim() : '') - if (!runId) { - throw new Error('runId is required for script_to_storyboard pipeline') - } + const leaseResult = await withWorkflowRunLease({ + runId, + userId: job.data.userId, + workerId, + run: async () => { + await reportTaskProgress(job, 10, { + stage: 'script_to_storyboard_prepare', + stageLabel: 'progress.stage.scriptToStoryboardPrepare', + displayMode: 'detail', + }) - const orchestratorResult = await (async () => { - try { - return await withInternalLLMStreamCallbacks( - callbacks, - async () => { - if (retryTarget) { - const clipIndex = clips.findIndex((clip) => clip.id === retryTarget.clipId) - if (clipIndex < 0) { - throw new Error(`Retry clip not found: ${retryTarget.clipId}`) - } - const clip = clips[clipIndex] - const atomicResult = await runScriptToStoryboardAtomicRetry({ - runId, - retryTarget, - retryStepAttempt, - clip: { - id: clip.id, - content: clip.content, - characters: clip.characters, - location: clip.location, - screenplay: clip.screenplay, - }, - clipIndex, - totalClipCount: clips.length, - novelPromotionData: { - characters: novelData.characters || [], - locations: novelData.locations || [], - }, - promptTemplates: { - phase1PlanTemplate, - phase2CinematographyTemplate, - phase2ActingTemplate, - phase3DetailTemplate, - }, - runStep, - }) - return { - clipPanels: atomicResult.clipPanels, - phase1PanelsByClipId: atomicResult.phase1PanelsByClipId, - phase2CinematographyByClipId: atomicResult.phase2CinematographyByClipId, - phase2ActingByClipId: atomicResult.phase2ActingByClipId, - phase3PanelsByClipId: atomicResult.phase3PanelsByClipId, - summary: { - clipCount: selectedClips.length, - totalPanelCount: atomicResult.totalPanelCount, - totalStepCount: atomicResult.totalStepCount, - }, - } - } + const orchestratorResult: ScriptToStoryboardOrchestratorResult = await (async () => { + try { + return await withInternalLLMStreamCallbacks( + callbacks, + async () => { + if (retryTarget) { + const clipIndex = clips.findIndex((clip) => clip.id === retryTarget.clipId) + if (clipIndex < 0) { + throw new Error(`Retry clip not found: ${retryTarget.clipId}`) + } + const clip = clips[clipIndex] + const atomicResult = await runScriptToStoryboardAtomicRetry({ + runId, + retryTarget, + retryStepAttempt, + clip: { + id: clip.id, + content: clip.content, + characters: clip.characters, + location: clip.location, + screenplay: clip.screenplay, + }, + clipIndex, + totalClipCount: clips.length, + novelPromotionData: { + characters: novelData.characters || [], + locations: novelData.locations || [], + }, + promptTemplates: { + phase1PlanTemplate, + phase2CinematographyTemplate, + phase2ActingTemplate, + phase3DetailTemplate, + }, + runStep, + }) + return { + clipPanels: atomicResult.clipPanels, + phase1PanelsByClipId: atomicResult.phase1PanelsByClipId, + phase2CinematographyByClipId: atomicResult.phase2CinematographyByClipId, + phase2ActingByClipId: atomicResult.phase2ActingByClipId, + phase3PanelsByClipId: atomicResult.phase3PanelsByClipId, + summary: { + clipCount: selectedClips.length, + totalPanelCount: atomicResult.totalPanelCount, + totalStepCount: atomicResult.totalStepCount, + }, + } + } - const pipelineState = await runScriptToStoryboardGraph({ + try { + return await runScriptToStoryboardOrchestrator({ + concurrency: workflowConcurrency.analysis, + clips: selectedClips.map((clip) => ({ + id: clip.id, + content: clip.content, + characters: clip.characters, + location: clip.location, + screenplay: clip.screenplay, + })), + novelPromotionData: { + characters: novelData.characters || [], + locations: novelData.locations || [], + }, + promptTemplates: { + phase1PlanTemplate, + phase2CinematographyTemplate, + phase2ActingTemplate, + phase3DetailTemplate, + }, + runStep, + }) + } catch (error) { + if (error instanceof JsonParseError) { + logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { + action: 'SCRIPT_TO_STORYBOARD_PARSE_ERROR', + error: { + message: error.message, + rawTextPreview: error.rawText.slice(0, 3000), + rawTextLength: error.rawText.length, + }, + model, + }) + } + throw error + } + }, + ) + } finally { + await callbacks.flush() + } + })() + + const phase1Map = orchestratorResult.phase1PanelsByClipId || {} + const phase2CinematographyMap = orchestratorResult.phase2CinematographyByClipId || {} + const phase2ActingMap = orchestratorResult.phase2ActingByClipId || {} + const phase3Map = orchestratorResult.phase3PanelsByClipId || {} + + for (const clip of selectedClips) { + const phase1Panels = phase1Map[clip.id] || [] + if (phase1Panels.length > 0) { + await createArtifact({ runId, - projectId, - userId: job.data.userId, - concurrency: workflowConcurrency.analysis, - clips: selectedClips.map((clip) => ({ - id: clip.id, - content: clip.content, - characters: clip.characters, - location: clip.location, - screenplay: clip.screenplay, - })), - novelPromotionData: { - characters: novelData.characters || [], - locations: novelData.locations || [], - }, - promptTemplates: { - phase1PlanTemplate, - phase2CinematographyTemplate, - phase2ActingTemplate, - phase3DetailTemplate, - }, - runStep, - onParseError: (err) => { - logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { - action: 'SCRIPT_TO_STORYBOARD_PARSE_ERROR', - error: { - message: err.message, - rawTextPreview: err.rawText.slice(0, 3000), - rawTextLength: err.rawText.length, - }, - model, - }) + stepKey: `clip_${clip.id}_phase1`, + artifactType: 'storyboard.clip.phase1', + refId: clip.id, + payload: { + panels: phase1Panels, }, }) - const result = pipelineState.orchestratorResult - if (!result) { - throw new Error('script_to_storyboard orchestrator produced no result') - } - return result - }, - ) - } finally { - await callbacks.flush() - } - })() + } + const phase2Cinematography = phase2CinematographyMap[clip.id] || [] + if (phase2Cinematography.length > 0) { + await createArtifact({ + runId, + stepKey: `clip_${clip.id}_phase2_cinematography`, + artifactType: 'storyboard.clip.phase2.cine', + refId: clip.id, + payload: { + rules: phase2Cinematography, + }, + }) + } + const phase2Acting = phase2ActingMap[clip.id] || [] + if (phase2Acting.length > 0) { + await createArtifact({ + runId, + stepKey: `clip_${clip.id}_phase2_acting`, + artifactType: 'storyboard.clip.phase2.acting', + refId: clip.id, + payload: { + directions: phase2Acting, + }, + }) + } + const phase3Panels = phase3Map[clip.id] || [] + if (phase3Panels.length > 0) { + await createArtifact({ + runId, + stepKey: `clip_${clip.id}_phase3_detail`, + artifactType: 'storyboard.clip.phase3', + refId: clip.id, + payload: { + panels: phase3Panels, + }, + }) + } + } - const phase1Map = orchestratorResult.phase1PanelsByClipId || {} - const phase2CinematographyMap = orchestratorResult.phase2CinematographyByClipId || {} - const phase2ActingMap = orchestratorResult.phase2ActingByClipId || {} - const phase3Map = orchestratorResult.phase3PanelsByClipId || {} + await reportTaskProgress(job, 80, { + stage: 'script_to_storyboard_persist', + stageLabel: 'progress.stage.scriptToStoryboardPersist', + displayMode: 'detail', + }) + await assertRunActive('script_to_storyboard_persist') - for (const clip of selectedClips) { - const phase1Panels = phase1Map[clip.id] || [] - if (phase1Panels.length > 0) { - await createArtifact({ - runId, - stepKey: `clip_${clip.id}_phase1`, - artifactType: 'storyboard.clip.phase1', - refId: clip.id, - payload: { - panels: phase1Panels, + const persistedStoryboards = await persistStoryboardsAndPanels({ + episodeId, + clipPanels: orchestratorResult.clipPanels, + }) + + if (skipVoiceAnalyze) { + await reportTaskProgress(job, 96, { + stage: 'script_to_storyboard_persist_done', + stageLabel: 'progress.stage.scriptToStoryboardPersistDone', + displayMode: 'detail', + message: 'step retry complete', + stepId: retryStepKey || undefined, + stepAttempt: + typeof payload.retryStepAttempt === 'number' && Number.isFinite(payload.retryStepAttempt) + ? Math.max(1, Math.floor(payload.retryStepAttempt)) + : undefined, + }) + return { + episodeId, + storyboardCount: persistedStoryboards.length, + panelCount: orchestratorResult.summary.totalPanelCount, + voiceLineCount: 0, + retryStepKey, + } + } + + if (!episode.novelText || !episode.novelText.trim()) { + throw new Error('No novel text to analyze') + } + + const voicePrompt = buildPrompt({ + promptId: PROMPT_IDS.NP_VOICE_ANALYSIS, + locale: job.data.locale, + variables: { + input: episode.novelText, + characters_lib_name: (novelData.characters || []).length > 0 + ? (novelData.characters || []).map((item) => item.name).join('、') + : '无', + characters_introduction: buildCharactersIntroduction(novelData.characters || []), + storyboard_json: buildStoryboardJson(persistedStoryboards), }, }) - } - const phase2Cinematography = phase2CinematographyMap[clip.id] || [] - if (phase2Cinematography.length > 0) { - await createArtifact({ - runId, - stepKey: `clip_${clip.id}_phase2_cinematography`, - artifactType: 'storyboard.clip.phase2.cine', - refId: clip.id, - payload: { - rules: phase2Cinematography, - }, - }) - } - const phase2Acting = phase2ActingMap[clip.id] || [] - if (phase2Acting.length > 0) { - await createArtifact({ - runId, - stepKey: `clip_${clip.id}_phase2_acting`, - artifactType: 'storyboard.clip.phase2.acting', - refId: clip.id, - payload: { - directions: phase2Acting, - }, - }) - } - const phase3Panels = phase3Map[clip.id] || [] - if (phase3Panels.length > 0) { - await createArtifact({ - runId, - stepKey: `clip_${clip.id}_phase3_detail`, - artifactType: 'storyboard.clip.phase3', - refId: clip.id, - payload: { - panels: phase3Panels, - }, - }) - } - } - await reportTaskProgress(job, 80, { - stage: 'script_to_storyboard_persist', - stageLabel: 'progress.stage.scriptToStoryboardPersist', - displayMode: 'detail', - }) - await assertTaskActive(job, 'script_to_storyboard_persist') - - const persistedStoryboards = await persistStoryboardsAndPanels({ - episodeId, - clipPanels: orchestratorResult.clipPanels, - }) - - if (skipVoiceAnalyze) { - await reportTaskProgress(job, 96, { - stage: 'script_to_storyboard_persist_done', - stageLabel: 'progress.stage.scriptToStoryboardPersistDone', - displayMode: 'detail', - message: 'step retry complete', - stepId: retryStepKey || undefined, - stepAttempt: - typeof payload.retryStepAttempt === 'number' && Number.isFinite(payload.retryStepAttempt) - ? Math.max(1, Math.floor(payload.retryStepAttempt)) - : undefined, - }) - return { - episodeId, - storyboardCount: persistedStoryboards.length, - panelCount: orchestratorResult.summary.totalPanelCount, - voiceLineCount: 0, - retryStepKey, - } - } - - if (!episode.novelText || !episode.novelText.trim()) { - throw new Error('No novel text to analyze') - } - - const voicePrompt = buildPrompt({ - promptId: PROMPT_IDS.NP_VOICE_ANALYSIS, - locale: job.data.locale, - variables: { - input: episode.novelText, - characters_lib_name: (novelData.characters || []).length > 0 - ? (novelData.characters || []).map((item) => item.name).join('、') - : '无', - characters_introduction: buildCharactersIntroduction(novelData.characters || []), - storyboard_json: buildStoryboardJson(persistedStoryboards), - }, - }) - - let voiceLineRows: JsonRecord[] | null = null - let voiceLastError: Error | null = null - const voiceStepMeta: ScriptToStoryboardStepMeta = { - stepId: 'voice_analyze', - stepTitle: 'progress.streamStep.voiceAnalyze', - stepIndex: orchestratorResult.summary.totalStepCount, - stepTotal: orchestratorResult.summary.totalStepCount, - retryable: true, - } - try { - for (let voiceAttempt = 1; voiceAttempt <= MAX_VOICE_ANALYZE_ATTEMPTS; voiceAttempt++) { - const meta: ScriptToStoryboardStepMeta = { - ...voiceStepMeta, - stepAttempt: voiceAttempt, + let voiceLineRows: JsonRecord[] | null = null + let voiceLastError: Error | null = null + const voiceStepMeta: ScriptToStoryboardStepMeta = { + stepId: 'voice_analyze', + stepTitle: 'progress.streamStep.voiceAnalyze', + stepIndex: orchestratorResult.summary.totalStepCount, + stepTotal: orchestratorResult.summary.totalStepCount, + retryable: true, } try { - const voiceOutput = await withInternalLLMStreamCallbacks( - callbacks, - async () => await runStep(meta, voicePrompt, 'voice_analyze', 2600), - ) - voiceLineRows = parseVoiceLinesJson(voiceOutput.text) - break - } catch (error) { - if (error instanceof TaskTerminatedError) { - throw error + for (let voiceAttempt = 1; voiceAttempt <= MAX_VOICE_ANALYZE_ATTEMPTS; voiceAttempt++) { + const meta: ScriptToStoryboardStepMeta = { + ...voiceStepMeta, + stepAttempt: voiceAttempt, + } + try { + const voiceOutput = await withInternalLLMStreamCallbacks( + callbacks, + async () => await runStep(meta, voicePrompt, 'voice_analyze', 2600), + ) + voiceLineRows = parseVoiceLinesJson(voiceOutput.text) + break + } catch (error) { + if (error instanceof TaskTerminatedError) { + throw error + } + voiceLastError = error instanceof Error ? error : new Error(String(error)) + if (voiceAttempt < MAX_VOICE_ANALYZE_ATTEMPTS) { + await reportTaskProgress(job, 84, { + stage: 'script_to_storyboard_step', + stageLabel: 'progress.stage.scriptToStoryboardStep', + displayMode: 'detail', + message: `台词分析失败,准备重试 (${voiceAttempt + 1}/${MAX_VOICE_ANALYZE_ATTEMPTS})`, + stepId: voiceStepMeta.stepId, + stepAttempt: voiceAttempt + 1, + stepTitle: voiceStepMeta.stepTitle, + stepIndex: voiceStepMeta.stepIndex, + stepTotal: voiceStepMeta.stepTotal, + }) + } + } } - voiceLastError = error instanceof Error ? error : new Error(String(error)) - if (voiceAttempt < MAX_VOICE_ANALYZE_ATTEMPTS) { - await reportTaskProgress(job, 84, { - stage: 'script_to_storyboard_step', - stageLabel: 'progress.stage.scriptToStoryboardStep', - displayMode: 'detail', - message: `台词分析失败,准备重试 (${voiceAttempt + 1}/${MAX_VOICE_ANALYZE_ATTEMPTS})`, - stepId: voiceStepMeta.stepId, - stepAttempt: voiceAttempt + 1, - stepTitle: voiceStepMeta.stepTitle, - stepIndex: voiceStepMeta.stepIndex, - stepTotal: voiceStepMeta.stepTotal, - }) + } finally { + await callbacks.flush() + } + if (!voiceLineRows) { + throw voiceLastError! + } + + await createArtifact({ + runId, + stepKey: 'voice_analyze', + artifactType: 'voice.lines', + refId: episodeId, + payload: { + lines: voiceLineRows, + }, + }) + + await assertRunActive('script_to_storyboard_voice_persist') + + const panelIdByStoryboardPanel = new Map() + for (const storyboard of persistedStoryboards) { + for (const panel of storyboard.panels) { + panelIdByStoryboardPanel.set(`${storyboard.storyboardId}:${panel.panelIndex}`, panel.id) } } - } - } finally { - await callbacks.flush() - } - if (!voiceLineRows) { - throw voiceLastError! - } - await createArtifact({ - runId, - stepKey: 'voice_analyze', - artifactType: 'voice.lines', - refId: episodeId, - payload: { - lines: voiceLineRows, + const createdVoiceLines = await prisma.$transaction(async (tx) => { + const voiceLineModel = tx.novelPromotionVoiceLine as unknown as { + upsert?: (args: unknown) => Promise<{ id: string }> + create: (args: unknown) => Promise<{ id: string }> + deleteMany: (args: unknown) => Promise + } + const created: Array<{ id: string }> = [] + for (let i = 0; i < voiceLineRows.length; i += 1) { + const row = voiceLineRows[i] || {} + const matchedPanel = asJsonRecord(row.matchedPanel) + const matchedStoryboardId = + matchedPanel && typeof matchedPanel.storyboardId === 'string' + ? matchedPanel.storyboardId.trim() + : null + const matchedPanelIndex = matchedPanel ? toPositiveInt(matchedPanel.panelIndex) : null + let matchedPanelId: string | null = null + if (matchedPanel !== null) { + if (!matchedStoryboardId || matchedPanelIndex === null) { + throw new Error(`voice line ${i + 1} has invalid matchedPanel reference`) + } + const panelKey = `${matchedStoryboardId}:${matchedPanelIndex}` + const resolvedPanelId = panelIdByStoryboardPanel.get(panelKey) + if (!resolvedPanelId) { + throw new Error(`voice line ${i + 1} references non-existent panel ${panelKey}`) + } + matchedPanelId = resolvedPanelId + } + + if (typeof row.emotionStrength !== 'number' || !Number.isFinite(row.emotionStrength)) { + throw new Error(`voice line ${i + 1} is missing valid emotionStrength`) + } + const emotionStrength = Math.min(1, Math.max(0.1, row.emotionStrength)) + + if (typeof row.lineIndex !== 'number' || !Number.isFinite(row.lineIndex)) { + throw new Error(`voice line ${i + 1} is missing valid lineIndex`) + } + const lineIndex = Math.floor(row.lineIndex) + if (lineIndex <= 0) { + throw new Error(`voice line ${i + 1} has invalid lineIndex`) + } + if (typeof row.speaker !== 'string' || !row.speaker.trim()) { + throw new Error(`voice line ${i + 1} is missing valid speaker`) + } + if (typeof row.content !== 'string' || !row.content.trim()) { + throw new Error(`voice line ${i + 1} is missing valid content`) + } + + const upsertArgs = { + where: { + episodeId_lineIndex: { + episodeId, + lineIndex, + }, + }, + create: { + episodeId, + lineIndex, + speaker: row.speaker.trim(), + content: row.content, + emotionStrength, + matchedPanelId, + matchedStoryboardId: matchedPanelId ? matchedStoryboardId : null, + matchedPanelIndex, + }, + update: { + speaker: row.speaker.trim(), + content: row.content, + emotionStrength, + matchedPanelId, + matchedStoryboardId: matchedPanelId ? matchedStoryboardId : null, + matchedPanelIndex, + }, + select: { id: true }, + } + const createdRow = typeof voiceLineModel.upsert === 'function' + ? await voiceLineModel.upsert(upsertArgs) + : ( + process.env.NODE_ENV === 'test' + ? await voiceLineModel.create({ + data: upsertArgs.create, + select: { id: true }, + }) + : (() => { throw new Error('novelPromotionVoiceLine.upsert unavailable') })() + ) + created.push(createdRow) + } + + const nextLineIndexes = voiceLineRows + .map((row) => (typeof row.lineIndex === 'number' && Number.isFinite(row.lineIndex) ? Math.floor(row.lineIndex) : -1)) + .filter((value) => value > 0) + if (nextLineIndexes.length === 0) { + await voiceLineModel.deleteMany({ + where: { + episodeId, + }, + }) + } else { + await voiceLineModel.deleteMany({ + where: { + episodeId, + lineIndex: { + notIn: nextLineIndexes, + }, + }, + }) + } + return created + }, { timeout: 15000 }) + + await reportTaskProgress(job, 96, { + stage: 'script_to_storyboard_persist_done', + stageLabel: 'progress.stage.scriptToStoryboardPersistDone', + displayMode: 'detail', + }) + + return { + episodeId, + storyboardCount: persistedStoryboards.length, + panelCount: orchestratorResult.summary.totalPanelCount, + voiceLineCount: createdVoiceLines.length, + } }, }) - await assertTaskActive(job, 'script_to_storyboard_voice_persist') - const panelIdByStoryboardPanel = new Map() - for (const storyboard of persistedStoryboards) { - for (const panel of storyboard.panels) { - panelIdByStoryboardPanel.set(`${storyboard.storyboardId}:${panel.panelIndex}`, panel.id) + if (!leaseResult.claimed || !leaseResult.result) { + return { + runId, + skipped: true, + episodeId, } } - const createdVoiceLines = await prisma.$transaction(async (tx) => { - const voiceLineModel = tx.novelPromotionVoiceLine as unknown as { - upsert?: (args: unknown) => Promise<{ id: string }> - create: (args: unknown) => Promise<{ id: string }> - deleteMany: (args: unknown) => Promise - } - const created: Array<{ id: string }> = [] - for (let i = 0; i < voiceLineRows.length; i += 1) { - const row = voiceLineRows[i] || {} - const matchedPanel = asJsonRecord(row.matchedPanel) - const matchedStoryboardId = - matchedPanel && typeof matchedPanel.storyboardId === 'string' - ? matchedPanel.storyboardId.trim() - : null - const matchedPanelIndex = matchedPanel ? toPositiveInt(matchedPanel.panelIndex) : null - let matchedPanelId: string | null = null - if (matchedPanel !== null) { - if (!matchedStoryboardId || matchedPanelIndex === null) { - throw new Error(`voice line ${i + 1} has invalid matchedPanel reference`) - } - const panelKey = `${matchedStoryboardId}:${matchedPanelIndex}` - const resolvedPanelId = panelIdByStoryboardPanel.get(panelKey) - if (!resolvedPanelId) { - throw new Error(`voice line ${i + 1} references non-existent panel ${panelKey}`) - } - matchedPanelId = resolvedPanelId - } - - if (typeof row.emotionStrength !== 'number' || !Number.isFinite(row.emotionStrength)) { - throw new Error(`voice line ${i + 1} is missing valid emotionStrength`) - } - const emotionStrength = Math.min(1, Math.max(0.1, row.emotionStrength)) - - if (typeof row.lineIndex !== 'number' || !Number.isFinite(row.lineIndex)) { - throw new Error(`voice line ${i + 1} is missing valid lineIndex`) - } - const lineIndex = Math.floor(row.lineIndex) - if (lineIndex <= 0) { - throw new Error(`voice line ${i + 1} has invalid lineIndex`) - } - if (typeof row.speaker !== 'string' || !row.speaker.trim()) { - throw new Error(`voice line ${i + 1} is missing valid speaker`) - } - if (typeof row.content !== 'string' || !row.content.trim()) { - throw new Error(`voice line ${i + 1} is missing valid content`) - } - - const upsertArgs = { - where: { - episodeId_lineIndex: { - episodeId, - lineIndex, - }, - }, - create: { - episodeId, - lineIndex, - speaker: row.speaker.trim(), - content: row.content, - emotionStrength, - matchedPanelId, - matchedStoryboardId: matchedPanelId ? matchedStoryboardId : null, - matchedPanelIndex, - }, - update: { - speaker: row.speaker.trim(), - content: row.content, - emotionStrength, - matchedPanelId, - matchedStoryboardId: matchedPanelId ? matchedStoryboardId : null, - matchedPanelIndex, - }, - select: { id: true }, - } - const createdRow = typeof voiceLineModel.upsert === 'function' - ? await voiceLineModel.upsert(upsertArgs) - : ( - process.env.NODE_ENV === 'test' - ? await voiceLineModel.create({ - data: upsertArgs.create, - select: { id: true }, - }) - : (() => { throw new Error('novelPromotionVoiceLine.upsert unavailable') })() - ) - created.push(createdRow) - } - - const nextLineIndexes = voiceLineRows - .map((row) => (typeof row.lineIndex === 'number' && Number.isFinite(row.lineIndex) ? Math.floor(row.lineIndex) : -1)) - .filter((value) => value > 0) - if (nextLineIndexes.length === 0) { - await voiceLineModel.deleteMany({ - where: { - episodeId, - }, - }) - } else { - await voiceLineModel.deleteMany({ - where: { - episodeId, - lineIndex: { - notIn: nextLineIndexes, - }, - }, - }) - } - return created - }, { timeout: 15000 }) - - await reportTaskProgress(job, 96, { - stage: 'script_to_storyboard_persist_done', - stageLabel: 'progress.stage.scriptToStoryboardPersistDone', - displayMode: 'detail', - }) - - return { - episodeId, - storyboardCount: persistedStoryboards.length, - panelCount: orchestratorResult.summary.totalPanelCount, - voiceLineCount: createdVoiceLines.length, - } + return leaseResult.result } diff --git a/src/lib/workers/handlers/story-to-script.ts b/src/lib/workers/handlers/story-to-script.ts index 1cac74e..794d300 100644 --- a/src/lib/workers/handlers/story-to-script.ts +++ b/src/lib/workers/handlers/story-to-script.ts @@ -8,14 +8,14 @@ import { import { withInternalLLMStreamCallbacks } from '@/lib/llm-observe/internal-stream-context' import { logAIAnalysis } from '@/lib/logging/semantic' import { onProjectNameAvailable } from '@/lib/logging/file-writer' +import { TaskTerminatedError } from '@/lib/task/errors' import { reportTaskProgress } from '@/lib/workers/shared' -import { assertTaskActive } from '@/lib/workers/utils' import { + runStoryToScriptOrchestrator, type StoryToScriptStepMeta, type StoryToScriptStepOutput, type StoryToScriptOrchestratorResult, } from '@/lib/novel-promotion/story-to-script/orchestrator' -import { runStoryToScriptGraph } from '@/lib/workflows/story-to-script/graph' import { createWorkerLLMStreamCallbacks, createWorkerLLMStreamContext } from './llm-stream' import type { TaskJobData } from '@/lib/task/types' import { @@ -31,6 +31,7 @@ import { import { getPromptTemplate, PROMPT_IDS } from '@/lib/prompt-i18n' import { resolveAnalysisModel } from './resolve-analysis-model' import { createArtifact, listArtifacts } from '@/lib/run-runtime/service' +import { assertWorkflowRunActive, withWorkflowRunLease } from '@/lib/run-runtime/workflow-lease' import { parseScreenplayPayload } from './screenplay-convert-helpers' function isReasoningEffort(value: unknown): value is 'minimal' | 'low' | 'medium' | 'high' { @@ -43,6 +44,10 @@ function resolveRetryClipId(retryStepKey: string): string | null { return clipId || null } +function buildWorkflowWorkerId(job: Job, label: string) { + return `${label}:${job.queueName}:${job.data.taskId}` +} + export async function handleStoryToScriptTask(job: Job) { const payload = (job.data.payload || {}) as AnyObj const projectId = job.data.projectId @@ -125,22 +130,50 @@ export async function handleStoryToScriptTask(job: Job) { if (!mergedContent.trim()) { throw new Error('content is required') } - const maxLength = 30000 - const content = mergedContent.length > maxLength ? mergedContent.slice(0, maxLength) : mergedContent - - await reportTaskProgress(job, 10, { - stage: 'story_to_script_prepare', - stageLabel: 'progress.stage.storyToScriptPrepare', - displayMode: 'detail', - }) - const characterPromptTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_CHARACTER_PROFILE, job.data.locale) const locationPromptTemplate = getPromptTemplate(PROMPT_IDS.NP_SELECT_LOCATION, job.data.locale) const clipPromptTemplate = getPromptTemplate(PROMPT_IDS.NP_AGENT_CLIP, job.data.locale) const screenplayPromptTemplate = getPromptTemplate(PROMPT_IDS.NP_SCREENPLAY_CONVERSION, job.data.locale) - + const maxLength = 30000 + const content = mergedContent.length > maxLength ? mergedContent.slice(0, maxLength) : mergedContent + const payloadMeta = typeof payload.meta === 'object' && payload.meta !== null + ? (payload.meta as AnyObj) + : {} + const runId = typeof payload.runId === 'string' && payload.runId.trim() + ? payload.runId.trim() + : (typeof payloadMeta.runId === 'string' ? payloadMeta.runId.trim() : '') + if (!runId) { + throw new Error('runId is required for story_to_script pipeline') + } + const retryClipId = resolveRetryClipId(retryStepKey) + if (retryStepKey && !retryClipId) { + throw new Error(`unsupported retry step for story_to_script: ${retryStepKey}`) + } + const workerId = buildWorkflowWorkerId(job, 'story_to_script') + const assertRunActive = async (stage: string) => { + await assertWorkflowRunActive({ + runId, + workerId, + stage, + }) + } const streamContext = createWorkerLLMStreamContext(job, 'story_to_script') - const callbacks = createWorkerLLMStreamCallbacks(job, streamContext) + const callbacks = createWorkerLLMStreamCallbacks(job, streamContext, { + assertActive: async (stage) => { + await assertRunActive(stage) + }, + isActive: async () => { + try { + await assertRunActive('worker_llm_stream_probe') + return true + } catch (error) { + if (error instanceof TaskTerminatedError) { + return false + } + throw error + } + }, + }) const runStep = async ( meta: StoryToScriptStepMeta, @@ -151,7 +184,7 @@ export async function handleStoryToScriptTask(job: Job) { void _maxOutputTokens const stepAttempt = meta.stepAttempt || (retryStepKey && meta.stepId === retryStepKey ? retryStepAttempt : 1) - await assertTaskActive(job, `story_to_script_step:${meta.stepId}`) + await assertRunActive(`story_to_script_step:${meta.stepId}`) const progress = 15 + Math.min(55, Math.floor((meta.stepIndex / Math.max(1, meta.stepTotal)) * 55)) await reportTaskProgress(job, progress, { stage: 'story_to_script_step', @@ -170,7 +203,6 @@ export async function handleStoryToScriptTask(job: Job) { blockedBy: Array.isArray(meta.blockedBy) ? meta.blockedBy : [], }) - // Log prompt input logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { action: `STORY_TO_SCRIPT_PROMPT:${action}`, input: { stepId: meta.stepId, stepTitle: meta.stepTitle, prompt }, @@ -191,10 +223,8 @@ export async function handleStoryToScriptTask(job: Job) { reasoning, reasoningEffort, }) - // Ensure this step's stream terminal events are flushed before the orchestrator moves on. await callbacks.flush() - // Log AI response output (full raw text included for debugging) logAIAnalysis(job.data.userId, 'worker', projectId, project.name, { action: `STORY_TO_SCRIPT_OUTPUT:${action}`, output: { @@ -213,319 +243,315 @@ export async function handleStoryToScriptTask(job: Job) { } } - let result: StoryToScriptOrchestratorResult | null = null - const payloadMeta = typeof payload.meta === 'object' && payload.meta !== null - ? (payload.meta as AnyObj) - : {} - const runId = typeof payload.runId === 'string' && payload.runId.trim() - ? payload.runId.trim() - : (typeof payloadMeta.runId === 'string' ? payloadMeta.runId.trim() : '') - if (!runId) { - throw new Error('runId is required for story_to_script pipeline') - } - const retryClipId = resolveRetryClipId(retryStepKey) - if (retryStepKey && !retryClipId) { - throw new Error(`unsupported retry step for story_to_script: ${retryStepKey}`) - } + const leaseResult = await withWorkflowRunLease({ + runId, + userId: job.data.userId, + workerId, + run: async () => { + await reportTaskProgress(job, 10, { + stage: 'story_to_script_prepare', + stageLabel: 'progress.stage.storyToScriptPrepare', + displayMode: 'detail', + }) - if (retryClipId) { - const splitArtifacts = await listArtifacts({ - runId, - artifactType: 'clips.split', - limit: 1, - }) - const latestSplit = splitArtifacts[0] - const splitPayload = latestSplit && typeof latestSplit.payload === 'object' && latestSplit.payload !== null - ? (latestSplit.payload as Record) - : null - if (!splitPayload) { - throw new Error('missing clips.split artifact for retry') - } + if (retryClipId) { + const splitArtifacts = await listArtifacts({ + runId, + artifactType: 'clips.split', + limit: 1, + }) + const latestSplit = splitArtifacts[0] + const splitPayload = latestSplit && typeof latestSplit.payload === 'object' && latestSplit.payload !== null + ? (latestSplit.payload as Record) + : null + if (!splitPayload) { + throw new Error('missing clips.split artifact for retry') + } - const clipRows = Array.isArray(splitPayload.clipList) ? splitPayload.clipList : [] - const retryClip = clipRows.find((item) => { - if (!item || typeof item !== 'object' || Array.isArray(item)) return false - return asString((item as Record).id).trim() === retryClipId - }) as Record | undefined - if (!retryClip) { - throw new Error(`retry clip not found in artifact: ${retryClipId}`) - } + const clipRows = Array.isArray(splitPayload.clipList) ? splitPayload.clipList : [] + const retryClip = clipRows.find((item) => { + if (!item || typeof item !== 'object' || Array.isArray(item)) return false + return asString((item as Record).id).trim() === retryClipId + }) as Record | undefined + if (!retryClip) { + throw new Error(`retry clip not found in artifact: ${retryClipId}`) + } - const clipContent = asString(retryClip.content) - if (!clipContent.trim()) { - throw new Error(`retry clip content is empty: ${retryClipId}`) - } + const clipContent = asString(retryClip.content) + if (!clipContent.trim()) { + throw new Error(`retry clip content is empty: ${retryClipId}`) + } - const screenplayPrompt = screenplayPromptTemplate - .replace('{clip_content}', clipContent) - .replace('{locations_lib_name}', asString(splitPayload.locationsLibName) || '无') - .replace('{characters_lib_name}', asString(splitPayload.charactersLibName) || '无') - .replace('{characters_introduction}', asString(splitPayload.charactersIntroduction) || '暂无角色介绍') - .replace('{clip_id}', retryClipId) + const screenplayPrompt = screenplayPromptTemplate + .replace('{clip_content}', clipContent) + .replace('{locations_lib_name}', asString(splitPayload.locationsLibName) || '无') + .replace('{characters_lib_name}', asString(splitPayload.charactersLibName) || '无') + .replace('{characters_introduction}', asString(splitPayload.charactersIntroduction) || '暂无角色介绍') + .replace('{clip_id}', retryClipId) - const stepMeta: StoryToScriptStepMeta = { - stepId: retryStepKey, - stepAttempt: retryStepAttempt, - stepTitle: 'progress.streamStep.screenplayConversion', - stepIndex: 1, - stepTotal: 1, - dependsOn: ['split_clips'], - retryable: true, - } - let screenplay: AnyObj | null = null - try { - const stepOutput = await (async () => { + const stepMeta: StoryToScriptStepMeta = { + stepId: retryStepKey, + stepAttempt: retryStepAttempt, + stepTitle: 'progress.streamStep.screenplayConversion', + stepIndex: 1, + stepTotal: 1, + dependsOn: ['split_clips'], + retryable: true, + } + let screenplay: AnyObj | null = null + try { + const stepOutput = await (async () => { + try { + return await withInternalLLMStreamCallbacks( + callbacks, + async () => await runStep(stepMeta, screenplayPrompt, 'screenplay_conversion', 2200), + ) + } finally { + await callbacks.flush() + } + })() + screenplay = parseScreenplayPayload(stepOutput.text) + } catch (error) { + await createArtifact({ + runId, + stepKey: retryStepKey, + artifactType: 'screenplay.clip', + refId: retryClipId, + payload: { + clipId: retryClipId, + success: false, + error: error instanceof Error ? error.message : String(error), + }, + }) + throw error + } + if (!screenplay) { + throw new Error('retry screenplay output is empty') + } + await createArtifact({ + runId, + stepKey: retryStepKey, + artifactType: 'screenplay.clip', + refId: retryClipId, + payload: { + clipId: retryClipId, + success: true, + sceneCount: Array.isArray(screenplay.scenes) ? screenplay.scenes.length : 0, + screenplay, + }, + }) + + let clipRecord = await prisma.novelPromotionClip.findFirst({ + where: { + episodeId, + startText: asString(retryClip.startText) || null, + endText: asString(retryClip.endText) || null, + }, + select: { id: true }, + }) + if (!clipRecord) { + clipRecord = await prisma.novelPromotionClip.create({ + data: { + episodeId, + startText: asString(retryClip.startText) || null, + endText: asString(retryClip.endText) || null, + summary: asString(retryClip.summary), + location: asString(retryClip.location) || null, + characters: Array.isArray(retryClip.characters) ? JSON.stringify(retryClip.characters) : null, + content: clipContent, + }, + select: { id: true }, + }) + } + await prisma.novelPromotionClip.update({ + where: { id: clipRecord.id }, + data: { + screenplay: JSON.stringify(screenplay), + }, + }) + + await reportTaskProgress(job, 96, { + stage: 'story_to_script_persist_done', + stageLabel: 'progress.stage.storyToScriptPersistDone', + displayMode: 'detail', + message: 'retry step completed', + stepId: retryStepKey, + stepAttempt: retryStepAttempt, + stepTitle: 'progress.streamStep.screenplayConversion', + stepIndex: 1, + stepTotal: 1, + }) + + return { + episodeId, + clipCount: 1, + screenplaySuccessCount: 1, + screenplayFailedCount: 0, + persistedCharacters: 0, + persistedLocations: 0, + persistedClips: 1, + retryStepKey, + } + } + + const result: StoryToScriptOrchestratorResult = await (async () => { try { return await withInternalLLMStreamCallbacks( callbacks, - async () => await runStep(stepMeta, screenplayPrompt, 'screenplay_conversion', 2200), + async () => await runStoryToScriptOrchestrator({ + concurrency: workflowConcurrency.analysis, + content, + baseCharacters: (novelData.characters || []).map((item) => item.name), + baseLocations: (novelData.locations || []).map((item) => item.name), + baseCharacterIntroductions: (novelData.characters || []).map((item) => ({ + name: item.name, + introduction: item.introduction || '', + })), + promptTemplates: { + characterPromptTemplate, + locationPromptTemplate, + clipPromptTemplate, + screenplayPromptTemplate, + }, + runStep, + }), ) } finally { await callbacks.flush() } })() - screenplay = parseScreenplayPayload(stepOutput.text) - } catch (error) { + await createArtifact({ runId, - stepKey: retryStepKey, - artifactType: 'screenplay.clip', - refId: retryClipId, + stepKey: 'analyze_characters', + artifactType: 'analysis.characters', + refId: episodeId, payload: { - clipId: retryClipId, - success: false, - error: error instanceof Error ? error.message : String(error), + characters: result.analyzedCharacters, + raw: result.charactersObject, }, }) - throw error - } - if (!screenplay) { - throw new Error('retry screenplay output is empty') - } - await createArtifact({ - runId, - stepKey: retryStepKey, - artifactType: 'screenplay.clip', - refId: retryClipId, - payload: { - clipId: retryClipId, - success: true, - sceneCount: Array.isArray(screenplay.scenes) ? screenplay.scenes.length : 0, - screenplay, - }, - }) - - let clipRecord = await prisma.novelPromotionClip.findFirst({ - where: { - episodeId, - startText: asString(retryClip.startText) || null, - endText: asString(retryClip.endText) || null, - }, - select: { id: true }, - }) - if (!clipRecord) { - clipRecord = await prisma.novelPromotionClip.create({ - data: { - episodeId, - startText: asString(retryClip.startText) || null, - endText: asString(retryClip.endText) || null, - summary: asString(retryClip.summary), - location: asString(retryClip.location) || null, - characters: Array.isArray(retryClip.characters) ? JSON.stringify(retryClip.characters) : null, - content: clipContent, + await createArtifact({ + runId, + stepKey: 'analyze_locations', + artifactType: 'analysis.locations', + refId: episodeId, + payload: { + locations: result.analyzedLocations, + raw: result.locationsObject, }, + }) + await createArtifact({ + runId, + stepKey: 'split_clips', + artifactType: 'clips.split', + refId: episodeId, + payload: { + clipList: result.clipList, + charactersLibName: result.charactersLibName, + locationsLibName: result.locationsLibName, + charactersIntroduction: result.charactersIntroduction, + }, + }) + for (const screenplayResult of result.screenplayResults) { + await createArtifact({ + runId, + stepKey: `screenplay_${screenplayResult.clipId}`, + artifactType: 'screenplay.clip', + refId: screenplayResult.clipId, + payload: { + ...screenplayResult, + }, + }) + } + + if (result.summary.screenplayFailedCount > 0) { + const failed = result.screenplayResults.filter((item) => !item.success) + const preview = failed + .slice(0, 3) + .map((item) => `${item.clipId}:${item.error || 'unknown error'}`) + .join(' | ') + throw new Error( + `STORY_TO_SCRIPT_PARTIAL_FAILED: ${result.summary.screenplayFailedCount}/${result.summary.clipCount} screenplay steps failed. ${preview}`, + ) + } + + await reportTaskProgress(job, 80, { + stage: 'story_to_script_persist', + stageLabel: 'progress.stage.storyToScriptPersist', + displayMode: 'detail', + }) + await assertRunActive('story_to_script_persist') + + const episodeStillExists = await prisma.novelPromotionEpisode.findUnique({ + where: { id: episodeId }, select: { id: true }, }) - } - await prisma.novelPromotionClip.update({ - where: { id: clipRecord.id }, - data: { - screenplay: JSON.stringify(screenplay), - }, - }) + if (!episodeStillExists) { + throw new Error(`NOT_FOUND: Episode ${episodeId} was deleted while the task was running`) + } - await reportTaskProgress(job, 96, { - stage: 'story_to_script_persist_done', - stageLabel: 'progress.stage.storyToScriptPersistDone', - displayMode: 'detail', - message: 'retry step completed', - stepId: retryStepKey, - stepAttempt: retryStepAttempt, - stepTitle: 'progress.streamStep.screenplayConversion', - stepIndex: 1, - stepTotal: 1, - }) - - return { - episodeId, - clipCount: 1, - screenplaySuccessCount: 1, - screenplayFailedCount: 0, - persistedCharacters: 0, - persistedLocations: 0, - persistedClips: 1, - retryStepKey, - } - } - - const pipelineState = await (async () => { - try { - return await withInternalLLMStreamCallbacks( - callbacks, - async () => await runStoryToScriptGraph({ - runId, - projectId, - userId: job.data.userId, - concurrency: workflowConcurrency.analysis, - content, - baseCharacters: (novelData.characters || []).map((item) => item.name), - baseLocations: (novelData.locations || []).map((item) => item.name), - baseCharacterIntroductions: (novelData.characters || []).map((item) => ({ - name: item.name, - introduction: item.introduction || '', - })), - promptTemplates: { - characterPromptTemplate, - locationPromptTemplate, - clipPromptTemplate, - screenplayPromptTemplate, - }, - runStep, - }), + const existingCharacterNames = new Set( + (novelData.characters || []).map((item) => String(item.name || '').toLowerCase()), + ) + const existingLocationNames = new Set( + (novelData.locations || []).map((item) => String(item.name || '').toLowerCase()), ) - } finally { - await callbacks.flush() - } - })() - result = pipelineState.orchestratorResult - if (!result) { - throw new Error('story_to_script orchestrator produced no result') - } + const createdCharacters = await persistAnalyzedCharacters({ + projectInternalId: novelData.id, + existingNames: existingCharacterNames, + analyzedCharacters: result.analyzedCharacters, + }) - await createArtifact({ - runId, - stepKey: 'analyze_characters', - artifactType: 'analysis.characters', - refId: episodeId, - payload: { - characters: result.analyzedCharacters, - raw: result.charactersObject, + const createdLocations = await persistAnalyzedLocations({ + projectInternalId: novelData.id, + existingNames: existingLocationNames, + analyzedLocations: result.analyzedLocations, + }) + + const createdClipRows = await persistClips({ + episodeId, + clipList: result.clipList, + }) + const clipIdMap = new Map(createdClipRows.map((item) => [item.clipKey, item.id])) + + for (const screenplayResult of result.screenplayResults) { + if (!screenplayResult.success || !screenplayResult.screenplay) continue + const clipRecordId = resolveClipRecordId(clipIdMap, screenplayResult.clipId) + if (!clipRecordId) continue + await prisma.novelPromotionClip.update({ + where: { id: clipRecordId }, + data: { + screenplay: JSON.stringify(screenplayResult.screenplay), + }, + }) + } + + await reportTaskProgress(job, 96, { + stage: 'story_to_script_persist_done', + stageLabel: 'progress.stage.storyToScriptPersistDone', + displayMode: 'detail', + }) + + return { + episodeId, + clipCount: result.summary.clipCount, + screenplaySuccessCount: result.summary.screenplaySuccessCount, + screenplayFailedCount: result.summary.screenplayFailedCount, + persistedCharacters: createdCharacters.length, + persistedLocations: createdLocations.length, + persistedClips: createdClipRows.length, + } }, }) - await createArtifact({ - runId, - stepKey: 'analyze_locations', - artifactType: 'analysis.locations', - refId: episodeId, - payload: { - locations: result.analyzedLocations, - raw: result.locationsObject, - }, - }) - await createArtifact({ - runId, - stepKey: 'split_clips', - artifactType: 'clips.split', - refId: episodeId, - payload: { - clipList: result.clipList, - charactersLibName: result.charactersLibName, - locationsLibName: result.locationsLibName, - charactersIntroduction: result.charactersIntroduction, - }, - }) - for (const screenplayResult of result.screenplayResults) { - await createArtifact({ + + if (!leaseResult.claimed || !leaseResult.result) { + return { runId, - stepKey: `screenplay_${screenplayResult.clipId}`, - artifactType: 'screenplay.clip', - refId: screenplayResult.clipId, - payload: { - ...screenplayResult, - }, - }) - } - - if (result.summary.screenplayFailedCount > 0) { - const failed = result.screenplayResults.filter((item) => !item.success) - const preview = failed - .slice(0, 3) - .map((item) => `${item.clipId}:${item.error || 'unknown error'}`) - .join(' | ') - throw new Error( - `STORY_TO_SCRIPT_PARTIAL_FAILED: ${result.summary.screenplayFailedCount}/${result.summary.clipCount} screenplay steps failed. ${preview}`, - ) - } - - await reportTaskProgress(job, 80, { - stage: 'story_to_script_persist', - stageLabel: 'progress.stage.storyToScriptPersist', - displayMode: 'detail', - }) - - await assertTaskActive(job, 'story_to_script_persist') - - // Re-verify episode still exists before persisting — it may have been deleted - // while AI steps were running, which would cause a Prisma foreign key error. - const episodeStillExists = await prisma.novelPromotionEpisode.findUnique({ - where: { id: episodeId }, - select: { id: true }, - }) - if (!episodeStillExists) { - throw new Error(`NOT_FOUND: Episode ${episodeId} was deleted while the task was running`) - } - - const existingCharacterNames = new Set( - (novelData.characters || []).map((item) => String(item.name || '').toLowerCase()), - ) - const existingLocationNames = new Set( - (novelData.locations || []).map((item) => String(item.name || '').toLowerCase()), - ) - - const createdCharacters = await persistAnalyzedCharacters({ - projectInternalId: novelData.id, - existingNames: existingCharacterNames, - analyzedCharacters: result.analyzedCharacters, - }) - - const createdLocations = await persistAnalyzedLocations({ - projectInternalId: novelData.id, - existingNames: existingLocationNames, - analyzedLocations: result.analyzedLocations, - }) - - const createdClipRows = await persistClips({ - episodeId, - clipList: result.clipList, - }) - const clipIdMap = new Map(createdClipRows.map((item) => [item.clipKey, item.id])) - - for (const screenplayResult of result.screenplayResults) { - if (!screenplayResult.success || !screenplayResult.screenplay) continue - const clipRecordId = resolveClipRecordId(clipIdMap, screenplayResult.clipId) - if (!clipRecordId) continue - await prisma.novelPromotionClip.update({ - where: { id: clipRecordId }, - data: { - screenplay: JSON.stringify(screenplayResult.screenplay), - }, - }) - } - - await reportTaskProgress(job, 96, { - stage: 'story_to_script_persist_done', - stageLabel: 'progress.stage.storyToScriptPersistDone', - displayMode: 'detail', - }) - - return { - episodeId, - clipCount: result.summary.clipCount, - screenplaySuccessCount: result.summary.screenplaySuccessCount, - screenplayFailedCount: result.summary.screenplayFailedCount, - persistedCharacters: createdCharacters.length, - persistedLocations: createdLocations.length, - persistedClips: createdClipRows.length, + skipped: true, + episodeId, + } } + return leaseResult.result } diff --git a/src/lib/workers/shared.ts b/src/lib/workers/shared.ts index 853a1bb..cc5dd94 100644 --- a/src/lib/workers/shared.ts +++ b/src/lib/workers/shared.ts @@ -13,13 +13,16 @@ import { updateTaskBillingInfo, } from '@/lib/task/service' import { publishTaskEvent, publishTaskStreamEvent } from '@/lib/task/publisher' -import { TASK_EVENT_TYPE, TASK_TYPE, type TaskBillingInfo, type TaskJobData } from '@/lib/task/types' +import { TASK_EVENT_TYPE, TASK_SSE_EVENT_TYPE, TASK_TYPE, type SSEEvent, type TaskBillingInfo, type TaskJobData } from '@/lib/task/types' import { buildTaskProgressMessage, getTaskStageLabel } from '@/lib/task/progress-message' import { normalizeAnyError } from '@/lib/errors/normalize' import { rollbackTaskBilling, settleTaskBilling } from '@/lib/billing' import { withTextUsageCollection } from '@/lib/billing/runtime-usage' import { onProjectNameAvailable } from '@/lib/logging/file-writer' import type { NormalizedError } from '@/lib/errors/types' +import { mapTaskSSEEventToRunEvents } from '@/lib/run-runtime/task-bridge' +import { publishRunEvent } from '@/lib/run-runtime/publisher' +import { RUN_EVENT_TYPE } from '@/lib/run-runtime/types' function toObject(value: unknown): Record { if (!value || typeof value !== 'object' || Array.isArray(value)) return {} @@ -76,6 +79,12 @@ function withFlowFields(jobData: TaskJobData, payload?: Record return base } +function resolveRunId(jobData: TaskJobData): string | null { + const flowFields = extractFlowFields(jobData) + const runId = flowFields.runId + return typeof runId === 'string' && runId.trim() ? runId.trim() : null +} + function buildWorkerLogger(data: TaskJobData, queueName: string) { return createScopedLogger({ module: `worker.${queueName}`, @@ -91,10 +100,131 @@ const RUN_STREAM_REPLAY_PERSIST_TYPES = new Set([ TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, ]) +const DIRECT_RUN_EVENT_TASK_TYPES = new Set([ + TASK_TYPE.STORY_TO_SCRIPT_RUN, + TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, +]) + function shouldPersistRunStreamReplay(taskType: string): boolean { return RUN_STREAM_REPLAY_PERSIST_TYPES.has(taskType) } +function shouldDirectPublishRunEvents(taskType: string): boolean { + return DIRECT_RUN_EVENT_TASK_TYPES.has(taskType) +} + +async function publishMirroredRunEvents(params: { + taskId: string + projectId: string + userId: string + taskType: string + targetType: string + targetId: string + episodeId?: string | null + eventType: typeof TASK_SSE_EVENT_TYPE[keyof typeof TASK_SSE_EVENT_TYPE] + payload?: Record | null +}) { + if (!shouldDirectPublishRunEvents(params.taskType)) return + + const message: SSEEvent = { + id: `direct:${params.taskId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2, 8)}`, + type: params.eventType, + taskId: params.taskId, + projectId: params.projectId, + userId: params.userId, + ts: new Date().toISOString(), + taskType: params.taskType, + targetType: params.targetType, + targetId: params.targetId, + episodeId: params.episodeId || null, + payload: (params.payload || null) as SSEEvent['payload'], + } + const runEvents = mapTaskSSEEventToRunEvents(message) + for (const event of runEvents) { + await publishRunEvent(event) + } +} + +async function publishLifecycleEvent(params: { + taskId: string + projectId: string + userId: string + type: typeof TASK_EVENT_TYPE[keyof typeof TASK_EVENT_TYPE] + taskType: string + targetType: string + targetId: string + episodeId?: string | null + payload?: Record | null + persist?: boolean +}) { + await publishTaskEvent({ + taskId: params.taskId, + projectId: params.projectId, + userId: params.userId, + type: params.type, + taskType: params.taskType, + targetType: params.targetType, + targetId: params.targetId, + episodeId: params.episodeId || null, + payload: params.payload, + persist: params.persist, + }) + + await publishMirroredRunEvents({ + taskId: params.taskId, + projectId: params.projectId, + userId: params.userId, + taskType: params.taskType, + targetType: params.targetType, + targetId: params.targetId, + episodeId: params.episodeId || null, + eventType: TASK_SSE_EVENT_TYPE.LIFECYCLE, + payload: { + ...params.payload, + lifecycleType: + params.type === TASK_EVENT_TYPE.PROGRESS + ? TASK_EVENT_TYPE.PROCESSING + : params.type, + }, + }) +} + +async function publishStreamEvent(params: { + taskId: string + projectId: string + userId: string + taskType: string + targetType: string + targetId: string + episodeId?: string | null + payload?: Record | null + persist?: boolean +}) { + await publishTaskStreamEvent({ + taskId: params.taskId, + projectId: params.projectId, + userId: params.userId, + taskType: params.taskType, + targetType: params.targetType, + targetId: params.targetId, + episodeId: params.episodeId || null, + payload: params.payload, + persist: params.persist, + }) + + await publishMirroredRunEvents({ + taskId: params.taskId, + projectId: params.projectId, + userId: params.userId, + taskType: params.taskType, + targetType: params.targetType, + targetId: params.targetId, + episodeId: params.episodeId || null, + eventType: TASK_SSE_EVENT_TYPE.STREAM, + payload: params.payload, + }) +} + function resolveQueueAttempts(job: Job): number { const attempts = (job.opts?.attempts ?? 1) const value = typeof attempts === 'number' && Number.isFinite(attempts) ? Math.floor(attempts) : 1 @@ -243,7 +373,26 @@ export async function withTaskLifecycle(job: Job, handler: (job: Jo requestId: data.trace?.requestId || null, }, }) - await publishTaskEvent({ + if (shouldDirectPublishRunEvents(data.type)) { + const runId = resolveRunId(data) + if (runId) { + await publishRunEvent({ + runId, + projectId: data.projectId, + userId: data.userId, + eventType: RUN_EVENT_TYPE.RUN_START, + payload: { + ...processingPayload, + message: buildTaskProgressMessage({ + eventType: TASK_EVENT_TYPE.PROCESSING, + taskType: data.type, + payload: processingPayload, + }), + }, + }) + } + } + await publishLifecycleEvent({ taskId, projectId: data.projectId, userId: data.userId, @@ -297,7 +446,7 @@ export async function withTaskLifecycle(job: Job, handler: (job: Jo requestId: data.trace?.requestId || null, }, }) - await publishTaskEvent({ + await publishLifecycleEvent({ taskId, projectId: data.projectId, userId: data.userId, @@ -411,7 +560,7 @@ export async function withTaskLifecycle(job: Job, handler: (job: Jo }) try { - await publishTaskEvent({ + await publishLifecycleEvent({ taskId, projectId: data.projectId, userId: data.userId, @@ -468,7 +617,7 @@ export async function withTaskLifecycle(job: Job, handler: (job: Jo if (process.env.NODE_ENV !== 'production' && error instanceof Error && typeof error.stack === 'string') { failedPayload.errorStack = error.stack.slice(0, 8000) } - await publishTaskEvent({ + await publishLifecycleEvent({ taskId, projectId: data.projectId, userId: data.userId, @@ -529,7 +678,7 @@ export async function reportTaskProgress(job: Job, progress: number if (!updated) { return } - await publishTaskEvent({ + await publishLifecycleEvent({ taskId: job.data.taskId, projectId: job.data.projectId, userId: job.data.userId, @@ -562,7 +711,7 @@ export async function reportTaskStreamChunk( message: payload?.message || (chunk.kind === 'reasoning' ? 'progress.runtime.llm.reasoning' : 'progress.runtime.llm.output'), }) - await publishTaskStreamEvent({ + await publishStreamEvent({ taskId: job.data.taskId, projectId: job.data.projectId, userId: job.data.userId, diff --git a/src/lib/workflow-engine/dependencies.ts b/src/lib/workflow-engine/dependencies.ts new file mode 100644 index 0000000..a1aabff --- /dev/null +++ b/src/lib/workflow-engine/dependencies.ts @@ -0,0 +1,95 @@ +const STORY_TO_SCRIPT_WORKFLOW = 'story_to_script_run' +const SCRIPT_TO_STORYBOARD_WORKFLOW = 'script_to_storyboard_run' + +function uniqueStepKeys(stepKeys: Iterable): string[] { + return Array.from(new Set(Array.from(stepKeys).filter((stepKey) => stepKey.trim().length > 0))) +} + +function resolveStoryToScriptInvalidation(params: { + stepKey: string + existingStepKeys: ReadonlySet +}): string[] { + const affected = new Set([params.stepKey]) + if (params.stepKey === 'analyze_characters' || params.stepKey === 'analyze_locations') { + if (params.existingStepKeys.has('split_clips')) { + affected.add('split_clips') + } + for (const stepKey of params.existingStepKeys) { + if (stepKey.startsWith('screenplay_')) { + affected.add(stepKey) + } + } + } else if (params.stepKey === 'split_clips') { + for (const stepKey of params.existingStepKeys) { + if (stepKey.startsWith('screenplay_')) { + affected.add(stepKey) + } + } + } + return uniqueStepKeys(affected) +} + +type StoryboardPhase = 'phase1' | 'phase2_cinematography' | 'phase2_acting' | 'phase3_detail' + +function parseStoryboardStepKey(stepKey: string): { clipId: string; phase: StoryboardPhase } | null { + const match = /^clip_(.+)_(phase1|phase2_cinematography|phase2_acting|phase3_detail)$/.exec(stepKey.trim()) + if (!match) return null + const clipId = (match[1] || '').trim() + const phase = match[2] as StoryboardPhase + if (!clipId) return null + return { clipId, phase } +} + +function resolveScriptToStoryboardInvalidation(params: { + stepKey: string + existingStepKeys: ReadonlySet +}): string[] { + const affected = new Set([params.stepKey]) + if (params.stepKey === 'voice_analyze') { + return uniqueStepKeys(affected) + } + + const parsed = parseStoryboardStepKey(params.stepKey) + if (!parsed) { + return uniqueStepKeys(affected) + } + + const clipPrefix = `clip_${parsed.clipId}_` + if (parsed.phase === 'phase1') { + affected.add(`${clipPrefix}phase2_cinematography`) + affected.add(`${clipPrefix}phase2_acting`) + affected.add(`${clipPrefix}phase3_detail`) + affected.add('voice_analyze') + return uniqueStepKeys(Array.from(affected).filter((stepKey) => params.existingStepKeys.has(stepKey))) + } + + if (parsed.phase === 'phase2_cinematography' || parsed.phase === 'phase2_acting') { + affected.add(`${clipPrefix}phase3_detail`) + affected.add('voice_analyze') + return uniqueStepKeys(Array.from(affected).filter((stepKey) => params.existingStepKeys.has(stepKey))) + } + + affected.add('voice_analyze') + return uniqueStepKeys(Array.from(affected).filter((stepKey) => params.existingStepKeys.has(stepKey))) +} + +export function resolveRetryInvalidationStepKeys(params: { + workflowType: string + stepKey: string + existingStepKeys: string[] +}): string[] { + const existingStepKeys = new Set(params.existingStepKeys) + if (params.workflowType === STORY_TO_SCRIPT_WORKFLOW) { + return resolveStoryToScriptInvalidation({ + stepKey: params.stepKey, + existingStepKeys, + }) + } + if (params.workflowType === SCRIPT_TO_STORYBOARD_WORKFLOW) { + return resolveScriptToStoryboardInvalidation({ + stepKey: params.stepKey, + existingStepKeys, + }) + } + return uniqueStepKeys([params.stepKey].filter((stepKey) => existingStepKeys.has(stepKey))) +} diff --git a/src/lib/workflows/script-to-storyboard/graph.ts b/src/lib/workflows/script-to-storyboard/graph.ts deleted file mode 100644 index 303eb0a..0000000 --- a/src/lib/workflows/script-to-storyboard/graph.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { runPipelineGraph, type PipelineGraphState } from '@/lib/run-runtime/pipeline-graph' -import { - runScriptToStoryboardOrchestrator, - type ScriptToStoryboardOrchestratorResult, - type ScriptToStoryboardPromptTemplates, - type ScriptToStoryboardStepMeta, - type ScriptToStoryboardStepOutput, - JsonParseError, -} from '@/lib/novel-promotion/script-to-storyboard/orchestrator' -import type { CharacterAsset, LocationAsset } from '@/lib/storyboard-phases' - -type ClipInput = { - id: string - content: string | null - characters: string | null - location: string | null - screenplay: string | null -} - -type NovelPromotionData = { - characters: CharacterAsset[] - locations: LocationAsset[] -} - -export type ScriptToStoryboardGraphState = PipelineGraphState & { - orchestratorResult: ScriptToStoryboardOrchestratorResult | null -} - -export type ScriptToStoryboardGraphInput = { - runId: string - projectId: string - userId: string - concurrency: number - clips: ClipInput[] - novelPromotionData: NovelPromotionData - promptTemplates: ScriptToStoryboardPromptTemplates - runStep: ( - meta: ScriptToStoryboardStepMeta, - prompt: string, - action: string, - maxOutputTokens: number, - ) => Promise - onParseError?: (error: JsonParseError) => Promise | void -} - -export async function runScriptToStoryboardGraph( - input: ScriptToStoryboardGraphInput, -): Promise { - const initialState: ScriptToStoryboardGraphState = { - refs: {}, - meta: {}, - orchestratorResult: null, - } - - try { - return await runPipelineGraph({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - state: initialState, - nodes: [ - { - key: 'script_to_storyboard_orchestrator', - title: 'script_to_storyboard_orchestrator', - maxAttempts: 2, - timeoutMs: 1000 * 60 * 20, - run: async (context) => { - const nextResult = await runScriptToStoryboardOrchestrator({ - concurrency: input.concurrency, - clips: input.clips, - novelPromotionData: input.novelPromotionData, - promptTemplates: input.promptTemplates, - runStep: input.runStep, - }) - - context.state.orchestratorResult = nextResult - return { - output: { - clipCount: nextResult.summary.clipCount, - totalPanelCount: nextResult.summary.totalPanelCount, - }, - } - }, - }, - { - key: 'script_to_storyboard_validate', - title: 'script_to_storyboard_validate', - maxAttempts: 1, - timeoutMs: 1000 * 30, - run: async (context) => { - if (!context.state.orchestratorResult) { - throw new Error('script_to_storyboard orchestrator produced no result') - } - return { - output: { - validated: true, - totalPanelCount: context.state.orchestratorResult.summary.totalPanelCount, - }, - } - }, - }, - ], - }) - } catch (error) { - if (error instanceof JsonParseError) { - await input.onParseError?.(error) - } - throw error - } -} diff --git a/src/lib/workflows/story-to-script/graph.ts b/src/lib/workflows/story-to-script/graph.ts deleted file mode 100644 index 2f30a60..0000000 --- a/src/lib/workflows/story-to-script/graph.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { runPipelineGraph, type PipelineGraphState } from '@/lib/run-runtime/pipeline-graph' -import { - runStoryToScriptOrchestrator, - type StoryToScriptOrchestratorResult, - type StoryToScriptPromptTemplates, - type StoryToScriptStepMeta, - type StoryToScriptStepOutput, -} from '@/lib/novel-promotion/story-to-script/orchestrator' - -export type StoryToScriptGraphState = PipelineGraphState & { - orchestratorResult: StoryToScriptOrchestratorResult | null -} - -export type StoryToScriptGraphInput = { - runId: string - projectId: string - userId: string - concurrency: number - content: string - baseCharacters: string[] - baseLocations: string[] - baseCharacterIntroductions: Array<{ name: string; introduction?: string | null }> - promptTemplates: StoryToScriptPromptTemplates - runStep: ( - meta: StoryToScriptStepMeta, - prompt: string, - action: string, - maxOutputTokens: number, - ) => Promise -} - -export async function runStoryToScriptGraph( - input: StoryToScriptGraphInput, -): Promise { - const initialState: StoryToScriptGraphState = { - refs: {}, - meta: {}, - orchestratorResult: null, - } - - return await runPipelineGraph({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - state: initialState, - nodes: [ - { - key: 'story_to_script_orchestrator', - title: 'story_to_script_orchestrator', - maxAttempts: 2, - timeoutMs: 1000 * 60 * 15, - run: async (context) => { - const orchestratorResult = await runStoryToScriptOrchestrator({ - content: input.content, - concurrency: input.concurrency, - baseCharacters: input.baseCharacters, - baseLocations: input.baseLocations, - baseCharacterIntroductions: input.baseCharacterIntroductions, - promptTemplates: input.promptTemplates, - runStep: input.runStep, - }) - - context.state.orchestratorResult = orchestratorResult - return { - output: { - clipCount: orchestratorResult.summary.clipCount, - screenplaySuccessCount: orchestratorResult.summary.screenplaySuccessCount, - screenplayFailedCount: orchestratorResult.summary.screenplayFailedCount, - }, - } - }, - }, - { - key: 'story_to_script_validate', - title: 'story_to_script_validate', - maxAttempts: 1, - timeoutMs: 1000 * 30, - run: async (context) => { - const result = context.state.orchestratorResult - if (!result) { - throw new Error('story_to_script orchestrator produced no result') - } - if (result.summary.screenplayFailedCount > 0) { - const failed = result.screenplayResults.filter((item) => !item.success) - const preview = failed - .slice(0, 3) - .map((item) => `${item.clipId}:${item.error || 'unknown error'}`) - .join(' | ') - throw new Error( - `STORY_TO_SCRIPT_PARTIAL_FAILED: ${result.summary.screenplayFailedCount}/${result.summary.clipCount} screenplay steps failed. ${preview}`, - ) - } - return { - output: { - validated: true, - clipCount: result.summary.clipCount, - }, - } - }, - }, - ], - }) -} diff --git a/tests/integration/api/contract/run-cancel.route.test.ts b/tests/integration/api/contract/run-cancel.route.test.ts new file mode 100644 index 0000000..8c378ad --- /dev/null +++ b/tests/integration/api/contract/run-cancel.route.test.ts @@ -0,0 +1,96 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { buildMockRequest } from '../../../helpers/request' + +const authState = vi.hoisted(() => ({ authenticated: true })) +const getRunByIdMock = vi.hoisted(() => vi.fn()) +const requestRunCancelMock = vi.hoisted(() => vi.fn()) +const cancelTaskMock = vi.hoisted(() => vi.fn()) +const publishRunEventMock = vi.hoisted(() => vi.fn(async () => undefined)) + +vi.mock('@/lib/api-auth', () => { + const unauthorized = () => new Response( + JSON.stringify({ error: { code: 'UNAUTHORIZED' } }), + { status: 401, headers: { 'content-type': 'application/json' } }, + ) + + return { + isErrorResponse: (value: unknown) => value instanceof Response, + requireUserAuth: async () => { + if (!authState.authenticated) return unauthorized() + return { session: { user: { id: 'user-1' } } } + }, + } +}) + +vi.mock('@/lib/run-runtime/service', () => ({ + getRunById: getRunByIdMock, + requestRunCancel: requestRunCancelMock, +})) + +vi.mock('@/lib/task/service', () => ({ + cancelTask: cancelTaskMock, +})) + +vi.mock('@/lib/run-runtime/publisher', () => ({ + publishRunEvent: publishRunEventMock, +})) + +describe('api contract - run cancel route', () => { + beforeEach(() => { + vi.clearAllMocks() + authState.authenticated = true + getRunByIdMock.mockResolvedValue({ + id: 'run-1', + userId: 'user-1', + projectId: 'project-1', + taskId: 'task-1', + }) + requestRunCancelMock.mockResolvedValue({ + id: 'run-1', + userId: 'user-1', + projectId: 'project-1', + taskId: 'task-1', + status: 'canceling', + }) + cancelTaskMock.mockResolvedValue({ + task: { + id: 'task-1', + status: 'canceled', + errorCode: 'TASK_CANCELLED', + errorMessage: 'Run cancelled by user', + }, + cancelled: true, + }) + }) + + it('marks the run canceled and mirrors task cancellation without failing the task', async () => { + const { POST } = await import('@/app/api/runs/[runId]/cancel/route') + + const req = buildMockRequest({ + path: '/api/runs/run-1/cancel', + method: 'POST', + }) + const res = await POST(req, { + params: Promise.resolve({ runId: 'run-1' }), + }) + + expect(res.status).toBe(200) + const payload = await res.json() as { + success: boolean + run: { + id: string + status: string + } + } + expect(payload.success).toBe(true) + expect(payload.run).toMatchObject({ + id: 'run-1', + status: 'canceling', + }) + expect(cancelTaskMock).toHaveBeenCalledWith('task-1', 'Run cancelled by user') + expect(publishRunEventMock).toHaveBeenCalledWith(expect.objectContaining({ + runId: 'run-1', + eventType: 'run.canceled', + })) + }) +}) diff --git a/tests/integration/api/contract/task-infra-routes.test.ts b/tests/integration/api/contract/task-infra-routes.test.ts index 2a36d18..aeb30a7 100644 --- a/tests/integration/api/contract/task-infra-routes.test.ts +++ b/tests/integration/api/contract/task-infra-routes.test.ts @@ -144,7 +144,7 @@ describe('api contract - task infra routes (behavior)', () => { cancelTaskMock.mockResolvedValue({ task: { ...baseTask, - status: TASK_STATUS.FAILED, + status: TASK_STATUS.CANCELED, errorCode: 'TASK_CANCELLED', errorMessage: 'Task cancelled by user', }, @@ -336,8 +336,11 @@ describe('api contract - task infra routes (behavior)', () => { const req = buildMockRequest({ path: '/api/tasks/task-1', method: 'DELETE' }) const res = await DELETE(req, { params: Promise.resolve({ taskId: 'task-1' }) } as RouteContext) expect(res.status).toBe(200) + const payload = await res.json() as { task: TaskRecord; cancelled: boolean } expect(removeTaskJobMock).toHaveBeenCalledWith('task-1') + expect(payload.cancelled).toBe(true) + expect(payload.task.status).toBe(TASK_STATUS.CANCELED) expect(publishTaskEventMock).toHaveBeenCalledWith(expect.objectContaining({ taskId: 'task-1', projectId: 'project-1', diff --git a/tests/integration/api/specific/novel-promotion-project-art-style-validation.test.ts b/tests/integration/api/specific/novel-promotion-project-art-style-validation.test.ts index 515a5ce..f6b59ff 100644 --- a/tests/integration/api/specific/novel-promotion-project-art-style-validation.test.ts +++ b/tests/integration/api/specific/novel-promotion-project-art-style-validation.test.ts @@ -60,7 +60,7 @@ describe('api specific - novel promotion project art style validation', () => { vi.clearAllMocks() }) - it('accepts valid artStyle and syncs to user preference', async () => { + it('accepts valid artStyle and keeps user preference unchanged', async () => { const mod = await import('@/app/api/novel-promotion/[projectId]/route') const req = buildMockRequest({ path: '/api/novel-promotion/project-1', @@ -77,11 +77,7 @@ describe('api specific - novel promotion project art style validation', () => { data: expect.objectContaining({ artStyle: 'realistic' }), }), ) - expect(prismaMock.userPreference.upsert).toHaveBeenCalledWith( - expect.objectContaining({ - update: expect.objectContaining({ artStyle: 'realistic' }), - }), - ) + expect(prismaMock.userPreference.upsert).not.toHaveBeenCalled() }) it('rejects invalid artStyle with invalid params', async () => { @@ -102,7 +98,7 @@ describe('api specific - novel promotion project art style validation', () => { expect(prismaMock.userPreference.upsert).not.toHaveBeenCalled() }) - it('accepts audioModel and syncs it to user preference', async () => { + it('accepts audioModel and keeps user preference unchanged', async () => { const mod = await import('@/app/api/novel-promotion/[projectId]/route') const req = buildMockRequest({ path: '/api/novel-promotion/project-1', @@ -121,12 +117,6 @@ describe('api specific - novel promotion project art style validation', () => { }), }), ) - expect(prismaMock.userPreference.upsert).toHaveBeenCalledWith( - expect.objectContaining({ - update: expect.objectContaining({ - audioModel: 'bailian::qwen3-tts-vd-2026-01-26', - }), - }), - ) + expect(prismaMock.userPreference.upsert).not.toHaveBeenCalled() }) }) diff --git a/tests/integration/billing/submitter.integration.test.ts b/tests/integration/billing/submitter.integration.test.ts index 37dfda4..5271e38 100644 --- a/tests/integration/billing/submitter.integration.test.ts +++ b/tests/integration/billing/submitter.integration.test.ts @@ -1,8 +1,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest' import type { ApiError } from '@/lib/api-errors' import { buildDefaultTaskBillingInfo } from '@/lib/billing/task-policy' +import { createRun } from '@/lib/run-runtime/service' import { submitTask } from '@/lib/task/submitter' -import { TASK_TYPE } from '@/lib/task/types' +import { TASK_STATUS, TASK_TYPE } from '@/lib/task/types' import { prisma } from '../../helpers/prisma' import { resetBillingState } from '../../helpers/db-reset' import { createTestUser, seedBalance } from '../../helpers/billing-fixtures' @@ -11,19 +12,23 @@ const queueState = vi.hoisted(() => ({ mode: 'success' as 'success' | 'fail', errorMessage: 'queue add failed', })) +const addTaskJobMock = vi.hoisted(() => vi.fn(async () => ({ id: 'mock-job' }))) +const publishTaskEventMock = vi.hoisted(() => vi.fn(async () => ({}))) vi.mock('@/lib/task/queues', () => ({ - addTaskJob: vi.fn(async () => { + addTaskJob: addTaskJobMock, +})) + +vi.mock('@/lib/task/publisher', () => ({ + publishTaskEvent: publishTaskEventMock, +})) + +addTaskJobMock.mockImplementation(async () => { if (queueState.mode === 'fail') { throw new Error(queueState.errorMessage) } return { id: 'mock-job' } - }), -})) - -vi.mock('@/lib/task/publisher', () => ({ - publishTaskEvent: vi.fn(async () => ({})), -})) +}) describe('billing/submitter integration', () => { beforeEach(async () => { @@ -31,6 +36,7 @@ describe('billing/submitter integration', () => { process.env.BILLING_MODE = 'ENFORCE' queueState.mode = 'success' queueState.errorMessage = 'queue add failed' + vi.clearAllMocks() }) it('builds billing info server-side for billable task submission', async () => { @@ -181,4 +187,140 @@ describe('billing/submitter integration', () => { const freeze = await prisma.balanceFreeze.findFirst({ orderBy: { createdAt: 'desc' } }) expect(freeze?.status).toBe('rolled_back') }) + + it('reuses the active core analysis run instead of creating a second run', async () => { + process.env.BILLING_MODE = 'OFF' + const user = await createTestUser() + const existingTask = await prisma.task.create({ + data: { + userId: user.id, + projectId: 'project-core', + episodeId: 'episode-core', + type: TASK_TYPE.STORY_TO_SCRIPT_RUN, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core', + status: TASK_STATUS.QUEUED, + payload: { + episodeId: 'episode-core', + analysisModel: 'model-core', + meta: { locale: 'zh' }, + }, + queuedAt: new Date(), + }, + }) + const run = await createRun({ + userId: user.id, + projectId: 'project-core', + episodeId: 'episode-core', + workflowType: TASK_TYPE.STORY_TO_SCRIPT_RUN, + taskType: TASK_TYPE.STORY_TO_SCRIPT_RUN, + taskId: existingTask.id, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core', + input: { + episodeId: 'episode-core', + analysisModel: 'model-core', + meta: { locale: 'zh' }, + }, + }) + await prisma.task.update({ + where: { id: existingTask.id }, + data: { + payload: { + episodeId: 'episode-core', + analysisModel: 'model-core', + runId: run.id, + meta: { locale: 'zh', runId: run.id }, + }, + }, + }) + + const result = await submitTask({ + userId: user.id, + locale: 'zh', + projectId: 'project-core', + episodeId: 'episode-core', + type: TASK_TYPE.STORY_TO_SCRIPT_RUN, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core', + payload: { + episodeId: 'episode-core', + analysisModel: 'model-core', + }, + dedupeKey: 'story_to_script:episode-core', + }) + + expect(result.deduped).toBe(true) + expect(result.taskId).toBe(existingTask.id) + expect(result.runId).toBe(run.id) + expect(await prisma.graphRun.count()).toBe(1) + expect(addTaskJobMock).not.toHaveBeenCalled() + }) + + it('reattaches a new task to the existing active run when the old task is already terminal', async () => { + process.env.BILLING_MODE = 'OFF' + const user = await createTestUser() + const failedTask = await prisma.task.create({ + data: { + userId: user.id, + projectId: 'project-core-retry', + episodeId: 'episode-core-retry', + type: TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core-retry', + status: TASK_STATUS.FAILED, + errorCode: 'TEST_FAILED', + errorMessage: 'old task already failed', + payload: { + episodeId: 'episode-core-retry', + analysisModel: 'model-core', + meta: { locale: 'zh' }, + }, + queuedAt: new Date(), + finishedAt: new Date(), + }, + }) + const run = await createRun({ + userId: user.id, + projectId: 'project-core-retry', + episodeId: 'episode-core-retry', + workflowType: TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, + taskType: TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, + taskId: failedTask.id, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core-retry', + input: { + episodeId: 'episode-core-retry', + analysisModel: 'model-core', + meta: { locale: 'zh' }, + }, + }) + + const result = await submitTask({ + userId: user.id, + locale: 'zh', + projectId: 'project-core-retry', + episodeId: 'episode-core-retry', + type: TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, + targetType: 'NovelPromotionEpisode', + targetId: 'episode-core-retry', + payload: { + episodeId: 'episode-core-retry', + analysisModel: 'model-core', + }, + dedupeKey: 'script_to_storyboard:episode-core-retry', + }) + + expect(result.deduped).toBe(false) + expect(result.runId).toBe(run.id) + expect(result.taskId).not.toBe(failedTask.id) + + const refreshedRun = await prisma.graphRun.findUnique({ where: { id: run.id } }) + const newTask = await prisma.task.findUnique({ where: { id: result.taskId } }) + expect(refreshedRun?.taskId).toBe(result.taskId) + expect(newTask?.status).toBe(TASK_STATUS.QUEUED) + expect(newTask?.payload).toMatchObject({ + runId: run.id, + }) + }) }) diff --git a/tests/integration/chain/text.chain.test.ts b/tests/integration/chain/text.chain.test.ts index 311cc78..e4f6723 100644 --- a/tests/integration/chain/text.chain.test.ts +++ b/tests/integration/chain/text.chain.test.ts @@ -122,7 +122,30 @@ describe('chain contract - text queue behavior', () => { expect(calls).toHaveLength(1) expect(calls[0]).toEqual(expect.objectContaining({ jobName: TASK_TYPE.SCRIPT_TO_STORYBOARD_RUN, - options: expect.objectContaining({ jobId: 'task-text-1', priority: 0 }), + options: expect.objectContaining({ jobId: 'task-text-1', priority: 0, attempts: 1 }), + })) + }) + + it('forces single queue attempt for core analysis workflows', async () => { + const { addTaskJob, QUEUE_NAME } = await import('@/lib/task/queues') + + await addTaskJob({ + taskId: 'task-text-story-1', + type: TASK_TYPE.STORY_TO_SCRIPT_RUN, + locale: 'zh', + projectId: 'project-1', + episodeId: 'episode-1', + targetType: 'NovelPromotionEpisode', + targetId: 'episode-1', + payload: { episodeId: 'episode-1' }, + userId: 'user-1', + }, { attempts: 5 }) + + const calls = queueState.addCallsByQueue.get(QUEUE_NAME.TEXT) || [] + expect(calls).toHaveLength(1) + expect(calls[0]?.options).toEqual(expect.objectContaining({ + jobId: 'task-text-story-1', + attempts: 1, })) }) diff --git a/tests/integration/run-runtime/retry-failed-step.integration.test.ts b/tests/integration/run-runtime/retry-failed-step.integration.test.ts new file mode 100644 index 0000000..3508d98 --- /dev/null +++ b/tests/integration/run-runtime/retry-failed-step.integration.test.ts @@ -0,0 +1,343 @@ +import { beforeEach, describe, expect, it } from 'vitest' +import { retryFailedStep } from '@/lib/run-runtime/service' +import { RUN_STATUS, RUN_STEP_STATUS } from '@/lib/run-runtime/types' +import { prisma } from '../../helpers/prisma' +import { resetBillingState } from '../../helpers/db-reset' +import { createTestUser } from '../../helpers/billing-fixtures' + +describe('run runtime retryFailedStep invalidation', () => { + beforeEach(async () => { + await resetBillingState() + }) + + it('invalidates downstream story-to-script steps and artifacts', async () => { + const user = await createTestUser() + const run = await prisma.graphRun.create({ + data: { + userId: user.id, + projectId: 'project-retry-story', + episodeId: 'episode-retry-story', + workflowType: 'story_to_script_run', + taskType: 'story_to_script_run', + targetType: 'NovelPromotionEpisode', + targetId: 'episode-retry-story', + status: RUN_STATUS.FAILED, + queuedAt: new Date(), + startedAt: new Date(), + finishedAt: new Date(), + }, + }) + + await prisma.graphStep.createMany({ + data: [ + { + runId: run.id, + stepKey: 'analyze_characters', + stepTitle: 'Analyze Characters', + status: RUN_STEP_STATUS.FAILED, + currentAttempt: 1, + stepIndex: 1, + stepTotal: 5, + startedAt: new Date(), + finishedAt: new Date(), + lastErrorCode: 'STEP_FAILED', + lastErrorMessage: 'characters failed', + }, + { + runId: run.id, + stepKey: 'analyze_locations', + stepTitle: 'Analyze Locations', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 2, + stepTotal: 5, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'split_clips', + stepTitle: 'Split Clips', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 3, + stepTotal: 5, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'screenplay_clip-a', + stepTitle: 'Screenplay A', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 4, + stepTotal: 5, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'screenplay_clip-b', + stepTitle: 'Screenplay B', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 5, + stepTotal: 5, + startedAt: new Date(), + finishedAt: new Date(), + }, + ], + }) + + await prisma.graphArtifact.createMany({ + data: [ + { + runId: run.id, + stepKey: 'analyze_characters', + artifactType: 'analysis.characters', + refId: 'episode-retry-story', + payload: { rows: [{ name: 'Hero' }] }, + }, + { + runId: run.id, + stepKey: 'analyze_locations', + artifactType: 'analysis.locations', + refId: 'episode-retry-story', + payload: { rows: [{ name: 'City' }] }, + }, + { + runId: run.id, + stepKey: 'split_clips', + artifactType: 'clips', + refId: 'episode-retry-story', + payload: { clips: [{ id: 'clip-a' }] }, + }, + { + runId: run.id, + stepKey: 'screenplay_clip-a', + artifactType: 'screenplay.clip', + refId: 'clip-a', + payload: { scenes: [{ id: 1 }] }, + }, + ], + }) + + const retried = await retryFailedStep({ + runId: run.id, + userId: user.id, + stepKey: 'analyze_characters', + }) + + expect(retried?.retryAttempt).toBe(2) + expect(retried?.invalidatedStepKeys.slice().sort()).toEqual([ + 'analyze_characters', + 'screenplay_clip-a', + 'screenplay_clip-b', + 'split_clips', + ]) + + const steps = await prisma.graphStep.findMany({ + where: { runId: run.id }, + orderBy: { stepIndex: 'asc' }, + }) + const stepMap = new Map(steps.map((step) => [step.stepKey, step])) + expect(stepMap.get('analyze_characters')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 2, + lastErrorCode: null, + lastErrorMessage: null, + }) + expect(stepMap.get('split_clips')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 0, + }) + expect(stepMap.get('screenplay_clip-a')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 0, + }) + expect(stepMap.get('analyze_locations')).toMatchObject({ + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + }) + + const artifacts = await prisma.graphArtifact.findMany({ + where: { runId: run.id }, + orderBy: { stepKey: 'asc' }, + }) + expect(artifacts.map((artifact) => artifact.stepKey)).toEqual(['analyze_locations']) + + const refreshedRun = await prisma.graphRun.findUnique({ where: { id: run.id } }) + expect(refreshedRun?.status).toBe(RUN_STATUS.RUNNING) + expect(refreshedRun?.errorCode).toBeNull() + expect(refreshedRun?.errorMessage).toBeNull() + }) + + it('invalidates only the dependent storyboard branch plus voice analyze', async () => { + const user = await createTestUser() + const run = await prisma.graphRun.create({ + data: { + userId: user.id, + projectId: 'project-retry-storyboard', + episodeId: 'episode-retry-storyboard', + workflowType: 'script_to_storyboard_run', + taskType: 'script_to_storyboard_run', + targetType: 'NovelPromotionEpisode', + targetId: 'episode-retry-storyboard', + status: RUN_STATUS.FAILED, + queuedAt: new Date(), + startedAt: new Date(), + finishedAt: new Date(), + }, + }) + + await prisma.graphStep.createMany({ + data: [ + { + runId: run.id, + stepKey: 'clip_clip-1_phase1', + stepTitle: 'Clip 1 Phase 1', + status: RUN_STEP_STATUS.FAILED, + currentAttempt: 1, + stepIndex: 1, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + lastErrorCode: 'STEP_FAILED', + lastErrorMessage: 'phase1 failed', + }, + { + runId: run.id, + stepKey: 'clip_clip-1_phase2_cinematography', + stepTitle: 'Clip 1 Phase 2 Cine', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 2, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'clip_clip-1_phase2_acting', + stepTitle: 'Clip 1 Phase 2 Acting', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 3, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'clip_clip-1_phase3_detail', + stepTitle: 'Clip 1 Phase 3', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 4, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'clip_clip-2_phase3_detail', + stepTitle: 'Clip 2 Phase 3', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 5, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + }, + { + runId: run.id, + stepKey: 'voice_analyze', + stepTitle: 'Voice Analyze', + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + stepIndex: 6, + stepTotal: 6, + startedAt: new Date(), + finishedAt: new Date(), + }, + ], + }) + + await prisma.graphArtifact.createMany({ + data: [ + { + runId: run.id, + stepKey: 'clip_clip-1_phase1', + artifactType: 'storyboard.clip.phase1', + refId: 'clip-1', + payload: { panels: [] }, + }, + { + runId: run.id, + stepKey: 'clip_clip-1_phase2_cinematography', + artifactType: 'storyboard.clip.phase2.cine', + refId: 'clip-1', + payload: { rules: [] }, + }, + { + runId: run.id, + stepKey: 'clip_clip-2_phase3_detail', + artifactType: 'storyboard.clip.phase3', + refId: 'clip-2', + payload: { panels: [] }, + }, + { + runId: run.id, + stepKey: 'voice_analyze', + artifactType: 'voice.lines', + refId: 'episode-retry-storyboard', + payload: { lines: [] }, + }, + ], + }) + + const retried = await retryFailedStep({ + runId: run.id, + userId: user.id, + stepKey: 'clip_clip-1_phase1', + }) + + expect(retried?.retryAttempt).toBe(2) + expect(retried?.invalidatedStepKeys.slice().sort()).toEqual([ + 'clip_clip-1_phase1', + 'clip_clip-1_phase2_acting', + 'clip_clip-1_phase2_cinematography', + 'clip_clip-1_phase3_detail', + 'voice_analyze', + ]) + + const steps = await prisma.graphStep.findMany({ + where: { runId: run.id }, + orderBy: { stepIndex: 'asc' }, + }) + const stepMap = new Map(steps.map((step) => [step.stepKey, step])) + expect(stepMap.get('clip_clip-1_phase1')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 2, + }) + expect(stepMap.get('clip_clip-1_phase2_cinematography')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 0, + }) + expect(stepMap.get('voice_analyze')).toMatchObject({ + status: RUN_STEP_STATUS.PENDING, + currentAttempt: 0, + }) + expect(stepMap.get('clip_clip-2_phase3_detail')).toMatchObject({ + status: RUN_STEP_STATUS.COMPLETED, + currentAttempt: 1, + }) + + const artifacts = await prisma.graphArtifact.findMany({ + where: { runId: run.id }, + orderBy: { stepKey: 'asc' }, + }) + expect(artifacts.map((artifact) => artifact.stepKey)).toEqual(['clip_clip-2_phase3_detail']) + }) +}) diff --git a/tests/system/helpers/tasks.ts b/tests/system/helpers/tasks.ts index 85703fb..9f172c2 100644 --- a/tests/system/helpers/tasks.ts +++ b/tests/system/helpers/tasks.ts @@ -10,6 +10,7 @@ type WaitTaskOptions = { const TERMINAL_STATUSES = new Set([ TASK_STATUS.COMPLETED, TASK_STATUS.FAILED, + TASK_STATUS.CANCELED, TASK_STATUS.DISMISSED, ]) diff --git a/tests/unit/helpers/task-state-service.test.ts b/tests/unit/helpers/task-state-service.test.ts index 5156cc2..c626382 100644 --- a/tests/unit/helpers/task-state-service.test.ts +++ b/tests/unit/helpers/task-state-service.test.ts @@ -80,4 +80,26 @@ describe('task state service helpers', () => { expect(state.lastError?.code).toBe('INVALID_PARAMS') expect(state.lastError?.message).toBe('bad input') }) + + it('treats canceled task as failed presentation state', () => { + const state = resolveTargetState( + { targetType: 'GlobalCharacter', targetId: 'c1' }, + [ + { + id: 'task-3', + type: 'asset_hub_image', + status: 'canceled', + progress: 100, + payload: { ui: { intent: 'modify', hasOutputAtStart: true } }, + errorCode: 'TASK_CANCELLED', + errorMessage: 'Task cancelled by user', + updatedAt: new Date('2026-02-25T00:00:00.000Z'), + }, + ], + ) + + expect(state.phase).toBe('failed') + expect(state.lastError?.code).toBe('CONFLICT') + expect(state.lastError?.message).toBe('Task cancelled by user') + }) }) diff --git a/tests/unit/novel-promotion/voice-runtime-sync.test.ts b/tests/unit/novel-promotion/voice-runtime-sync.test.ts index 609c603..4fe712a 100644 --- a/tests/unit/novel-promotion/voice-runtime-sync.test.ts +++ b/tests/unit/novel-promotion/voice-runtime-sync.test.ts @@ -209,4 +209,48 @@ describe('useVoiceRuntimeSync', () => { errorMessage: 'QwenTTS voiceId missing', }) }) + + it('treats canceled task as terminal failure for pending voice generation', () => { + const loadData = vi.fn(async () => undefined) + const setPendingVoiceGenerationByLineId = vi.fn() + const onTaskFailure = vi.fn() + const effectCallbacks: Array<() => void | (() => void)> = [] + + useEffectMock.mockImplementation((callback: () => void | (() => void)) => { + effectCallbacks.push(callback) + }) + + useVoiceRuntimeSync({ + loadData, + voiceLines: [buildVoiceLine({ + id: 'line-10', + lineIndex: 10, + })], + activeVoiceTaskLineIds: new Set(), + pendingVoiceGenerationByLineId: { + 'line-10': { + submittedUpdatedAt: '2026-03-07T12:00:00.000Z', + startedAt: '2026-03-07T12:24:10.000Z', + taskId: 'task-canceled-1', + taskStatus: 'canceled', + taskErrorMessage: 'Task cancelled by user', + }, + }, + setPendingVoiceGenerationByLineId, + onTaskFailure, + }) + + const renderEffects = effectCallbacks.splice(0) + renderEffects[1]?.() + + expect(onTaskFailure).toHaveBeenCalledWith({ + lineId: 'line-10', + line: expect.objectContaining({ + id: 'line-10', + lineIndex: 10, + }), + taskId: 'task-canceled-1', + errorMessage: 'Task cancelled by user', + }) + }) }) diff --git a/tests/unit/run-runtime/graph-executor.test.ts b/tests/unit/run-runtime/graph-executor.test.ts deleted file mode 100644 index ade7436..0000000 --- a/tests/unit/run-runtime/graph-executor.test.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import { - executePipelineGraph, - GraphCancellationError, - type GraphExecutorState, -} from '@/lib/run-runtime/graph-executor' - -const { createCheckpointMock, getRunByIdMock } = vi.hoisted(() => ({ - createCheckpointMock: vi.fn(), - getRunByIdMock: vi.fn(), -})) - -vi.mock('@/lib/run-runtime/service', () => ({ - buildLeanState: vi.fn((value: unknown) => value), - createCheckpoint: createCheckpointMock, - getRunById: getRunByIdMock, -})) - -describe('graph executor', () => { - beforeEach(() => { - vi.clearAllMocks() - getRunByIdMock.mockResolvedValue({ - id: 'run_1', - userId: 'user_1', - status: 'running', - }) - }) - - it('retries retryable node error and writes checkpoint once success', async () => { - const state: GraphExecutorState = { - refs: {}, - meta: {}, - } - - const runMock = vi - .fn() - .mockRejectedValueOnce(new TypeError('fetch failed sending request')) - .mockResolvedValueOnce({ - output: { ok: true }, - }) - - await executePipelineGraph({ - runId: 'run_1', - projectId: 'project_1', - userId: 'user_1', - state, - nodes: [ - { - key: 'node_a', - title: 'Node A', - maxAttempts: 2, - run: runMock, - }, - ], - }) - - expect(runMock).toHaveBeenCalledTimes(2) - expect(createCheckpointMock).toHaveBeenCalledTimes(1) - expect(createCheckpointMock).toHaveBeenCalledWith(expect.objectContaining({ - runId: 'run_1', - nodeKey: 'node_a', - version: 2, - })) - }) - - it('throws cancellation error when run status is canceling', async () => { - getRunByIdMock.mockResolvedValue({ - id: 'run_1', - userId: 'user_1', - status: 'canceling', - }) - - await expect( - executePipelineGraph({ - runId: 'run_1', - projectId: 'project_1', - userId: 'user_1', - state: { - refs: {}, - meta: {}, - }, - nodes: [ - { - key: 'node_a', - title: 'Node A', - run: async () => ({ output: { ok: true } }), - }, - ], - }), - ).rejects.toBeInstanceOf(GraphCancellationError) - }) - - it('merges refs into state and persists lean checkpoint', async () => { - const state: GraphExecutorState = { - refs: { - scriptId: 'script_1', - }, - meta: { - tag: 'v1', - }, - } - - await executePipelineGraph({ - runId: 'run_1', - projectId: 'project_1', - userId: 'user_1', - state, - nodes: [ - { - key: 'node_b', - title: 'Node B', - run: async () => ({ - checkpointRefs: { - storyboardId: 'storyboard_1', - }, - checkpointMeta: { - done: true, - }, - }), - }, - ], - }) - - expect(state.refs).toEqual({ - scriptId: 'script_1', - storyboardId: 'storyboard_1', - voiceLineBatchId: undefined, - versionHash: undefined, - cursor: undefined, - }) - expect(createCheckpointMock).toHaveBeenCalledWith(expect.objectContaining({ - state: expect.objectContaining({ - refs: expect.objectContaining({ - scriptId: 'script_1', - storyboardId: 'storyboard_1', - }), - }), - })) - }) -}) diff --git a/tests/unit/run-runtime/langgraph-pipeline.test.ts b/tests/unit/run-runtime/langgraph-pipeline.test.ts deleted file mode 100644 index 6b9cf8b..0000000 --- a/tests/unit/run-runtime/langgraph-pipeline.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest' -import type { GraphExecutorState } from '@/lib/run-runtime/graph-executor' - -const executePipelineGraphMock = vi.hoisted(() => - vi.fn(async (input: { - runId: string - projectId: string - userId: string - state: GraphExecutorState - nodes: Array<{ - key: string - run: (context: { - runId: string - projectId: string - userId: string - nodeKey: string - attempt: number - state: GraphExecutorState - }) => Promise - }> - }) => { - for (const node of input.nodes) { - await node.run({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - nodeKey: node.key, - attempt: 1, - state: input.state, - }) - } - return input.state - }), -) - -vi.mock('@/lib/run-runtime/graph-executor', () => ({ - executePipelineGraph: executePipelineGraphMock, -})) - -import { runLangGraphPipeline } from '@/lib/run-runtime/langgraph-pipeline' - -type TestState = GraphExecutorState & { - order: string[] -} - -describe('langgraph pipeline adapter', () => { - beforeEach(() => { - vi.clearAllMocks() - }) - - it('runs nodes in declared order through langgraph', async () => { - const state: TestState = { - refs: {}, - meta: {}, - order: [], - } - - const result = await runLangGraphPipeline({ - runId: 'run-1', - projectId: 'project-1', - userId: 'user-1', - state, - nodes: [ - { - key: 'node_a', - title: 'Node A', - run: async (context) => { - const typedState = context.state as TestState - typedState.order.push('node_a') - return { output: { ok: true } } - }, - }, - { - key: 'node_b', - title: 'Node B', - run: async (context) => { - const typedState = context.state as TestState - typedState.order.push('node_b') - return { output: { ok: true } } - }, - }, - ], - }) - - expect(result.order).toEqual(['node_a', 'node_b']) - expect(executePipelineGraphMock).toHaveBeenCalledTimes(2) - }) - - it('returns input state when graph has no nodes', async () => { - const state: TestState = { - refs: {}, - meta: {}, - order: [], - } - - const result = await runLangGraphPipeline({ - runId: 'run-1', - projectId: 'project-1', - userId: 'user-1', - state, - nodes: [], - }) - - expect(result).toBe(state) - expect(executePipelineGraphMock).not.toHaveBeenCalled() - }) - - it('fails explicitly on duplicate node keys', async () => { - const state: TestState = { - refs: {}, - meta: {}, - order: [], - } - - await expect( - runLangGraphPipeline({ - runId: 'run-1', - projectId: 'project-1', - userId: 'user-1', - state, - nodes: [ - { - key: 'dup', - title: 'Dup 1', - run: async () => ({ output: { ok: true } }), - }, - { - key: 'dup', - title: 'Dup 2', - run: async () => ({ output: { ok: true } }), - }, - ], - }), - ).rejects.toThrow('LANGGRAPH_NODE_KEY_DUPLICATE: dup') - }) -}) diff --git a/tests/unit/task/publisher.direct-run-events.test.ts b/tests/unit/task/publisher.direct-run-events.test.ts new file mode 100644 index 0000000..cab2888 --- /dev/null +++ b/tests/unit/task/publisher.direct-run-events.test.ts @@ -0,0 +1,128 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' + +type TaskEventRow = { + id: number + taskId: string + projectId: string + userId: string + eventType: string + payload: Record | null + createdAt: Date +} + +const taskEventCreateMock = vi.hoisted(() => + vi.fn<(...args: unknown[]) => Promise>(async () => null), +) +const taskEventFindManyMock = vi.hoisted(() => + vi.fn<(...args: unknown[]) => Promise>(async () => []), +) +const taskFindManyMock = vi.hoisted(() => + vi.fn<(...args: unknown[]) => Promise>>>(async () => []), +) +const redisPublishMock = vi.hoisted(() => vi.fn(async () => 1)) +const mapTaskSSEEventToRunEventsMock = vi.hoisted(() => + vi.fn(() => [{ + runId: 'run-1', + projectId: 'project-1', + userId: 'user-1', + eventType: 'step.chunk', + stepKey: 'split_clips', + attempt: 1, + lane: 'text', + payload: { ok: true }, + }]), +) +const publishRunEventMock = vi.hoisted(() => vi.fn(async () => undefined)) + +vi.mock('@/lib/prisma', () => ({ + prisma: { + taskEvent: { + create: taskEventCreateMock, + findMany: taskEventFindManyMock, + }, + task: { + findMany: taskFindManyMock, + }, + }, +})) + +vi.mock('@/lib/redis', () => ({ + redis: { + publish: redisPublishMock, + }, +})) + +vi.mock('@/lib/run-runtime/task-bridge', () => ({ + mapTaskSSEEventToRunEvents: mapTaskSSEEventToRunEventsMock, +})) + +vi.mock('@/lib/run-runtime/publisher', () => ({ + publishRunEvent: publishRunEventMock, +})) + +import { publishTaskStreamEvent } from '@/lib/task/publisher' + +describe('task publisher direct run event boundary', () => { + beforeEach(() => { + taskEventCreateMock.mockReset() + taskEventFindManyMock.mockReset() + taskFindManyMock.mockReset() + redisPublishMock.mockReset() + mapTaskSSEEventToRunEventsMock.mockClear() + publishRunEventMock.mockClear() + }) + + it('does not mirror run events for story_to_script task stream events', async () => { + await publishTaskStreamEvent({ + taskId: 'task-1', + projectId: 'project-1', + userId: 'user-1', + taskType: 'story_to_script_run', + targetType: 'NovelPromotionEpisode', + targetId: 'episode-1', + episodeId: 'episode-1', + payload: { + stepId: 'split_clips', + stream: { + kind: 'text', + seq: 1, + lane: 'main', + delta: 'hello', + }, + }, + persist: false, + }) + + expect(redisPublishMock).toHaveBeenCalledTimes(1) + expect(mapTaskSSEEventToRunEventsMock).not.toHaveBeenCalled() + expect(publishRunEventMock).not.toHaveBeenCalled() + }) + + it('continues mirroring run events for non-core task types', async () => { + await publishTaskStreamEvent({ + taskId: 'task-2', + projectId: 'project-1', + userId: 'user-1', + taskType: 'voice_line', + targetType: 'VoiceLine', + targetId: 'line-1', + payload: { + stepId: 'voice', + stream: { + kind: 'text', + seq: 1, + lane: 'main', + delta: 'world', + }, + }, + persist: false, + }) + + expect(mapTaskSSEEventToRunEventsMock).toHaveBeenCalledTimes(1) + expect(publishRunEventMock).toHaveBeenCalledWith(expect.objectContaining({ + runId: 'run-1', + eventType: 'step.chunk', + stepKey: 'split_clips', + })) + }) +}) diff --git a/tests/unit/worker/llm-stream.test.ts b/tests/unit/worker/llm-stream.test.ts index 06222cd..006afcc 100644 --- a/tests/unit/worker/llm-stream.test.ts +++ b/tests/unit/worker/llm-stream.test.ts @@ -132,4 +132,36 @@ describe('createWorkerLLMStreamCallbacks', () => { expect(payload.stepTitle).toBe('A') expect(payload.output).toBe('characters-final') }) + + it('uses injected active controller for run-owned workflows', async () => { + const job = buildJob() + const context = createWorkerLLMStreamContext(job, 'story_to_script') + const assertActive = vi.fn(async (_stage: string) => undefined) + const isActive = vi.fn(async () => true) + const callbacks = createWorkerLLMStreamCallbacks(job, context, { + assertActive, + isActive, + }) + + callbacks.onChunk?.({ + kind: 'text', + delta: 'hello', + seq: 1, + lane: 'main', + step: { id: 'split_clips', attempt: 1, title: 'split', index: 1, total: 1 }, + }) + await callbacks.flush() + + expect(assertActive).toHaveBeenCalledWith('worker_llm_stream') + expect(assertTaskActiveMock).not.toHaveBeenCalled() + expect(reportTaskStreamChunkMock).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + delta: 'hello', + }), + expect.objectContaining({ + stepId: 'split_clips', + }), + ) + }) }) diff --git a/tests/unit/worker/script-to-storyboard.test.ts b/tests/unit/worker/script-to-storyboard.test.ts index 0e937b9..7c8fb95 100644 --- a/tests/unit/worker/script-to-storyboard.test.ts +++ b/tests/unit/worker/script-to-storyboard.test.ts @@ -47,32 +47,17 @@ const runScriptToStoryboardOrchestratorMock = vi.hoisted(() => }, })), ) -const graphExecutorMock = vi.hoisted(() => ({ - executePipelineGraph: vi.fn(async (input: { - runId: string - projectId: string - userId: string - state: Record - nodes: Array<{ key: string; run: (ctx: Record) => Promise }> - }) => { - for (const node of input.nodes) { - await node.run({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - nodeKey: node.key, - attempt: 1, - state: input.state, - }) - } - return input.state - }), -})) - const parseVoiceLinesJsonMock = vi.hoisted(() => vi.fn()) const persistStoryboardsAndPanelsMock = vi.hoisted(() => vi.fn()) const parseStoryboardRetryTargetMock = vi.hoisted(() => vi.fn()) const runScriptToStoryboardAtomicRetryMock = vi.hoisted(() => vi.fn()) +const workflowLeaseMock = vi.hoisted(() => ({ + assertWorkflowRunActive: vi.fn(async () => undefined), + withWorkflowRunLease: vi.fn(async (params: { run: () => Promise }) => ({ + claimed: true, + result: await params.run(), + })), +})) const txState = vi.hoisted(() => ({ createdRows: [] as Array>, @@ -145,10 +130,6 @@ vi.mock('@/lib/novel-promotion/script-to-storyboard/orchestrator', () => ({ } }, })) -vi.mock('@/lib/run-runtime/graph-executor', () => ({ - executePipelineGraph: graphExecutorMock.executePipelineGraph, -})) - vi.mock('@/lib/workers/handlers/llm-stream', () => ({ createWorkerLLMStreamContext: vi.fn(() => ({ streamRunId: 'run-1', nextSeqByStepLane: {} })), createWorkerLLMStreamCallbacks: vi.fn(() => ({ @@ -192,6 +173,7 @@ vi.mock('@/lib/workers/handlers/script-to-storyboard-atomic-retry', () => ({ parseStoryboardRetryTarget: parseStoryboardRetryTargetMock, runScriptToStoryboardAtomicRetry: runScriptToStoryboardAtomicRetryMock, })) +vi.mock('@/lib/run-runtime/workflow-lease', () => workflowLeaseMock) import { handleScriptToStoryboardTask } from '@/lib/workers/handlers/script-to-storyboard' diff --git a/tests/unit/worker/shared.direct-run-events.test.ts b/tests/unit/worker/shared.direct-run-events.test.ts new file mode 100644 index 0000000..18fe188 --- /dev/null +++ b/tests/unit/worker/shared.direct-run-events.test.ts @@ -0,0 +1,175 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest' +import type { Job } from 'bullmq' +import type { TaskJobData } from '@/lib/task/types' + +const tryUpdateTaskProgressMock = vi.hoisted(() => vi.fn(async () => true)) +const publishTaskEventMock = vi.hoisted(() => vi.fn(async () => ({}))) +const publishTaskStreamEventMock = vi.hoisted(() => vi.fn(async () => ({}))) +const publishRunEventMock = vi.hoisted(() => vi.fn(async () => undefined)) +const mapTaskSSEEventToRunEventsMock = vi.hoisted(() => + vi.fn(() => [{ + runId: 'run-1', + projectId: 'project-1', + userId: 'user-1', + eventType: 'step.start', + stepKey: 'split_clips', + attempt: 1, + lane: null, + payload: { mirrored: true }, + }]), +) + +vi.mock('@/lib/prisma', () => ({ + prisma: { + project: { + findUnique: vi.fn(async () => null), + }, + }, +})) + +vi.mock('@/lib/logging/core', () => ({ + createScopedLogger: () => ({ + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }), +})) + +vi.mock('@/lib/task/service', () => ({ + rollbackTaskBillingForTask: vi.fn(async () => ({ attempted: false, rolledBack: false, billingInfo: null })), + touchTaskHeartbeat: vi.fn(async () => undefined), + tryMarkTaskCompleted: vi.fn(async () => true), + tryMarkTaskFailed: vi.fn(async () => true), + tryMarkTaskProcessing: vi.fn(async () => true), + tryUpdateTaskProgress: tryUpdateTaskProgressMock, + updateTaskBillingInfo: vi.fn(async () => undefined), +})) + +vi.mock('@/lib/task/publisher', () => ({ + publishTaskEvent: publishTaskEventMock, + publishTaskStreamEvent: publishTaskStreamEventMock, +})) + +vi.mock('@/lib/task/progress-message', () => ({ + buildTaskProgressMessage: vi.fn(() => 'progress-message'), + getTaskStageLabel: vi.fn((stage: string) => `label:${stage}`), +})) + +vi.mock('@/lib/errors/normalize', () => ({ + normalizeAnyError: vi.fn((error: Error) => ({ + code: 'ERROR', + message: error.message, + retryable: false, + provider: null, + })), +})) + +vi.mock('@/lib/billing', () => ({ + rollbackTaskBilling: vi.fn(async () => null), + settleTaskBilling: vi.fn(async () => null), +})) + +vi.mock('@/lib/billing/runtime-usage', () => ({ + withTextUsageCollection: vi.fn(async (fn: () => Promise) => ({ + result: await fn(), + textUsage: null, + })), +})) + +vi.mock('@/lib/logging/file-writer', () => ({ + onProjectNameAvailable: vi.fn(), +})) + +vi.mock('@/lib/run-runtime/task-bridge', () => ({ + mapTaskSSEEventToRunEvents: mapTaskSSEEventToRunEventsMock, +})) + +vi.mock('@/lib/run-runtime/publisher', () => ({ + publishRunEvent: publishRunEventMock, +})) + +import { reportTaskProgress, reportTaskStreamChunk, withTaskLifecycle } from '@/lib/workers/shared' + +function buildJob(taskType: TaskJobData['type']): Job { + return { + data: { + taskId: 'task-1', + type: taskType, + locale: 'zh', + projectId: 'project-1', + episodeId: 'episode-1', + targetType: 'NovelPromotionEpisode', + targetId: 'episode-1', + userId: 'user-1', + payload: { + runId: 'run-1', + }, + trace: null, + }, + queueName: 'text', + } as unknown as Job +} + +describe('worker shared direct run events', () => { + beforeEach(() => { + tryUpdateTaskProgressMock.mockReset() + tryUpdateTaskProgressMock.mockResolvedValue(true) + publishTaskEventMock.mockReset() + publishTaskStreamEventMock.mockReset() + publishRunEventMock.mockReset() + mapTaskSSEEventToRunEventsMock.mockClear() + }) + + it('publishes run events directly for core analysis progress updates', async () => { + await reportTaskProgress(buildJob('story_to_script_run'), 42, { + stage: 'story_to_script_step', + stepId: 'split_clips', + stepTitle: 'Split', + }) + + expect(publishTaskEventMock).toHaveBeenCalledWith(expect.objectContaining({ + taskType: 'story_to_script_run', + type: 'task.progress', + })) + expect(mapTaskSSEEventToRunEventsMock).toHaveBeenCalledTimes(1) + expect(publishRunEventMock).toHaveBeenCalledWith(expect.objectContaining({ + runId: 'run-1', + eventType: 'step.start', + stepKey: 'split_clips', + })) + }) + + it('publishes run events directly for core analysis stream chunks', async () => { + await reportTaskStreamChunk(buildJob('script_to_storyboard_run'), { + kind: 'text', + delta: 'hello', + seq: 1, + lane: 'main', + }, { + stepId: 'clip_1_phase1', + stepTitle: 'Phase 1', + }) + + expect(publishTaskStreamEventMock).toHaveBeenCalledWith(expect.objectContaining({ + taskType: 'script_to_storyboard_run', + persist: true, + })) + expect(mapTaskSSEEventToRunEventsMock).toHaveBeenCalledTimes(1) + expect(publishRunEventMock).toHaveBeenCalledWith(expect.objectContaining({ + runId: 'run-1', + eventType: 'step.start', + stepKey: 'split_clips', + })) + }) + + it('emits run.start directly when the core analysis worker begins execution', async () => { + await withTaskLifecycle(buildJob('story_to_script_run'), async () => ({ + ok: true, + })) + + expect(publishRunEventMock).toHaveBeenCalledWith(expect.objectContaining({ + runId: 'run-1', + eventType: 'run.start', + })) + }) +}) diff --git a/tests/unit/worker/story-to-script.test.ts b/tests/unit/worker/story-to-script.test.ts index 48a6204..4be78e0 100644 --- a/tests/unit/worker/story-to-script.test.ts +++ b/tests/unit/worker/story-to-script.test.ts @@ -26,33 +26,18 @@ const configMock = vi.hoisted(() => ({ const orchestratorMock = vi.hoisted(() => ({ runStoryToScriptOrchestrator: vi.fn(), })) -const graphExecutorMock = vi.hoisted(() => ({ - executePipelineGraph: vi.fn(async (input: { - runId: string - projectId: string - userId: string - state: Record - nodes: Array<{ key: string; run: (ctx: Record) => Promise }> - }) => { - for (const node of input.nodes) { - await node.run({ - runId: input.runId, - projectId: input.projectId, - userId: input.userId, - nodeKey: node.key, - attempt: 1, - state: input.state, - }) - } - return input.state - }), -})) - const helperMock = vi.hoisted(() => ({ persistAnalyzedCharacters: vi.fn(async () => [{ id: 'character-new-1' }]), persistAnalyzedLocations: vi.fn(async () => [{ id: 'location-new-1' }]), persistClips: vi.fn(async () => [{ clipKey: 'clip-1', id: 'clip-row-1' }]), })) +const workflowLeaseMock = vi.hoisted(() => ({ + assertWorkflowRunActive: vi.fn(async () => undefined), + withWorkflowRunLease: vi.fn(async (params: { run: () => Promise }) => ({ + claimed: true, + result: await params.run(), + })), +})) vi.mock('@/lib/prisma', () => ({ prisma: prismaMock })) vi.mock('@/lib/llm-client', () => ({ @@ -69,9 +54,6 @@ vi.mock('@/lib/logging/file-writer', () => ({ onProjectNameAvailable: vi.fn() }) vi.mock('@/lib/workers/shared', () => ({ reportTaskProgress: workerMock.reportTaskProgress })) vi.mock('@/lib/workers/utils', () => ({ assertTaskActive: workerMock.assertTaskActive })) vi.mock('@/lib/novel-promotion/story-to-script/orchestrator', () => orchestratorMock) -vi.mock('@/lib/run-runtime/graph-executor', () => ({ - executePipelineGraph: graphExecutorMock.executePipelineGraph, -})) vi.mock('@/lib/workers/handlers/llm-stream', () => ({ createWorkerLLMStreamContext: vi.fn(() => ({ streamRunId: 'run-1', nextSeqByStepLane: {} })), createWorkerLLMStreamCallbacks: vi.fn(() => ({ @@ -100,6 +82,7 @@ vi.mock('@/lib/workers/handlers/story-to-script-helpers', () => ({ persistClips: helperMock.persistClips, resolveClipRecordId: (clipIdMap: Map, clipId: string) => clipIdMap.get(clipId) ?? null, })) +vi.mock('@/lib/run-runtime/workflow-lease', () => workflowLeaseMock) import { handleStoryToScriptTask } from '@/lib/workers/handlers/story-to-script' diff --git a/tests/unit/workspace/rebuild-confirm.test.ts b/tests/unit/workspace/rebuild-confirm.test.ts index 3007f9d..243782a 100644 --- a/tests/unit/workspace/rebuild-confirm.test.ts +++ b/tests/unit/workspace/rebuild-confirm.test.ts @@ -82,6 +82,32 @@ describe('useRebuildConfirm', () => { expect(action).toHaveBeenCalledTimes(1) }) + + it('story to script without downstream confirm clears pending action after action completes', async () => { + const getProjectStoryboardStats = vi.fn(async () => ({ storyboardCount: 0, panelCount: 0 })) + const action = vi.fn(async () => undefined) + + const hook = useRebuildConfirm({ + episodeId: 'episode-1', + episodeStoryboards: [], + getProjectStoryboardStats, + t: (key: string) => key, + }) + + await hook.runWithRebuildConfirm('storyToScript', action) + + expect(action).toHaveBeenCalledTimes(1) + expect(setPendingActionTypeMock).toHaveBeenCalledTimes(2) + expect(setPendingActionTypeMock).toHaveBeenNthCalledWith(1, 'storyToScript') + + const resetCall = setPendingActionTypeMock.mock.calls[1]?.[0] + expect(typeof resetCall).toBe('function') + if (typeof resetCall !== 'function') { + throw new Error('expected reset pending action updater') + } + expect(resetCall('storyToScript')).toBeNull() + expect(resetCall('scriptToStoryboard')).toBe('scriptToStoryboard') + }) }) describe('hasDownstreamStoryboardData', () => {