From c4e7a3b6f55fd09e71ccfb08fff4b2cb3058d268 Mon Sep 17 00:00:00 2001 From: cfngc4594 Date: Wed, 13 May 2026 15:10:06 +0800 Subject: [PATCH] feat(judge): refactor submission pipeline to async processing --- .env.example | 17 + Dockerfile | 7 +- bun.lock | 485 ++++++- compose.cn.yml | 100 +- compose.local.cn.yml | 100 +- compose.local.yml | 100 +- compose.yml | 100 +- init.sql | 1 + messages/en.json | 23 + messages/zh.json | 23 + package.json | 3 + .../migration.sql | 69 + prisma/schema.prisma | 84 +- prisma/seed.ts | 1263 ++++++++++++++++- src/app/(app)/problems/[problemId]/page.tsx | 2 + .../dashboard/actions/teacher-dashboard.ts | 18 +- src/app/actions/analyze-code.ts | 9 + src/app/actions/compile.ts | 45 +- src/app/actions/judge.ts | 139 +- src/app/actions/run.ts | 257 ---- src/app/api/inngest/route.ts | 8 + .../problems/analysis/components/card.tsx | 46 +- .../analysis/components/radar-chart.tsx | 4 +- .../problems/components/judge-button.tsx | 12 +- .../problems/detail/components/form.tsx | 146 +- .../problems/detail/components/table.tsx | 10 +- .../components/realtime-listener.tsx | 36 + .../problems/ui/views/problem-view.tsx | 2 + src/inngest/client.ts | 5 + src/inngest/functions/process-submission.ts | 254 ++++ src/lib/ai.ts | 20 +- src/lib/judge-runtime.ts | 211 +++ src/lib/judge-trace.ts | 101 ++ src/lib/soketi-client.ts | 25 + src/lib/soketi-server.ts | 22 + src/lib/submission-status.ts | 70 + 36 files changed, 3272 insertions(+), 545 deletions(-) create mode 100644 init.sql create mode 100644 prisma/migrations/20260513070830_refactor_judge/migration.sql delete mode 100644 src/app/actions/run.ts create mode 100644 src/app/api/inngest/route.ts create mode 100644 src/features/problems/submission/components/realtime-listener.tsx create mode 100644 src/inngest/client.ts create mode 100644 src/inngest/functions/process-submission.ts create mode 100644 src/lib/judge-runtime.ts create mode 100644 src/lib/judge-trace.ts create mode 100644 src/lib/soketi-client.ts create mode 100644 src/lib/soketi-server.ts create mode 100644 src/lib/submission-status.ts diff --git a/.env.example b/.env.example index 13c1d72..b9593e8 100644 --- a/.env.example +++ b/.env.example @@ -24,6 +24,23 @@ AI_API_KEY="your_ai_api_key" AI_BASE_URL="your_ai_base_url_if_custom" AI_MODEL="your_ai_model_id" +# Soketi / Pusher-compatible realtime config +SOKETI_DEFAULT_APP_ID="judge4c" +NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY="your_soketi_app_key" +SOKETI_DEFAULT_APP_SECRET="your_soketi_app_secret" +SOKETI_HOST="localhost" +SOKETI_PORT="6001" +SOKETI_USE_TLS="false" +NEXT_PUBLIC_SOKETI_HOST="localhost" +NEXT_PUBLIC_SOKETI_PORT="6001" +NEXT_PUBLIC_SOKETI_USE_TLS="false" + +# Inngest config +INNGEST_EVENT_KEY="your_inngest_event_key" # Must be a hexadecimal string: openssl rand -hex 32 +INNGEST_SIGNING_KEY="your_inngest_signing_key" # Must be a hexadecimal string: openssl rand -hex 32 +INNGEST_POSTGRES_URI="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/inngest" +INNGEST_REDIS_URI="redis://redis:6379" + # Docker Remote Access Configuration DOCKER_HOST_MODE="remote_or_blank" DOCKER_REMOTE_PROTOCOL="http_or_https_or_ssh" diff --git a/Dockerfile b/Dockerfile index cbf60a8..ccd94eb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,12 +2,11 @@ # Upgrade to Node.js v20 or higher to resolve the `ReferenceError: File is not defined` issue # Reference: https://github.com/vercel/next.js/discussions/56032 -FROM node:22-alpine AS base +FROM node:22-bookworm-slim AS base +RUN apt-get update && apt-get install -y --no-install-recommends openssl ca-certificates && rm -rf /var/lib/apt/lists/* # Install dependencies only when needed FROM base AS deps -# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. -RUN apk add --no-cache libc6-compat WORKDIR /app # Copy the prisma folder before installing dependencies @@ -48,7 +47,7 @@ FROM base AS runner WORKDIR /app # Install curl tool to ensure the health check works correctly -RUN apk add --no-cache curl +RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/* ENV NODE_ENV=production # Uncomment the following line in case you want to disable telemetry during runtime. diff --git a/bun.lock b/bun.lock index bc6107f..c6dc27c 100644 --- a/bun.lock +++ b/bun.lock @@ -52,6 +52,7 @@ "flexlayout-react": "^0.7.15", "framer-motion": "^12.7.3", "github-markdown-css": "^5.8.1", + "inngest": "3.40.1", "input-otp": "^1.4.2", "lucide-react": "^0.515.0", "monaco-editor": "<=0.36.1", @@ -63,6 +64,8 @@ "next-themes": "^0.4.6", "normalize-url": "^8.0.1", "pino": "^9.6.0", + "pusher": "5.2.0", + "pusher-js": "8.4.0", "react": "^19.0.0", "react-day-picker": "^9.7.0", "react-dom": "^19.0.0", @@ -134,6 +137,8 @@ "@balena/dockerignore": ["@balena/dockerignore@1.0.2", "https://registry.npmmirror.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz", {}, "sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q=="], + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.12.0", "", {}, "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA=="], + "@date-fns/tz": ["@date-fns/tz@1.2.0", "https://registry.npmmirror.com/@date-fns/tz/-/tz-1.2.0.tgz", {}, "sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg=="], "@emnapi/core": ["@emnapi/core@1.4.3", "https://registry.npmmirror.com/@emnapi/core/-/core-1.4.3.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], @@ -282,8 +287,12 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + "@inngest/ai": ["@inngest/ai@0.1.7", "", { "dependencies": { "@types/node": "^22.10.5", "typescript": "^5.7.3" } }, "sha512-5xWatW441jacGf9czKEZdgAmkvoy7GS2tp7X8GSbdGeRXzjisHR6vM+q8DQbv6rqRsmQoCQ5iShh34MguELvUQ=="], + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + "@jpwilliams/waitgroup": ["@jpwilliams/waitgroup@2.1.1", "", {}, "sha512-0CxRhNfkvFCTLZBKGvKxY2FYtYW1yWhO2McLqBL0X5UWvYjIf9suH8anKW/DNutl369A75Ewyoh2iJMwBZ2tRg=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -338,6 +347,156 @@ "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "https://registry.npmmirror.com/@opentelemetry/api/-/api-1.9.0.tgz", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + + "@opentelemetry/auto-instrumentations-node": ["@opentelemetry/auto-instrumentations-node@0.56.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/instrumentation-amqplib": "^0.46.1", "@opentelemetry/instrumentation-aws-lambda": "^0.50.3", "@opentelemetry/instrumentation-aws-sdk": "^0.49.1", "@opentelemetry/instrumentation-bunyan": "^0.45.1", "@opentelemetry/instrumentation-cassandra-driver": "^0.45.1", "@opentelemetry/instrumentation-connect": "^0.43.1", "@opentelemetry/instrumentation-cucumber": "^0.14.1", "@opentelemetry/instrumentation-dataloader": "^0.16.1", "@opentelemetry/instrumentation-dns": "^0.43.1", "@opentelemetry/instrumentation-express": "^0.47.1", "@opentelemetry/instrumentation-fastify": "^0.44.2", "@opentelemetry/instrumentation-fs": "^0.19.1", "@opentelemetry/instrumentation-generic-pool": "^0.43.1", "@opentelemetry/instrumentation-graphql": "^0.47.1", "@opentelemetry/instrumentation-grpc": "^0.57.1", "@opentelemetry/instrumentation-hapi": "^0.45.2", "@opentelemetry/instrumentation-http": "^0.57.1", "@opentelemetry/instrumentation-ioredis": "^0.47.1", "@opentelemetry/instrumentation-kafkajs": "^0.7.1", "@opentelemetry/instrumentation-knex": "^0.44.1", "@opentelemetry/instrumentation-koa": "^0.47.1", "@opentelemetry/instrumentation-lru-memoizer": "^0.44.1", "@opentelemetry/instrumentation-memcached": "^0.43.1", "@opentelemetry/instrumentation-mongodb": "^0.52.0", "@opentelemetry/instrumentation-mongoose": "^0.46.1", "@opentelemetry/instrumentation-mysql": "^0.45.1", "@opentelemetry/instrumentation-mysql2": "^0.45.2", "@opentelemetry/instrumentation-nestjs-core": "^0.44.1", "@opentelemetry/instrumentation-net": "^0.43.1", "@opentelemetry/instrumentation-pg": "^0.51.1", "@opentelemetry/instrumentation-pino": "^0.46.1", "@opentelemetry/instrumentation-redis": "^0.46.1", "@opentelemetry/instrumentation-redis-4": "^0.46.1", "@opentelemetry/instrumentation-restify": "^0.45.1", "@opentelemetry/instrumentation-router": "^0.44.1", "@opentelemetry/instrumentation-socket.io": "^0.46.1", "@opentelemetry/instrumentation-tedious": "^0.18.1", "@opentelemetry/instrumentation-undici": "^0.10.1", "@opentelemetry/instrumentation-winston": "^0.44.1", "@opentelemetry/resource-detector-alibaba-cloud": "^0.30.1", "@opentelemetry/resource-detector-aws": "^1.12.0", "@opentelemetry/resource-detector-azure": "^0.6.1", "@opentelemetry/resource-detector-container": "^0.6.1", "@opentelemetry/resource-detector-gcp": "^0.33.1", "@opentelemetry/resources": "^1.24.0", "@opentelemetry/sdk-node": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.4.1" } }, "sha512-4cK0+unfkXRRbQQg2r9K3ki8JlE0j9Iw8+4DZEkChShAnmviiE+/JMgHGvK+VVcLrSlgV6BBHv4+ZTLukQwhkA=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="], + + "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], + + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/sdk-logs": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-eovEy10n3umjKJl2Ey6TLzikPE+W4cUQ4gCwgGP1RqzTGtgDra0WjIqdy29ohiUKfvmbiL3MndZww58xfIvyFw=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/sdk-logs": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-0rygmvLcehBRp56NQVLSleJ5ITTduq/QfU7obOkyWgPpFHulwpw2LYTqNIz5TczKZuy5YY+5D3SDnXZL1tXImg=="], + + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-logs": "0.57.2", "@opentelemetry/sdk-trace-base": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ta0ithCin0F8lu9eOf4lEz9YAScecezCHkMMyDkvd9S7AnZNX5ikUmC5EQOQADU+oCcgo/qkQIaKcZvQ0TYKDw=="], + + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-metrics": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-r70B8yKR41F0EC443b5CGB4rUaOMm99I5N75QQt6sHKxYDzSEc6gm48Diz1CI1biwa5tDPznpylTrywO/pT7qw=="], + + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-metrics": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ttb9+4iKw04IMubjm3t0EZsYRNWr3kg44uUuzfo9CaccYlOh8cDooe4QObDUkvx9d5qQUrbEckhrWKfJnKhemA=="], + + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-metrics": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-HX068Q2eNs38uf7RIkNN9Hl4Ynl+3lP0++KELkXMCpsCbFO03+0XNNZ1SkwxPlP9jrhQahsMPMkzNXpq3fKsnw=="], + + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-metrics": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-VqIqXnuxWMWE/1NatAGtB1PvsQipwxDcdG4RwA/umdBcW3/iOHp0uejvFHTRN2O78ZPged87ErJajyUBPUhlDQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-grpc-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-gHU1vA3JnHbNxEXg5iysqCWxN9j83d7/epTYBZflqQnTyCC4N7yZXn/dMM+bEmyhQPGjhCkNZLx4vZuChH1PYw=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-sB/gkSYFu+0w2dVQ0PWY9fAMl172PKMZ/JrHkkW8dmjCL0CYkmXeE+ssqIL/yBUTPOvpLIpenX5T9RwXRBW/3g=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-awDdNRMIwDvUtoRYxRhja5QYH6+McBLtoz1q9BeEsskhZcrGmH/V1fWpGx8n+Rc+542e8pJA6y+aullbIzQmlw=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + + "@opentelemetry/instrumentation-amqplib": ["@opentelemetry/instrumentation-amqplib@0.46.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ=="], + + "@opentelemetry/instrumentation-aws-lambda": ["@opentelemetry/instrumentation-aws-lambda@0.50.3", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/aws-lambda": "8.10.147" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-kotm/mRvSWUauudxcylc5YCDei+G/r+jnOH6q5S99aPLQ/Ms8D2yonMIxEJUILIPlthEmwLYxkw3ualWzMjm/A=="], + + "@opentelemetry/instrumentation-aws-sdk": ["@opentelemetry/instrumentation-aws-sdk@0.49.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/propagation-utils": "^0.30.16", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Vbj4BYeV/1K4Pbbfk+gQ8gwYL0w+tBeUwG88cOxnF7CLPO1XnskGV8Q3Gzut2Ah/6Dg17dBtlzEqL3UiFP2Z6A=="], + + "@opentelemetry/instrumentation-bunyan": ["@opentelemetry/instrumentation-bunyan@0.45.1", "", { "dependencies": { "@opentelemetry/api-logs": "^0.57.1", "@opentelemetry/instrumentation": "^0.57.1", "@types/bunyan": "1.8.11" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-T9POV9ccS41UjpsjLrJ4i0m8LfplBiN3dMeH9XZ2btiDrjoaWtDrst6tNb1avetBjkeshOuBp1EWKP22EVSr0g=="], + + "@opentelemetry/instrumentation-cassandra-driver": ["@opentelemetry/instrumentation-cassandra-driver@0.45.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-RqnP0rK2hcKK1AKcmYvedLiL6G5TvFGiSUt2vI9wN0cCBdTt9Y9+wxxY19KoGxq7e9T/aHow6P5SUhCVI1sHvQ=="], + + "@opentelemetry/instrumentation-connect": ["@opentelemetry/instrumentation-connect@0.43.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/connect": "3.4.38" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw=="], + + "@opentelemetry/instrumentation-cucumber": ["@opentelemetry/instrumentation-cucumber@0.14.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-ybO+tmH85pDO0ywTskmrMtZcccKyQr7Eb7wHy1keR2HFfx46SzZbjHo1AuGAX//Hook3gjM7+w211gJ2bwKe1Q=="], + + "@opentelemetry/instrumentation-dataloader": ["@opentelemetry/instrumentation-dataloader@0.16.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ=="], + + "@opentelemetry/instrumentation-dns": ["@opentelemetry/instrumentation-dns@0.43.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-e/tMZYU1nc+k+J3259CQtqVZIPsPRSLNoAQbGEmSKrjLEY/KJSbpBZ17lu4dFVBzqoF1cZYIZxn9WPQxy4V9ng=="], + + "@opentelemetry/instrumentation-express": ["@opentelemetry/instrumentation-express@0.47.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw=="], + + "@opentelemetry/instrumentation-fastify": ["@opentelemetry/instrumentation-fastify@0.44.2", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-arSp97Y4D2NWogoXRb8CzFK3W2ooVdvqRRtQDljFt9uC3zI6OuShgey6CVFC0JxT1iGjkAr1r4PDz23mWrFULQ=="], + + "@opentelemetry/instrumentation-fs": ["@opentelemetry/instrumentation-fs@0.19.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A=="], + + "@opentelemetry/instrumentation-generic-pool": ["@opentelemetry/instrumentation-generic-pool@0.43.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww=="], + + "@opentelemetry/instrumentation-graphql": ["@opentelemetry/instrumentation-graphql@0.47.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ=="], + + "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.57.2", "", { "dependencies": { "@opentelemetry/instrumentation": "0.57.2", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TR6YQA67cLSZzdxbf2SrbADJy2Y8eBW1+9mF15P0VK2MYcpdoUSmQTF1oMkBwa3B9NwqDFA2fq7wYTTutFQqaQ=="], + + "@opentelemetry/instrumentation-hapi": ["@opentelemetry/instrumentation-hapi@0.45.2", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ=="], + + "@opentelemetry/instrumentation-http": ["@opentelemetry/instrumentation-http@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/instrumentation": "0.57.2", "@opentelemetry/semantic-conventions": "1.28.0", "forwarded-parse": "2.1.2", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg=="], + + "@opentelemetry/instrumentation-ioredis": ["@opentelemetry/instrumentation-ioredis@0.47.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA=="], + + "@opentelemetry/instrumentation-kafkajs": ["@opentelemetry/instrumentation-kafkajs@0.7.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ=="], + + "@opentelemetry/instrumentation-knex": ["@opentelemetry/instrumentation-knex@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ=="], + + "@opentelemetry/instrumentation-koa": ["@opentelemetry/instrumentation-koa@0.47.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A=="], + + "@opentelemetry/instrumentation-lru-memoizer": ["@opentelemetry/instrumentation-lru-memoizer@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg=="], + + "@opentelemetry/instrumentation-memcached": ["@opentelemetry/instrumentation-memcached@0.43.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/memcached": "^2.2.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-rK5YWC22gmsLp2aEbaPk5F+9r6BFFZuc9GTnW/ErrWpz2XNHUgeFInoPDg4t+Trs8OttIfn8XwkfFkSKqhxanw=="], + + "@opentelemetry/instrumentation-mongodb": ["@opentelemetry/instrumentation-mongodb@0.52.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g=="], + + "@opentelemetry/instrumentation-mongoose": ["@opentelemetry/instrumentation-mongoose@0.46.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg=="], + + "@opentelemetry/instrumentation-mysql": ["@opentelemetry/instrumentation-mysql@0.45.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/mysql": "2.15.26" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg=="], + + "@opentelemetry/instrumentation-mysql2": ["@opentelemetry/instrumentation-mysql2@0.45.2", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.40.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ=="], + + "@opentelemetry/instrumentation-nestjs-core": ["@opentelemetry/instrumentation-nestjs-core@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-4TXaqJK27QXoMqrt4+hcQ6rKFd8B6V4JfrTJKnqBmWR1cbaqd/uwyl9yxhNH1JEkyo8GaBfdpBC4ZE4FuUhPmg=="], + + "@opentelemetry/instrumentation-net": ["@opentelemetry/instrumentation-net@0.43.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-TaMqP6tVx9/SxlY81dHlSyP5bWJIKq+K7vKfk4naB/LX4LBePPY3++1s0edpzH+RfwN+tEGVW9zTb9ci0up/lQ=="], + + "@opentelemetry/instrumentation-pg": ["@opentelemetry/instrumentation-pg@0.51.1", "", { "dependencies": { "@opentelemetry/core": "^1.26.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@opentelemetry/sql-common": "^0.40.1", "@types/pg": "8.6.1", "@types/pg-pool": "2.0.6" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q=="], + + "@opentelemetry/instrumentation-pino": ["@opentelemetry/instrumentation-pino@0.46.1", "", { "dependencies": { "@opentelemetry/api-logs": "^0.57.1", "@opentelemetry/core": "^1.25.0", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-HB8gD/9CNAKlTV+mdZehnFC4tLUtQ7e+729oGq88e4WipxzZxmMYuRwZ2vzOA9/APtq+MRkERJ9PcoDqSIjZ+g=="], + + "@opentelemetry/instrumentation-redis": ["@opentelemetry/instrumentation-redis@0.46.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-AN7OvlGlXmlvsgbLHs6dS1bggp6Fcki+GxgYZdSrb/DB692TyfjR7sVILaCe0crnP66aJuXsg9cge3hptHs9UA=="], + + "@opentelemetry/instrumentation-redis-4": ["@opentelemetry/instrumentation-redis-4@0.46.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/redis-common": "^0.36.2", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ=="], + + "@opentelemetry/instrumentation-restify": ["@opentelemetry/instrumentation-restify@0.45.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Zd6Go9iEa+0zcoA2vDka9r/plYKaT3BhD3ESIy4JNIzFWXeQBGbH3zZxQIsz0jbNTMEtonlymU7eTLeaGWiApA=="], + + "@opentelemetry/instrumentation-router": ["@opentelemetry/instrumentation-router@0.44.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-l4T/S7ByjpY5TCUPeDe1GPns02/5BpR0jroSMexyH3ZnXJt9PtYqx1IKAlOjaFEGEOQF2tGDsMi4PY5l+fSniQ=="], + + "@opentelemetry/instrumentation-socket.io": ["@opentelemetry/instrumentation-socket.io@0.46.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-9AsCVUAHOqvfe2RM/2I0DsDnx2ihw1d5jIN4+Bly1YPFTJIbk4+bXjAkr9+X6PUfhiV5urQHZkiYYPU1Q4yzPA=="], + + "@opentelemetry/instrumentation-tedious": ["@opentelemetry/instrumentation-tedious@0.18.1", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.57.1", "@opentelemetry/semantic-conventions": "^1.27.0", "@types/tedious": "^4.0.14" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg=="], + + "@opentelemetry/instrumentation-undici": ["@opentelemetry/instrumentation-undici@0.10.1", "", { "dependencies": { "@opentelemetry/core": "^1.8.0", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.7.0" } }, "sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ=="], + + "@opentelemetry/instrumentation-winston": ["@opentelemetry/instrumentation-winston@0.44.1", "", { "dependencies": { "@opentelemetry/api-logs": "^0.57.1", "@opentelemetry/instrumentation": "^0.57.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-iexblTsT3fP0hHUz/M1mWr+Ylg3bsYN2En/jvKXZtboW3Qkvt17HrQJYTF9leVIkXAfN97QxAcTE99YGbQW7vQ=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.57.2", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-transformer": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-XdxEzL23Urhidyebg5E6jZoaiW5ygP/mRjxLHixogbqwDy2Faduzb5N0o/Oi+XTIJu+iyxXdVORjXax+Qgfxag=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.57.2", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/otlp-exporter-base": "0.57.2", "@opentelemetry/otlp-transformer": "0.57.2" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-USn173KTWy0saqqRB5yU9xUZ2xdgb1Rdu5IosJnm9aV4hMTuFFRTUsQxbgc24QxpCHeoKzzCSnS/JzdV0oM2iQ=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-logs": "0.57.2", "@opentelemetry/sdk-metrics": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-48IIRj49gbQVK52jYsw70+Jv+JbahT8BqT2Th7C4H7RCM9d0gZ5sgNPoMpWldmfjvIsSgiGJtjfk9MeZvjhoig=="], + + "@opentelemetry/propagation-utils": ["@opentelemetry/propagation-utils@0.30.16", "", { "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg=="], + + "@opentelemetry/redis-common": ["@opentelemetry/redis-common@0.36.2", "", {}, "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g=="], + + "@opentelemetry/resource-detector-alibaba-cloud": ["@opentelemetry/resource-detector-alibaba-cloud@0.30.1", "", { "dependencies": { "@opentelemetry/core": "^1.26.0", "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-9l0FVP3F4+Z6ax27vMzkmhZdNtxAbDqEfy7rduzya3xFLaRiJSvOpw6cru6Edl5LwO+WvgNui+VzHa9ViE8wCg=="], + + "@opentelemetry/resource-detector-aws": ["@opentelemetry/resource-detector-aws@1.12.0", "", { "dependencies": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q=="], + + "@opentelemetry/resource-detector-azure": ["@opentelemetry/resource-detector-azure@0.6.1", "", { "dependencies": { "@opentelemetry/core": "^1.25.1", "@opentelemetry/resources": "^1.10.1", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-Djr31QCExVfWViaf9cGJnH+bUInD72p0GEfgDGgjCAztyvyji6WJvKjs6qmkpPN+Ig6KLk0ho2VgzT5Kdl4L2Q=="], + + "@opentelemetry/resource-detector-container": ["@opentelemetry/resource-detector-container@0.6.1", "", { "dependencies": { "@opentelemetry/core": "^1.26.0", "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-o4sLzx149DQXDmVa8pgjBDEEKOj9SuQnkSLbjUVOpQNnn10v0WNR6wLwh30mFsK26xOJ6SpqZBGKZiT7i5MjlA=="], + + "@opentelemetry/resource-detector-gcp": ["@opentelemetry/resource-detector-gcp@0.33.1", "", { "dependencies": { "@opentelemetry/core": "^1.0.0", "@opentelemetry/resources": "^1.10.0", "@opentelemetry/semantic-conventions": "^1.27.0", "gcp-metadata": "^6.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-/aZJXI1rU6Eus04ih2vU0hxXAibXXMzH1WlDZ8bXcTJmhwmTY8cP392+6l7cWeMnTQOibBUz8UKV3nhcCBAefw=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-TXFHJ5c+BKggWbdEQ/inpgIzEmS2BGQowLE9UhsMd7YYlUfBQJ4uax0VF/B5NYigdM/75OoJGhAV3upEhK+3gg=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-q9zcZ0Okl8jRgmy7eNW3Ku1XSgg3sDLa5evHZpCwjspw7E8Is4K/haRPDJrBcX3YSn/Y7gUvFnByNYEKQNbNog=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@opentelemetry/core": "1.30.1", "@opentelemetry/exporter-logs-otlp-grpc": "0.57.2", "@opentelemetry/exporter-logs-otlp-http": "0.57.2", "@opentelemetry/exporter-logs-otlp-proto": "0.57.2", "@opentelemetry/exporter-metrics-otlp-grpc": "0.57.2", "@opentelemetry/exporter-metrics-otlp-http": "0.57.2", "@opentelemetry/exporter-metrics-otlp-proto": "0.57.2", "@opentelemetry/exporter-prometheus": "0.57.2", "@opentelemetry/exporter-trace-otlp-grpc": "0.57.2", "@opentelemetry/exporter-trace-otlp-http": "0.57.2", "@opentelemetry/exporter-trace-otlp-proto": "0.57.2", "@opentelemetry/exporter-zipkin": "1.30.1", "@opentelemetry/instrumentation": "0.57.2", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-logs": "0.57.2", "@opentelemetry/sdk-metrics": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/sdk-trace-node": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-8BaeqZyN5sTuPBtAoY+UtKwXBdqyuRKmekN5bFzAO40CgbGzAxfTpiL3PBerT7rhZ7p2nBdq7FaMv/tBQgHE4A=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.30.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.30.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/propagator-b3": "1.30.1", "@opentelemetry/propagator-jaeger": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@opentelemetry/sql-common": ["@opentelemetry/sql-common@0.40.1", "", { "dependencies": { "@opentelemetry/core": "^1.1.0" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0" } }, "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg=="], + "@panva/hkdf": ["@panva/hkdf@1.2.1", "https://registry.npmmirror.com/@panva/hkdf/-/hkdf-1.2.1.tgz", {}, "sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], @@ -518,6 +677,12 @@ "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@types/aws-lambda": ["@types/aws-lambda@8.10.147", "", {}, "sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew=="], + + "@types/bunyan": ["@types/bunyan@1.8.11", "", { "dependencies": { "@types/node": "*" } }, "sha512-758fRH7umIMk5qt5ELmRMff4mLDlN+xyYzC+dkPTdKwbSkJFvz6xwyScrytPU0QIBbRRwbiE8/BIg8bpajerNQ=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + "@types/d3-array": ["@types/d3-array@3.2.1", "https://registry.npmmirror.com/@types/d3-array/-/d3-array-3.2.1.tgz", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="], "@types/d3-color": ["@types/d3-color@3.1.3", "https://registry.npmmirror.com/@types/d3-color/-/d3-color-3.1.3.tgz", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], @@ -560,18 +725,32 @@ "@types/mdx": ["@types/mdx@2.0.13", "https://registry.npmmirror.com/@types/mdx/-/mdx-2.0.13.tgz", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + "@types/memcached": ["@types/memcached@2.2.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg=="], + "@types/ms": ["@types/ms@2.1.0", "https://registry.npmmirror.com/@types/ms/-/ms-2.1.0.tgz", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/mysql": ["@types/mysql@2.15.26", "", { "dependencies": { "@types/node": "*" } }, "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ=="], + "@types/node": ["@types/node@20.17.46", "https://registry.npmmirror.com/@types/node/-/node-20.17.46.tgz", { "dependencies": { "undici-types": "~6.19.2" } }, "sha512-0PQHLhZPWOxGW4auogW0eOQAuNIlCYvibIpG67ja0TOJ6/sehu+1en7sfceUn+QQtx4Rk3GxbLNwPh0Cav7TWw=="], + "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], + + "@types/pg": ["@types/pg@8.6.1", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w=="], + + "@types/pg-pool": ["@types/pg-pool@2.0.6", "", { "dependencies": { "@types/pg": "*" } }, "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ=="], + "@types/react": ["@types/react@19.1.3", "https://registry.npmmirror.com/@types/react/-/react-19.1.3.tgz", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-dLWQ+Z0CkIvK1J8+wrDPwGxEYFA4RAyHoZPxHVGspYmFVnwGSNT24cGIhFJrtfRnWVuW8X7NO52gCXmhkVUWGQ=="], "@types/react-dom": ["@types/react-dom@19.1.4", "https://registry.npmmirror.com/@types/react-dom/-/react-dom-19.1.4.tgz", { "peerDependencies": { "@types/react": "^19.0.0" } }, "sha512-WxYAszDYgsMV31OVyoG4jbAgJI1Gw0Xq9V19zwhy6+hUUJlJIdZ3r/cbdmTqFv++SktQkZ/X+46yGFxp5XJBEg=="], + "@types/shimmer": ["@types/shimmer@1.2.0", "", {}, "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg=="], + "@types/ssh2": ["@types/ssh2@1.15.5", "https://registry.npmmirror.com/@types/ssh2/-/ssh2-1.15.5.tgz", { "dependencies": { "@types/node": "^18.11.18" } }, "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ=="], "@types/tar-stream": ["@types/tar-stream@3.1.3", "https://registry.npmmirror.com/@types/tar-stream/-/tar-stream-3.1.3.tgz", { "dependencies": { "@types/node": "*" } }, "sha512-Zbnx4wpkWBMBSu5CytMbrT5ZpMiF55qgM+EpHzR4yIDu7mv52cej8hTkOc6K+LzpkOAbxwn/m7j3iO+/l42YkQ=="], + "@types/tedious": ["@types/tedious@4.0.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw=="], + "@types/unist": ["@types/unist@3.0.3", "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], "@types/vscode": ["@types/vscode@1.100.0", "https://registry.npmmirror.com/@types/vscode/-/vscode-1.100.0.tgz", {}, "sha512-4uNyvzHoraXEeCamR3+fzcBlh7Afs4Ifjs4epINyUX/jvdk0uzLnwiDY35UKDKnkCHP5Nu3dljl2H8lR6s+rQw=="], @@ -628,17 +807,23 @@ "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.7.2", "https://registry.npmmirror.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", { "os": "win32", "cpu": "x64" }, "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA=="], + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + "accepts": ["accepts@2.0.0", "https://registry.npmmirror.com/accepts/-/accepts-2.0.0.tgz", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "acorn": ["acorn@8.14.1", "https://registry.npmmirror.com/acorn/-/acorn-8.14.1.tgz", { "bin": { "acorn": "bin/acorn" } }, "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg=="], + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + "acorn-jsx": ["acorn-jsx@5.3.2", "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], + "ai": ["ai@4.3.15", "https://registry.npmmirror.com/ai/-/ai-4.3.15.tgz", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-TYKRzbWg6mx/pmTadlAEIhuQtzfHUV0BbLY72+zkovXwq/9xhcH24IlQmkyBpElK6/4ArS0dHdOOtR1jOPVwtg=="], "ajv": ["ajv@6.12.6", "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], - "ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], "ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -678,6 +863,8 @@ "async-function": ["async-function@1.0.0", "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "atomic-sleep": ["atomic-sleep@1.0.0", "https://registry.npmmirror.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="], "available-typed-arrays": ["available-typed-arrays@1.0.7", "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], @@ -700,6 +887,8 @@ "bcryptjs": ["bcryptjs@3.0.2", "https://registry.npmmirror.com/bcryptjs/-/bcryptjs-3.0.2.tgz", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog=="], + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + "binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "bl": ["bl@4.1.0", "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], @@ -730,6 +919,8 @@ "caniuse-lite": ["caniuse-lite@1.0.30001717", "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001717.tgz", {}, "sha512-auPpttCq6BDEG8ZAuHJIplGw6GODhjw+/11e7IjpnYCxZcW/ONgPs0KVBJ0d1bY3e2+7PRe5RCLyP+PfwVgkYw=="], + "canonicalize": ["canonicalize@1.0.8", "", {}, "sha512-0CNTVCLZggSh7bc5VkX5WWPWO+cyZbNd07IHIsSXLia/eAq+r836hgk+8BKoEh7949Mda87VUOitx5OddVj64A=="], + "ccount": ["ccount@2.0.1", "https://registry.npmmirror.com/ccount/-/ccount-2.0.1.tgz", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], "chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -746,6 +937,8 @@ "chownr": ["chownr@1.1.4", "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + "class-variance-authority": ["class-variance-authority@0.7.1", "https://registry.npmmirror.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], "client-only": ["client-only@0.0.1", "https://registry.npmmirror.com/client-only/-/client-only-0.0.1.tgz", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], @@ -768,6 +961,8 @@ "colorette": ["colorette@2.0.20", "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "https://registry.npmmirror.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], "commander": ["commander@4.1.1", "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], @@ -786,6 +981,8 @@ "cpu-features": ["cpu-features@0.0.10", "https://registry.npmmirror.com/cpu-features/-/cpu-features-0.0.10.tgz", { "dependencies": { "buildcheck": "~0.0.6", "nan": "^2.19.0" } }, "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA=="], + "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], + "cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "cssesc": ["cssesc@3.0.0", "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], @@ -842,6 +1039,8 @@ "define-properties": ["define-properties@1.2.1", "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "depd": ["depd@2.0.0", "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], "dequal": ["dequal@2.0.3", "https://registry.npmmirror.com/dequal/-/dequal-2.0.3.tgz", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], @@ -970,6 +1169,8 @@ "etag": ["etag@1.8.1", "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + "eventemitter3": ["eventemitter3@4.0.7", "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], "eventsource": ["eventsource@3.0.7", "https://registry.npmmirror.com/eventsource/-/eventsource-3.0.7.tgz", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], @@ -1022,8 +1223,12 @@ "foreground-child": ["foreground-child@3.3.1", "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + "forwarded": ["forwarded@0.2.0", "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], + "forwarded-parse": ["forwarded-parse@2.1.2", "", {}, "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw=="], + "framer-motion": ["framer-motion@12.11.0", "https://registry.npmmirror.com/framer-motion/-/framer-motion-12.11.0.tgz", { "dependencies": { "motion-dom": "^12.11.0", "motion-utils": "^12.9.4", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-BaBPmkhaC2l0n619Kt1nQaxSdUdyyz5V1Z7EKJ1CcraOTZitgVx0RTbL8lmg2XesaFi6o8MPBIhkWDIvzDpGaQ=="], "fresh": ["fresh@2.0.0", "https://registry.npmmirror.com/fresh/-/fresh-2.0.0.tgz", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], @@ -1038,6 +1243,10 @@ "functions-have-names": ["functions-have-names@1.2.3", "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + "gaxios": ["gaxios@6.7.1", "", { "dependencies": { "extend": "^3.0.2", "https-proxy-agent": "^7.0.1", "is-stream": "^2.0.0", "node-fetch": "^2.6.9", "uuid": "^9.0.1" } }, "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ=="], + + "gcp-metadata": ["gcp-metadata@6.1.1", "", { "dependencies": { "gaxios": "^6.1.1", "google-logging-utils": "^0.0.2", "json-bigint": "^1.0.0" } }, "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A=="], + "get-caller-file": ["get-caller-file@2.0.5", "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], "get-intrinsic": ["get-intrinsic@1.3.0", "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -1062,6 +1271,8 @@ "globalthis": ["globalthis@1.0.4", "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + "google-logging-utils": ["google-logging-utils@0.0.2", "", {}, "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ=="], + "gopd": ["gopd@1.2.0", "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graphemer": ["graphemer@1.4.0", "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], @@ -1078,6 +1289,8 @@ "has-tostringtag": ["has-tostringtag@1.0.2", "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + "hasown": ["hasown@2.0.2", "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "https://registry.npmmirror.com/hast-util-from-dom/-/hast-util-from-dom-5.0.1.tgz", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="], @@ -1114,6 +1327,8 @@ "http-errors": ["http-errors@2.0.0", "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], + "iconv-lite": ["iconv-lite@0.6.3", "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="], "ieee754": ["ieee754@1.2.1", "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], @@ -1122,12 +1337,16 @@ "import-fresh": ["import-fresh@3.3.1", "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + "import-in-the-middle": ["import-in-the-middle@1.15.0", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA=="], + "imurmurhash": ["imurmurhash@0.1.4", "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "inherits": ["inherits@2.0.4", "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], "inline-style-parser": ["inline-style-parser@0.2.4", "https://registry.npmmirror.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], + "inngest": ["inngest@3.40.1", "", { "dependencies": { "@bufbuild/protobuf": "^2.2.3", "@inngest/ai": "^0.1.3", "@jpwilliams/waitgroup": "^2.1.1", "@opentelemetry/api": "^1.9.0", "@opentelemetry/auto-instrumentations-node": "^0.56.1", "@opentelemetry/context-async-hooks": "^1.30.1", "@opentelemetry/exporter-trace-otlp-http": "^0.57.2", "@opentelemetry/instrumentation": "^0.57.2", "@opentelemetry/resources": "^1.30.1", "@opentelemetry/sdk-trace-base": "^1.30.1", "@types/debug": "^4.1.12", "canonicalize": "^1.0.8", "chalk": "^4.1.2", "cross-fetch": "^4.0.0", "debug": "^4.3.4", "hash.js": "^1.1.7", "json-stringify-safe": "^5.0.1", "ms": "^2.1.3", "serialize-error-cjs": "^0.1.3", "strip-ansi": "^5.2.0", "temporal-polyfill": "^0.2.5", "zod": "~3.22.3" }, "peerDependencies": { "@sveltejs/kit": ">=1.27.3", "@vercel/node": ">=2.15.9", "aws-lambda": ">=1.0.7", "express": ">=4.19.2", "fastify": ">=4.21.0", "h3": ">=1.8.1", "hono": ">=4.2.7", "koa": ">=2.14.2", "next": ">=12.0.0", "typescript": ">=4.7.2" }, "optionalPeers": ["@sveltejs/kit", "@vercel/node", "aws-lambda", "express", "fastify", "h3", "hono", "koa", "next", "typescript"] }, "sha512-SC9Ly28i8NI+WymttE8Jk41L9r/wHXWOnlQoy7e7yoQyZI+R2C4S77DpFwzgEaqGT/H8puc1VDli84RoaffXBg=="], + "input-otp": ["input-otp@1.4.2", "https://registry.npmmirror.com/input-otp/-/input-otp-1.4.2.tgz", { "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA=="], "internal-slot": ["internal-slot@1.1.0", "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], @@ -1148,6 +1367,8 @@ "is-async-function": ["is-async-function@2.1.1", "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + "is-base64": ["is-base64@1.1.0", "", { "bin": { "is-base64": "bin/is-base64", "is_base64": "bin/is-base64" } }, "sha512-Nlhg7Z2dVC4/PTvIFkgVVNvPHSO2eR/Yd0XzhGiXCXEvWnptXlXa/clQ8aePPiMuxEGcWfzWbGw2Fe3d+Y3v1g=="], + "is-bigint": ["is-bigint@1.1.0", "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], "is-binary-path": ["is-binary-path@2.1.0", "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], @@ -1194,6 +1415,8 @@ "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + "is-string": ["is-string@1.1.1", "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], "is-symbol": ["is-symbol@1.1.1", "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], @@ -1224,6 +1447,8 @@ "js-yaml": ["js-yaml@4.1.0", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "^9.0.0" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="], + "json-buffer": ["json-buffer@3.0.1", "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], "json-schema": ["json-schema@0.4.0", "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -1232,6 +1457,8 @@ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + "json5": ["json5@1.0.2", "https://registry.npmmirror.com/json5/-/json5-1.0.2.tgz", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], "jsondiffpatch": ["jsondiffpatch@0.6.0", "https://registry.npmmirror.com/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz", { "dependencies": { "@types/diff-match-patch": "^1.0.36", "chalk": "^5.3.0", "diff-match-patch": "^1.0.5" }, "bin": { "jsondiffpatch": "bin/jsondiffpatch.js" } }, "sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ=="], @@ -1394,6 +1621,8 @@ "mime-types": ["mime-types@3.0.1", "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.1.tgz", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + "minimatch": ["minimatch@3.1.2", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "minimist": ["minimist@1.2.8", "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], @@ -1402,6 +1631,8 @@ "mkdirp-classic": ["mkdirp-classic@0.5.3", "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + "monaco-editor": ["monaco-editor@0.36.1", "https://registry.npmmirror.com/monaco-editor/-/monaco-editor-0.36.1.tgz", {}, "sha512-/CaclMHKQ3A6rnzBzOADfwdSJ25BFoFT0Emxsc4zYVyav5SkK9iA6lEtIeuN/oRYbwPgviJT+t3l+sjFa28jYg=="], "monaco-languageclient": ["monaco-languageclient@5.0.1", "https://registry.npmmirror.com/monaco-languageclient/-/monaco-languageclient-5.0.1.tgz", { "dependencies": { "vscode-jsonrpc": "~8.1.0", "vscode-languageclient": "~8.1.0" }, "peerDependencies": { "vscode": "npm:@codingame/monaco-vscode-api@~1.76.6" } }, "sha512-zTEb8PQZpnYiKkJofdIArMikX7CyQ7205copJNWSCMlOK9eEsbCM8TYb+D7f+MNWt7aOBbustQuqhwjsI3ZYgw=="], @@ -1434,6 +1665,8 @@ "next-themes": ["next-themes@0.4.6", "https://registry.npmmirror.com/next-themes/-/next-themes-0.4.6.tgz", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "normalize-path": ["normalize-path@3.0.0", "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], "normalize-url": ["normalize-url@8.0.1", "https://registry.npmmirror.com/normalize-url/-/normalize-url-8.0.1.tgz", {}, "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w=="], @@ -1498,6 +1731,12 @@ "path-to-regexp": ["path-to-regexp@8.2.0", "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-8.2.0.tgz", {}, "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ=="], + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-protocol": ["pg-protocol@1.13.0", "", {}, "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -1534,6 +1773,14 @@ "postcss-value-parser": ["postcss-value-parser@4.2.0", "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + "preact": ["preact@10.24.3", "https://registry.npmmirror.com/preact/-/preact-10.24.3.tgz", {}, "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA=="], "preact-render-to-string": ["preact-render-to-string@6.5.11", "https://registry.npmmirror.com/preact-render-to-string/-/preact-render-to-string-6.5.11.tgz", { "peerDependencies": { "preact": ">=10" } }, "sha512-ubnauqoGczeGISiOh6RjX0/cdaF8v/oDXIjO85XALCQjwQP+SB4RDXXtvZ6yTYSjG+PC1QRP2AhPgCEsM2EvUw=="], @@ -1556,6 +1803,10 @@ "punycode": ["punycode@2.3.1", "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + "pusher": ["pusher@5.2.0", "", { "dependencies": { "@types/node-fetch": "^2.5.7", "abort-controller": "^3.0.0", "is-base64": "^1.1.0", "node-fetch": "^2.6.1", "tweetnacl": "^1.0.0", "tweetnacl-util": "^0.15.0" } }, "sha512-F6LNiZyJsIkoHLz+YurjKZ1HH8V1/cMggn4k97kihjP3uTvm0P4mZzSFeHOWIy+PlJ2VInJBhUFJBYLsFR5cjg=="], + + "pusher-js": ["pusher-js@8.4.0", "", { "dependencies": { "tweetnacl": "^1.0.3" } }, "sha512-wp3HqIIUc1GRyu1XrP6m2dgyE9MoCsXVsWNlohj0rjSkLf+a0jLvEyVubdg58oMk7bhjBWnFClgp8jfAa6Ak4Q=="], + "qs": ["qs@6.14.0", "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], "queue-microtask": ["queue-microtask@1.2.3", "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], @@ -1646,6 +1897,8 @@ "require-directory": ["require-directory@2.1.1", "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], + "resolve": ["resolve@1.22.10", "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], "resolve-from": ["resolve-from@4.0.0", "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -1678,6 +1931,8 @@ "send": ["send@1.2.0", "https://registry.npmmirror.com/send/-/send-1.2.0.tgz", { "dependencies": { "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.0", "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.1" } }, "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw=="], + "serialize-error-cjs": ["serialize-error-cjs@0.1.4", "", {}, "sha512-6a6dNqipzbCPlTFgztfNP2oG+IGcflMe/01zSzGrQcxGMKbIjOemBBD85pH92klWaJavAUWxAh9Z0aU28zxW6A=="], + "serve-static": ["serve-static@2.2.0", "https://registry.npmmirror.com/serve-static/-/serve-static-2.2.0.tgz", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], "server-only": ["server-only@0.0.1", "https://registry.npmmirror.com/server-only/-/server-only-0.0.1.tgz", {}, "sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA=="], @@ -1698,6 +1953,8 @@ "shiki": ["shiki@3.4.0", "https://registry.npmmirror.com/shiki/-/shiki-3.4.0.tgz", { "dependencies": { "@shikijs/core": "3.4.0", "@shikijs/engine-javascript": "3.4.0", "@shikijs/engine-oniguruma": "3.4.0", "@shikijs/langs": "3.4.0", "@shikijs/themes": "3.4.0", "@shikijs/types": "3.4.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-Ni80XHcqhOEXv5mmDAvf5p6PAJqbUc/RzFeaOqk+zP5DLvTPS3j0ckvA+MI87qoxTQ5RGJDVTbdl/ENLSyyAnQ=="], + "shimmer": ["shimmer@1.2.1", "", {}, "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw=="], + "side-channel": ["side-channel@1.1.0", "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], "side-channel-list": ["side-channel-list@1.0.0", "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], @@ -1756,7 +2013,7 @@ "stringify-entities": ["stringify-entities@4.0.4", "https://registry.npmmirror.com/stringify-entities/-/stringify-entities-4.0.4.tgz", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], - "strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "strip-ansi": ["strip-ansi@5.2.0", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA=="], "strip-ansi-cjs": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], @@ -1788,6 +2045,10 @@ "tar-stream": ["tar-stream@3.1.7", "https://registry.npmmirror.com/tar-stream/-/tar-stream-3.1.7.tgz", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], + "temporal-polyfill": ["temporal-polyfill@0.2.5", "", { "dependencies": { "temporal-spec": "^0.2.4" } }, "sha512-ye47xp8Cb0nDguAhrrDS1JT1SzwEV9e26sSsrWzVu+yPZ7LzceEcH0i2gci9jWfOfSCCgM3Qv5nOYShVUUFUXA=="], + + "temporal-spec": ["temporal-spec@0.2.4", "", {}, "sha512-lDMFv4nKQrSjlkHKAlHVqKrBG4DyFfa9F74cmBZ3Iy3ed8yvWnlWSIdi4IKfSqwmazAohBNwiN64qGx4y5Q3IQ=="], + "text-decoder": ["text-decoder@1.2.3", "https://registry.npmmirror.com/text-decoder/-/text-decoder-1.2.3.tgz", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="], "thenify": ["thenify@3.3.1", "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], @@ -1806,6 +2067,8 @@ "toidentifier": ["toidentifier@1.0.1", "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + "trim-lines": ["trim-lines@3.0.1", "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "trough": ["trough@2.2.0", "https://registry.npmmirror.com/trough/-/trough-2.2.0.tgz", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], @@ -1820,7 +2083,9 @@ "tsx": ["tsx@4.19.4", "https://registry.npmmirror.com/tsx/-/tsx-4.19.4.tgz", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-gK5GVzDkJK1SI1zwHf32Mqxf2tSJkNx+eYcNly5+nHvWqXUJYUkWBQtKauoESz3ymezAI++ZwT855x5p5eop+Q=="], - "tweetnacl": ["tweetnacl@0.14.5", "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + "tweetnacl": ["tweetnacl@1.0.3", "", {}, "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw=="], + + "tweetnacl-util": ["tweetnacl-util@0.15.1", "", {}, "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw=="], "type-check": ["type-check@0.4.0", "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], @@ -1910,6 +2175,10 @@ "web-namespaces": ["web-namespaces@2.0.1", "https://registry.npmmirror.com/web-namespaces/-/web-namespaces-2.0.1.tgz", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="], + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + "which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], @@ -1928,6 +2197,8 @@ "wrappy": ["wrappy@1.0.2", "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + "y18n": ["y18n@5.0.8", "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yaml": ["yaml@2.7.1", "https://registry.npmmirror.com/yaml/-/yaml-2.7.1.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="], @@ -1952,6 +2223,8 @@ "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.3.1.tgz", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + "@inngest/ai/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + "@isaacs/cliui/string-width": ["string-width@5.1.2", "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -1962,6 +2235,80 @@ "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], + + "@opentelemetry/instrumentation-amqplib/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-aws-lambda/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-aws-sdk/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-cassandra-driver/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-connect/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-cucumber/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-express/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-fastify/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-hapi/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-ioredis/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-kafkajs/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-knex/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-koa/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-memcached/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-mongodb/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-mongoose/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-mysql/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-mysql2/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-nestjs-core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-net/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-pg/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-redis/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-redis-4/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-restify/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-router/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-socket.io/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/instrumentation-tedious/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="], + + "@opentelemetry/otlp-transformer/protobufjs": ["protobufjs@7.5.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg=="], + + "@opentelemetry/resource-detector-alibaba-cloud/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/resource-detector-aws/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/resource-detector-azure/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/resource-detector-container/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + + "@opentelemetry/resource-detector-gcp/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], + "@radix-ui/react-accordion/@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.10", "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.10.tgz", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-O2mcG3gZNkJ/Ena34HurA3llPOEA/M4dJtIRMa6y/cknRDC8XY5UZBInKTsUwW5cUue9A4k0wi1XU5fKBzKe1w=="], "@radix-ui/react-alert-dialog/@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.13", "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.13.tgz", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.9", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.6", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.8", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-slot": "1.2.2", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA=="], @@ -1984,12 +2331,30 @@ "@radix-ui/react-select/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.2", "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ=="], + "@types/bunyan/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/connect/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/memcached/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/mysql/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/pg/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/pg-pool/@types/pg": ["@types/pg@8.15.6", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ=="], + "@types/ssh2/@types/node": ["@types/node@18.19.100", "https://registry.npmmirror.com/@types/node/-/node-18.19.100.tgz", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-ojmMP8SZBKprc3qGrGk8Ujpo80AXkrP7G2tOT4VWr5jlr5DHjsJF+emXJz+Wm0glmy4Js62oKMdZZ6B9Y+tEcA=="], + "@types/tedious/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "bcrypt-pbkdf/tweetnacl": ["tweetnacl@0.14.5", "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], + "chokidar/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "cliui/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "cmdk/@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.2", "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.2.tgz", { "dependencies": { "@radix-ui/react-slot": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw=="], "dockerode/uuid": ["uuid@10.0.0", "https://registry.npmmirror.com/uuid/-/uuid-10.0.0.tgz", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], @@ -2010,8 +2375,16 @@ "fast-glob/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "gaxios/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + "glob/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "import-in-the-middle/acorn": ["acorn@8.16.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw=="], + + "inngest/zod": ["zod@3.22.5", "", {}, "sha512-HqnGsCdVZ2xc0qWPLdO25WnseXThh0kEYKIdV5F/hTHO75hNZFp8thxSeHhiPrHZKrFTo1SOgkAj9po5bexZlw=="], + "jsondiffpatch/chalk": ["chalk@5.4.1", "https://registry.npmmirror.com/chalk/-/chalk-5.4.1.tgz", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "katex/commander": ["commander@8.3.0", "https://registry.npmmirror.com/commander/-/commander-8.3.0.tgz", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="], @@ -2028,8 +2401,14 @@ "string-width/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "string-width/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "tar-fs/tar-stream": ["tar-stream@2.2.0", "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], "tinyglobby/picomatch": ["picomatch@4.0.2", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.2.tgz", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], @@ -2046,34 +2425,134 @@ "vscode-ws-jsonrpc/vscode-jsonrpc": ["vscode-jsonrpc@8.2.1", "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", {}, "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ=="], + "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "@inngest/ai/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="], + + "@opentelemetry/otlp-transformer/protobufjs/@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@opentelemetry/otlp-transformer/protobufjs/@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@opentelemetry/otlp-transformer/protobufjs/@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@opentelemetry/otlp-transformer/protobufjs/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + "@radix-ui/react-alert-dialog/@radix-ui/react-dialog/@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.9", "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.9.tgz", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ=="], "@radix-ui/react-alert-dialog/@radix-ui/react-dialog/@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.6", "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.6.tgz", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw=="], "@radix-ui/react-alert-dialog/@radix-ui/react-dialog/@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.8", "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.8.tgz", { "dependencies": { "@radix-ui/react-primitive": "2.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg=="], + "@types/bunyan/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/connect/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/memcached/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/mysql/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/pg-pool/@types/pg/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@types/pg/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "@types/ssh2/@types/node/undici-types": ["undici-types@5.26.5", "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + "@types/tedious/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "cmdk/@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.2", "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.2.2.tgz", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ=="], + "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "monaco-languageclient/vscode-languageclient/minimatch": ["minimatch@5.1.6", "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], "monaco-languageclient/vscode-languageclient/vscode-languageserver-protocol": ["vscode-languageserver-protocol@3.17.3", "https://registry.npmmirror.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.3.tgz", { "dependencies": { "vscode-jsonrpc": "8.1.0", "vscode-languageserver-types": "3.17.3" } }, "sha512-924/h0AqsMtA5yK22GgMtCYiMdCOtWTSGgUOkgEDX+wk2b0x4sAfLiO4NxBxqbiVtz7K7/1/RgVrVI0NClZwqA=="], + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "vscode-languageclient/minimatch/brace-expansion": ["brace-expansion@2.0.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.5.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.5.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.5.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs": ["protobufjs@7.5.6", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg=="], + + "@opentelemetry/otlp-transformer/protobufjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@types/pg-pool/@types/pg/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + "monaco-languageclient/vscode-languageclient/minimatch/brace-expansion": ["brace-expansion@2.0.1", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "monaco-languageclient/vscode-languageclient/vscode-languageserver-protocol/vscode-languageserver-types": ["vscode-languageserver-types@3.17.3", "https://registry.npmmirror.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz", {}, "sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/inquire": ["@protobufjs/inquire@1.1.1", "", {}, "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node": ["@types/node@22.19.17", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q=="], + + "@opentelemetry/exporter-logs-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@opentelemetry/exporter-metrics-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "@opentelemetry/otlp-grpc-exporter-base/@grpc/grpc-js/@grpc/proto-loader/protobufjs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], } } diff --git a/compose.cn.yml b/compose.cn.yml index 608b9dd..7ffeefd 100644 --- a/compose.cn.yml +++ b/compose.cn.yml @@ -10,6 +10,12 @@ services: depends_on: postgres: condition: service_healthy + redis: + condition: service_healthy + inngest: + condition: service_healthy + soketi: + condition: service_started lsp-c: condition: service_healthy lsp-cpp: @@ -40,6 +46,18 @@ services: - AI_API_KEY=${AI_API_KEY} - AI_BASE_URL=${AI_BASE_URL} - AI_MODEL=${AI_MODEL} + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_DEV=http://inngest:8288 + - SOKETI_HOST=soketi + - SOKETI_PORT=6001 + - SOKETI_USE_TLS=false + - NEXT_PUBLIC_SOKETI_HOST=localhost + - NEXT_PUBLIC_SOKETI_PORT=6001 + - NEXT_PUBLIC_SOKETI_USE_TLS=false # Remote Docker configuration (activate only for remote Docker): # - DOCKER_HOST_MODE=${DOCKER_HOST_MODE} # Options: "remote" or leave empty for local # - DOCKER_REMOTE_PROTOCOL=${DOCKER_REMOTE_PROTOCOL} # Example: "https" or "http" or "ssh" @@ -90,14 +108,94 @@ services: - POSTGRES_DB=${POSTGRES_DB} ports: - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - judge4c healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ] + test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] interval: 5s timeout: 2s retries: 20 + redis: + image: redis:7-alpine + container_name: redis + restart: always + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - judge4c + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 3s + retries: 5 + + inngest: + image: inngest/inngest + container_name: inngest + restart: always + command: "inngest start -u http://host.docker.internal:3000/api/inngest" + ports: + - "8288:8288" + - "8289:8289" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_POSTGRES_URI=${INNGEST_POSTGRES_URI} + - INNGEST_REDIS_URI=${INNGEST_REDIS_URI} + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + networks: + - judge4c + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8288/health" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + soketi: + image: quay.io/soketi/soketi:latest-16-debian + container_name: soketi + restart: always + ports: + - "6001:6001" + networks: + - judge4c + environment: + - SOKETI_DEBUG=1 + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - SOKETI_ADAPTER_DRIVER=redis + - SOKETI_ADAPTER_REDIS_HOST=redis + - SOKETI_ADAPTER_REDIS_PORT=6379 + - SOKETI_DB_REDIS_HOST=redis + - SOKETI_DB_REDIS_PORT=6379 + depends_on: + redis: + condition: service_healthy + healthcheck: + test: [ "CMD", "node", "-e", "require('http').get('http://localhost:6001/ready', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + networks: judge4c: name: judge4c + +volumes: + postgres_data: + redis_data: diff --git a/compose.local.cn.yml b/compose.local.cn.yml index af8e62c..d0e2656 100644 --- a/compose.local.cn.yml +++ b/compose.local.cn.yml @@ -13,6 +13,12 @@ services: depends_on: postgres: condition: service_healthy + redis: + condition: service_healthy + inngest: + condition: service_healthy + soketi: + condition: service_started lsp-c: condition: service_healthy lsp-cpp: @@ -43,6 +49,18 @@ services: - AI_API_KEY=${AI_API_KEY} - AI_BASE_URL=${AI_BASE_URL} - AI_MODEL=${AI_MODEL} + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_DEV=http://inngest:8288 + - SOKETI_HOST=soketi + - SOKETI_PORT=6001 + - SOKETI_USE_TLS=false + - NEXT_PUBLIC_SOKETI_HOST=localhost + - NEXT_PUBLIC_SOKETI_PORT=6001 + - NEXT_PUBLIC_SOKETI_USE_TLS=false # Remote Docker configuration (activate only for remote Docker): # - DOCKER_HOST_MODE=${DOCKER_HOST_MODE} # Options: "remote" or leave empty for local # - DOCKER_REMOTE_PROTOCOL=${DOCKER_REMOTE_PROTOCOL} # Example: "https" or "http" or "ssh" @@ -99,14 +117,94 @@ services: - POSTGRES_DB=${POSTGRES_DB} ports: - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - judge4c healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ] + test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] interval: 5s timeout: 2s retries: 20 + redis: + image: redis:7-alpine + container_name: redis + restart: always + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - judge4c + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 3s + retries: 5 + + inngest: + image: inngest/inngest + container_name: inngest + restart: always + command: "inngest start -u http://host.docker.internal:3000/api/inngest" + ports: + - "8288:8288" + - "8289:8289" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_POSTGRES_URI=${INNGEST_POSTGRES_URI} + - INNGEST_REDIS_URI=${INNGEST_REDIS_URI} + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + networks: + - judge4c + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8288/health" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + soketi: + image: quay.io/soketi/soketi:latest-16-debian + container_name: soketi + restart: always + ports: + - "6001:6001" + networks: + - judge4c + environment: + - SOKETI_DEBUG=1 + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - SOKETI_ADAPTER_DRIVER=redis + - SOKETI_ADAPTER_REDIS_HOST=redis + - SOKETI_ADAPTER_REDIS_PORT=6379 + - SOKETI_DB_REDIS_HOST=redis + - SOKETI_DB_REDIS_PORT=6379 + depends_on: + redis: + condition: service_healthy + healthcheck: + test: [ "CMD", "node", "-e", "require('http').get('http://localhost:6001/ready', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + networks: judge4c: name: judge4c + +volumes: + postgres_data: + redis_data: diff --git a/compose.local.yml b/compose.local.yml index c99468d..0144250 100644 --- a/compose.local.yml +++ b/compose.local.yml @@ -13,6 +13,12 @@ services: depends_on: postgres: condition: service_healthy + redis: + condition: service_healthy + inngest: + condition: service_healthy + soketi: + condition: service_started lsp-c: condition: service_healthy lsp-cpp: @@ -43,6 +49,18 @@ services: - AI_API_KEY=${AI_API_KEY} - AI_BASE_URL=${AI_BASE_URL} - AI_MODEL=${AI_MODEL} + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_DEV=http://inngest:8288 + - SOKETI_HOST=soketi + - SOKETI_PORT=6001 + - SOKETI_USE_TLS=false + - NEXT_PUBLIC_SOKETI_HOST=localhost + - NEXT_PUBLIC_SOKETI_PORT=6001 + - NEXT_PUBLIC_SOKETI_USE_TLS=false # Remote Docker configuration (activate only for remote Docker): # - DOCKER_HOST_MODE=${DOCKER_HOST_MODE} # Options: "remote" or leave empty for local # - DOCKER_REMOTE_PROTOCOL=${DOCKER_REMOTE_PROTOCOL} # Example: "https" or "http" or "ssh" @@ -99,14 +117,94 @@ services: - POSTGRES_DB=${POSTGRES_DB} ports: - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - judge4c healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ] + test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] interval: 5s timeout: 2s retries: 20 + redis: + image: redis:7-alpine + container_name: redis + restart: always + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - judge4c + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 3s + retries: 5 + + inngest: + image: inngest/inngest + container_name: inngest + restart: always + command: "inngest start -u http://host.docker.internal:3000/api/inngest" + ports: + - "8288:8288" + - "8289:8289" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_POSTGRES_URI=${INNGEST_POSTGRES_URI} + - INNGEST_REDIS_URI=${INNGEST_REDIS_URI} + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + networks: + - judge4c + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8288/health" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + soketi: + image: quay.io/soketi/soketi:latest-16-debian + container_name: soketi + restart: always + ports: + - "6001:6001" + networks: + - judge4c + environment: + - SOKETI_DEBUG=1 + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - SOKETI_ADAPTER_DRIVER=redis + - SOKETI_ADAPTER_REDIS_HOST=redis + - SOKETI_ADAPTER_REDIS_PORT=6379 + - SOKETI_DB_REDIS_HOST=redis + - SOKETI_DB_REDIS_PORT=6379 + depends_on: + redis: + condition: service_healthy + healthcheck: + test: [ "CMD", "node", "-e", "require('http').get('http://localhost:6001/ready', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + networks: judge4c: name: judge4c + +volumes: + postgres_data: + redis_data: diff --git a/compose.yml b/compose.yml index 5dcb2fc..66b0ce2 100644 --- a/compose.yml +++ b/compose.yml @@ -10,6 +10,12 @@ services: depends_on: postgres: condition: service_healthy + redis: + condition: service_healthy + inngest: + condition: service_healthy + soketi: + condition: service_started lsp-c: condition: service_healthy lsp-cpp: @@ -40,6 +46,18 @@ services: - AI_API_KEY=${AI_API_KEY} - AI_BASE_URL=${AI_BASE_URL} - AI_MODEL=${AI_MODEL} + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_DEV=http://inngest:8288 + - SOKETI_HOST=soketi + - SOKETI_PORT=6001 + - SOKETI_USE_TLS=false + - NEXT_PUBLIC_SOKETI_HOST=localhost + - NEXT_PUBLIC_SOKETI_PORT=6001 + - NEXT_PUBLIC_SOKETI_USE_TLS=false # Remote Docker configuration (activate only for remote Docker): # - DOCKER_HOST_MODE=${DOCKER_HOST_MODE} # Options: "remote" or leave empty for local # - DOCKER_REMOTE_PROTOCOL=${DOCKER_REMOTE_PROTOCOL} # Example: "https" or "http" or "ssh" @@ -90,14 +108,94 @@ services: - POSTGRES_DB=${POSTGRES_DB} ports: - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + - ./init.sql:/docker-entrypoint-initdb.d/init.sql networks: - judge4c healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres -d postgres" ] + test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}" ] interval: 5s timeout: 2s retries: 20 + redis: + image: redis:7-alpine + container_name: redis + restart: always + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - judge4c + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 3s + retries: 5 + + inngest: + image: inngest/inngest + container_name: inngest + restart: always + command: "inngest start -u http://host.docker.internal:3000/api/inngest" + ports: + - "8288:8288" + - "8289:8289" + extra_hosts: + - "host.docker.internal:host-gateway" + environment: + - INNGEST_EVENT_KEY=${INNGEST_EVENT_KEY} + - INNGEST_SIGNING_KEY=${INNGEST_SIGNING_KEY} + - INNGEST_POSTGRES_URI=${INNGEST_POSTGRES_URI} + - INNGEST_REDIS_URI=${INNGEST_REDIS_URI} + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + networks: + - judge4c + healthcheck: + test: [ "CMD", "curl", "-f", "http://localhost:8288/health" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + + soketi: + image: quay.io/soketi/soketi:latest-16-debian + container_name: soketi + restart: always + ports: + - "6001:6001" + networks: + - judge4c + environment: + - SOKETI_DEBUG=1 + - SOKETI_DEFAULT_APP_ID=${SOKETI_DEFAULT_APP_ID} + - SOKETI_DEFAULT_APP_KEY=${NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY} + - SOKETI_DEFAULT_APP_SECRET=${SOKETI_DEFAULT_APP_SECRET} + - SOKETI_ADAPTER_DRIVER=redis + - SOKETI_ADAPTER_REDIS_HOST=redis + - SOKETI_ADAPTER_REDIS_PORT=6379 + - SOKETI_DB_REDIS_HOST=redis + - SOKETI_DB_REDIS_PORT=6379 + depends_on: + redis: + condition: service_healthy + healthcheck: + test: [ "CMD", "node", "-e", "require('http').get('http://localhost:6001/ready', (res) => process.exit(res.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))" ] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s + networks: judge4c: name: judge4c + +volumes: + postgres_data: + redis_data: diff --git a/init.sql b/init.sql new file mode 100644 index 0000000..0db7652 --- /dev/null +++ b/init.sql @@ -0,0 +1 @@ +CREATE DATABASE inngest; diff --git a/messages/en.json b/messages/en.json index 1d96bfe..f08696d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -144,6 +144,29 @@ "WA": "Wrong Answer", "SE": "System Error" }, + "AnalysisCard": { + "Title": "Code Analysis", + "CompletedDescription": "Detailed evaluation of your code submission", + "PreparingDescription": "Preparing your detailed evaluation", + "Analyzing": "Analyzing your code...", + "Processing": "Processing your submission", + "ProcessingHint": "This may take a few moments...", + "FailedTitle": "Analysis Failed", + "FailedDescription": "We couldn't analyze your code. Please try again later.", + "UpdateFailed": "Analysis Update Failed", + "UpdateFailedDescription": "Failed to fetch analysis data.", + "OverallScore": "Overall Score", + "Feedback": "Feedback", + "Score": "Score", + "NotAvailable": "N/A", + "Kinds": { + "Overall": "overall", + "Style": "style", + "Readability": "readability", + "Efficiency": "efficiency", + "Correctness": "correctness" + } + }, "SubmissionsTable": { "Index": "Index", "Status": "Status", diff --git a/messages/zh.json b/messages/zh.json index 1797913..861b5cb 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -144,6 +144,29 @@ "WA": "解答错误", "SE": "系统错误" }, + "AnalysisCard": { + "Title": "代码分析", + "CompletedDescription": "你的代码提交详细评估", + "PreparingDescription": "正在准备详细评估结果", + "Analyzing": "正在分析你的代码...", + "Processing": "正在处理本次提交", + "ProcessingHint": "可能需要几秒钟,请稍候...", + "FailedTitle": "分析失败", + "FailedDescription": "暂时无法完成代码分析,请稍后重试。", + "UpdateFailed": "分析状态更新失败", + "UpdateFailedDescription": "获取分析数据失败。", + "OverallScore": "综合评分", + "Feedback": "反馈建议", + "Score": "分数", + "NotAvailable": "暂无", + "Kinds": { + "Overall": "综合", + "Style": "风格", + "Readability": "可读性", + "Efficiency": "效率", + "Correctness": "正确性" + } + }, "SubmissionsTable": { "Index": "序号", "Status": "状态", diff --git a/package.json b/package.json index 599eb7b..18c32de 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "flexlayout-react": "^0.7.15", "framer-motion": "^12.7.3", "github-markdown-css": "^5.8.1", + "inngest": "3.40.1", "input-otp": "^1.4.2", "lucide-react": "^0.515.0", "monaco-editor": "<=0.36.1", @@ -72,6 +73,8 @@ "next-themes": "^0.4.6", "normalize-url": "^8.0.1", "pino": "^9.6.0", + "pusher": "5.2.0", + "pusher-js": "8.4.0", "react": "^19.0.0", "react-day-picker": "^9.7.0", "react-dom": "^19.0.0", diff --git a/prisma/migrations/20260513070830_refactor_judge/migration.sql b/prisma/migrations/20260513070830_refactor_judge/migration.sql new file mode 100644 index 0000000..fe4da10 --- /dev/null +++ b/prisma/migrations/20260513070830_refactor_judge/migration.sql @@ -0,0 +1,69 @@ +/* + Warnings: + + - You are about to drop the `TestcaseResult` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- CreateEnum +CREATE TYPE "JudgeStatus" AS ENUM ('COMPILING', 'COMPILATION_ERROR', 'RUNNING', 'ACCEPTED', 'WRONG_ANSWER', 'TIME_LIMIT_EXCEEDED', 'MEMORY_LIMIT_EXCEEDED', 'RUNTIME_ERROR', 'OUTPUT_LIMIT_EXCEEDED', 'SYSTEM_ERROR'); + +-- CreateEnum +CREATE TYPE "JudgeRunStatus" AS ENUM ('ACCEPTED', 'WRONG_ANSWER', 'TIME_LIMIT_EXCEEDED', 'MEMORY_LIMIT_EXCEEDED', 'RUNTIME_ERROR', 'OUTPUT_LIMIT_EXCEEDED', 'SYSTEM_ERROR'); + +-- DropForeignKey +ALTER TABLE "TestcaseResult" DROP CONSTRAINT "TestcaseResult_submissionId_fkey"; + +-- DropForeignKey +ALTER TABLE "TestcaseResult" DROP CONSTRAINT "TestcaseResult_testcaseId_fkey"; + +-- DropTable +DROP TABLE "TestcaseResult"; + +-- CreateTable +CREATE TABLE "Judge" ( + "id" TEXT NOT NULL, + "submissionId" TEXT NOT NULL, + "status" "JudgeStatus" NOT NULL, + "startTime" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "endTime" TIMESTAMP(3), + "compileOutput" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Judge_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "JudgeRun" ( + "id" TEXT NOT NULL, + "judgeId" TEXT NOT NULL, + "testcaseId" TEXT NOT NULL, + "status" "JudgeRunStatus" NOT NULL, + "timeUsage" INTEGER, + "memoryUsage" INTEGER, + "stdin" TEXT, + "stdout" TEXT, + "stderr" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "JudgeRun_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Judge_submissionId_key" ON "Judge"("submissionId"); + +-- CreateIndex +CREATE INDEX "JudgeRun_judgeId_idx" ON "JudgeRun"("judgeId"); + +-- CreateIndex +CREATE INDEX "JudgeRun_testcaseId_idx" ON "JudgeRun"("testcaseId"); + +-- AddForeignKey +ALTER TABLE "Judge" ADD CONSTRAINT "Judge_submissionId_fkey" FOREIGN KEY ("submissionId") REFERENCES "Submission"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JudgeRun" ADD CONSTRAINT "JudgeRun_judgeId_fkey" FOREIGN KEY ("judgeId") REFERENCES "Judge"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JudgeRun" ADD CONSTRAINT "JudgeRun_testcaseId_fkey" FOREIGN KEY ("testcaseId") REFERENCES "Testcase"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 2e6ff15..185c336 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -50,6 +50,29 @@ enum Status { SE // System Error } +enum JudgeStatus { + COMPILING + COMPILATION_ERROR + RUNNING + ACCEPTED + WRONG_ANSWER + TIME_LIMIT_EXCEEDED + MEMORY_LIMIT_EXCEEDED + RUNTIME_ERROR + OUTPUT_LIMIT_EXCEEDED + SYSTEM_ERROR +} + +enum JudgeRunStatus { + ACCEPTED + WRONG_ANSWER + TIME_LIMIT_EXCEEDED + MEMORY_LIMIT_EXCEEDED + RUNTIME_ERROR + OUTPUT_LIMIT_EXCEEDED + SYSTEM_ERROR +} + enum ProblemContentType { TITLE DESCRIPTION @@ -138,8 +161,8 @@ model Submission { timeUsage Int? memoryUsage Int? - testcaseResults TestcaseResult[] - codeAnalysis CodeAnalysis? + judge Judge? + codeAnalysis CodeAnalysis? userId String problemId String @@ -158,6 +181,42 @@ model Submission { @@index([createdAt]) } +model Judge { + id String @id @default(cuid()) + submissionId String @unique + status JudgeStatus + startTime DateTime @default(now()) + endTime DateTime? + compileOutput String? + + submission Submission @relation(fields: [submissionId], references: [id], onDelete: Cascade) + judgeRuns JudgeRun[] + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model JudgeRun { + id String @id @default(cuid()) + judgeId String + testcaseId String + status JudgeRunStatus + timeUsage Int? + memoryUsage Int? + stdin String? + stdout String? + stderr String? + + judge Judge @relation(fields: [judgeId], references: [id], onDelete: Cascade) + testcase Testcase @relation(fields: [testcaseId], references: [id], onDelete: Cascade) + + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + @@index([judgeId]) + @@index([testcaseId]) +} + model Course { id String @id @default(cuid()) title String @@ -262,8 +321,8 @@ model Testcase { id String @id @default(cuid()) expectedOutput String - inputs TestcaseInput[] - testcaseResults TestcaseResult[] + inputs TestcaseInput[] + judgeRuns JudgeRun[] problemId String @@ -284,23 +343,6 @@ model TestcaseInput { testcase Testcase @relation(fields: [testcaseId], references: [id], onDelete: Cascade) } -model TestcaseResult { - id String @id @default(cuid()) - isCorrect Boolean - output String? - timeUsage Int? - memoryUsage Int? - - submissionId String - testcaseId String - - submission Submission @relation(fields: [submissionId], references: [id], onDelete: Cascade) - testcase Testcase @relation(fields: [testcaseId], references: [id], onDelete: Cascade) - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt -} - model DockerConfig { language Language @id image String diff --git a/prisma/seed.ts b/prisma/seed.ts index 09a7112..2b39798 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -7,7 +7,7 @@ const dockerConfigData: Prisma.DockerConfigCreateInput[] = [ language: "c", image: "gcc", tag: "latest", - workingDir: "/src", + workingDir: "/workspace", compileOutputLimit: 1 * 1024 * 1024, runOutputLimit: 1 * 1024 * 1024, }, @@ -15,7 +15,7 @@ const dockerConfigData: Prisma.DockerConfigCreateInput[] = [ language: "cpp", image: "gcc", tag: "latest", - workingDir: "/src", + workingDir: "/workspace", compileOutputLimit: 1 * 1024 * 1024, runOutputLimit: 1 * 1024 * 1024, }, @@ -1711,25 +1711,1272 @@ int main() { ], }, }, + { + displayId: 1003, + difficulty: "EASY", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Palindrome Number", + }, + { + locale: "zh", + type: "TITLE", + content: "回文数", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `Given an integer \`x\`, return \`true\` if \`x\` is a palindrome, and \`false\` otherwise. + +A palindrome number reads the same backward as forward. + +## Examples + +\`\`\`shell +Input: x = 121 +Output: true +\`\`\` + +\`\`\`shell +Input: x = -121 +Output: false +\`\`\` + +## Constraints + +\`\`\`math +-2^{31} <= x <= 2^{31} - 1 +\`\`\``, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给你一个整数 \`x\`,如果 \`x\` 是回文整数,返回 \`true\`;否则返回 \`false\`。 + +回文数是指正序(从左到右)和倒序(从右到左)读都一样的整数。 + +## 示例 + +\`\`\`shell +输入: x = 121 +输出: true +\`\`\` + +\`\`\`shell +输入: x = -121 +输出: false +\`\`\` + +## 约束 + +\`\`\`math +-2^{31} <= x <= 2^{31} - 1 +\`\`\``, + }, + { + locale: "en", + type: "SOLUTION", + content: `Reverse half of the digits and compare. + +- Negative numbers are never palindromes. +- Numbers ending with 0 are not palindromes unless the number is 0 itself. +- Build a reversed half and compare with the remaining half.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `可以通过“反转一半数字”来判断。 + +- 负数一定不是回文数。 +- 末尾为 0 的数不可能是回文(除非它本身是 0)。 +- 逐步反转后半段,最后与前半段比较即可。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include +#include + +bool isPalindrome(int x) { + return false; +} + +int main() { + char line[256]; + while (fgets(line, sizeof(line), stdin)) { + int x = atoi(line); + printf("%s\\n", isPalindrome(x) ? "true" : "false"); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include + +using namespace std; + +class Solution { +public: + bool isPalindrome(int x) { + return false; + } +}; + +int main() { + string line; + while (getline(cin, line)) { + int x = stoi(line); + Solution sol; + cout << (sol.isPalindrome(x) ? "true" : "false") << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "x", + value: "121", + }, + ], + }, + expectedOutput: "true", + }, + { + inputs: { + create: [ + { + index: 0, + name: "x", + value: "-121", + }, + ], + }, + expectedOutput: "false", + }, + { + inputs: { + create: [ + { + index: 0, + name: "x", + value: "10", + }, + ], + }, + expectedOutput: "false", + }, + { + inputs: { + create: [ + { + index: 0, + name: "x", + value: "0", + }, + ], + }, + expectedOutput: "true", + }, + ], + }, + }, + { + displayId: 1004, + difficulty: "EASY", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Valid Parentheses", + }, + { + locale: "zh", + type: "TITLE", + content: "有效的括号", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `Given a string \`s\` containing just the characters \`()[]{}\`, determine if the input string is valid. + +An input string is valid if: + +1. Open brackets are closed by the same type of brackets. +2. Open brackets are closed in the correct order. +3. Every close bracket has a corresponding open bracket. + +## Example + +\`\`\`shell +Input: s = "()[]{}" +Output: true +\`\`\``, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给定一个只包括 \`()[]{}\` 的字符串 \`s\`,判断字符串是否有效。 + +有效字符串需满足: + +1. 左括号必须用相同类型的右括号闭合。 +2. 左括号必须以正确的顺序闭合。 +3. 每个右括号都能找到对应的左括号。 + +## 示例 + +\`\`\`shell +输入: s = "()[]{}" +输出: true +\`\`\``, + }, + { + locale: "en", + type: "SOLUTION", + content: `Use a stack: + +- Push opening brackets. +- On a closing bracket, check whether the top matches. +- At the end, stack must be empty.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `使用栈来处理: + +- 遇到左括号入栈。 +- 遇到右括号时,检查栈顶是否能匹配。 +- 扫描结束后栈为空才是有效字符串。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include +#include + +bool isValid(char *s) { + return false; +} + +int main() { + char line[4096]; + while (fgets(line, sizeof(line), stdin)) { + line[strcspn(line, "\\n")] = 0; + printf("%s\\n", isValid(line) ? "true" : "false"); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include +#include + +using namespace std; + +class Solution { +public: + bool isValid(string s) { + return false; + } +}; + +int main() { + string s; + while (getline(cin, s)) { + Solution sol; + cout << (sol.isValid(s) ? "true" : "false") << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "()", + }, + ], + }, + expectedOutput: "true", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "()[]{}", + }, + ], + }, + expectedOutput: "true", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "(]", + }, + ], + }, + expectedOutput: "false", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "([)]", + }, + ], + }, + expectedOutput: "false", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "{[]}", + }, + ], + }, + expectedOutput: "true", + }, + ], + }, + }, + { + displayId: 1005, + difficulty: "EASY", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Climbing Stairs", + }, + { + locale: "zh", + type: "TITLE", + content: "爬楼梯", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `You are climbing a staircase. It takes \`n\` steps to reach the top. + +Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top? + +## Example + +\`\`\`shell +Input: n = 3 +Output: 3 +Explanation: [1+1+1], [1+2], [2+1] +\`\`\` + +## Constraints + +\`\`\`math +1 <= n <= 45 +\`\`\``, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `假设你正在爬楼梯。需要 \`n\` 阶你才能到达楼顶。 + +每次你可以爬 1 阶或 2 阶。请问有多少种不同的方法可以爬到楼顶? + +## 示例 + +\`\`\`shell +输入: n = 3 +输出: 3 +解释: [1+1+1], [1+2], [2+1] +\`\`\` + +## 约束 + +\`\`\`math +1 <= n <= 45 +\`\`\``, + }, + { + locale: "en", + type: "SOLUTION", + content: `This is a classic dynamic programming problem: + +- Let \`dp[i]\` be the number of ways to reach step \`i\`. +- Transition: \`dp[i] = dp[i - 1] + dp[i - 2]\`. +- Space can be optimized to two variables.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `这是经典的动态规划问题: + +- 设 \`dp[i]\` 表示到达第 \`i\` 阶的方法数。 +- 状态转移为 \`dp[i] = dp[i - 1] + dp[i - 2]\`。 +- 实现时可以用两个变量将空间优化到 \`O(1)\`。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include + +int climbStairs(int n) { + return 0; +} + +int main() { + char line[256]; + while (fgets(line, sizeof(line), stdin)) { + int n = atoi(line); + printf("%d\\n", climbStairs(n)); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include + +using namespace std; + +class Solution { +public: + int climbStairs(int n) { + return 0; + } +}; + +int main() { + string line; + while (getline(cin, line)) { + int n = stoi(line); + Solution sol; + cout << sol.climbStairs(n) << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "n", + value: "2", + }, + ], + }, + expectedOutput: "2", + }, + { + inputs: { + create: [ + { + index: 0, + name: "n", + value: "3", + }, + ], + }, + expectedOutput: "3", + }, + { + inputs: { + create: [ + { + index: 0, + name: "n", + value: "5", + }, + ], + }, + expectedOutput: "8", + }, + { + inputs: { + create: [ + { + index: 0, + name: "n", + value: "10", + }, + ], + }, + expectedOutput: "89", + }, + ], + }, + }, + { + displayId: 1006, + difficulty: "MEDIUM", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Maximum Subarray", + }, + { + locale: "zh", + type: "TITLE", + content: "最大子数组和", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `Given an integer array \`nums\`, find the contiguous subarray (containing at least one number) which has the largest sum, and return its sum. + +## Example + +\`\`\`shell +Input: nums = [-2,1,-3,4,-1,2,1,-5,4] +Output: 6 +\`\`\``, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给你一个整数数组 \`nums\`,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 + +## 示例 + +\`\`\`shell +输入: nums = [-2,1,-3,4,-1,2,1,-5,4] +输出: 6 +\`\`\``, + }, + { + locale: "en", + type: "SOLUTION", + content: `Use Kadane's algorithm: + +- \`current\` = best subarray sum ending at current index. +- \`best\` = global maximum. +- Transition: \`current = max(nums[i], current + nums[i])\`.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `使用 Kadane 算法: + +- \`current\` 表示“以当前位置结尾”的最大子数组和。 +- \`best\` 表示全局最大值。 +- 转移为 \`current = max(nums[i], current + nums[i])\`。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include +#include + +int maxSubArray(int *nums, int numsSize) { + return 0; +} + +int *parseIntArray(char *line, int *len) { + line[strcspn(line, "\\n")] = 0; + char *p = line; + while (*p && (*p == '[' || *p == ' ' || *p == ']')) + p++; + + int capacity = 16; + int *arr = malloc(capacity * sizeof(int)); + *len = 0; + char *token = strtok(p, ","); + while (token) { + if (*len >= capacity) { + capacity *= 2; + arr = realloc(arr, capacity * sizeof(int)); + } + arr[(*len)++] = atoi(token); + token = strtok(NULL, ","); + } + return arr; +} + +int main() { + char line[4096]; + while (fgets(line, sizeof(line), stdin)) { + int numsSize = 0; + int *nums = parseIntArray(line, &numsSize); + printf("%d\\n", maxSubArray(nums, numsSize)); + free(nums); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include +#include +#include +#include + +using namespace std; + +class Solution { +public: + int maxSubArray(vector &nums) { + return 0; + } +}; + +vector parseVector(const string &line) { + vector result; + stringstream ss(line); + char c; + int num; + while (ss >> c) { + if (isdigit(c) || c == '-' || c == '+') { + ss.putback(c); + ss >> num; + result.push_back(num); + } + } + return result; +} + +int main() { + string line; + while (getline(cin, line)) { + vector nums = parseVector(line); + Solution sol; + cout << sol.maxSubArray(nums) << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "nums", + value: "[-2,1,-3,4,-1,2,1,-5,4]", + }, + ], + }, + expectedOutput: "6", + }, + { + inputs: { + create: [ + { + index: 0, + name: "nums", + value: "[1]", + }, + ], + }, + expectedOutput: "1", + }, + { + inputs: { + create: [ + { + index: 0, + name: "nums", + value: "[5,4,-1,7,8]", + }, + ], + }, + expectedOutput: "23", + }, + ], + }, + }, + { + displayId: 1007, + difficulty: "EASY", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Binary Search", + }, + { + locale: "zh", + type: "TITLE", + content: "二分查找", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `Given a sorted array of integers \`nums\` and an integer \`target\`, return the index of \`target\` if it exists, otherwise return \`-1\`. + +You must write an algorithm with \`O(log n)\` runtime complexity.`, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给定一个按升序排列的整数数组 \`nums\`,和一个目标值 \`target\`。如果 \`target\` 存在于数组中,返回它的下标;否则返回 \`-1\`。 + +算法时间复杂度必须是 \`O(log n)\`。`, + }, + { + locale: "en", + type: "SOLUTION", + content: `Maintain \`left\` and \`right\` pointers and repeatedly compare \`nums[mid]\` with \`target\`. + +Shrink the interval until found or empty.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `维护 \`left\` 和 \`right\` 两个指针,通过 \`mid\` 与 \`target\` 比较不断缩小区间。 + +找到就返回下标,区间为空则返回 \`-1\`。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include +#include + +int search(int *nums, int numsSize, int target) { + return -1; +} + +int *parseIntArray(char *line, int *len) { + line[strcspn(line, "\\n")] = 0; + char *p = line; + while (*p && (*p == '[' || *p == ' ' || *p == ']')) + p++; + + int capacity = 16; + int *arr = malloc(capacity * sizeof(int)); + *len = 0; + char *token = strtok(p, ","); + while (token) { + if (*len >= capacity) { + capacity *= 2; + arr = realloc(arr, capacity * sizeof(int)); + } + arr[(*len)++] = atoi(token); + token = strtok(NULL, ","); + } + return arr; +} + +int main() { + char line[4096]; + while (fgets(line, sizeof(line), stdin)) { + int numsSize = 0; + int *nums = parseIntArray(line, &numsSize); + if (!fgets(line, sizeof(line), stdin)) + break; + int target = atoi(line); + printf("%d\\n", search(nums, numsSize, target)); + free(nums); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include +#include +#include +#include + +using namespace std; + +class Solution { +public: + int search(vector &nums, int target) { + return -1; + } +}; + +vector parseVector(const string &line) { + vector result; + stringstream ss(line); + char c; + int num; + while (ss >> c) { + if (isdigit(c) || c == '-' || c == '+') { + ss.putback(c); + ss >> num; + result.push_back(num); + } + } + return result; +} + +int main() { + string line; + while (getline(cin, line)) { + vector nums = parseVector(line); + if (!getline(cin, line)) + break; + int target = stoi(line); + Solution sol; + cout << sol.search(nums, target) << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "nums", + value: "[-1,0,3,5,9,12]", + }, + { + index: 1, + name: "target", + value: "9", + }, + ], + }, + expectedOutput: "4", + }, + { + inputs: { + create: [ + { + index: 0, + name: "nums", + value: "[-1,0,3,5,9,12]", + }, + { + index: 1, + name: "target", + value: "2", + }, + ], + }, + expectedOutput: "-1", + }, + ], + }, + }, + { + displayId: 1008, + difficulty: "MEDIUM", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Longest Substring Without Repeating Characters", + }, + { + locale: "zh", + type: "TITLE", + content: "无重复字符的最长子串", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `Given a string \`s\`, find the length of the longest substring without repeating characters. + +## Example + +\`\`\`shell +Input: s = "abcabcbb" +Output: 3 +\`\`\``, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给定一个字符串 \`s\`,请你找出其中不含有重复字符的最长子串的长度。 + +## 示例 + +\`\`\`shell +输入: s = "abcabcbb" +输出: 3 +\`\`\``, + }, + { + locale: "en", + type: "SOLUTION", + content: `Use sliding window: + +- Expand right pointer. +- If duplicate appears, move left pointer until valid. +- Keep maximum window length.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `使用滑动窗口: + +- 右指针不断扩展窗口。 +- 出现重复字符时移动左指针直到窗口重新合法。 +- 全程维护最大窗口长度。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include + +int lengthOfLongestSubstring(char *s) { + return 0; +} + +int main() { + char line[4096]; + while (fgets(line, sizeof(line), stdin)) { + line[strcspn(line, "\\n")] = 0; + printf("%d\\n", lengthOfLongestSubstring(line)); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include +#include + +using namespace std; + +class Solution { +public: + int lengthOfLongestSubstring(string s) { + return 0; + } +}; + +int main() { + string s; + while (getline(cin, s)) { + Solution sol; + cout << sol.lengthOfLongestSubstring(s) << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "abcabcbb", + }, + ], + }, + expectedOutput: "3", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "bbbbb", + }, + ], + }, + expectedOutput: "1", + }, + { + inputs: { + create: [ + { + index: 0, + name: "s", + value: "pwwkew", + }, + ], + }, + expectedOutput: "3", + }, + ], + }, + }, + { + displayId: 1009, + difficulty: "EASY", + isPublished: true, + isTrim: true, + localizations: { + create: [ + { + locale: "en", + type: "TITLE", + content: "Best Time to Buy and Sell Stock", + }, + { + locale: "zh", + type: "TITLE", + content: "买卖股票的最佳时机", + }, + { + locale: "en", + type: "DESCRIPTION", + content: `You are given an array \`prices\` where \`prices[i]\` is the price of a given stock on the \`i\`th day. + +You want to maximize your profit by choosing a single day to buy one stock and choosing a different day in the future to sell that stock. + +Return the maximum profit you can achieve. If no profit is possible, return \`0\`.`, + }, + { + locale: "zh", + type: "DESCRIPTION", + content: `给定一个数组 \`prices\`,其中 \`prices[i]\` 表示第 \`i\` 天的股票价格。 + +你只能选择某一天买入这只股票,并在未来某一天卖出。请你计算能获得的最大利润。 + +如果无法获得任何利润,返回 \`0\`。`, + }, + { + locale: "en", + type: "SOLUTION", + content: `Track the minimum price seen so far and update the answer with \`price - minPrice\` at each step.`, + }, + { + locale: "zh", + type: "SOLUTION", + content: `遍历数组时维护“历史最低价格”,并用当前价格减去最低价格更新最大利润。`, + }, + ], + }, + templates: { + create: [ + { + language: "c", + content: `#include +#include +#include + +int maxProfit(int *prices, int pricesSize) { + return 0; +} + +int *parseIntArray(char *line, int *len) { + line[strcspn(line, "\\n")] = 0; + char *p = line; + while (*p && (*p == '[' || *p == ' ' || *p == ']')) + p++; + + int capacity = 16; + int *arr = malloc(capacity * sizeof(int)); + *len = 0; + char *token = strtok(p, ","); + while (token) { + if (*len >= capacity) { + capacity *= 2; + arr = realloc(arr, capacity * sizeof(int)); + } + arr[(*len)++] = atoi(token); + token = strtok(NULL, ","); + } + return arr; +} + +int main() { + char line[4096]; + while (fgets(line, sizeof(line), stdin)) { + int pricesSize = 0; + int *prices = parseIntArray(line, &pricesSize); + printf("%d\\n", maxProfit(prices, pricesSize)); + free(prices); + } + return 0; +}`, + }, + { + language: "cpp", + content: `#include +#include +#include +#include + +using namespace std; + +class Solution { +public: + int maxProfit(vector &prices) { + return 0; + } +}; + +vector parseVector(const string &line) { + vector result; + stringstream ss(line); + char c; + int num; + while (ss >> c) { + if (isdigit(c) || c == '-' || c == '+') { + ss.putback(c); + ss >> num; + result.push_back(num); + } + } + return result; +} + +int main() { + string line; + while (getline(cin, line)) { + vector prices = parseVector(line); + Solution sol; + cout << sol.maxProfit(prices) << "\\n"; + } + return 0; +}`, + }, + ], + }, + testcases: { + create: [ + { + inputs: { + create: [ + { + index: 0, + name: "prices", + value: "[7,1,5,3,6,4]", + }, + ], + }, + expectedOutput: "5", + }, + { + inputs: { + create: [ + { + index: 0, + name: "prices", + value: "[7,6,4,3,1]", + }, + ], + }, + expectedOutput: "0", + }, + ], + }, + }, ]; export async function main() { for (const dockerConfig of dockerConfigData) { - await prisma.dockerConfig.create({ - data: dockerConfig, + await prisma.dockerConfig.upsert({ + where: { language: dockerConfig.language }, + update: { + image: dockerConfig.image, + tag: dockerConfig.tag, + workingDir: dockerConfig.workingDir, + compileOutputLimit: dockerConfig.compileOutputLimit, + runOutputLimit: dockerConfig.runOutputLimit, + }, + create: dockerConfig, }); } for (const languageServerConfig of languageServerConfigData) { - await prisma.languageServerConfig.create({ - data: languageServerConfig, + await prisma.languageServerConfig.upsert({ + where: { language: languageServerConfig.language }, + update: { + protocol: languageServerConfig.protocol, + hostname: languageServerConfig.hostname, + port: languageServerConfig.port, + path: languageServerConfig.path, + }, + create: languageServerConfig, }); } for (const problem of problemData) { - await prisma.problem.create({ - data: problem, + const existingProblem = await prisma.problem.findUnique({ + where: { displayId: problem.displayId }, + select: { id: true }, }); + + if (!existingProblem) { + await prisma.problem.create({ + data: problem, + }); + } } // Seed demo users for course/assignment MVP diff --git a/src/app/(app)/problems/[problemId]/page.tsx b/src/app/(app)/problems/[problemId]/page.tsx index 8ae3f1e..6cca381 100644 --- a/src/app/(app)/problems/[problemId]/page.tsx +++ b/src/app/(app)/problems/[problemId]/page.tsx @@ -1,5 +1,7 @@ import { ProblemView } from "@/features/problems/ui/views/problem-view"; +export const dynamic = "force-dynamic"; + interface PageProps { params: Promise<{ problemId: string }>; searchParams: Promise<{ diff --git a/src/app/(protected)/dashboard/actions/teacher-dashboard.ts b/src/app/(protected)/dashboard/actions/teacher-dashboard.ts index e787e0c..888f436 100644 --- a/src/app/(protected)/dashboard/actions/teacher-dashboard.ts +++ b/src/app/(protected)/dashboard/actions/teacher-dashboard.ts @@ -131,8 +131,8 @@ export async function getDifficultProblemsData(): Promise< const actor = await getAuthenticatedActor(); assertTeacherOrAdmin(actor); - // 获取所有测试用例结果 - const testcaseResults = await prisma.testcaseResult.findMany({ + // 获取所有用例级判题结果 + const judgeRuns = await prisma.judgeRun.findMany({ include: { testcase: { include: { @@ -143,9 +143,13 @@ export async function getDifficultProblemsData(): Promise< }, }, }, - submission: { + judge: { include: { - user: true, + submission: { + include: { + user: true, + }, + }, }, }, }, @@ -163,14 +167,14 @@ export async function getDifficultProblemsData(): Promise< } >(); - testcaseResults.forEach((result) => { + judgeRuns.forEach((result) => { const problemId = result.testcase.problemId; const problemTitle = result.testcase.problem.localizations?.find((loc) => loc.type === "TITLE") ?.content || "无标题"; const problemDisplayId = result.testcase.problem.displayId; - const userId = result.submission.userId; - const isWrong = !result.isCorrect; + const userId = result.judge.submission.userId; + const isWrong = result.status !== "ACCEPTED"; if (!problemStats.has(problemId)) { problemStats.set(problemId, { diff --git a/src/app/actions/analyze-code.ts b/src/app/actions/analyze-code.ts index c3ecb27..037406e 100644 --- a/src/app/actions/analyze-code.ts +++ b/src/app/actions/analyze-code.ts @@ -5,16 +5,24 @@ import prisma from "@/lib/prisma"; import { generateText, tool } from "ai"; import { model } from "@/lib/ai"; import { Complexity } from "@/types/complexity"; +import { Locale } from "@/generated/client"; interface analyzeCodeProps { content: string; submissionId: string; + locale: Locale; } export const analyzeCode = async ({ content, submissionId, + locale, }: analyzeCodeProps) => { + const outputLanguageInstruction = + locale === "zh" + ? "The `feedback` field must be written in Simplified Chinese." + : "The `feedback` field must be written in English."; + const analysis = await prisma.codeAnalysis.create({ data: { submissionId, @@ -32,6 +40,7 @@ export const analyzeCode = async ({ await generateText({ model, system: `You are an AI assistant that rigorously analyzes code for time and space complexity, and assesses overall code quality. +${outputLanguageInstruction} **Time/Space Complexity MUST be one of these values:** - O(1) diff --git a/src/app/actions/compile.ts b/src/app/actions/compile.ts index dd043b4..968a174 100644 --- a/src/app/actions/compile.ts +++ b/src/app/actions/compile.ts @@ -1,9 +1,15 @@ import "server-only"; import Docker from "dockerode"; -import prisma from "@/lib/prisma"; import { createLimitedStream, docker } from "./docker"; -import { type DockerConfig, Language, Status } from "@/generated/client"; +import { + type DockerConfig, + JudgeStatus, + Language, + Status, +} from "@/generated/client"; +import { updateSubmissionStatus } from "@/lib/submission-status"; +import { updateJudgeBySubmission } from "@/lib/judge-trace"; const getCompileCmdForLanguage = (language: Language) => { switch (language) { @@ -37,15 +43,15 @@ const executeCompilation = async ( const exitCode = (await compileExec.inspect()).ExitCode; if (exitCode === 0) { + await updateJudgeBySubmission(submissionId, JudgeStatus.COMPILING); resolve(Status.CS); } else { - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - message: stderr, - }, + await updateSubmissionStatus(submissionId, Status.CE, { + message: stderr, + }); + await updateJudgeBySubmission(submissionId, JudgeStatus.COMPILATION_ERROR, { + compileOutput: stderr, + endTime: new Date(), }); resolve(Status.CE); } @@ -66,14 +72,8 @@ export const compile = async ( ): Promise => { const { compileOutputLimit } = config; - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status: Status.CP, - }, - }); + await updateJudgeBySubmission(submissionId, JudgeStatus.COMPILING); + await updateSubmissionStatus(submissionId, Status.CP); const compileCmd = getCompileCmdForLanguage(language); @@ -89,14 +89,9 @@ export const compile = async ( compileOutputLimit ); - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status, - }, - }); + if (status !== Status.CE) { + await updateSubmissionStatus(submissionId, status); + } return status; }; diff --git a/src/app/actions/judge.ts b/src/app/actions/judge.ts index 79598c4..83af37e 100644 --- a/src/app/actions/judge.ts +++ b/src/app/actions/judge.ts @@ -1,20 +1,22 @@ "use server"; -import { run } from "./run"; -import Docker from "dockerode"; import prisma from "@/lib/prisma"; -import { compile } from "./compile"; import { auth, signIn } from "@/lib/auth"; import { revalidatePath } from "next/cache"; -import { Language, Status } from "@/generated/client"; +import { Language, Locale, Status } from "@/generated/client"; import { analyzeCode } from "@/app/actions/analyze-code"; -import { createContainer, createTarStream, prepareEnvironment } from "./docker"; +import { inngest } from "@/inngest/client"; +import { + createSubmissionWithStatus, + updateSubmissionStatus, +} from "@/lib/submission-status"; export const judge = async ( problemId: string, language: Language, content: string, - assignmentId?: string + assignmentId?: string, + locale: Locale = "zh" ): Promise => { const session = await auth(); const userId = session?.user?.id; @@ -23,8 +25,6 @@ export const judge = async ( return Status.SE; } - let container: Docker.Container | null = null; - try { const actor = await prisma.user.findUnique({ where: { id: userId }, @@ -39,16 +39,14 @@ export const judge = async ( message: string, options?: { assignmentId?: string | null } ) => { - await prisma.submission.create({ - data: { - language, - content, - status: Status.SE, - message, - userId, - problemId, - assignmentId: options?.assignmentId ?? null, - }, + await createSubmissionWithStatus({ + language, + content, + status: Status.SE, + message, + userId, + problemId, + assignmentId: options?.assignmentId ?? null, }); }; @@ -163,102 +161,45 @@ export const judge = async ( return Status.SE; } - const dockerPrepared = await prepareEnvironment( - dockerConfig.image, - dockerConfig.tag - ); - - if (!dockerPrepared) { - console.error( - "Docker image not found:", - dockerConfig.image, - ":", - dockerConfig.tag - ); - await prisma.submission.create({ - data: { - language, - content, - status: Status.SE, - message: `Docker image not found: ${dockerConfig.image}:${dockerConfig.tag}`, - userId, - problemId, - assignmentId: validatedAssignmentId, - }, - }); - return Status.SE; - } - - const submission = await prisma.submission.create({ - data: { - language, - content, - status: Status.PD, - userId, - problemId, - assignmentId: validatedAssignmentId, - }, + const submission = await createSubmissionWithStatus({ + language, + content, + status: Status.QD, + userId, + problemId, + assignmentId: validatedAssignmentId, }); const executeAnalyzeCode = async () => { await analyzeCode({ content, submissionId: submission.id, + locale, }); } - executeAnalyzeCode() + executeAnalyzeCode(); - // Upload code to the container - const tarStream = createTarStream( - getFileNameForLanguage(language), - content - ); + try { + await inngest.send({ + name: "submissions/create", + data: { + submissionId: submission.id, + }, + }); + } catch (inngestError) { + console.error("Failed to enqueue judge event:", inngestError); + await updateSubmissionStatus(submission.id, Status.SE, { + message: "Failed to enqueue judge event", + }); + return Status.SE; + } - container = await createContainer(dockerConfig, problem.memoryLimit); - await container.putArchive(tarStream, { path: dockerConfig.workingDir }); - - // Compile the code - const compileStatus = await compile( - container, - language, - submission.id, - dockerConfig - ); - - if (compileStatus !== "CS") return compileStatus; - - const runStatus = await run( - container, - language, - submission.id, - dockerConfig, - problem, - testcases - ); - - return runStatus; + return Status.QD; } catch (error) { console.error("Error in judge:", error); return Status.SE; } finally { revalidatePath(`/problems/${problemId}`); - if (container) { - try { - await container.kill(); - await container.remove(); - } catch (error) { - console.error("Container cleanup failed:", error); - } - } - } -}; - -const getFileNameForLanguage = (language: Language) => { - switch (language) { - case Language.c: - return "main.c"; - case Language.cpp: - return "main.cpp"; } }; diff --git a/src/app/actions/run.ts b/src/app/actions/run.ts deleted file mode 100644 index 4ad0061..0000000 --- a/src/app/actions/run.ts +++ /dev/null @@ -1,257 +0,0 @@ -import "server-only"; - -import { - DockerConfig, - Language, - Problem, - Status, - Testcase, -} from "@/generated/client"; -import Docker from "dockerode"; -import prisma from "@/lib/prisma"; -import { createLimitedStream, docker } from "./docker"; - -const getRunCmdForLanguage = (language: Language) => { - switch (language) { - case Language.c: - return ["./main"]; - case Language.cpp: - return ["./main"]; - } -}; - -const startRun = ( - runExec: Docker.Exec, - runOutputLimit: number, - submissionId: string, - testcaseId: string, - joinedInputs: string, - timeLimit: number, - memoryLimit: number, - expectedOutput: string, - isTrim: boolean, -): Promise => { - return new Promise((resolve, reject) => { - runExec.start({ hijack: true }, async (error, stream) => { - if (error || !stream) { - await prisma.testcaseResult.create({ - data: { - isCorrect: false, - submissionId, - testcaseId, - }, - }); - reject(Status.SE); - return; - } - stream.write(joinedInputs); - stream.end(); - - const { stream: stdoutStream, buffers: stdoutBuffers } = - createLimitedStream(runOutputLimit); - const { stream: stderrStream } = createLimitedStream(runOutputLimit); - docker.modem.demuxStream(stream, stdoutStream, stderrStream); - - const startTime = Date.now(); - const timeoutId = setTimeout(async () => { - stream.destroy(); - await prisma.testcaseResult.create({ - data: { - isCorrect: false, - timeUsage: timeLimit, - submissionId, - testcaseId, - }, - }); - resolve(Status.TLE); - }, timeLimit); - - stream.on("end", async () => { - clearTimeout(timeoutId); - const stdout = stdoutBuffers.join(""); - const exitCode = (await runExec.inspect()).ExitCode; - const timeUsage = Date.now() - startTime; - if (exitCode === 0) { - const isCorrect = isTrim ? stdout.trim() === expectedOutput.trim() : stdout === expectedOutput; - await prisma.testcaseResult.create({ - data: { - isCorrect, - output: stdout, - timeUsage, - submissionId, - testcaseId, - }, - }); - if (isCorrect) { - resolve(Status.RU); - } else { - resolve(Status.WA); - } - } else if (exitCode === 137) { - await prisma.testcaseResult.create({ - data: { - isCorrect: false, - timeUsage, - memoryUsage: memoryLimit, - submissionId, - testcaseId, - }, - }); - resolve(Status.MLE); - } else { - await prisma.testcaseResult.create({ - data: { - isCorrect: false, - submissionId, - testcaseId, - }, - }); - resolve(Status.RE); - } - }); - - stream.on("error", async () => { - clearTimeout(timeoutId); - await prisma.testcaseResult.create({ - data: { - isCorrect: false, - submissionId, - testcaseId, - }, - }); - reject(Status.SE); - }); - }); - }); -}; - -const executeRun = async ( - container: Docker.Container, - runCmd: string[], - runOutputLimit: number, - submissionId: string, - timeLimit: number, - memoryLimit: number, - testcases: Testcase[], - isTrim: boolean -): Promise => { - for (const testcase of testcases) { - const inputs = await prisma.testcaseInput.findMany({ - where: { - testcaseId: testcase.id, - }, - }); - if (!inputs) { - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status: Status.SE, - message: "No inputs for testcase", - }, - }); - return Status.SE; - } - const sortedInputs = inputs.sort((a, b) => a.index - b.index); - const joinedInputs = sortedInputs.map((i) => i.value).join("\n"); - - const runExec = await container.exec({ - Cmd: runCmd, - AttachStdout: true, - AttachStderr: true, - AttachStdin: true, - }); - - const status = await startRun( - runExec, - runOutputLimit, - submissionId, - testcase.id, - joinedInputs, - timeLimit, - memoryLimit, - testcase.expectedOutput, - isTrim - ); - - if (status !== Status.RU) { - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status, - }, - }); - return status; - } - } - - const testcaseResults = await prisma.testcaseResult.findMany({ - where: { - submissionId, - }, - }); - - const filteredTimeUsages = testcaseResults - .map((result) => result.timeUsage) - .filter((time) => time !== null); - - const maxTimeUsage = - filteredTimeUsages.length > 0 ? Math.max(...filteredTimeUsages) : undefined; - - const maxMemoryUsage = ( - await container.stats({ - stream: false, - "one-shot": true, - }) - ).memory_stats.max_usage; - - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status: Status.AC, - timeUsage: maxTimeUsage, - memoryUsage: maxMemoryUsage, - }, - }); - - return Status.AC; -}; - -export const run = async ( - container: Docker.Container, - language: Language, - submissionId: string, - config: DockerConfig, - problem: Problem, - testcases: Testcase[] -): Promise => { - const { runOutputLimit } = config; - const { timeLimit, memoryLimit, isTrim } = problem; - - await prisma.submission.update({ - where: { - id: submissionId, - }, - data: { - status: Status.RU, - }, - }); - - const runCmd = getRunCmdForLanguage(language); - - return await executeRun( - container, - runCmd, - runOutputLimit, - submissionId, - timeLimit, - memoryLimit, - testcases, - isTrim - ); -}; diff --git a/src/app/api/inngest/route.ts b/src/app/api/inngest/route.ts new file mode 100644 index 0000000..dcb90ac --- /dev/null +++ b/src/app/api/inngest/route.ts @@ -0,0 +1,8 @@ +import { serve } from "inngest/next"; +import { inngest } from "@/inngest/client"; +import { processSubmission } from "@/inngest/functions/process-submission"; + +export const { GET, POST, PUT } = serve({ + client: inngest, + functions: [processSubmission], +}); diff --git a/src/features/problems/analysis/components/card.tsx b/src/features/problems/analysis/components/card.tsx index 53b6e43..ba53dc3 100644 --- a/src/features/problems/analysis/components/card.tsx +++ b/src/features/problems/analysis/components/card.tsx @@ -19,6 +19,7 @@ import { } from "@/features/problems/analysis/components/radar-chart"; import type { AnalysisStatus, CodeAnalysis } from "@/generated/client"; import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; +import { useTranslations } from "next-intl"; interface AnalysisCardProps { submissionId: string; @@ -28,6 +29,7 @@ const ACTIVE_STATUSES: AnalysisStatus[] = ["PENDING", "QUEUED", "PROCESSING"]; const FINAL_STATUSES: AnalysisStatus[] = ["COMPLETED", "FAILED"]; export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { + const t = useTranslations("AnalysisCard"); const [analysis, setAnalysis] = useState(null); const fetchAnalysis = useCallback(() => { @@ -36,11 +38,11 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { setAnalysis(analysis); }) .catch((error) => { - toast.error("Analysis Update Failed", { - description: error.message || "Failed to fetch analysis data.", + toast.error(t("UpdateFailed"), { + description: error.message || t("UpdateFailedDescription"), }); }); - }, [submissionId]); + }, [submissionId, t]); useEffect(() => { if (!analysis) { @@ -68,7 +70,7 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => {
-

Analyzing your code...

+

{t("Analyzing")}

@@ -80,15 +82,15 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { - Code Analysis + {t("Title")} - Analysis Failed + {t("FailedTitle")} - We couldn't analyze your code. Please try again later. + {t("FailedDescription")} @@ -101,10 +103,10 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { - Code Analysis + {t("Title")} - Preparing your detailed evaluation + {t("PreparingDescription")} @@ -115,10 +117,10 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => {

- Processing your submission + {t("Processing")}

- This may take a few moments... + {t("ProcessingHint")}

@@ -130,27 +132,27 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { // Transform the data into a format suitable for the RadarChart const chartData: ChartDataPoint[] = [ { - kind: "overall", + kind: t("Kinds.Overall"), score: analysis.overallScore ?? 0, fullMark: 100, }, { - kind: "style", + kind: t("Kinds.Style"), score: analysis.styleScore ?? 0, fullMark: 100, }, { - kind: "readability", + kind: t("Kinds.Readability"), score: analysis.readabilityScore ?? 0, fullMark: 100, }, { - kind: "efficiency", + kind: t("Kinds.Efficiency"), score: analysis.efficiencyScore ?? 0, fullMark: 100, }, { - kind: "correctness", + kind: t("Kinds.Correctness"), score: analysis.correctnessScore ?? 0, fullMark: 100, }, @@ -160,22 +162,22 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => { - Code Analysis + {t("Title")} - Detailed evaluation of your code submission + {t("CompletedDescription")} - +
- Overall Score + {t("OverallScore")} - {analysis.overallScore ?? "N/A"} + {analysis.overallScore ?? t("NotAvailable")} /100
@@ -191,7 +193,7 @@ export const AnalysisCard = ({ submissionId }: AnalysisCardProps) => {
-

Feedback

+

{t("Feedback")}

{analysis.feedback}

diff --git a/src/features/problems/analysis/components/radar-chart.tsx b/src/features/problems/analysis/components/radar-chart.tsx index cd38479..9b59644 100644 --- a/src/features/problems/analysis/components/radar-chart.tsx +++ b/src/features/problems/analysis/components/radar-chart.tsx @@ -21,10 +21,12 @@ export interface ChartDataPoint { interface CodeAnalysisRadarChartProps { chartData: ChartDataPoint[]; + radarName: string; } export function CodeAnalysisRadarChart({ chartData, + radarName, }: CodeAnalysisRadarChartProps) { return ( @@ -34,7 +36,7 @@ export function CodeAnalysisRadarChart({ { const { model } = useProblemFlexLayoutStore(); const { problem, language, value } = useProblemEditorStore(); const searchParams = useSearchParams(); + const locale = useLocale(); const [isLoading, setIsLoading] = useState(false); const t = useTranslations("PlaygroundHeader.RunCodeButton"); @@ -29,7 +30,14 @@ export const JudgeButton = ({ className }: JudgeButtonProps) => { setIsLoading(true); const assignmentId = searchParams.get("assignmentId") || undefined; - const status = await judge(problem.problemId, language, value, assignmentId); + const normalizedLocale = locale === "en" ? "en" : "zh"; + const status = await judge( + problem.problemId, + language, + value, + assignmentId, + normalizedLocale + ); toast.custom((t) => ); if (model) { diff --git a/src/features/problems/detail/components/form.tsx b/src/features/problems/detail/components/form.tsx index be0bb4b..ee2252a 100644 --- a/src/features/problems/detail/components/form.tsx +++ b/src/features/problems/detail/components/form.tsx @@ -16,82 +16,82 @@ interface DetailFormProps { export const DetailForm = async ({ submissionId }: DetailFormProps) => { const t = await getTranslations("DetailsPage"); - const submission = await prisma.submission.findUnique({ - where: { - id: submissionId, + const judge = await prisma.judge.findUnique({ + where: { submissionId }, + include: { + judgeRuns: { + orderBy: { createdAt: "desc" }, + include: { + testcase: { + include: { inputs: true }, + }, + }, + }, }, }); - const lastTestcaseResult = await prisma.testcaseResult.findFirst({ - where: { submissionId, isCorrect: false }, - orderBy: { createdAt: "desc" }, - }); + const failedJudgeRun = judge?.judgeRuns.find((run) => run.status !== "ACCEPTED"); + if (failedJudgeRun?.testcase) { + const sortedInputs = failedJudgeRun.testcase.inputs.sort( + (a, b) => a.index - b.index + ); - if (!lastTestcaseResult) return null; - - const testcase = await prisma.testcase.findUnique({ - where: { id: lastTestcaseResult.testcaseId }, - include: { inputs: true }, - }); - - if (!testcase) return null; - - const sortedInputs = testcase.inputs?.sort((a, b) => a.index - b.index); - - return ( -
-
- - - - - - -
- {sortedInputs.map((input) => ( -
- - -
- ))} -
-
-
-
+ return ( +
+
+ + + + + + +
+ {sortedInputs.map((input) => ( +
+ + +
+ ))} +
+
+
+
+
+ {failedJudgeRun.stdout && ( +
+ + +
+ )} + {failedJudgeRun.status === "WRONG_ANSWER" && ( +
+ + +
+ )}
- {lastTestcaseResult.output && ( -
- - -
- )} - {submission?.status === "WA" && ( -
- - -
- )} -
- ); + ); + } + return null; }; diff --git a/src/features/problems/detail/components/table.tsx b/src/features/problems/detail/components/table.tsx index 57eb383..ef4ded6 100644 --- a/src/features/problems/detail/components/table.tsx +++ b/src/features/problems/detail/components/table.tsx @@ -27,6 +27,12 @@ export const DetailTable = async ({ submissionId }: DetailTableProps) => { id: submissionId, }, }); + const judge = await prisma.judge.findUnique({ + where: { submissionId }, + select: { + compileOutput: true, + }, + }); if (!submission) return ( @@ -59,9 +65,9 @@ export const DetailTable = async ({ submissionId }: DetailTableProps) => {
- {submission.message && ( + {(submission.message || judge?.compileOutput) && ( )} diff --git a/src/features/problems/submission/components/realtime-listener.tsx b/src/features/problems/submission/components/realtime-listener.tsx new file mode 100644 index 0000000..6d438f6 --- /dev/null +++ b/src/features/problems/submission/components/realtime-listener.tsx @@ -0,0 +1,36 @@ +"use client"; + +import { useEffect } from "react"; +import { useRouter } from "next/navigation"; +import { getPusherClient } from "@/lib/soketi-client"; + +interface SubmissionRealtimeListenerProps { + problemId: string; +} + +export const SubmissionRealtimeListener = ({ + problemId, +}: SubmissionRealtimeListenerProps) => { + const router = useRouter(); + + useEffect(() => { + const pusher = getPusherClient(); + if (!pusher) return; + + const channelName = `problem-${problemId}`; + const channel = pusher.subscribe(channelName); + + const handleStatusUpdate = () => { + router.refresh(); + }; + + channel.bind("status-update", handleStatusUpdate); + + return () => { + channel.unbind("status-update", handleStatusUpdate); + pusher.unsubscribe(channelName); + }; + }, [problemId, router]); + + return null; +}; diff --git a/src/features/problems/ui/views/problem-view.tsx b/src/features/problems/ui/views/problem-view.tsx index 8c47798..945398c 100644 --- a/src/features/problems/ui/views/problem-view.tsx +++ b/src/features/problems/ui/views/problem-view.tsx @@ -6,6 +6,7 @@ import { SolutionPanel } from "@/features/problems/solution/components/panel"; import { SubmissionPanel } from "@/features/problems/submission/components/panel"; import { DescriptionPanel } from "@/features/problems/description/components/panel"; import { ProblemFlexLayout } from "@/features/problems/components/problem-flexlayout"; +import { SubmissionRealtimeListener } from "@/features/problems/submission/components/realtime-listener"; interface ProblemViewProps { problemId: string; @@ -25,6 +26,7 @@ export const ProblemView = ({ problemId, submissionId }: ProblemViewProps) => { return (
+
); diff --git a/src/inngest/client.ts b/src/inngest/client.ts new file mode 100644 index 0000000..5a80929 --- /dev/null +++ b/src/inngest/client.ts @@ -0,0 +1,5 @@ +import { Inngest } from "inngest"; + +export const inngest = new Inngest({ + id: "judge4c", +}); diff --git a/src/inngest/functions/process-submission.ts b/src/inngest/functions/process-submission.ts new file mode 100644 index 0000000..04ca8eb --- /dev/null +++ b/src/inngest/functions/process-submission.ts @@ -0,0 +1,254 @@ +import "server-only"; + +import prisma from "@/lib/prisma"; +import { JudgeStatus, Language, Status } from "@/generated/client"; +import { inngest } from "@/inngest/client"; +import { docker, prepareEnvironment } from "@/app/actions/docker"; +import { + compile, + deleteContainer, + prepareCompileExec, + prepareContainer, + prepareRunExec, + run, + uploadFileToContainer, +} from "../../lib/judge-runtime"; +import { updateSubmissionStatus } from "@/lib/submission-status"; +import { + getOrCreateJudge, + mapSubmissionStatusToJudgeRunStatus, + updateJudgeBySubmission, +} from "@/lib/judge-trace"; + +const getFileNameForLanguage = (language: Language) => { + switch (language) { + case Language.c: + return "main.c"; + case Language.cpp: + return "main.cpp"; + } +}; + +const finalizeWithSystemError = async (submissionId: string, message: string) => { + await updateSubmissionStatus(submissionId, Status.SE, { message }); + await updateJudgeBySubmission(submissionId, JudgeStatus.SYSTEM_ERROR, { + endTime: new Date(), + }); +}; + +export const processSubmission = inngest.createFunction( + { + id: "process-submission", + name: "Process Submission", + retries: 0, + }, + { + event: "submissions/create", + }, + async ({ event, step }) => { + const submissionId = await step.run("parse-event-submission-id", async () => { + return String((event.data as { submissionId?: string }).submissionId ?? ""); + }); + if (!submissionId) return; + + const submission = await step.run("load-submission", async () => { + return prisma.submission.findUnique({ + where: { id: submissionId }, + }); + }); + if (!submission) return; + + let containerId: string | null = null; + + try { + const problem = await prisma.problem.findUnique({ + where: { id: submission.problemId }, + }); + if (!problem) { + await finalizeWithSystemError(submission.id, "Problem not found"); + return; + } + + const testcases = await prisma.testcase.findMany({ + where: { problemId: submission.problemId }, + }); + if (!testcases.length) { + await finalizeWithSystemError( + submission.id, + "No testcases available for this problem" + ); + return; + } + + const dockerConfig = await prisma.dockerConfig.findUnique({ + where: { language: submission.language }, + }); + if (!dockerConfig) { + await finalizeWithSystemError( + submission.id, + `Docker configuration not found for language: ${submission.language}` + ); + return; + } + + const dockerPrepared = await step.run("prepare-docker-image", async () => { + return prepareEnvironment(dockerConfig.image, dockerConfig.tag); + }); + if (!dockerPrepared) { + await finalizeWithSystemError( + submission.id, + `Docker image not found: ${dockerConfig.image}:${dockerConfig.tag}` + ); + return; + } + + containerId = await step.run("prepare-container", async () => { + return prepareContainer( + dockerConfig.image, + dockerConfig.tag, + problem.memoryLimit, + dockerConfig.workingDir + ); + }); + + await step.run("upload-source-to-container", async () => { + await uploadFileToContainer( + containerId!, + submission.content, + getFileNameForLanguage(submission.language), + dockerConfig.workingDir + ); + }); + + const compileResult = await step.run("compile-submission", async () => { + await updateJudgeBySubmission(submission.id, JudgeStatus.COMPILING); + await updateSubmissionStatus(submission.id, Status.CP); + + const compileExecId = await prepareCompileExec( + containerId!, + submission.language === Language.c + ? ["gcc", "-O2", "main.c", "-o", "main"] + : ["g++", "-O2", "main.cpp", "-o", "main"] + ); + return compile(compileExecId); + }); + + if (compileResult.exitCode !== 0) { + await updateSubmissionStatus(submission.id, Status.CE, { + message: compileResult.stderr, + }); + await updateJudgeBySubmission(submission.id, JudgeStatus.COMPILATION_ERROR, { + compileOutput: compileResult.stderr, + endTime: new Date(), + }); + return; + } + + await updateSubmissionStatus(submission.id, Status.CS); + const judgeId = await getOrCreateJudge(submission.id, JudgeStatus.RUNNING); + await prisma.judgeRun.deleteMany({ where: { judgeId } }); + await updateJudgeBySubmission(submission.id, JudgeStatus.RUNNING); + await updateSubmissionStatus(submission.id, Status.RU); + + let maxTimeUsage: number | null = null; + for (const testcase of testcases) { + const inputs = await prisma.testcaseInput.findMany({ + where: { testcaseId: testcase.id }, + orderBy: { index: "asc" }, + }); + const stdin = inputs.map((i) => i.value).join("\n"); + + const runExecId = await step.run(`prepare-run-exec-${testcase.id}`, async () => { + return prepareRunExec(containerId!, ["./main"]); + }); + const runResult = await step.run(`run-testcase-${testcase.id}`, async () => { + return run(runExecId, stdin || null, problem.timeLimit); + }); + + const { exitCode, stdout, stderr, timeUsage, isTimeout } = runResult; + + let status: Status = Status.SE; + let isCorrect = false; + let memoryUsage: number | null = null; + + if (isTimeout) { + status = Status.TLE; + } else if (exitCode === 0) { + isCorrect = problem.isTrim + ? stdout.trim() === testcase.expectedOutput.trim() + : stdout === testcase.expectedOutput; + status = isCorrect ? Status.RU : Status.WA; + } else if (exitCode === 137) { + status = Status.MLE; + memoryUsage = problem.memoryLimit; + } else { + status = Status.RE; + } + + await prisma.judgeRun.create({ + data: { + judgeId, + testcaseId: testcase.id, + status: mapSubmissionStatusToJudgeRunStatus(status), + timeUsage, + memoryUsage: memoryUsage ?? undefined, + stdin, + stdout, + stderr, + }, + }); + + if (maxTimeUsage === null || timeUsage > maxTimeUsage) { + maxTimeUsage = timeUsage; + } + + if (status !== Status.RU) { + const judgeStatusMap: Record = { + [Status.PD]: JudgeStatus.SYSTEM_ERROR, + [Status.QD]: JudgeStatus.SYSTEM_ERROR, + [Status.CP]: JudgeStatus.COMPILING, + [Status.CE]: JudgeStatus.COMPILATION_ERROR, + [Status.CS]: JudgeStatus.COMPILING, + [Status.RU]: JudgeStatus.RUNNING, + [Status.TLE]: JudgeStatus.TIME_LIMIT_EXCEEDED, + [Status.MLE]: JudgeStatus.MEMORY_LIMIT_EXCEEDED, + [Status.RE]: JudgeStatus.RUNTIME_ERROR, + [Status.AC]: JudgeStatus.ACCEPTED, + [Status.WA]: JudgeStatus.WRONG_ANSWER, + [Status.SE]: JudgeStatus.SYSTEM_ERROR, + }; + + await updateSubmissionStatus(submission.id, status); + await updateJudgeBySubmission(submission.id, judgeStatusMap[status], { + endTime: new Date(), + }); + return; + } + } + + const stats = await step.run("read-container-stats", async () => { + const container = docker.getContainer(containerId!); + return container.stats({ stream: false, "one-shot": true }); + }); + + const maxMemoryUsage = stats.memory_stats.max_usage; + + await updateSubmissionStatus(submission.id, Status.AC, { + timeUsage: maxTimeUsage, + memoryUsage: maxMemoryUsage, + }); + await updateJudgeBySubmission(submission.id, JudgeStatus.ACCEPTED, { + endTime: new Date(), + }); + } catch (error) { + console.error("inngest process submission failed:", error); + await finalizeWithSystemError(submission.id, "Judge execution failed"); + } finally { + if (containerId) { + await step.run("cleanup-container", async () => { + await deleteContainer(containerId!); + }); + } + } + } +); diff --git a/src/lib/ai.ts b/src/lib/ai.ts index f7046d9..4686da1 100644 --- a/src/lib/ai.ts +++ b/src/lib/ai.ts @@ -2,23 +2,9 @@ import "server-only"; import { createOpenAICompatible } from "@ai-sdk/openai-compatible"; -const getRequiredEnv = ( - name: "AI_API_KEY" | "AI_BASE_URL" | "AI_MODEL", -): string => { - const value = process.env[name]; - - if (!value) { - throw new Error(`Missing required environment variable: ${name}`); - } - - return value; -}; - -const apiKey = getRequiredEnv("AI_API_KEY"); - -const baseURL = getRequiredEnv("AI_BASE_URL"); - -export const modelId = getRequiredEnv("AI_MODEL"); +const apiKey = process.env.AI_API_KEY ?? ""; +const baseURL = process.env.AI_BASE_URL ?? "https://api.deepseek.com"; +export const modelId = process.env.AI_MODEL ?? "deepseek-chat"; export const aiProvider = createOpenAICompatible({ name: "ai", diff --git a/src/lib/judge-runtime.ts b/src/lib/judge-runtime.ts new file mode 100644 index 0000000..57961a1 --- /dev/null +++ b/src/lib/judge-runtime.ts @@ -0,0 +1,211 @@ +import "server-only"; + +import { docker } from "@/app/actions/docker"; +import { PassThrough } from "stream"; +import tar from "tar-stream"; + +export const createStreamCollector = () => { + let stdout = ""; + let stderr = ""; + + const stdoutStream = new PassThrough(); + const stderrStream = new PassThrough(); + + stdoutStream.on("data", (chunk) => { + stdout += chunk.toString(); + }); + + stderrStream.on("data", (chunk) => { + stderr += chunk.toString(); + }); + + return { + getStdout: () => stdout, + getStderr: () => stderr, + stdoutStream, + stderrStream, + }; +}; + +export const uploadFileToContainer = async ( + containerId: string, + sourceCode: string, + fileName: string, + filePath: string +) => { + const container = docker.getContainer(containerId); + + // Ensure target directory exists before archive upload. + const mkdirExec = await container.exec({ + Cmd: ["mkdir", "-p", filePath], + AttachStdout: false, + AttachStderr: false, + }); + await mkdirExec.start({ hijack: false, stdin: false, Detach: false, Tty: false }); + + const pack = tar.pack(); + pack.entry({ name: fileName }, sourceCode); + pack.finalize(); + + await container.putArchive(pack as unknown as NodeJS.ReadableStream, { + path: filePath, + }); +}; + +export const deleteContainer = async (containerId: string) => { + const container = docker.getContainer(containerId); + await container.remove({ force: true }); +}; + +export const prepareContainer = async ( + image: string, + tag: string, + memoryLimit: number, + workingDir: string +) => { + const imageWithTag = `${image}:${tag}`; + const stream = await docker.pull(imageWithTag); + + await new Promise((resolve, reject) => { + docker.modem.followProgress(stream, (error, result) => { + if (error) reject(error); + else resolve(result); + }); + }); + + const container = await docker.createContainer({ + Image: imageWithTag, + Cmd: ["tail", "-f", "/dev/null"], + WorkingDir: workingDir, + HostConfig: { + CpuCount: 1, + Memory: memoryLimit, + MemorySwap: 0, + NetworkMode: "none", + }, + }); + + await container.start(); + return container.id; +}; + +export const prepareCompileExec = async (containerId: string, cmd: string[]) => { + const container = docker.getContainer(containerId); + + const compileExec = await container.exec({ + Cmd: cmd, + AttachStdin: false, + AttachStdout: true, + AttachStderr: true, + }); + + return compileExec.id; +}; + +export const prepareRunExec = async (containerId: string, cmd: string[]) => { + const container = docker.getContainer(containerId); + + const runExec = await container.exec({ + Cmd: cmd, + AttachStdin: true, + AttachStdout: true, + AttachStderr: true, + }); + + return runExec.id; +}; + +export const compile = async (compileExecId: string) => { + const compileExec = docker.getExec(compileExecId); + + const stream = await compileExec.start({ + hijack: false, + stdin: false, + Detach: false, + Tty: false, + }); + + const { getStdout, getStderr, stdoutStream, stderrStream } = + createStreamCollector(); + docker.modem.demuxStream(stream, stdoutStream, stderrStream); + + return new Promise<{ + exitCode: number | null; + stdout: string; + stderr: string; + }>((resolve) => { + stream.on("end", async () => { + const exitCode = (await compileExec.inspect()).ExitCode; + resolve({ + exitCode, + stdout: getStdout(), + stderr: getStderr(), + }); + }); + }); +}; + +export const run = async ( + runExecId: string, + stdin: string | null, + timeLimit: number +) => { + const runExec = docker.getExec(runExecId); + const startTime = Date.now(); + const abortController = new AbortController(); + + const timeoutId = setTimeout(() => { + abortController.abort(); + }, timeLimit); + + const stream = await runExec.start({ + hijack: stdin ? true : false, + stdin: stdin ? true : false, + Detach: false, + Tty: false, + abortSignal: abortController.signal, + }); + + if (stdin) { + stream.write(stdin); + stream.end(); + } + + const { getStdout, getStderr, stdoutStream, stderrStream } = + createStreamCollector(); + docker.modem.demuxStream(stream, stdoutStream, stderrStream); + + return new Promise<{ + exitCode: number | null; + stdout: string; + stderr: string; + timeUsage: number; + isTimeout: boolean; + }>((resolve) => { + stream.on("end", async () => { + clearTimeout(timeoutId); + const endTime = Date.now(); + const timeUsage = endTime - startTime; + const exitCode = (await runExec.inspect()).ExitCode; + resolve({ + exitCode, + stdout: getStdout(), + stderr: getStderr(), + timeUsage, + isTimeout: abortController.signal.aborted, + }); + }); + + abortController.signal.addEventListener("abort", () => { + clearTimeout(timeoutId); + const endTime = Date.now(); + resolve({ + exitCode: null, + stdout: getStdout(), + stderr: getStderr(), + timeUsage: endTime - startTime, + isTimeout: true, + }); + }); + }); +}; diff --git a/src/lib/judge-trace.ts b/src/lib/judge-trace.ts new file mode 100644 index 0000000..c147531 --- /dev/null +++ b/src/lib/judge-trace.ts @@ -0,0 +1,101 @@ +import "server-only"; + +import prisma from "@/lib/prisma"; +import { + JudgeRunStatus, + JudgeStatus, + Status, +} from "@/generated/client"; + +export const mapSubmissionStatusToJudgeStatus = ( + status: Status +): JudgeStatus | null => { + switch (status) { + case Status.CP: + return JudgeStatus.COMPILING; + case Status.CE: + return JudgeStatus.COMPILATION_ERROR; + case Status.RU: + return JudgeStatus.RUNNING; + case Status.AC: + return JudgeStatus.ACCEPTED; + case Status.WA: + return JudgeStatus.WRONG_ANSWER; + case Status.TLE: + return JudgeStatus.TIME_LIMIT_EXCEEDED; + case Status.MLE: + return JudgeStatus.MEMORY_LIMIT_EXCEEDED; + case Status.RE: + return JudgeStatus.RUNTIME_ERROR; + case Status.SE: + return JudgeStatus.SYSTEM_ERROR; + default: + return null; + } +}; + +export const mapSubmissionStatusToJudgeRunStatus = ( + status: Status +): JudgeRunStatus => { + switch (status) { + case Status.AC: + case Status.RU: + return JudgeRunStatus.ACCEPTED; + case Status.WA: + return JudgeRunStatus.WRONG_ANSWER; + case Status.TLE: + return JudgeRunStatus.TIME_LIMIT_EXCEEDED; + case Status.MLE: + return JudgeRunStatus.MEMORY_LIMIT_EXCEEDED; + case Status.RE: + return JudgeRunStatus.RUNTIME_ERROR; + case Status.SE: + return JudgeRunStatus.SYSTEM_ERROR; + default: + return JudgeRunStatus.SYSTEM_ERROR; + } +}; + +export const getOrCreateJudge = async ( + submissionId: string, + initialStatus: JudgeStatus = JudgeStatus.COMPILING +) => { + const existing = await prisma.judge.findUnique({ + where: { submissionId }, + select: { id: true }, + }); + if (existing) return existing.id; + + const created = await prisma.judge.create({ + data: { + submissionId, + status: initialStatus, + }, + select: { id: true }, + }); + return created.id; +}; + +export const updateJudgeBySubmission = async ( + submissionId: string, + status: JudgeStatus, + extra?: { + compileOutput?: string | null; + endTime?: Date | null; + } +) => { + const judgeId = await getOrCreateJudge(submissionId, status); + + await prisma.judge.update({ + where: { id: judgeId }, + data: { + status, + ...(extra?.compileOutput !== undefined + ? { compileOutput: extra.compileOutput } + : {}), + ...(extra?.endTime !== undefined ? { endTime: extra.endTime } : {}), + }, + }); + + return judgeId; +}; diff --git a/src/lib/soketi-client.ts b/src/lib/soketi-client.ts new file mode 100644 index 0000000..4abffb5 --- /dev/null +++ b/src/lib/soketi-client.ts @@ -0,0 +1,25 @@ +"use client"; + +import Pusher from "pusher-js"; + +const key = process.env.NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY ?? "judge4c_key"; +const wsHost = process.env.NEXT_PUBLIC_SOKETI_HOST ?? "localhost"; +const wsPort = Number(process.env.NEXT_PUBLIC_SOKETI_PORT ?? "6001"); +const forceTLS = process.env.NEXT_PUBLIC_SOKETI_USE_TLS === "true"; + +let instance: Pusher | null = null; + +export const getPusherClient = () => { + if (!key) return null; + if (instance) return instance; + + instance = new Pusher(key, { + wsHost, + wsPort, + forceTLS, + enabledTransports: ["ws", "wss"], + cluster: "mt1", + }); + + return instance; +}; diff --git a/src/lib/soketi-server.ts b/src/lib/soketi-server.ts new file mode 100644 index 0000000..959cd15 --- /dev/null +++ b/src/lib/soketi-server.ts @@ -0,0 +1,22 @@ +import "server-only"; + +import Pusher from "pusher"; + +const appId = process.env.SOKETI_DEFAULT_APP_ID; +const key = process.env.NEXT_PUBLIC_SOKETI_DEFAULT_APP_KEY; +const secret = process.env.SOKETI_DEFAULT_APP_SECRET; +const host = process.env.SOKETI_HOST ?? "localhost"; +const port = process.env.SOKETI_PORT ?? "6001"; +const useTLS = process.env.SOKETI_USE_TLS === "true"; + +export const pusherServer = + appId && key && secret + ? new Pusher({ + appId, + key, + secret, + host, + port, + useTLS, + }) + : null; diff --git a/src/lib/submission-status.ts b/src/lib/submission-status.ts new file mode 100644 index 0000000..a6f6aa7 --- /dev/null +++ b/src/lib/submission-status.ts @@ -0,0 +1,70 @@ +import "server-only"; + +import prisma from "@/lib/prisma"; +import { revalidatePath } from "next/cache"; +import { Status, type Submission } from "@/generated/client"; +import { pusherServer } from "@/lib/soketi-server"; + +const publishStatusUpdate = async (submission: Submission) => { + revalidatePath(`/problems/${submission.problemId}`); + + if (!pusherServer) return; + + const payload = { + submissionId: submission.id, + problemId: submission.problemId, + status: submission.status, + timestamp: new Date().toISOString(), + }; + + await pusherServer.trigger(`submission-${submission.id}`, "status-update", payload); + await pusherServer.trigger(`problem-${submission.problemId}`, "status-update", payload); +}; + +export const createSubmissionWithStatus = async (data: { + language: Submission["language"]; + content: string; + status: Status; + userId: string; + problemId: string; + assignmentId?: string | null; + message?: string | null; +}) => { + const submission = await prisma.submission.create({ + data: { + language: data.language, + content: data.content, + status: data.status, + userId: data.userId, + problemId: data.problemId, + assignmentId: data.assignmentId ?? null, + message: data.message ?? null, + }, + }); + + await publishStatusUpdate(submission); + return submission; +}; + +export const updateSubmissionStatus = async ( + submissionId: string, + status: Status, + extra?: { + message?: string | null; + timeUsage?: number | null; + memoryUsage?: number | null; + } +) => { + const submission = await prisma.submission.update({ + where: { id: submissionId }, + data: { + status, + ...(extra?.message !== undefined ? { message: extra.message } : {}), + ...(extra?.timeUsage !== undefined ? { timeUsage: extra.timeUsage } : {}), + ...(extra?.memoryUsage !== undefined ? { memoryUsage: extra.memoryUsage } : {}), + }, + }); + + await publishStatusUpdate(submission); + return submission; +};