From b3178c51869db3c2592fe0a25da32522f1c38eaf Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 17 Jun 2026 14:07:34 +0100 Subject: [PATCH 01/10] chore: switch to oxfmt, oxlint - add ci checks --- .eslintignore | 4 - .github/workflows/code-quality.yml | 73 ++ .github/workflows/pr_checks.yml | 6 + .oxfmtrc.json | 25 + .oxlintrc.json | 24 + .prettierignore | 10 - apps/webapp/.eslintrc | 31 - apps/webapp/.prettierignore | 11 - apps/webapp/package.json | 18 +- apps/webapp/prettier.config.js | 4 - package.json | 7 +- pnpm-lock.yaml | 1778 +++++++--------------------- prettier.config.js | 11 - turbo.json | 69 +- 14 files changed, 594 insertions(+), 1477 deletions(-) delete mode 100644 .eslintignore create mode 100644 .github/workflows/code-quality.yml create mode 100644 .oxfmtrc.json create mode 100644 .oxlintrc.json delete mode 100644 .prettierignore delete mode 100644 apps/webapp/.eslintrc delete mode 100644 apps/webapp/.prettierignore delete mode 100644 apps/webapp/prettier.config.js delete mode 100644 prettier.config.js diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 827344f1f96..00000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -*/**.js -*/**.d.ts -packages/*/dist -packages/*/lib \ No newline at end of file diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml new file mode 100644 index 00000000000..23ad4f79505 --- /dev/null +++ b/.github/workflows/code-quality.yml @@ -0,0 +1,73 @@ +name: "🎨 Format & Lint" + +on: + workflow_call: + +permissions: + contents: read + +jobs: + code-quality: + runs-on: ubuntu-latest + + steps: + - name: ⬇️ Checkout repo + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + fetch-depth: 0 + persist-credentials: false + + - name: ⎔ Setup pnpm + uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v5.0.0 + with: + version: 10.33.2 + + - name: ⎔ Setup node + uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 + with: + node-version: 20.20.2 + cache: "pnpm" + + - name: 📥 Download deps + run: pnpm install --frozen-lockfile + + # Gate only on files this PR adds/modifies (ratchet) — the repo is not + # fully formatted/linted yet, so a whole-repo check would fail every PR. + - name: 🔍 Determine changed files + id: changes + env: + BASE_SHA: ${{ github.event.pull_request.base.sha }} + run: | + FILES=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- \ + '*.ts' '*.tsx' '*.js' '*.jsx' '*.mjs' '*.cjs') + echo "Changed code files:" + echo "${FILES:-}" + { + echo "files<> "$GITHUB_OUTPUT" + if [ -z "$FILES" ]; then + echo "has_files=false" >> "$GITHUB_OUTPUT" + else + echo "has_files=true" >> "$GITHUB_OUTPUT" + fi + + # TODO enable format check for ALL code + - name: 💅 Check formatting + if: steps.changes.outputs.has_files == 'true' + env: + FILES: ${{ steps.changes.outputs.files }} + # Unquoted $FILES intentionally word-splits the newline-separated list + # into separate path args. Safe given the has_files guard above. + run: pnpm exec oxfmt --check $FILES + + # TODO update this so lint failures fail CI + # Informational only — lint findings are surfaced in the logs but never + # fail the job. Only the formatting check above blocks the PR. + - name: 🔎 Lint (informational, non-blocking) + if: steps.changes.outputs.has_files == 'true' + continue-on-error: true + env: + FILES: ${{ steps.changes.outputs.files }} + run: pnpm exec oxlint $FILES diff --git a/.github/workflows/pr_checks.yml b/.github/workflows/pr_checks.yml index 95805539807..1fb3a47a45c 100644 --- a/.github/workflows/pr_checks.yml +++ b/.github/workflows/pr_checks.yml @@ -102,6 +102,11 @@ jobs: - 'pnpm-workspace.yaml' - 'turbo.json' + code-quality: + needs: changes + if: needs.changes.outputs.code == 'true' + uses: ./.github/workflows/code-quality.yml + typecheck: needs: changes if: needs.changes.outputs.code == 'true' || needs.changes.outputs.typecheck_self == 'true' @@ -155,6 +160,7 @@ jobs: name: All PR Checks needs: - changes + - code-quality - typecheck - webapp - e2e-webapp diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000000..90f19a65790 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,25 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "semi": true, + "singleQuote": false, + "jsxSingleQuote": false, + "trailingComma": "es5", + "bracketSpacing": true, + "bracketSameLine": false, + "printWidth": 100, + "tabWidth": 2, + "useTabs": false, + "sortPackageJson": false, + "ignorePatterns": [ + "node_modules", + ".env", + ".env.local", + "pnpm-lock.yaml", + "tailwind.css", + ".babelrc.json", + "**/.react-email/", + "**/storybook-static/", + "**/.changeset/", + "**/dist/", + ] +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 00000000000..463fa955515 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,24 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["typescript", "import", "react"], + "ignorePatterns": [ + "**/dist/**", + "**/build/**", + "**/*.d.ts", + "**/seed.js", + "**/seedCloud.ts", + "**/populate.js" + ], + "rules": { + "consistent-type-imports": [ + "warn", + { + "prefer": "type-imports", + "disallowTypeAnnotations": true, + "fixStyle": "inline-type-imports" + } + ], + "import/no-duplicates": ["warn", { "prefer-inline": true }], + "react-hooks/rules-of-hooks": "error" + } +} diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index a34447dd45d..00000000000 --- a/.prettierignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules -.env -.env.local -pnpm-lock.yaml -tailwind.css -.babelrc.json -**/.react-email/ -**/storybook-static/ -**/.changeset/ -**/dist/ \ No newline at end of file diff --git a/apps/webapp/.eslintrc b/apps/webapp/.eslintrc deleted file mode 100644 index f292eef3cce..00000000000 --- a/apps/webapp/.eslintrc +++ /dev/null @@ -1,31 +0,0 @@ -{ - "plugins": ["react-hooks", "@typescript-eslint/eslint-plugin", "import"], - "parser": "@typescript-eslint/parser", - "overrides": [ - { - "files": ["*.ts", "*.tsx"], - "rules": { - // Autofixes imports from "@trigger.dev/core" to fine grained modules - // "@trigger.dev/no-trigger-core-import": "error", - // Normalize `import type {}` and `import { type }` - "@typescript-eslint/consistent-type-imports": [ - "warn", - { - // the "type" annotation can get tangled and cause syntax errors - // during some autofixes, so easier to just turn it off - "prefer": "type-imports", - "disallowTypeAnnotations": true, - "fixStyle": "inline-type-imports" - } - ], - // no-trigger-core-import splits imports into multiple lines - // this one merges them back into a single line - // if they still import from the same module - "import/no-duplicates": ["warn", { "prefer-inline": true }], - // lots of undeclared vars, enable this rule if you want to clean them up - "turbo/no-undeclared-env-vars": "off" - } - } - ], - "ignorePatterns": ["seed.js", "seedCloud.ts", "populate.js"] -} diff --git a/apps/webapp/.prettierignore b/apps/webapp/.prettierignore deleted file mode 100644 index 835d1a6cdd7..00000000000 --- a/apps/webapp/.prettierignore +++ /dev/null @@ -1,11 +0,0 @@ -node_modules - -/build -/public/build -.env - -/cypress/screenshots -/cypress/videos -/postgres-data - -/app/styles/tailwind.css \ No newline at end of file diff --git a/apps/webapp/package.json b/apps/webapp/package.json index 31d78667323..88d5b71acfc 100644 --- a/apps/webapp/package.json +++ b/apps/webapp/package.json @@ -10,8 +10,8 @@ "build:sentry": "esbuild --platform=node --format=cjs --outbase=. ./sentry.server.ts ./app/utils/sentryTraceContext.server.ts --outdir=build --sourcemap", "dev": "cross-env PORT=3030 remix dev -c \"node ./build/server.js\"", "dev:worker": "cross-env NODE_PATH=../../node_modules/.pnpm/node_modules node ./build/server.js", - "format": "prettier --write .", - "lint": "eslint --cache --cache-location ./node_modules/.cache/eslint .", + "format": "oxfmt .", + "lint": "oxlint -c ../../.oxlintrc.json", "start": "cross-env NODE_ENV=production node --max-old-space-size=8192 ./build/server.js", "start:local": "cross-env node --max-old-space-size=8192 ./build/server.js", "typecheck": "cross-env NODE_OPTIONS=\"--max-old-space-size=8192\" tsc --noEmit -p ./tsconfig.check.json", @@ -21,11 +21,6 @@ "test": "vitest --no-file-parallelism", "eval:dev": "evalite watch" }, - "eslintIgnore": [ - "/node_modules", - "/build", - "/public/build" - ], "dependencies": { "@ai-sdk/openai": "^3.0.0", "@ai-sdk/react": "^3.0.0", @@ -242,7 +237,6 @@ "@internal/replication": "workspace:*", "@internal/testcontainers": "workspace:*", "@remix-run/dev": "2.17.4", - "@remix-run/eslint-config": "2.17.4", "@remix-run/testing": "^2.17.4", "@sentry/cli": "2.50.2", "@swc/core": "^1.3.4", @@ -253,7 +247,6 @@ "@types/bcryptjs": "^2.4.2", "@types/compression": "^1.7.2", "@types/cookie": "^0.6.0", - "@types/eslint": "^8.4.6", "@types/express": "^4.17.13", "@types/humanize-duration": "^3.27.1", "@types/json-query": "^2.2.3", @@ -274,19 +267,12 @@ "@types/supertest": "^6.0.2", "@types/tar": "^6.1.4", "@types/ws": "^8.5.3", - "@typescript-eslint/eslint-plugin": "^5.59.6", - "@typescript-eslint/parser": "^5.59.6", "autoevals": "^0.0.130", "autoprefixer": "^10.4.13", "css-loader": "^6.10.0", "datepicker": "link:@types/@react-aria/datepicker", "engine.io": "^6.5.4", "esbuild": "^0.15.10", - "eslint": "^8.24.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-turbo": "^2.0.4", "evalite": "1.0.0-beta.16", "npm-run-all": "^4.1.5", "postcss-import": "^16.0.1", diff --git a/apps/webapp/prettier.config.js b/apps/webapp/prettier.config.js deleted file mode 100644 index f652d8bf750..00000000000 --- a/apps/webapp/prettier.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - ...require("../../prettier.config.js"), - plugins: [require("prettier-plugin-tailwindcss")], -}; diff --git a/package.json b/package.json index 1753f9464e9..5063c83f987 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,9 @@ "dev": "turbo run dev", "i:dev": "infisical run -- turbo run dev", "generate": "turbo run generate", - "lint": "turbo run lint", + "format": "oxfmt .", + "lint": "oxlint", + "lint:fix": "oxlint --fix", "docker": "node scripts/docker.mjs -f docker/docker-compose.yml up -d --build --remove-orphans", "docker:stop": "node scripts/docker.mjs -f docker/docker-compose.yml stop", "docker:full": "node scripts/docker.mjs -f docker/docker-compose.yml -f docker/docker-compose.extras.yml up -d --build --remove-orphans", @@ -57,8 +59,9 @@ "@types/node": "20.14.14", "@vitest/coverage-v8": "4.1.7", "autoprefixer": "^10.4.12", - "eslint-plugin-turbo": "^2.0.4", "lefthook": "^1.11.3", + "oxfmt": "^0.54.0", + "oxlint": "^1.69.0", "pkg-pr-new": "0.0.75", "pkg-types": "1.1.3", "prettier": "^3.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8327a809fef..cb4ac31aac9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,12 +114,15 @@ importers: autoprefixer: specifier: ^10.4.12 version: 10.4.13(postcss@8.5.10) - eslint-plugin-turbo: - specifier: ^2.0.4 - version: 2.0.5(eslint@8.31.0) lefthook: specifier: ^1.11.3 version: 1.11.3 + oxfmt: + specifier: ^0.54.0 + version: 0.54.0 + oxlint: + specifier: ^1.69.0 + version: 1.69.0 pkg-pr-new: specifier: 0.0.75 version: 0.0.75 @@ -899,9 +902,6 @@ importers: '@remix-run/dev': specifier: 2.17.4 version: 2.17.4(@remix-run/react@2.17.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.4))(@remix-run/serve@2.17.4(typescript@5.5.4))(@types/node@20.14.14)(bufferutil@4.0.9)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.46.1)(tsx@4.20.6)(typescript@5.5.4)(vite@6.4.2(@types/node@20.14.14)(jiti@2.6.1)(lightningcss@1.29.2)(terser@5.46.1)(tsx@4.20.6)(yaml@2.9.0))(yaml@2.9.0) - '@remix-run/eslint-config': - specifier: 2.17.4 - version: 2.17.4(eslint@8.31.0)(react@18.2.0)(typescript@5.5.4) '@remix-run/testing': specifier: ^2.17.4 version: 2.17.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.5.4) @@ -932,9 +932,6 @@ importers: '@types/cookie': specifier: ^0.6.0 version: 0.6.0 - '@types/eslint': - specifier: ^8.4.6 - version: 8.4.10 '@types/express': specifier: ^4.17.13 version: 4.17.15 @@ -995,12 +992,6 @@ importers: '@types/ws': specifier: ^8.5.3 version: 8.5.4 - '@typescript-eslint/eslint-plugin': - specifier: ^5.59.6 - version: 5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4) - '@typescript-eslint/parser': - specifier: ^5.59.6 - version: 5.59.6(eslint@8.31.0)(typescript@5.5.4) autoevals: specifier: ^0.0.130 version: 0.0.130(encoding@0.1.13)(ws@8.12.0(bufferutil@4.0.9)) @@ -1019,21 +1010,6 @@ importers: esbuild: specifier: ^0.15.10 version: 0.15.18 - eslint: - specifier: ^8.24.0 - version: 8.31.0 - eslint-config-prettier: - specifier: ^8.5.0 - version: 8.6.0(eslint@8.31.0) - eslint-plugin-import: - specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0) - eslint-plugin-react-hooks: - specifier: ^4.6.2 - version: 4.6.2(eslint@8.31.0) - eslint-plugin-turbo: - specifier: ^2.0.4 - version: 2.0.5(eslint@8.31.0) evalite: specifier: 1.0.0-beta.16 version: 1.0.0-beta.16(ai@6.0.168(zod@3.25.76))(better-sqlite3@11.10.0)(bufferutil@4.0.9) @@ -3006,13 +2982,6 @@ packages: resolution: {integrity: sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.21.8': - resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': '>=7.11.0' - eslint: ^7.5.0 || ^8.0.0 - '@babel/generator@7.24.7': resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} @@ -3167,42 +3136,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-display-name@7.18.6': - resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.18.6': - resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.22.15': - resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.18.6': - resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.21.3': resolution: {integrity: sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-react@7.18.6': - resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.21.5': resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==} engines: {node: '>=6.9.0'} @@ -4556,20 +4495,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.5.1': - resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@1.4.1': - resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@fastify/accept-negotiator@2.0.1': resolution: {integrity: sha512-/c/TW2bO/v9JeEgoD/g1G5GxGeCF1Hafdf79WPmUlgYiBXummY0oX3VVq4yFkKKVBKDNlaDUYoab7g38RpPqCQ==} @@ -4743,19 +4668,6 @@ packages: peerDependencies: '@hono/node-server': ^1.11.1 - '@humanwhocodes/config-array@0.11.8': - resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead - '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -4935,9 +4847,6 @@ packages: '@cfworker/json-schema': optional: true - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@nodable/entities@2.1.0': resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} @@ -5502,6 +5411,250 @@ packages: peerDependencies: '@opentelemetry/api': ^1.1.0 + '@oxfmt/binding-android-arm-eabi@0.54.0': + resolution: {integrity: sha512-NAtpl/SiaeU103e7/OmZw0MvUnsUUopW7hEm/ecegJg7YM0skQaA0IXEZoyTV6NUdiNPupdIUreRqUZTShbn/g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.54.0': + resolution: {integrity: sha512-B4VZfBUlKK1rmMChsssNZbkZjE8+FzG3avMjGgMDwbGxXRoXkoeXiAZ+78Oa+eyDPHvDCiUb4zH/vmCOUSafLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.54.0': + resolution: {integrity: sha512-i02vF75b+ePsQP3tHqSxVYI5S6b8X/xqdPu7/mDHXtpgXLTYXi3jJmfHU0j+dnZZDKaYTx/ioCK7QYJmtiJR2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.54.0': + resolution: {integrity: sha512-8VMFvGvooXj7mswkbrhdVZ2/sgiDaBzWpkkbtO+qGDLV4EfJd67nQadHkQC0ZNbaWA9ajXfqI6i7PZLIeDzxEQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.54.0': + resolution: {integrity: sha512-0cRHnp43WN1Jrc5s0BdbdKgR1XirdvHy7TAFi3JEsoEVQVJxTXMbpVd76sxXlgRswNMDhVFSJw+y7Eb8mEavFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.54.0': + resolution: {integrity: sha512-JyQAk3hK/OEtup7Rw6kZwfdzbKqTVD5jXXb8Xpfay29suwZyfBDMVW/bj4RqEPySYWc6zCp198pOluf8n5uYzg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.54.0': + resolution: {integrity: sha512-qnvLatTpM8vtvjOfcckBOzJjk+n6ce/wwpP8OFeUrD5aNLYcKyWAitwj+Rk3PK9jGanbZvKsJnv14JGQ6XqFdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.54.0': + resolution: {integrity: sha512-SMkhnCzIYZYDk9vw3W/80eeYKmrMpGF0Giuxt4HruFlCH7jEtnPeb3SdQKMfgYi/dgtaf+hZAb5XWPYnxqCQ3w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.54.0': + resolution: {integrity: sha512-QrwJlBFFKnxOd95TAaszpMbZBLzMoYMpGaQTZF8oibacnF5rv8l12IhILhQRPmksWiBqg0YSe2Mnl7ayeJAHSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.54.0': + resolution: {integrity: sha512-WILatiol/TUHTlhod7R09+7Az/XlhKwmY1MHfLZNmewltPWNN/EwxP2rQSHahibZ/cB8gmckEBjBOByD+5bYsQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.54.0': + resolution: {integrity: sha512-f05YMG4BH4G8S4ME6UM6fi1MnJ9094mrnvO5Pa4SJlMfWlUM+1/ZWMEF4NnjM7shZAvbHsHRuVYpUo0PHC4P9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.54.0': + resolution: {integrity: sha512-UfL+2hj1ClNqcCRT9s8vBU4axDpjxgVxX96G+9DYAYjoc5b0u15CJtn2jgsi9iM+EbGNc5CW1HVRgwVu76UsSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.54.0': + resolution: {integrity: sha512-3/XZe931Hka+J6NjnaqJzYpsWWxDTuRdUdwSQHnOuJEgbC+SehIMFJS8hsEjV7LBhVSL2OCnRLvbVW8O97XIyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.54.0': + resolution: {integrity: sha512-Ik93RlObtu43GbxApafayFjwYE06L6Xr08cSwpBPYbDrLp2ReZx0Jm1DqwRyYRnukUJy+rK2WaEvUQOxdytU9Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.54.0': + resolution: {integrity: sha512-yZcakmPlD86CNymknd7KfW+FH+qfbqJH+i0h69CYfV1+KMoVeM9UED+8+TDVoU4haxI0NxY7RPCvRLy3Sqd2Qg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.54.0': + resolution: {integrity: sha512-GiVBZNnEZnKu00f1jTg49nomv187d0GQX+O+ocykoLeiaALuEO+swoTehHn9TehTfi7V8H0i0e/yvUjCqnwk1w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.54.0': + resolution: {integrity: sha512-J0SSB8Z1Fre2sxRolYcW6Rl1RQmKdQ2hnHyq4YJrfBRiXTObLw4DXnIVraM/UyqGqwOi7yTrQA4VT7DPxlHVKA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.54.0': + resolution: {integrity: sha512-O61UDVj8zz6yXJjkHPf05VaMLOXmEF8P5kf/N0W7AQMmd6bcQogl+KJc7rMutKTL524oE9iH32JXZClBFmEQIg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.54.0': + resolution: {integrity: sha512-1MDpqJPiFqxWtIHas8vkb1VZ7f7eKyTffAwmO8isxQYMaG1OFKsH666BWLeXQLO+IWNfiMssLD55hbR1lIPTqg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.69.0': + resolution: {integrity: sha512-DKQQbD5cZ/MYfDgDI7YGyGD9FSxABlsBsYFo5p26lloob543tP9+4N3guwdXIYJN+7HSZxLe8YJuwcOWw5qnHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.69.0': + resolution: {integrity: sha512-lEhb+I5pr4inux+JFwfCa1HRq3Os7NirEFQ0H1I35SVEHPm6byX0Ah47xmRha3qi6LAkxUcxViL8o/9PivjzBg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.69.0': + resolution: {integrity: sha512-GY2YE8lOZW59BW1Ia1y+1gR0XyjrZRvVWHAr8LGeGhYHE0OQJ/7cRKXTkx1P+E9/6awEc3SX8a68SFTjh/E//A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.69.0': + resolution: {integrity: sha512-ax1oZnOjHX3LB7myQyHEaQkDwfLb6str3/nSP6O7EVUviQGNkEGzGV0EqcBJWK+Ufwx0l4xPgyYayurvhAdl2Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.69.0': + resolution: {integrity: sha512-kHWeHv4g2h8NY+mpCxzCtY4uerMJWTN/TSnNj1CPbakFpHEJ6cTya2wWV0pDSYWOJ2+0UiEbhn3AtXxHtsnKjg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.69.0': + resolution: {integrity: sha512-gq84vM1a1oEehXo27YCDzGVcxPsZDI1yswZwz2Da1/cbnWtrL16XZZnz0G/+gIU8edtHpfjxq5c+vWEHqJfWoQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.69.0': + resolution: {integrity: sha512-kIqEa98JQ0VRyrcncxA417m2AzasqTlD+FyVT1AksjvjkqQcvm7pBWYvoW3/mpyOP2XYvi5nSCCTIe6De1yu5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.69.0': + resolution: {integrity: sha512-j+xYiXozxGWx2cpjCrwwGR4awTxPFsRv3JZrv23RCogEPMc4R7UqjHW47p/RG0aRlbWiROCJ8coUfCwy0dvzHA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.69.0': + resolution: {integrity: sha512-xEPpNppTfN1l/nM7gYSf9iocscu/as+p/7vxkLeLEKnYU+09Dm+5V6IhDYDh+Uz6FajEupWwCLt5SOG0y1PCKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.69.0': + resolution: {integrity: sha512-Ug0+eU7HJBlek+SjklYH62IlOMirEJsdxpihH0kSqX0XdrDD4NdHpQc10fK1JC35yn6KrrcN+uYzlHD38XAf8Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.69.0': + resolution: {integrity: sha512-iEyI3GIg0l/s3G4qy2TlaaWKdzj4PJJStwtlocpDTC00PY9hZueotf6OKUj9+yfQh0lrpBW/pLMgTztbAHKJEg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.69.0': + resolution: {integrity: sha512-NjHjpiI4WIKSMwuoJSZi5VToPeoYOS1FR52HLIDG6lidMdqquusgtODb4iLk0+lb1q3Z0nv2/aPRcC/olmpQGg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.69.0': + resolution: {integrity: sha512-Ai/prDewoItkDXbp38gwGZi41DycZbUTZJ3UidwoHgQC0/DaqC2TGdtBTQLJ6hSD+SAxASzh8+/eSBPmxfOacA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.69.0': + resolution: {integrity: sha512-Gt3KHgp46mRKz4sJeaASmKvD8ayXookRw07RMf+NowhEztGGDZ7VrXpoW96XuKJLjFukWizOFVNjmYb/u7caNQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.69.0': + resolution: {integrity: sha512-7tQhJ2+p/oHv1zcfnjYI7YVzC/7iBaVOfIvFYtxdJ5F45mWgEdrCyXZXZGfiLey5t/5JhOhsaMnnv1kAzckd7g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxlint/binding-openharmony-arm64@1.69.0': + resolution: {integrity: sha512-vmWz6TKp/3hfA4lksR0zHBv/6xuX1jhym6eqOjdH2DXsDDHZWcp2f0KG0VCAnlVbIrjk29G4wAWMXb/Hn1YobA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.69.0': + resolution: {integrity: sha512-9RExaLgmaw6IoIkU9cTpT71mLfI0xZ86iZH8x518LVsOkjquJMYqb9P7KpC8lgd1t0Dxs41p2pxynq4XR3Ttzw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.69.0': + resolution: {integrity: sha512-1907kRPF8/PrcIw1E7LMs9JbVrpgnt/MvFdss3an8oDkYNAACXzTntV3t3869ZZhMZxb2AzRGbz1pA/jdFatXA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.69.0': + resolution: {integrity: sha512-w8SOXv3mT9Fi6jY8OXdXCfnvX/3KNLXGNr4HEz2TA7S4Mv/PYAOmpB8y/ge40mxvBMgGNaSaaDwZpAsQn7HtWA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@pinojs/redact@0.4.0': resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} @@ -5509,10 +5662,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@pkgr/utils@2.3.1': - resolution: {integrity: sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.37.0': resolution: {integrity: sha512-181WBLk4SRUyH1Q96VZl7BP6HcK0b7lbdeKisn3N/vnjitk+9HbdlFz/L5fey05vxaAhldIDnzo8KUoy8S3mmQ==} engines: {node: '>=16'} @@ -6893,17 +7042,6 @@ packages: wrangler: optional: true - '@remix-run/eslint-config@2.17.4': - resolution: {integrity: sha512-Hhslms8Kl0fXHDS5UJWwyJ/1YQzJhRLjNZF+IfRLmCHI/zCvJP4dfy9yiT5BHnHb/m6MUz3l1L8EpPItg0dD5Q==} - engines: {node: '>=18.0.0'} - peerDependencies: - eslint: ^8.0.0 - react: ^18.0.0 - typescript: 5.5.4 - peerDependenciesMeta: - typescript: - optional: true - '@remix-run/express@2.17.4': resolution: {integrity: sha512-4zZs0L7v2pvAq896zHRLNMhoOKIPXM9qnYdHLbz4mpZUMbNAgQacGazArIrUV3M4g0gRMY0dLrt5CqMNrlBeYg==} engines: {node: '>=18.0.0'} @@ -7133,9 +7271,6 @@ packages: cpu: [x64] os: [win32] - '@rushstack/eslint-patch@1.2.0': - resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} - '@s2-dev/streamstore@0.22.10': resolution: {integrity: sha512-dtm+oFHVE8szINwOUoNQdx9xpGSJOrcAEvsxspPFvomjYKGnmhIRmU4OX8o6kxcPoiK76S1tPeU0smjZdmOngA==} @@ -8122,10 +8257,6 @@ packages: '@testcontainers/redis@11.14.0': resolution: {integrity: sha512-WX005slz2JMQPw2avbSjf5awVjpmFhOs5xCxeGSYLcV5ia4W1edv/P6MdOw4dZnvDQDuN5LfqNoV/ut3XGb2pA==} - '@testing-library/dom@8.19.1': - resolution: {integrity: sha512-P6iIPyYQ+qH8CvGauAqanhVnjrnRe0IZFSYCeGkSRW9q3u8bdVn2NPI+lasFyVsEQn1J/IFmp5Aax41+dAP9wg==} - engines: {node: '>=12'} - '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -8144,9 +8275,6 @@ packages: '@types/acorn@4.0.6': resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - '@types/aria-query@5.0.1': - resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} - '@types/aws-lambda@8.10.152': resolution: {integrity: sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==} @@ -8304,18 +8432,12 @@ packages: '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - '@types/eslint@8.4.10': - resolution: {integrity: sha512-Sl/HOqN8NKPmhWo2VBEPm0nvHnu2LL3v9vKo8MEq0EtbJ4eVzGPl41VNPvn5E1i5poMk4/XD8UriLHpJvEP/Nw==} - '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} '@types/estree-jsx@1.0.0': resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} - '@types/estree@1.0.0': - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -8364,12 +8486,6 @@ packages: '@types/json-query@2.2.3': resolution: {integrity: sha512-ygE4p8lyKzTBo9LF2K/u6MHnxPxbHY6wGvwM7TdAKhbP3SvEf+Y9aeVWedDiP8SMIPowTl9R/6awQYjiUTHz2g==} - '@types/json-schema@7.0.11': - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} - - '@types/json-schema@7.0.13': - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -8593,64 +8709,6 @@ packages: '@types/ws@8.5.4': resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} - '@typescript-eslint/eslint-plugin@5.59.6': - resolution: {integrity: sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@5.59.6': - resolution: {integrity: sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@5.59.6': - resolution: {integrity: sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/type-utils@5.59.6': - resolution: {integrity: sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@5.59.6': - resolution: {integrity: sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/typescript-estree@5.59.6': - resolution: {integrity: sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@5.59.6': - resolution: {integrity: sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@5.59.6': - resolution: {integrity: sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@uiw/codemirror-extensions-basic-setup@4.19.5': resolution: {integrity: sha512-1zt7ZPJ01xKkSW/KDy0FZNga0bngN1fC594wCVG7FBi60ehfcAucpooQ+JSPScKXopxcb+ugPKZvVLzr9/OfzA==} peerDependencies: @@ -9025,10 +9083,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -9072,9 +9126,6 @@ packages: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} - aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} - arktype@2.1.20: resolution: {integrity: sha512-IZCEEXaJ8g+Ijd59WtSYwtjnqXiwM8sWQ5EjGamcto7+HVN9eK0C4p0zDlCuAwWhpqr6fIBkxPuYDl4/Mcj/+Q==} @@ -9085,33 +9136,14 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.1: - resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} - arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} @@ -9141,9 +9173,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - ast-v8-to-istanbul@1.0.2: resolution: {integrity: sha512-dKmJxJsGItLmc5CYZKuEjuG6GnBs6PG4gohMhyFOWKaNQoYCuRZJDECaBlHmcG0lv2wc2E0uU8lESmBEumC3DQ==} @@ -9201,16 +9230,9 @@ packages: aws4fetch@1.0.18: resolution: {integrity: sha512-3Cf+YaUl07p24MoQ46rFwulAmiyCwH2+1zw1ZyPAX5OtJ34Hh185DwB8y/qRLb6cYYYtSFJ9pthyLc0MD4e8sQ==} - axe-core@4.6.2: - resolution: {integrity: sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg==} - engines: {node: '>=4'} - axios@1.16.1: resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} - axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} @@ -10154,9 +10176,6 @@ packages: dagre-d3-es@7.0.14: resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -10205,14 +10224,6 @@ packages: supports-color: optional: true - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -10240,15 +10251,6 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -10287,9 +10289,6 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - deep-object-diff@1.1.9: resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} @@ -10319,10 +10318,6 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} @@ -10434,17 +10429,6 @@ packages: resolution: {integrity: sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==} engines: {node: '>= 8.0'} - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - dom-accessibility-api@0.5.15: - resolution: {integrity: sha512-8o+oVqLQZoruQPYy3uAAQtc6YbtSiRq5aPJBhJ82YTJRHvI6ofhYAkC81WmjFTnfUbqg6T3aCglIpU9p/5e7Cw==} - dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} @@ -10468,10 +10452,6 @@ packages: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} - dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dotenv@16.4.4: resolution: {integrity: sha512-XvPXc8XAQThSjAbY6cQ/9PcBXmFoWuw1sQ3b8HqUCR6ziGXjkTi//kB9SWa2UwqlgdAIuRqAa/9hVljzPehbYg==} engines: {node: '>=12'} @@ -10846,181 +10826,19 @@ packages: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - escape-string-regexp@5.0.0: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-config-prettier@8.6.0: - resolution: {integrity: sha512-bAF0eLpLVqP5oEVUFKpMA+NnRFICwn9X8B5jrR9FcqnYBuPbqWEjTEspPWMj5ye6czoSLDweCzSo3Ko7gGrZaA==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-import-resolver-node@0.3.7: - resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.5.5: - resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - - eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-es@3.0.1: - resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=4.19.1' - - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jest-dom@4.0.3: - resolution: {integrity: sha512-9j+n8uj0+V0tmsoS7bYC7fLhQmIvjRqRYEcbDSi+TKPsTThLLXCyj5swMSSf/hTleeMktACnn+HFqXBr5gbcbA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'} - peerDependencies: - eslint: ^6.8.0 || ^7.0.0 || ^8.0.0 - - eslint-plugin-jest@26.9.0: - resolution: {integrity: sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - - eslint-plugin-jsx-a11y@6.7.1: - resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-node@11.1.0: - resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} - engines: {node: '>=8.10.0'} - peerDependencies: - eslint: '>=5.16.0' - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.32.2: - resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - - eslint-plugin-testing-library@5.11.0: - resolution: {integrity: sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} - peerDependencies: - eslint: ^7.5.0 || ^8.0.0 - - eslint-plugin-turbo@2.0.5: - resolution: {integrity: sha512-nCTXZdaKmdRybBdjnMrDFG+ppLc9toUqB01Hf0pfhkQw8OoC29oJIVPsCSvuL/W58RKD02CNEUrwnVt57t36IQ==} - peerDependencies: - eslint: '>6.6.0' - eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.1.1: - resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} - - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - - eslint-visitor-keys@3.3.0: - resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.2: - resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.31.0: - resolution: {integrity: sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - espree@9.4.1: - resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - espree@9.6.0: - resolution: {integrity: sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -11061,10 +10879,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - etag@1.8.1: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} @@ -11229,9 +11043,6 @@ packages: fast-json-stringify@6.0.1: resolution: {integrity: sha512-s7SJE83QKBZwg54dIbD5rCtzOBVD43V1ReWXXYqBgwCwHLYAAT0RQc/FmrQglXqWPpz6omtryJQOau5jI4Nrvg==} - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-npm-meta@0.2.2: resolution: {integrity: sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==} @@ -11325,10 +11136,6 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - file-type@19.6.0: resolution: {integrity: sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==} engines: {node: '>=18'} @@ -11367,13 +11174,6 @@ packages: find-yarn-workspace-root2@1.2.16: resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} @@ -11625,10 +11425,6 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@13.19.0: - resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} - engines: {node: '>=8'} - globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} @@ -11637,9 +11433,6 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -12070,11 +11863,6 @@ packages: is-deflate@1.0.0: resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - is-docker@3.0.0: resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12135,10 +11923,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -12218,10 +12002,6 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -12324,9 +12104,6 @@ packages: resolution: {integrity: sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==} engines: {node: '>=0.10.0'} - js-sdsl@4.2.0: - resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} - js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -12389,9 +12166,6 @@ packages: json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.3.0: resolution: {integrity: sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==} engines: {node: '>= 0.4'} @@ -12441,10 +12215,6 @@ packages: resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} engines: {node: '>=0.6.0'} - jsx-ast-utils@3.3.3: - resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} - engines: {node: '>=4.0'} - junk@4.0.1: resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} engines: {node: '>=12.20'} @@ -12487,12 +12257,6 @@ packages: resolution: {integrity: sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} - language-subtag-registry@0.3.22: - resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - - language-tags@1.0.5: - resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} - layerr@2.0.1: resolution: {integrity: sha512-z0730CwG/JO24evdORnyDkwG1Q7b7mF2Tp1qRQ0YvrMMARbt1DFG694SOv439Gm7hYKolyZyaB49YIrYIfZBdg==} @@ -12563,10 +12327,6 @@ packages: resolution: {integrity: sha512-HJp37y62j3j8qzAOODWuUJl4ysLwsDvCTBV6odr3jIRHR/a5e+tI14VQGIBcpK9ysqC3pGWyW5Rp9Jv1YDubyw==} hasBin: true - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} @@ -12809,10 +12569,6 @@ packages: resolution: {integrity: sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==} engines: {node: '>=12'} - lz-string@1.4.4: - resolution: {integrity: sha512-0ckx7ZHRPqb0oUm8zNr+90mtf9DQB60H1wMCjBtfi62Kl3a7JbHob6gA2bC+xRvZoOL+1hzUK8jeuEIQE8svEQ==} - hasBin: true - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -13450,12 +13206,6 @@ packages: napi-build-utils@2.0.0: resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - nearley@2.20.1: resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} hasBin: true @@ -13661,25 +13411,6 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.entries@1.1.6: - resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.hasown@1.1.2: - resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -13741,10 +13472,6 @@ packages: resolution: {integrity: sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A==} engines: {node: '>=18'} - open@8.4.0: - resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} - engines: {node: '>=12'} - openai@4.33.1: resolution: {integrity: sha512-0DH572aSxGTT1JPOXgJQ9mjiuSPg/7scPot8hLc5I1mfQxPxLXTZWJpWerKaIWOuPkR2nrB0SamGDEehH8RuWA==} hasBin: true @@ -13767,10 +13494,6 @@ packages: openid-client@6.3.3: resolution: {integrity: sha512-lTK8AV8SjqCM4qznLX0asVESAwzV39XTVdfMAM185ekuaZCnkWdPzcxMTXNlsm9tsUAMa1Q30MBmKAykdT1LWw==} - optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -13785,6 +13508,32 @@ packages: outdent@0.8.0: resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + oxfmt@0.54.0: + resolution: {integrity: sha512-DjnMwn7smSLF+Mc2+pRItnuPftm/dkUFpY/d4+33y9TfKrsHZo8GLhmUg9BrOIUEy94Rlom1Q11N6vuhE+e0oQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.69.0: + resolution: {integrity: sha512-ypZkK/aDc5NQV8zIR6s2H2Tl3aNW8FmJ1m9+2qsaYuRenl8vgnHNCGwTHviWJdUQzglOlHFchgopdtGhSy17Rw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.22.1' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true + p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} @@ -14397,10 +14146,6 @@ packages: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} engines: {node: '>=10'} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} @@ -14472,10 +14217,6 @@ packages: engines: {node: '>=14'} hasBin: true - pretty-format@27.5.1: - resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} - engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} - pretty-hrtime@1.0.3: resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} engines: {node: '>= 0.8'} @@ -14737,9 +14478,6 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@17.0.2: - resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} @@ -14969,10 +14707,6 @@ packages: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - registry-auth-token@4.2.2: resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} engines: {node: '>=6.0.0'} @@ -15127,10 +14861,6 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - requireindex@1.2.0: - resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} - engines: {node: '>=0.10.5'} - resend@3.2.0: resolution: {integrity: sha512-lDHhexiFYPoLXy7zRlJ8D5eKxoXy6Tr9/elN3+Vv7PkUoYuSSD1fpiIfa/JYXEWyiyN2UczkCTLpkT8dDPJ4Pg==} engines: {node: '>=18'} @@ -15161,10 +14891,6 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true - resolve@2.0.0-next.4: - resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} - hasBin: true - responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} @@ -15198,11 +14924,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@6.0.1: resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} engines: {node: 20 || >=22} @@ -15668,9 +15389,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string.prototype.matchall@4.0.8: - resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} - string.prototype.padend@3.1.4: resolution: {integrity: sha512-67otBXoksdjsnXXRUq+KMVTdlVRZ2af422Y0aTyTjVaoQkGr3mxl2Bc5emi7dOQ3OGVVQQskmLEWwFXwommpNw==} engines: {node: '>= 0.4'} @@ -15733,10 +15451,6 @@ packages: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - strnum@1.0.5: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} @@ -15838,10 +15552,6 @@ packages: engines: {node: 20 || >=22} hasBin: true - synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - systeminformation@5.31.7: resolution: {integrity: sha512-/8NC53e5nP9nmhn42/ncdOkyJnOoue/Vy+tJOyUGd1Yv66G069wK4rrziwhrqDETgk78CudTQupw5z19S5uoZw==} engines: {node: '>=8.0.0'} @@ -15892,10 +15602,6 @@ packages: tailwindcss@4.3.0: resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -15964,9 +15670,6 @@ packages: text-decoder@1.2.0: resolution: {integrity: sha512-n1yg1mOj9DNpk3NeZOx7T6jchTbyJS3i3cucbNN6FcdPriMZx7NsgrGpWWdWZZGxD7ES1XB+3uoqHMgOKaN+fg==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -15992,9 +15695,6 @@ packages: tiny-case@1.0.3: resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} @@ -16039,6 +15739,10 @@ packages: tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@3.1.0: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} @@ -16178,9 +15882,6 @@ packages: tsconfig-paths@3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} @@ -16224,12 +15925,6 @@ packages: typescript: optional: true - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: 5.5.4 - tsx@3.12.2: resolution: {integrity: sha512-ykAEkoBg30RXxeOMVeZwar+JH632dZn9EUJVyJwhfag62k6UO/dIyJEV58YuLF6e5BTdV/qmbQrpkWqjq9cUnQ==} hasBin: true @@ -16297,18 +15992,10 @@ packages: tweetnacl@0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-fest@0.13.1: resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} engines: {node: '>=10'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - type-fest@0.6.0: resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} engines: {node: '>=8'} @@ -16901,10 +16588,6 @@ packages: engines: {node: '>=8'} hasBin: true - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -19238,14 +18921,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.21.8(@babel/core@7.22.17)(eslint@8.31.0)': - dependencies: - '@babel/core': 7.22.17 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.31.0 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 - '@babel/generator@7.24.7': dependencies: '@babel/types': 7.27.3 @@ -19408,31 +19083,6 @@ snapshots: '@babel/helper-plugin-utils': 7.24.0 '@babel/helper-simple-access': 7.22.5 - '@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.17)': - dependencies: - '@babel/core': 7.22.17 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.17)': - dependencies: - '@babel/core': 7.22.17 - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.17) - - '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.22.17)': - dependencies: - '@babel/core': 7.22.17 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.22.17) - '@babel/types': 7.27.3 - - '@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.17)': - dependencies: - '@babel/core': 7.22.17 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-transform-typescript@7.21.3(@babel/core@7.22.17)': dependencies: '@babel/core': 7.22.17 @@ -19441,16 +19091,6 @@ snapshots: '@babel/helper-plugin-utils': 7.24.0 '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.17) - '@babel/preset-react@7.18.6(@babel/core@7.22.17)': - dependencies: - '@babel/core': 7.22.17 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.22.15 - '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.22.17) - '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.17) - '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.17) - '@babel/preset-typescript@7.21.5(@babel/core@7.22.17)': dependencies: '@babel/core': 7.22.17 @@ -20452,27 +20092,6 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.31.0)': - dependencies: - eslint: 8.31.0 - eslint-visitor-keys: 3.4.2 - - '@eslint-community/regexpp@4.5.1': {} - - '@eslint/eslintrc@1.4.1': - dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@10.0.0) - espree: 9.6.0 - globals: 13.19.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@fastify/accept-negotiator@2.0.1': {} '@fastify/ajv-compiler@4.0.5': @@ -20688,18 +20307,6 @@ snapshots: - bufferutil - utf-8-validate - '@humanwhocodes/config-array@0.11.8': - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.4.3(supports-color@10.0.0) - minimatch: 3.1.5 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@1.2.1': {} - '@iconify/types@2.0.0': {} '@iconify/utils@3.0.2': @@ -21018,10 +20625,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 - '@nodable/entities@2.1.0': {} '@nodelib/fs.scandir@2.1.5': @@ -21786,20 +21389,125 @@ snapshots: '@opentelemetry/api': 1.9.1 '@opentelemetry/core': 1.30.1(@opentelemetry/api@1.9.1) + '@oxfmt/binding-android-arm-eabi@0.54.0': + optional: true + + '@oxfmt/binding-android-arm64@0.54.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.54.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.54.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.54.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.54.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.54.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.54.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.54.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.54.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.54.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.54.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.54.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.54.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.54.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.54.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.54.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.54.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.54.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.69.0': + optional: true + + '@oxlint/binding-android-arm64@1.69.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.69.0': + optional: true + + '@oxlint/binding-darwin-x64@1.69.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.69.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.69.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.69.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.69.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.69.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.69.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.69.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.69.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.69.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.69.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.69.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.69.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.69.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.69.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.69.0': + optional: true + '@pinojs/redact@0.4.0': {} '@pkgjs/parseargs@0.11.0': optional: true - '@pkgr/utils@2.3.1': - dependencies: - cross-spawn: 7.0.6 - is-glob: 4.0.3 - open: 8.4.0 - picocolors: 1.1.1 - tiny-glob: 0.2.9 - tslib: 2.8.1 - '@playwright/test@1.37.0': dependencies: '@types/node': 20.14.14 @@ -23725,33 +23433,6 @@ snapshots: - utf-8-validate - yaml - '@remix-run/eslint-config@2.17.4(eslint@8.31.0)(react@18.2.0)(typescript@5.5.4)': - dependencies: - '@babel/core': 7.22.17 - '@babel/eslint-parser': 7.21.8(@babel/core@7.22.17)(eslint@8.31.0) - '@babel/preset-react': 7.18.6(@babel/core@7.22.17) - '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/eslint-plugin': 5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4) - '@typescript-eslint/parser': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - eslint: 8.31.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.31.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0) - eslint-plugin-jest: 26.9.0(@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4) - eslint-plugin-jest-dom: 4.0.3(eslint@8.31.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.31.0) - eslint-plugin-node: 11.1.0(eslint@8.31.0) - eslint-plugin-react: 7.32.2(eslint@8.31.0) - eslint-plugin-react-hooks: 4.6.2(eslint@8.31.0) - eslint-plugin-testing-library: 5.11.0(eslint@8.31.0)(typescript@5.5.4) - react: 18.2.0 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - jest - - supports-color - '@remix-run/express@2.17.4(express@4.20.0)(typescript@5.5.4)': dependencies: '@remix-run/node': 2.17.4(typescript@5.5.4) @@ -23937,8 +23618,6 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.60.1': optional: true - '@rushstack/eslint-patch@1.2.0': {} - '@s2-dev/streamstore@0.22.10(supports-color@10.0.0)': dependencies: '@protobuf-ts/runtime': 2.11.1 @@ -25308,17 +24987,6 @@ snapshots: - bare-buffer - supports-color - '@testing-library/dom@8.19.1': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/runtime': 7.28.4 - '@types/aria-query': 5.0.1 - aria-query: 5.3.0 - chalk: 4.1.2 - dom-accessibility-api: 0.5.15 - lz-string: 1.4.4 - pretty-format: 27.5.1 - '@tokenizer/token@0.3.0': {} '@total-typescript/ts-reset@0.4.2': {} @@ -25336,8 +25004,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/aria-query@5.0.1': {} - '@types/aws-lambda@8.10.152': {} '@types/bcryptjs@2.4.2': {} @@ -25531,11 +25197,6 @@ snapshots: '@types/eslint': 8.56.12 '@types/estree': 1.0.9 - '@types/eslint@8.4.10': - dependencies: - '@types/estree': 1.0.0 - '@types/json-schema': 7.0.11 - '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.9 @@ -25545,8 +25206,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - '@types/estree@1.0.0': {} - '@types/estree@1.0.8': {} '@types/estree@1.0.9': {} @@ -25598,10 +25257,6 @@ snapshots: '@types/json-query@2.2.3': {} - '@types/json-schema@7.0.11': {} - - '@types/json-schema@7.0.13': {} - '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} @@ -25866,90 +25521,6 @@ snapshots: dependencies: '@types/node': 20.14.14 - '@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/regexpp': 4.5.1 - '@typescript-eslint/parser': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 5.59.6 - '@typescript-eslint/type-utils': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - '@typescript-eslint/utils': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - debug: 4.3.4 - eslint: 8.31.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/scope-manager': 5.59.6 - '@typescript-eslint/types': 5.59.6 - '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) - debug: 4.4.0 - eslint: 8.31.0 - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.59.6': - dependencies: - '@typescript-eslint/types': 5.59.6 - '@typescript-eslint/visitor-keys': 5.59.6 - - '@typescript-eslint/type-utils@5.59.6(eslint@8.31.0)(typescript@5.5.4)': - dependencies: - '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) - '@typescript-eslint/utils': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - debug: 4.4.3(supports-color@10.0.0) - eslint: 8.31.0 - tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.59.6': {} - - '@typescript-eslint/typescript-estree@5.59.6(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 5.59.6 - '@typescript-eslint/visitor-keys': 5.59.6 - debug: 4.4.3(supports-color@10.0.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.59.6(eslint@8.31.0)(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.31.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.1 - '@typescript-eslint/scope-manager': 5.59.6 - '@typescript-eslint/types': 5.59.6 - '@typescript-eslint/typescript-estree': 5.59.6(typescript@5.5.4) - eslint: 8.31.0 - eslint-scope: 5.1.1 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@5.59.6': - dependencies: - '@typescript-eslint/types': 5.59.6 - eslint-visitor-keys: 3.4.2 - '@uiw/codemirror-extensions-basic-setup@4.19.5(@codemirror/autocomplete@6.4.0(@codemirror/language@6.3.2)(@codemirror/state@6.2.0)(@codemirror/view@6.7.2)(@lezer/common@1.3.0))(@codemirror/commands@6.1.3)(@codemirror/language@6.3.2)(@codemirror/lint@6.4.2)(@codemirror/search@6.2.3)(@codemirror/state@6.2.0)(@codemirror/view@6.7.2)': dependencies: '@codemirror/autocomplete': 6.4.0(@codemirror/language@6.3.2)(@codemirror/state@6.2.0)(@codemirror/view@6.7.2)(@lezer/common@1.3.0) @@ -26416,8 +25987,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} antlr4ts-cli@0.5.0-alpha.4: {} @@ -26469,10 +26038,6 @@ snapshots: dependencies: tslib: 2.8.1 - aria-query@5.3.0: - dependencies: - dequal: 2.0.3 - arktype@2.1.20: dependencies: '@ark/schema': 0.46.0 @@ -26485,26 +26050,8 @@ snapshots: array-flatten@1.1.1: {} - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.0.7 - array-union@2.1.0: {} - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.1: dependencies: call-bind: 1.0.8 @@ -26512,28 +26059,6 @@ snapshots: es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - get-intrinsic: 1.3.0 - arraybuffer.prototype.slice@1.0.3: dependencies: array-buffer-byte-length: 1.0.1 @@ -26561,8 +26086,6 @@ snapshots: assertion-error@2.0.1: {} - ast-types-flow@0.0.7: {} - ast-v8-to-istanbul@1.0.2: dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -26636,8 +26159,6 @@ snapshots: aws4fetch@1.0.18: {} - axe-core@4.6.2: {} - axios@1.16.1: dependencies: follow-redirects: 1.16.0 @@ -26648,10 +26169,6 @@ snapshots: - debug - supports-color - axobject-query@3.2.1: - dependencies: - dequal: 2.0.3 - b4a@1.6.6: {} bail@2.0.2: {} @@ -27685,8 +27202,6 @@ snapshots: d3: 7.9.0 lodash-es: 4.18.1 - damerau-levenshtein@1.0.8: {} - dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -27729,10 +27244,6 @@ snapshots: dependencies: ms: 2.0.0 - debug@3.2.7: - dependencies: - ms: 2.1.3 - debug@4.3.4: dependencies: ms: 2.1.2 @@ -27749,10 +27260,6 @@ snapshots: optionalDependencies: supports-color: 10.0.0 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.3(supports-color@10.0.0): dependencies: ms: 2.1.3 @@ -27785,8 +27292,6 @@ snapshots: deep-extend@0.6.0: {} - deep-is@0.1.4: {} - deep-object-diff@1.1.9: {} deepmerge-ts@7.1.5: {} @@ -27812,8 +27317,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-lazy-prop@3.0.0: {} define-properties@1.1.4: @@ -27931,16 +27434,6 @@ snapshots: transitivePeerDependencies: - supports-color - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dom-accessibility-api@0.5.15: {} - dom-helpers@5.2.1: dependencies: '@babel/runtime': 7.28.4 @@ -27972,8 +27465,6 @@ snapshots: dependencies: type-fest: 5.6.0 - dotenv@16.0.3: {} - dotenv@16.4.4: {} dotenv@16.4.5: {} @@ -28132,7 +27623,7 @@ snapshots: enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 enquirer@2.3.6: dependencies: @@ -28564,275 +28055,15 @@ snapshots: escape-string-regexp@1.0.5: {} - escape-string-regexp@4.0.0: {} - escape-string-regexp@5.0.0: {} - eslint-config-prettier@8.6.0(eslint@8.31.0): - dependencies: - eslint: 8.31.0 - - eslint-import-resolver-node@0.3.7: - dependencies: - debug: 3.2.7 - is-core-module: 2.14.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.14.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.31.0): - dependencies: - debug: 4.4.3(supports-color@10.0.0) - enhanced-resolve: 5.18.3 - eslint: 8.31.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0) - get-tsconfig: 4.7.6 - globby: 13.2.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - synckit: 0.8.5 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - eslint: 8.31.0 - eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.31.0) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - eslint: 8.31.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.29.1)(eslint@8.31.0) - transitivePeerDependencies: - - supports-color - - eslint-plugin-es@3.0.1(eslint@8.31.0): - dependencies: - eslint: 8.31.0 - eslint-utils: 2.1.0 - regexpp: 3.2.0 - - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.31.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.31.0) - hasown: 2.0.2 - is-core-module: 2.14.0 - is-glob: 4.0.3 - minimatch: 3.1.5 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jest-dom@4.0.3(eslint@8.31.0): - dependencies: - '@babel/runtime': 7.28.4 - '@testing-library/dom': 8.19.1 - eslint: 8.31.0 - requireindex: 1.2.0 - - eslint-plugin-jest@26.9.0(@typescript-eslint/eslint-plugin@5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4): - dependencies: - '@typescript-eslint/utils': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - eslint: 8.31.0 - optionalDependencies: - '@typescript-eslint/eslint-plugin': 5.59.6(@typescript-eslint/parser@5.59.6(eslint@8.31.0)(typescript@5.5.4))(eslint@8.31.0)(typescript@5.5.4) - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-jsx-a11y@6.7.1(eslint@8.31.0): - dependencies: - '@babel/runtime': 7.28.4 - aria-query: 5.3.0 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.7 - axe-core: 4.6.2 - axobject-query: 3.2.1 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 8.31.0 - has: 1.0.3 - jsx-ast-utils: 3.3.3 - language-tags: 1.0.5 - minimatch: 3.1.5 - object.entries: 1.1.6 - object.fromentries: 2.0.8 - semver: 6.3.1 - - eslint-plugin-node@11.1.0(eslint@8.31.0): - dependencies: - eslint: 8.31.0 - eslint-plugin-es: 3.0.1(eslint@8.31.0) - eslint-utils: 2.1.0 - ignore: 5.2.4 - minimatch: 3.1.5 - resolve: 1.22.8 - semver: 6.3.1 - - eslint-plugin-react-hooks@4.6.2(eslint@8.31.0): - dependencies: - eslint: 8.31.0 - - eslint-plugin-react@7.32.2(eslint@8.31.0): - dependencies: - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.1 - doctrine: 2.1.0 - eslint: 8.31.0 - estraverse: 5.3.0 - jsx-ast-utils: 3.3.3 - minimatch: 3.1.5 - object.entries: 1.1.6 - object.fromentries: 2.0.8 - object.hasown: 1.1.2 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.4 - semver: 6.3.1 - string.prototype.matchall: 4.0.8 - - eslint-plugin-testing-library@5.11.0(eslint@8.31.0)(typescript@5.5.4): - dependencies: - '@typescript-eslint/utils': 5.59.6(eslint@8.31.0)(typescript@5.5.4) - eslint: 8.31.0 - transitivePeerDependencies: - - supports-color - - typescript - - eslint-plugin-turbo@2.0.5(eslint@8.31.0): - dependencies: - dotenv: 16.0.3 - eslint: 8.31.0 - eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@2.1.0: - dependencies: - eslint-visitor-keys: 1.3.0 - - eslint-utils@3.0.0(eslint@8.31.0): - dependencies: - eslint: 8.31.0 - eslint-visitor-keys: 2.1.0 - - eslint-visitor-keys@1.3.0: {} - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.3.0: {} - - eslint-visitor-keys@3.4.2: {} - - eslint@8.31.0: - dependencies: - '@eslint/eslintrc': 1.4.1 - '@humanwhocodes/config-array': 0.11.8 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.1.1 - eslint-utils: 3.0.0(eslint@8.31.0) - eslint-visitor-keys: 3.3.0 - espree: 9.4.1 - esquery: 1.4.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.19.0 - grapheme-splitter: 1.0.4 - ignore: 5.2.4 - import-fresh: 3.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-sdsl: 4.2.0 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 - natural-compare: 1.4.0 - optionator: 0.9.1 - regexpp: 3.2.0 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.4.1: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 3.4.2 - - espree@9.6.0: - dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 3.4.2 - esprima@4.0.1: {} - esquery@1.4.0: - dependencies: - estraverse: 5.3.0 - esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -28876,8 +28107,6 @@ snapshots: dependencies: '@types/estree': 1.0.8 - esutils@2.0.3: {} - etag@1.8.1: {} eval@0.1.6: @@ -29149,8 +28378,6 @@ snapshots: json-schema-ref-resolver: 2.0.1 rfdc: 1.4.1 - fast-levenshtein@2.0.6: {} - fast-npm-meta@0.2.2: {} fast-querystring@1.1.2: @@ -29243,10 +28470,6 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.0.4 - file-type@19.6.0: dependencies: get-stream: 9.0.1 @@ -29311,13 +28534,6 @@ snapshots: micromatch: 4.0.8 pkg-dir: 4.2.0 - flat-cache@3.0.4: - dependencies: - flatted: 3.4.2 - rimraf: 3.0.2 - - flatted@3.4.2: {} - follow-redirects@1.16.0: {} for-each@0.3.3: @@ -29599,18 +28815,12 @@ snapshots: globals@11.12.0: {} - globals@13.19.0: - dependencies: - type-fest: 0.20.2 - globals@15.15.0: {} globalthis@1.0.3: dependencies: define-properties: 1.2.1 - globalyzer@0.1.0: {} - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -30137,8 +29347,6 @@ snapshots: is-deflate@1.0.0: {} - is-docker@2.2.1: {} - is-docker@3.0.0: {} is-electron@2.2.2: {} @@ -30177,8 +29385,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} is-plain-obj@3.0.0: {} @@ -30240,10 +29446,6 @@ snapshots: is-windows@1.0.2: {} - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -30342,8 +29544,6 @@ snapshots: js-levenshtein@1.1.6: {} - js-sdsl@4.2.0: {} - js-tokens@10.0.0: {} js-tokens@4.0.0: {} @@ -30387,8 +29587,6 @@ snapshots: json-schema@0.4.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.3.0: dependencies: call-bind: 1.0.8 @@ -30449,11 +29647,6 @@ snapshots: json-schema: 0.4.0 verror: 1.10.0 - jsx-ast-utils@3.3.3: - dependencies: - array-includes: 3.1.8 - object.assign: 4.1.5 - junk@4.0.1: {} jwa@1.4.2: @@ -30496,12 +29689,6 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - language-subtag-registry@0.3.22: {} - - language-tags@1.0.5: - dependencies: - language-subtag-registry: 0.3.22 - layerr@2.0.1: {} layout-base@1.0.2: {} @@ -30557,11 +29744,6 @@ snapshots: lefthook-windows-arm64: 1.11.3 lefthook-windows-x64: 1.11.3 - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - light-my-request@6.6.0: dependencies: cookie: 1.0.2 @@ -30755,8 +29937,6 @@ snapshots: luxon@3.2.1: {} - lz-string@1.4.4: {} - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -31786,10 +30966,6 @@ snapshots: napi-build-utils@2.0.0: optional: true - natural-compare-lite@1.4.0: {} - - natural-compare@1.4.0: {} - nearley@2.20.1: dependencies: commander: 2.20.3 @@ -31988,36 +31164,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.1.1 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.hasown@1.1.2: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - obuf@1.1.2: {} obug@2.1.1: {} @@ -32084,12 +31230,6 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 - open@8.4.0: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - openai@4.33.1(encoding@0.1.13): dependencies: '@types/node': 20.14.14 @@ -32131,15 +31271,6 @@ snapshots: jose: 6.0.8 oauth4webapi: 3.3.0 - optionator@0.9.1: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - ora@5.4.1: dependencies: bl: 4.1.0 @@ -32160,6 +31291,52 @@ snapshots: outdent@0.8.0: {} + oxfmt@0.54.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.54.0 + '@oxfmt/binding-android-arm64': 0.54.0 + '@oxfmt/binding-darwin-arm64': 0.54.0 + '@oxfmt/binding-darwin-x64': 0.54.0 + '@oxfmt/binding-freebsd-x64': 0.54.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.54.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.54.0 + '@oxfmt/binding-linux-arm64-gnu': 0.54.0 + '@oxfmt/binding-linux-arm64-musl': 0.54.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.54.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.54.0 + '@oxfmt/binding-linux-riscv64-musl': 0.54.0 + '@oxfmt/binding-linux-s390x-gnu': 0.54.0 + '@oxfmt/binding-linux-x64-gnu': 0.54.0 + '@oxfmt/binding-linux-x64-musl': 0.54.0 + '@oxfmt/binding-openharmony-arm64': 0.54.0 + '@oxfmt/binding-win32-arm64-msvc': 0.54.0 + '@oxfmt/binding-win32-ia32-msvc': 0.54.0 + '@oxfmt/binding-win32-x64-msvc': 0.54.0 + + oxlint@1.69.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.69.0 + '@oxlint/binding-android-arm64': 1.69.0 + '@oxlint/binding-darwin-arm64': 1.69.0 + '@oxlint/binding-darwin-x64': 1.69.0 + '@oxlint/binding-freebsd-x64': 1.69.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.69.0 + '@oxlint/binding-linux-arm-musleabihf': 1.69.0 + '@oxlint/binding-linux-arm64-gnu': 1.69.0 + '@oxlint/binding-linux-arm64-musl': 1.69.0 + '@oxlint/binding-linux-ppc64-gnu': 1.69.0 + '@oxlint/binding-linux-riscv64-gnu': 1.69.0 + '@oxlint/binding-linux-riscv64-musl': 1.69.0 + '@oxlint/binding-linux-s390x-gnu': 1.69.0 + '@oxlint/binding-linux-x64-gnu': 1.69.0 + '@oxlint/binding-linux-x64-musl': 1.69.0 + '@oxlint/binding-openharmony-arm64': 1.69.0 + '@oxlint/binding-win32-arm64-msvc': 1.69.0 + '@oxlint/binding-win32-ia32-msvc': 1.69.0 + '@oxlint/binding-win32-x64-msvc': 1.69.0 + p-cancelable@1.1.0: {} p-event@5.0.1: @@ -32746,8 +31923,6 @@ snapshots: path-exists: 4.0.0 which-pm: 2.0.0 - prelude-ls@1.2.1: {} - prepend-http@2.0.0: {} prettier-plugin-tailwindcss@0.3.0(prettier@2.8.8): @@ -32760,12 +31935,6 @@ snapshots: prettier@3.8.3: {} - pretty-format@27.5.1: - dependencies: - ansi-regex: 5.0.1 - ansi-styles: 5.2.0 - react-is: 17.0.2 - pretty-hrtime@1.0.3: {} pretty-ms@7.0.1: @@ -33122,8 +32291,6 @@ snapshots: react-is@16.13.1: {} - react-is@17.0.2: {} - react-is@18.3.1: {} react-markdown@10.1.0(@types/react@18.2.69)(react@18.2.0): @@ -33433,8 +32600,6 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regexpp@3.2.0: {} - registry-auth-token@4.2.2: dependencies: rc: 1.2.8 @@ -33642,8 +32807,6 @@ snapshots: require-main-filename@2.0.0: {} - requireindex@1.2.0: {} - resend@3.2.0: dependencies: '@react-email/render': 0.0.12 @@ -33669,12 +32832,6 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.4: - dependencies: - is-core-module: 2.14.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - responselike@1.0.2: dependencies: lowercase-keys: 1.0.1 @@ -33698,10 +32855,6 @@ snapshots: rfdc@1.4.1: {} - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - rimraf@6.0.1: dependencies: glob: 11.0.0 @@ -34342,17 +33495,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.3 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - side-channel: 1.1.0 - string.prototype.padend@3.1.4: dependencies: call-bind: 1.0.7 @@ -34425,8 +33567,6 @@ snapshots: strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} - strnum@1.0.5: {} strnum@2.2.3: {} @@ -34546,11 +33686,6 @@ snapshots: rimraf: 6.0.1 tshy: 3.0.2 - synckit@0.8.5: - dependencies: - '@pkgr/utils': 2.3.1 - tslib: 2.8.1 - systeminformation@5.31.7: {} table@6.9.0: @@ -34635,8 +33770,6 @@ snapshots: tailwindcss@4.3.0: {} - tapable@2.3.0: {} - tapable@2.3.3: {} tar-fs@2.1.3: @@ -34756,8 +33889,6 @@ snapshots: dependencies: b4a: 1.6.6 - text-table@0.2.0: {} - thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -34781,11 +33912,6 @@ snapshots: tiny-case@1.0.3: {} - tiny-glob@0.2.9: - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - tiny-invariant@1.3.1: {} tinybench@2.9.0: {} @@ -34827,6 +33953,8 @@ snapshots: '@types/tinycolor2': 1.4.3 tinycolor2: 1.6.0 + tinypool@2.1.0: {} + tinyrainbow@3.1.0: {} tldts-core@7.0.7: {} @@ -34934,13 +34062,6 @@ snapshots: minimist: 1.2.7 strip-bom: 3.0.0 - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.7 - strip-bom: 3.0.0 - tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 @@ -35027,11 +34148,6 @@ snapshots: - tsx - yaml - tsutils@3.21.0(typescript@5.5.4): - dependencies: - tslib: 1.14.1 - typescript: 5.5.4 - tsx@3.12.2: dependencies: '@esbuild-kit/cjs-loader': 2.4.1 @@ -35106,14 +34222,8 @@ snapshots: tweetnacl@0.14.5: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-fest@0.13.1: {} - type-fest@0.20.2: {} - type-fest@0.6.0: {} type-fest@0.8.1: {} @@ -35794,8 +34904,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - word-wrap@1.2.3: {} - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 diff --git a/prettier.config.js b/prettier.config.js deleted file mode 100644 index 68de2fe5c9c..00000000000 --- a/prettier.config.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - semi: true, - singleQuote: false, - jsxSingleQuote: false, - trailingComma: "es5", - bracketSpacing: true, - bracketSameLine: false, - printWidth: 100, - tabWidth: 2, - useTabs: false, -}; diff --git a/turbo.json b/turbo.json index 8f2c862d030..c820d115376 100644 --- a/turbo.json +++ b/turbo.json @@ -2,32 +2,16 @@ "$schema": "https://turborepo.org/schema.json", "pipeline": { "build": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "dist/**", - "public/build/**", - "build/**", - "app/styles/tailwind.css", - ".cache" - ] + "dependsOn": ["^build"], + "outputs": ["dist/**", "public/build/**", "build/**", "app/styles/tailwind.css", ".cache"] }, "webapp#start": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "public/build/**" - ] + "dependsOn": ["^build"], + "outputs": ["public/build/**"] }, "start": { - "dependsOn": [ - "^build" - ], - "outputs": [ - "public/build/**" - ] + "dependsOn": ["^build"], + "outputs": ["public/build/**"] }, "db:generate": { "cache": false @@ -37,9 +21,7 @@ }, "webapp#db:seed": { "cache": false, - "dependsOn": [ - "webapp#build" - ] + "dependsOn": ["webapp#build"] }, "db:studio": { "cache": false @@ -49,29 +31,20 @@ }, "dev": { "cache": false, - "dependsOn": [ - "^build" - ] + "dependsOn": ["^build"] }, "i:dev": { "cache": false }, "generate": { - "dependsOn": [ - "^generate" - ] - }, - "lint": { - "outputs": [] + "dependsOn": ["^generate"] }, "docker:build": { "outputs": [], "cache": false }, "test": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [] }, "test:dev": { @@ -79,28 +52,20 @@ "cache": false }, "test:e2e:dev": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [], "cache": false }, "test:e2e:ci": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [] }, "typecheck": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [] }, "check-exports": { - "dependsOn": [ - "^build" - ], + "dependsOn": ["^build"], "outputs": [] }, "clean": { @@ -113,9 +78,7 @@ "cache": false } }, - "globalDependencies": [ - ".env" - ], + "globalDependencies": [".env"], "globalEnv": [ "NODE_ENV", "REMIX_APP_PORT", @@ -139,4 +102,4 @@ "APP_ENV", "APP_LOG_LEVEL" ] -} \ No newline at end of file +} From 6543dd21210c31c1bf72e372dbcb6cdafa22944b Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 17 Jun 2026 14:33:43 +0100 Subject: [PATCH 02/10] ignore rules-of-hooks --- .oxlintrc.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.oxlintrc.json b/.oxlintrc.json index 463fa955515..f028e901d34 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -19,6 +19,9 @@ } ], "import/no-duplicates": ["warn", { "prefer-inline": true }], - "react-hooks/rules-of-hooks": "error" + // Disabled for now: oxlint treats any use*()/use() call as a React hook, + // producing false positives in async/test code (testcontainers, cli-v3 e2e). + // Re-enable (ideally scoped to React packages) once those are addressed. + "react-hooks/rules-of-hooks": "off" } } From a15d1a1472ff8fddeb3ced08152b57afc1d0f778 Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 17 Jun 2026 14:33:53 +0100 Subject: [PATCH 03/10] make actionlint happy --- .github/workflows/code-quality.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 23ad4f79505..4b44dea9541 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -60,7 +60,7 @@ jobs: FILES: ${{ steps.changes.outputs.files }} # Unquoted $FILES intentionally word-splits the newline-separated list # into separate path args. Safe given the has_files guard above. - run: pnpm exec oxfmt --check $FILES + run: "pnpm exec oxfmt --check $FILES" # TODO update this so lint failures fail CI # Informational only — lint findings are surfaced in the logs but never @@ -70,4 +70,4 @@ jobs: continue-on-error: true env: FILES: ${{ steps.changes.outputs.files }} - run: pnpm exec oxlint $FILES + run: "pnpm exec oxlint $FILES" From d088659e94d6113b21d17fef4289caad68e0db5c Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 17 Jun 2026 14:58:01 +0100 Subject: [PATCH 04/10] enforce checks in ci --- .github/workflows/code-quality.yml | 41 +++--------------------------- 1 file changed, 3 insertions(+), 38 deletions(-) diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 4b44dea9541..6fd2f73b4ab 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -31,43 +31,8 @@ jobs: - name: 📥 Download deps run: pnpm install --frozen-lockfile - # Gate only on files this PR adds/modifies (ratchet) — the repo is not - # fully formatted/linted yet, so a whole-repo check would fail every PR. - - name: 🔍 Determine changed files - id: changes - env: - BASE_SHA: ${{ github.event.pull_request.base.sha }} - run: | - FILES=$(git diff --name-only --diff-filter=ACMR "$BASE_SHA"...HEAD -- \ - '*.ts' '*.tsx' '*.js' '*.jsx' '*.mjs' '*.cjs') - echo "Changed code files:" - echo "${FILES:-}" - { - echo "files<> "$GITHUB_OUTPUT" - if [ -z "$FILES" ]; then - echo "has_files=false" >> "$GITHUB_OUTPUT" - else - echo "has_files=true" >> "$GITHUB_OUTPUT" - fi - - # TODO enable format check for ALL code - name: 💅 Check formatting - if: steps.changes.outputs.has_files == 'true' - env: - FILES: ${{ steps.changes.outputs.files }} - # Unquoted $FILES intentionally word-splits the newline-separated list - # into separate path args. Safe given the has_files guard above. - run: "pnpm exec oxfmt --check $FILES" + run: pnpm exec oxfmt --check . - # TODO update this so lint failures fail CI - # Informational only — lint findings are surfaced in the logs but never - # fail the job. Only the formatting check above blocks the PR. - - name: 🔎 Lint (informational, non-blocking) - if: steps.changes.outputs.has_files == 'true' - continue-on-error: true - env: - FILES: ${{ steps.changes.outputs.files }} - run: "pnpm exec oxlint $FILES" + - name: 🔎 Lint + run: pnpm exec oxlint . From e2486f096d4694b22429f3cc7e2e12c667c3f2dd Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Wed, 17 Jun 2026 14:59:23 +0100 Subject: [PATCH 05/10] format --- .claude/REVIEW.md | 2 +- .claude/rules/legacy-v3-code.md | 1 + .claude/rules/package-installation.md | 2 + .claude/skills/span-timeline-events/SKILL.md | 18 +- .claude/skills/trigger-dev-tasks/SKILL.md | 63 +- .../trigger-dev-tasks/advanced-tasks.md | 43 +- .../skills/trigger-dev-tasks/basic-tasks.md | 7 +- .cursor/commands/deslop.md | 3 +- .github/labeler.yml | 2 +- .../workflows/dependabot-critical-alerts.yml | 2 +- .../workflows/dependabot-weekly-summary.yml | 8 +- .github/workflows/release-helm.yml | 12 +- .github/workflows/workflow-checks.yml | 12 +- .github/zizmor.yml | 2 +- .oxfmtrc.json | 1 + AGENTS.md | 6 +- CHANGESETS.md | 8 +- CLAUDE.md | 1 + CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 11 +- DOCKER_INSTALLATION.md | 1 - README.md | 2 +- apps/coordinator/package.json | 2 +- apps/docker-provider/package.json | 2 +- apps/kubernetes-provider/package.json | 2 +- .../redisBackpressureSignalSource.test.ts | 21 +- apps/supervisor/src/env.ts | 5 +- .../services/computeSnapshotService.test.ts | 8 +- .../src/services/otlpTraceService.test.ts | 4 +- .../warmStartVerificationService.test.ts | 5 +- apps/supervisor/src/wideEvents/index.ts | 7 +- .../src/wideEvents/middleware.test.ts | 23 +- .../src/workloadManager/compute.test.ts | 4 +- .../supervisor/src/workloadManager/compute.ts | 4 +- .../src/workloadManager/kubernetes.ts | 12 +- apps/supervisor/src/workloadManager/types.ts | 7 +- apps/supervisor/src/workloadServer/index.ts | 32 +- apps/webapp/CLAUDE.md | 3 + apps/webapp/app/assets/icons/AIPenIcon.tsx | 8 +- .../app/assets/icons/AiProviderIcons.tsx | 8 +- apps/webapp/app/assets/icons/AttemptIcon.tsx | 18 +- apps/webapp/app/assets/icons/ClockIcon.tsx | 7 +- apps/webapp/app/assets/icons/FunctionIcon.tsx | 10 +- apps/webapp/app/assets/icons/InfoIcon.tsx | 10 +- .../app/assets/icons/IntegrationsIcon.tsx | 6 +- .../app/assets/icons/RightSideMenuIcon.tsx | 10 +- .../app/assets/icons/RunFunctionIcon.tsx | 10 +- .../webapp/app/assets/icons/SlackMonoIcon.tsx | 7 +- apps/webapp/app/assets/icons/StreamsIcon.tsx | 26 +- .../app/assets/icons/TextSquareIcon.tsx | 40 +- apps/webapp/app/clientBeforeFirstRender.ts | 5 +- apps/webapp/app/components/AskAI.tsx | 6 +- .../app/components/BlankStatePanels.tsx | 14 +- apps/webapp/app/components/DevPresence.tsx | 8 +- .../webapp/app/components/LoginPageLayout.tsx | 4 +- apps/webapp/app/components/SetupCommands.tsx | 5 +- apps/webapp/app/components/Shortcuts.tsx | 10 +- .../backOffice/ApiRateLimitSection.server.ts | 4 +- .../admin/backOffice/ApiRateLimitSection.tsx | 13 +- .../BatchRateLimitSection.server.ts | 4 +- .../backOffice/BatchRateLimitSection.tsx | 13 +- .../admin/backOffice/MaxProjectsSection.tsx | 10 +- .../backOffice/RateLimitSection.server.ts | 11 +- .../admin/backOffice/RateLimitSection.tsx | 40 +- .../app/components/code/AIQueryInput.tsx | 8 +- .../app/components/code/QueryResultsChart.tsx | 12 +- .../app/components/code/TSQLResultsTable.tsx | 23 +- .../app/components/code/codeMirrorTheme.ts | 17 +- apps/webapp/app/components/code/tsql/index.ts | 8 +- .../components/code/tsql/tsqlCompletion.ts | 8 +- .../components/code/tsql/tsqlLinter.test.ts | 5 +- .../app/components/code/tsql/tsqlLinter.ts | 7 +- .../errors/ConfigureErrorAlerts.tsx | 7 +- .../integrations/VercelBuildSettings.tsx | 33 +- .../components/integrations/VercelLogo.tsx | 7 +- .../integrations/VercelOnboardingModal.tsx | 314 +- .../app/components/metrics/ModelsFilter.tsx | 7 +- .../components/metrics/OperationsFilter.tsx | 7 +- .../app/components/metrics/PromptsFilter.tsx | 7 +- .../components/metrics/ProvidersFilter.tsx | 7 +- .../metrics/SaveToDashboardDialog.tsx | 15 +- .../components/navigation/DashboardList.tsx | 4 +- .../navigation/EnvironmentSelector.tsx | 11 +- .../navigation/HelpAndFeedbackPopover.tsx | 230 +- .../app/components/navigation/SideMenu.tsx | 4 +- .../components/navigation/SideMenuItem.tsx | 2 +- .../navigation/useReorderableList.ts | 4 +- .../app/components/primitives/Buttons.tsx | 9 +- .../app/components/primitives/Checkbox.tsx | 6 +- .../app/components/primitives/ClientTabs.tsx | 10 +- .../components/primitives/CopyTextLink.tsx | 10 +- .../app/components/primitives/DateTime.tsx | 8 +- .../app/components/primitives/Dialog.tsx | 2 +- .../primitives/InputNumberStepper.tsx | 2 +- .../components/primitives/MiddleTruncate.tsx | 11 +- .../app/components/primitives/SearchInput.tsx | 2 +- .../app/components/primitives/Select.tsx | 21 +- .../app/components/primitives/Sheet.tsx | 6 +- .../app/components/primitives/SheetV3.tsx | 3 +- .../app/components/primitives/ShortcutKey.tsx | 5 +- .../app/components/primitives/Table.tsx | 8 +- .../webapp/app/components/primitives/Tabs.tsx | 4 +- .../app/components/primitives/Toast.tsx | 5 +- .../primitives/TreeView/TreeView.tsx | 16 +- .../components/primitives/TreeView/utils.ts | 19 +- .../components/primitives/UnorderedList.tsx | 5 +- .../components/primitives/charts/Chart.tsx | 146 +- .../components/primitives/charts/ChartBar.tsx | 17 +- .../primitives/charts/ChartContext.tsx | 40 +- .../primitives/charts/ChartLegendCompound.tsx | 20 +- .../primitives/charts/ChartLine.tsx | 18 +- .../primitives/charts/ChartLoading.tsx | 111 +- .../primitives/charts/ChartRoot.tsx | 10 +- .../charts/hooks/useZoomSelection.ts | 11 +- .../primitives/charts/useYAxisWidth.ts | 3 +- .../app/components/query/QueryEditor.tsx | 20 +- .../app/components/runs/v3/BatchStatus.tsx | 6 +- .../components/runs/v3/PromptSpanDetails.tsx | 9 +- .../webapp/app/components/runs/v3/RunIcon.tsx | 137 +- .../app/components/runs/v3/SharedFilters.tsx | 14 +- .../app/components/runs/v3/SpanTitle.tsx | 4 +- .../components/runs/v3/WaitpointDetails.tsx | 6 +- .../components/runs/v3/agent/AgentView.tsx | 12 +- .../components/runs/v3/ai/AIChatMessages.tsx | 4 +- .../runs/v3/ai/AIEmbedSpanDetails.tsx | 1 - .../components/runs/v3/ai/AIModelSummary.tsx | 6 +- .../components/runs/v3/ai/AISpanDetails.tsx | 28 +- .../runs/v3/ai/AIToolCallSpanDetails.tsx | 1 - .../app/components/runs/v3/ai/aiHelpers.ts | 16 +- .../runs/v3/ai/extractAISpanData.ts | 9 +- .../runs/v3/ai/extractAISummarySpanData.ts | 11 +- .../schedules/PurchaseSchedulesModal.tsx | 7 +- .../schedules/ScheduleLimitActions.tsx | 4 +- .../components/sessions/v1/SessionsTable.tsx | 4 +- apps/webapp/app/db.server.ts | 5 +- apps/webapp/app/entry.server.tsx | 3 +- apps/webapp/app/env.server.ts | 35 +- apps/webapp/app/hooks/useDashboardEditor.ts | 16 +- apps/webapp/app/hooks/useElementVisibility.ts | 4 +- apps/webapp/app/hooks/usePostHog.ts | 9 +- apps/webapp/app/models/member.server.ts | 2 +- .../app/models/orgIntegration.server.ts | 6 +- .../app/models/runtimeEnvironment.server.ts | 2 +- apps/webapp/app/models/taskQueue.server.ts | 12 +- apps/webapp/app/models/user.server.ts | 9 +- .../app/models/vercelIntegration.server.ts | 177 +- .../app/models/vercelSdkRecovery.server.ts | 8 +- .../SelectBestEnvironmentPresenter.server.ts | 2 +- .../v3/AgentDetailPresenter.server.ts | 23 +- .../v3/AgentListPresenter.server.ts | 6 +- .../presenters/v3/ApiKeysPresenter.server.ts | 17 +- .../v3/ApiRetrieveRunPresenter.server.ts | 7 +- .../v3/ApiRunListPresenter.server.ts | 5 +- .../v3/BatchListPresenter.server.ts | 4 +- .../presenters/v3/BatchPresenter.server.ts | 1 - .../v3/CreateBulkActionPresenter.server.ts | 5 +- .../v3/DeploymentListPresenter.server.ts | 7 +- .../v3/DeploymentPresenter.server.ts | 29 +- .../EnvironmentVariablesPresenter.server.ts | 14 +- .../presenters/v3/LimitsPresenter.server.ts | 92 +- .../v3/LogDetailPresenter.server.ts | 5 +- .../v3/MetricDashboardPresenter.server.ts | 8 +- .../v3/ModelRegistryPresenter.server.ts | 73 +- .../v3/NewAlertChannelPresenter.server.ts | 12 +- .../v3/NextRunListPresenter.server.ts | 2 +- .../v3/PlaygroundPresenter.server.ts | 6 +- .../presenters/v3/PromptPresenter.server.ts | 35 +- .../presenters/v3/QueryPresenter.server.ts | 1 - .../v3/QueueListPresenter.server.ts | 2 +- .../presenters/v3/RegionsPresenter.server.ts | 10 +- .../app/presenters/v3/RunPresenter.server.ts | 3 +- .../v3/RunStreamPresenter.server.ts | 4 +- .../v3/RunTagListPresenter.server.ts | 5 +- .../v3/SessionListPresenter.server.ts | 18 +- .../presenters/v3/SessionPresenter.server.ts | 111 +- .../app/presenters/v3/SpanPresenter.server.ts | 18 +- .../v3/TaskDetailPresenter.server.ts | 14 +- .../presenters/v3/TaskListPresenter.server.ts | 5 +- .../v3/TasksDashboardPresenter.server.ts | 5 +- .../app/presenters/v3/TestPresenter.server.ts | 4 +- .../presenters/v3/TestTaskPresenter.server.ts | 6 +- .../presenters/v3/UsagePresenter.server.ts | 5 +- .../v3/VercelSettingsPresenter.server.ts | 394 +- .../v3/ViewSchedulePresenter.server.ts | 7 +- .../v3/WaitpointListPresenter.server.ts | 2 +- .../v3/WaitpointPresenter.server.ts | 9 +- .../v3/mapRunToLiveFields.server.ts | 4 +- .../route.tsx | 28 +- .../route.tsx | 11 +- .../route.tsx | 8 +- .../route.tsx | 7 +- .../route.tsx | 4 +- .../route.tsx | 15 +- .../route.tsx | 4 +- .../route.tsx | 17 +- .../route.tsx | 25 +- .../route.tsx | 20 +- .../route.tsx | 5 +- .../route.tsx | 12 +- .../route.tsx | 5 +- .../route.tsx | 87 +- .../route.tsx | 44 +- .../route.tsx | 9 +- .../route.tsx | 2 +- .../route.tsx | 28 +- .../route.tsx | 5 +- .../AITabContent.tsx | 5 +- .../ExamplesContent.tsx | 3 +- .../TRQLGuideContent.tsx | 1 - .../TableSchemaContent.tsx | 1 - .../route.tsx | 11 +- .../route.tsx | 148 +- .../route.tsx | 21 +- .../route.tsx | 9 +- .../shouldRevalidateRunsList.ts | 4 +- .../useRunsLiveReload.ts | 7 +- .../route.tsx | 8 +- .../route.tsx | 10 +- .../route.tsx | 41 +- .../route.tsx | 6 +- .../route.tsx | 120 +- .../route.tsx | 5 +- .../route.tsx | 2 +- .../AIPayloadTabContent.tsx | 8 +- .../route.tsx | 703 +- .../route.tsx | 1 - .../route.tsx | 24 +- ...ationSlug.settings.integrations.vercel.tsx | 41 +- .../route.tsx | 18 +- .../route.tsx | 26 +- .../route.tsx | 7 +- .../_app.orgs.$organizationSlug/route.tsx | 7 +- .../route.tsx | 9 +- .../webapp/app/routes/_app.orgs.new/route.tsx | 5 +- .../app/routes/account.tokens/route.tsx | 4 +- .../admin.api.v1.llm-models.$modelId.ts | 14 +- .../app/routes/admin.api.v1.llm-models.ts | 15 +- ...pi.v1.revoked-api-keys.$revokedApiKeyId.ts | 5 +- .../webapp/app/routes/admin.api.v1.workers.ts | 10 +- ...i.v2.orgs.$organizationId.feature-flags.ts | 6 +- .../app/routes/admin.back-office._index.tsx | 13 +- .../routes/admin.back-office.orgs.$orgId.tsx | 84 +- apps/webapp/app/routes/admin.back-office.tsx | 9 +- apps/webapp/app/routes/admin.concurrency.tsx | 13 +- apps/webapp/app/routes/admin.data-stores.tsx | 15 +- .../webapp/app/routes/admin.feature-flags.tsx | 131 +- apps/webapp/app/routes/admin.impersonate.tsx | 6 +- .../app/routes/admin.llm-models.$modelId.tsx | 57 +- .../app/routes/admin.llm-models._index.tsx | 33 +- .../admin.llm-models.missing.$model.tsx | 57 +- .../admin.llm-models.missing._index.tsx | 10 +- .../app/routes/admin.llm-models.new.tsx | 65 +- .../webapp/app/routes/admin.notifications.tsx | 9 +- apps/webapp/app/routes/admin.orgs.tsx | 10 +- apps/webapp/app/routes/admin.tsx | 5 +- .../app/routes/api.v1.batches.$batchId.ts | 6 +- ...loymentId.generate-registry-credentials.ts | 106 +- .../api.v1.idempotencyKeys.$key.reset.ts | 6 +- ....projects.$projectParam.vercel.projects.ts | 21 +- .../app/routes/api.v1.plain.customer-cards.ts | 39 +- ...jects.$projectRef.$env.workers.$tagName.ts | 106 +- ...ef.background-workers.$envSlug.$version.ts | 30 +- ...pi.v1.projects.$projectRef.environments.ts | 18 +- .../routes/api.v1.prompts.$slug.override.ts | 5 +- .../webapp/app/routes/api.v1.prompts.$slug.ts | 34 +- .../routes/api.v1.prompts.$slug.versions.ts | 5 +- .../app/routes/api.v1.prompts._index.ts | 5 +- apps/webapp/app/routes/api.v1.query.ts | 5 +- .../app/routes/api.v1.runs.$runId.events.ts | 5 +- .../app/routes/api.v1.runs.$runId.metadata.ts | 12 +- .../api.v1.runs.$runId.spans.$spanId.ts | 10 +- .../app/routes/api.v1.runs.$runId.tags.ts | 10 +- .../app/routes/api.v1.runs.$runId.trace.ts | 10 +- .../routes/api.v1.runs.$runParam.replay.ts | 3 +- .../api.v1.runs.$runParam.reschedule.ts | 5 +- apps/webapp/app/routes/api.v1.runs.ts | 5 +- .../routes/api.v1.sessions.$session.close.ts | 17 +- ...i.v1.sessions.$session.end-and-continue.ts | 15 +- .../app/routes/api.v1.sessions.$session.ts | 18 +- ...api.v1.sessions.$sessionId.snapshot-url.ts | 35 +- apps/webapp/app/routes/api.v1.sessions.ts | 10 +- .../routes/api.v1.tasks.$taskId.trigger.ts | 4 +- apps/webapp/app/routes/api.v1.tasks.batch.ts | 7 +- .../app/routes/api.v2.batches.$batchId.ts | 6 +- apps/webapp/app/routes/api.v2.tasks.batch.ts | 7 +- apps/webapp/app/routes/api.v3.batches.ts | 2 +- apps/webapp/app/routes/api.v3.runs.$runId.ts | 5 +- .../app/routes/auth.google.callback.tsx | 1 - apps/webapp/app/routes/auth.google.ts | 1 - .../app/routes/confirm-basic-details.tsx | 5 +- .../app/routes/engine.v1.dev.disconnect.ts | 15 +- .../engine.v1.worker-actions.connect.ts | 5 +- .../engine.v1.worker-actions.heartbeat.ts | 5 +- apps/webapp/app/routes/invites.tsx | 5 +- apps/webapp/app/routes/login._index/route.tsx | 6 +- apps/webapp/app/routes/login.magic/route.tsx | 5 +- apps/webapp/app/routes/otel.v1.metrics.ts | 4 +- .../routes/realtime.v1.batches.$batchId.ts | 6 +- .../app/routes/realtime.v1.runs.$runId.ts | 5 +- apps/webapp/app/routes/realtime.v1.runs.ts | 5 +- ...ealtime.v1.sessions.$session.$io.append.ts | 15 +- .../realtime.v1.sessions.$session.$io.ts | 5 +- .../realtime.v1.streams.$runId.$streamId.ts | 19 +- ...streams.$runId.$target.$streamId.append.ts | 4 +- ...ime.v1.streams.$runId.$target.$streamId.ts | 16 +- .../useMfaSetup.ts | 197 +- apps/webapp/app/routes/resources.feedback.ts | 5 +- .../route.tsx | 10 +- ...vParam.dashboards.$dashboardId.widgets.tsx | 12 +- ...tParam.env.$envParam.dashboards.create.tsx | 3 +- ...cts.$projectParam.env.$envParam.github.tsx | 31 +- ...projectParam.env.$envParam.logs.$logId.tsx | 5 +- ...ojects.$projectParam.env.$envParam.logs.ts | 11 +- ...tParam.env.$envParam.playground.action.tsx | 16 +- ...ealtime.v1.sessions.$session.$io.append.ts | 21 +- ...round.realtime.v1.sessions.$session.$io.ts | 6 +- ...nvParam.prompts.$promptSlug.generations.ts | 10 +- ...ram.realtime.v1.sessions.$sessionId.$io.ts | 6 +- ...am.realtime.v1.streams.$runId.$streamId.ts | 14 +- .../route.tsx | 25 +- .../route.tsx | 16 +- ...s.$projectParam.env.$envParam.runs.live.ts | 3 +- .../route.tsx | 4 +- ...cts.$projectParam.env.$envParam.vercel.tsx | 267 +- ....orgs.$organizationSlug.schedules-addon.ts | 12 +- ...ces.orgs.$organizationSlug.select-plan.tsx | 24 +- .../routes/resources.preferences.sidemenu.tsx | 5 +- .../resources.runs.$runParam.logs.download.ts | 5 +- .../app/routes/resources.runs.$runParam.ts | 12 +- .../resources.sessions.$sessionParam.close.ts | 6 +- .../resources.taskruns.$runParam.replay.ts | 2 +- .../routes/storybook.animated-panel/route.tsx | 85 +- .../app/routes/storybook.charts/route.tsx | 1 - .../app/routes/storybook.icons/route.tsx | 20 +- .../app/routes/storybook.timeline/route.tsx | 4 +- apps/webapp/app/routes/vercel.callback.ts | 2 +- apps/webapp/app/routes/vercel.configure.tsx | 4 +- apps/webapp/app/routes/vercel.connect.tsx | 12 +- apps/webapp/app/routes/vercel.install.tsx | 1 - apps/webapp/app/routes/vercel.onboarding.tsx | 33 +- .../concerns/batchGlobalRateLimiter.server.ts | 1 - .../concerns/computeMigration.server.ts | 12 +- .../concerns/idempotencyKeys.server.ts | 24 +- .../app/runEngine/concerns/payloads.server.ts | 8 +- .../app/runEngine/concerns/queues.server.ts | 20 +- .../runEngine/services/batchTrigger.server.ts | 36 +- .../services/streamBatchItems.server.ts | 4 +- .../services/triggerFailedTask.server.ts | 6 +- .../runEngine/services/triggerTask.server.ts | 133 +- apps/webapp/app/runEngine/types.ts | 34 +- .../services/admin/missingLlmModels.server.ts | 17 +- apps/webapp/app/services/apiAuth.server.ts | 12 +- ...authorizationRateLimitMiddleware.server.ts | 4 +- .../betterstack/betterstack.server.ts | 9 +- .../organizationDataStoresRegistry.server.ts | 1 - apps/webapp/app/services/gitHub.server.ts | 8 +- .../app/services/impersonation.server.ts | 31 +- ...oadProjectEnvironmentFromRequest.server.ts | 5 +- apps/webapp/app/services/org.server.ts | 2 +- .../services/personalAccessToken.server.ts | 5 +- .../webapp/app/services/platform.v3.server.ts | 4 +- .../services/platformNotifications.server.ts | 23 +- .../queryConcurrencyLimiter.server.ts | 1 - .../app/services/queryService.server.ts | 11 +- .../app/services/realtime/duration.server.ts | 27 +- .../realtime/electricStreamProtocol.server.ts | 4 +- .../realtime/envChangeRouter.server.ts | 9 +- .../realtime/nativeRealtimeClient.server.ts | 36 +- .../realtimeConcurrencyLimiter.server.ts | 6 +- .../resolveRealtimeStreamClient.server.ts | 2 +- .../runChangeNotifierInstance.server.ts | 3 +- .../realtime/s2realtimeStreams.server.ts | 25 +- .../realtime/sessionRunManager.server.ts | 18 +- .../app/services/realtime/sessions.server.ts | 15 +- .../shadowRealtimeClientInstance.server.ts | 6 +- .../realtime/streamBasinProvisioner.server.ts | 15 +- apps/webapp/app/services/realtime/types.ts | 6 +- .../routeBuilders/apiBuilder.server.ts | 45 +- .../routeBuilders/dashboardBuilder.server.ts | 18 +- .../routeBuilders/dashboardBuilder.ts | 24 +- .../services/runsReplicationService.server.ts | 2 +- .../clickhouseRunsRepository.server.ts | 6 +- .../runsRepository/runsRepository.server.ts | 2 +- .../services/secrets/secretStore.server.ts | 2 +- .../sessionStreamWaitpointCache.server.ts | 8 +- .../clickhouseSessionsRepository.server.ts | 8 +- .../sessionsRepository.server.ts | 2 +- apps/webapp/app/services/signals.server.ts | 4 +- .../services/taskIdentifierRegistry.server.ts | 9 +- apps/webapp/app/services/telemetry.server.ts | 4 +- .../services/unkey/redisCacheStore.server.ts | 7 +- .../app/services/vercelIntegration.server.ts | 63 +- apps/webapp/app/utils.ts | 11 +- apps/webapp/app/utils/dataExport.ts | 11 +- apps/webapp/app/utils/logUtils.ts | 4 +- apps/webapp/app/utils/longPollingFetch.ts | 4 +- apps/webapp/app/utils/plain.server.ts | 9 +- .../app/utils/reloadingRegistry.server.ts | 4 +- apps/webapp/app/utils/searchParams.ts | 5 +- apps/webapp/app/utils/timeGranularity.ts | 16 +- .../app/v3/dynamicFlushScheduler.server.ts | 2 +- .../environmentVariablesRepository.server.ts | 3 +- .../clickhouseEventRepository.server.ts | 2 +- .../eventRepository/eventRepository.server.ts | 16 +- .../app/v3/eventRepository/index.server.ts | 5 +- .../v3/eventRepository/traceExport.server.ts | 3 +- .../app/v3/legacyRunEngineWorker.server.ts | 5 +- .../webapp/app/v3/marqs/asyncWorker.server.ts | 5 +- .../app/v3/marqs/devQueueConsumer.server.ts | 4 +- .../v3/marqs/fairDequeuingStrategy.server.ts | 49 +- apps/webapp/app/v3/marqs/index.server.ts | 4 +- .../v3/marqs/sharedQueueConsumer.server.ts | 10 +- .../mollifier/applyMetadataMutation.server.ts | 7 +- .../v3/mollifier/mollifierDrainer.server.ts | 4 +- .../mollifierDrainerHandler.server.ts | 20 +- .../mollifierDrainingGauge.server.ts | 10 +- .../app/v3/mollifier/mollifierGate.server.ts | 20 +- .../v3/mollifier/mollifierMollify.server.ts | 3 +- .../mollifier/mollifierStaleSweep.server.ts | 17 +- .../mollifierStaleSweepState.server.ts | 7 +- .../v3/mollifier/mollifierTelemetry.server.ts | 40 +- .../v3/mollifier/mutateWithFallback.server.ts | 22 +- .../app/v3/mollifier/readFallback.server.ts | 19 +- .../mollifier/resolveRunForMutation.server.ts | 6 +- .../mollifier/syntheticRedirectInfo.server.ts | 2 +- .../v3/mollifier/syntheticRunHeader.server.ts | 4 +- .../v3/mollifier/syntheticSpanRun.server.ts | 22 +- .../app/v3/mollifier/syntheticTrace.server.ts | 10 +- .../app/v3/mollifierDrainerWorker.server.ts | 2 +- .../v3/mollifierStaleSweepWorker.server.ts | 2 +- apps/webapp/app/v3/objectStore.server.ts | 6 +- .../webapp/app/v3/objectStoreClient.server.ts | 12 +- apps/webapp/app/v3/otlpExporter.server.ts | 40 +- apps/webapp/app/v3/querySchemas.ts | 3 +- apps/webapp/app/v3/runEngine.server.ts | 3 +- .../webapp/app/v3/runEngineHandlers.server.ts | 2 +- .../app/v3/services/adminWorker.server.ts | 3 +- .../v3/services/alerts/deliverAlert.server.ts | 86 +- .../alerts/deliverErrorGroupAlert.server.ts | 31 +- .../app/v3/services/batchTriggerV3.server.ts | 26 +- .../v3/services/bulk/BulkActionV2.server.ts | 10 +- .../app/v3/services/completeAttempt.server.ts | 2 +- .../services/createBackgroundWorker.server.ts | 2 +- .../findOrCreateBackgroundWorker.server.ts | 4 +- .../services/createTaskRunAttempt.server.ts | 4 +- .../app/v3/services/promptService.server.ts | 1 - .../taskRunConcurrencyTracker.server.ts | 28 +- .../app/v3/services/triggerTaskV1.server.ts | 17 +- .../worker/workerGroupTokenService.server.ts | 7 +- apps/webapp/app/v3/taskEventStore.server.ts | 5 +- .../v3/utils/enrichCreatableEvents.server.ts | 40 +- apps/webapp/app/v3/utils/zodPubSub.server.ts | 6 +- apps/webapp/app/v3/vercel/index.ts | 2 - .../app/v3/vercel/vercelOAuthState.server.ts | 4 +- .../vercel/vercelProjectIntegrationSchema.ts | 59 +- .../webapp/app/v3/vercel/vercelUrls.server.ts | 5 +- apps/webapp/app/v3/workerRegions.server.ts | 5 +- apps/webapp/evals/aiRunFilter.eval.ts | 8 +- apps/webapp/seed-ai-spans.mts | 152 +- apps/webapp/seed.mts | 4 +- .../EnvironmentVariablesPresenter.test.ts | 88 +- apps/webapp/test/README.md | 15 +- apps/webapp/test/api-auth.e2e.test.ts | 3 +- apps/webapp/test/auth-api.e2e.full.test.ts | 205 +- .../test/auth-dashboard.e2e.full.test.ts | 6 +- .../test/bufferedTriggerPayload.test.ts | 2 +- .../test/chat-snapshot-integration.test.ts | 246 +- apps/webapp/test/clickhouseFactory.test.ts | 19 +- .../code/tsql/tsqlCompletion.test.ts | 1 - .../components/code/tsql/tsqlLinter.test.ts | 5 +- .../test/components/runs/v3/RunTag.test.ts | 28 +- apps/webapp/test/computeMigration.test.ts | 56 +- .../createDeploymentWithNextVersion.test.ts | 31 +- apps/webapp/test/duplicateTaskIds.test.ts | 7 +- .../test/engine/streamBatchItems.test.ts | 18 +- apps/webapp/test/engine/triggerTask.test.ts | 259 +- .../environmentVariablesEnvironments.test.ts | 37 +- .../environmentVariablesRepository.test.ts | 93 +- apps/webapp/test/errorFingerprinting.test.ts | 11 +- .../webapp/test/fairDequeuingStrategy.test.ts | 19 +- .../healthcheck-require-plugins.e2e.test.ts | 13 +- .../webapp/test/helpers/seedTestApiSession.ts | 8 +- .../test/helpers/seedTestEnvironment.ts | 4 +- .../test/helpers/seedTestUserProject.ts | 4 +- .../metadataRouteOperationsLogging.test.ts | 13 +- .../mollifierApplyMetadataMutation.test.ts | 21 +- .../test/mollifierClaimResolution.test.ts | 2 +- .../test/mollifierDecisionLabels.test.ts | 10 +- .../test/mollifierDrainerHandler.test.ts | 14 +- .../test/mollifierDrainerWorker.test.ts | 8 +- apps/webapp/test/mollifierGate.test.ts | 281 +- .../test/mollifierIdempotencyClaim.test.ts | 23 +- apps/webapp/test/mollifierMollify.test.ts | 2 +- .../test/mollifierMutateWithFallback.test.ts | 6 +- .../webapp/test/mollifierReadFallback.test.ts | 44 +- .../test/mollifierReplayPayloadShape.test.ts | 6 +- .../test/mollifierResetIdempotencyKey.test.ts | 2 +- apps/webapp/test/mollifierStaleSweep.test.ts | 140 +- .../test/mollifierSynthesiseFoundRun.test.ts | 4 +- .../mollifierSyntheticApiResponses.test.ts | 4 +- .../mollifierSyntheticRedirectInfo.test.ts | 182 +- .../test/mollifierSyntheticTrace.test.ts | 4 +- .../test/mollifierTripEvaluator.test.ts | 31 +- apps/webapp/test/objectStore.test.ts | 43 +- .../organizationDataStoresRegistry.test.ts | 85 +- .../test/realtime/envChangeRouter.test.ts | 19 +- .../test/realtime/nativeHoldOnEmpty.test.ts | 28 +- .../test/realtime/nativeRunSetCache.test.ts | 5 +- .../test/realtime/replayCursorStore.test.ts | 41 +- .../test/realtime/runChangeNotifier.test.ts | 4 +- .../test/realtime/shadowCompare.test.ts | 19 +- apps/webapp/test/replay-after-crash.test.ts | 23 +- .../test/runsReplicationBenchmark.README.md | 10 + apps/webapp/test/runsRepositoryCursor.test.ts | 5 +- .../test/sanitizeRowsOnParseError.test.ts | 13 +- apps/webapp/test/sessionDuration.test.ts | 21 +- .../test/shouldRevalidateRunsList.test.ts | 40 +- apps/webapp/test/slackErrorAlerts.test.ts | 7 +- apps/webapp/test/timelineSpanEvents.test.ts | 6 +- apps/webapp/test/traceExport.test.ts | 11 +- .../utils/testReplicationClickhouseFactory.ts | 5 +- apps/webapp/test/workerRegions.test.ts | 75 +- depot.json | 2 +- docker/README.md | 2 +- .../provisioning/dashboards/batch-queue.json | 63 +- .../provisioning/dashboards/dashboards.yml | 1 - .../dashboards/nodejs-runtime.json | 40 +- .../dashboards/realtime-native.json | 11 +- .../dashboards/runs-replication.json | 42 +- .../provisioning/datasources/datasources.yml | 1 - docker/config/otel-collector-config.yaml | 1 - docker/config/prometheus.yml | 1 - docker/config/toxiproxy.json | 2 +- docs/CLAUDE.md | 2 +- docs/ai-chat/actions.mdx | 6 +- docs/ai-chat/anatomy.mdx | 24 +- docs/ai-chat/backend.mdx | 114 +- docs/ai-chat/background-injection.mdx | 31 +- docs/ai-chat/changelog.mdx | 1 + docs/ai-chat/chat-local.mdx | 21 +- docs/ai-chat/client-protocol.mdx | 333 +- docs/ai-chat/compaction.mdx | 82 +- docs/ai-chat/custom-agents.mdx | 78 +- docs/ai-chat/error-handling.mdx | 58 +- docs/ai-chat/fast-starts.mdx | 102 +- docs/ai-chat/frontend.mdx | 68 +- docs/ai-chat/how-it-works.mdx | 48 +- docs/ai-chat/lifecycle-hooks.mdx | 205 +- docs/ai-chat/mcp.mdx | 17 +- docs/ai-chat/overview.mdx | 5 +- .../patterns/branching-conversations.mdx | 45 +- docs/ai-chat/patterns/code-sandbox.mdx | 1 - .../ai-chat/patterns/database-persistence.mdx | 27 +- docs/ai-chat/patterns/human-in-the-loop.mdx | 6 +- docs/ai-chat/patterns/large-payloads.mdx | 7 +- docs/ai-chat/patterns/oom-resilience.mdx | 7 +- .../patterns/persistence-and-replay.mdx | 18 +- docs/ai-chat/patterns/recovery-boot.mdx | 36 +- docs/ai-chat/patterns/skills.mdx | 7 +- docs/ai-chat/patterns/sub-agents.mdx | 69 +- .../ai-chat/patterns/tool-result-auditing.mdx | 16 +- .../ai-chat/patterns/trusted-edge-signals.mdx | 13 +- docs/ai-chat/patterns/version-upgrades.mdx | 12 +- docs/ai-chat/pending-messages.mdx | 133 +- docs/ai-chat/prompt-caching.mdx | 25 +- docs/ai-chat/reference.mdx | 635 +- docs/ai-chat/server-chat.mdx | 55 +- docs/ai-chat/sessions.mdx | 60 +- docs/ai-chat/testing.mdx | 170 +- docs/ai-chat/tools.mdx | 24 +- docs/ai-chat/types.mdx | 10 +- docs/ai-chat/upgrade-guide.mdx | 114 +- docs/ai/prompts.mdx | 55 +- docs/batch-queue-metrics.md | 119 +- docs/building-with-ai.mdx | 73 +- docs/bulk-actions.mdx | 30 +- docs/cli-dev-commands.mdx | 2 +- docs/cli-dev.mdx | 2 +- docs/cli-development-commands.mdx | 4 +- docs/cli-init-commands.mdx | 2 +- docs/cli-introduction.mdx | 4 +- docs/cli-login-commands.mdx | 2 +- docs/cli-logout-commands.mdx | 2 +- docs/cli-switch.mdx | 3 +- docs/cli-whoami-commands.mdx | 2 +- docs/compute-private-beta.mdx | 11 +- docs/config/extensions/overview.mdx | 28 +- docs/config/extensions/playwright.mdx | 13 +- docs/config/extensions/syncEnvVars.mdx | 19 +- docs/database-connections.mdx | 56 +- docs/deploy-environment-variables.mdx | 19 +- docs/deployment/atomic-deployment.mdx | 6 +- docs/deployment/overview.mdx | 6 +- docs/docs.json | 77 +- docs/github-actions.mdx | 8 +- docs/github-integration.mdx | 38 +- .../ai-agents/generate-translate-copy.mdx | 19 +- .../ai-agents/respond-and-check-content.mdx | 10 +- docs/guides/ai-agents/route-question.mdx | 14 +- .../guides/ai-agents/translate-and-refine.mdx | 12 +- docs/guides/ai-agents/verify-news-article.mdx | 12 +- docs/guides/community/sveltekit.mdx | 2 +- .../example-projects/batch-llm-evaluator.mdx | 4 +- .../meme-generator-human-in-the-loop.mdx | 1 - .../examples/fal-ai-image-to-cartoon.mdx | 2 +- docs/guides/examples/fal-ai-realtime.mdx | 6 +- docs/guides/examples/lightpanda.mdx | 2 + .../examples/supabase-database-operations.mdx | 1 - docs/guides/examples/vercel-sync-env-vars.mdx | 5 +- docs/guides/frameworks/sequin.mdx | 6 +- .../supabase-edge-functions-basic.mdx | 19 +- ...abase-edge-functions-database-webhooks.mdx | 18 +- docs/guides/introduction.mdx | 40 +- docs/guides/use-cases/upgrading-from-v2.mdx | 66 +- docs/hidden-tasks.mdx | 2 +- docs/how-to-reduce-your-spend.mdx | 5 +- docs/idempotency.mdx | 58 +- docs/limits.mdx | 13 +- docs/logging.mdx | 36 +- docs/management/authentication.mdx | 10 +- docs/management/auto-pagination.mdx | 2 +- docs/management/batches/create.mdx | 1 - docs/management/batches/stream-items.mdx | 1 - docs/management/deployments/get-latest.mdx | 3 +- docs/management/errors-and-retries.mdx | 2 +- docs/management/multiple-clients.mdx | 24 +- docs/management/overview.mdx | 2 +- docs/management/sessions/channels.mdx | 32 +- docs/mcp-agent-rules.mdx | 2 +- docs/mcp-introduction.mdx | 12 + docs/mcp-tools.mdx | 37 +- docs/migrating-from-v3.mdx | 7 +- docs/migration-defer.mdx | 14 +- docs/migration-mergent.mdx | 18 +- docs/notifications.mdx | 2 +- docs/observability/query.mdx | 28 +- docs/open-source-self-hosting.mdx | 62 +- docs/private-networking/aws-console-setup.mdx | 32 +- docs/private-networking/overview.mdx | 28 +- docs/queue-concurrency.mdx | 7 +- docs/realtime/auth.mdx | 5 +- docs/realtime/backend/input-streams.mdx | 10 +- docs/realtime/backend/overview.mdx | 8 +- docs/realtime/backend/streams.mdx | 19 +- docs/realtime/overview.mdx | 16 +- docs/realtime/react-hooks/overview.mdx | 12 +- docs/realtime/react-hooks/streams.mdx | 14 +- docs/realtime/react-hooks/subscribe.mdx | 16 +- docs/realtime/react-hooks/swr.mdx | 2 +- docs/replaying.mdx | 13 +- docs/request-feature.mdx | 2 +- docs/roadmap.mdx | 2 +- docs/run-tests.mdx | 6 +- docs/runs.mdx | 49 +- docs/runs/max-duration.mdx | 3 +- docs/runs/priority.mdx | 3 +- docs/self-hosting/env/webapp.mdx | 332 +- docs/self-hosting/overview.mdx | 1 - docs/skills.mdx | 27 +- docs/snippets/ai-chat-rc-banner.mdx | 6 +- docs/snippets/bundle-packages.mdx | 8 +- docs/snippets/cli-args-project-path.mdx | 2 +- docs/snippets/cli-commands-deploy.mdx | 3 +- docs/snippets/cli-options-common.mdx | 5 +- docs/snippets/cli-options-config-file.mdx | 2 +- docs/snippets/cli-options-env-file.mdx | 2 +- docs/snippets/cli-options-help.mdx | 2 +- docs/snippets/cli-options-log-level.mdx | 5 +- docs/snippets/cli-options-project-ref.mdx | 2 +- docs/snippets/cli-options-skip-telemetry.mdx | 5 +- .../cli-options-skip-update-check.mdx | 2 +- docs/snippets/cli-options-version.mdx | 2 +- docs/snippets/coming-soon-generic.mdx | 5 +- docs/snippets/coming-soon-in-review.mdx | 5 +- docs/snippets/coming-soon-planned.mdx | 5 +- docs/snippets/corepack-error.mdx | 2 +- docs/snippets/debugging_in_vscode.mdx | 2 +- docs/snippets/deplopying-your-task.mdx | 2 +- .../snippets/local-development-extensions.mdx | 2 +- docs/snippets/migrate-v4-using-ai.mdx | 167 +- docs/snippets/nextjs-button-syntax.mdx | 1 - docs/snippets/nextjs-missing-api-key.mdx | 2 +- docs/snippets/paused-execution-free.mdx | 2 +- docs/snippets/run-boolean-helpers.mdx | 2 +- .../run-dev-and-next-concurrently.mdx | 27 +- docs/snippets/soft-limit.mdx | 3 +- docs/snippets/step-cli-init.mdx | 5 +- docs/snippets/useful-next-steps.mdx | 6 +- docs/snippets/web-scraping-warning.mdx | 7 +- docs/style.css | 52 +- docs/tasks-regular.mdx | 2 +- docs/tasks/overview.mdx | 14 +- docs/tasks/scheduled.mdx | 20 +- docs/tasks/schemaTask.mdx | 3 +- docs/tasks/streams.mdx | 23 +- docs/triggering.mdx | 52 +- docs/troubleshooting-alerts.mdx | 16 +- docs/troubleshooting-debugging-in-vscode.mdx | 4 +- docs/upgrading-beta.mdx | 2 +- docs/v3-openapi.yaml | 22 +- docs/video-walkthrough.mdx | 1 + docs/wait-for-token.mdx | 2 + docs/wait-for.mdx | 4 +- docs/wait-until.mdx | 4 +- docs/wait.mdx | 10 +- hosting/README.md | 2 +- hosting/docker/webapp/docker-compose.yml | 2 +- hosting/docker/worker/docker-compose.yml | 8 +- hosting/k8s/helm/README.md | 49 +- hosting/k8s/helm/values.yaml | 30 +- internal-packages/cache/package.json | 2 +- .../cache/src/stores/lruMemory.ts | 12 +- internal-packages/cache/src/stores/redis.ts | 7 +- internal-packages/clickhouse/CLAUDE.md | 2 +- .../clickhouse/src/client/client.ts | 5 +- .../clickhouse/src/client/noop.ts | 5 +- .../clickhouse/src/client/tsql.ts | 9 +- internal-packages/clickhouse/src/sessions.ts | 10 +- .../clickhouse/src/taskEvents.ts | 15 +- .../clickhouse/src/taskRuns.test.ts | 16 +- internal-packages/clickhouse/src/tsql.test.ts | 83 +- internal-packages/compute/src/client.ts | 6 +- internal-packages/database/CLAUDE.md | 1 + internal-packages/database/package.json | 2 +- .../emails/emails/mfa-enabled.tsx | 3 +- internal-packages/emails/src/index.tsx | 4 +- .../emails/src/transports/aws-ses.ts | 24 +- .../emails/src/transports/index.ts | 12 +- .../emails/src/transports/null.ts | 11 +- .../emails/src/transports/resend.ts | 14 +- internal-packages/emails/tsconfig.json | 2 +- .../llm-model-catalog/scripts/generate.mjs | 15 +- .../llm-model-catalog/src/defaultPrices.ts | 6169 ++-- .../llm-model-catalog/src/model-catalog.json | 713 +- .../llm-model-catalog/src/modelCatalog.ts | 4059 ++- .../llm-model-catalog/src/registry.test.ts | 12 +- .../llm-model-catalog/src/registry.ts | 5 +- .../llm-model-catalog/src/sync.test.ts | 9 +- .../llm-model-catalog/src/sync.ts | 4 +- internal-packages/otlp-importer/package.json | 2 +- .../proto/collector/logs/v1/logs_service.ts | 56 +- .../collector/metrics/v1/metrics_service.ts | 74 +- .../proto/collector/trace/v1/trace_service.ts | 57 +- .../opentelemetry/proto/common/v1/common.ts | 62 +- .../opentelemetry/proto/logs/v1/logs.ts | 68 +- .../opentelemetry/proto/metrics/v1/metrics.ts | 289 +- .../proto/resource/v1/resource.ts | 17 +- .../opentelemetry/proto/trace/v1/trace.ts | 94 +- internal-packages/rbac/src/ability.test.ts | 8 +- internal-packages/rbac/src/fallback.ts | 17 +- internal-packages/rbac/src/index.ts | 19 +- internal-packages/redis/package.json | 2 +- internal-packages/redis/src/index.ts | 6 +- internal-packages/replication/package.json | 2 +- internal-packages/run-engine/CLAUDE.md | 1 + internal-packages/run-engine/package.json | 2 +- .../src/batch-queue/completionTracker.ts | 6 +- .../run-engine/src/batch-queue/index.ts | 28 +- .../src/batch-queue/tests/index.test.ts | 97 +- .../run-engine/src/engine/index.ts | 143 +- .../run-engine/src/engine/retrying.ts | 17 +- .../src/engine/systems/delayedRunSystem.ts | 1 - .../engine/systems/executionSnapshotSystem.ts | 4 +- .../engine/systems/pendingVersionSystem.ts | 4 +- .../src/engine/systems/runAttemptSystem.ts | 15 +- .../src/engine/systems/ttlSystem.ts | 218 +- .../engine/tests/batchTriggerAndWait.test.ts | 4 +- .../src/engine/tests/cancelling.test.ts | 15 +- .../engine/tests/createCancelledRun.test.ts | 91 +- .../engine/tests/createFailedTaskRun.test.ts | 189 +- .../src/engine/tests/debounce.test.ts | 831 +- .../src/engine/tests/dequeuing.test.ts | 10 +- .../engine/tests/getSnapshotsSince.test.ts | 5 +- .../tests/helpers/snapshotTestHelpers.ts | 4 +- .../src/engine/tests/lazyWaitpoint.test.ts | 501 +- .../src/engine/tests/trigger.test.ts | 21 +- .../run-engine/src/engine/tests/ttl.test.ts | 25 +- .../run-engine/src/run-queue/index.ts | 27 +- .../src/run-queue/tests/ckCounters.test.ts | 632 +- .../src/run-queue/tests/ckIndex.test.ts | 562 +- .../dequeueMessageFromWorkerQueue.test.ts | 5 +- .../run-queue/tests/enqueueMessage.test.ts | 284 +- .../src/run-queue/tests/keyProducer.test.ts | 8 +- .../src/run-queue/tests/nack.test.ts | 20 +- .../schedule-engine/package.json | 2 +- .../schedule-engine/src/engine/index.ts | 2 +- .../test/scheduleRecovery.test.ts | 3 +- .../src/fixtures/deno/test.ts | 13 +- .../src/fixtures/esm-import/test.mjs | 13 +- .../testcontainers/src/webapp.ts | 22 +- internal-packages/tracing/package.json | 2 +- .../tsql/src/grammar/TSQLParser.ts | 26316 +++++++++------- .../tsql/src/grammar/TSQLParserVisitor.ts | 2285 +- internal-packages/tsql/src/index.test.ts | 100 +- internal-packages/tsql/src/query/database.ts | 4 +- internal-packages/tsql/src/query/functions.ts | 176 +- .../tsql/src/query/parse_string.ts | 104 +- internal-packages/tsql/src/query/parser.ts | 8 +- .../tsql/src/query/printer.test.ts | 286 +- internal-packages/tsql/src/query/printer.ts | 9 +- .../tsql/src/query/results.test.ts | 5 +- internal-packages/tsql/src/query/results.ts | 1 - internal-packages/tsql/src/query/schema.ts | 6 +- .../tsql/src/query/security.test.ts | 14 +- internal-packages/tsql/src/query/timings.ts | 148 +- internal-packages/zod-worker/package.json | 2 +- packages/build/CHANGELOG.md | 12 - .../src/extensions/core/neonSyncEnvVars.ts | 3 +- .../extensions/core/syncSupabaseEnvVars.ts | 12 +- .../src/extensions/core/vercelSyncEnvVars.ts | 2 +- .../build/src/internal/additionalFiles.ts | 6 +- packages/cli-v3/CHANGELOG.md | 10 - packages/cli-v3/CLAUDE.md | 4 + .../fixtures/monorepo-react-email/.yarnrc.yml | 2 +- packages/cli-v3/e2e/utils.ts | 16 +- .../trigger-authoring-chat-agent/SKILL.md | 2 + .../trigger-chat-agent-advanced/SKILL.md | 6 +- .../skills/trigger-getting-started/SKILL.md | 8 +- packages/cli-v3/src/build/bundleSkills.ts | 12 +- packages/cli-v3/src/build/manifests.ts | 5 +- packages/cli-v3/src/commands/deploy.ts | 8 +- packages/cli-v3/src/commands/init.ts | 5 +- packages/cli-v3/src/commands/skills.ts | 36 +- packages/cli-v3/src/config.ts | 8 +- packages/cli-v3/src/dev/devOutput.ts | 8 +- packages/cli-v3/src/dev/devSupervisor.ts | 21 +- .../src/entryPoints/dev-run-controller.ts | 1 - .../src/entryPoints/managed-index-worker.ts | 4 +- .../cli-v3/src/executions/taskRunProcess.ts | 10 +- packages/cli-v3/src/mcp/config.ts | 6 +- packages/cli-v3/src/mcp/formatters.ts | 8 +- packages/cli-v3/src/mcp/schemas.ts | 28 +- packages/cli-v3/src/mcp/smoke.test.ts | 61 +- packages/cli-v3/src/mcp/tools.test.ts | 5 +- packages/cli-v3/src/mcp/tools.ts | 6 +- packages/cli-v3/src/mcp/tools/agentChat.ts | 35 +- packages/cli-v3/src/mcp/tools/agents.ts | 4 +- packages/cli-v3/src/mcp/tools/deploys.ts | 12 +- packages/cli-v3/src/mcp/tools/devServer.ts | 5 +- packages/cli-v3/src/mcp/tools/profiles.ts | 4 +- packages/cli-v3/src/mcp/tools/prompts.ts | 12 +- packages/cli-v3/src/mcp/tools/query.ts | 4 +- packages/cli-v3/src/mcp/tools/runs.ts | 24 +- packages/cli-v3/src/mcp/tools/tasks.ts | 14 +- packages/cli-v3/src/rules/install.ts | 1 - .../cli-v3/src/utilities/colorMarkup.test.ts | 18 +- packages/cli-v3/src/utilities/colorMarkup.ts | 5 +- .../cli-v3/src/utilities/discoveryCheck.ts | 13 +- .../src/utilities/platformNotifications.ts | 9 +- packages/core/CHANGELOG.md | 14 - packages/core/src/schemas/eventFilter.ts | 4 +- packages/core/src/v3/apiClient/errors.ts | 8 +- packages/core/src/v3/apiClient/index.ts | 39 +- .../core/src/v3/apiClient/runStream.test.ts | 6 +- packages/core/src/v3/apiClient/runStream.ts | 4 +- .../core/src/v3/apiClientManager/index.ts | 8 +- packages/core/src/v3/auth/environment.ts | 6 +- packages/core/src/v3/errors.test.ts | 4 +- packages/core/src/v3/errors.ts | 8 +- packages/core/src/v3/idempotencyKeys.ts | 9 +- packages/core/src/v3/inputStreams/manager.ts | 62 +- .../core/src/v3/inputStreams/noopManager.ts | 4 +- .../core/src/v3/otel/nodejsRuntimeMetrics.ts | 37 +- packages/core/src/v3/otel/tracingSDK.ts | 43 +- .../src/v3/realtimeStreams/manager.test.ts | 17 +- .../core/src/v3/realtimeStreams/manager.ts | 8 +- .../src/v3/realtimeStreams/streamsWriterV1.ts | 2 +- packages/core/src/v3/realtimeStreams/types.ts | 9 +- .../core/src/v3/resource-catalog/catalog.ts | 6 +- .../core/src/v3/resource-catalog/index.ts | 6 +- .../resource-catalog/noopResourceCatalog.ts | 6 +- .../standardResourceCatalog.ts | 11 +- .../supervisor/queueConsumer.test.ts | 8 +- .../supervisor/queueConsumer.ts | 15 +- .../v3/runEngineWorker/supervisor/session.ts | 5 +- .../core/src/v3/runMetadata/noopManager.ts | 8 +- packages/core/src/v3/schemas/build.ts | 8 +- .../core/src/v3/serverOnly/idempotencyKeys.ts | 7 +- packages/core/src/v3/sessionStreams/index.ts | 12 +- .../src/v3/sessionStreams/manager.test.ts | 24 +- .../core/src/v3/sessionStreams/manager.ts | 30 +- .../core/src/v3/sessionStreams/noopManager.ts | 6 +- packages/core/src/v3/sessionStreams/types.ts | 12 +- .../core/src/v3/taskContext/otelProcessors.ts | 8 +- .../core/src/v3/test/mock-task-context.ts | 6 +- .../src/v3/test/test-input-stream-manager.ts | 4 +- .../v3/test/test-session-stream-manager.ts | 23 +- packages/core/src/v3/timeout/api.ts | 4 +- packages/core/src/v3/timeout/types.ts | 4 +- packages/core/src/v3/types/schemas.ts | 26 +- packages/core/src/v3/types/tasks.ts | 88 +- packages/core/src/v3/types/tools.ts | 4 +- packages/core/src/v3/utils/durations.ts | 4 +- .../src/v3/utils/reconnectBackoff.test.ts | 4 +- .../core/src/v3/utils/structuredLogger.ts | 4 +- packages/core/src/v3/waitpoints/index.ts | 8 +- packages/core/src/v3/workers/taskExecutor.ts | 4 +- packages/core/test/errors.test.ts | 10 +- .../test/externalSpanExporterWrapper.test.ts | 5 +- packages/core/test/flattenAttributes.test.ts | 20 +- .../core/test/recordSpanException.test.ts | 5 +- packages/core/test/resourceCatalog.test.ts | 44 +- packages/core/test/skillCatalog.test.ts | 7 +- packages/plugins/src/rbac.ts | 9 +- packages/plugins/src/sso.ts | 9 +- packages/react-hooks/CHANGELOG.md | 2 - packages/redis-worker/package.json | 2 +- packages/redis-worker/src/fair-queue/index.ts | 14 +- .../redis-worker/src/fair-queue/scheduler.ts | 1 - .../src/fair-queue/schedulers/drr.ts | 11 +- .../src/fair-queue/schedulers/index.ts | 1 - .../src/fair-queue/schedulers/roundRobin.ts | 1 - .../src/fair-queue/schedulers/weighted.ts | 7 +- .../redis-worker/src/fair-queue/telemetry.ts | 1 - .../src/fair-queue/tests/drr.test.ts | 548 +- .../src/fair-queue/tests/fairQueue.test.ts | 2 - .../fair-queue/tests/raceConditions.test.ts | 7 +- .../fair-queue/tests/tenantDispatch.test.ts | 5 +- .../src/fair-queue/tests/visibility.test.ts | 61 +- .../redis-worker/src/fair-queue/visibility.ts | 4 +- .../redis-worker/src/mollifier/buffer.test.ts | 736 +- packages/redis-worker/src/mollifier/buffer.ts | 78 +- .../src/mollifier/drainer.test.ts | 558 +- .../redis-worker/src/mollifier/drainer.ts | 19 +- .../redis-worker/src/mollifier/schemas.ts | 5 +- packages/redis-worker/src/utils.ts | 4 +- packages/redis-worker/src/worker.ts | 47 +- packages/rsc/src/build.ts | 2 +- packages/schema-to-json/README.md | 17 +- packages/schema-to-json/tsconfig.json | 2 +- packages/schema-to-json/vitest.config.ts | 6 +- packages/trigger-sdk/CHANGELOG.md | 19 - .../trigger-authoring-chat-agent/SKILL.md | 10 +- .../skills/trigger-authoring-tasks/SKILL.md | 16 +- .../trigger-chat-agent-advanced/SKILL.md | 32 +- .../skills/trigger-cost-savings/SKILL.md | 25 +- .../trigger-realtime-and-frontend/SKILL.md | 38 +- packages/trigger-sdk/src/v3/ai-shared.ts | 29 +- packages/trigger-sdk/src/v3/ai.ts | 1823 +- packages/trigger-sdk/src/v3/chat-client.ts | 67 +- packages/trigger-sdk/src/v3/chat-react.ts | 5 +- .../trigger-sdk/src/v3/chat-server.test.ts | 69 +- packages/trigger-sdk/src/v3/chat-server.ts | 17 +- packages/trigger-sdk/src/v3/chat.test.ts | 53 +- packages/trigger-sdk/src/v3/chat.ts | 24 +- .../trigger-sdk/src/v3/idempotencyKeys.ts | 6 +- packages/trigger-sdk/src/v3/prompt.ts | 57 +- .../trigger-sdk/src/v3/promptManagement.ts | 51 +- packages/trigger-sdk/src/v3/retry.ts | 9 +- packages/trigger-sdk/src/v3/runs.ts | 8 +- .../trigger-sdk/src/v3/schedules/index.ts | 6 +- packages/trigger-sdk/src/v3/schemas.ts | 2 +- packages/trigger-sdk/src/v3/sessions.ts | 11 +- packages/trigger-sdk/src/v3/shared.test.ts | 1 - packages/trigger-sdk/src/v3/shared.ts | 36 +- packages/trigger-sdk/src/v3/skill.ts | 5 +- packages/trigger-sdk/src/v3/streams.test.ts | 94 +- packages/trigger-sdk/src/v3/streams.ts | 26 +- .../src/v3/test/mock-chat-agent.ts | 179 +- .../src/v3/test/test-session-handle.ts | 49 +- .../trigger-sdk/src/v3/triggerClient.test.ts | 2 +- .../trigger-sdk/test/chat-snapshot.test.ts | 50 +- .../trigger-sdk/test/chatHandover.test.ts | 22 +- .../test/chatHandoverBackends.test.ts | 18 +- packages/trigger-sdk/test/merge-by-id.test.ts | 22 +- .../trigger-sdk/test/mockChatAgent.test.ts | 48 +- .../trigger-sdk/test/promptCaching.test.ts | 8 +- .../trigger-sdk/test/recovery-boot.test.ts | 52 +- .../test/replay-session-in.test.ts | 14 +- .../test/replay-session-out.test.ts | 42 +- packages/trigger-sdk/test/wire-shape.test.ts | 32 +- packages/trigger-sdk/vitest.config.ts | 1 - patches/README.md | 18 +- rules/4.3.0/advanced-tasks.md | 43 +- rules/4.3.0/basic-tasks.md | 7 +- rules/manifest.json | 2 +- scripts/bundleSdkDocs.ts | 4 +- scripts/generate-github-release.mjs | 16 +- scripts/recover-stuck-runs.ts | 12 +- scripts/stamp-preview-version.mjs | 4 +- server.json | 2 +- 981 files changed, 36406 insertions(+), 32145 deletions(-) diff --git a/.claude/REVIEW.md b/.claude/REVIEW.md index 19edf00a52e..b70fc848af8 100644 --- a/.claude/REVIEW.md +++ b/.claude/REVIEW.md @@ -47,4 +47,4 @@ The `apps/webapp/app/v3/` directory name is misleading — most code there is V2 ## Confidence calibration for this repo -The most common false-positive pattern: speculating about race conditions in code paths the agent doesn't have runtime visibility into. If the only evidence is "this *could* race", drop it. If you can point to a specific interleaving with file:line for each step, surface it. +The most common false-positive pattern: speculating about race conditions in code paths the agent doesn't have runtime visibility into. If the only evidence is "this _could_ race", drop it. If you can point to a specific interleaving with file:line for each step, surface it. diff --git a/.claude/rules/legacy-v3-code.md b/.claude/rules/legacy-v3-code.md index 6fd8d9402c2..300359c6441 100644 --- a/.claude/rules/legacy-v3-code.md +++ b/.claude/rules/legacy-v3-code.md @@ -19,6 +19,7 @@ The `v3/` directory name is misleading - most code here is actively used by the ## V1/V2 Branching Pattern Some services act as routers that branch on `RunEngineVersion`: + - `services/cancelTaskRun.server.ts` - calls V1 service or `engine.cancelRun()` for V2 - `services/batchTriggerV3.server.ts` - uses marqs for V1 path, run-engine for V2 diff --git a/.claude/rules/package-installation.md b/.claude/rules/package-installation.md index 310074823c5..c1ba14fb6ed 100644 --- a/.claude/rules/package-installation.md +++ b/.claude/rules/package-installation.md @@ -8,9 +8,11 @@ paths: When adding a new dependency to any package.json in the monorepo: 1. **Look up the latest version** on npm before adding: + ```bash pnpm view version ``` + If unsure which version to use (e.g. major version compatibility), confirm with the user. 2. **Edit the package.json directly** — do NOT use `pnpm add` as it can cause issues in the monorepo. Add the dependency with the correct version range (typically `^x.y.z`). diff --git a/.claude/skills/span-timeline-events/SKILL.md b/.claude/skills/span-timeline-events/SKILL.md index 122f49912d7..daccc567d23 100644 --- a/.claude/skills/span-timeline-events/SKILL.md +++ b/.claude/skills/span-timeline-events/SKILL.md @@ -52,15 +52,15 @@ Sibling spans (same parent) are sorted by `start_time ASC` from the ClickHouse q `getAdminOnlyForEvent()` controls visibility. Events default to **admin-only** (`true`). -| Event | Admin-only | Friendly name | -|-------|-----------|---------------| -| `dequeue` | No | Dequeued | -| `fork` | No | Launched | -| `import` | No (if no fork event) | Importing task file | -| `create_attempt` | Yes | Attempt created | -| `lazy_payload` | Yes | Lazy attempt initialized | -| `pod_scheduled` | Yes | Pod scheduled | -| (default) | Yes | (raw event name) | +| Event | Admin-only | Friendly name | +| ---------------- | --------------------- | ------------------------ | +| `dequeue` | No | Dequeued | +| `fork` | No | Launched | +| `import` | No (if no fork event) | Importing task file | +| `create_attempt` | Yes | Attempt created | +| `lazy_payload` | Yes | Lazy attempt initialized | +| `pod_scheduled` | Yes | Pod scheduled | +| (default) | Yes | (raw event name) | ## Adding New Timeline Events diff --git a/.claude/skills/trigger-dev-tasks/SKILL.md b/.claude/skills/trigger-dev-tasks/SKILL.md index 791c22c27ed..e33e1303fee 100644 --- a/.claude/skills/trigger-dev-tasks/SKILL.md +++ b/.claude/skills/trigger-dev-tasks/SKILL.md @@ -113,17 +113,18 @@ export const paymentTask = task({ ```ts await myTask.trigger(payload, { - delay: "1h", // Delay execution - ttl: "10m", // Cancel if not started within TTL + delay: "1h", // Delay execution + ttl: "10m", // Cancel if not started within TTL idempotencyKey: key, queue: "my-queue", - machine: "large-1x", // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x + machine: "large-1x", // micro, small-1x, small-2x, medium-1x, medium-2x, large-1x, large-2x maxAttempts: 3, - tags: ["user_123"], // Max 10 tags - debounce: { // Consolidate rapid triggers + tags: ["user_123"], // Max 10 tags + debounce: { + // Consolidate rapid triggers key: "unique-key", delay: "5s", - mode: "trailing", // "leading" (default) or "trailing" + mode: "trailing", // "leading" (default) or "trailing" }, }); ``` @@ -134,21 +135,27 @@ Consolidate multiple triggers into a single execution: ```ts // Rapid triggers with same key = single execution -await myTask.trigger({ userId: "123" }, { - debounce: { - key: "user-123-update", - delay: "5s", - }, -}); +await myTask.trigger( + { userId: "123" }, + { + debounce: { + key: "user-123-update", + delay: "5s", + }, + } +); // Trailing mode: use payload from LAST trigger -await myTask.trigger({ data: "latest" }, { - debounce: { - key: "my-key", - delay: "10s", - mode: "trailing", - }, -}); +await myTask.trigger( + { data: "latest" }, + { + debounce: { + key: "my-key", + delay: "10s", + mode: "trailing", + }, + } +); ``` Use cases: user activity updates, webhook deduplication, search indexing, notification batching. @@ -170,15 +177,15 @@ for (const result of results) { ## Machine Presets -| Preset | vCPU | Memory | -|-------------|------|--------| -| micro | 0.25 | 0.25GB | -| small-1x | 0.5 | 0.5GB | -| small-2x | 1 | 1GB | -| medium-1x | 1 | 2GB | -| medium-2x | 2 | 4GB | -| large-1x | 4 | 8GB | -| large-2x | 8 | 16GB | +| Preset | vCPU | Memory | +| --------- | ---- | ------ | +| micro | 0.25 | 0.25GB | +| small-1x | 0.5 | 0.5GB | +| small-2x | 1 | 1GB | +| medium-1x | 1 | 2GB | +| medium-2x | 2 | 4GB | +| large-1x | 4 | 8GB | +| large-2x | 8 | 16GB | ## Design Principles diff --git a/.claude/skills/trigger-dev-tasks/advanced-tasks.md b/.claude/skills/trigger-dev-tasks/advanced-tasks.md index 32a00337f89..90eb22b29ec 100644 --- a/.claude/skills/trigger-dev-tasks/advanced-tasks.md +++ b/.claude/skills/trigger-dev-tasks/advanced-tasks.md @@ -48,19 +48,19 @@ Enhanced batch triggering with larger payloads and streaming ingestion. ### Rate Limiting (per environment) -| Tier | Bucket Size | Refill Rate | -|------|-------------|-------------| -| Free | 1,200 runs | 100 runs/10 sec | -| Hobby | 5,000 runs | 500 runs/5 sec | -| Pro | 5,000 runs | 500 runs/5 sec | +| Tier | Bucket Size | Refill Rate | +| ----- | ----------- | --------------- | +| Free | 1,200 runs | 100 runs/10 sec | +| Hobby | 5,000 runs | 500 runs/5 sec | +| Pro | 5,000 runs | 500 runs/5 sec | ### Concurrent Batch Processing -| Tier | Concurrent Batches | -|------|-------------------| -| Free | 1 | -| Hobby | 10 | -| Pro | 10 | +| Tier | Concurrent Batches | +| ----- | ------------------ | +| Free | 1 | +| Hobby | 10 | +| Pro | 10 | ### Usage @@ -122,8 +122,8 @@ await myTask.trigger( { userId: "123" }, { debounce: { - key: "user-123-update", // Unique identifier for debounce group - delay: "5s", // Wait duration ("5s", "1m", or milliseconds) + key: "user-123-update", // Unique identifier for debounce group + delay: "5s", // Wait duration ("5s", "1m", or milliseconds) }, } ); @@ -135,14 +135,20 @@ await myTask.trigger( ```ts // First trigger sets the payload -await myTask.trigger({ action: "first" }, { - debounce: { key: "my-key", delay: "10s" } -}); +await myTask.trigger( + { action: "first" }, + { + debounce: { key: "my-key", delay: "10s" }, + } +); // Second trigger only reschedules - payload remains "first" -await myTask.trigger({ action: "second" }, { - debounce: { key: "my-key", delay: "10s" } -}); +await myTask.trigger( + { action: "second" }, + { + debounce: { key: "my-key", delay: "10s" }, + } +); // Task executes with { action: "first" } ``` @@ -162,6 +168,7 @@ await myTask.trigger( ``` In trailing mode, these options update with each trigger: + - `payload` — task input data - `metadata` — run metadata - `tags` — run tags (replaces existing) diff --git a/.claude/skills/trigger-dev-tasks/basic-tasks.md b/.claude/skills/trigger-dev-tasks/basic-tasks.md index 56bff340761..f7acf532d65 100644 --- a/.claude/skills/trigger-dev-tasks/basic-tasks.md +++ b/.claude/skills/trigger-dev-tasks/basic-tasks.md @@ -75,8 +75,8 @@ await myTask.trigger( { userId: "123" }, { debounce: { - key: "user-123-update", // Unique key for debounce group - delay: "5s", // Wait before executing + key: "user-123-update", // Unique key for debounce group + delay: "5s", // Wait before executing }, } ); @@ -88,13 +88,14 @@ await myTask.trigger( debounce: { key: "trailing-example", delay: "10s", - mode: "trailing", // Default is "leading" (first payload) + mode: "trailing", // Default is "leading" (first payload) }, } ); ``` **Debounce modes:** + - `leading` (default): Uses payload from first trigger, subsequent triggers only reschedule - `trailing`: Uses payload from most recent trigger diff --git a/.cursor/commands/deslop.md b/.cursor/commands/deslop.md index d82835663f7..51ecc654f9f 100644 --- a/.cursor/commands/deslop.md +++ b/.cursor/commands/deslop.md @@ -3,9 +3,10 @@ Check the diff against main, and remove all AI generated slop introduced in this branch. This includes: + - Extra comments that a human wouldn't add or is inconsistent with the rest of the file - Extra defensive checks or try/catch blocks that are abnormal for that area of the codebase (especially if called by trusted / validated codepaths) - Casts to any to get around type issues - Any other style that is inconsistent with the file -Report at the end with only a 1-3 sentence summary of what you changed \ No newline at end of file +Report at the end with only a 1-3 sentence summary of what you changed diff --git a/.github/labeler.yml b/.github/labeler.yml index 279bab91a79..6760c37bcd0 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -9,4 +9,4 @@ - any: ["**/*.md"] "📌 area: ci": - - any: [".github/**/*"] \ No newline at end of file + - any: [".github/**/*"] diff --git a/.github/workflows/dependabot-critical-alerts.yml b/.github/workflows/dependabot-critical-alerts.yml index e69e9c0af7b..9a61387324d 100644 --- a/.github/workflows/dependabot-critical-alerts.yml +++ b/.github/workflows/dependabot-critical-alerts.yml @@ -2,7 +2,7 @@ name: Dependabot Critical Alerts on: schedule: - - cron: "0 8 * * *" # Daily 08:00 UTC + - cron: "0 8 * * *" # Daily 08:00 UTC workflow_dispatch: inputs: severity: diff --git a/.github/workflows/dependabot-weekly-summary.yml b/.github/workflows/dependabot-weekly-summary.yml index 43463b488e4..d7b489d55da 100644 --- a/.github/workflows/dependabot-weekly-summary.yml +++ b/.github/workflows/dependabot-weekly-summary.yml @@ -2,7 +2,7 @@ name: Dependabot Weekly Summary on: schedule: - - cron: "0 8 * * 1" # Mon 08:00 UTC + - cron: "0 8 * * 1" # Mon 08:00 UTC workflow_dispatch: # Single-purpose monitoring workflow; serialise on workflow name only - we never @@ -12,9 +12,9 @@ concurrency: cancel-in-progress: false permissions: - contents: read # gh CLI baseline - pull-requests: read # gh pr list (open dependabot PRs) - actions: read # gh run list / view (parse latest dependabot run logs) + contents: read # gh CLI baseline + pull-requests: read # gh pr list (open dependabot PRs) + actions: read # gh run list / view (parse latest dependabot run logs) jobs: summary: diff --git a/.github/workflows/release-helm.yml b/.github/workflows/release-helm.yml index 6dbfee7d0c8..d21c62de8be 100644 --- a/.github/workflows/release-helm.yml +++ b/.github/workflows/release-helm.yml @@ -3,17 +3,17 @@ name: 🧭 Helm Chart Release on: push: tags: - - 'helm-v*' + - "helm-v*" workflow_call: inputs: chart_version: - description: 'Chart version to release' + description: "Chart version to release" required: true type: string workflow_dispatch: inputs: chart_version: - description: 'Chart version to release' + description: "Chart version to release" required: true type: string @@ -58,7 +58,7 @@ jobs: - name: Validate manifests uses: docker://ghcr.io/yannh/kubeconform:v0.7.0@sha256:85dbef6b4b312b99133decc9c6fc9495e9fc5f92293d4ff3b7e1b30f5611823c with: - entrypoint: '/kubeconform' + entrypoint: "/kubeconform" args: "-summary -output json ./helm-output" release: @@ -134,7 +134,7 @@ jobs: run: | VERSION="${STEPS_VERSION_OUTPUTS_VERSION}" CHART_PACKAGE="/tmp/${{ env.CHART_NAME }}-${VERSION}.tgz" - + # Push to GHCR OCI registry helm push "$CHART_PACKAGE" "oci://${{ env.REGISTRY }}/${{ github.repository_owner }}/charts" env: @@ -153,7 +153,7 @@ jobs: oci://${{ env.REGISTRY }}/${{ github.repository_owner }}/charts/${{ env.CHART_NAME }} \ --version "${{ steps.version.outputs.version }}" ``` - + ### Changes See commit history for detailed changes in this release. files: | diff --git a/.github/workflows/workflow-checks.yml b/.github/workflows/workflow-checks.yml index e99a4d33427..62406671fc5 100644 --- a/.github/workflows/workflow-checks.yml +++ b/.github/workflows/workflow-checks.yml @@ -4,14 +4,14 @@ on: push: branches: [main] paths: - - '.github/workflows/**' - - '.github/actions/**' - - '.github/zizmor.yml' + - ".github/workflows/**" + - ".github/actions/**" + - ".github/zizmor.yml" pull_request: paths: - - '.github/workflows/**' - - '.github/actions/**' - - '.github/zizmor.yml' + - ".github/workflows/**" + - ".github/actions/**" + - ".github/zizmor.yml" permissions: {} diff --git a/.github/zizmor.yml b/.github/zizmor.yml index 2fcbb540127..e7920e8cf17 100644 --- a/.github/zizmor.yml +++ b/.github/zizmor.yml @@ -2,4 +2,4 @@ rules: unpinned-uses: config: policies: - '*': hash-pin + "*": hash-pin diff --git a/.oxfmtrc.json b/.oxfmtrc.json index 90f19a65790..8671a4a622b 100644 --- a/.oxfmtrc.json +++ b/.oxfmtrc.json @@ -21,5 +21,6 @@ "**/storybook-static/", "**/.changeset/", "**/dist/", + "**/*.yaml" ] } diff --git a/AGENTS.md b/AGENTS.md index 8ff9f18663c..440088acb86 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,6 +3,7 @@ This repository is a pnpm monorepo managed with Turbo. It contains multiple apps and packages that make up the Trigger.dev platform and SDK. ## Repository layout + - `apps/webapp` – Remix application that serves as the main API and dashboard. - `apps/supervisor` – Node application for executing built tasks. - `packages/*` – Published packages such as `@trigger.dev/sdk`, the CLI (`trigger.dev`), and shared libraries. @@ -13,6 +14,7 @@ This repository is a pnpm monorepo managed with Turbo. It contains multiple apps See `ai/references/repo.md` for a more complete explanation of the workspaces. ## Development setup + 1. Install dependencies with `pnpm i` (pnpm `10.33.2` and Node.js `20.20.2` are required). 2. Copy `.env.example` to `.env` and generate a random 16 byte hex string for `ENCRYPTION_KEY` (`openssl rand -hex 16`). Update other secrets if needed. 3. Start the local services with Docker: @@ -37,6 +39,7 @@ See `ai/references/repo.md` for a more complete explanation of the workspaces. For full setup instructions see `CONTRIBUTING.md`. ## Running tests + - Unit tests use **vitest**. Run all tests: ```bash pnpm run test @@ -55,15 +58,16 @@ For full setup instructions see `CONTRIBUTING.md`. Refer to `ai/references/tests.md` for details on writing tests. Tests should avoid mocks or stubs and use the helpers from `@internal/testcontainers` when Redis or Postgres are needed. ## Coding style + - Formatting is enforced using Prettier. Run `pnpm run format` before committing. - Follow the existing project conventions. Test files live beside the files under test and use descriptive `describe` and `it` blocks. - Do not commit directly to the `main` branch. All changes should be made in a separate branch and go through a pull request. ## Additional docs + - The root `README.md` describes Trigger.dev and links to documentation. - The `docs` workspace contains our documentation site, which can be run locally with: ```bash pnpm run dev --filter docs ``` - The [`triggerdotdev/references`](https://github.com/triggerdotdev/references) repo's README explains how to create new reference projects for manual testing. - diff --git a/CHANGESETS.md b/CHANGESETS.md index 2e225b9ad34..85a5f431dbd 100644 --- a/CHANGESETS.md +++ b/CHANGESETS.md @@ -30,11 +30,11 @@ See `.server-changes/README.md` for full documentation. ## When to add which -| PR changes | What to add | -|---|---| +| PR changes | What to add | +| --------------------------- | ------------------------------------ | | Only packages (`packages/`) | Changeset (`pnpm run changeset:add`) | -| Only server (`apps/`) | `.server-changes/` file | -| Both packages and server | Just the changeset | +| Only server (`apps/`) | `.server-changes/` file | +| Both packages and server | Just the changeset | ## Release instructions (CI) diff --git a/CLAUDE.md b/CLAUDE.md index c0fd82fb368..ee0e537c717 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,6 +74,7 @@ containerTest("should use both", async ({ prisma, redisOptions }) => { ### Imports **Prefer static imports over dynamic imports.** Only use dynamic `import()` when: + - Circular dependencies cannot be resolved otherwise - Code splitting is genuinely needed for performance - The module must be loaded conditionally at runtime diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 32c9b3a9b11..1a605fa9f43 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index cddb974417d..a61f565dfdf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -275,6 +275,7 @@ EOF ``` **Fields:** + - `area` (required): `webapp` | `supervisor` | `coordinator` | `kubernetes-provider` | `docker-provider` - `type` (required): `feature` | `fix` | `improvement` | `breaking` @@ -282,11 +283,11 @@ The body text (below the frontmatter) is a one-line description of the change. K **When to add which:** -| PR changes | What to add | -|---|---| -| Only packages (`packages/`) | Changeset | -| Only server (`apps/`) | `.server-changes/` file | -| Both packages and server | Just the changeset | +| PR changes | What to add | +| --------------------------- | ----------------------- | +| Only packages (`packages/`) | Changeset | +| Only server (`apps/`) | `.server-changes/` file | +| Both packages and server | Just the changeset | See `.server-changes/README.md` for more details. diff --git a/DOCKER_INSTALLATION.md b/DOCKER_INSTALLATION.md index 7e135bd6f84..2a6f0f25c39 100644 --- a/DOCKER_INSTALLATION.md +++ b/DOCKER_INSTALLATION.md @@ -28,7 +28,6 @@ To install Docker Compose on Linux Ubuntu, you can follow these steps: ``` Note: - - To install for all users, replace `$DOCKER_CONFIG/cli-plugins` with `/usr/local/lib/docker/cli-plugins` 3. Set the appropriate permissions to make the Docker Compose plugin executable: diff --git a/README.md b/README.md index 0d7f1ca2930..d34d056f0fd 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ### Build and deploy fully‑managed AI agents and workflows -[Website](https://trigger.dev) | [Docs](https://trigger.dev/docs) | [Issues](https://github.com/triggerdotdev/trigger.dev/issues) | [Example projects](https://github.com/triggerdotdev/examples) | [Feature requests](https://triggerdev.featurebase.app/) | [Public roadmap](https://triggerdev.featurebase.app/roadmap) | [Self-hosting](https://trigger.dev/docs/self-hosting/overview) +[Website](https://trigger.dev) | [Docs](https://trigger.dev/docs) | [Issues](https://github.com/triggerdotdev/trigger.dev/issues) | [Example projects](https://github.com/triggerdotdev/examples) | [Feature requests](https://triggerdev.featurebase.app/) | [Public roadmap](https://triggerdev.featurebase.app/roadmap) | [Self-hosting](https://trigger.dev/docs/self-hosting/overview) [![Open Source](https://img.shields.io/badge/Open%20Source-%E2%9D%A4-red.svg)](https://github.com/triggerdotdev/trigger.dev) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](https://github.com/triggerdotdev/trigger.dev/blob/main/LICENSE) diff --git a/apps/coordinator/package.json b/apps/coordinator/package.json index 3b4240bd37d..446606a44c8 100644 --- a/apps/coordinator/package.json +++ b/apps/coordinator/package.json @@ -27,4 +27,4 @@ "esbuild": "^0.19.11", "tsx": "^4.7.0" } -} \ No newline at end of file +} diff --git a/apps/docker-provider/package.json b/apps/docker-provider/package.json index f3e4015ef08..aa812c68d4a 100644 --- a/apps/docker-provider/package.json +++ b/apps/docker-provider/package.json @@ -24,4 +24,4 @@ "esbuild": "^0.19.11", "tsx": "^4.7.0" } -} \ No newline at end of file +} diff --git a/apps/kubernetes-provider/package.json b/apps/kubernetes-provider/package.json index 6cb26e2c70f..b4a4307abbb 100644 --- a/apps/kubernetes-provider/package.json +++ b/apps/kubernetes-provider/package.json @@ -25,4 +25,4 @@ "esbuild": "^0.19.11", "tsx": "^4.7.0" } -} \ No newline at end of file +} diff --git a/apps/supervisor/src/backpressure/redisBackpressureSignalSource.test.ts b/apps/supervisor/src/backpressure/redisBackpressureSignalSource.test.ts index 77a7457b13c..dc8040a4c5e 100644 --- a/apps/supervisor/src/backpressure/redisBackpressureSignalSource.test.ts +++ b/apps/supervisor/src/backpressure/redisBackpressureSignalSource.test.ts @@ -49,14 +49,17 @@ describe("RedisBackpressureSignalSource", () => { } }); - redisTest("returns null for valid JSON of the wrong shape (fail-open)", async ({ redisOptions }) => { - const redis = new Redis(redisOptions); - try { - await redis.set(KEY, JSON.stringify({ foo: "bar" })); - const source = new RedisBackpressureSignalSource(redis, KEY); - expect(await source.read()).toBeNull(); - } finally { - await redis.quit(); + redisTest( + "returns null for valid JSON of the wrong shape (fail-open)", + async ({ redisOptions }) => { + const redis = new Redis(redisOptions); + try { + await redis.set(KEY, JSON.stringify({ foo: "bar" })); + const source = new RedisBackpressureSignalSource(redis, KEY); + expect(await source.read()).toBeNull(); + } finally { + await redis.quit(); + } } - }); + ); }); diff --git a/apps/supervisor/src/env.ts b/apps/supervisor/src/env.ts index 99d440820a7..47fdefe6691 100644 --- a/apps/supervisor/src/env.ts +++ b/apps/supervisor/src/env.ts @@ -326,7 +326,10 @@ const Env = z path: ["TRIGGER_WORKLOAD_API_DOMAIN"], }); } - if (data.TRIGGER_DEQUEUE_BACKPRESSURE_ENABLED && !data.TRIGGER_DEQUEUE_BACKPRESSURE_REDIS_HOST) { + if ( + data.TRIGGER_DEQUEUE_BACKPRESSURE_ENABLED && + !data.TRIGGER_DEQUEUE_BACKPRESSURE_REDIS_HOST + ) { ctx.addIssue({ code: z.ZodIssueCode.custom, message: diff --git a/apps/supervisor/src/services/computeSnapshotService.test.ts b/apps/supervisor/src/services/computeSnapshotService.test.ts index b039b63bd4d..44a13a4bdd3 100644 --- a/apps/supervisor/src/services/computeSnapshotService.test.ts +++ b/apps/supervisor/src/services/computeSnapshotService.test.ts @@ -10,7 +10,9 @@ const DELAY_MS = 200; const SETTLE_MS = 600; function createService() { - const snapshot = vi.fn(async (_opts: { runnerId: string; metadata: Record }) => true); + const snapshot = vi.fn( + async (_opts: { runnerId: string; metadata: Record }) => true + ); const computeManager = { snapshotDelayMs: DELAY_MS, @@ -97,9 +99,7 @@ describe("ComputeSnapshotService", () => { expect(service.cancel("run_1", "runner-b")).toBe(false); await vi.waitFor(() => expect(snapshot).toHaveBeenCalledTimes(1), { timeout: 2_000 }); - expect(snapshot).toHaveBeenCalledWith( - expect.objectContaining({ runnerId: "runner-a" }) - ); + expect(snapshot).toHaveBeenCalledWith(expect.objectContaining({ runnerId: "runner-a" })); } finally { service.stop(); } diff --git a/apps/supervisor/src/services/otlpTraceService.test.ts b/apps/supervisor/src/services/otlpTraceService.test.ts index baf3bd90306..95053021ca1 100644 --- a/apps/supervisor/src/services/otlpTraceService.test.ts +++ b/apps/supervisor/src/services/otlpTraceService.test.ts @@ -31,9 +31,7 @@ describe("buildPayload", () => { expect(triggerAttr).toEqual({ key: "$trigger", value: { boolValue: true } }); // Resource attributes - const envAttr = resourceSpan.resource.attributes.find( - (a) => a.key === "ctx.environment.id" - ); + const envAttr = resourceSpan.resource.attributes.find((a) => a.key === "ctx.environment.id"); expect(envAttr).toEqual({ key: "ctx.environment.id", value: { stringValue: "env_123" }, diff --git a/apps/supervisor/src/services/warmStartVerificationService.test.ts b/apps/supervisor/src/services/warmStartVerificationService.test.ts index 994c678b4b8..4a5f58875c2 100644 --- a/apps/supervisor/src/services/warmStartVerificationService.test.ts +++ b/apps/supervisor/src/services/warmStartVerificationService.test.ts @@ -19,10 +19,7 @@ function makeMessage(runFriendlyId = "run_1"): DequeuedMessage { } as unknown as DequeuedMessage; } -function createService(opts: { - latestSnapshotId?: string; - probeError?: boolean; -}) { +function createService(opts: { latestSnapshotId?: string; probeError?: boolean }) { const getLatestSnapshot = vi.fn(async (_runId: string) => opts.probeError ? { success: false as const, error: "connection refused" } diff --git a/apps/supervisor/src/wideEvents/index.ts b/apps/supervisor/src/wideEvents/index.ts index 4eda429a50a..6e61d85896f 100644 --- a/apps/supervisor/src/wideEvents/index.ts +++ b/apps/supervisor/src/wideEvents/index.ts @@ -11,12 +11,7 @@ export { type Env, isValidRequestId, newState, type NewStateOptions } from "./ne export { emit, EmitMessage } from "./emit.js"; export { parseTraceId } from "./traceparent.js"; export { fromContext, wideEventStorage } from "./context.js"; -export { - type PhaseOpt, - recordPhase, - recordPhaseSince, - timePhase, -} from "./record.js"; +export { type PhaseOpt, recordPhase, recordPhaseSince, timePhase } from "./record.js"; export { emitOneShot, runWideEvent, diff --git a/apps/supervisor/src/wideEvents/middleware.test.ts b/apps/supervisor/src/wideEvents/middleware.test.ts index afb59f43d6e..a431df4ada5 100644 --- a/apps/supervisor/src/wideEvents/middleware.test.ts +++ b/apps/supervisor/src/wideEvents/middleware.test.ts @@ -124,7 +124,8 @@ describe("runWideEvent", () => { { service: "supervisor", env: {}, - enabled: true, op: "test", + enabled: true, + op: "test", setup: (state) => { state.meta.run_id = "run_abc"; state.extras.iteration = "dequeue"; @@ -158,16 +159,13 @@ describe("runWideEvent", () => { const lines = await captureStdout(async () => { await Promise.all( ["a", "b", "c"].map((tag) => - runWideEvent( - { service: "supervisor", env: {}, enabled: true, op: "test" }, - async () => { - const s = fromContext(); - if (!s) throw new Error("no state"); - s.meta.tag = tag; - await new Promise((r) => setTimeout(r, 5)); - expect(s.meta.tag).toBe(tag); - } - ) + runWideEvent({ service: "supervisor", env: {}, enabled: true, op: "test" }, async () => { + const s = fromContext(); + if (!s) throw new Error("no state"); + s.meta.tag = tag; + await new Promise((r) => setTimeout(r, 5)); + expect(s.meta.tag).toBe(tag); + }) ) ); }); @@ -182,7 +180,8 @@ describe("emitOneShot", () => { emitOneShot({ service: "supervisor", env: {}, - enabled: true, op: "test", + enabled: true, + op: "test", populate: (s) => { s.meta.run_id = "run_abc"; s.extras.event = "run:start"; diff --git a/apps/supervisor/src/workloadManager/compute.test.ts b/apps/supervisor/src/workloadManager/compute.test.ts index ea5ddabf285..95a9ca2f3b0 100644 --- a/apps/supervisor/src/workloadManager/compute.test.ts +++ b/apps/supervisor/src/workloadManager/compute.test.ts @@ -15,9 +15,7 @@ describe("runnerNameForAttempt", () => { describe("isRetryableCreateError", () => { it("retries statuses where the create definitely did not commit", () => { - expect(isRetryableCreateError(new ComputeClientError(500, "tap busy", "http://gw"))).toBe( - true - ); + expect(isRetryableCreateError(new ComputeClientError(500, "tap busy", "http://gw"))).toBe(true); expect(isRetryableCreateError(new ComputeClientError(503, "no placement", "http://gw"))).toBe( true ); diff --git a/apps/supervisor/src/workloadManager/compute.ts b/apps/supervisor/src/workloadManager/compute.ts index 88c7645bbdf..bb63c04b5a0 100644 --- a/apps/supervisor/src/workloadManager/compute.ts +++ b/apps/supervisor/src/workloadManager/compute.ts @@ -248,9 +248,7 @@ export class ComputeWorkloadManager implements WorkloadManager { // name registered, so subsequent attempts use a suffixed name. let suffixAttempts = false; for (; attempt <= this.createMaxAttempts; attempt++) { - const attemptRunnerId = suffixAttempts - ? runnerNameForAttempt(runnerId, attempt) - : runnerId; + const attemptRunnerId = suffixAttempts ? runnerNameForAttempt(runnerId, attempt) : runnerId; [error, data] = await tryCatch( this.compute.instances.create( attemptRunnerId === runnerId diff --git a/apps/supervisor/src/workloadManager/kubernetes.ts b/apps/supervisor/src/workloadManager/kubernetes.ts index b2ed05c9f11..11afb2c447d 100644 --- a/apps/supervisor/src/workloadManager/kubernetes.ts +++ b/apps/supervisor/src/workloadManager/kubernetes.ts @@ -427,7 +427,8 @@ export class KubernetesWorkloadManager implements WorkloadManager { // Only large machine affinity produces hard requirements (non-large runs must stay off the large pool). // Schedule affinity is soft both ways. const required = [ - ...(largeNodeAffinity?.requiredDuringSchedulingIgnoredDuringExecution?.nodeSelectorTerms ?? []), + ...(largeNodeAffinity?.requiredDuringSchedulingIgnoredDuringExecution?.nodeSelectorTerms ?? + []), ]; const hasNodeAffinity = preferred.length > 0 || required.length > 0; @@ -439,7 +440,9 @@ export class KubernetesWorkloadManager implements WorkloadManager { return { ...(hasNodeAffinity && { nodeAffinity: { - ...(preferred.length > 0 && { preferredDuringSchedulingIgnoredDuringExecution: preferred }), + ...(preferred.length > 0 && { + preferredDuringSchedulingIgnoredDuringExecution: preferred, + }), ...(required.length > 0 && { requiredDuringSchedulingIgnoredDuringExecution: { nodeSelectorTerms: required }, }), @@ -493,7 +496,10 @@ export class KubernetesWorkloadManager implements WorkloadManager { } #getScheduleNodeAffinityRules(isScheduledRun: boolean): k8s.V1NodeAffinity | undefined { - if (!env.KUBERNETES_SCHEDULED_RUN_AFFINITY_ENABLED || !env.KUBERNETES_SCHEDULED_RUN_AFFINITY_POOL_LABEL_VALUE) { + if ( + !env.KUBERNETES_SCHEDULED_RUN_AFFINITY_ENABLED || + !env.KUBERNETES_SCHEDULED_RUN_AFFINITY_POOL_LABEL_VALUE + ) { return undefined; } diff --git a/apps/supervisor/src/workloadManager/types.ts b/apps/supervisor/src/workloadManager/types.ts index 86199afe469..ee759cb8a79 100644 --- a/apps/supervisor/src/workloadManager/types.ts +++ b/apps/supervisor/src/workloadManager/types.ts @@ -1,4 +1,9 @@ -import type { EnvironmentType, MachinePreset, PlacementTag, RunAnnotations } from "@trigger.dev/core/v3"; +import type { + EnvironmentType, + MachinePreset, + PlacementTag, + RunAnnotations, +} from "@trigger.dev/core/v3"; export interface WorkloadManagerOptions { workloadApiProtocol: "http" | "https"; diff --git a/apps/supervisor/src/workloadServer/index.ts b/apps/supervisor/src/workloadServer/index.ts index bf4b38012d5..9934d257988 100644 --- a/apps/supervisor/src/workloadServer/index.ts +++ b/apps/supervisor/src/workloadServer/index.ts @@ -317,9 +317,7 @@ export class WorkloadServer extends EventEmitter { return; } - reply.json( - completeResponse.data satisfies WorkloadRunAttemptCompleteResponseBody - ); + reply.json(completeResponse.data satisfies WorkloadRunAttemptCompleteResponseBody); return; } ), @@ -566,7 +564,9 @@ export class WorkloadServer extends EventEmitter { } reply.json( - dequeueResponse.data.map(legacifyCheckpointType) satisfies WorkloadDequeueFromVersionResponseBody + dequeueResponse.data.map( + legacifyCheckpointType + ) satisfies WorkloadDequeueFromVersionResponseBody ); } ), @@ -616,16 +616,22 @@ export class WorkloadServer extends EventEmitter { httpServer.route("/api/v1/compute/snapshot-complete", "POST", { bodySchema: SnapshotCallbackPayloadSchema, handler: async (ctx) => - this.wideRoute(ctx, "snapshot.callback", "/api/v1/compute/snapshot-complete", "POST", async () => { - const { reply, body } = ctx; - if (!this.snapshotService) { - reply.empty(404); - return; - } + this.wideRoute( + ctx, + "snapshot.callback", + "/api/v1/compute/snapshot-complete", + "POST", + async () => { + const { reply, body } = ctx; + if (!this.snapshotService) { + reply.empty(404); + return; + } - const result = await this.snapshotService.handleCallback(body); - reply.empty(result.status); - }), + const result = await this.snapshotService.handleCallback(body); + reply.empty(result.status); + } + ), }); return httpServer; diff --git a/apps/webapp/CLAUDE.md b/apps/webapp/CLAUDE.md index a4de6ab57b7..eb4f2f78775 100644 --- a/apps/webapp/CLAUDE.md +++ b/apps/webapp/CLAUDE.md @@ -75,6 +75,7 @@ const signal = getRequestAbortSignal(); Access via `env` export from `app/env.server.ts`. **Never use `process.env` directly.** For testable code, **never import env.server.ts** in test files. Pass configuration as options instead: + - `realtimeClient.server.ts` (testable service, takes config as constructor arg) - `realtimeClientGlobal.server.ts` (creates singleton with env config) @@ -87,6 +88,7 @@ The `engineVersion.server.ts` file determines V1 vs V2 for a given environment. ## Background Workers Background job workers use `@trigger.dev/redis-worker`: + - `app/v3/commonWorker.server.ts` - `app/v3/alertsWorker.server.ts` - `app/v3/batchTriggerWorker.server.ts` @@ -101,6 +103,7 @@ Do NOT add new jobs using zodworker/graphile-worker (legacy). ## Legacy V1 Code The `app/v3/` directory name is misleading - most code is actively used by V2. Only these specific files are V1-only legacy: + - `app/v3/marqs/` (old MarQS queue system) - `app/v3/legacyRunEngineWorker.server.ts` - `app/v3/services/triggerTaskV1.server.ts` diff --git a/apps/webapp/app/assets/icons/AIPenIcon.tsx b/apps/webapp/app/assets/icons/AIPenIcon.tsx index 65f6fdb2f38..146edd0e6d2 100644 --- a/apps/webapp/app/assets/icons/AIPenIcon.tsx +++ b/apps/webapp/app/assets/icons/AIPenIcon.tsx @@ -19,13 +19,7 @@ export function AIPenIcon({ className }: { className?: string }) { stroke="currentColor" strokeWidth="2" /> - + ); } diff --git a/apps/webapp/app/assets/icons/AiProviderIcons.tsx b/apps/webapp/app/assets/icons/AiProviderIcons.tsx index 2be3fe38ed7..418cdeff569 100644 --- a/apps/webapp/app/assets/icons/AiProviderIcons.tsx +++ b/apps/webapp/app/assets/icons/AiProviderIcons.tsx @@ -147,7 +147,12 @@ export function CerebrasIcon({ className }: IconProps) { export function MistralIcon({ className }: IconProps) { return ( - + @@ -174,4 +179,3 @@ export function AzureIcon({ className }: IconProps) { ); } - diff --git a/apps/webapp/app/assets/icons/AttemptIcon.tsx b/apps/webapp/app/assets/icons/AttemptIcon.tsx index de2a886b9d5..4b6c7f03698 100644 --- a/apps/webapp/app/assets/icons/AttemptIcon.tsx +++ b/apps/webapp/app/assets/icons/AttemptIcon.tsx @@ -8,22 +8,8 @@ export function AttemptIcon({ className }: { className?: string }) { fill="none" xmlns="http://www.w3.org/2000/svg" > - - + + - + ); } diff --git a/apps/webapp/app/assets/icons/FunctionIcon.tsx b/apps/webapp/app/assets/icons/FunctionIcon.tsx index 2defe9c2f8d..11b630ac2fa 100644 --- a/apps/webapp/app/assets/icons/FunctionIcon.tsx +++ b/apps/webapp/app/assets/icons/FunctionIcon.tsx @@ -8,15 +8,7 @@ export function FunctionIcon({ className }: { className?: string }) { fill="none" xmlns="http://www.w3.org/2000/svg" > - + - + - + setHovered(true)} onMouseLeave={() => setHovered(false)} > - + - + + diff --git a/apps/webapp/app/assets/icons/StreamsIcon.tsx b/apps/webapp/app/assets/icons/StreamsIcon.tsx index 73cc480f4d4..8deb7a19c9e 100644 --- a/apps/webapp/app/assets/icons/StreamsIcon.tsx +++ b/apps/webapp/app/assets/icons/StreamsIcon.tsx @@ -1,10 +1,24 @@ export function StreamsIcon({ className }: { className?: string }) { return ( - - - - - + + + + + ); } - diff --git a/apps/webapp/app/assets/icons/TextSquareIcon.tsx b/apps/webapp/app/assets/icons/TextSquareIcon.tsx index d25faf6d0ba..cffb0aa9d2e 100644 --- a/apps/webapp/app/assets/icons/TextSquareIcon.tsx +++ b/apps/webapp/app/assets/icons/TextSquareIcon.tsx @@ -9,10 +9,42 @@ export function TextSquareIcon({ className }: { className?: string }) { xmlns="http://www.w3.org/2000/svg" > - - - - + + + + ); } diff --git a/apps/webapp/app/clientBeforeFirstRender.ts b/apps/webapp/app/clientBeforeFirstRender.ts index 3275c54423a..5b5b6404221 100644 --- a/apps/webapp/app/clientBeforeFirstRender.ts +++ b/apps/webapp/app/clientBeforeFirstRender.ts @@ -22,10 +22,7 @@ function cleanupLegacyResizablePanelStorage() { const toRemove: string[] = []; for (let i = 0; i < window.localStorage.length; i++) { const key = window.localStorage.key(i); - if ( - key && - (key.startsWith("panel-group-react-aria") || key === "panel-run-parent-v2") - ) { + if (key && (key.startsWith("panel-group-react-aria") || key === "panel-run-parent-v2")) { toRemove.push(key); } } diff --git a/apps/webapp/app/components/AskAI.tsx b/apps/webapp/app/components/AskAI.tsx index 814d4649c8f..bf76654cced 100644 --- a/apps/webapp/app/components/AskAI.tsx +++ b/apps/webapp/app/components/AskAI.tsx @@ -134,11 +134,7 @@ function AskAIProvider({ websiteId, isCollapsed = false }: AskAIProviderProps) { - + Ask AI diff --git a/apps/webapp/app/components/BlankStatePanels.tsx b/apps/webapp/app/components/BlankStatePanels.tsx index c52991d5435..04959680fdb 100644 --- a/apps/webapp/app/components/BlankStatePanels.tsx +++ b/apps/webapp/app/components/BlankStatePanels.tsx @@ -207,17 +207,17 @@ export function SessionsNone() { } > - A session is a stateful execution of an agent, with two-way streaming and durable - compute. A single session can have multiple runs associated with it, so one conversation - can span many task triggers. The input stream carries incoming user messages, and the - output stream carries everything the agent produces, including AI generation parts (text, - reasoning, tool calls, etc.) and any custom data parts your task emits. + A session is a stateful execution of an agent, with two-way streaming and durable compute. A + single session can have multiple runs associated with it, so one conversation can span many + task triggers. The input stream carries incoming user messages, and the output stream + carries everything the agent produces, including AI generation parts (text, reasoning, tool + calls, etc.) and any custom data parts your task emits. The easiest way to create one is to trigger a chat.agent task, which is built on sessions and handles the chat turn loop for you. You can also call{" "} - sessions.start() directly for non-chat patterns like agent - inboxes, approval flows, or server-to-server streaming. + sessions.start() directly for non-chat patterns like agent inboxes, + approval flows, or server-to-server streaming. ); diff --git a/apps/webapp/app/components/DevPresence.tsx b/apps/webapp/app/components/DevPresence.tsx index 7a99dab37a5..addb85e14f7 100644 --- a/apps/webapp/app/components/DevPresence.tsx +++ b/apps/webapp/app/components/DevPresence.tsx @@ -154,8 +154,8 @@ export function DevPresencePanel({ isConnected }: { isConnected: boolean | undef {isConnected === undefined ? "Checking connection..." : isConnected - ? "Your dev server is connected" - : "Your dev server is not connected"} + ? "Your dev server is connected" + : "Your dev server is not connected"}
@@ -169,8 +169,8 @@ export function DevPresencePanel({ isConnected }: { isConnected: boolean | undef {isConnected === undefined ? "Checking connection..." : isConnected - ? "Your local dev server is connected to Trigger.dev" - : "Your local dev server is not connected to Trigger.dev"} + ? "Your local dev server is connected to Trigger.dev" + : "Your local dev server is not connected to Trigger.dev"}
{isConnected ? null : ( diff --git a/apps/webapp/app/components/LoginPageLayout.tsx b/apps/webapp/app/components/LoginPageLayout.tsx index 3e42cd6894f..323faf4ea26 100644 --- a/apps/webapp/app/components/LoginPageLayout.tsx +++ b/apps/webapp/app/components/LoginPageLayout.tsx @@ -63,8 +63,8 @@ export function LoginPageLayout({ children }: { children: React.ReactNode }) {
{children}
- Having login issues? Email us{" "} - or ask us in Discord + Having login issues? Email us or{" "} + ask us in Discord diff --git a/apps/webapp/app/components/SetupCommands.tsx b/apps/webapp/app/components/SetupCommands.tsx index accb2f65a8f..d219b0be721 100644 --- a/apps/webapp/app/components/SetupCommands.tsx +++ b/apps/webapp/app/components/SetupCommands.tsx @@ -209,7 +209,10 @@ export function TriggerLoginStepV3({ title }: TabsProps) { ); } -export function TriggerDeployStep({ title, environment }: TabsProps & { environment: { type: string } }) { +export function TriggerDeployStep({ + title, + environment, +}: TabsProps & { environment: { type: string } }) { const triggerCliTag = useTriggerCliTag(); const { activePackageManager, setActivePackageManager } = usePackageManager(); diff --git a/apps/webapp/app/components/Shortcuts.tsx b/apps/webapp/app/components/Shortcuts.tsx index 4702f37239c..63b5fddf715 100644 --- a/apps/webapp/app/components/Shortcuts.tsx +++ b/apps/webapp/app/components/Shortcuts.tsx @@ -4,13 +4,7 @@ import { useShortcutKeys } from "~/hooks/useShortcutKeys"; import { Button } from "./primitives/Buttons"; import { Header3 } from "./primitives/Headers"; import { Paragraph } from "./primitives/Paragraph"; -import { - Sheet, - SheetContent, - SheetHeader, - SheetTitle, - SheetTrigger -} from "./primitives/SheetV3"; +import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetTrigger } from "./primitives/SheetV3"; import { ShortcutKey } from "./primitives/ShortcutKey"; export function Shortcuts() { @@ -83,7 +77,7 @@ function ShortcutContent() { - + diff --git a/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.server.ts b/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.server.ts index 4855c4c2465..7de475bda8e 100644 --- a/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.server.ts +++ b/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.server.ts @@ -40,9 +40,7 @@ export const apiRateLimitDomain: RateLimitDomain = { }, }; -export function resolveEffectiveApiRateLimit( - override: unknown -): EffectiveRateLimit { +export function resolveEffectiveApiRateLimit(override: unknown): EffectiveRateLimit { return resolveEffectiveRateLimit(override, apiRateLimitDomain); } diff --git a/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.tsx b/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.tsx index b27956f4360..6b13bac8b4f 100644 --- a/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.tsx +++ b/apps/webapp/app/components/admin/backOffice/ApiRateLimitSection.tsx @@ -1,17 +1,8 @@ -import { - RateLimitSection, - type RateLimitWrapperProps, -} from "./RateLimitSection"; +import { RateLimitSection, type RateLimitWrapperProps } from "./RateLimitSection"; export const API_RATE_LIMIT_INTENT = "set-rate-limit"; export const API_RATE_LIMIT_SAVED_VALUE = "rate-limit"; export function ApiRateLimitSection(props: RateLimitWrapperProps) { - return ( - - ); + return ; } diff --git a/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.server.ts b/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.server.ts index 83a368094a9..3891e4fc40c 100644 --- a/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.server.ts +++ b/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.server.ts @@ -40,9 +40,7 @@ export const batchRateLimitDomain: RateLimitDomain = { }, }; -export function resolveEffectiveBatchRateLimit( - override: unknown -): EffectiveRateLimit { +export function resolveEffectiveBatchRateLimit(override: unknown): EffectiveRateLimit { return resolveEffectiveRateLimit(override, batchRateLimitDomain); } diff --git a/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.tsx b/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.tsx index 0e52124d290..64ee6a05d41 100644 --- a/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.tsx +++ b/apps/webapp/app/components/admin/backOffice/BatchRateLimitSection.tsx @@ -1,17 +1,8 @@ -import { - RateLimitSection, - type RateLimitWrapperProps, -} from "./RateLimitSection"; +import { RateLimitSection, type RateLimitWrapperProps } from "./RateLimitSection"; export const BATCH_RATE_LIMIT_INTENT = "set-batch-rate-limit"; export const BATCH_RATE_LIMIT_SAVED_VALUE = "batch-rate-limit"; export function BatchRateLimitSection(props: RateLimitWrapperProps) { - return ( - - ); + return ; } diff --git a/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx b/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx index bf8ecf83161..8aa4b5c93c9 100644 --- a/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx +++ b/apps/webapp/app/components/admin/backOffice/MaxProjectsSection.tsx @@ -68,9 +68,7 @@ export function MaxProjectsSection({ Limit - - {maximumProjectCount.toLocaleString()} - + {maximumProjectCount.toLocaleString()} ) : ( @@ -89,11 +87,7 @@ export function MaxProjectsSection({ {fieldError("maximumProjectCount")}
-
{isLoading ? ( diff --git a/apps/webapp/app/components/code/QueryResultsChart.tsx b/apps/webapp/app/components/code/QueryResultsChart.tsx index 2c3f1c9f2bf..97013c192a4 100644 --- a/apps/webapp/app/components/code/QueryResultsChart.tsx +++ b/apps/webapp/app/components/code/QueryResultsChart.tsx @@ -872,10 +872,7 @@ export const QueryResultsChart = memo(function QueryResultsChart({ ); // Create value formatter for tooltips and legend based on column format - const tooltipValueFormatter = useMemo( - () => createValueFormatter(yAxisFormat), - [yAxisFormat] - ); + const tooltipValueFormatter = useMemo(() => createValueFormatter(yAxisFormat), [yAxisFormat]); // Check if the group-by column has a runStatus customRenderType const groupByIsRunStatus = useMemo(() => { @@ -1181,9 +1178,7 @@ function createYAxisFormatter( if (format === "bytes" || format === "decimalBytes") { const divisor = format === "bytes" ? 1024 : 1000; const units = - format === "bytes" - ? ["B", "KiB", "MiB", "GiB", "TiB"] - : ["B", "KB", "MB", "GB", "TB"]; + format === "bytes" ? ["B", "KiB", "MiB", "GiB", "TiB"] : ["B", "KB", "MB", "GB", "TB"]; return (value: number): string => { if (value === 0) return "0 B"; // Use consistent unit for all ticks based on max value @@ -1205,8 +1200,7 @@ function createYAxisFormatter( } if (format === "durationSeconds") { - return (value: number): string => - formatDurationMilliseconds(value * 1000, { style: "short" }); + return (value: number): string => formatDurationMilliseconds(value * 1000, { style: "short" }); } if (format === "durationNs") { diff --git a/apps/webapp/app/components/code/TSQLResultsTable.tsx b/apps/webapp/app/components/code/TSQLResultsTable.tsx index 73ca07180bf..8e10f8e6faa 100644 --- a/apps/webapp/app/components/code/TSQLResultsTable.tsx +++ b/apps/webapp/app/components/code/TSQLResultsTable.tsx @@ -186,10 +186,10 @@ const fuzzyFilter: FilterFn = (row, columnId, value, addMeta) => { cellValue === null ? "NULL" : cellValue === undefined - ? "" - : typeof cellValue === "object" - ? JSON.stringify(cellValue) - : String(cellValue); + ? "" + : typeof cellValue === "object" + ? JSON.stringify(cellValue) + : String(cellValue); // Build searchable strings - formatted value (if we have column metadata) const formattedValue = meta?.outputColumn @@ -569,12 +569,8 @@ function CellValue({ if (typeof value === "string") { const spanId = row?.["span_id"]; const runPath = v3RunPathFromFriendlyId(value); - const href = typeof spanId === "string" && spanId - ? `${runPath}?span=${spanId}` - : runPath; - const tooltip = typeof spanId === "string" && spanId - ? "Jump to span" - : "Jump to run"; + const href = typeof spanId === "string" && spanId ? `${runPath}?span=${spanId}` : runPath; + const tooltip = typeof spanId === "string" && spanId ? "Jump to span" : "Jump to run"; return ( hiddenColumns?.length ? columns.filter((col) => !hiddenColumns.includes(col.name)) : columns, + () => + hiddenColumns?.length ? columns.filter((col) => !hiddenColumns.includes(col.name)) : columns, [columns, hiddenColumns] ); const columnDefs = useMemo[]>( diff --git a/apps/webapp/app/components/code/codeMirrorTheme.ts b/apps/webapp/app/components/code/codeMirrorTheme.ts index 2faed6eaa54..c9dd2f12e86 100644 --- a/apps/webapp/app/components/code/codeMirrorTheme.ts +++ b/apps/webapp/app/components/code/codeMirrorTheme.ts @@ -67,10 +67,9 @@ export function darkTheme(): Extension { }, ".cm-cursor, .cm-dropCursor": { borderLeftColor: cursor }, - "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": - { - backgroundColor: selection, - }, + "&.cm-focused .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection": { + backgroundColor: selection, + }, ".cm-panels": { backgroundColor: darkBackground, color: ivory }, ".cm-panels.cm-panels-top": { borderBottom: "2px solid black" }, @@ -167,20 +166,14 @@ export function darkTheme(): Extension { backgroundColor: scrollbarBg, }, }, - { dark: true }, + { dark: true } ); /// The highlighting style for code in the JSON Hero theme. const jsonHeroHighlightStyle = HighlightStyle.define([ { tag: tags.keyword, color: violet }, { - tag: [ - tags.name, - tags.deleted, - tags.character, - tags.propertyName, - tags.macroName, - ], + tag: [tags.name, tags.deleted, tags.character, tags.propertyName, tags.macroName], color: lilac, }, { tag: [tags.function(tags.variableName), tags.labelName], color: malibu }, diff --git a/apps/webapp/app/components/code/tsql/index.ts b/apps/webapp/app/components/code/tsql/index.ts index bda244e30fa..71c543161d8 100644 --- a/apps/webapp/app/components/code/tsql/index.ts +++ b/apps/webapp/app/components/code/tsql/index.ts @@ -2,5 +2,9 @@ // Provides syntax highlighting, autocompletion, and linting for TSQL queries export { createTSQLCompletion } from "./tsqlCompletion"; -export { createTSQLLinter, isValidTSQLQuery, getTSQLError, type TSQLLinterConfig } from "./tsqlLinter"; - +export { + createTSQLLinter, + isValidTSQLQuery, + getTSQLError, + type TSQLLinterConfig, +} from "./tsqlLinter"; diff --git a/apps/webapp/app/components/code/tsql/tsqlCompletion.ts b/apps/webapp/app/components/code/tsql/tsqlCompletion.ts index b53c551a4d3..03d75f179d3 100644 --- a/apps/webapp/app/components/code/tsql/tsqlCompletion.ts +++ b/apps/webapp/app/components/code/tsql/tsqlCompletion.ts @@ -92,8 +92,8 @@ function createFunctionCompletions(): Completion[] { meta.maxArgs === 0 ? "()" : meta.minArgs === meta.maxArgs - ? `(${meta.minArgs} args)` - : `(${meta.minArgs}${meta.maxArgs ? `-${meta.maxArgs}` : "+"} args)`; + ? `(${meta.minArgs} args)` + : `(${meta.minArgs}${meta.maxArgs ? `-${meta.maxArgs}` : "+"} args)`; functions.push({ label: name, @@ -111,8 +111,8 @@ function createFunctionCompletions(): Completion[] { meta.maxArgs === 0 ? "()" : meta.minArgs === meta.maxArgs - ? `(${meta.minArgs} args)` - : `(${meta.minArgs}${meta.maxArgs ? `-${meta.maxArgs}` : "+"} args)`; + ? `(${meta.minArgs} args)` + : `(${meta.minArgs}${meta.maxArgs ? `-${meta.maxArgs}` : "+"} args)`; functions.push({ label: name, diff --git a/apps/webapp/app/components/code/tsql/tsqlLinter.test.ts b/apps/webapp/app/components/code/tsql/tsqlLinter.test.ts index 8acc81d66f0..8ecc21a1658 100644 --- a/apps/webapp/app/components/code/tsql/tsqlLinter.test.ts +++ b/apps/webapp/app/components/code/tsql/tsqlLinter.test.ts @@ -28,9 +28,7 @@ describe("tsqlLinter", () => { true ); expect( - isValidTSQLQuery( - "SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id" - ) + isValidTSQLQuery("SELECT * FROM users LEFT JOIN orders ON users.id = orders.user_id") ).toBe(true); }); @@ -76,4 +74,3 @@ describe("tsqlLinter", () => { }); }); }); - diff --git a/apps/webapp/app/components/code/tsql/tsqlLinter.ts b/apps/webapp/app/components/code/tsql/tsqlLinter.ts index 72794e3e9ab..42f5288fb29 100644 --- a/apps/webapp/app/components/code/tsql/tsqlLinter.ts +++ b/apps/webapp/app/components/code/tsql/tsqlLinter.ts @@ -31,11 +31,7 @@ function parseErrorPosition(message: string): { line: number; column: number } | /** * Convert line/column to a document position */ -function positionToOffset( - doc: string, - line: number, - column: number -): number { +function positionToOffset(doc: string, line: number, column: number): number { const lines = doc.split("\n"); // line is 1-indexed @@ -210,4 +206,3 @@ export function getTSQLError(query: string): string | null { return "Unknown error"; } } - diff --git a/apps/webapp/app/components/errors/ConfigureErrorAlerts.tsx b/apps/webapp/app/components/errors/ConfigureErrorAlerts.tsx index 32ed778f877..8a823ee78c1 100644 --- a/apps/webapp/app/components/errors/ConfigureErrorAlerts.tsx +++ b/apps/webapp/app/components/errors/ConfigureErrorAlerts.tsx @@ -135,12 +135,7 @@ export function ConfigureErrorAlerts({ /> - +
diff --git a/apps/webapp/app/components/integrations/VercelBuildSettings.tsx b/apps/webapp/app/components/integrations/VercelBuildSettings.tsx index d8e9f3fe3f8..8449d342f53 100644 --- a/apps/webapp/app/components/integrations/VercelBuildSettings.tsx +++ b/apps/webapp/app/components/integrations/VercelBuildSettings.tsx @@ -113,9 +113,7 @@ export function BuildSettingsFields({
); if (disabled && disabledReason) { - return ( - - ); + return ; } return row; })} @@ -140,9 +138,7 @@ export function BuildSettingsFields({ disabled={!enabledSlugs.some((s) => pullEnvVarsBeforeBuild.includes(s))} onCheckedChange={(checked) => { onDiscoverEnvVarsChange( - checked - ? enabledSlugs.filter((s) => pullEnvVarsBeforeBuild.includes(s)) - : [] + checked ? enabledSlugs.filter((s) => pullEnvVarsBeforeBuild.includes(s)) : [] ); }} /> @@ -185,9 +181,7 @@ export function BuildSettingsFields({
); if (disabled && disabledReason) { - return ( - - ); + return ; } return row; })} @@ -208,10 +202,12 @@ export function BuildSettingsFields({ When enabled, production deployments wait for Vercel deployment to complete before - promoting the Trigger.dev deployment. This will disable the "Auto-assign Custom - Production Domains" option in your Vercel project settings to perform staged - deployments.{" "} - + promoting the Trigger.dev deployment. This will disable the "Auto-assign Custom Production + Domains" option in your Vercel project settings to perform staged deployments.{" "} + Learn more . @@ -225,9 +221,8 @@ export function BuildSettingsFields({ )} {!currentTriggerVersion && currentTriggerVersionFetchFailed && ( - Couldn't read{" "} - TRIGGER_VERSION from Vercel — - check the Vercel dashboard to confirm the production pin. + Couldn't read TRIGGER_VERSION from + Vercel — check the Vercel dashboard to confirm the production pin. )} @@ -244,9 +239,9 @@ export function BuildSettingsFields({ /> - When enabled, the integration automatically promotes the Vercel deployment after - the Trigger.dev build completes. Turn off to manually promote from your Vercel - dashboard — Trigger.dev will then promote automatically once you do. + When enabled, the integration automatically promotes the Vercel deployment after the + Trigger.dev build completes. Turn off to manually promote from your Vercel dashboard — + Trigger.dev will then promote automatically once you do. )} diff --git a/apps/webapp/app/components/integrations/VercelLogo.tsx b/apps/webapp/app/components/integrations/VercelLogo.tsx index 7ddf039abfd..856b74ebada 100644 --- a/apps/webapp/app/components/integrations/VercelLogo.tsx +++ b/apps/webapp/app/components/integrations/VercelLogo.tsx @@ -1,11 +1,6 @@ export function VercelLogo({ className }: { className?: string }) { return ( - + ); diff --git a/apps/webapp/app/components/integrations/VercelOnboardingModal.tsx b/apps/webapp/app/components/integrations/VercelOnboardingModal.tsx index 21734c5c038..7ae12b20d45 100644 --- a/apps/webapp/app/components/integrations/VercelOnboardingModal.tsx +++ b/apps/webapp/app/components/integrations/VercelOnboardingModal.tsx @@ -4,11 +4,7 @@ import { ChevronDownIcon, ChevronUpIcon, } from "@heroicons/react/20/solid"; -import { - useFetcher, - useNavigation, - useSearchParams, -} from "@remix-run/react"; +import { useFetcher, useNavigation, useSearchParams } from "@remix-run/react"; import { useTypedFetcher } from "remix-typedjson"; import { Dialog, DialogContent, DialogHeader } from "~/components/primitives/Dialog"; import { Button, LinkButton } from "~/components/primitives/Buttons"; @@ -31,9 +27,7 @@ import { import { VercelLogo } from "~/components/integrations/VercelLogo"; import { BuildSettingsFields } from "~/components/integrations/VercelBuildSettings"; import { OctoKitty } from "~/components/GitHubLoginButton"; -import { - ConnectGitHubRepoModal, -} from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github"; +import { ConnectGitHubRepoModal } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.github"; import { type SyncEnvVarsMapping, type EnvSlug, @@ -44,7 +38,12 @@ import { } from "~/v3/vercel/vercelProjectIntegrationSchema"; import { type VercelCustomEnvironment } from "~/models/vercelIntegration.server"; import { type VercelOnboardingData } from "~/presenters/v3/VercelSettingsPresenter.server"; -import { vercelAppInstallPath, v3ProjectSettingsIntegrationsPath, githubAppInstallPath, vercelResourcePath } from "~/utils/pathBuilder"; +import { + vercelAppInstallPath, + v3ProjectSettingsIntegrationsPath, + githubAppInstallPath, + vercelResourcePath, +} from "~/utils/pathBuilder"; import type { loader } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.vercel"; import { useEffect, useState, useCallback, useRef } from "react"; import { usePostHogTracking } from "~/hooks/usePostHog"; @@ -73,9 +72,7 @@ function formatVercelTargets(targets: string[]): string { staging: "Staging", }; - return targets - .map((t) => targetLabels[t.toLowerCase()] || t) - .join(", "); + return targets.map((t) => targetLabels[t.toLowerCase()] || t).join(", "); } type OnboardingState = @@ -153,7 +150,8 @@ export function VercelOnboardingModal({ } // For marketplace origin, skip env-mapping step and go directly to env-var-sync if (!fromMarketplaceContext) { - const customEnvs = (onboardingData?.customEnvironments?.length ?? 0) > 0 && hasStagingEnvironment; + const customEnvs = + (onboardingData?.customEnvironments?.length ?? 0) > 0 && hasStagingEnvironment; if (customEnvs) { return "env-mapping"; } @@ -218,14 +216,18 @@ export function VercelOnboardingModal({ environmentId: string; displayName: string; } | null>(null); - const availableEnvSlugsForOnboarding = getAvailableEnvSlugs(hasStagingEnvironment, hasPreviewEnvironment); - const availableEnvSlugsForOnboardingBuildSettings = getAvailableEnvSlugsForBuildSettings(hasStagingEnvironment, hasPreviewEnvironment); + const availableEnvSlugsForOnboarding = getAvailableEnvSlugs( + hasStagingEnvironment, + hasPreviewEnvironment + ); + const availableEnvSlugsForOnboardingBuildSettings = getAvailableEnvSlugsForBuildSettings( + hasStagingEnvironment, + hasPreviewEnvironment + ); const [pullEnvVarsBeforeBuild, setPullEnvVarsBeforeBuild] = useState( () => availableEnvSlugsForOnboardingBuildSettings ); - const [atomicBuilds, setAtomicBuilds] = useState( - () => ["prod"] - ); + const [atomicBuilds, setAtomicBuilds] = useState(() => ["prod"]); const [discoverEnvVars, setDiscoverEnvVars] = useState( () => availableEnvSlugsForOnboardingBuildSettings ); @@ -309,7 +311,13 @@ export function VercelOnboardingModal({ }, 100); } } - }, [isOpen, fromMarketplaceContext, nextUrl, isOnboardingComplete, isGitHubConnectedForOnboarding]); + }, [ + isOpen, + fromMarketplaceContext, + nextUrl, + isOnboardingComplete, + isGitHubConnectedForOnboarding, + ]); useEffect(() => { if (!isOpen) { @@ -336,7 +344,6 @@ export function VercelOnboardingModal({ } switch (state) { - case "loading-projects": loadingStateRef.current = state; if (onDataReload) { @@ -371,19 +378,33 @@ export function VercelOnboardingModal({ }, [isOpen, state, onboardingData?.authInvalid, vercelStagingEnvironment, onDataReload, onClose]); useEffect(() => { - if (!onboardingData?.authInvalid && state === "loading-projects" && onboardingData?.availableProjects !== undefined) { + if ( + !onboardingData?.authInvalid && + state === "loading-projects" && + onboardingData?.availableProjects !== undefined + ) { setState("project-selection"); } }, [state, onboardingData?.availableProjects, onboardingData?.authInvalid]); useEffect(() => { - if (!onboardingData?.authInvalid && state === "loading-env-vars" && onboardingData?.environmentVariables) { + if ( + !onboardingData?.authInvalid && + state === "loading-env-vars" && + onboardingData?.environmentVariables + ) { setState("env-var-sync"); } }, [state, onboardingData?.environmentVariables, onboardingData?.authInvalid]); useEffect(() => { - if (state === "project-selection" && fetcher.data && "success" in fetcher.data && fetcher.data.success && fetcher.state === "idle") { + if ( + state === "project-selection" && + fetcher.data && + "success" in fetcher.data && + fetcher.data.success && + fetcher.state === "idle" + ) { trackOnboarding("vercel onboarding project selected", { vercel_project_name: selectedVercelProject?.name, }); @@ -394,12 +415,20 @@ export function VercelOnboardingModal({ } else if (fetcher.data && "error" in fetcher.data && typeof fetcher.data.error === "string") { setProjectSelectionError(fetcher.data.error); } - }, [state, fetcher.data, fetcher.state, onDataReload, trackOnboarding, selectedVercelProject?.name]); + }, [ + state, + fetcher.data, + fetcher.state, + onDataReload, + trackOnboarding, + selectedVercelProject?.name, + ]); // For marketplace origin, skip env-mapping step useEffect(() => { if (state === "loading-env-mapping" && onboardingData) { - const hasCustomEnvs = (onboardingData.customEnvironments?.length ?? 0) > 0 && hasStagingEnvironment; + const hasCustomEnvs = + (onboardingData.customEnvironments?.length ?? 0) > 0 && hasStagingEnvironment; if (hasCustomEnvs && !fromMarketplaceContext) { setState("env-mapping"); } else { @@ -410,14 +439,13 @@ export function VercelOnboardingModal({ const secretEnvVars = envVars.filter((v) => v.isSecret); const syncableEnvVars = envVars.filter((v) => !v.isSecret); - const enabledEnvVars = syncableEnvVars.filter( - (v) => shouldSyncEnvVarForAnyEnvironment(syncEnvVarsMapping, v.key) + const enabledEnvVars = syncableEnvVars.filter((v) => + shouldSyncEnvVarForAnyEnvironment(syncEnvVarsMapping, v.key) ); const overlappingEnvVarsCount = enabledEnvVars.filter((v) => existingVars[v.key]).length; - const isSubmitting = - navigation.state === "submitting" || navigation.state === "loading"; + const isSubmitting = navigation.state === "submitting" || navigation.state === "loading"; const actionUrl = vercelResourcePath(organizationSlug, projectSlug, environmentSlug); @@ -529,7 +557,6 @@ export function VercelOnboardingModal({ method: "post", action: actionUrl, }); - }, [vercelStagingEnvironment, envMappingFetcher, actionUrl, trackOnboarding]); const handleBuildSettingsNext = useCallback(() => { @@ -541,7 +568,10 @@ export function VercelOnboardingModal({ const formData = new FormData(); formData.append("action", "complete-onboarding"); - formData.append("vercelStagingEnvironment", vercelStagingEnvironment ? JSON.stringify(vercelStagingEnvironment) : ""); + formData.append( + "vercelStagingEnvironment", + vercelStagingEnvironment ? JSON.stringify(vercelStagingEnvironment) : "" + ); formData.append("pullEnvVarsBeforeBuild", JSON.stringify(pullEnvVarsBeforeBuild)); formData.append("atomicBuilds", JSON.stringify(atomicBuilds)); formData.append("discoverEnvVars", JSON.stringify(discoverEnvVars)); @@ -572,24 +602,52 @@ export function VercelOnboardingModal({ github_app_installed: gitHubAppInstallations.length > 0, }); } - }, [vercelStagingEnvironment, pullEnvVarsBeforeBuild, atomicBuilds, discoverEnvVars, syncEnvVarsMapping, nextUrl, fromMarketplaceContext, isGitHubConnectedForOnboarding, completeOnboardingFetcher, actionUrl, trackOnboarding, capture, organizationSlug, projectSlug, gitHubAppInstallations.length]); - - const handleFinishOnboarding = useCallback((e: React.FormEvent) => { - e.preventDefault(); - const form = e.currentTarget; - const formData = new FormData(form); - completeOnboardingFetcher.submit(formData, { - method: "post", - action: actionUrl, - }); - }, [completeOnboardingFetcher, actionUrl]); + }, [ + vercelStagingEnvironment, + pullEnvVarsBeforeBuild, + atomicBuilds, + discoverEnvVars, + syncEnvVarsMapping, + nextUrl, + fromMarketplaceContext, + isGitHubConnectedForOnboarding, + completeOnboardingFetcher, + actionUrl, + trackOnboarding, + capture, + organizationSlug, + projectSlug, + gitHubAppInstallations.length, + ]); + + const handleFinishOnboarding = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + const form = e.currentTarget; + const formData = new FormData(form); + completeOnboardingFetcher.submit(formData, { + method: "post", + action: actionUrl, + }); + }, + [completeOnboardingFetcher, actionUrl] + ); useEffect(() => { - if (completeOnboardingFetcher.data && typeof completeOnboardingFetcher.data === "object" && "success" in completeOnboardingFetcher.data && completeOnboardingFetcher.data.success && completeOnboardingFetcher.state === "idle") { + if ( + completeOnboardingFetcher.data && + typeof completeOnboardingFetcher.data === "object" && + "success" in completeOnboardingFetcher.data && + completeOnboardingFetcher.data.success && + completeOnboardingFetcher.state === "idle" + ) { if (state === "github-connection") { return; } - if ("redirectTo" in completeOnboardingFetcher.data && typeof completeOnboardingFetcher.data.redirectTo === "string") { + if ( + "redirectTo" in completeOnboardingFetcher.data && + typeof completeOnboardingFetcher.data.redirectTo === "string" + ) { const validRedirect = safeRedirectUrl(completeOnboardingFetcher.data.redirectTo); if (validRedirect) { window.location.href = validRedirect; @@ -632,7 +690,13 @@ export function VercelOnboardingModal({ }, [state, organizationSlug, projectSlug]); useEffect(() => { - if (envMappingFetcher.data && typeof envMappingFetcher.data === "object" && "success" in envMappingFetcher.data && envMappingFetcher.data.success && envMappingFetcher.state === "idle") { + if ( + envMappingFetcher.data && + typeof envMappingFetcher.data === "object" && + "success" in envMappingFetcher.data && + envMappingFetcher.data.success && + envMappingFetcher.state === "idle" + ) { setState("loading-env-vars"); } }, [envMappingFetcher.data, envMappingFetcher.state]); @@ -644,9 +708,7 @@ export function VercelOnboardingModal({ if (customEnvironments.length === 1) { selectedEnv = customEnvironments[0]; } else { - const stagingEnv = customEnvironments.find( - (env) => env.slug.toLowerCase() === "staging" - ); + const stagingEnv = customEnvironments.find((env) => env.slug.toLowerCase() === "staging"); selectedEnv = stagingEnv ?? customEnvironments[0]; } @@ -673,14 +735,17 @@ export function VercelOnboardingModal({ if (isLoadingState) { return ( - { - if (!open && !fromMarketplaceContext) { - if (state as string !== "completed") { - trackOnboarding("vercel onboarding abandoned"); + { + if (!open && !fromMarketplaceContext) { + if ((state as string) !== "completed") { + trackOnboarding("vercel onboarding abandoned"); + } + onClose(); } - onClose(); - } - }}> + }} + > e.preventDefault()}>
@@ -704,18 +769,23 @@ export function VercelOnboardingModal({ const disabledEnvSlugsForBuildSettings = hasStagingEnvironment && !vercelStagingEnvironment - ? ({ stg: "Map a custom Vercel environment to Staging to enable this" } as Partial>) + ? ({ stg: "Map a custom Vercel environment to Staging to enable this" } as Partial< + Record + >) : undefined; return ( - { - if (!open && !fromMarketplaceContext) { - if (state !== "completed") { - trackOnboarding("vercel onboarding abandoned"); + { + if (!open && !fromMarketplaceContext) { + if (state !== "completed") { + trackOnboarding("vercel onboarding abandoned"); + } + onClose(); } - onClose(); - } - }}> + }} + > e.preventDefault()}>
@@ -729,8 +799,8 @@ export function VercelOnboardingModal({
Select Vercel Project - Choose which Vercel project to connect with this Trigger.dev project. - Your API keys will be automatically synced to Vercel. + Choose which Vercel project to connect with this Trigger.dev project. Your API keys + will be automatically synced to Vercel. {availableProjects.length === 0 ? ( @@ -763,13 +833,14 @@ export function VercelOnboardingModal({ )} - {projectSelectionError && ( - {projectSelectionError} - )} + {projectSelectionError && {projectSelectionError}} - Once connected, your TRIGGER_SECRET_KEY will be - automatically synced to Vercel for each environment. + Once connected, your{" "} + + TRIGGER_SECRET_KEY + {" "} + will be automatically synced to Vercel for each environment. } cancelButton={ - } @@ -811,11 +879,13 @@ export function VercelOnboardingModal({ Map Vercel Environment to Staging Select which custom Vercel environment should map to Trigger.dev's Staging - environment. Production and Preview environments are mapped automatically. - If you skip this step, the{" "} - TRIGGER_SECRET_KEY{" "} - will not be installed for the staging environment in Vercel. You can configure this later in - project settings. + environment. Production and Preview environments are mapped automatically. If you + skip this step, the{" "} + + TRIGGER_SECRET_KEY + {" "} + will not be installed for the staging environment in Vercel. You can configure this + later in project settings. (() => ({ value }), [value]); @@ -193,11 +193,7 @@ const ClientTabsContent = React.forwardRef< )); diff --git a/apps/webapp/app/components/primitives/CopyTextLink.tsx b/apps/webapp/app/components/primitives/CopyTextLink.tsx index 33818fa6077..2c117af9b86 100644 --- a/apps/webapp/app/components/primitives/CopyTextLink.tsx +++ b/apps/webapp/app/components/primitives/CopyTextLink.tsx @@ -16,18 +16,12 @@ export function CopyTextLink({ value, className }: CopyTextLinkProps) { onClick={copy} className={cn( "inline-flex cursor-pointer items-center gap-1 text-xs transition-colors", - copied - ? "text-success" - : "text-text-dimmed hover:text-text-bright", + copied ? "text-success" : "text-text-dimmed hover:text-text-bright", className )} > {copied ? "Copied" : "Copy"} - {copied ? ( - - ) : ( - - )} + {copied ? : } ); } diff --git a/apps/webapp/app/components/primitives/DateTime.tsx b/apps/webapp/app/components/primitives/DateTime.tsx index 4dae92731af..41c51cdd74d 100644 --- a/apps/webapp/app/components/primitives/DateTime.tsx +++ b/apps/webapp/app/components/primitives/DateTime.tsx @@ -275,10 +275,10 @@ const DateTimeAccurateInner = ({ return hideDate ? formatTimeOnly(realDate, displayTimeZone, locales, hour12) : realPrevDate - ? isSameDay(realDate, realPrevDate) - ? formatTimeOnly(realDate, displayTimeZone, locales, hour12) - : formatDateTimeAccurate(realDate, displayTimeZone, locales, hour12) - : formatDateTimeAccurate(realDate, displayTimeZone, locales, hour12); + ? isSameDay(realDate, realPrevDate) + ? formatTimeOnly(realDate, displayTimeZone, locales, hour12) + : formatDateTimeAccurate(realDate, displayTimeZone, locales, hour12) + : formatDateTimeAccurate(realDate, displayTimeZone, locales, hour12); }, [realDate, displayTimeZone, locales, hour12, hideDate, previousDate]); if (!showTooltip) diff --git a/apps/webapp/app/components/primitives/Dialog.tsx b/apps/webapp/app/components/primitives/Dialog.tsx index 48fc59cfa78..bf485bbf1a2 100644 --- a/apps/webapp/app/components/primitives/Dialog.tsx +++ b/apps/webapp/app/components/primitives/Dialog.tsx @@ -122,5 +122,5 @@ export { DialogTitle, DialogDescription, DialogPortal, - DialogOverlay + DialogOverlay, }; diff --git a/apps/webapp/app/components/primitives/InputNumberStepper.tsx b/apps/webapp/app/components/primitives/InputNumberStepper.tsx index f4aafd5cae1..b434bb1d30a 100644 --- a/apps/webapp/app/components/primitives/InputNumberStepper.tsx +++ b/apps/webapp/app/components/primitives/InputNumberStepper.tsx @@ -67,7 +67,7 @@ export function InputNumberStepper({ const isMaxDisabled = max !== undefined && !Number.isNaN(numericValue) && numericValue >= max; function clamp(val: number): number { - if (Number.isNaN(val)) return typeof value === "number" ? value : min ?? 0; + if (Number.isNaN(val)) return typeof value === "number" ? value : (min ?? 0); let next = val; if (min !== undefined) next = Math.max(min, next); if (max !== undefined) next = Math.min(max, next); diff --git a/apps/webapp/app/components/primitives/MiddleTruncate.tsx b/apps/webapp/app/components/primitives/MiddleTruncate.tsx index c116205aed9..45915c2521d 100644 --- a/apps/webapp/app/components/primitives/MiddleTruncate.tsx +++ b/apps/webapp/app/components/primitives/MiddleTruncate.tsx @@ -139,16 +139,9 @@ export function MiddleTruncate({ text, className }: MiddleTruncateProps) { }, [calculateTruncation]); const content = ( - + {/* Hidden span for measuring text width */} -