From de413c880aca8cd0ff90590e77c35604f8024157 Mon Sep 17 00:00:00 2001 From: phact Date: Fri, 24 Oct 2025 04:12:14 -0400 Subject: [PATCH] don't ingest onboarding doc for now --- frontend/lib/upload-utils.ts | 81 +++++++++++++++++++ frontend/src/app/chat/page.tsx | 21 ++++- .../components/onboarding-content.tsx | 8 +- .../components/onboarding-step.tsx | 21 ++--- .../components/onboarding-upload.tsx | 18 ++--- 5 files changed, 116 insertions(+), 33 deletions(-) diff --git a/frontend/lib/upload-utils.ts b/frontend/lib/upload-utils.ts index 6a7e7301..d2c255da 100644 --- a/frontend/lib/upload-utils.ts +++ b/frontend/lib/upload-utils.ts @@ -29,6 +29,87 @@ export async function duplicateCheck( return response.json(); } +export async function uploadFileForContext( + file: File +): Promise { + window.dispatchEvent( + new CustomEvent("fileUploadStart", { + detail: { filename: file.name }, + }) + ); + + try { + const formData = new FormData(); + formData.append("file", file); + + const uploadResponse = await fetch("/api/upload_context", { + method: "POST", + body: formData, + }); + + let payload: unknown; + try { + payload = await uploadResponse.json(); + } catch (error) { + throw new Error("Upload failed: unable to parse server response"); + } + + const uploadJson = + typeof payload === "object" && payload !== null ? payload : {}; + + if (!uploadResponse.ok) { + const errorMessage = + (uploadJson as { error?: string }).error || + "Upload failed"; + throw new Error(errorMessage); + } + + const fileId = + (uploadJson as { response_id?: string }).response_id || "uploaded"; + const filePath = + (uploadJson as { filename?: string }).filename || file.name; + + const result: UploadFileResult = { + fileId, + filePath, + run: null, + deletion: null, + unified: false, + raw: uploadJson, + }; + + window.dispatchEvent( + new CustomEvent("fileUploaded", { + detail: { + file, + result: { + file_id: fileId, + file_path: filePath, + run: null, + deletion: null, + unified: false, + }, + }, + }) + ); + + return result; + } catch (error) { + window.dispatchEvent( + new CustomEvent("fileUploadError", { + detail: { + filename: file.name, + error: + error instanceof Error ? error.message : "Upload failed", + }, + }) + ); + throw error; + } finally { + window.dispatchEvent(new CustomEvent("fileUploadComplete")); + } +} + export async function uploadFile( file: File, replace = false diff --git a/frontend/src/app/chat/page.tsx b/frontend/src/app/chat/page.tsx index 09b47072..194aabad 100644 --- a/frontend/src/app/chat/page.tsx +++ b/frontend/src/app/chat/page.tsx @@ -698,9 +698,24 @@ function ChatPage() { }, [endpoint, setPreviousResponseIds, setLoading]); // Check if onboarding is complete by looking at local storage - const isOnboardingComplete = - typeof window !== "undefined" && - localStorage.getItem("onboarding-step") === null; + const [isOnboardingComplete, setIsOnboardingComplete] = useState(() => { + if (typeof window === "undefined") return false; + return localStorage.getItem("onboarding-step") === null; + }); + + // Listen for storage changes to detect when onboarding completes + useEffect(() => { + const checkOnboarding = () => { + if (typeof window !== "undefined") { + setIsOnboardingComplete(localStorage.getItem("onboarding-step") === null); + } + }; + + // Check periodically since storage events don't fire in the same tab + const interval = setInterval(checkOnboarding, 500); + + return () => clearInterval(interval); + }, []); const { data: nudges = [], cancel: cancelNudges } = useGetNudgesQuery( previousResponseIds[endpoint], diff --git a/frontend/src/app/new-onboarding/components/onboarding-content.tsx b/frontend/src/app/new-onboarding/components/onboarding-content.tsx index 728ebb1f..6ca77e60 100644 --- a/frontend/src/app/new-onboarding/components/onboarding-content.tsx +++ b/frontend/src/app/new-onboarding/components/onboarding-content.tsx @@ -26,6 +26,7 @@ export function OnboardingContent({ ); const [isLoadingModels, setIsLoadingModels] = useState(false); const [loadingStatus, setLoadingStatus] = useState([]); + const [hasStartedOnboarding, setHasStartedOnboarding] = useState(false); const { streamingMessage, isLoading, sendMessage } = useChatStreaming({ onComplete: (message, newResponseId) => { @@ -83,10 +84,13 @@ export function OnboardingContent({ text="Let's get started by setting up your model provider." isLoadingModels={isLoadingModels} loadingStatus={loadingStatus} - reserveSpaceForThinking={true} + reserveSpaceForThinking={!hasStartedOnboarding} > { + setHasStartedOnboarding(true); + handleStepComplete(); + }} setIsLoadingModels={setIsLoadingModels} setLoadingStatus={setLoadingStatus} /> diff --git a/frontend/src/app/new-onboarding/components/onboarding-step.tsx b/frontend/src/app/new-onboarding/components/onboarding-step.tsx index 266042c1..1a53369a 100644 --- a/frontend/src/app/new-onboarding/components/onboarding-step.tsx +++ b/frontend/src/app/new-onboarding/components/onboarding-step.tsx @@ -153,10 +153,10 @@ export function OnboardingStep({ )} chatMessage={text} /> - ) : reserveSpaceForThinking && !isCompleted ? ( -
+ ) : ( + <>

@@ -165,19 +165,10 @@ export function OnboardingStep({ )}

-
-
- ) : ( -

- {displayedText} - {!showChildren && !isCompleted && ( - + {reserveSpaceForThinking && ( +

)} -

+ )} {children && ( diff --git a/frontend/src/app/new-onboarding/components/onboarding-upload.tsx b/frontend/src/app/new-onboarding/components/onboarding-upload.tsx index 816bc1bf..dab12e53 100644 --- a/frontend/src/app/new-onboarding/components/onboarding-upload.tsx +++ b/frontend/src/app/new-onboarding/components/onboarding-upload.tsx @@ -1,6 +1,6 @@ import { ChangeEvent, useRef, useState } from "react"; import { Button } from "@/components/ui/button"; -import { duplicateCheck, uploadFile } from "@/lib/upload-utils"; +import { uploadFileForContext } from "@/lib/upload-utils"; import { AnimatePresence, motion } from "motion/react"; import { AnimatedProviderSteps } from "@/app/onboarding/components/animated-provider-steps"; @@ -28,12 +28,11 @@ const OnboardingUpload = ({ onComplete }: OnboardingUploadProps) => { fileInputRef.current?.click(); }; - - const performUpload = async (file: File, replace = false) => { + const performUpload = async (file: File) => { setIsUploading(true); try { - setCurrentStep(1); - await uploadFile(file, replace); + setCurrentStep(0); + await uploadFileForContext(file); console.log("Document uploaded successfully"); } catch (error) { console.error("Upload failed", (error as Error).message); @@ -54,14 +53,7 @@ const OnboardingUpload = ({ onComplete }: OnboardingUploadProps) => { } try { - setCurrentStep(0); - const duplicateInfo = await duplicateCheck(selectedFile); - if (duplicateInfo.exists) { - console.log("Duplicate file detected"); - return; - } - - await performUpload(selectedFile, false); + await performUpload(selectedFile); } catch (error) { console.error("Unable to prepare file for upload", (error as Error).message); } finally {