diff --git a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/6-congrats/page.tsx b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/6-congrats/page.tsx
index 6a383460c9..6fcc40a53f 100644
--- a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/6-congrats/page.tsx
+++ b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/6-congrats/page.tsx
@@ -1,13 +1,15 @@
"use client";
-import { useEffect, useRef, useState } from "react";
+import { useBackendAPI } from "@/lib/autogpt-server-api/context";
import { cn } from "@/lib/utils";
import { useRouter } from "next/navigation";
-import { useOnboarding } from "../../../../providers/onboarding/onboarding-provider";
import * as party from "party-js";
+import { useEffect, useRef, useState } from "react";
+import { useOnboarding } from "../../../../providers/onboarding/onboarding-provider";
export default function Page() {
const { completeStep } = useOnboarding(7, "AGENT_INPUT");
const router = useRouter();
+ const api = useBackendAPI();
const [showText, setShowText] = useState(false);
const [showSubtext, setShowSubtext] = useState(false);
const divRef = useRef(null);
@@ -31,10 +33,28 @@ export default function Page() {
setShowSubtext(true);
}, 500);
- const timer2 = setTimeout(() => {
- // Mark CONGRATS as complete - /onboarding page will handle adding agent to library and redirect
+ const timer2 = setTimeout(async () => {
completeStep("CONGRATS");
- router.push("/onboarding");
+
+ try {
+ const onboarding = await api.getUserOnboarding();
+ if (onboarding?.selectedStoreListingVersionId) {
+ try {
+ const libraryAgent = await api.addMarketplaceAgentToLibrary(
+ onboarding.selectedStoreListingVersionId,
+ );
+ router.replace(`/library/agents/${libraryAgent.id}`);
+ } catch (error) {
+ console.error("Failed to add agent to library:", error);
+ router.replace("/library");
+ }
+ } else {
+ router.replace("/library");
+ }
+ } catch (error) {
+ console.error("Failed to get onboarding data:", error);
+ router.replace("/library");
+ }
}, 3000);
return () => {
@@ -42,7 +62,7 @@ export default function Page() {
clearTimeout(timer1);
clearTimeout(timer2);
};
- }, [completeStep, router]);
+ }, [completeStep, router, api]);
return (
diff --git a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/page.tsx b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/page.tsx
index c7a726f55f..f404c62d75 100644
--- a/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/page.tsx
+++ b/autogpt_platform/frontend/src/app/(no-navbar)/onboarding/page.tsx
@@ -26,24 +26,6 @@ export default function OnboardingPage() {
return;
}
- // Handle CONGRATS - add agent to library and redirect
- if (onboarding.completedSteps.includes("CONGRATS")) {
- if (onboarding.selectedStoreListingVersionId) {
- try {
- const libraryAgent = await api.addMarketplaceAgentToLibrary(
- onboarding.selectedStoreListingVersionId,
- );
- router.replace(`/library/agents/${libraryAgent.id}`);
- } catch (error) {
- console.error("Failed to add agent to library:", error);
- router.replace("/library");
- }
- } else {
- router.replace("/library");
- }
- return;
- }
-
// Redirect to appropriate step based on completed steps
if (onboarding.completedSteps.includes("AGENT_INPUT")) {
router.push("/onboarding/5-run");
diff --git a/autogpt_platform/frontend/src/app/(platform)/login/actions.ts b/autogpt_platform/frontend/src/app/(platform)/login/actions.ts
new file mode 100644
index 0000000000..4d1cbef8a7
--- /dev/null
+++ b/autogpt_platform/frontend/src/app/(platform)/login/actions.ts
@@ -0,0 +1,67 @@
+"use server";
+
+import BackendAPI from "@/lib/autogpt-server-api";
+import { getServerSupabase } from "@/lib/supabase/server/getServerSupabase";
+import { verifyTurnstileToken } from "@/lib/turnstile";
+import { environment } from "@/services/environment";
+import { loginFormSchema } from "@/types/auth";
+import * as Sentry from "@sentry/nextjs";
+import { shouldShowOnboarding } from "../../api/helpers";
+
+export async function login(
+ email: string,
+ password: string,
+ turnstileToken?: string,
+) {
+ try {
+ const parsed = loginFormSchema.safeParse({ email, password });
+
+ if (!parsed.success) {
+ return {
+ success: false,
+ error: "Invalid email or password",
+ };
+ }
+
+ const captchaOk = await verifyTurnstileToken(turnstileToken ?? "", "login");
+ if (!captchaOk && !environment.isVercelPreview()) {
+ return {
+ success: false,
+ error: "CAPTCHA verification failed. Please try again.",
+ };
+ }
+
+ const supabase = await getServerSupabase();
+ if (!supabase) {
+ return {
+ success: false,
+ error: "Authentication service unavailable",
+ };
+ }
+
+ const { error } = await supabase.auth.signInWithPassword(parsed.data);
+ if (error) {
+ return {
+ success: false,
+ error: error.message,
+ };
+ }
+
+ const api = new BackendAPI();
+ await api.createUser();
+
+ const onboarding = await shouldShowOnboarding();
+
+ return {
+ success: true,
+ onboarding,
+ next: onboarding ? "/onboarding" : "/",
+ };
+ } catch (err) {
+ Sentry.captureException(err);
+ return {
+ success: false,
+ error: "Failed to login. Please try again.",
+ };
+ }
+}
diff --git a/autogpt_platform/frontend/src/app/(platform)/login/page.tsx b/autogpt_platform/frontend/src/app/(platform)/login/page.tsx
index c15a3b5b02..e0aa59416a 100644
--- a/autogpt_platform/frontend/src/app/(platform)/login/page.tsx
+++ b/autogpt_platform/frontend/src/app/(platform)/login/page.tsx
@@ -20,6 +20,7 @@ export default function LoginPage() {
turnstile,
captchaKey,
isLoading,
+ isGoogleLoading,
isCloudEnv,
isUserLoading,
showNotAllowedModal,
@@ -100,6 +101,7 @@ export default function LoginPage() {