From b4e95dba14e34d0e629aa24851d9a2053dc6f572 Mon Sep 17 00:00:00 2001 From: Ubbe Date: Mon, 1 Dec 2025 20:28:44 +0700 Subject: [PATCH] feat(frontend): update empty task view designs (#11498) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Changes 🏗️ Update the new library agent page, empty view to look like: Screenshot 2025-12-01 at 14 12 10 Now we display an **About this agent** card on the left when the agent is published on the marketplace. I expanded the: ``` /api/library/agents/{id} ``` endpoint to return as well the following: ```js { // ... created_at: "timestamp", marketplace_listing: { creator: { name: "string", "slug": string, id: "string" }, name: "string", slug: "string", id: "string" } } ``` To be able to display this extra information on the card and link to the creator and marketplace pages. Also: - design system updates regarding navbar and colors ## 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] Run locally and see the new page for an agent with no runs --- .../backend/backend/server/v2/library/db.py | 26 + .../backend/server/v2/library/model.py | 42 + .../backend/server/v2/library/routes_test.py | 4 + .../backend/snapshots/lib_agts_search | 8 +- .../NewAgentLibraryView.tsx | 66 +- .../components/other/EmptyAgentRuns.tsx | 136 ++-- .../other/EmptyRunsIllustration.tsx | 746 ++++++++++++++++++ .../useNewAgentLibraryView.ts | 1 + .../components/EmailForm/EmailForm.tsx | 7 +- .../frontend/src/app/api/openapi.json | 37 + autogpt_platform/frontend/src/app/globals.css | 2 +- .../src/components/atoms/Button/helpers.ts | 2 +- .../GoogleDrivePickerInput.tsx | 3 +- .../components/AccountMenu/AccountMenu.tsx | 8 +- .../components/AccountLogoutOption.tsx | 4 +- .../layout/Navbar/components/LoginButton.tsx | 2 +- .../layout/Navbar/components/NavbarLink.tsx | 4 +- .../layout/Navbar/components/NavbarView.tsx | 2 +- .../src/components/layout/Navbar/helpers.tsx | 2 +- .../molecules/Breadcrumbs/Breadcrumbs.tsx | 6 +- .../molecules/ShowMoreText/ShowMoreText.tsx | 22 +- 21 files changed, 1008 insertions(+), 122 deletions(-) create mode 100644 autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyRunsIllustration.tsx diff --git a/autogpt_platform/backend/backend/server/v2/library/db.py b/autogpt_platform/backend/backend/server/v2/library/db.py index c8e7d0341b..a95b840d90 100644 --- a/autogpt_platform/backend/backend/server/v2/library/db.py +++ b/autogpt_platform/backend/backend/server/v2/library/db.py @@ -262,6 +262,30 @@ async def get_library_agent(id: str, user_id: str) -> library_model.LibraryAgent if not library_agent: raise NotFoundError(f"Library agent #{id} not found") + # Fetch marketplace listing if the agent has been published + store_listing = None + profile = None + if library_agent.AgentGraph: + store_listing = await prisma.models.StoreListing.prisma().find_first( + where={ + "agentGraphId": library_agent.AgentGraph.id, + "isDeleted": False, + "hasApprovedVersion": True, + }, + include={ + "ActiveVersion": True, + }, + ) + if ( + store_listing + and store_listing.ActiveVersion + and store_listing.owningUserId + ): + # Fetch Profile separately since User doesn't have a direct Profile relation + profile = await prisma.models.Profile.prisma().find_first( + where={"userId": store_listing.owningUserId} + ) + return library_model.LibraryAgent.from_db( library_agent, sub_graphs=( @@ -269,6 +293,8 @@ async def get_library_agent(id: str, user_id: str) -> library_model.LibraryAgent if library_agent.AgentGraph else None ), + store_listing=store_listing, + profile=profile, ) except prisma.errors.PrismaError as e: diff --git a/autogpt_platform/backend/backend/server/v2/library/model.py b/autogpt_platform/backend/backend/server/v2/library/model.py index f4c1a35177..d6b5ba90de 100644 --- a/autogpt_platform/backend/backend/server/v2/library/model.py +++ b/autogpt_platform/backend/backend/server/v2/library/model.py @@ -22,6 +22,23 @@ class LibraryAgentStatus(str, Enum): ERROR = "ERROR" # Agent is in an error state +class MarketplaceListingCreator(pydantic.BaseModel): + """Creator information for a marketplace listing.""" + + name: str + id: str + slug: str + + +class MarketplaceListing(pydantic.BaseModel): + """Marketplace listing information for a library agent.""" + + id: str + name: str + slug: str + creator: MarketplaceListingCreator + + class LibraryAgent(pydantic.BaseModel): """ Represents an agent in the library, including metadata for display and @@ -39,6 +56,7 @@ class LibraryAgent(pydantic.BaseModel): status: LibraryAgentStatus + created_at: datetime.datetime updated_at: datetime.datetime name: str @@ -71,10 +89,15 @@ class LibraryAgent(pydantic.BaseModel): # Recommended schedule cron (from marketplace agents) recommended_schedule_cron: str | None = None + # Marketplace listing information if the agent has been published + marketplace_listing: Optional["MarketplaceListing"] = None + @staticmethod def from_db( agent: prisma.models.LibraryAgent, sub_graphs: Optional[list[prisma.models.AgentGraph]] = None, + store_listing: Optional[prisma.models.StoreListing] = None, + profile: Optional[prisma.models.Profile] = None, ) -> "LibraryAgent": """ Factory method that constructs a LibraryAgent from a Prisma LibraryAgent @@ -85,6 +108,8 @@ class LibraryAgent(pydantic.BaseModel): graph = graph_model.GraphModel.from_db(agent.AgentGraph, sub_graphs=sub_graphs) + created_at = agent.createdAt + agent_updated_at = agent.AgentGraph.updatedAt lib_agent_updated_at = agent.updatedAt @@ -116,6 +141,21 @@ class LibraryAgent(pydantic.BaseModel): # Hard-coded to True until a method to check is implemented is_latest_version = True + # Build marketplace_listing if available + marketplace_listing_data = None + if store_listing and store_listing.ActiveVersion and profile: + creator_data = MarketplaceListingCreator( + name=profile.name, + id=profile.id, + slug=profile.username, + ) + marketplace_listing_data = MarketplaceListing( + id=store_listing.id, + name=store_listing.ActiveVersion.name, + slug=store_listing.slug, + creator=creator_data, + ) + return LibraryAgent( id=agent.id, graph_id=agent.agentGraphId, @@ -124,6 +164,7 @@ class LibraryAgent(pydantic.BaseModel): creator_name=creator_name, creator_image_url=creator_image_url, status=status, + created_at=created_at, updated_at=updated_at, name=graph.name, description=graph.description, @@ -140,6 +181,7 @@ class LibraryAgent(pydantic.BaseModel): is_latest_version=is_latest_version, is_favorite=agent.isFavorite, recommended_schedule_cron=agent.AgentGraph.recommendedScheduleCron, + marketplace_listing=marketplace_listing_data, ) diff --git a/autogpt_platform/backend/backend/server/v2/library/routes_test.py b/autogpt_platform/backend/backend/server/v2/library/routes_test.py index 85f66c3df2..05a0e25bbf 100644 --- a/autogpt_platform/backend/backend/server/v2/library/routes_test.py +++ b/autogpt_platform/backend/backend/server/v2/library/routes_test.py @@ -55,6 +55,7 @@ async def test_get_library_agents_success( can_access_graph=True, is_latest_version=True, is_favorite=False, + created_at=datetime.datetime(2023, 1, 1, 0, 0, 0), updated_at=datetime.datetime(2023, 1, 1, 0, 0, 0), ), library_model.LibraryAgent( @@ -76,6 +77,7 @@ async def test_get_library_agents_success( can_access_graph=False, is_latest_version=True, is_favorite=False, + created_at=datetime.datetime(2023, 1, 1, 0, 0, 0), updated_at=datetime.datetime(2023, 1, 1, 0, 0, 0), ), ], @@ -149,6 +151,7 @@ async def test_get_favorite_library_agents_success( can_access_graph=True, is_latest_version=True, is_favorite=True, + created_at=datetime.datetime(2023, 1, 1, 0, 0, 0), updated_at=datetime.datetime(2023, 1, 1, 0, 0, 0), ), ], @@ -214,6 +217,7 @@ def test_add_agent_to_library_success( can_access_graph=True, is_latest_version=True, is_favorite=False, + created_at=FIXED_NOW, updated_at=FIXED_NOW, ) diff --git a/autogpt_platform/backend/snapshots/lib_agts_search b/autogpt_platform/backend/snapshots/lib_agts_search index 4da74a6ab4..649c82975e 100644 --- a/autogpt_platform/backend/snapshots/lib_agts_search +++ b/autogpt_platform/backend/snapshots/lib_agts_search @@ -8,6 +8,7 @@ "creator_name": "Test Creator", "creator_image_url": "", "status": "COMPLETED", + "created_at": "2023-01-01T00:00:00", "updated_at": "2023-01-01T00:00:00", "name": "Test Agent 1", "description": "Test Description 1", @@ -30,7 +31,8 @@ "can_access_graph": true, "is_latest_version": true, "is_favorite": false, - "recommended_schedule_cron": null + "recommended_schedule_cron": null, + "marketplace_listing": null }, { "id": "test-agent-2", @@ -40,6 +42,7 @@ "creator_name": "Test Creator", "creator_image_url": "", "status": "COMPLETED", + "created_at": "2023-01-01T00:00:00", "updated_at": "2023-01-01T00:00:00", "name": "Test Agent 2", "description": "Test Description 2", @@ -62,7 +65,8 @@ "can_access_graph": false, "is_latest_version": true, "is_favorite": false, - "recommended_schedule_cron": null + "recommended_schedule_cron": null, + "marketplace_listing": null } ], "pagination": { diff --git a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/NewAgentLibraryView.tsx b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/NewAgentLibraryView.tsx index 5bb3b953b2..7eaeeab644 100644 --- a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/NewAgentLibraryView.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/NewAgentLibraryView.tsx @@ -17,7 +17,6 @@ export function NewAgentLibraryView() { const { agent, hasAnyItems, - showSidebarLayout, ready, error, agentId, @@ -49,42 +48,46 @@ export function NewAgentLibraryView() { return ; } + const shouldShowSidebar = sidebarLoading || hasAnyItems; + return (
-
-
- - New Run - - } + {shouldShowSidebar && ( +
+
+ + New Run + + } + agent={agent} + agentId={agent.id.toString()} + onRunCreated={(execution) => handleSelectRun(execution.id)} + onScheduleCreated={(schedule) => + handleSelectRun(`schedule:${schedule.id}`) + } + /> +
+ + handleSelectRun(execution.id)} - onScheduleCreated={(schedule) => - handleSelectRun(`schedule:${schedule.id}`) - } + selectedRunId={selectedRun} + onSelectRun={handleSelectRun} + onCountsChange={handleCountsChange} />
- - -
+ )} {/* Main Content - 70% */} -
-
+
+
-
+
{selectedRun ? ( selectedRun.startsWith("schedule:") ? ( ) : ( - + )}
diff --git a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyAgentRuns.tsx b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyAgentRuns.tsx index 7b7a6c0bb0..578a95b7f7 100644 --- a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyAgentRuns.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyAgentRuns.tsx @@ -1,70 +1,106 @@ import { LibraryAgent } from "@/app/api/__generated__/models/libraryAgent"; import { Button } from "@/components/atoms/Button/Button"; +import { Link } from "@/components/atoms/Link/Link"; import { Text } from "@/components/atoms/Text/Text"; import { ShowMoreText } from "@/components/molecules/ShowMoreText/ShowMoreText"; -import { PlusIcon } from "@phosphor-icons/react"; +import { formatDate } from "@/lib/utils/time"; import { RunAgentModal } from "../modals/RunAgentModal/RunAgentModal"; import { RunDetailCard } from "../selected-views/RunDetailCard/RunDetailCard"; +import { EmptyRunsIllustration } from "./EmptyRunsIllustration"; type Props = { - agentName: string; - creatorName: string; - description: string; agent: LibraryAgent; }; -export function EmptyAgentRuns({ - agentName, - creatorName, - description, - agent, -}: Props) { - const isUnknownCreator = creatorName === "Unknown"; +export function EmptyAgentRuns({ agent }: Props) { + const isPublished = Boolean(agent.marketplace_listing); + const createdAt = formatDate(agent.created_at); + const updatedAt = formatDate(agent.updated_at); + const isUpdated = updatedAt !== createdAt; return ( -
- -
-
-
- - {agentName} - - {!isUnknownCreator ? ( - by {creatorName} - ) : null} +
+ +
+ +
+
+
+ + Ready to get started? + + + Run your agent and this space will fill with your agent's + activity + +
- {description ? ( - - {description} - - ) : null} + + Setup your task + + } + agent={agent} + agentId={agent.id.toString()} + />
- -
- You don’t have any runs - - Get started with creating a run, and you’ll see information here - -
- - New Run - - } - agent={agent} - agentId={agent.id.toString()} - />
+ {isPublished ? ( +
+ + About this agent + +
+ {agent.name} + + by{" "} + + {agent.marketplace_listing?.creator.name} + + +
+ + {agent.description || + `Note: If you're using Docker Compose watch mode (docker compose watch), it will automatically rebuild on file changes. Since you're using docker compose up -d, manual rebuilds are needed. +You can test the endpoint from your frontend; it should return the marketplace_listing field when an agent has been published, or null if it hasn't.`} + +
+
+
+ + Agent created on + + {createdAt} +
+ {isUpdated ? ( +
+ + Agent updated on + + {updatedAt} +
+ ) : null} +
+
+ + +
+
+
+ ) : null}
); } diff --git a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyRunsIllustration.tsx b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyRunsIllustration.tsx new file mode 100644 index 0000000000..13847884bc --- /dev/null +++ b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/components/other/EmptyRunsIllustration.tsx @@ -0,0 +1,746 @@ +type Props = { + className?: string; +}; + +export function EmptyRunsIllustration({ className }: Props) { + return ( +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/useNewAgentLibraryView.ts b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/useNewAgentLibraryView.ts index 4635321b5d..427ca81706 100644 --- a/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/useNewAgentLibraryView.ts +++ b/autogpt_platform/frontend/src/app/(platform)/library/agents/[id]/components/NewAgentLibraryView/useNewAgentLibraryView.ts @@ -25,6 +25,7 @@ export function useNewAgentLibraryView() { runsCount: 0, schedulesCount: 0, }); + const [sidebarLoading, setSidebarLoading] = useState(true); const hasAnyItems = useMemo( diff --git a/autogpt_platform/frontend/src/app/(platform)/profile/(user)/settings/components/SettingsForm/components/EmailForm/EmailForm.tsx b/autogpt_platform/frontend/src/app/(platform)/profile/(user)/settings/components/SettingsForm/components/EmailForm/EmailForm.tsx index 49859dc21c..1901bf709a 100644 --- a/autogpt_platform/frontend/src/app/(platform)/profile/(user)/settings/components/SettingsForm/components/EmailForm/EmailForm.tsx +++ b/autogpt_platform/frontend/src/app/(platform)/profile/(user)/settings/components/SettingsForm/components/EmailForm/EmailForm.tsx @@ -6,9 +6,9 @@ import { FormField, FormItem, } from "@/components/__legacy__/ui/form"; +import { Button } from "@/components/atoms/Button/Button"; import { Input } from "@/components/atoms/Input/Input"; import { Text } from "@/components/atoms/Text/Text"; -import { Button } from "@/components/atoms/Button/Button"; import { User } from "@supabase/supabase-js"; import { useEmailForm } from "./useEmailForm"; @@ -30,7 +30,7 @@ export function EmailForm({ user }: EmailFormProps) {
@@ -58,6 +59,7 @@ export function EmailForm({ user }: EmailFormProps) { as="NextLink" href="/reset-password" className="min-w-[10rem]" + size="small" > Reset password @@ -66,6 +68,7 @@ export function EmailForm({ user }: EmailFormProps) { disabled={hasError || isSameEmail} loading={isLoading} className="min-w-[10rem]" + size="small" > {isLoading ? "Saving..." : "Update email"} diff --git a/autogpt_platform/frontend/src/app/api/openapi.json b/autogpt_platform/frontend/src/app/api/openapi.json index 5b4ebaa547..aa37cee8b5 100644 --- a/autogpt_platform/frontend/src/app/api/openapi.json +++ b/autogpt_platform/frontend/src/app/api/openapi.json @@ -6803,6 +6803,11 @@ "title": "Creator Image Url" }, "status": { "$ref": "#/components/schemas/LibraryAgentStatus" }, + "created_at": { + "type": "string", + "format": "date-time", + "title": "Created At" + }, "updated_at": { "type": "string", "format": "date-time", @@ -6856,6 +6861,12 @@ "recommended_schedule_cron": { "anyOf": [{ "type": "string" }, { "type": "null" }], "title": "Recommended Schedule Cron" + }, + "marketplace_listing": { + "anyOf": [ + { "$ref": "#/components/schemas/MarketplaceListing" }, + { "type": "null" } + ] } }, "type": "object", @@ -6867,6 +6878,7 @@ "creator_name", "creator_image_url", "status", + "created_at", "updated_at", "name", "description", @@ -7147,6 +7159,31 @@ "required": ["login_url", "state_token"], "title": "LoginResponse" }, + "MarketplaceListing": { + "properties": { + "id": { "type": "string", "title": "Id" }, + "name": { "type": "string", "title": "Name" }, + "slug": { "type": "string", "title": "Slug" }, + "creator": { + "$ref": "#/components/schemas/MarketplaceListingCreator" + } + }, + "type": "object", + "required": ["id", "name", "slug", "creator"], + "title": "MarketplaceListing", + "description": "Marketplace listing information for a library agent." + }, + "MarketplaceListingCreator": { + "properties": { + "name": { "type": "string", "title": "Name" }, + "id": { "type": "string", "title": "Id" }, + "slug": { "type": "string", "title": "Slug" } + }, + "type": "object", + "required": ["name", "id", "slug"], + "title": "MarketplaceListingCreator", + "description": "Creator information for a marketplace listing." + }, "Message": { "properties": { "query": { "type": "string", "title": "Query" }, diff --git a/autogpt_platform/frontend/src/app/globals.css b/autogpt_platform/frontend/src/app/globals.css index 3793aecffd..f969c9db79 100644 --- a/autogpt_platform/frontend/src/app/globals.css +++ b/autogpt_platform/frontend/src/app/globals.css @@ -62,7 +62,7 @@ @apply border-border; } body { - @apply bg-background font-sans text-foreground antialiased transition-colors; + @apply bg-[#F6F7F8] font-sans text-foreground antialiased transition-colors; } } diff --git a/autogpt_platform/frontend/src/components/atoms/Button/helpers.ts b/autogpt_platform/frontend/src/components/atoms/Button/helpers.ts index 885f0012d7..57a8660486 100644 --- a/autogpt_platform/frontend/src/components/atoms/Button/helpers.ts +++ b/autogpt_platform/frontend/src/components/atoms/Button/helpers.ts @@ -16,7 +16,7 @@ export const extendedButtonVariants = cva( primary: "bg-zinc-800 border-zinc-800 text-white hover:bg-zinc-900 hover:border-zinc-900 rounded-full disabled:text-white disabled:bg-zinc-200 disabled:border-zinc-200 disabled:opacity-1", secondary: - "bg-zinc-100 border-zinc-100 text-black hover:bg-zinc-300 hover:border-zinc-300 rounded-full disabled:text-zinc-300 disabled:bg-zinc-50 disabled:border-zinc-50 disabled:opacity-1", + "bg-zinc-200 border-zinc-200 text-black hover:bg-zinc-400 hover:border-zinc-400 rounded-full disabled:text-zinc-300 disabled:bg-zinc-50 disabled:border-zinc-50 disabled:opacity-1", destructive: "bg-red-500 border-red-500 text-white hover:bg-red-600 hover:border-red-600 rounded-full disabled:text-white disabled:bg-zinc-200 disabled:border-zinc-200 disabled:opacity-1", outline: diff --git a/autogpt_platform/frontend/src/components/contextual/GoogleDrivePicker/GoogleDrivePickerInput.tsx b/autogpt_platform/frontend/src/components/contextual/GoogleDrivePicker/GoogleDrivePickerInput.tsx index 506b5b87b8..a1accbada5 100644 --- a/autogpt_platform/frontend/src/components/contextual/GoogleDrivePicker/GoogleDrivePickerInput.tsx +++ b/autogpt_platform/frontend/src/components/contextual/GoogleDrivePicker/GoogleDrivePickerInput.tsx @@ -1,9 +1,9 @@ import { Button } from "@/components/atoms/Button/Button"; +import type { GoogleDrivePickerConfig } from "@/lib/autogpt-server-api/types"; import { cn } from "@/lib/utils"; import { Cross2Icon } from "@radix-ui/react-icons"; import React, { useCallback } from "react"; import { GoogleDrivePicker } from "./GoogleDrivePicker"; -import type { GoogleDrivePickerConfig } from "@/lib/autogpt-server-api/types"; export interface GoogleDrivePickerInputProps { config: GoogleDrivePickerConfig; @@ -101,6 +101,7 @@ export function GoogleDrivePickerInput({ >
{file.iconUrl && ( + // eslint-disable-next-line @next/next/no-img-element {/* Header with avatar and user info */} @@ -102,7 +102,7 @@ export function AccountMenu({ href={item.href} className="inline-flex w-full items-center justify-start gap-2.5" > -
+
{getAccountMenuOptionIcon(item.icon)}
@@ -118,7 +118,7 @@ export function AccountMenu({ key={itemIndex} trigger={
-
+
{getAccountMenuOptionIcon(item.icon)}
@@ -137,7 +137,7 @@ export function AccountMenu({ role="button" tabIndex={0} > -
+
{getAccountMenuOptionIcon(item.icon)}
diff --git a/autogpt_platform/frontend/src/components/layout/Navbar/components/AccountMenu/components/AccountLogoutOption.tsx b/autogpt_platform/frontend/src/components/layout/Navbar/components/AccountMenu/components/AccountLogoutOption.tsx index 71bc67613e..b0061ec2c9 100644 --- a/autogpt_platform/frontend/src/components/layout/Navbar/components/AccountMenu/components/AccountLogoutOption.tsx +++ b/autogpt_platform/frontend/src/components/layout/Navbar/components/AccountMenu/components/AccountLogoutOption.tsx @@ -48,8 +48,8 @@ export function AccountLogoutOption() { ) : ( <> -
- +
+
Log out diff --git a/autogpt_platform/frontend/src/components/layout/Navbar/components/LoginButton.tsx b/autogpt_platform/frontend/src/components/layout/Navbar/components/LoginButton.tsx index 774b51d445..f430d721b2 100644 --- a/autogpt_platform/frontend/src/components/layout/Navbar/components/LoginButton.tsx +++ b/autogpt_platform/frontend/src/components/layout/Navbar/components/LoginButton.tsx @@ -19,7 +19,7 @@ export function LoginButton() { );