Conversation
testing backend test CI workflow
…gation - Replace window.location.href with router.push() + router.refresh() in UserDropdown logout - Replace window.location.href with router.push() in CreateSearchSpaceDialog - Replace window.location.reload() with router.refresh() in login page retry action - Prevents full page reloads and preserves React state during in-app navigation
- Remove 'use client' from connector-document-mapping.ts (only exports constants and pure functions) - Remove 'use client' from sidebar-separator.tsx (purely presentational component) - Remove 'use client' and Framer Motion from logs/loading.tsx, replace with Tailwind animations - Reduces client bundle size by moving server-compatible code to server components
- Add autoComplete="username" and "current-password" to login form - Add autoComplete="email" and "new-password" to register form inputs - Add autoComplete="name" to profile display name input - Add autoComplete="off" to connector search input - Enables browser password managers and autofill functionality
- Add local state for message filter input with 300ms debounce - Use useDebouncedValue hook to delay table filter updates - Prevents full filtering pipeline from running on every keystroke - Improves responsiveness for large log datasets
- Remove forceMount prop from DropdownMenuContent - Allows Radix to mount content only when dropdown is open - Reduces unnecessary DOM nodes when dropdown is closed - Improves performance by using default Radix behavior
- Store viewport element in ref instead of repeated querySelector calls - Move getBoundingClientRect calls from render to useLayoutEffect - Use ResizeObserver to update picker positions reactively - Eliminates 120+ querySelector calls during message submit polling - Prevents forced layout during React render phase
- Replace width animation with translateX for GPU acceleration - Set fixed width on panel and animate x position instead - Prevents layout recalculation on every animation frame - Runs on compositor thread without triggering reflow
…etter performance - Replace transition-all with transition-[width] in Sidebar.tsx for width animations - Replace transition-all with specific properties in animated-tabs.tsx for hover/active indicators - Replace transition-all with transition-[background-color,border-color,box-shadow] in navbar.tsx - Replace transition-all with transition-[width] in audio.tsx volume bar - Replace transition-all with transition-[background-color,border-color,color] in thread.tsx - Replace transition-all with transition-[box-shadow] in all tool-ui status cards (28+ files) This reduces unnecessary browser layout/paint work by only animating the specific properties that change, avoiding expensive recalculations for properties like width, height, margin, and padding that don't need animation. Fixes #1147
Convert MobileEditorPanel, MobileHitlEditPanel, and MobileReportPanel from static imports to dynamic imports with ssr: false. These panels pull in heavy dependencies (PlateEditor, MarkdownViewer) that are only needed when users interact with them on mobile. Benefits: - Reduces initial bundle size for chat page - Mobile panels load only when opened by user - Faster initial page load and Time to Interactive - Heavy editor dependencies are code-split into separate chunks Fixes #1146
Convert GenerateVideoPresentationToolUI from static import to dynamic import with ssr: false in public-thread.tsx. This prevents Remotion and @babel/standalone from being bundled in the public chat page. The main app's assistant-message.tsx already correctly lazy-loads this component, but the public thread was still using a static import, unnecessarily increasing the bundle size for public shared chats. Benefits: - Removes Remotion and @babel/standalone from public chat bundle - Reduces initial bundle size for public shared chats - Video presentations still render correctly when present - Faster page load for users viewing public chats Fixes #1145
Remove unused 'is' import from drizzle-orm in markdown-viewer.tsx (line 5). This import was never used in the file and unnecessarily dragged ORM code into the UI component's bundle chunk. Benefits: - Removes drizzle-orm from markdown-viewer bundle chunk - Reduces bundle size for components using MarkdownViewer - Cleaner imports with no unused dependencies - Markdown viewer functionality unchanged Fixes #1144
Replace static imports of all 5 locale JSON files with dynamic imports. Only English is bundled by default, other locales (es, hi, pt, zh) load on demand when the user switches languages. Also removes unused 'set' import from zod (line 5) that was dragging Zod surface into this module unnecessarily. Changes: - Removed static imports for es, hi, pt, zh locale files - Removed unused zod import - Added loadMessages() function for dynamic locale loading - Updated setLocale() to load messages asynchronously - Added useEffect to load non-English locale on mount if stored Benefits: - Only active locale's JSON in initial bundle (English default) - 80% reduction in locale data in initial bundle - Other locale files load on demand (~50-100KB each) - Removed unnecessary zod dependency from module - Locale switching still works seamlessly - Faster initial page load Fixes #1143
- Replace 23 static connector config imports with dynamic imports - Replace 10 static connect form imports with dynamic imports - Add component caching to avoid recreating dynamic components - Significantly reduces connector popup chunk size - Only selected connector components load on demand
- Replace 6 static imports in user-settings-dialog with dynamic imports - Replace 8 static imports in search-space-settings-dialog with dynamic imports - Each settings tab loads content only when selected - Reduces initial settings dialog bundle size - All tab functionality preserved
- Replace 20+ static tool UI imports with dynamic imports - Dynamically load: Confluence, Dropbox, Gmail, Google Calendar, Google Drive, OneDrive, Jira, Linear, Notion, Generate Image, Generate Report, Generate Podcast, Generate Video Presentation, Sandbox Execute, User Memory - Dramatically reduces chat page initial bundle size - Tool UIs load on demand when assistant uses them - ToolFallback remains synchronous as fallback component
- Added a check in the desktop release workflow to ensure version tags follow semantic versioning (semver) format. - Enhanced the auto-updater to log a message and skip updates if the app version is not valid semver. - Improved type definitions for event handlers in the auto-updater for better TypeScript support.
- Changed the method of retrieving the app version in the Docker build workflow from the pyproject.toml file to the VERSION file for improved consistency and reliability. - Updated error messaging to reflect the new source of the app version.
…essary-use-client-directives fix: remove unnecessary use client directives
…lete-attributes Fix/add autocomplete attributes
…s-message-filter fix: debounce logs message filter
…mount-from-user-dropdown fix: remove forcemount from user dropdown
…ype in folder.types
…ion.div properties in SidebarSlideOutPanel
…ring folder synchronization
…hance watched folder ID retrieval in DocumentsSidebar
…in FolderTreeView
…ion during local folder indexing
…lder structure handling in UI components
…val and optimizing empty folder cleanup process
…and enhance UI component styling for folder selection
…e for improved document organization
… process and enhance related test coverage
…or document upload and folder watch functionalities
fix: harden folder watch feature with file hash dedup, mtime seeding, and stable spinner
…lient-side rendering
chore: various fixes
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Review by RecurseML
🔍 Review performed on c77098a..edd226c
✨ No bugs found, your code is sparkling clean
✅ Files analyzed, no issues (49)
• .github/workflows/desktop-release.yml
• .github/workflows/docker-build.yml
• VERSION
• scripts/bump-version.ps1
• scripts/bump-version.sh
• surfsense_backend/app/db.py
• surfsense_backend/app/indexing_pipeline/connector_document.py
• surfsense_backend/app/indexing_pipeline/indexing_pipeline_service.py
• surfsense_backend/app/routes/documents_routes.py
• surfsense_backend/app/tasks/celery_tasks/document_tasks.py
• surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py
• surfsense_backend/pyproject.toml
• surfsense_backend/tests/integration/indexing_pipeline/test_local_folder_pipeline.py
• surfsense_browser_extension/package.json
• surfsense_desktop/package.json
• surfsense_desktop/src/ipc/channels.ts
• surfsense_desktop/src/ipc/handlers.ts
• surfsense_desktop/src/modules/auto-updater.ts
• surfsense_desktop/src/modules/folder-watcher.ts
• surfsense_desktop/src/preload.ts
• surfsense_web/app/(home)/login/LocalLoginForm.tsx
• surfsense_web/app/(home)/login/page.tsx
• surfsense_web/app/(home)/register/page.tsx
• surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx
• surfsense_web/app/dashboard/[search_space_id]/logs/loading.tsx
• surfsense_web/app/dashboard/[search_space_id]/user-settings/components/ProfileContent.tsx
• surfsense_web/app/desktop/suggestion/page.tsx
• surfsense_web/components/UserDropdown.tsx
• surfsense_web/components/assistant-ui/assistant-message.tsx
• surfsense_web/components/assistant-ui/connector-popup/components/connector-dialog-header.tsx
• surfsense_web/components/assistant-ui/connector-popup/connect-forms/index.tsx
• surfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsx
• surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
• surfsense_web/components/assistant-ui/connector-popup/utils/connector-document-mapping.ts
• surfsense_web/components/assistant-ui/document-upload-popup.tsx
• surfsense_web/components/assistant-ui/thread.tsx
• surfsense_web/components/assistant-ui/tooltip-icon-button.tsx
• surfsense_web/components/documents/FolderNode.tsx
• surfsense_web/components/documents/FolderTreeView.tsx
• surfsense_web/components/homepage/hero-section.tsx
• surfsense_web/components/homepage/navbar.tsx
• surfsense_web/components/homepage/why-surfsense.tsx
• surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx
• surfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsx
• surfsense_web/components/layout/ui/sidebar/Sidebar.tsx
• surfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsx
• surfsense_web/components/layout/ui/tabs/DocumentTabContent.tsx
• surfsense_web/components/markdown-viewer.tsx
• surfsense_web/components/new-chat/chat-share-button.tsx
⏭️ Files skipped (52)
| Locations |
|---|
surfsense_backend/uv.lock |
surfsense_web/components/new-chat/model-selector.tsx |
surfsense_web/components/pricing/pricing-section.tsx |
surfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsx |
surfsense_web/components/public-chat/public-thread.tsx |
surfsense_web/components/settings/image-model-manager.tsx |
surfsense_web/components/settings/model-config-manager.tsx |
surfsense_web/components/settings/search-space-settings-dialog.tsx |
surfsense_web/components/settings/user-settings-dialog.tsx |
surfsense_web/components/sources/DocumentUploadTab.tsx |
surfsense_web/components/sources/FolderWatchDialog.tsx |
surfsense_web/components/tool-ui/audio.tsx |
surfsense_web/components/tool-ui/confluence/create-confluence-page.tsx |
surfsense_web/components/tool-ui/confluence/delete-confluence-page.tsx |
surfsense_web/components/tool-ui/confluence/update-confluence-page.tsx |
surfsense_web/components/tool-ui/dropbox/create-file.tsx |
surfsense_web/components/tool-ui/dropbox/trash-file.tsx |
surfsense_web/components/tool-ui/generate-report.tsx |
surfsense_web/components/tool-ui/gmail/create-draft.tsx |
surfsense_web/components/tool-ui/gmail/send-email.tsx |
surfsense_web/components/tool-ui/gmail/trash-email.tsx |
surfsense_web/components/tool-ui/gmail/update-draft.tsx |
surfsense_web/components/tool-ui/google-calendar/create-event.tsx |
surfsense_web/components/tool-ui/google-calendar/delete-event.tsx |
surfsense_web/components/tool-ui/google-calendar/update-event.tsx |
surfsense_web/components/tool-ui/google-drive/create-file.tsx |
surfsense_web/components/tool-ui/google-drive/trash-file.tsx |
surfsense_web/components/tool-ui/jira/create-jira-issue.tsx |
surfsense_web/components/tool-ui/jira/delete-jira-issue.tsx |
surfsense_web/components/tool-ui/jira/update-jira-issue.tsx |
surfsense_web/components/tool-ui/linear/create-linear-issue.tsx |
surfsense_web/components/tool-ui/linear/delete-linear-issue.tsx |
surfsense_web/components/tool-ui/linear/update-linear-issue.tsx |
surfsense_web/components/tool-ui/notion/create-notion-page.tsx |
surfsense_web/components/tool-ui/notion/delete-notion-page.tsx |
surfsense_web/components/tool-ui/notion/update-notion-page.tsx |
surfsense_web/components/tool-ui/onedrive/create-file.tsx |
surfsense_web/components/tool-ui/onedrive/trash-file.tsx |
surfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsx |
surfsense_web/components/ui/animated-tabs.tsx |
surfsense_web/contexts/LocaleContext.tsx |
surfsense_web/contracts/types/folder.types.ts |
surfsense_web/hooks/use-folder-sync.ts |
surfsense_web/instrumentation-client.ts |
surfsense_web/lib/apis/documents-api.service.ts |
surfsense_web/lib/folder-sync-upload.ts |
surfsense_web/package.json |
surfsense_web/public/homepage/hero_tutorial/extreme_assist.gif |
surfsense_web/public/homepage/hero_tutorial/general_assist.gif |
surfsense_web/public/homepage/hero_tutorial/quick_assist.gif |
surfsense_web/types/window.d.ts |
surfsense_web/zero/schema/folders.ts |
Description
Motivation and Context
FIX #
Screenshots
API Changes
Change Type
Testing Performed
Checklist
High-level PR Summary
This PR introduces centralized version management through a new
VERSIONfile and automated bump scripts, streamlines local folder syncing in the desktop app by replacing filesystem-based indexing with an upload-based approach that works across all deployment modes, and includes various fixes including database relationship improvements, performance optimizations through code splitting and dynamic imports, UI/UX enhancements, and accessibility improvements across the web frontend.⏱️ Estimated Review Time: 30-90 minutes
💡 Review Order Suggestion
VERSIONscripts/bump-version.shscripts/bump-version.ps1.github/workflows/desktop-release.yml.github/workflows/docker-build.ymlsurfsense_backend/pyproject.tomlsurfsense_browser_extension/package.jsonsurfsense_desktop/package.jsonsurfsense_web/package.jsonsurfsense_desktop/src/ipc/channels.tssurfsense_desktop/src/modules/folder-watcher.tssurfsense_desktop/src/ipc/handlers.tssurfsense_desktop/src/preload.tssurfsense_web/types/window.d.tssurfsense_web/lib/folder-sync-upload.tssurfsense_backend/app/routes/documents_routes.pysurfsense_backend/app/tasks/celery_tasks/document_tasks.pysurfsense_backend/app/tasks/connector_indexers/local_folder_indexer.pysurfsense_backend/app/indexing_pipeline/connector_document.pysurfsense_backend/app/indexing_pipeline/indexing_pipeline_service.pysurfsense_web/lib/apis/documents-api.service.tssurfsense_web/hooks/use-folder-sync.tssurfsense_web/components/sources/FolderWatchDialog.tsxsurfsense_web/components/layout/ui/sidebar/DocumentsSidebar.tsxsurfsense_web/components/documents/FolderNode.tsxsurfsense_web/components/documents/FolderTreeView.tsxsurfsense_web/zero/schema/folders.tssurfsense_backend/app/db.pysurfsense_backend/tests/integration/indexing_pipeline/test_local_folder_pipeline.pysurfsense_desktop/src/modules/auto-updater.tssurfsense_web/components/assistant-ui/thread.tsxsurfsense_web/components/assistant-ui/assistant-message.tsxsurfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsxsurfsense_web/components/assistant-ui/connector-popup/connector-configs/index.tsxsurfsense_web/components/assistant-ui/connector-popup/connect-forms/index.tsxsurfsense_web/components/settings/search-space-settings-dialog.tsxsurfsense_web/components/settings/user-settings-dialog.tsxsurfsense_web/components/public-chat/public-thread.tsxsurfsense_web/contexts/LocaleContext.tsxsurfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsxsurfsense_web/app/dashboard/[search_space_id]/logs/loading.tsxsurfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsxsurfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsxsurfsense_web/components/layout/ui/sidebar/Sidebar.tsxsurfsense_web/components/layout/ui/tabs/DocumentTabContent.tsxsurfsense_web/components/UserDropdown.tsxsurfsense_web/app/(home)/login/page.tsxsurfsense_web/components/assistant-ui/tooltip-icon-button.tsxsurfsense_web/components/new-chat/model-selector.tsxsurfsense_web/components/new-chat/chat-share-button.tsxsurfsense_web/components/public-chat-snapshots/public-chat-snapshots-manager.tsxsurfsense_web/components/settings/image-model-manager.tsxsurfsense_web/components/settings/model-config-manager.tsxsurfsense_web/components/ui/animated-tabs.tsxsurfsense_web/components/homepage/navbar.tsxsurfsense_web/app/(home)/login/LocalLoginForm.tsxsurfsense_web/app/(home)/register/page.tsxsurfsense_web/app/dashboard/[search_space_id]/user-settings/components/ProfileContent.tsxsurfsense_web/app/desktop/suggestion/page.tsxsurfsense_web/components/assistant-ui/document-upload-popup.tsxsurfsense_web/components/sources/DocumentUploadTab.tsxsurfsense_web/components/assistant-ui/connector-popup/components/connector-dialog-header.tsxsurfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsxsurfsense_web/components/assistant-ui/connector-popup/utils/connector-document-mapping.tssurfsense_web/components/homepage/hero-section.tsxsurfsense_web/components/homepage/why-surfsense.tsxsurfsense_web/components/pricing/pricing-section.tsxsurfsense_web/components/markdown-viewer.tsxsurfsense_web/contracts/types/folder.types.tssurfsense_web/instrumentation-client.tssurfsense_web/components/tool-ui/audio.tsxsurfsense_web/components/tool-ui/confluence/create-confluence-page.tsxsurfsense_web/components/tool-ui/confluence/delete-confluence-page.tsxsurfsense_web/components/tool-ui/confluence/update-confluence-page.tsxsurfsense_web/components/tool-ui/dropbox/create-file.tsxsurfsense_web/components/tool-ui/dropbox/trash-file.tsxsurfsense_web/components/tool-ui/generate-report.tsxsurfsense_web/components/tool-ui/gmail/create-draft.tsxsurfsense_web/components/tool-ui/gmail/send-email.tsxsurfsense_web/components/tool-ui/gmail/trash-email.tsxsurfsense_web/components/tool-ui/gmail/update-draft.tsxsurfsense_web/components/tool-ui/google-calendar/create-event.tsxsurfsense_web/components/tool-ui/google-calendar/delete-event.tsxsurfsense_web/components/tool-ui/google-calendar/update-event.tsxsurfsense_web/components/tool-ui/google-drive/create-file.tsxsurfsense_web/components/tool-ui/google-drive/trash-file.tsxsurfsense_web/components/tool-ui/jira/create-jira-issue.tsxsurfsense_web/components/tool-ui/jira/delete-jira-issue.tsxsurfsense_web/components/tool-ui/jira/update-jira-issue.tsxsurfsense_web/components/tool-ui/linear/create-linear-issue.tsxsurfsense_web/components/tool-ui/linear/delete-linear-issue.tsxsurfsense_web/components/tool-ui/linear/update-linear-issue.tsxsurfsense_web/components/tool-ui/notion/create-notion-page.tsxsurfsense_web/components/tool-ui/notion/delete-notion-page.tsxsurfsense_web/components/tool-ui/notion/update-notion-page.tsxsurfsense_web/components/tool-ui/onedrive/create-file.tsxsurfsense_web/components/tool-ui/onedrive/trash-file.tsxsurfsense_web/components/tool-ui/video-presentation/generate-video-presentation.tsxsurfsense_web/public/homepage/hero_tutorial/extreme_assist.gifsurfsense_web/public/homepage/hero_tutorial/general_assist.gifsurfsense_web/public/homepage/hero_tutorial/quick_assist.gifsurfsense_backend/uv.lock