diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a8f36..dd043e4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,13 +14,12 @@ jobs: - name: Setup pnpm uses: pnpm/action-setup@v4 - with: - version: 11 - name: Setup Node uses: actions/setup-node@v4 with: - node-version: "20" + # pnpm@11 (packageManager) requires Node >= 22.13 + node-version: "22" cache: "pnpm" - name: Install dependencies diff --git a/.prettierignore b/.prettierignore index 8973fe9..4d12e4e 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ # Local-only, not committed .cursor/ + +pnpm-lock.yaml diff --git a/eslint.config.mjs b/eslint.config.mjs index 640dd33..8ba7bb5 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,6 +1,5 @@ import js from "@eslint/js" import ts from "typescript-eslint" -import reactHooks from "eslint-plugin-react-hooks" import nextVitals from "eslint-config-next/core-web-vitals" import nextTypescript from "eslint-config-next/typescript" @@ -10,9 +9,7 @@ export default [ ...nextVitals, ...nextTypescript, { - plugins: { - "react-hooks": reactHooks, - }, + // react-hooks plugin already registered by eslint-config-next — do not redeclare under pnpm. rules: { "react-hooks/rules-of-hooks": "error", "react-hooks/exhaustive-deps": "warn", diff --git a/package.json b/package.json index 37d7e30..84018b1 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,13 @@ "tailwindcss": "^4.1.9", "tw-animate-css": "^1.4.0", "typescript": "^5", - "vitest": "^4.0.18" + "vitest": "^4.0.18", + "@eslint/js": "^9.39.3", + "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@11.9.0" + "packageManager": "pnpm@11.9.0", + "engines": { + "node": ">=22.13", + "pnpm": ">=11.9.0" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc9a97a..ae6e9c7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@ai-sdk/react': specifier: latest - version: 3.0.210(react@19.2.4)(zod@4.3.6) + version: 4.0.34(react@19.2.4)(zod@4.3.6) '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.71.2(react@19.2.4)) @@ -121,7 +121,7 @@ importers: version: 12.10.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) ai: specifier: latest - version: 6.0.208(zod@4.3.6) + version: 7.0.31(zod@4.3.6) autoprefixer: specifier: ^10.4.20 version: 10.4.27(postcss@8.5.6) @@ -204,6 +204,9 @@ importers: '@eslint/eslintrc': specifier: ^3.3.4 version: 3.3.4 + '@eslint/js': + specifier: ^9.39.3 + version: 9.39.3 '@playwright/test': specifier: ^1.58.2 version: 1.58.2 @@ -270,6 +273,9 @@ importers: typescript: specifier: ^5 version: 5.9.3 + typescript-eslint: + specifier: ^8.0.0 + version: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) vitest: specifier: ^4.0.18 version: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@22.19.12)(jiti@2.6.1)(jsdom@28.1.0)(lightningcss@1.31.1) @@ -282,25 +288,31 @@ packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/gateway@3.0.133': - resolution: {integrity: sha512-Ebs+7iS9zUgJu5B0RlxM2JmDWzq79Cpd6YdiqcCzB5qFdpfQJPUDiXutqlQP89F2XGjOdDeidulBTXUdXWzOxw==} - engines: {node: '>=18'} + '@ai-sdk/gateway@4.0.23': + resolution: {integrity: sha512-f85diFdPMXYJpxCjOYZchMQkRH8h3r6lhK4Q2xmzJ7UA2OQ80L3W7tFu61742xGQK7zHWm5AhxYhNuc50H9SGQ==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@4.0.30': - resolution: {integrity: sha512-VO7I+vPffqI5sMnPoUq5DCSqKIgQIk/naJWRdQVpz2ma2zoprC/lqiJiUEl2s6DfvTD76TbhD3q39ROjlA6rGw==} - engines: {node: '>=18'} + '@ai-sdk/mcp@2.0.15': + resolution: {integrity: sha512-JIwbud+pMM6GgXDhwm5/lSpg7y8kAO1JHJ4NQEmfST6nXy3Gijaxy4LIrKqVR/1N5VPZAfwOdSsUWtbtTp6zZw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@3.0.10': - resolution: {integrity: sha512-Q3BZ27qfpYqnCYGvE3vt+Qi6LGOF9R5Nmzn+9JoM1lCRsD9mYaIhfJLkSunN48nfGXJ6n+XNV0J/XVpqGQl7Dw==} - engines: {node: '>=18'} + '@ai-sdk/provider-utils@5.0.11': + resolution: {integrity: sha512-7/96wE+ZsKB35iS9ASyllrE4Ym/EolXEB7AkuJ5FI++fmS85BVTAs77890C+1Z2jwHfBKjBQSBmsliOsAh0iFQ==} + engines: {node: '>=22'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/react@3.0.210': - resolution: {integrity: sha512-VprBlyc8yvwlpIdcIICL307vRncXrLlmcRTY/7JR5ND9+LvUcxJU16yW6prClFahqEWVza8Vr8P4Bgk5ZBtp4A==} - engines: {node: '>=18'} + '@ai-sdk/provider@4.0.3': + resolution: {integrity: sha512-e0CpNWJUY7OxAFAnCZkw+ri9QOHWwTs1tXP42782KFGCU07qt8NiXCrCVowyCB5dP2r5/Uls+g2oPd8kOJn9dw==} + engines: {node: '>=22'} + + '@ai-sdk/react@4.0.34': + resolution: {integrity: sha512-yrMJecJUwS18oGHUWPemuDBy9elVIjxbLsqNg6nraPu+TO7e5QFTv1ma9kLhKy4FGvDJW0Ff4Z57sKEsIlYZeA==} + engines: {node: '>=22'} peerDependencies: react: ^18 || ~19.0.1 || ~19.1.2 || ^19.2.1 @@ -2376,6 +2388,9 @@ packages: '@webgpu/types@0.1.69': resolution: {integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@xyflow/react@12.10.1': resolution: {integrity: sha512-5eSWtIK/+rkldOuFbOOz44CRgQRjtS9v5nufk77DV+XBnfCGL9HAQ8PG00o2ZYKqkEU/Ak6wrKC95Tu+2zuK3Q==} peerDependencies: @@ -2399,9 +2414,9 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ai@6.0.208: - resolution: {integrity: sha512-STz+AaZqJ4ZjH7UkpXkbHx+bjgIDOsE8fIUoZjkZ2whoZcfVmG9K/TqEKouJZ03SuZuD7lagntlU3zBhAEkRpQ==} - engines: {node: '>=18'} + ai@7.0.31: + resolution: {integrity: sha512-pJfwKXjF5kw0rKRTePwYo60EfWb8wfzJAgf3ojln/YkOsVVKttzZAJVcRPsg37Z3a06ZdKkxX+DSrMAFlPm5Mw==} + engines: {node: '>=22'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -3881,6 +3896,10 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pkce-challenge@5.0.1: + resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} + engines: {node: '>=16.20.0'} + playwright-core@1.58.2: resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} engines: {node: '>=18'} @@ -4334,6 +4353,11 @@ packages: peerDependencies: react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + swr@2.4.2: + resolution: {integrity: sha512-ej644Y2bvkIajfR32KGeSSdBXQW+ScjGjkybZgSE7kFpk9eGnV44XY9FJylXi+W75pavSX1PVNB57W5EbhGIYw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -4730,30 +4754,40 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/gateway@3.0.133(zod@4.3.6)': + '@ai-sdk/gateway@4.0.23(zod@4.3.6)': dependencies: - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.3.6) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.11(zod@4.3.6) '@vercel/oidc': 3.2.0 zod: 4.3.6 - '@ai-sdk/provider-utils@4.0.30(zod@4.3.6)': + '@ai-sdk/mcp@2.0.15(zod@4.3.6)': dependencies: - '@ai-sdk/provider': 3.0.10 + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.11(zod@4.3.6) + pkce-challenge: 5.0.1 + zod: 4.3.6 + + '@ai-sdk/provider-utils@5.0.11(zod@4.3.6)': + dependencies: + '@ai-sdk/provider': 4.0.3 '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 eventsource-parser: 3.1.0 zod: 4.3.6 - '@ai-sdk/provider@3.0.10': + '@ai-sdk/provider@4.0.3': dependencies: json-schema: 0.4.0 - '@ai-sdk/react@3.0.210(react@19.2.4)(zod@4.3.6)': + '@ai-sdk/react@4.0.34(react@19.2.4)(zod@4.3.6)': dependencies: - '@ai-sdk/provider-utils': 4.0.30(zod@4.3.6) - ai: 6.0.208(zod@4.3.6) + '@ai-sdk/mcp': 2.0.15(zod@4.3.6) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.11(zod@4.3.6) + ai: 7.0.31(zod@4.3.6) react: 19.2.4 - swr: 2.4.0(react@19.2.4) + swr: 2.4.2(react@19.2.4) throttleit: 2.1.0 transitivePeerDependencies: - zod @@ -5274,7 +5308,8 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} - '@opentelemetry/api@1.9.0': {} + '@opentelemetry/api@1.9.0': + optional: true '@panva/hkdf@1.2.1': {} @@ -6628,6 +6663,8 @@ snapshots: '@webgpu/types@0.1.69': {} + '@workflow/serde@4.1.0': {} + '@xyflow/react@12.10.1(@types/react@19.2.14)(immer@11.1.4)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@xyflow/system': 0.0.75 @@ -6659,12 +6696,11 @@ snapshots: agent-base@7.1.4: {} - ai@6.0.208(zod@4.3.6): + ai@7.0.31(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 3.0.133(zod@4.3.6) - '@ai-sdk/provider': 3.0.10 - '@ai-sdk/provider-utils': 4.0.30(zod@4.3.6) - '@opentelemetry/api': 1.9.0 + '@ai-sdk/gateway': 4.0.23(zod@4.3.6) + '@ai-sdk/provider': 4.0.3 + '@ai-sdk/provider-utils': 5.0.11(zod@4.3.6) zod: 4.3.6 ajv@6.14.0: @@ -8439,6 +8475,8 @@ snapshots: picomatch@4.0.4: {} + pkce-challenge@5.0.1: {} + playwright-core@1.58.2: {} playwright@1.58.2: @@ -8947,6 +8985,12 @@ snapshots: react: 19.2.4 use-sync-external-store: 1.6.0(react@19.2.4) + swr@2.4.2(react@19.2.4): + dependencies: + dequal: 2.0.3 + react: 19.2.4 + use-sync-external-store: 1.6.0(react@19.2.4) + symbol-tree@3.2.4: {} tailwind-merge@3.5.0: {}