From f1a6c316bd2d0d27dccb0a1959ae3aee56145871 Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Tue, 23 Jan 2024 16:10:34 +0100 Subject: [PATCH 1/5] chore: init remove supabase provider --- .../app/api/chat/generate-title/route.ts | 4 +-- apps/browser/app/page.tsx | 8 ++--- .../components/providers/Providers.tsx | 17 ++++----- apps/browser/lib/hooks/useEvoService.ts | 12 +++---- apps/browser/lib/mutations/useAddChatLog.ts | 8 ++--- apps/browser/lib/mutations/useAddMessages.ts | 8 ++--- apps/browser/lib/mutations/useAddVariable.ts | 8 ++--- apps/browser/lib/mutations/useCreateChat.ts | 8 ++--- apps/browser/lib/mutations/useDeleteChat.ts | 10 ++---- .../lib/mutations/useUpdateChatTitle.ts | 8 ++--- apps/browser/lib/queries/useChats.ts | 17 ++++----- .../lib/supabase/SupabaseClientProvider.tsx | 35 ------------------- .../browser/lib/supabase/SupabaseWorkspace.ts | 29 ++++++++------- .../lib/supabase/createBrowserClient.ts | 11 ++++++ .../lib/supabase/createServerClient.ts | 21 +++++++++++ .../lib/supabase/createSupabaseClient.ts | 27 -------------- .../lib/supabase/useSupabaseClient.tsx | 4 --- apps/browser/package.json | 1 + yarn.lock | 13 +++++++ 19 files changed, 99 insertions(+), 150 deletions(-) delete mode 100644 apps/browser/lib/supabase/SupabaseClientProvider.tsx create mode 100644 apps/browser/lib/supabase/createBrowserClient.ts create mode 100644 apps/browser/lib/supabase/createServerClient.ts delete mode 100644 apps/browser/lib/supabase/createSupabaseClient.ts delete mode 100644 apps/browser/lib/supabase/useSupabaseClient.tsx diff --git a/apps/browser/app/api/chat/generate-title/route.ts b/apps/browser/app/api/chat/generate-title/route.ts index b74bcd73..62eee2cb 100644 --- a/apps/browser/app/api/chat/generate-title/route.ts +++ b/apps/browser/app/api/chat/generate-title/route.ts @@ -1,6 +1,6 @@ import { getAuthOptions } from "@/lib/api/authOptions"; import { createOpenAIApiClient } from "@/lib/api/utils/openai"; -import { createSupabaseClient } from "@/lib/supabase/createSupabaseClient"; +import { createSupabaseServerClient } from "@/lib/supabase/createServerClient"; import { getServerSession } from "next-auth"; import { NextRequest, NextResponse } from "next/server"; @@ -16,7 +16,7 @@ export async function POST(request: NextRequest) { if (!session || !email) { return NextResponse.json({}, { status: 401 }); } - const supabase = createSupabaseClient(session.supabaseAccessToken as string); + const supabase = createSupabaseServerClient(); const { data, error } = await supabase .from("chats") .select() diff --git a/apps/browser/app/page.tsx b/apps/browser/app/page.tsx index 17a70fa2..05ee1cd8 100644 --- a/apps/browser/app/page.tsx +++ b/apps/browser/app/page.tsx @@ -9,7 +9,6 @@ import { errorAtom, newGoalSubmittedAtom, isChatLoadingAtom, - ChatInfo, welcomeModalAtom, } from "@/lib/store"; import { useChats } from "@/lib/queries/useChats"; @@ -26,10 +25,8 @@ import { useRouter } from "next/navigation"; import { useAtom } from "jotai"; import { v4 as uuid } from "uuid"; import { InMemoryFile } from "@nerfzael/memory-fs"; -import { useSupabaseClient } from "@/lib/supabase/useSupabaseClient"; function Dojo({ params }: { params: { id?: string } }) { - const supabase = useSupabaseClient(); const [evoService, setEvoService] = useAtom(evoServiceAtom); const [newGoalSubmitted, setNewGoalSubmitted] = useAtom(newGoalSubmittedAtom); const [isChatLoading, setIsChatLoading] = useAtom(isChatLoadingAtom); @@ -45,14 +42,13 @@ function Dojo({ params }: { params: { id?: string } }) { const { data: chats, isLoading: isChatsLoading } = useChats(); const router = useRouter(); const { status: sessionStatus, data: sessionData } = useSession(); - const isAuthenticated = sessionStatus === "authenticated" && !!supabase; + const isAuthenticated = sessionStatus === "authenticated"; const { mutateAsync: createChat } = useCreateChat(); const { mutateAsync: updateChatTitle } = useUpdateChatTitle(); const { logs, isConnected, isStarting, isRunning, handleStart, status } = useEvoService( chatId, - isAuthenticated, - supabase + isAuthenticated ); const workspaceUploadUpdate = useWorkspaceUploadUpdate(); diff --git a/apps/browser/components/providers/Providers.tsx b/apps/browser/components/providers/Providers.tsx index 610ef036..587cd1e6 100644 --- a/apps/browser/components/providers/Providers.tsx +++ b/apps/browser/components/providers/Providers.tsx @@ -4,7 +4,6 @@ import { Provider as JotaiProvider } from "jotai"; import ReactQueryProvider from "./ReactQueryProvider"; import { SessionProvider } from "next-auth/react"; import ToastProvider from "./ToastProvider"; -import SupabaseClientProvider from "@/lib/supabase/SupabaseClientProvider"; export function Providers({ children }: { children: React.ReactNode }) { return ( @@ -14,15 +13,13 @@ export function Providers({ children }: { children: React.ReactNode }) { // Don't re-fetch session when window is focused refetchOnWindowFocus={false} > - - - - - {children} - - - - + + + + {children} + + + ); } diff --git a/apps/browser/lib/hooks/useEvoService.ts b/apps/browser/lib/hooks/useEvoService.ts index e99900f3..4502270b 100644 --- a/apps/browser/lib/hooks/useEvoService.ts +++ b/apps/browser/lib/hooks/useEvoService.ts @@ -11,7 +11,7 @@ import { EvoThreadCallbacks, EvoThreadConfig } from "@/lib/services/evo/EvoThrea import { useAddChatLog } from "@/lib/mutations/useAddChatLog"; import { useAddMessages } from "@/lib/mutations/useAddMessages"; import { useAddVariable } from "@/lib/mutations/useAddVariable"; -import { Chat, fetchChats, useChats } from "@/lib/queries/useChats"; +import { Chat, fetchChats } from "@/lib/queries/useChats"; import { SupabaseWorkspace } from "@/lib/supabase/SupabaseWorkspace"; import { useWorkspaceFilesUpdate } from "@/lib/hooks/useWorkspaceFilesUpdate"; import { useWorkspaceUploadUpdate } from "@/lib/hooks/useWorkspaceUploadUpdate"; @@ -20,12 +20,10 @@ import { Workspace, InMemoryWorkspace } from "@evo-ninja/agent-utils"; import { ChatLogType, ChatMessage } from "@evo-ninja/agents"; import { useState, useEffect } from "react"; import { useAtom } from "jotai"; -import { EvoSupabaseClient } from "../supabase/EvoSupabaseClient"; export const useEvoService = ( chatId: string | "" | undefined, - isAuthenticated: boolean, - supabase: EvoSupabaseClient | undefined + isAuthenticated: boolean ): { logs: ChatLog[]; isConnected: boolean; @@ -125,7 +123,7 @@ export const useEvoService = ( }; } - const { data: chats, error } = await fetchChats(supabase!); + const { data: chats, error } = await fetchChats(); if (error) { console.error(error); @@ -142,10 +140,8 @@ export const useEvoService = ( }; async function loadWorkspace(chatId: string): Promise { - // isAuthenticated is only true if there's a supabase instance - // so we can safely assume that it's not undefined const workspace = isAuthenticated ? - new SupabaseWorkspace(chatId, supabase!.storage) : + new SupabaseWorkspace(chatId) : new InMemoryWorkspace(); await workspaceUploadUpdate(workspace); diff --git a/apps/browser/lib/mutations/useAddChatLog.ts b/apps/browser/lib/mutations/useAddChatLog.ts index 715737de..b13f8fb8 100644 --- a/apps/browser/lib/mutations/useAddChatLog.ts +++ b/apps/browser/lib/mutations/useAddChatLog.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { ChatLog } from "@/components/Chat" import { Row } from "../supabase/types" -import { useSupabaseClient } from "../supabase/useSupabaseClient" +import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" const mapChatLogToLogDTO = ( chatId: string, @@ -17,17 +17,13 @@ const mapChatLogToLogDTO = ( export const useAddChatLog = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); return useMutation({ mutationFn: async (args: { chatId: string; log: ChatLog; }) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { error } = await supabase .from("logs") .insert( diff --git a/apps/browser/lib/mutations/useAddMessages.ts b/apps/browser/lib/mutations/useAddMessages.ts index 344f1c38..a685de7d 100644 --- a/apps/browser/lib/mutations/useAddMessages.ts +++ b/apps/browser/lib/mutations/useAddMessages.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { ChatLogType, ChatMessage } from "@evo-ninja/agents" import { Row } from "../supabase/types" -import { useSupabaseClient } from "../supabase/useSupabaseClient" +import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" const mapChatMessageToMessageDTO = ( chatId: string, @@ -64,7 +64,6 @@ const mapChatMessageToMessageDTO = ( export const useAddMessages = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); return useMutation({ mutationFn: async (args: { @@ -72,10 +71,7 @@ export const useAddMessages = () => { messages: ChatMessage[]; type: ChatLogType; }) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { error } = await supabase .from("messages") .insert( diff --git a/apps/browser/lib/mutations/useAddVariable.ts b/apps/browser/lib/mutations/useAddVariable.ts index cce4be64..dbfc402a 100644 --- a/apps/browser/lib/mutations/useAddVariable.ts +++ b/apps/browser/lib/mutations/useAddVariable.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { Row } from "../supabase/types" -import { useSupabaseClient } from "../supabase/useSupabaseClient" +import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" const mapVariableToVariableDTO = ( chatId: string, @@ -16,7 +16,6 @@ const mapVariableToVariableDTO = ( export const useAddVariable = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); return useMutation({ mutationFn: async (args: { @@ -24,10 +23,7 @@ export const useAddVariable = () => { key: string; value: string; }) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { error } = await supabase .from("variables") .insert( diff --git a/apps/browser/lib/mutations/useCreateChat.ts b/apps/browser/lib/mutations/useCreateChat.ts index 72c6e4f0..42a65060 100644 --- a/apps/browser/lib/mutations/useCreateChat.ts +++ b/apps/browser/lib/mutations/useCreateChat.ts @@ -1,17 +1,13 @@ import { Chat } from "@/lib/queries/useChats" +import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; import { useMutation, useQueryClient } from "@tanstack/react-query" -import { useSupabaseClient } from "../supabase/useSupabaseClient"; export const useCreateChat = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); return useMutation({ mutationFn: async (chatId: string) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { data, error } = await supabase .from("chats") .insert({ diff --git a/apps/browser/lib/mutations/useDeleteChat.ts b/apps/browser/lib/mutations/useDeleteChat.ts index 2068231c..491a8805 100644 --- a/apps/browser/lib/mutations/useDeleteChat.ts +++ b/apps/browser/lib/mutations/useDeleteChat.ts @@ -1,16 +1,12 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" -import { useSupabaseClient } from "../supabase/useSupabaseClient"; +import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; export const useDeleteChat = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); - + return useMutation({ mutationFn: async (chatId: string) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { error } = await supabase .from("chats") .delete() diff --git a/apps/browser/lib/mutations/useUpdateChatTitle.ts b/apps/browser/lib/mutations/useUpdateChatTitle.ts index a0459985..65d4c197 100644 --- a/apps/browser/lib/mutations/useUpdateChatTitle.ts +++ b/apps/browser/lib/mutations/useUpdateChatTitle.ts @@ -1,16 +1,12 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { useSupabaseClient } from "../supabase/useSupabaseClient"; +import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; export const useUpdateChatTitle = () => { const queryClient = useQueryClient(); - const supabase = useSupabaseClient(); return useMutation({ mutationFn: async (args: { chatId: string; title: string }) => { - if (!supabase) { - throw new Error("Not authenticated"); - } - + const supabase = createSupabaseBrowserClient(); const { error } = await supabase .from("chats") .update({ title: args.title }) diff --git a/apps/browser/lib/queries/useChats.ts b/apps/browser/lib/queries/useChats.ts index 2b4494f5..8c4b3557 100644 --- a/apps/browser/lib/queries/useChats.ts +++ b/apps/browser/lib/queries/useChats.ts @@ -1,9 +1,10 @@ import { useQuery } from "@tanstack/react-query" import { useSession } from "next-auth/react" import { ChatMessage } from "@evo-ninja/agents" +import { PostgrestError } from "@supabase/supabase-js" import { ChatLog } from "@/components/Chat" import { Json } from "../supabase/dbTypes" -import { useSupabaseClient } from "../supabase/useSupabaseClient" +import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" export interface Chat { id: string; @@ -125,10 +126,11 @@ const mapChatDTOtoChat = (dto: ChatDTO): Chat => { } } -export const fetchChats = async (supabase: any): Promise<{ +export const fetchChats = async (): Promise<{ data: Chat[] | undefined, - error: Error | undefined + error: PostgrestError | undefined }> => { + const supabase = createSupabaseBrowserClient(); const { data, error } = await supabase .from('chats') .select(` @@ -168,18 +170,17 @@ export const fetchChats = async (supabase: any): Promise<{ export const useChats = () => { const { data: session } = useSession(); - const supabase = useSupabaseClient(); return useQuery({ - queryKey: ['chats', session?.user?.email, supabase], - enabled: !!session?.user?.email && !!supabase, + queryKey: ['chats', session?.user?.email], + enabled: !!session?.user?.email, refetchOnMount: false, queryFn: async () => { - if (!session?.user?.email || !supabase) { + if (!session?.user?.email) { throw new Error("Not authenticated") } - const { data, error } = await fetchChats(supabase); + const { data, error } = await fetchChats(); if (error) { console.error(error) diff --git a/apps/browser/lib/supabase/SupabaseClientProvider.tsx b/apps/browser/lib/supabase/SupabaseClientProvider.tsx deleted file mode 100644 index 5a3536cb..00000000 --- a/apps/browser/lib/supabase/SupabaseClientProvider.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { EvoSupabaseClient } from "./EvoSupabaseClient"; -import { createSupabaseClient } from "./createSupabaseClient"; - -import { useSession } from "next-auth/react"; -import { createContext, useEffect, useRef, useState } from "react"; -import React from "react"; - -export const SupabaseClientContext = createContext(undefined); - -const SupabaseClientProvider = ({ children }: { children: React.ReactNode}) => { - const { data: session } = useSession(); - const [supabaseClient, setSupabaseClient] = useState(undefined); - const [lastAccessToken, setLastAccessToken] = useState(undefined); - - useEffect(() => { - if (!session?.supabaseAccessToken) { - setSupabaseClient(undefined); - setLastAccessToken(undefined) - return; - } - - if (lastAccessToken === session.supabaseAccessToken) { - return; - } - setSupabaseClient(createSupabaseClient(session.supabaseAccessToken)); - setLastAccessToken(session.supabaseAccessToken); - }, [session?.supabaseAccessToken]); - - return ( - - {children} - - ); -}; -export default SupabaseClientProvider diff --git a/apps/browser/lib/supabase/SupabaseWorkspace.ts b/apps/browser/lib/supabase/SupabaseWorkspace.ts index 3d9620bf..ebc083d1 100644 --- a/apps/browser/lib/supabase/SupabaseWorkspace.ts +++ b/apps/browser/lib/supabase/SupabaseWorkspace.ts @@ -1,19 +1,22 @@ +import { createSupabaseBrowserClient } from "./createBrowserClient"; import { DirectoryEntry, Workspace } from "@evo-ninja/agent-utils"; -import { StorageClient } from "@supabase/storage-js"; import * as path from "path-browserify"; const BUCKET_NAME = "workspaces"; export class SupabaseWorkspace implements Workspace { constructor( - public readonly chatId: string, - private readonly supabaseStorage: StorageClient + public readonly chatId: string ) {} + private get supabase() { + return createSupabaseBrowserClient(); + } + async writeFile(subpath: string, data: string): Promise { const path = this.toWorkspacePath(subpath); - const { error } = await this.supabaseStorage + const { error } = await this.supabase.storage .from(BUCKET_NAME) .upload(path, data, { upsert: true }); @@ -27,7 +30,7 @@ export class SupabaseWorkspace implements Workspace { async readFile(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabaseStorage + const { data, error } = await this.supabase.storage .from(BUCKET_NAME) .download(path); @@ -45,7 +48,7 @@ export class SupabaseWorkspace implements Workspace { async exists(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabaseStorage + const { data, error } = await this.supabase.storage .from(BUCKET_NAME) .download(path); @@ -60,7 +63,7 @@ export class SupabaseWorkspace implements Workspace { const absOldPath = this.toWorkspacePath(oldPath); const absNewPath = this.toWorkspacePath(newPath); - const { error } = await this.supabaseStorage + const { error } = await this.supabase.storage .from(BUCKET_NAME) .move(absOldPath, absNewPath); @@ -78,7 +81,7 @@ export class SupabaseWorkspace implements Workspace { const path = this.toWorkspacePath(subpath); - const { data: list, error: listError } = await this.supabaseStorage + const { data: list, error: listError } = await this.supabase.storage .from(BUCKET_NAME) .list(path); @@ -91,7 +94,7 @@ export class SupabaseWorkspace implements Workspace { return; } - const { error: removeError } = await this.supabaseStorage + const { error: removeError } = await this.supabase.storage .from(BUCKET_NAME) .remove(filesToRemove); @@ -103,7 +106,7 @@ export class SupabaseWorkspace implements Workspace { async readdir(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabaseStorage + const { data, error } = await this.supabase.storage .from(BUCKET_NAME) .list(path); @@ -126,7 +129,7 @@ export class SupabaseWorkspace implements Workspace { async appendFile(subpath: string, data: string): Promise { const path = this.toWorkspacePath(subpath); - const { data: existingData, error: readError } = await this.supabaseStorage + const { data: existingData, error: readError } = await this.supabase.storage .from(BUCKET_NAME) .download(path); @@ -136,7 +139,7 @@ export class SupabaseWorkspace implements Workspace { const newData = existingData ? existingData.text() + data : data; - const { error: writeError } = await this.supabaseStorage + const { error: writeError } = await this.supabase.storage .from(BUCKET_NAME) .upload(path, newData, { upsert: true }); @@ -148,7 +151,7 @@ export class SupabaseWorkspace implements Workspace { async rm(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { error } = await this.supabaseStorage + const { error } = await this.supabase.storage .from(BUCKET_NAME) .remove([path]); diff --git a/apps/browser/lib/supabase/createBrowserClient.ts b/apps/browser/lib/supabase/createBrowserClient.ts new file mode 100644 index 00000000..df97a5ad --- /dev/null +++ b/apps/browser/lib/supabase/createBrowserClient.ts @@ -0,0 +1,11 @@ +import { Database } from "./dbTypes"; +import { createBrowserClient } from "@supabase/ssr"; + +export const createSupabaseBrowserClient = () => { + const client = createBrowserClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + ); + + return client; +}; diff --git a/apps/browser/lib/supabase/createServerClient.ts b/apps/browser/lib/supabase/createServerClient.ts new file mode 100644 index 00000000..9a94048e --- /dev/null +++ b/apps/browser/lib/supabase/createServerClient.ts @@ -0,0 +1,21 @@ +import { Database } from "./dbTypes"; +import { createServerClient } from "@supabase/ssr"; +import { cookies } from "next/headers"; + +export const createSupabaseServerClient = () => { + const cookieStore = cookies() + + const client = createServerClient( + process.env.NEXT_PUBLIC_SUPABASE_URL!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + { + cookies: { + get(name: string) { + return cookieStore.get(name)?.value + }, + }, + } + ); + + return client; +}; diff --git a/apps/browser/lib/supabase/createSupabaseClient.ts b/apps/browser/lib/supabase/createSupabaseClient.ts deleted file mode 100644 index 2d340f9e..00000000 --- a/apps/browser/lib/supabase/createSupabaseClient.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createClient } from "@supabase/supabase-js"; -import { Database } from "./dbTypes"; -import { EvoSupabaseClient } from "./EvoSupabaseClient"; - -export const createSupabaseClient = (supabaseAccessToken: string): EvoSupabaseClient => { - if (!process.env.NEXT_PUBLIC_SUPABASE_URL) { - throw Error("Env missing NEXT_PUBLIC_SUPABASE_URL"); - } - - if (!process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY) { - throw Error("Env missing NEXT_PUBLIC_SUPABASE_ANON_KEY"); - } - - const client = createClient( - process.env.NEXT_PUBLIC_SUPABASE_URL, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, - { - global: { - headers: { - Authorization: `Bearer ${supabaseAccessToken}`, - }, - }, - } - ); - - return client; -}; diff --git a/apps/browser/lib/supabase/useSupabaseClient.tsx b/apps/browser/lib/supabase/useSupabaseClient.tsx deleted file mode 100644 index b48046a6..00000000 --- a/apps/browser/lib/supabase/useSupabaseClient.tsx +++ /dev/null @@ -1,4 +0,0 @@ -import React from "react"; -import { SupabaseClientContext } from "./SupabaseClientProvider"; - -export const useSupabaseClient = () => React.useContext(SupabaseClientContext); diff --git a/apps/browser/package.json b/apps/browser/package.json index c364c1f0..1d0d5279 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -29,6 +29,7 @@ "@react-spring/web": "^9.7.3", "@supabase/supabase-js": "2.38.5", "@supabase/storage-js": "~2.5.5", + "@supabase/ssr": "0.0.10", "@tanstack/react-query": "^5.12.2", "buffer": "6.0.3", "clsx": "^2.0.0", diff --git a/yarn.lock b/yarn.lock index 8943c80e..ec1aee8e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1828,6 +1828,14 @@ "@types/websocket" "^1.0.3" ws "^8.14.2" +"@supabase/ssr@0.0.10": + version "0.0.10" + resolved "https://registry.yarnpkg.com/@supabase/ssr/-/ssr-0.0.10.tgz#b2595c7dab6cc37f51d1529118fab2df4510b3bf" + integrity sha512-eVs7+bNlff8Fd79x8K3Jbfpmf8P8QRA1Z6rUDN+fi4ReWvRBZyWOFfR6eqlsX6vTjvGgTiEqujFSkv2PYW5kbQ== + dependencies: + cookie "^0.5.0" + ramda "^0.29.0" + "@supabase/storage-js@^2.5.4", "@supabase/storage-js@~2.5.5": version "2.5.5" resolved "https://registry.yarnpkg.com/@supabase/storage-js/-/storage-js-2.5.5.tgz#2958e2a2cec8440e605bb53bd36649288c4dfa01" @@ -6990,6 +6998,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +ramda@^0.29.0: + version "0.29.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.29.1.tgz#408a6165b9555b7ba2fc62555804b6c5a2eca196" + integrity sha512-OfxIeWzd4xdUNxlWhgFazxsA/nl3mS4/jGZI5n00uWOoSSFRhC1b6gl6xvmzUamgmqELraWp0J/qqVlXYPDPyA== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" From 26fdeb1494efc89adb85bc9de7a4533ebd5b431c Mon Sep 17 00:00:00 2001 From: dOrgJelli Date: Tue, 23 Jan 2024 16:18:03 +0100 Subject: [PATCH 2/5] chore: add back supbase token --- apps/browser/lib/supabase/createBrowserClient.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/browser/lib/supabase/createBrowserClient.ts b/apps/browser/lib/supabase/createBrowserClient.ts index df97a5ad..de4bfee0 100644 --- a/apps/browser/lib/supabase/createBrowserClient.ts +++ b/apps/browser/lib/supabase/createBrowserClient.ts @@ -1,10 +1,17 @@ import { Database } from "./dbTypes"; import { createBrowserClient } from "@supabase/ssr"; -export const createSupabaseBrowserClient = () => { +export const createSupabaseBrowserClient = (supabaseAccessToken: string) => { const client = createBrowserClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, - process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, + process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { + global: { + headers: { + Authorization: `Bearer ${supabaseAccessToken}`, + }, + }, + cookies: {} + } ); return client; From d494e1c3d9df09a048a9bd4877d2d9e95fcb7d36 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 23 Jan 2024 16:47:59 +0100 Subject: [PATCH 3/5] chore: use `@supabase/ssr` client in all components --- .../app/api/chat/generate-title/route.ts | 6 ++- apps/browser/lib/hooks/useEvoService.ts | 17 +++++++-- apps/browser/lib/mutations/useAddChatLog.ts | 6 ++- apps/browser/lib/mutations/useAddMessages.ts | 6 ++- apps/browser/lib/mutations/useAddVariable.ts | 7 +++- apps/browser/lib/mutations/useCreateChat.ts | 4 +- apps/browser/lib/mutations/useDeleteChat.ts | 4 +- .../lib/mutations/useUpdateChatTitle.ts | 4 +- apps/browser/lib/queries/useChats.ts | 6 +-- .../browser/lib/supabase/SupabaseWorkspace.ts | 9 ++--- .../lib/supabase/createServerClient.ts | 38 +++++++++++++++---- 11 files changed, 77 insertions(+), 30 deletions(-) diff --git a/apps/browser/app/api/chat/generate-title/route.ts b/apps/browser/app/api/chat/generate-title/route.ts index 62eee2cb..c787b8ff 100644 --- a/apps/browser/app/api/chat/generate-title/route.ts +++ b/apps/browser/app/api/chat/generate-title/route.ts @@ -1,7 +1,8 @@ import { getAuthOptions } from "@/lib/api/authOptions"; import { createOpenAIApiClient } from "@/lib/api/utils/openai"; -import { createSupabaseServerClient } from "@/lib/supabase/createServerClient"; +import { createClient } from "@/lib/supabase/createServerClient"; import { getServerSession } from "next-auth"; +import { cookies } from "next/headers"; import { NextRequest, NextResponse } from "next/server"; export async function POST(request: NextRequest) { @@ -11,12 +12,13 @@ export async function POST(request: NextRequest) { } // Make sure user is authenticated + const cookieStore = cookies() const session = await getServerSession(getAuthOptions()); const email = session?.user?.email; if (!session || !email) { return NextResponse.json({}, { status: 401 }); } - const supabase = createSupabaseServerClient(); + const supabase = createClient(cookieStore, session.supabaseAccessToken as string); const { data, error } = await supabase .from("chats") .select() diff --git a/apps/browser/lib/hooks/useEvoService.ts b/apps/browser/lib/hooks/useEvoService.ts index 4502270b..ad17894f 100644 --- a/apps/browser/lib/hooks/useEvoService.ts +++ b/apps/browser/lib/hooks/useEvoService.ts @@ -20,6 +20,8 @@ import { Workspace, InMemoryWorkspace } from "@evo-ninja/agent-utils"; import { ChatLogType, ChatMessage } from "@evo-ninja/agents"; import { useState, useEffect } from "react"; import { useAtom } from "jotai"; +import { useSession } from "next-auth/react"; +import { createSupabaseBrowserClient } from "../supabase/createBrowserClient"; export const useEvoService = ( chatId: string | "" | undefined, @@ -40,6 +42,7 @@ export const useEvoService = ( const [, setCapReached] = useAtom(capReachedAtom); const [, setSettingsModalOpen] = useAtom(settingsModalAtom); const [, setError] = useAtom(errorAtom); + const { data: session } = useSession() // State const [isConnected, setIsConnected] = useState(false); @@ -123,7 +126,7 @@ export const useEvoService = ( }; } - const { data: chats, error } = await fetchChats(); + const { data: chats, error } = await fetchChats(session?.supabaseAccessToken as string); if (error) { console.error(error); @@ -140,9 +143,15 @@ export const useEvoService = ( }; async function loadWorkspace(chatId: string): Promise { - const workspace = isAuthenticated ? - new SupabaseWorkspace(chatId) : - new InMemoryWorkspace(); + const workspace = (() => { + if (session?.supabaseAccessToken) { + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken) + return new SupabaseWorkspace(chatId, supabase) + } else { + return new InMemoryWorkspace() + } + })() + await workspaceUploadUpdate(workspace); diff --git a/apps/browser/lib/mutations/useAddChatLog.ts b/apps/browser/lib/mutations/useAddChatLog.ts index b13f8fb8..58a340b4 100644 --- a/apps/browser/lib/mutations/useAddChatLog.ts +++ b/apps/browser/lib/mutations/useAddChatLog.ts @@ -2,6 +2,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { ChatLog } from "@/components/Chat" import { Row } from "../supabase/types" import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" +import { useSession } from "next-auth/react" const mapChatLogToLogDTO = ( chatId: string, @@ -17,13 +18,16 @@ const mapChatLogToLogDTO = ( export const useAddChatLog = () => { const queryClient = useQueryClient(); + const { data: session } = useSession(); return useMutation({ mutationFn: async (args: { chatId: string; log: ChatLog; }) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient( + session?.supabaseAccessToken as string + ); const { error } = await supabase .from("logs") .insert( diff --git a/apps/browser/lib/mutations/useAddMessages.ts b/apps/browser/lib/mutations/useAddMessages.ts index a685de7d..d9685ed9 100644 --- a/apps/browser/lib/mutations/useAddMessages.ts +++ b/apps/browser/lib/mutations/useAddMessages.ts @@ -2,6 +2,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { ChatLogType, ChatMessage } from "@evo-ninja/agents" import { Row } from "../supabase/types" import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" +import { useSession } from "next-auth/react" const mapChatMessageToMessageDTO = ( chatId: string, @@ -64,6 +65,7 @@ const mapChatMessageToMessageDTO = ( export const useAddMessages = () => { const queryClient = useQueryClient(); + const { data: session } = useSession(); return useMutation({ mutationFn: async (args: { @@ -71,7 +73,9 @@ export const useAddMessages = () => { messages: ChatMessage[]; type: ChatLogType; }) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient( + session?.supabaseAccessToken as string + ); const { error } = await supabase .from("messages") .insert( diff --git a/apps/browser/lib/mutations/useAddVariable.ts b/apps/browser/lib/mutations/useAddVariable.ts index dbfc402a..0bd6b1a3 100644 --- a/apps/browser/lib/mutations/useAddVariable.ts +++ b/apps/browser/lib/mutations/useAddVariable.ts @@ -1,6 +1,7 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { Row } from "../supabase/types" import { createSupabaseBrowserClient } from "../supabase/createBrowserClient" +import { useSession } from "next-auth/react" const mapVariableToVariableDTO = ( chatId: string, @@ -16,14 +17,16 @@ const mapVariableToVariableDTO = ( export const useAddVariable = () => { const queryClient = useQueryClient(); - + const { data: session } = useSession(); return useMutation({ mutationFn: async (args: { chatId: string; key: string; value: string; }) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient( + session?.supabaseAccessToken as string + ); const { error } = await supabase .from("variables") .insert( diff --git a/apps/browser/lib/mutations/useCreateChat.ts b/apps/browser/lib/mutations/useCreateChat.ts index 42a65060..9a94b014 100644 --- a/apps/browser/lib/mutations/useCreateChat.ts +++ b/apps/browser/lib/mutations/useCreateChat.ts @@ -1,13 +1,15 @@ import { Chat } from "@/lib/queries/useChats" import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; import { useMutation, useQueryClient } from "@tanstack/react-query" +import { useSession } from "next-auth/react"; export const useCreateChat = () => { const queryClient = useQueryClient(); + const { data : session } = useSession() return useMutation({ mutationFn: async (chatId: string) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); const { data, error } = await supabase .from("chats") .insert({ diff --git a/apps/browser/lib/mutations/useDeleteChat.ts b/apps/browser/lib/mutations/useDeleteChat.ts index 491a8805..f50376c1 100644 --- a/apps/browser/lib/mutations/useDeleteChat.ts +++ b/apps/browser/lib/mutations/useDeleteChat.ts @@ -1,12 +1,14 @@ import { useMutation, useQueryClient } from "@tanstack/react-query" import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; +import { useSession } from "next-auth/react"; export const useDeleteChat = () => { const queryClient = useQueryClient(); + const { data : session } = useSession() return useMutation({ mutationFn: async (chatId: string) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); const { error } = await supabase .from("chats") .delete() diff --git a/apps/browser/lib/mutations/useUpdateChatTitle.ts b/apps/browser/lib/mutations/useUpdateChatTitle.ts index 65d4c197..db1c8f21 100644 --- a/apps/browser/lib/mutations/useUpdateChatTitle.ts +++ b/apps/browser/lib/mutations/useUpdateChatTitle.ts @@ -1,12 +1,14 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; import { createSupabaseBrowserClient } from "@/lib/supabase/createBrowserClient"; +import { useSession } from "next-auth/react"; export const useUpdateChatTitle = () => { const queryClient = useQueryClient(); + const { data : session } = useSession() return useMutation({ mutationFn: async (args: { chatId: string; title: string }) => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); const { error } = await supabase .from("chats") .update({ title: args.title }) diff --git a/apps/browser/lib/queries/useChats.ts b/apps/browser/lib/queries/useChats.ts index 8c4b3557..4943fd71 100644 --- a/apps/browser/lib/queries/useChats.ts +++ b/apps/browser/lib/queries/useChats.ts @@ -126,11 +126,11 @@ const mapChatDTOtoChat = (dto: ChatDTO): Chat => { } } -export const fetchChats = async (): Promise<{ +export const fetchChats = async (supabaseToken: string): Promise<{ data: Chat[] | undefined, error: PostgrestError | undefined }> => { - const supabase = createSupabaseBrowserClient(); + const supabase = createSupabaseBrowserClient(supabaseToken); const { data, error } = await supabase .from('chats') .select(` @@ -180,7 +180,7 @@ export const useChats = () => { throw new Error("Not authenticated") } - const { data, error } = await fetchChats(); + const { data, error } = await fetchChats(session.supabaseAccessToken as string); if (error) { console.error(error) diff --git a/apps/browser/lib/supabase/SupabaseWorkspace.ts b/apps/browser/lib/supabase/SupabaseWorkspace.ts index ebc083d1..3fb770a2 100644 --- a/apps/browser/lib/supabase/SupabaseWorkspace.ts +++ b/apps/browser/lib/supabase/SupabaseWorkspace.ts @@ -1,18 +1,15 @@ -import { createSupabaseBrowserClient } from "./createBrowserClient"; import { DirectoryEntry, Workspace } from "@evo-ninja/agent-utils"; +import { SupabaseClient } from "@supabase/supabase-js"; import * as path from "path-browserify"; const BUCKET_NAME = "workspaces"; export class SupabaseWorkspace implements Workspace { constructor( - public readonly chatId: string + public readonly chatId: string, + public readonly supabase: SupabaseClient ) {} - private get supabase() { - return createSupabaseBrowserClient(); - } - async writeFile(subpath: string, data: string): Promise { const path = this.toWorkspacePath(subpath); diff --git a/apps/browser/lib/supabase/createServerClient.ts b/apps/browser/lib/supabase/createServerClient.ts index 9a94048e..a3a2f2f7 100644 --- a/apps/browser/lib/supabase/createServerClient.ts +++ b/apps/browser/lib/supabase/createServerClient.ts @@ -1,21 +1,43 @@ import { Database } from "./dbTypes"; -import { createServerClient } from "@supabase/ssr"; +import { createServerClient, type CookieOptions } from "@supabase/ssr"; import { cookies } from "next/headers"; -export const createSupabaseServerClient = () => { - const cookieStore = cookies() - - const client = createServerClient( +export const createClient = ( + cookieStore: ReturnType, + supabaseAccessToken: string +) => { + return createServerClient( process.env.NEXT_PUBLIC_SUPABASE_URL!, process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!, { + global: { + headers: { + Authorization: `Bearer ${supabaseAccessToken}`, + }, + }, cookies: { get(name: string) { - return cookieStore.get(name)?.value + return cookieStore.get(name)?.value; + }, + set(name: string, value: string, options: CookieOptions) { + try { + cookieStore.set({ name, value, ...options }); + } catch (error) { + // The `set` method was called from a Server Component. + // This can be ignored if you have middleware refreshing + // user sessions. + } + }, + remove(name: string, options: CookieOptions) { + try { + cookieStore.set({ name, value: "", ...options }); + } catch (error) { + // The `delete` method was called from a Server Component. + // This can be ignored if you have middleware refreshing + // user sessions. + } }, }, } ); - - return client; }; From 07b414e055271ce50c214676aa6924bbaaea7667 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 23 Jan 2024 16:57:42 +0100 Subject: [PATCH 4/5] chore: handle error if `session.supabaseAccessToken` is not defined --- apps/browser/lib/hooks/useEvoService.ts | 2 +- apps/browser/lib/mutations/useAddChatLog.ts | 7 ++++--- apps/browser/lib/mutations/useAddMessages.ts | 7 ++++--- apps/browser/lib/mutations/useAddVariable.ts | 7 ++++--- apps/browser/lib/mutations/useCreateChat.ts | 5 ++++- apps/browser/lib/mutations/useDeleteChat.ts | 5 ++++- apps/browser/lib/mutations/useUpdateChatTitle.ts | 6 +++++- apps/browser/lib/queries/useChats.ts | 4 ++-- 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/apps/browser/lib/hooks/useEvoService.ts b/apps/browser/lib/hooks/useEvoService.ts index ad17894f..36b1812a 100644 --- a/apps/browser/lib/hooks/useEvoService.ts +++ b/apps/browser/lib/hooks/useEvoService.ts @@ -144,7 +144,7 @@ export const useEvoService = ( async function loadWorkspace(chatId: string): Promise { const workspace = (() => { - if (session?.supabaseAccessToken) { + if (session?.supabaseAccessToken) { const supabase = createSupabaseBrowserClient(session.supabaseAccessToken) return new SupabaseWorkspace(chatId, supabase) } else { diff --git a/apps/browser/lib/mutations/useAddChatLog.ts b/apps/browser/lib/mutations/useAddChatLog.ts index 58a340b4..f69c03f9 100644 --- a/apps/browser/lib/mutations/useAddChatLog.ts +++ b/apps/browser/lib/mutations/useAddChatLog.ts @@ -25,9 +25,10 @@ export const useAddChatLog = () => { chatId: string; log: ChatLog; }) => { - const supabase = createSupabaseBrowserClient( - session?.supabaseAccessToken as string - ); + if (!session?.supabaseAccessToken) { + throw new Error("Not authenticated"); + } + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { error } = await supabase .from("logs") .insert( diff --git a/apps/browser/lib/mutations/useAddMessages.ts b/apps/browser/lib/mutations/useAddMessages.ts index d9685ed9..7a222fd0 100644 --- a/apps/browser/lib/mutations/useAddMessages.ts +++ b/apps/browser/lib/mutations/useAddMessages.ts @@ -73,9 +73,10 @@ export const useAddMessages = () => { messages: ChatMessage[]; type: ChatLogType; }) => { - const supabase = createSupabaseBrowserClient( - session?.supabaseAccessToken as string - ); + if (!session?.supabaseAccessToken) { + throw new Error("Not authenticated"); + } + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { error } = await supabase .from("messages") .insert( diff --git a/apps/browser/lib/mutations/useAddVariable.ts b/apps/browser/lib/mutations/useAddVariable.ts index 0bd6b1a3..3e3cac74 100644 --- a/apps/browser/lib/mutations/useAddVariable.ts +++ b/apps/browser/lib/mutations/useAddVariable.ts @@ -24,9 +24,10 @@ export const useAddVariable = () => { key: string; value: string; }) => { - const supabase = createSupabaseBrowserClient( - session?.supabaseAccessToken as string - ); + if (!session?.supabaseAccessToken) { + throw new Error("Not authenticated"); + } + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { error } = await supabase .from("variables") .insert( diff --git a/apps/browser/lib/mutations/useCreateChat.ts b/apps/browser/lib/mutations/useCreateChat.ts index 9a94b014..3d7da644 100644 --- a/apps/browser/lib/mutations/useCreateChat.ts +++ b/apps/browser/lib/mutations/useCreateChat.ts @@ -9,7 +9,10 @@ export const useCreateChat = () => { return useMutation({ mutationFn: async (chatId: string) => { - const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); + if (!session?.supabaseAccessToken ) { + throw new Error("Not authenticated"); + } + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { data, error } = await supabase .from("chats") .insert({ diff --git a/apps/browser/lib/mutations/useDeleteChat.ts b/apps/browser/lib/mutations/useDeleteChat.ts index f50376c1..c8be0aaf 100644 --- a/apps/browser/lib/mutations/useDeleteChat.ts +++ b/apps/browser/lib/mutations/useDeleteChat.ts @@ -8,7 +8,10 @@ export const useDeleteChat = () => { return useMutation({ mutationFn: async (chatId: string) => { - const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); + if (!session?.supabaseAccessToken) { + throw new Error("Not authenticated"); + } + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { error } = await supabase .from("chats") .delete() diff --git a/apps/browser/lib/mutations/useUpdateChatTitle.ts b/apps/browser/lib/mutations/useUpdateChatTitle.ts index db1c8f21..7f276479 100644 --- a/apps/browser/lib/mutations/useUpdateChatTitle.ts +++ b/apps/browser/lib/mutations/useUpdateChatTitle.ts @@ -8,7 +8,11 @@ export const useUpdateChatTitle = () => { return useMutation({ mutationFn: async (args: { chatId: string; title: string }) => { - const supabase = createSupabaseBrowserClient(session?.supabaseAccessToken as string); + if (!session?.supabaseAccessToken) { + throw new Error("Not authenticated"); + } + + const supabase = createSupabaseBrowserClient(session.supabaseAccessToken); const { error } = await supabase .from("chats") .update({ title: args.title }) diff --git a/apps/browser/lib/queries/useChats.ts b/apps/browser/lib/queries/useChats.ts index 4943fd71..72c97d8c 100644 --- a/apps/browser/lib/queries/useChats.ts +++ b/apps/browser/lib/queries/useChats.ts @@ -176,11 +176,11 @@ export const useChats = () => { enabled: !!session?.user?.email, refetchOnMount: false, queryFn: async () => { - if (!session?.user?.email) { + if (!session?.user?.email || !session?.supabaseAccessToken) { throw new Error("Not authenticated") } - const { data, error } = await fetchChats(session.supabaseAccessToken as string); + const { data, error } = await fetchChats(session.supabaseAccessToken); if (error) { console.error(error) From c7ec0f82f279be5b8f2879eb46708764d1be9e09 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 23 Jan 2024 17:02:58 +0100 Subject: [PATCH 5/5] chore: pass `StorageClient` to `SupabaseWorkspace` constructor --- apps/browser/lib/hooks/useEvoService.ts | 2 +- .../browser/lib/supabase/SupabaseWorkspace.ts | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apps/browser/lib/hooks/useEvoService.ts b/apps/browser/lib/hooks/useEvoService.ts index 36b1812a..ee1a4b74 100644 --- a/apps/browser/lib/hooks/useEvoService.ts +++ b/apps/browser/lib/hooks/useEvoService.ts @@ -146,7 +146,7 @@ export const useEvoService = ( const workspace = (() => { if (session?.supabaseAccessToken) { const supabase = createSupabaseBrowserClient(session.supabaseAccessToken) - return new SupabaseWorkspace(chatId, supabase) + return new SupabaseWorkspace(chatId, supabase.storage) } else { return new InMemoryWorkspace() } diff --git a/apps/browser/lib/supabase/SupabaseWorkspace.ts b/apps/browser/lib/supabase/SupabaseWorkspace.ts index 3fb770a2..e7526106 100644 --- a/apps/browser/lib/supabase/SupabaseWorkspace.ts +++ b/apps/browser/lib/supabase/SupabaseWorkspace.ts @@ -1,5 +1,5 @@ import { DirectoryEntry, Workspace } from "@evo-ninja/agent-utils"; -import { SupabaseClient } from "@supabase/supabase-js"; +import { StorageClient } from "@supabase/storage-js"; import * as path from "path-browserify"; const BUCKET_NAME = "workspaces"; @@ -7,13 +7,13 @@ const BUCKET_NAME = "workspaces"; export class SupabaseWorkspace implements Workspace { constructor( public readonly chatId: string, - public readonly supabase: SupabaseClient + public readonly supabaseStorage: StorageClient ) {} async writeFile(subpath: string, data: string): Promise { const path = this.toWorkspacePath(subpath); - const { error } = await this.supabase.storage + const { error } = await this.supabaseStorage .from(BUCKET_NAME) .upload(path, data, { upsert: true }); @@ -27,7 +27,7 @@ export class SupabaseWorkspace implements Workspace { async readFile(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabase.storage + const { data, error } = await this.supabaseStorage .from(BUCKET_NAME) .download(path); @@ -45,7 +45,7 @@ export class SupabaseWorkspace implements Workspace { async exists(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabase.storage + const { data, error } = await this.supabaseStorage .from(BUCKET_NAME) .download(path); @@ -60,7 +60,7 @@ export class SupabaseWorkspace implements Workspace { const absOldPath = this.toWorkspacePath(oldPath); const absNewPath = this.toWorkspacePath(newPath); - const { error } = await this.supabase.storage + const { error } = await this.supabaseStorage .from(BUCKET_NAME) .move(absOldPath, absNewPath); @@ -78,7 +78,7 @@ export class SupabaseWorkspace implements Workspace { const path = this.toWorkspacePath(subpath); - const { data: list, error: listError } = await this.supabase.storage + const { data: list, error: listError } = await this.supabaseStorage .from(BUCKET_NAME) .list(path); @@ -91,7 +91,7 @@ export class SupabaseWorkspace implements Workspace { return; } - const { error: removeError } = await this.supabase.storage + const { error: removeError } = await this.supabaseStorage .from(BUCKET_NAME) .remove(filesToRemove); @@ -103,7 +103,7 @@ export class SupabaseWorkspace implements Workspace { async readdir(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { data, error } = await this.supabase.storage + const { data, error } = await this.supabaseStorage .from(BUCKET_NAME) .list(path); @@ -126,7 +126,7 @@ export class SupabaseWorkspace implements Workspace { async appendFile(subpath: string, data: string): Promise { const path = this.toWorkspacePath(subpath); - const { data: existingData, error: readError } = await this.supabase.storage + const { data: existingData, error: readError } = await this.supabaseStorage .from(BUCKET_NAME) .download(path); @@ -136,7 +136,7 @@ export class SupabaseWorkspace implements Workspace { const newData = existingData ? existingData.text() + data : data; - const { error: writeError } = await this.supabase.storage + const { error: writeError } = await this.supabaseStorage .from(BUCKET_NAME) .upload(path, newData, { upsert: true }); @@ -148,7 +148,7 @@ export class SupabaseWorkspace implements Workspace { async rm(subpath: string): Promise { const path = this.toWorkspacePath(subpath); - const { error } = await this.supabase.storage + const { error } = await this.supabaseStorage .from(BUCKET_NAME) .remove([path]);