From 34009bc74981600d1e645ae60bb7ac42228d71bb Mon Sep 17 00:00:00 2001 From: Reinier van der Leer Date: Wed, 4 Jun 2025 16:38:08 +0100 Subject: [PATCH] feat(frontend): Upgrade to Next.js v15 + update config (#10042) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Resolves #10041 Upgrading to Next v15 isn't trivial, but still a good idea if not simply necessary. ### Changes 🏗️ - Upgrade Next.js from `v14.2.26` to `v15.3.2` - Fix usage of now-async APIs `params`, `searchParams`, `headers` ([docs](https://nextjs.org/docs/app/guides/upgrading/version-15#async-request-apis-breaking-change)) - Update Next+TypeScript configs - Set build target to ES2022 for better performance - Unignore TypeScript build errors - Set `hideSourceMaps: false` because OSS FTW :) - Remove obsolete `webpack.config.js` - Fix existing warnings/errors - Fix Sentry missing navigation hook warning - Fix `DYNAMIC_SERVER_USAGE` build error on `/profile` and `/marketplace` - Moved `getStoreData` to a proper server action `getMarketplaceData` - Fix breaking CSS syntax error in `customnode.css` - Use Turbopack for faster dev+test build times - Add separate build step to frontend CI workflow: this also fixes the test timing out if the build takes too long Other technical improvements: - Wrap `handleSortChange` in `MarketplaceSearchPage` in `useCallback` - Fix typing in `ProfileInfoForm` - Improve output of frontend tests > [!NOTE] > Next prints this error (in dev mode): > ``` > Error: Route "/marketplace" used `cookies().getAll()`. `cookies()` should be awaited before using its value. Learn more: https://nextjs.org/docs/messages/sync-dynamic-apis > at Object.getAll (src/lib/supabase/getServerSupabase.ts:16:31) > at getAll (../../src/cookies.ts:115:41) > ... > ``` > As far as I can see, this isn't breaking, and will become a warning in prod. See also [the Next docs about this issue](https://nextjs.org/docs/messages/sync-dynamic-apis) ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] Follow the full release QA test script #### For configuration changes: - [x] I have included a list of my configuration changes in the PR description (under **Changes**) --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/platform-frontend-ci.yml | 6 +- .../frontend/instrumentation-client.ts | 1 - autogpt_platform/frontend/next.config.mjs | 9 +- autogpt_platform/frontend/package.json | 16 +- .../frontend/playwright.config.ts | 8 +- autogpt_platform/frontend/pnpm-lock.yaml | 385 ++++++++++++++---- .../app/(platform)/admin/marketplace/page.tsx | 20 +- .../app/(platform)/admin/spending/page.tsx | 20 +- .../src/app/(platform)/marketplace/actions.ts | 56 +++ .../agent/[creator]/[slug]/page.tsx | 14 +- .../marketplace/creator/[creator]/page.tsx | 12 +- .../src/app/(platform)/marketplace/page.tsx | 97 +---- .../(platform)/marketplace/search/page.tsx | 79 ++-- .../app/(platform)/profile/(user)/page.tsx | 35 +- .../app/(platform)/reset_password/actions.ts | 2 +- .../agptui/ProfileInfoForm.stories.tsx | 6 - .../src/components/agptui/ProfileInfoForm.tsx | 18 +- .../frontend/src/components/customnode.css | 2 +- .../src/lib/supabase/getServerSupabase.ts | 3 +- autogpt_platform/frontend/tsconfig.json | 13 +- autogpt_platform/frontend/webpack.config.js | 7 - 21 files changed, 490 insertions(+), 319 deletions(-) create mode 100644 autogpt_platform/frontend/src/app/(platform)/marketplace/actions.ts delete mode 100644 autogpt_platform/frontend/webpack.config.js diff --git a/.github/workflows/platform-frontend-ci.yml b/.github/workflows/platform-frontend-ci.yml index dd547e9ea1..97b4d38e06 100644 --- a/.github/workflows/platform-frontend-ci.yml +++ b/.github/workflows/platform-frontend-ci.yml @@ -103,11 +103,15 @@ jobs: - name: Setup .env run: cp .env.example .env + - name: Build frontend + run: pnpm build --turbo + # uses Turbopack, much faster and safe enough for a test pipeline + - name: Install Browser '${{ matrix.browser }}' run: pnpm playwright install --with-deps ${{ matrix.browser }} - name: Run Playwright tests - run: pnpm test --project=${{ matrix.browser }} + run: pnpm test:no-build --project=${{ matrix.browser }} - name: Print Final Docker Compose logs if: always() diff --git a/autogpt_platform/frontend/instrumentation-client.ts b/autogpt_platform/frontend/instrumentation-client.ts index 7897a80888..fc3a359662 100644 --- a/autogpt_platform/frontend/instrumentation-client.ts +++ b/autogpt_platform/frontend/instrumentation-client.ts @@ -59,5 +59,4 @@ if (process.env.NODE_ENV === "production") { }); } -// Export the required hook for navigation instrumentation export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; diff --git a/autogpt_platform/frontend/next.config.mjs b/autogpt_platform/frontend/next.config.mjs index ee396f181c..d0d798f77f 100644 --- a/autogpt_platform/frontend/next.config.mjs +++ b/autogpt_platform/frontend/next.config.mjs @@ -16,10 +16,6 @@ const nextConfig = { ], }, output: "standalone", - // TODO: Re-enable TypeScript checks once current issues are resolved - typescript: { - ignoreBuildErrors: true, - }, transpilePackages: ["geist"], }; @@ -54,8 +50,9 @@ export default isDevelopmentBuild // side errors will fail. tunnelRoute: "/store", - // Hides source maps from generated client bundles - hideSourceMaps: true, + // No need to hide source maps from generated client bundles + // since the source is public anyway :) + hideSourceMaps: false, // Automatically tree-shake Sentry logger statements to reduce bundle size disableLogger: true, diff --git a/autogpt_platform/frontend/package.json b/autogpt_platform/frontend/package.json index d7bc351cbb..d053456f27 100644 --- a/autogpt_platform/frontend/package.json +++ b/autogpt_platform/frontend/package.json @@ -3,15 +3,17 @@ "version": "0.3.4", "private": true, "scripts": { - "dev": "next dev", - "dev:test": "NODE_ENV=test && next dev", + "dev": "next dev --turbo", + "dev:test": "NODE_ENV=test && next dev --turbo", "build": "SKIP_STORYBOOK_TESTS=true next build", "start": "next start", + "start:standalone": "cd .next/standalone && node server.js", "lint": "next lint && prettier --check .", "format": "prettier --write .", "type-check": "tsc --noEmit", - "test": "playwright test", - "test-ui": "playwright test --ui", + "test": "next build --turbo && playwright test", + "test-ui": "next build --turbo && playwright test --ui", + "test:no-build": "playwright test", "gentests": "playwright codegen http://localhost:3000", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", @@ -64,10 +66,10 @@ "geist": "^1.4.2", "jaro-winkler": "^0.2.8", "launchdarkly-react-client-sdk": "^3.7.0", - "lodash.debounce": "^4.0.8", + "lodash": "^4.17.21", "lucide-react": "^0.510.0", "moment": "^2.30.1", - "next": "^14.2.26", + "next": "^15.3.2", "next-themes": "^0.4.6", "party-js": "^2.2.0", "react": "^18", @@ -100,7 +102,7 @@ "@storybook/test": "^8.3.5", "@storybook/test-runner": "^0.21.0", "@types/canvas-confetti": "^1.9.0", - "@types/lodash": "^4.17.13", + "@types/lodash": "^4.17.17", "@types/negotiator": "^0.6.3", "@types/node": "^22.13.0", "@types/react": "^18", diff --git a/autogpt_platform/frontend/playwright.config.ts b/autogpt_platform/frontend/playwright.config.ts index d8e22371f2..fddf03eeb9 100644 --- a/autogpt_platform/frontend/playwright.config.ts +++ b/autogpt_platform/frontend/playwright.config.ts @@ -22,7 +22,7 @@ export default defineConfig({ /* Opt out of parallel tests on CI. */ workers: process.env.CI ? 1 : undefined, /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: process.env.CI ? [["html"]] : [["list"], ["html"]], + reporter: [["html"], ["line"]], /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ use: { /* Base URL to use in actions like `await page.goto('/')`. */ @@ -74,12 +74,12 @@ export default defineConfig({ // }, ], - /* Run your local dev server before starting the tests */ + /* Run your local server before starting the tests */ webServer: { - command: "pnpm run build && pnpm run start", + command: "pnpm start", url: "http://localhost:3000/", reuseExistingServer: !process.env.CI, - timeout: 120 * 1000, + timeout: 10 * 1000, env: { NODE_ENV: "test", }, diff --git a/autogpt_platform/frontend/pnpm-lock.yaml b/autogpt_platform/frontend/pnpm-lock.yaml index 40844b176b..abc4a17967 100644 --- a/autogpt_platform/frontend/pnpm-lock.yaml +++ b/autogpt_platform/frontend/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 3.10.0(react-hook-form@7.57.0(react@18.3.1)) '@next/third-parties': specifier: ^15.3.2 - version: 15.3.3(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 15.3.3(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) '@radix-ui/react-alert-dialog': specifier: ^1.1.13 version: 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -76,7 +76,7 @@ importers: version: 1.2.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@sentry/nextjs': specifier: ^9 - version: 9.24.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) + version: 9.24.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) '@supabase/ssr': specifier: ^0.6.1 version: 0.6.1(@supabase/supabase-js@2.49.9) @@ -127,16 +127,16 @@ importers: version: 12.15.0(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) geist: specifier: ^1.4.2 - version: 1.4.2(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 1.4.2(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) jaro-winkler: specifier: ^0.2.8 version: 0.2.8 launchdarkly-react-client-sdk: specifier: ^3.7.0 version: 3.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - lodash.debounce: - specifier: ^4.0.8 - version: 4.0.8 + lodash: + specifier: ^4.17.21 + version: 4.17.21 lucide-react: specifier: ^0.510.0 version: 0.510.0(react@18.3.1) @@ -144,8 +144,8 @@ importers: specifier: ^2.30.1 version: 2.30.1 next: - specifier: ^14.2.26 - version: 14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^15.3.2 + version: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -224,7 +224,7 @@ importers: version: 8.6.14(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3)) '@storybook/nextjs': specifier: ^8.5.3 - version: 8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) + version: 8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) '@storybook/react': specifier: ^8.3.5 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) @@ -238,7 +238,7 @@ importers: specifier: ^1.9.0 version: 1.9.0 '@types/lodash': - specifier: ^4.17.13 + specifier: ^4.17.17 version: 4.17.17 '@types/negotiator': specifier: ^0.6.3 @@ -1190,105 +1190,221 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.2': + resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.2': + resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.2': + resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.2': + resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.2': + resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.2': + resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.2': + resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.2': + resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.2': + resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.2': + resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.2': + resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.2': + resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@inquirer/confirm@5.1.12': resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} engines: {node: '>=18'} @@ -1436,62 +1552,56 @@ packages: '@napi-rs/wasm-runtime@0.2.10': resolution: {integrity: sha512-bCsCyeZEwVErsGmyPNSzwfwFn4OdxBj0mmv6hOFucB/k81Ojdu68RbZdxYsRQUPc9l6SU5F/cG+bXgWs3oUgsQ==} - '@next/env@14.2.29': - resolution: {integrity: sha512-UzgLR2eBfhKIQt0aJ7PWH7XRPYw7SXz0Fpzdl5THjUnvxy4kfBk9OU4RNPNiETewEEtaBcExNFNn1QWH8wQTjg==} + '@next/env@15.3.3': + resolution: {integrity: sha512-OdiMrzCl2Xi0VTjiQQUK0Xh7bJHnOuET2s+3V+Y40WJBAXrJeGA3f+I8MZJ/YQ3mVGi5XGR1L66oFlgqXhQ4Vw==} '@next/eslint-plugin-next@15.1.6': resolution: {integrity: sha512-+slMxhTgILUntZDGNgsKEYHUvpn72WP1YTlkmEhS51vnVd7S9jEEy0n9YAMcI21vUG4akTw9voWH02lrClt/yw==} - '@next/swc-darwin-arm64@14.2.29': - resolution: {integrity: sha512-wWtrAaxCVMejxPHFb1SK/PVV1WDIrXGs9ki0C/kUM8ubKHQm+3hU9MouUywCw8Wbhj3pewfHT2wjunLEr/TaLA==} + '@next/swc-darwin-arm64@15.3.3': + resolution: {integrity: sha512-WRJERLuH+O3oYB4yZNVahSVFmtxRNjNF1I1c34tYMoJb0Pve+7/RaLAJJizyYiFhjYNGHRAE1Ri2Fd23zgDqhg==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.29': - resolution: {integrity: sha512-7Z/jk+6EVBj4pNLw/JQrvZVrAh9Bv8q81zCFSfvTMZ51WySyEHWVpwCEaJY910LyBftv2F37kuDPQm0w9CEXyg==} + '@next/swc-darwin-x64@15.3.3': + resolution: {integrity: sha512-XHdzH/yBc55lu78k/XwtuFR/ZXUTcflpRXcsu0nKmF45U96jt1tsOZhVrn5YH+paw66zOANpOnFQ9i6/j+UYvw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.29': - resolution: {integrity: sha512-o6hrz5xRBwi+G7JFTHc+RUsXo2lVXEfwh4/qsuWBMQq6aut+0w98WEnoNwAwt7hkEqegzvazf81dNiwo7KjITw==} + '@next/swc-linux-arm64-gnu@15.3.3': + resolution: {integrity: sha512-VZ3sYL2LXB8znNGcjhocikEkag/8xiLgnvQts41tq6i+wql63SMS1Q6N8RVXHw5pEUjiof+II3HkDd7GFcgkzw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.29': - resolution: {integrity: sha512-9i+JEHBOVgqxQ92HHRFlSW1EQXqa/89IVjtHgOqsShCcB/ZBjTtkWGi+SGCJaYyWkr/lzu51NTMCfKuBf7ULNw==} + '@next/swc-linux-arm64-musl@15.3.3': + resolution: {integrity: sha512-h6Y1fLU4RWAp1HPNJWDYBQ+e3G7sLckyBXhmH9ajn8l/RSMnhbuPBV/fXmy3muMcVwoJdHL+UtzRzs0nXOf9SA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.29': - resolution: {integrity: sha512-B7JtMbkUwHijrGBOhgSQu2ncbCYq9E7PZ7MX58kxheiEOwdkM+jGx0cBb+rN5AeqF96JypEppK6i/bEL9T13lA==} + '@next/swc-linux-x64-gnu@15.3.3': + resolution: {integrity: sha512-jJ8HRiF3N8Zw6hGlytCj5BiHyG/K+fnTKVDEKvUCyiQ/0r5tgwO7OgaRiOjjRoIx2vwLR+Rz8hQoPrnmFbJdfw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.29': - resolution: {integrity: sha512-yCcZo1OrO3aQ38B5zctqKU1Z3klOohIxug6qdiKO3Q3qNye/1n6XIs01YJ+Uf+TdpZQ0fNrOQI2HrTLF3Zprnw==} + '@next/swc-linux-x64-musl@15.3.3': + resolution: {integrity: sha512-HrUcTr4N+RgiiGn3jjeT6Oo208UT/7BuTr7K0mdKRBtTbT4v9zJqCDKO97DUqqoBK1qyzP1RwvrWTvU6EPh/Cw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.29': - resolution: {integrity: sha512-WnrfeOEtTVidI9Z6jDLy+gxrpDcEJtZva54LYC0bSKQqmyuHzl0ego+v0F/v2aXq0am67BRqo/ybmmt45Tzo4A==} + '@next/swc-win32-arm64-msvc@15.3.3': + resolution: {integrity: sha512-SxorONgi6K7ZUysMtRF3mIeHC5aA3IQLmKFQzU0OuhuUYwpOBc1ypaLJLP5Bf3M9k53KUUUj4vTPwzGvl/NwlQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.29': - resolution: {integrity: sha512-vkcriFROT4wsTdSeIzbxaZjTNTFKjSYmLd8q/GVH3Dn8JmYjUKOuKXHK8n+lovW/kdcpIvydO5GtN+It2CvKWA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.29': - resolution: {integrity: sha512-iPPwUEKnVs7pwR0EBLJlwxLD7TTHWS/AoVZx1l9ZQzfQciqaFEr5AlYzA2uB6Fyby1IF18t4PL0nTpB+k4Tzlw==} + '@next/swc-win32-x64-msvc@15.3.3': + resolution: {integrity: sha512-4QZG6F8enl9/S2+yIiOiju0iCTFd93d8VC1q9LZS4p/Xuk81W2QDjCFeoogmrWWkAD59z8ZxepBQap2dKS5ruw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2841,8 +2951,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@swc/jest@0.2.38': resolution: {integrity: sha512-HMoZgXWMqChJwffdDjvplH53g9G2ALQes3HKXDEdliB/b85OQ0CTSbxG8VSeCwiAn7cOaDVEt4mwmZvbHcS52w==} @@ -5831,21 +5941,24 @@ packages: react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc - next@14.2.29: - resolution: {integrity: sha512-s98mCOMOWLGGpGOfgKSnleXLuegvvH415qtRZXpSp00HeEgdmrxmwL9cgKU+h4XrhB16zEI5d/7BnkS3ATInsA==} - engines: {node: '>=18.17.0'} + next@15.3.3: + resolution: {integrity: sha512-JqNj29hHNmCLtNvd090SyRbXJiivQ+58XjCcrC50Crb5g5u2zi7Y2YivbsEfzk6AtVI80akdOQbaMZwWB1Hthw==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true '@playwright/test': optional: true + babel-plugin-react-compiler: + optional: true sass: optional: true @@ -6769,6 +6882,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.2: + resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -6999,13 +7116,13 @@ packages: react: '>= 16.8.0' react-dom: '>= 16.8.0' - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' peerDependenciesMeta: '@babel/core': optional: true @@ -8594,76 +8711,157 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.2': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.4.3 optional: true + '@img/sharp-wasm32@0.34.2': + dependencies: + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-win32-arm64@0.34.2': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.2': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.2': + optional: true + '@inquirer/confirm@5.1.12(@types/node@22.15.29)': dependencies: '@inquirer/core': 10.1.13(@types/node@22.15.29) @@ -8919,42 +9117,39 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@next/env@14.2.29': {} + '@next/env@15.3.3': {} '@next/eslint-plugin-next@15.1.6': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@14.2.29': + '@next/swc-darwin-arm64@15.3.3': optional: true - '@next/swc-darwin-x64@14.2.29': + '@next/swc-darwin-x64@15.3.3': optional: true - '@next/swc-linux-arm64-gnu@14.2.29': + '@next/swc-linux-arm64-gnu@15.3.3': optional: true - '@next/swc-linux-arm64-musl@14.2.29': + '@next/swc-linux-arm64-musl@15.3.3': optional: true - '@next/swc-linux-x64-gnu@14.2.29': + '@next/swc-linux-x64-gnu@15.3.3': optional: true - '@next/swc-linux-x64-musl@14.2.29': + '@next/swc-linux-x64-musl@15.3.3': optional: true - '@next/swc-win32-arm64-msvc@14.2.29': + '@next/swc-win32-arm64-msvc@15.3.3': optional: true - '@next/swc-win32-ia32-msvc@14.2.29': + '@next/swc-win32-x64-msvc@15.3.3': optional: true - '@next/swc-win32-x64-msvc@14.2.29': - optional: true - - '@next/third-parties@15.3.3(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + '@next/third-parties@15.3.3(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': dependencies: - next: 14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 third-party-capital: 1.0.20 @@ -9958,7 +10153,7 @@ snapshots: '@sentry/core@9.24.0': {} - '@sentry/nextjs@9.24.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': + '@sentry/nextjs@9.24.0(@opentelemetry/context-async-hooks@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@1.30.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.0))(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.34.0 @@ -9971,7 +10166,7 @@ snapshots: '@sentry/vercel-edge': 9.24.0 '@sentry/webpack-plugin': 3.5.0(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) chalk: 3.0.0 - next: 14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resolve: 1.22.8 rollup: 4.35.0 stacktrace-parser: 0.1.11 @@ -10282,7 +10477,7 @@ snapshots: dependencies: storybook: 8.6.14(prettier@3.5.3) - '@storybook/nextjs@8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': + '@storybook/nextjs@8.6.14(@swc/core@1.11.29)(esbuild@0.25.5)(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(prettier@3.5.3))(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) @@ -10308,7 +10503,7 @@ snapshots: find-up: 5.0.0 image-size: 1.2.1 loader-utils: 3.3.1 - next: 14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.9(@swc/core@1.11.29)(esbuild@0.25.5)) pnp-webpack-plugin: 1.7.0(typescript@5.8.3) postcss: 8.5.4 @@ -10553,9 +10748,8 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.5': + '@swc/helpers@0.5.15': dependencies: - '@swc/counter': 0.1.3 tslib: 2.8.1 '@swc/jest@0.2.38(@swc/core@1.11.29)': @@ -12783,9 +12977,9 @@ snapshots: functions-have-names@1.2.3: {} - geist@1.4.2(next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): + geist@1.4.2(next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)): dependencies: - next: 14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) gensync@1.0.0-beta.2: {} @@ -14239,29 +14433,29 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.29(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@15.3.3(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.52.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.29 - '@swc/helpers': 0.5.5 + '@next/env': 15.3.3 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.15 busboy: 1.6.0 caniuse-lite: 1.0.30001720 - graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.27.4)(react@18.3.1) + styled-jsx: 5.1.6(@babel/core@7.27.4)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.29 - '@next/swc-darwin-x64': 14.2.29 - '@next/swc-linux-arm64-gnu': 14.2.29 - '@next/swc-linux-arm64-musl': 14.2.29 - '@next/swc-linux-x64-gnu': 14.2.29 - '@next/swc-linux-x64-musl': 14.2.29 - '@next/swc-win32-arm64-msvc': 14.2.29 - '@next/swc-win32-ia32-msvc': 14.2.29 - '@next/swc-win32-x64-msvc': 14.2.29 + '@next/swc-darwin-arm64': 15.3.3 + '@next/swc-darwin-x64': 15.3.3 + '@next/swc-linux-arm64-gnu': 15.3.3 + '@next/swc-linux-arm64-musl': 15.3.3 + '@next/swc-linux-x64-gnu': 15.3.3 + '@next/swc-linux-x64-musl': 15.3.3 + '@next/swc-win32-arm64-msvc': 15.3.3 + '@next/swc-win32-x64-msvc': 15.3.3 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.52.0 + sharp: 0.34.2 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -15295,6 +15489,35 @@ snapshots: '@img/sharp-win32-x64': 0.33.5 optional: true + sharp@0.34.2: + dependencies: + color: 4.2.3 + detect-libc: 2.0.4 + semver: 7.7.2 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.2 + '@img/sharp-darwin-x64': 0.34.2 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.2 + '@img/sharp-linux-arm64': 0.34.2 + '@img/sharp-linux-s390x': 0.34.2 + '@img/sharp-linux-x64': 0.34.2 + '@img/sharp-linuxmusl-arm64': 0.34.2 + '@img/sharp-linuxmusl-x64': 0.34.2 + '@img/sharp-wasm32': 0.34.2 + '@img/sharp-win32-arm64': 0.34.2 + '@img/sharp-win32-ia32': 0.34.2 + '@img/sharp-win32-x64': 0.34.2 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -15572,7 +15795,7 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 - styled-jsx@5.1.1(@babel/core@7.27.4)(react@18.3.1): + styled-jsx@5.1.6(@babel/core@7.27.4)(react@18.3.1): dependencies: client-only: 0.0.1 react: 18.3.1 diff --git a/autogpt_platform/frontend/src/app/(platform)/admin/marketplace/page.tsx b/autogpt_platform/frontend/src/app/(platform)/admin/marketplace/page.tsx index 5862765836..d4df2e5b77 100644 --- a/autogpt_platform/frontend/src/app/(platform)/admin/marketplace/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/admin/marketplace/page.tsx @@ -3,14 +3,16 @@ import { Suspense } from "react"; import type { SubmissionStatus } from "@/lib/autogpt-server-api/types"; import { AdminAgentsDataTable } from "@/components/admin/marketplace/admin-agents-data-table"; +type MarketplaceAdminPageSearchParams = { + page?: string; + status?: string; + search?: string; +}; + async function AdminMarketplaceDashboard({ searchParams, }: { - searchParams: { - page?: string; - status?: string; - search?: string; - }; + searchParams: MarketplaceAdminPageSearchParams; }) { const page = searchParams.page ? Number.parseInt(searchParams.page) : 1; const status = searchParams.status as SubmissionStatus | undefined; @@ -47,16 +49,12 @@ async function AdminMarketplaceDashboard({ export default async function AdminMarketplacePage({ searchParams, }: { - searchParams: { - page?: string; - status?: string; - search?: string; - }; + searchParams: Promise; }) { "use server"; const withAdminAccess = await withRoleAccess(["admin"]); const ProtectedAdminMarketplace = await withAdminAccess( AdminMarketplaceDashboard, ); - return ; + return ; } diff --git a/autogpt_platform/frontend/src/app/(platform)/admin/spending/page.tsx b/autogpt_platform/frontend/src/app/(platform)/admin/spending/page.tsx index 68e9189078..ddb60f3f01 100644 --- a/autogpt_platform/frontend/src/app/(platform)/admin/spending/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/admin/spending/page.tsx @@ -3,14 +3,16 @@ import type { CreditTransactionType } from "@/lib/autogpt-server-api"; import { withRoleAccess } from "@/lib/withRoleAccess"; import { Suspense } from "react"; +type SpendingDashboardPageSearchParams = { + page?: string; + status?: string; + search?: string; +}; + function SpendingDashboard({ searchParams, }: { - searchParams: { - page?: string; - status?: string; - search?: string; - }; + searchParams: SpendingDashboardPageSearchParams; }) { const page = searchParams.page ? Number.parseInt(searchParams.page) : 1; const search = searchParams.search; @@ -45,14 +47,10 @@ function SpendingDashboard({ export default async function SpendingDashboardPage({ searchParams, }: { - searchParams: { - page?: string; - status?: string; - search?: string; - }; + searchParams: Promise; }) { "use server"; const withAdminAccess = await withRoleAccess(["admin"]); const ProtectedSpendingDashboard = await withAdminAccess(SpendingDashboard); - return ; + return ; } diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/actions.ts b/autogpt_platform/frontend/src/app/(platform)/marketplace/actions.ts new file mode 100644 index 0000000000..25552ba139 --- /dev/null +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/actions.ts @@ -0,0 +1,56 @@ +"use server"; + +import BackendAPI, { + CreatorsResponse, + StoreAgentsResponse, +} from "@/lib/autogpt-server-api"; + +const EMPTY_AGENTS_RESPONSE: StoreAgentsResponse = { + agents: [], + pagination: { + total_items: 0, + total_pages: 0, + current_page: 0, + page_size: 0, + }, +}; +const EMPTY_CREATORS_RESPONSE: CreatorsResponse = { + creators: [], + pagination: { + total_items: 0, + total_pages: 0, + current_page: 0, + page_size: 0, + }, +}; + +export async function getMarketplaceData(): Promise<{ + featuredAgents: StoreAgentsResponse; + topAgents: StoreAgentsResponse; + featuredCreators: CreatorsResponse; +}> { + const api = new BackendAPI(); + + const [featuredAgents, topAgents, featuredCreators] = await Promise.all([ + api.getStoreAgents({ featured: true }).catch((error) => { + console.error("Error fetching featured marketplace agents:", error); + return EMPTY_AGENTS_RESPONSE; + }), + api.getStoreAgents({ sorted_by: "runs" }).catch((error) => { + console.error("Error fetching top marketplace agents:", error); + return EMPTY_AGENTS_RESPONSE; + }), + api + .getStoreCreators({ featured: true, sorted_by: "num_agents" }) + .catch((error) => { + console.error("Error fetching featured marketplace creators:", error); + return EMPTY_CREATORS_RESPONSE; + }), + ]); + + return { + featuredAgents, + topAgents, + featuredCreators, + }; +} diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/agent/[creator]/[slug]/page.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/agent/[creator]/[slug]/page.tsx index bf9b773a7a..2c10864f55 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/agent/[creator]/[slug]/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/agent/[creator]/[slug]/page.tsx @@ -11,12 +11,15 @@ import getServerUser from "@/lib/supabase/getServerUser"; // Force dynamic rendering to avoid static generation issues with cookies export const dynamic = "force-dynamic"; +type MarketplaceAgentPageParams = { creator: string; slug: string }; + export async function generateMetadata({ - params, + params: _params, }: { - params: { creator: string; slug: string }; + params: Promise; }): Promise { const api = new BackendAPI(); + const params = await _params; const agent = await api.getStoreAgent(params.creator, params.slug); return { @@ -34,11 +37,12 @@ export async function generateMetadata({ // })); // } -export default async function Page({ - params, +export default async function MarketplaceAgentPage({ + params: _params, }: { - params: { creator: string; slug: string }; + params: Promise; }) { + const params = await _params; const creator_lower = params.creator.toLowerCase(); const { user } = await getServerUser(); const api = new BackendAPI(); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/creator/[creator]/page.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/creator/[creator]/page.tsx index ec47cfcd26..b462cdb704 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/creator/[creator]/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/creator/[creator]/page.tsx @@ -9,12 +9,15 @@ import { Separator } from "@/components/ui/separator"; // Force dynamic rendering to avoid static generation issues with cookies export const dynamic = "force-dynamic"; +type MarketplaceCreatorPageParams = { creator: string }; + export async function generateMetadata({ - params, + params: _params, }: { - params: { creator: string }; + params: Promise; }): Promise { const api = new BackendAPI(); + const params = await _params; const creator = await api.getStoreCreator(params.creator.toLowerCase()); return { @@ -32,11 +35,12 @@ export async function generateMetadata({ // } export default async function Page({ - params, + params: _params, }: { - params: { creator: string }; + params: Promise; }) { const api = new BackendAPI(); + const params = await _params; try { const creator = await api.getStoreCreator(params.creator); diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/page.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/page.tsx index 9d7796a0d8..c743e3f690 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/page.tsx @@ -1,4 +1,4 @@ -import * as React from "react"; +import React from "react"; import { HeroSection } from "@/components/agptui/composite/HeroSection"; import { FeaturedSection } from "@/components/agptui/composite/FeaturedSection"; import { @@ -12,97 +12,12 @@ import { } from "@/components/agptui/composite/FeaturedCreators"; import { Separator } from "@/components/ui/separator"; import { Metadata } from "next"; -import { - StoreAgentsResponse, - CreatorsResponse, -} from "@/lib/autogpt-server-api/types"; -import BackendAPI from "@/lib/autogpt-server-api"; + +import { getMarketplaceData } from "./actions"; // Force dynamic rendering to avoid static generation issues with cookies export const dynamic = "force-dynamic"; -async function getStoreData() { - try { - const api = new BackendAPI(); - - // Add error handling and default values - let featuredAgents: StoreAgentsResponse = { - agents: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }; - let topAgents: StoreAgentsResponse = { - agents: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }; - let featuredCreators: CreatorsResponse = { - creators: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }; - - try { - [featuredAgents, topAgents, featuredCreators] = await Promise.all([ - api.getStoreAgents({ featured: true }), - api.getStoreAgents({ sorted_by: "runs" }), - api.getStoreCreators({ featured: true, sorted_by: "num_agents" }), - ]); - } catch (error) { - console.error("Error fetching store data:", error); - } - - return { - featuredAgents, - topAgents, - featuredCreators, - }; - } catch (error) { - console.error("Error in getStoreData:", error); - return { - featuredAgents: { - agents: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }, - topAgents: { - agents: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }, - featuredCreators: { - creators: [], - pagination: { - total_items: 0, - total_pages: 0, - current_page: 0, - page_size: 0, - }, - }, - }; - } -} - // FIX: Correct metadata export const metadata: Metadata = { title: "Marketplace - AutoGPT Platform", @@ -147,9 +62,9 @@ export const metadata: Metadata = { }, }; -export default async function Page({}: {}) { - // Get data server-side - const { featuredAgents, topAgents, featuredCreators } = await getStoreData(); +export default async function MarketplacePage(): Promise { + const { featuredAgents, topAgents, featuredCreators } = + await getMarketplaceData(); return (
diff --git a/autogpt_platform/frontend/src/app/(platform)/marketplace/search/page.tsx b/autogpt_platform/frontend/src/app/(platform)/marketplace/search/page.tsx index 921f53601e..88f620f6ab 100644 --- a/autogpt_platform/frontend/src/app/(platform)/marketplace/search/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/marketplace/search/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useState, useEffect } from "react"; +import { use, useCallback, useEffect, useState } from "react"; import { AgentsSection } from "@/components/agptui/composite/AgentsSection"; import { SearchBar } from "@/components/agptui/SearchBar"; import { FeaturedCreators } from "@/components/agptui/composite/FeaturedCreators"; @@ -9,15 +9,17 @@ import { SearchFilterChips } from "@/components/agptui/SearchFilterChips"; import { SortDropdown } from "@/components/agptui/SortDropdown"; import { useBackendAPI } from "@/lib/autogpt-server-api/context"; -export default function Page({ +type MarketplaceSearchPageSearchParams = { searchTerm?: string; sort?: string }; + +export default function MarketplaceSearchPage({ searchParams, }: { - searchParams: { searchTerm?: string; sort?: string }; + searchParams: Promise; }) { return ( ); } @@ -28,7 +30,7 @@ function SearchResults({ }: { searchTerm: string; sort: string; -}) { +}): React.ReactElement { const [showAgents, setShowAgents] = useState(true); const [showCreators, setShowCreators] = useState(true); const [agents, setAgents] = useState([]); @@ -80,40 +82,43 @@ function SearchResults({ } }; - const handleSortChange = (sortValue: string) => { - let sortBy = "recent"; - if (sortValue === "runs") { - sortBy = "runs"; - } else if (sortValue === "rating") { - sortBy = "rating"; - } - - const sortedAgents = [...agents].sort((a, b) => { - if (sortBy === "runs") { - return b.runs - a.runs; - } else if (sortBy === "rating") { - return b.rating - a.rating; - } else { - return ( - new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime() - ); + const handleSortChange = useCallback( + (sortValue: string) => { + let sortBy = "recent"; + if (sortValue === "runs") { + sortBy = "runs"; + } else if (sortValue === "rating") { + sortBy = "rating"; } - }); - const sortedCreators = [...creators].sort((a, b) => { - if (sortBy === "runs") { - return b.agent_runs - a.agent_runs; - } else if (sortBy === "rating") { - return b.agent_rating - a.agent_rating; - } else { - // Creators don't have updated_at, sort by number of agents as fallback - return b.num_agents - a.num_agents; - } - }); + const sortedAgents = [...agents].sort((a, b) => { + if (sortBy === "runs") { + return b.runs - a.runs; + } else if (sortBy === "rating") { + return b.rating - a.rating; + } else { + return ( + new Date(b.updated_at).getTime() - new Date(a.updated_at).getTime() + ); + } + }); - setAgents(sortedAgents); - setCreators(sortedCreators); - }; + const sortedCreators = [...creators].sort((a, b) => { + if (sortBy === "runs") { + return b.agent_runs - a.agent_runs; + } else if (sortBy === "rating") { + return b.agent_rating - a.agent_rating; + } else { + // Creators don't have updated_at, sort by number of agents as fallback + return b.num_agents - a.num_agents; + } + }); + + setAgents(sortedAgents); + setCreators(sortedCreators); + }, + [agents, creators], + ); return (
diff --git a/autogpt_platform/frontend/src/app/(platform)/profile/(user)/page.tsx b/autogpt_platform/frontend/src/app/(platform)/profile/(user)/page.tsx index 4854806cc3..863a6cab1f 100644 --- a/autogpt_platform/frontend/src/app/(platform)/profile/(user)/page.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/profile/(user)/page.tsx @@ -1,43 +1,28 @@ -import * as React from "react"; +import React from "react"; import { Metadata } from "next/types"; -import { ProfileInfoForm } from "@/components/agptui/ProfileInfoForm"; +import { redirect } from "next/navigation"; import BackendAPI from "@/lib/autogpt-server-api"; -import { CreatorDetails } from "@/lib/autogpt-server-api/types"; +import { ProfileInfoForm } from "@/components/agptui/ProfileInfoForm"; // Force dynamic rendering to avoid static generation issues with cookies export const dynamic = "force-dynamic"; -async function getProfileData(api: BackendAPI) { - try { - const profile = await api.getStoreProfile(); - return { - profile, - }; - } catch (error) { - console.error("Error fetching profile:", error); - return { - profile: null, - }; - } -} - export const metadata: Metadata = { title: "Profile - AutoGPT Platform" }; -export default async function Page({}: {}) { +export default async function UserProfilePage(): Promise { const api = new BackendAPI(); - const { profile } = await getProfileData(api); + const profile = await api.getStoreProfile().catch((error) => { + console.error("Error fetching profile:", error); + return null; + }); if (!profile) { - return ( -
-

Please log in to view your profile

-
- ); + redirect("/login"); } return (
- +
); } diff --git a/autogpt_platform/frontend/src/app/(platform)/reset_password/actions.ts b/autogpt_platform/frontend/src/app/(platform)/reset_password/actions.ts index 2fd1ac1567..67b05a624b 100644 --- a/autogpt_platform/frontend/src/app/(platform)/reset_password/actions.ts +++ b/autogpt_platform/frontend/src/app/(platform)/reset_password/actions.ts @@ -11,7 +11,7 @@ export async function sendResetEmail(email: string, turnstileToken: string) { {}, async () => { const supabase = getServerSupabase(); - const headersList = headers(); + const headersList = await headers(); const host = headersList.get("host"); const protocol = process.env.NODE_ENV === "development" ? "http" : "https"; diff --git a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx index 479bfb6a8f..32d4a003cb 100644 --- a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx +++ b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.stories.tsx @@ -51,9 +51,6 @@ export const Empty: Story = { description: "", avatar_url: "", links: [], - top_categories: [], - agent_rating: 0, - agent_runs: 0, }, }, }; @@ -71,9 +68,6 @@ export const Filled: Story = { "twitter.com/oliviagrace", "github.com/ograce", ], - top_categories: ["Entertainment", "Blog", "Content creation"], - agent_rating: 4.5, - agent_runs: 100, }, }, }; diff --git a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.tsx b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.tsx index eebe428f56..d850c82a9a 100644 --- a/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.tsx +++ b/autogpt_platform/frontend/src/components/agptui/ProfileInfoForm.tsx @@ -7,14 +7,14 @@ import Image from "next/image"; import { Button } from "./Button"; import { IconPersonFill } from "@/components/ui/icons"; -import { CreatorDetails, ProfileDetails } from "@/lib/autogpt-server-api/types"; +import { ProfileDetails } from "@/lib/autogpt-server-api/types"; import { Separator } from "@/components/ui/separator"; import useSupabase from "@/hooks/useSupabase"; import { useBackendAPI } from "@/lib/autogpt-server-api/context"; -export const ProfileInfoForm = ({ profile }: { profile: CreatorDetails }) => { +export const ProfileInfoForm = ({ profile }: { profile: ProfileDetails }) => { const [isSubmitting, setIsSubmitting] = useState(false); - const [profileData, setProfileData] = useState(profile); + const [profileData, setProfileData] = useState(profile); const { supabase } = useSupabase(); const api = useBackendAPI(); @@ -31,10 +31,8 @@ export const ProfileInfoForm = ({ profile }: { profile: CreatorDetails }) => { }; if (!isSubmitting) { - const returnedProfile = await api.updateStoreProfile( - updatedProfile as ProfileDetails, - ); - setProfileData(returnedProfile as CreatorDetails); + const returnedProfile = await api.updateStoreProfile(updatedProfile); + setProfileData(returnedProfile); } } catch (error) { console.error("Error updating profile:", error); @@ -88,10 +86,8 @@ export const ProfileInfoForm = ({ profile }: { profile: CreatorDetails }) => { avatar_url: mediaUrl, }; - const returnedProfile = await api.updateStoreProfile( - updatedProfile as ProfileDetails, - ); - setProfileData(returnedProfile as CreatorDetails); + const returnedProfile = await api.updateStoreProfile(updatedProfile); + setProfileData(returnedProfile); } catch (error) { console.error("Error uploading image:", error); } diff --git a/autogpt_platform/frontend/src/components/customnode.css b/autogpt_platform/frontend/src/components/customnode.css index e12a10d092..07a6e8679b 100644 --- a/autogpt_platform/frontend/src/components/customnode.css +++ b/autogpt_platform/frontend/src/components/customnode.css @@ -15,7 +15,7 @@ .custom-node [data-id^="date-picker"], .custom-node [data-list-container], .custom-node [data-add-item], -.custom-node [data-content-settings]. .array-item-container { +.custom-node [data-content-settings] .array-item-container { display: flex; align-items: center; min-width: calc(100% - 2.5rem); diff --git a/autogpt_platform/frontend/src/lib/supabase/getServerSupabase.ts b/autogpt_platform/frontend/src/lib/supabase/getServerSupabase.ts index 7122b2e658..aea3d90a67 100644 --- a/autogpt_platform/frontend/src/lib/supabase/getServerSupabase.ts +++ b/autogpt_platform/frontend/src/lib/supabase/getServerSupabase.ts @@ -1,9 +1,10 @@ +import type { UnsafeUnwrappedCookies } from "next/headers"; import { createServerClient } from "@supabase/ssr"; export default function getServerSupabase() { // Need require here, so Next.js doesn't complain about importing this on client side const { cookies } = require("next/headers"); - const cookieStore = cookies(); + const cookieStore = cookies() as UnsafeUnwrappedCookies; try { const supabase = createServerClient( diff --git a/autogpt_platform/frontend/tsconfig.json b/autogpt_platform/frontend/tsconfig.json index f4c6d13fd2..e426876470 100644 --- a/autogpt_platform/frontend/tsconfig.json +++ b/autogpt_platform/frontend/tsconfig.json @@ -1,22 +1,19 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, "skipLibCheck": true, "strict": true, "noEmit": true, + "target": "ES2022", "esModuleInterop": true, - "module": "esnext", + "module": "ESNext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, - "plugins": [ - { - "name": "next" - } - ], + "plugins": [{ "name": "next" }], "paths": { "@/*": ["./src/*"] } diff --git a/autogpt_platform/frontend/webpack.config.js b/autogpt_platform/frontend/webpack.config.js deleted file mode 100644 index 396dc1b540..0000000000 --- a/autogpt_platform/frontend/webpack.config.js +++ /dev/null @@ -1,7 +0,0 @@ -module.exports = { - devServer: { - proxy: { - "/graphs": "http://localhost:8000", - }, - }, -};