diff --git a/components/drive/FilesResultsTable.tsx b/components/drive/FilesResultsTable.tsx
index 707e13c..703f086 100644
--- a/components/drive/FilesResultsTable.tsx
+++ b/components/drive/FilesResultsTable.tsx
@@ -8,9 +8,8 @@ import {
TableHeader,
TableRow,
} from "@/components/ui/table";
-import { FileText, Download, Pencil, Users, Table2 } from "lucide-react";
-import { FaStar, FaRegStar } from "react-icons/fa";
-import { LuSquareMenu } from "react-icons/lu";
+import { Download, Pencil, Users, MessageSquare } from "lucide-react";
+import { FaStar, FaRegStar, FaFolder } from "react-icons/fa";
import { useCallback, useMemo, useState, useEffect } from "react";
import { useRouter } from "next/navigation";
import dynamic from "next/dynamic";
@@ -25,10 +24,8 @@ import {
AlertDialogHeader,
AlertDialogTitle,
} from "@/components/ui/alert-dialog";
-import { FaFilePdf, FaImage, FaFolder } from "react-icons/fa";
-import { BsFileEarmarkSpreadsheetFill } from "react-icons/bs";
-import { FaFilm } from "react-icons/fa6";
import { ItemContextMenu } from "./ItemContextMenu";
+import { getFileIconComponent } from "@/lib/utils/file-icons";
const SelectionBar = dynamic(
() => import("./SelectionBar").then((m) => m.SelectionBar),
{ loading: () =>
}
@@ -81,53 +78,6 @@ interface FilesResultsTableProps {
isGoogleDriveFolder?: boolean;
}
-function getIconForFile(name: string, item?: FileEntry) {
- // Check for Google Workspace files by MIME type
- if (item && (item as any).meta) {
- const meta = (item as any).meta as any;
- if (meta.mimeType) {
- if (meta.mimeType === "application/vnd.google-apps.document") {
- return
;
- }
- if (meta.mimeType === "application/vnd.google-apps.spreadsheet") {
- return
;
- }
- }
- }
-
- const ext = name.includes(".") ? name.split(".").pop()!.toLowerCase() : "";
- if (
- [
- "jpg",
- "jpeg",
- "png",
- "gif",
- "webp",
- "svg",
- "bmp",
- "tiff",
- "tif",
- "heic",
- "heif",
- "avif",
- ].includes(ext)
- ) {
- return
;
- }
- if (["mp4", "webm", "ogg", "ogv", "mov", "m4v", "mkv"].includes(ext)) {
- return
;
- }
- if (ext === "pdf") {
- return
;
- }
- if (["xls", "xlsx", "xlsm", "csv", "tsv", "ods", "numbers"].includes(ext)) {
- return
;
- }
- if (["doc", "docx", "rtf", "odt"].includes(ext)) {
- return
;
- }
- return
;
-}
function isPreviewable(name: string, item?: FileEntry) {
// Check if it's a Google Workspace file
@@ -776,7 +726,7 @@ export function FilesResultsTable({
{it.isDirectory ? (
) : (
- getIconForFile(it.name, it)
+ getFileIconComponent(it.name, it)
)}
{it.name}
@@ -853,6 +803,7 @@ function RowItem({
isStarred,
onToggleStar,
}: RowItemProps) {
+ const router = useRouter();
const { attributes, listeners, setNodeRef } = useDraggable({ id: item.id });
const { isOver, setNodeRef: setDropRef } = item.isDirectory
? useDroppable({ id: `folder/${item.id}` })
@@ -886,7 +837,7 @@ function RowItem({
{item.isDirectory ? (
) : (
- getIconForFile(item.name, item)
+ getFileIconComponent(item.name, item)
)}
{item.name}
{!item.isDirectory && item.ownedByMe === false && (
@@ -929,6 +880,52 @@ function RowItem({
+ {!item.isDirectory && (
+
{
+ e.preventDefault();
+ e.stopPropagation();
+ try {
+ const key = "chat-input";
+ const raw = sessionStorage.getItem(key);
+ const defaults = {
+ prompt: "",
+ files: [] as { name: string; size: number; type: string }[],
+ selectedToolIds: [] as string[],
+ selectedFilterIds: [] as string[],
+ imageGenerationEnabled: false,
+ webSearchEnabled: false,
+ codeInterpreterEnabled: false,
+ contextFiles: [] as { id: string; name: string }[],
+ };
+ const data = raw ? { ...defaults, ...JSON.parse(raw) } : defaults;
+ const existing = Array.isArray((data as any).contextFiles)
+ ? ((data as any).contextFiles as { id: string; name: string }[])
+ : [];
+ const next = existing.some((f) => f && f.id === item.id)
+ ? existing
+ : [...existing, { id: item.id, name: item.name }];
+ (data as any).contextFiles = next;
+ sessionStorage.setItem(key, JSON.stringify(data));
+ // Also pass via URL params so the landing page can inject if needed
+ const cfid = encodeURIComponent(item.id);
+ const cfn = encodeURIComponent(item.name);
+ router.push(`/?cfid=${cfid}&cfn=${cfn}`);
+ } catch {
+ // ignore storage errors
+ const cfid = encodeURIComponent(item.id);
+ const cfn = encodeURIComponent(item.name);
+ router.push(`/?cfid=${cfid}&cfn=${cfn}`);
+ }
+ }}
+ >
+
+
+ )}
(null)
const [renameFileId, setRenameFileId] = useState(null)
const [optimisticStars, setOptimisticStars] = useState>({})
+ const [hiddenIds, setHiddenIds] = useState>(new Set())
const idToItem = useMemo(() => {
const m = new Map()
for (const e of entries) m.set(e.id, e)
return m
}, [entries])
+ const visibleEntries = useMemo(
+ () => entries.filter((e) => !hiddenIds.has(e.id)),
+ [entries, hiddenIds]
+ )
+ useEffect(() => {
+ const onItem = (e: Event) => {
+ try {
+ const ce = e as CustomEvent<{ id?: string }>
+ const id = ce.detail?.id
+ if (id) {
+ setHiddenIds((prev) => {
+ const next = new Set(prev)
+ next.add(id)
+ return next
+ })
+ }
+ } catch {}
+ }
+ const onItems = (e: Event) => {
+ try {
+ const ce = e as CustomEvent<{ ids?: string[] }>
+ const ids = Array.isArray(ce.detail?.ids) ? ce.detail?.ids as string[] : []
+ if (ids.length) {
+ setHiddenIds((prev) => {
+ const next = new Set(prev)
+ for (const id of ids) next.add(id)
+ return next
+ })
+ }
+ } catch {}
+ }
+ window.addEventListener("drive:itemTrashed", onItem as EventListener)
+ window.addEventListener("drive:itemsTrashed", onItems as EventListener)
+ return () => {
+ window.removeEventListener("drive:itemTrashed", onItem as EventListener)
+ window.removeEventListener("drive:itemsTrashed", onItems as EventListener)
+ }
+ }, [])
const onOpen = useCallback((item: FileEntry) => {
if (item.isDirectory) {
@@ -105,7 +144,7 @@ export function FilesResultsTableMobile({ entries, parentName }: FilesResultsTab
return (
- {entries.map((item) => (
+ {visibleEntries.map((item) => (
{item.isDirectory ?
: getIconForFile(item.name, item)}
diff --git a/components/drive/ZoomableImage.tsx b/components/drive/ZoomableImage.tsx
index a75c4f2..6653784 100644
--- a/components/drive/ZoomableImage.tsx
+++ b/components/drive/ZoomableImage.tsx
@@ -1,5 +1,6 @@
"use client"
import { TransformWrapper, TransformComponent } from "react-zoom-pan-pinch"
+import { useEffect, useMemo, useRef, useState } from "react"
interface ZoomableImageProps {
src: string
@@ -9,29 +10,128 @@ interface ZoomableImageProps {
maxScale?: number
}
-export function ZoomableImage({ src, alt, initialScale = 0.75, minScale = initialScale, maxScale = 8 }: ZoomableImageProps) {
+export function ZoomableImage({ src, alt, initialScale, minScale, maxScale = 8 }: ZoomableImageProps) {
+ const containerRef = useRef
(null)
+ const [containerSize, setContainerSize] = useState<{ width: number; height: number } | null>(null)
+ const [imageSize, setImageSize] = useState<{ width: number; height: number } | null>(null)
+ const [showContent, setShowContent] = useState(false)
+ const WHEEL_STEP = 0.1
+
+ // Measure the container
+ useEffect(() => {
+ const el = containerRef.current
+ if (!el) return
+ const update = () => {
+ const rect = el.getBoundingClientRect()
+ setContainerSize({ width: rect.width, height: rect.height })
+ }
+ update()
+ const ro = new ResizeObserver(update)
+ ro.observe(el)
+ return () => {
+ ro.disconnect()
+ }
+ }, [])
+
+ // Preload image to read natural dimensions
+ useEffect(() => {
+ if (!src) return
+ let cancelled = false
+ const img = new Image()
+ img.decoding = "async"
+ img.onload = () => {
+ if (cancelled) return
+ setImageSize({ width: img.naturalWidth, height: img.naturalHeight })
+ }
+ img.src = src
+ return () => {
+ cancelled = true
+ }
+ }, [src])
+
+ // Compute scale to fit width exactly
+ const widthFitScale = useMemo(() => {
+ if (!containerSize || !imageSize) return undefined
+ const s = containerSize.width / imageSize.width
+ if (!Number.isFinite(s) || s <= 0) return undefined
+ return s
+ }, [containerSize, imageSize])
+
+ // Compute scale to fit height exactly
+ const heightFitScale = useMemo(() => {
+ if (!containerSize || !imageSize) return undefined
+ const s = containerSize.height / imageSize.height
+ if (!Number.isFinite(s) || s <= 0) return undefined
+ return s
+ }, [containerSize, imageSize])
+
+ // Choose base fit depending on orientation: landscape -> width, portrait -> height
+ const baseFitScale = useMemo(() => {
+ if (!imageSize) return undefined
+ const isPortrait = imageSize.height >= imageSize.width
+ return (isPortrait ? heightFitScale : widthFitScale)
+ }, [imageSize, widthFitScale, heightFitScale])
+
+ const effectiveInitialScale = useMemo(() => {
+ // Start from the base fit and then apply two "zoom clicks" in
+ if (typeof baseFitScale === "number") return baseFitScale + 2 * WHEEL_STEP
+ return typeof initialScale === "number" ? initialScale : 1
+ }, [baseFitScale, initialScale])
+
+ const effectiveMinScale = useMemo(() => {
+ // Allow zooming out to exactly the base fit (so edges align), or to 1x for small images.
+ if (typeof baseFitScale === "number") return Math.min(baseFitScale, 1)
+ if (typeof minScale === "number") return minScale
+ if (typeof initialScale === "number") return initialScale
+ return 0.1
+ }, [baseFitScale, initialScale, minScale])
+
+ // Wait until we can determine fit vs not, so first paint is correct
+ const ready = containerSize !== null && imageSize !== null
+
+ // Avoid a single-frame flash of untransformed huge image by revealing content
+ // one animation frame after everything is ready (transforms applied).
+ useEffect(() => {
+ if (!ready) {
+ setShowContent(false)
+ return
+ }
+ const id = requestAnimationFrame(() => setShowContent(true))
+ return () => cancelAnimationFrame(id)
+ }, [ready])
+
return (
-
-
-
+ {ready && (
+
- {/* eslint-disable-next-line @next/next/no-img-element */}
-
-
-
+
+ {/* eslint-disable-next-line @next/next/no-img-element */}
+
+
+
+ )}
)
}
diff --git a/components/sidebar/nav-chats.tsx b/components/sidebar/nav-chats.tsx
index 941e5d9..7ea0e61 100644
--- a/components/sidebar/nav-chats.tsx
+++ b/components/sidebar/nav-chats.tsx
@@ -26,6 +26,17 @@ import {
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
+import {
+ AlertDialog,
+ AlertDialogTrigger,
+ AlertDialogContent,
+ AlertDialogHeader,
+ AlertDialogTitle,
+ AlertDialogDescription,
+ AlertDialogFooter,
+ AlertDialogCancel,
+ AlertDialogAction,
+} from "@/components/ui/alert-dialog"
import { usePathname, useRouter } from "next/navigation"
import type { ChatData } from "@/lib/modules/chat"
import { useChatTitles } from "@/hooks/useChatTitles"
@@ -390,31 +401,49 @@ export function NavChats({ chats, timeZone = 'UTC' }: NavChatsProps) {
Archive
- {
- e.preventDefault()
- e.stopPropagation()
- try {
- // Optimistic removal
- removeChatById(chat.id)
- await fetch(`/api/v1/chats/${encodeURIComponent(chat.id)}`, {
- method: 'DELETE',
- cache: 'no-store',
- })
- try {
- const bc = new BroadcastChannel('chats')
- bc.postMessage({ type: 'deleted', id: chat.id })
- bc.close()
- } catch {}
- } finally {
- router.refresh()
- }
- }}
- >
-
- Delete
-
+
+
+ { e.preventDefault() }}
+ >
+
+ Delete
+
+
+
+
+ Delete this chat?
+
+ This action cannot be undone. This will permanently delete this chat and its messages.
+
+
+
+ Cancel
+ {
+ try {
+ // Optimistic removal
+ removeChatById(chat.id)
+ await fetch(`/api/v1/chats/${encodeURIComponent(chat.id)}`, {
+ method: 'DELETE',
+ cache: 'no-store',
+ })
+ try {
+ const bc = new BroadcastChannel('chats')
+ bc.postMessage({ type: 'deleted', id: chat.id })
+ bc.close()
+ } catch {}
+ } finally {
+ router.refresh()
+ }
+ }}
+ >
+ Delete
+
+
+
+
diff --git a/components/ui/button.tsx b/components/ui/button.tsx
index 445048b..10f765d 100644
--- a/components/ui/button.tsx
+++ b/components/ui/button.tsx
@@ -15,6 +15,8 @@ const buttonVariants = cva(
"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
+ outlineAlt:
+ "border bg-transparent shadow-xs dark:bg-transparent dark:border-input",
secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
ghost:
diff --git a/hooks/models/usePinnedModels.ts b/hooks/models/usePinnedModels.ts
index 6ba0d2e..816dce4 100644
--- a/hooks/models/usePinnedModels.ts
+++ b/hooks/models/usePinnedModels.ts
@@ -23,7 +23,12 @@ export function usePinnedModels(
currentUserId?: string | null,
options?: UsePinnedModelsOptions,
): UsePinnedModelsResult {
- const [pinnedIds, setPinnedIds] = useState([])
+ const initialIds = useMemo(() => {
+ const initial = options?.initialPinnedModels
+ return Array.isArray(initial) ? initial.map((m) => m.id) : []
+ }, [options?.initialPinnedModels])
+
+ const [pinnedIds, setPinnedIds] = useState(initialIds)
const [pinnedModels, setPinnedModels] = useState(() => {
const initial = options?.initialPinnedModels
return Array.isArray(initial) ? [...initial] : []
@@ -60,9 +65,13 @@ export function usePinnedModels(
}, [currentUserId, allModels])
useEffect(() => {
- // Initial load
+ // Skip initial refresh if caller provided initial pinned models to avoid
+ // unnecessary refetches during mount/unmount cycles (e.g., mobile sidebar).
+ if (Array.isArray(options?.initialPinnedModels) && options.initialPinnedModels.length > 0) {
+ return
+ }
void refresh()
- }, [refresh])
+ }, [refresh, options?.initialPinnedModels])
useEffect(() => {
const handler = () => { void refresh() }
diff --git a/hooks/useChatStreaming.ts b/hooks/useChatStreaming.ts
index cd002a0..8d264c9 100644
--- a/hooks/useChatStreaming.ts
+++ b/hooks/useChatStreaming.ts
@@ -36,16 +36,145 @@ export function useChatStreaming({ chatId, initialModels, selectedModel }: UseCh
const handleSendMessage = useCallback(async (
value: string,
- options: { webSearch: boolean; image: boolean; video?: boolean; codeInterpreter: boolean },
+ options: { webSearch: boolean; image: boolean; video?: boolean; codeInterpreter: boolean; referencedChats?: Array<{ id: string; title?: string | null }>; contextMessages?: UIMessage[] },
overrideModel?: Model,
isAutoSend: boolean = false,
- streamHandlers?: StreamHandlers
+ streamHandlers?: StreamHandlers,
+ attachedFiles?: Array<{ file: File; localId: string } | { fileId: string; fileName: string }>
): Promise => {
const modelToUse = overrideModel || selectedModel
if (!modelToUse) { toast.error('Please select a model first.'); return null }
setError(null)
const providerModelId = (modelToUse as any).providerId || modelToUse.id
+
+ // Process attachments (both uploaded files and drive file references)
+ const attachments: any[] = []
+ if (attachedFiles && attachedFiles.length > 0) {
+ for (const item of attachedFiles) {
+ try {
+ let fileId: string
+ let fileName: string
+ let fileType: string = 'application/octet-stream'
+
+ // Check if it's an uploaded file or a drive file reference
+ if ('file' in item) {
+ // Uploaded file - upload it first
+ const { file, localId } = item
+ const formData = new FormData()
+ formData.append('file', file)
+
+ const uploadRes = await fetch('/api/v1/chat/attachments', {
+ method: 'POST',
+ body: formData
+ })
+
+ if (!uploadRes.ok) {
+ console.error('Failed to upload file:', await uploadRes.text())
+ continue
+ }
+
+ const uploadData = await uploadRes.json()
+ if (!uploadData.ok || !uploadData.fileId) {
+ console.error('Upload response missing file data:', uploadData)
+ continue
+ }
+
+ fileId = uploadData.fileId
+ fileName = uploadData.filename
+ fileType = file.type
+ } else {
+ // Drive file reference - use the file ID directly
+ fileId = item.fileId
+ fileName = item.fileName
+ // Try to infer type from filename
+ if (fileName.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
+ fileType = 'image/' + (fileName.split('.').pop() || 'jpeg')
+ } else if (fileName.endsWith('.pdf')) {
+ fileType = 'application/pdf'
+ }
+ }
+
+ // Get signed URL for external access (model API)
+ const signedRes = await fetch(`/api/v1/drive/file/${fileId}/signed-url`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ filename: fileName, ttlSec: 3600 })
+ })
+
+ if (!signedRes.ok) {
+ console.error('Failed to get signed URL:', await signedRes.text())
+ continue
+ }
+
+ const { url } = await signedRes.json()
+
+ // For localhost, model APIs can't access URLs, so fall back to base64
+ const isLocalhost = url.includes('localhost') || url.includes('127.0.0.1')
+
+ let fileData = url
+ if (isLocalhost) {
+ // Convert to base64 for localhost
+ if ('file' in item) {
+ // Uploaded file - read from File object
+ const base64 = await new Promise((resolve, reject) => {
+ const reader = new FileReader()
+ reader.onload = () => {
+ const result = reader.result as string
+ resolve(result) // Keep full data URL
+ }
+ reader.onerror = reject
+ reader.readAsDataURL(item.file)
+ })
+ fileData = base64
+ } else {
+ // Drive file reference - fetch and convert to base64
+ try {
+ const fetchRes = await fetch(`/api/v1/drive/file/${fileId}`)
+ if (fetchRes.ok) {
+ const blob = await fetchRes.blob()
+ const base64 = await new Promise((resolve, reject) => {
+ const reader = new FileReader()
+ reader.onload = () => {
+ const result = reader.result as string
+ resolve(result)
+ }
+ reader.onerror = reject
+ reader.readAsDataURL(blob)
+ })
+ fileData = base64
+ }
+ } catch (fetchErr) {
+ console.error('Failed to fetch drive file for base64 conversion:', fetchErr)
+ }
+ }
+ }
+
+ // Store as attachment metadata
+ if (fileType.startsWith('image/')) {
+ attachments.push({
+ type: 'image',
+ image: fileData,
+ mediaType: fileType,
+ localId: 'localId' in item ? item.localId : undefined,
+ fileId
+ })
+ } else {
+ attachments.push({
+ type: 'file',
+ data: fileData,
+ mediaType: fileType,
+ filename: fileName,
+ localId: 'localId' in item ? item.localId : undefined,
+ fileId
+ })
+ }
+ } catch (err) {
+ console.error('Failed to process attachment:', err)
+ }
+ }
+ }
+
const userMessage: UIMessage = {
id: `msg_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,
role: 'user',
@@ -56,8 +185,10 @@ export function useChatStreaming({ chatId, initialModels, selectedModel }: UseCh
id: providerModelId,
name: resolveModelDisplay(providerModelId, modelToUse).name,
profile_image_url: resolveModelDisplay(providerModelId, modelToUse).image || null,
- }
- }
+ },
+ attachments: attachments.length > 0 ? attachments : undefined,
+ referencedChats: Array.isArray(options?.referencedChats) && options.referencedChats.length > 0 ? options.referencedChats : undefined,
+ } as any
}
if (!isAutoSend) {
@@ -73,9 +204,15 @@ export function useChatStreaming({ chatId, initialModels, selectedModel }: UseCh
const state = useChatStore.getState()
const currentMessages = state.messages
+ const hasContext = Array.isArray(options?.contextMessages) && (options!.contextMessages as any[]).length > 0
+ const combinedMessages = hasContext
+ ? ([...(options!.contextMessages as any[]), ...(isAutoSend ? currentMessages : []), userMessage] as UIMessage[])
+ : undefined
const body = isAutoSend
- ? { messages: currentMessages, chatId, modelId: modelToUse.id, enableWebSearch: options.webSearch, enableImage: options.image, enableVideo: Boolean(options.video) }
- : { message: userMessage, chatId, modelId: modelToUse.id, enableWebSearch: options.webSearch, enableImage: options.image, enableVideo: Boolean(options.video) }
+ ? { messages: combinedMessages || currentMessages, chatId, modelId: modelToUse.id, enableWebSearch: options.webSearch, enableImage: options.image, enableVideo: Boolean(options.video) }
+ : combinedMessages
+ ? { messages: combinedMessages, chatId, modelId: modelToUse.id, enableWebSearch: options.webSearch, enableImage: options.image, enableVideo: Boolean(options.video) }
+ : { message: userMessage, chatId, modelId: modelToUse.id, enableWebSearch: options.webSearch, enableImage: options.image, enableVideo: Boolean(options.video) }
const response = await fetch('/api/v1/chat', {
method: 'POST',
diff --git a/lib/api/chats.ts b/lib/api/chats.ts
index 6a04620..538b09b 100644
--- a/lib/api/chats.ts
+++ b/lib/api/chats.ts
@@ -36,7 +36,15 @@ export async function unarchiveChat(chatId: string): Promise {
}
}
-export async function createInitialChat(input: { message: string; model: { id: string; name?: string; profile_image_url?: string | null } }): Promise<{ chatId: string } & { model: { id: string; name?: string; profile_image_url?: string | null } }> {
+type AttachmentImage = { type: 'image'; image: string; mediaType: string; fileId?: string; localId?: string }
+type AttachmentFile = { type: 'file'; data: string; mediaType: string; filename: string; fileId?: string; localId?: string }
+type Attachment = AttachmentImage | AttachmentFile
+
+export async function createInitialChat(input: {
+ message: string;
+ model: { id: string; name?: string; profile_image_url?: string | null };
+ attachments?: Attachment[];
+}): Promise<{ chatId: string } & { model: { id: string; name?: string; profile_image_url?: string | null } }> {
const initialMessage = {
id: `msg_${Date.now()}`,
role: 'user',
@@ -44,12 +52,16 @@ export async function createInitialChat(input: { message: string; model: { id: s
metadata: {
createdAt: Date.now(),
model: { id: input.model.id, name: input.model.name ?? 'Unknown Model', profile_image_url: input.model.profile_image_url ?? null },
+ ...(Array.isArray(input.attachments) && input.attachments.length > 0 ? { attachments: input.attachments } : {}),
},
}
const res = await httpFetch(absoluteUrl('/api/v1/chats'), {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({ message: { text: input.message, model: input.model }, initialMessage }),
+ body: JSON.stringify({
+ message: { text: input.message, model: input.model, attachments: input.attachments || [] },
+ initialMessage
+ }),
})
if (!res.ok) {
const data = await res.json().catch(() => ({}))
diff --git a/lib/modules/chat/chat.client-store.ts b/lib/modules/chat/chat.client-store.ts
index e5a89a0..d0d4aa4 100644
--- a/lib/modules/chat/chat.client-store.ts
+++ b/lib/modules/chat/chat.client-store.ts
@@ -11,7 +11,7 @@ interface ChatState {
messages: UIMessage[]
isInitialState: boolean
- startNewChat: (firstMessage: string, model: Model) => Promise
+ startNewChat: (firstMessage: string, model: Model, attachedFiles?: Array<{ file: File; localId: string } | { fileId: string; fileName: string }>) => Promise
addMessage: (message: UIMessage) => void
setMessages: (messages: UIMessage[]) => void
setCurrentChatId: (chatId: string | null) => void
@@ -23,10 +23,137 @@ export const useChatStore = create((set, get) => ({
messages: [],
isInitialState: true,
- startNewChat: async (firstMessage: string, model: Model) => {
+ startNewChat: async (firstMessage: string, model: Model, attachedFiles?: Array<{ file: File; localId: string } | { fileId: string; fileName: string }>) => {
const tempId = `temp-${Date.now()}`
const providerModelId = (model as any).providerId || model.id
+ // Process attachments (both uploaded files and drive file references)
+ const attachments: any[] = []
+ if (attachedFiles && attachedFiles.length > 0) {
+ for (const item of attachedFiles) {
+ try {
+ let fileId: string
+ let fileName: string
+ let fileType: string = 'application/octet-stream'
+
+ // Check if it's an uploaded file or a drive file reference
+ if ('file' in item) {
+ // Uploaded file - upload it first
+ const { file, localId } = item
+ const formData = new FormData()
+ formData.append('file', file)
+
+ const uploadRes = await fetch('/api/v1/chat/attachments', {
+ method: 'POST',
+ body: formData
+ })
+
+ if (!uploadRes.ok) {
+ console.error('Failed to upload file:', await uploadRes.text())
+ continue
+ }
+
+ const uploadData = await uploadRes.json()
+ if (!uploadData.ok || !uploadData.fileId) {
+ console.error('Upload response missing file data:', uploadData)
+ continue
+ }
+
+ fileId = uploadData.fileId
+ fileName = uploadData.filename
+ fileType = file.type
+ } else {
+ // Drive file reference - use the file ID directly
+ fileId = item.fileId
+ fileName = item.fileName
+ // Try to infer type from filename
+ if (fileName.match(/\.(jpg|jpeg|png|gif|webp)$/i)) {
+ fileType = 'image/' + (fileName.split('.').pop() || 'jpeg')
+ } else if (fileName.endsWith('.pdf')) {
+ fileType = 'application/pdf'
+ }
+ }
+
+ // Get signed URL for external access (model API)
+ const signedRes = await fetch(`/api/v1/drive/file/${fileId}/signed-url`, {
+ method: 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ filename: fileName, ttlSec: 3600 })
+ })
+
+ if (!signedRes.ok) {
+ console.error('Failed to get signed URL:', await signedRes.text())
+ continue
+ }
+
+ const { url } = await signedRes.json()
+
+ // For localhost, model APIs can't access URLs, so fall back to base64
+ const isLocalhost = url.includes('localhost') || url.includes('127.0.0.1')
+
+ let fileData = url
+ if (isLocalhost) {
+ // Convert to base64 for localhost
+ if ('file' in item) {
+ // Uploaded file - read from File object
+ const base64 = await new Promise((resolve, reject) => {
+ const reader = new FileReader()
+ reader.onload = () => {
+ const result = reader.result as string
+ resolve(result) // Keep full data URL
+ }
+ reader.onerror = reject
+ reader.readAsDataURL(item.file)
+ })
+ fileData = base64
+ } else {
+ // Drive file reference - fetch and convert to base64
+ try {
+ const fetchRes = await fetch(`/api/v1/drive/file/${fileId}`)
+ if (fetchRes.ok) {
+ const blob = await fetchRes.blob()
+ const base64 = await new Promise((resolve, reject) => {
+ const reader = new FileReader()
+ reader.onload = () => {
+ const result = reader.result as string
+ resolve(result)
+ }
+ reader.onerror = reject
+ reader.readAsDataURL(blob)
+ })
+ fileData = base64
+ }
+ } catch (fetchErr) {
+ console.error('Failed to fetch drive file for base64 conversion:', fetchErr)
+ }
+ }
+ }
+
+ // Store as attachment metadata
+ if (fileType.startsWith('image/')) {
+ attachments.push({
+ type: 'image',
+ image: fileData,
+ mediaType: fileType,
+ localId: 'localId' in item ? item.localId : undefined,
+ fileId
+ })
+ } else {
+ attachments.push({
+ type: 'file',
+ data: fileData,
+ mediaType: fileType,
+ filename: fileName,
+ localId: 'localId' in item ? item.localId : undefined,
+ fileId
+ })
+ }
+ } catch (err) {
+ console.error('Failed to process attachment:', err)
+ }
+ }
+ }
+
const userMessage: UIMessage = {
id: `msg_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,
role: 'user',
@@ -37,8 +164,9 @@ export const useChatStore = create((set, get) => ({
id: providerModelId,
name: model.name,
profile_image_url: (model as any)?.meta?.profile_image_url || null,
- }
- }
+ },
+ attachments: attachments.length > 0 ? attachments : undefined
+ } as any
}
set({ currentChatId: tempId, messages: [userMessage], isInitialState: false })
@@ -51,6 +179,7 @@ export const useChatStore = create((set, get) => ({
name: model.name,
profile_image_url: (model as any)?.meta?.profile_image_url || null,
},
+ attachments
})
const chatId: string = result.chatId
set({ currentChatId: chatId })
diff --git a/lib/modules/drive/db.service.ts b/lib/modules/drive/db.service.ts
index 2d87235..b91d1f5 100644
--- a/lib/modules/drive/db.service.ts
+++ b/lib/modules/drive/db.service.ts
@@ -625,6 +625,56 @@ export class DriveDbService {
return [...folderEntries, ...fileEntries]
}
+
+ static async searchFilesByName(userId: string, q: string, limit: number = 10): Promise<{ id: string; name: string }[]> {
+ const needle = String(q || '').trim().toLowerCase()
+ if (!needle) return []
+ const like = `%${needle.replace(/[%_]/g, '\\$&')}%`
+ try {
+ const rows = await db.$queryRaw`
+ SELECT id, filename
+ FROM "file"
+ WHERE user_id = ${userId}
+ AND LOWER(filename) LIKE ${like}
+ ORDER BY filename ASC
+ LIMIT ${Number.isFinite(limit) ? Math.max(1, Math.min(50, Math.floor(limit))) : 10}
+ `
+ return (rows || []).map(r => ({ id: String(r.id), name: String(r.filename) }))
+ } catch {
+ const rows = await db.$queryRaw`
+ SELECT id, filename
+ FROM "file"
+ WHERE user_id = ${userId}
+ AND LOWER(filename) LIKE ${like}
+ ORDER BY filename ASC
+ LIMIT ${Number.isFinite(limit) ? Math.max(1, Math.min(50, Math.floor(limit))) : 10}
+ `
+ return (rows || []).map(r => ({ id: String(r.id), name: String(r.filename) }))
+ }
+ }
+
+ static async listRecentFiles(userId: string, limit: number = 5): Promise<{ id: string; name: string }[]> {
+ const safeLimit = Number.isFinite(limit) ? Math.max(1, Math.min(50, Math.floor(limit))) : 5
+ try {
+ const rows = await db.$queryRaw`
+ SELECT id, filename
+ FROM "file"
+ WHERE user_id = ${userId}
+ ORDER BY updated_at DESC
+ LIMIT ${safeLimit}
+ `
+ return (rows || []).map(r => ({ id: String(r.id), name: String(r.filename) }))
+ } catch {
+ const rows = await db.$queryRaw`
+ SELECT id, filename
+ FROM "file"
+ WHERE user_id = ${userId}
+ ORDER BY updated_at DESC
+ LIMIT ${safeLimit}
+ `
+ return (rows || []).map(r => ({ id: String(r.id), name: String(r.filename) }))
+ }
+ }
}
@@ -641,5 +691,7 @@ export const listFilesByParent = DriveDbService.listFilesByParent.bind(DriveDbSe
export const getFolderBreadcrumb = DriveDbService.getFolderBreadcrumb.bind(DriveDbService)
export const listStarredEntries = DriveDbService.listStarredEntries.bind(DriveDbService)
export const isGoogleDriveFolder = DriveDbService.isGoogleDriveFolder.bind(DriveDbService)
+export const searchFilesByName = DriveDbService.searchFilesByName.bind(DriveDbService)
+export const listRecentFiles = DriveDbService.listRecentFiles.bind(DriveDbService)
diff --git a/lib/utils/file-icons.tsx b/lib/utils/file-icons.tsx
new file mode 100644
index 0000000..63a1237
--- /dev/null
+++ b/lib/utils/file-icons.tsx
@@ -0,0 +1,113 @@
+import { FileText, File as FileIcon, Image as ImageIcon, Video } from "lucide-react"
+import { FaFilePdf, FaImage } from "react-icons/fa"
+import { BsFileEarmarkSpreadsheetFill } from "react-icons/bs"
+import { FaFilm } from "react-icons/fa6"
+import { LuSquareMenu } from "react-icons/lu"
+import { Table2 } from "lucide-react"
+
+export function getFileIconComponent(fileName: string, item?: { meta?: any }) {
+ // Check for Google Workspace files by MIME type
+ if (item?.meta) {
+ const meta = item.meta as any
+ if (meta.mimeType) {
+ if (meta.mimeType === "application/vnd.google-apps.document") {
+ return
+ }
+ if (meta.mimeType === "application/vnd.google-apps.spreadsheet") {
+ return
+ }
+ }
+ }
+
+ const ext = fileName.includes(".") ? fileName.split(".").pop()!.toLowerCase() : ""
+
+ // Image files
+ if (
+ [
+ "jpg",
+ "jpeg",
+ "png",
+ "gif",
+ "webp",
+ "svg",
+ "bmp",
+ "tiff",
+ "tif",
+ "heic",
+ "heif",
+ "avif",
+ ].includes(ext)
+ ) {
+ return
+ }
+
+ // Video files
+ if (["mp4", "webm", "ogg", "ogv", "mov", "m4v", "mkv"].includes(ext)) {
+ return
+ }
+
+ // PDF files
+ if (ext === "pdf") {
+ return
+ }
+
+ // Spreadsheet files
+ if (["xls", "xlsx", "xlsm", "csv", "tsv", "ods", "numbers"].includes(ext)) {
+ return
+ }
+
+ // Document files
+ if (["doc", "docx", "rtf", "odt"].includes(ext)) {
+ return
+ }
+
+ // Default file icon
+ return
+}
+
+// Smaller version for compact UIs (like mention dropdown)
+export function getFileIconCompact(fileName: string, item?: { meta?: any }) {
+ // Check for Google Workspace files by MIME type
+ if (item?.meta) {
+ const meta = item.meta as any
+ if (meta.mimeType) {
+ if (meta.mimeType === "application/vnd.google-apps.document") {
+ return
+ }
+ if (meta.mimeType === "application/vnd.google-apps.spreadsheet") {
+ return
+ }
+ }
+ }
+
+ const ext = fileName.toLowerCase().split('.').pop() || ''
+
+ // Image files
+ if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'tiff', 'tif', 'heic', 'heif', 'avif'].includes(ext)) {
+ return
+ }
+
+ // Document files (PDF)
+ if (ext === 'pdf') {
+ return
+ }
+
+ // Document files (Word, etc)
+ if (['doc', 'docx', 'txt', 'md', 'rtf', 'odt'].includes(ext)) {
+ return
+ }
+
+ // Spreadsheets
+ if (['xls', 'xlsx', 'xlsm', 'csv', 'tsv', 'ods', 'numbers'].includes(ext)) {
+ return
+ }
+
+ // Video files
+ if (['mp4', 'mov', 'avi', 'mkv', 'webm', 'ogg', 'ogv', 'm4v'].includes(ext)) {
+ return
+ }
+
+ // Default file icon
+ return
+}
+
From e70659dfdde773b4ba684e90f211071d1662435a Mon Sep 17 00:00:00 2001
From: Alex <126031796+apensotti@users.noreply.github.com>
Date: Wed, 12 Nov 2025 23:43:23 -0500
Subject: [PATCH 3/4] Dev to main (#128)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Sync dev with main (#127)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* API-first v1 migration, Swagger docs, and Drive/Mobile UX upgrades (#126)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Release v0.2.0: Major API-first migration with new features, UI enhancements, and breaking changes. Added versioned endpoints, Swagger UI, mobile-first Drive UI, and improved chat functionalities. Removed legacy Server Actions and updated environment variables. Migration notes included for seamless transition.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
From cab1521e8f03954bcc7163ff0990a94efa760514 Mon Sep 17 00:00:00 2001
From: Alex <126031796+apensotti@users.noreply.github.com>
Date: Thu, 13 Nov 2025 00:00:01 -0500
Subject: [PATCH 4/4] Dev (#130)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Sync dev with main (#127)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* API-first v1 migration, Swagger docs, and Drive/Mobile UX upgrades (#126)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Release v0.2.0: Major API-first migration with new features, UI enhancements, and breaking changes. Added versioned endpoints, Swagger UI, mobile-first Drive UI, and improved chat functionalities. Removed legacy Server Actions and updated environment variables. Migration notes included for seamless transition.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* sync (#129)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* API-first v1 migration, Swagger docs, and Drive/Mobile UX upgrades (#126)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Release v0.2.0: Major API-first migration with new features, UI enhancements, and breaking changes. Added versioned endpoints, Swagger UI, mobile-first Drive UI, and improved chat functionalities. Removed legacy Server Actions and updated environment variables. Migration notes included for seamless transition.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Dev to main (#128)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Sync dev with main (#127)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* API-first v1 migration, Swagger docs, and Drive/Mobile UX upgrades (#126)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
* fix: update profile image URL path in POST request response
* feat: implement local state management for model activation toggle
* feat: add toast notifications for toggle actions in admin components
* feat: enhance usePinnedModels hook to support initial pinned models and prevent unnecessary refetches
* fix: adjust padding in ChatInput and PromptSuggestions components for improved layout
* fix: update max-width for message component and prevent auto-focus on model selector popover
* feat: integrate active Ollama models fetching and enhance model activation logic in ModelSelector (#114)
* Merge documents-attachments-and-context into dev (#117)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Drive trash fixes (#118)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* refactor: remove unused integration hook from FilesLeftSidebar component, simplifying the logic for Google Drive visibility
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: implement confirmation dialog for chat deletion in NavChats component, enhancing user experience and preventing accidental deletions
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* feat: implement optimistic UI updates for trashing items in FilesResultsTable and FilesResultsTableMobile, enhancing user experience with immediate feedback
* Dev rebase 2025 11 13 (#119)
* feat: add file upload and camera capture functionality to ChatInput component
* feat: refactor ChatInput component to improve structure and enhance functionality with new subcomponents for voice recording, attachments, and action buttons
* feat: introduce outlineAlt button variant and update styles in ChatInput component for improved visual feedback
* feat: enhance ChatInput component with mention functionality and recent file suggestions for improved user experience
* refactor: update parameter naming from fileId to id in drive file routes for consistency
* feat: implement file attachment handling in chat components, allowing users to upload and reference files in messages
* feat: enhance ChatInput component with folder browsing and file selection capabilities, improving user interaction with file management
* feat: enhance chat creation and message handling with support for attachments, improving message structure and validation
* feat: add nested dropdown menus for referencing chats and selecting drive files in ChatInput component, enhancing file management and user interaction
* feat: enhance chat components with support for referenced chats, improving context management and user experience
* feat: enhance chat and drive components with URL parameter handling for context files, improving user experience and file management
* feat: improve ZoomableImage component with enhanced scaling logic and content visibility management for better user experience
* feat: update chat-landing component by removing unused URL parameter handling and simplifying state management, enhancing code clarity and performance
* Dev: prepare clean merge to main by updating 4 files only (#122)
* Resolve merge conflicts for main merge: keep dev versions in 4 files (no other changes) (#124)
* Fix/dev to main 4files (#125)
* Release: Merge dev into main — Mobile UX, Drive navigation, and video features (#110)
* feat: enhance Drive layout with mobile navigation and responsive design adjustments
* feat: implement video streaming support and error handling in VideoPreviewer component
* feat: add rename functionality and optimistic UI updates for file starring in FilesResultsTableMobile
* feat: implement mobile layout for folder, starred, trash pages with responsive header and results table
* feat: add mobile floating action button to drive pages and refactor FAB menu for better reusability
* feat: add filename truncation for better display in FilesResultsTableMobile
* feat: add sidebar toggle button to FilesSearchBar for improved navigation
* Mobile UX & Navigation: Responsive layouts, sidebar toggle, Drive roots (#106)
* feat: enhance drive pages with local and Google root folder ID retrieval for improved navigation
* feat: improve search page layout with responsive design for mobile and desktop views
* feat: improve ModelSelector component with responsive design adjustments for better display on mobile and desktop
* fix: adjust padding and opacity for action buttons in ChatMessages component for improved visibility and layout
* fix: update transformer package from @xenova to @huggingface and adjust message avatar class for improved styling
* fix: remove fixed height from FilesResultsTableMobile for improved layout flexibility
* feat: integrate sidebar toggle button into SearchBar for enhanced navigation and improve layout responsiveness
* Video generation: show locally saved video in chat; enrich status endpoint
- Display locally saved videos in chat instead of expiring provider URLs.
- Enrich GET /api/v1/videos/sora2/{id}/status to include local URL/fileId when available.
- Update VideoJob and ChatMessages to prefer local asset.
- Remove /api/v1/videos/sora2/by-job/{id}.
* RELEASE: Update v0.1.30 CHANGELOG
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Merge remote-tracking branch 'origin/dev'
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
* Release v0.2.0: Major API-first migration with new features, UI enhancements, and breaking changes. Added versioned endpoints, Swagger UI, mobile-first Drive UI, and improved chat functionalities. Removed legacy Server Actions and updated environment variables. Migration notes included for seamless transition.
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
---------
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>