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 {