feat: Google Drive HITL tools, team management UI, Daytona sandboxes, indexing pipeline hardening & test infrastructure#840
Conversation
…n behavior in team management and breadcrumb components
… and enhancing UI components for better user experience
…nt and connector popup components
…proved user experience
…ct-none class for improved text selection behavior
…d components for improved user information display
… improving layout for shared and private chats
…mproved text selection behavior
…istency and responsiveness
…nd maintainability
- Introduced a new test class to verify that uploaded documents appear in search results once their status is ready. - Implemented assertions to ensure the uploaded document's ID is present in the search response.
feat: add document upload E2E tests
- Introduced a TaskDispatcher abstraction to decouple the upload endpoint from Celery, allowing for easier testing with synchronous implementations. - Updated the create_documents_file_upload function to utilize the new dispatcher for task management. - Removed direct Celery task imports from the upload function, enhancing modularity. - Added integration tests for document upload, including page limit enforcement and file size restrictions.
- Removed commented-out testing configuration from .env.example to streamline the file. - Updated markers in pyproject.toml to remove the e2e test marker, clarifying the purpose of the remaining markers.
…ation - Updated the embedding dimension in test configurations to use the value from the application config, enhancing maintainability and consistency across tests.
…integration tests
- Introduced slow callback logging in FastAPI to identify blocking calls. - Added performance logging for agent creation and tool loading processes. - Implemented caching for MCP tools to reduce redundant server calls. - Enhanced sandbox management with in-process caching for improved efficiency. - Refactored several functions for better readability and performance tracking. - Updated tests to ensure proper functionality of new features and optimizations.
… layout - Introduced SidebarSeparator component for improved sidebar organization. - Updated layout configuration to utilize the new SidebarSeparator in the documentation layout.
fix: enhanced document upload, page limit, upload limit tests
- Replaced direct embedding calls with a utility function across various components to streamline embedding logic. - Added enable_summary flag to several models and routes to control summary generation behavior.
|
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 af3810b..6f4bf11
| Severity | Location | Issue | Delete |
|---|---|---|---|
| surfsense_backend/app/routes/documents_routes.py:305 | Missing parameter causes TypeError |
✅ Files analyzed, no issues (49)
• .cursor/skills/tdd/SKILL.md
• .cursor/skills/tdd/deep-modules.md
• .cursor/skills/tdd/interface-design.md
• .cursor/skills/tdd/mocking.md
• .cursor/skills/tdd/refactoring.md
• .cursor/skills/tdd/tests.md
• Dockerfile.allinone
• docker-compose.yml
• scripts/docker/entrypoint-allinone.sh
• surfsense_backend/.env.example
• surfsense_backend/.gitignore
• surfsense_backend/alembic/versions/102_add_enable_summary_to_connectors.py
• surfsense_backend/app/agents/new_chat/chat_deepagent.py
• surfsense_backend/app/agents/new_chat/sandbox.py
• surfsense_backend/app/agents/new_chat/system_prompt.py
• surfsense_backend/app/agents/new_chat/tools/google_drive/__init__.py
• surfsense_backend/app/agents/new_chat/tools/google_drive/create_file.py
• surfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.py
• surfsense_backend/app/agents/new_chat/tools/mcp_tool.py
• surfsense_backend/app/agents/new_chat/tools/registry.py
• surfsense_backend/app/agents/new_chat/tools/search_surfsense_docs.py
• surfsense_backend/app/agents/new_chat/tools/shared_memory.py
• surfsense_backend/app/agents/new_chat/tools/user_memory.py
• surfsense_backend/app/app.py
• surfsense_backend/app/connectors/composio_gmail_connector.py
• surfsense_backend/app/connectors/composio_google_calendar_connector.py
• surfsense_backend/app/connectors/composio_google_drive_connector.py
• surfsense_backend/app/connectors/google_drive/client.py
• surfsense_backend/app/db.py
• surfsense_backend/app/indexing_pipeline/adapters/file_upload_adapter.py
• surfsense_backend/app/indexing_pipeline/connector_document.py
• surfsense_backend/app/indexing_pipeline/document_chunker.py
• surfsense_backend/app/indexing_pipeline/document_embedder.py
• surfsense_backend/app/indexing_pipeline/document_hashing.py
• surfsense_backend/app/indexing_pipeline/document_persistence.py
• surfsense_backend/app/indexing_pipeline/document_summarizer.py
• surfsense_backend/app/indexing_pipeline/exceptions.py
• surfsense_backend/app/indexing_pipeline/indexing_pipeline_service.py
• surfsense_backend/app/indexing_pipeline/pipeline_logger.py
• surfsense_backend/app/routes/__init__.py
• surfsense_backend/app/routes/google_drive_add_connector_route.py
• surfsense_backend/app/routes/new_chat_routes.py
• surfsense_backend/app/routes/reports_routes.py
• surfsense_backend/app/routes/sandbox_routes.py
• surfsense_backend/app/routes/search_source_connectors_routes.py
• surfsense_backend/app/schemas/documents.py
• surfsense_backend/app/schemas/podcasts.py
• surfsense_backend/app/schemas/search_source_connector.py
• surfsense_backend/app/services/connector_service.py
⏭️ Files skipped (132)
| Locations |
|---|
surfsense_backend/app/indexing_pipeline/__init__.py |
surfsense_backend/app/indexing_pipeline/adapters/__init__.py |
surfsense_backend/app/services/google_drive/__init__.py |
surfsense_backend/app/services/google_drive/tool_metadata_service.py |
surfsense_backend/app/services/linear/kb_sync_service.py |
surfsense_backend/app/services/llm_router_service.py |
surfsense_backend/app/services/notion/kb_sync_service.py |
surfsense_backend/app/services/task_dispatcher.py |
surfsense_backend/app/tasks/celery_tasks/document_tasks.py |
surfsense_backend/app/tasks/chat/stream_new_chat.py |
surfsense_backend/app/tasks/connector_indexers/airtable_indexer.py |
surfsense_backend/app/tasks/connector_indexers/bookstack_indexer.py |
surfsense_backend/app/tasks/connector_indexers/clickup_indexer.py |
surfsense_backend/app/tasks/connector_indexers/confluence_indexer.py |
surfsense_backend/app/tasks/connector_indexers/discord_indexer.py |
surfsense_backend/app/tasks/connector_indexers/github_indexer.py |
surfsense_backend/app/tasks/connector_indexers/google_calendar_indexer.py |
surfsense_backend/app/tasks/connector_indexers/google_drive_indexer.py |
surfsense_backend/app/tasks/connector_indexers/google_gmail_indexer.py |
surfsense_backend/app/tasks/connector_indexers/jira_indexer.py |
surfsense_backend/app/tasks/connector_indexers/linear_indexer.py |
surfsense_backend/app/tasks/connector_indexers/luma_indexer.py |
surfsense_backend/app/tasks/connector_indexers/notion_indexer.py |
surfsense_backend/app/tasks/connector_indexers/obsidian_indexer.py |
surfsense_backend/app/tasks/connector_indexers/slack_indexer.py |
surfsense_backend/app/tasks/connector_indexers/teams_indexer.py |
surfsense_backend/app/tasks/connector_indexers/webcrawler_indexer.py |
surfsense_backend/app/tasks/document_processors/file_processors.py |
surfsense_backend/app/tasks/surfsense_docs_indexer.py |
surfsense_backend/app/utils/document_converters.py |
surfsense_backend/main.py |
surfsense_backend/pyproject.toml |
surfsense_backend/tests/__init__.py |
surfsense_backend/tests/conftest.py |
surfsense_backend/tests/fixtures/empty.pdf |
surfsense_backend/tests/fixtures/sample.md |
surfsense_backend/tests/fixtures/sample.txt |
surfsense_backend/tests/integration/__init__.py |
surfsense_backend/tests/integration/conftest.py |
surfsense_backend/tests/integration/document_upload/__init__.py |
surfsense_backend/tests/integration/document_upload/conftest.py |
surfsense_backend/tests/integration/document_upload/test_document_upload.py |
surfsense_backend/tests/integration/document_upload/test_page_limits.py |
surfsense_backend/tests/integration/document_upload/test_upload_limits.py |
surfsense_backend/tests/integration/indexing_pipeline/__init__.py |
surfsense_backend/tests/integration/indexing_pipeline/adapters/__init__.py |
surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py |
surfsense_backend/tests/integration/indexing_pipeline/test_index_document.py |
surfsense_backend/tests/integration/indexing_pipeline/test_prepare_for_indexing.py |
surfsense_backend/tests/unit/__init__.py |
surfsense_backend/tests/unit/adapters/__init__.py |
surfsense_backend/tests/unit/indexing_pipeline/__init__.py |
surfsense_backend/tests/unit/indexing_pipeline/conftest.py |
surfsense_backend/tests/unit/indexing_pipeline/test_connector_document.py |
surfsense_backend/tests/unit/indexing_pipeline/test_document_chunker.py |
surfsense_backend/tests/unit/indexing_pipeline/test_document_hashing.py |
surfsense_backend/tests/unit/indexing_pipeline/test_document_summarizer.py |
surfsense_backend/tests/utils/__init__.py |
surfsense_backend/tests/utils/helpers.py |
surfsense_backend/uv.lock |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentTypeIcon.tsx |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsx |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsx |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsx |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/types.ts |
surfsense_web/app/dashboard/[search_space_id]/documents/(manage)/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/logs/(manage)/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/onboard/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/settings/page.tsx |
surfsense_web/app/dashboard/[search_space_id]/team/page.tsx |
surfsense_web/app/docs/layout.tsx |
surfsense_web/app/docs/sidebar-separator.tsx |
surfsense_web/app/globals.css |
surfsense_web/app/layout.config.tsx |
surfsense_web/components/assistant-ui/connector-popup.tsx |
surfsense_web/components/assistant-ui/connector-popup/components/summary-config.tsx |
surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx |
surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/indexing-configuration-view.tsx |
surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.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/dashboard-breadcrumb.tsx |
surfsense_web/components/icons/providers/xai.svg |
surfsense_web/components/layout/providers/LayoutDataProvider.tsx |
surfsense_web/components/layout/ui/dialogs/CreateSearchSpaceDialog.tsx |
surfsense_web/components/layout/ui/shell/LayoutShell.tsx |
surfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsx |
surfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsx |
surfsense_web/components/layout/ui/sidebar/ChatListItem.tsx |
surfsense_web/components/layout/ui/sidebar/InboxSidebar.tsx |
surfsense_web/components/layout/ui/sidebar/MobileSidebar.tsx |
surfsense_web/components/layout/ui/sidebar/Sidebar.tsx |
surfsense_web/components/layout/ui/sidebar/SidebarHeader.tsx |
surfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsx |
surfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsx |
surfsense_web/components/new-chat/chat-share-button.tsx |
surfsense_web/components/new-chat/model-selector.tsx |
surfsense_web/components/public-chat-snapshots/public-chat-snapshot-row.tsx |
surfsense_web/components/report-panel/report-panel.tsx |
surfsense_web/components/settings/roles-manager.tsx |
surfsense_web/components/sources/DocumentUploadTab.tsx |
surfsense_web/components/tool-ui/google-drive/create-file.tsx |
surfsense_web/components/tool-ui/google-drive/index.ts |
surfsense_web/components/tool-ui/google-drive/trash-file.tsx |
surfsense_web/components/tool-ui/index.ts |
surfsense_web/components/tool-ui/sandbox-execute.tsx |
surfsense_web/components/ui/expanded-gif-overlay.tsx |
surfsense_web/components/ui/hero-carousel.tsx |
surfsense_web/content/docs/connectors/meta.json |
surfsense_web/content/docs/docker-installation.mdx |
surfsense_web/content/docs/how-to/meta.json |
surfsense_web/content/docs/index.mdx |
surfsense_web/content/docs/installation.mdx |
surfsense_web/content/docs/manual-installation.mdx |
surfsense_web/content/docs/meta.json |
surfsense_web/content/docs/testing.mdx |
surfsense_web/contracts/types/connector.types.ts |
surfsense_web/contracts/types/document.types.ts |
surfsense_web/hooks/use-documents.ts |
surfsense_web/lib/apis/documents-api.service.ts |
surfsense_web/lib/electric/client.ts |
surfsense_web/lib/provider-icons.tsx |
surfsense_web/lib/source.ts |
surfsense_web/messages/en.json |
surfsense_web/messages/es.json |
surfsense_web/messages/hi.json |
surfsense_web/messages/pt.json |
surfsense_web/messages/zh.json |
surfsense_web/pnpm-lock.yaml |
| filename=filename, | ||
| search_space_id=search_space_id, | ||
| user_id=str(user.id), | ||
| should_summarize=should_summarize, |
There was a problem hiding this comment.
Runtime TypeError: dispatch_file_processing() got an unexpected keyword argument 'should_summarize'
The documents upload endpoint at line 305 passes should_summarize=should_summarize to dispatcher.dispatch_file_processing(), but the TaskDispatcher protocol and CeleryTaskDispatcher implementation in app/services/task_dispatcher.py do NOT include this parameter in their signatures (lines 13-21 and 27-46).
The protocol defines:
class TaskDispatcher(Protocol):
async def dispatch_file_processing(
self,
*,
document_id: int,
temp_path: str,
filename: str,
search_space_id: int,
user_id: str,
) -> None: ... # NO should_summarizeAnd the implementation doesn't accept it either:
class CeleryTaskDispatcher:
async def dispatch_file_processing(
self,
*,
document_id: int,
temp_path: str,
filename: str,
search_space_id: int,
user_id: str,
) -> None: # NO should_summarizeEven though the underlying Celery task process_file_upload_with_document_task accepts should_summarize, the dispatcher layer blocks it from being passed through.
This will crash on EVERY file upload when users try to upload documents with the new should_summarize parameter (line 122 adds it as a Form parameter).
Error that will occur:
TypeError: dispatch_file_processing() got an unexpected keyword argument 'should_summarize'
Fix needed: Add should_summarize: bool = False parameter to both the TaskDispatcher protocol and CeleryTaskDispatcher.dispatch_file_processing() method, and pass it through to the Celery task.
React with 👍 to tell me that this comment was useful, or 👎 if not (and I'll stop posting more comments like this in the future)
- Introduced should_summarize parameter in TaskDispatcher and CeleryTaskDispatcher to control summary generation. - Updated InlineTaskDispatcher to support the new parameter for document processing.
- Introduced dynamic character budget calculation for document formatting based on model's context window. - Updated `format_documents_for_context` to respect character limits and improve output quality. - Added `max_input_tokens` parameter to various functions to facilitate context-aware processing. - Enhanced error handling for context overflow in LLM router service.
select-noneacross interactive elements, and file-upload tooltip enhancements (@AnishSarkar22)IntegrityErrorrecovery, persistence helpers extraction, file-upload adapter, and fallback document summary (@CREDO23)Description
Motivation and Context
FIX #
Screenshots
API Changes
Change Type
Testing Performed
Checklist
High-level PR Summary
This PR introduces five major feature areas: Google Drive HITL tools for creating and deleting files with OAuth reauth flow and UI components; Daytona sandbox integration replacing microsandbox to provide isolated code execution with local file persistence; indexing pipeline hardening with structured error handling, per-document error isolation,
IntegrityErrorrecovery, and opt-in LLM-based summary generation viaenable_summaryflag; comprehensive pytest test infrastructure with unit and integration tests for document hashing, indexing, upload workflows, and page-limit enforcement; and team management UI improvements including role management with pagination, chat rename dialogs, mobile sidebar enhancements, and updated icons/styling. Additional changes include performance logging, MCP tool caching, dependency updates, and linting cleanup.⏱️ Estimated Review Time: 3+ hours
💡 Review Order Suggestion
surfsense_backend/.env.examplesurfsense_backend/pyproject.tomlDockerfile.allinonedocker-compose.ymlscripts/docker/entrypoint-allinone.shsurfsense_backend/alembic/versions/102_add_enable_summary_to_connectors.pysurfsense_backend/app/db.pysurfsense_backend/app/schemas/search_source_connector.pysurfsense_web/contracts/types/connector.types.tssurfsense_backend/app/indexing_pipeline/connector_document.pysurfsense_backend/app/indexing_pipeline/document_hashing.pysurfsense_backend/app/indexing_pipeline/exceptions.pysurfsense_backend/app/indexing_pipeline/document_summarizer.pysurfsense_backend/app/indexing_pipeline/document_chunker.pysurfsense_backend/app/indexing_pipeline/document_embedder.pysurfsense_backend/app/indexing_pipeline/document_persistence.pysurfsense_backend/app/indexing_pipeline/pipeline_logger.pysurfsense_backend/app/indexing_pipeline/indexing_pipeline_service.pysurfsense_backend/app/indexing_pipeline/adapters/file_upload_adapter.pysurfsense_backend/app/utils/document_converters.pysurfsense_backend/app/tasks/connector_indexers/google_drive_indexer.pysurfsense_backend/app/tasks/connector_indexers/airtable_indexer.pysurfsense_backend/app/tasks/connector_indexers/bookstack_indexer.pysurfsense_backend/app/tasks/connector_indexers/clickup_indexer.pysurfsense_backend/app/tasks/connector_indexers/confluence_indexer.pysurfsense_backend/app/tasks/connector_indexers/github_indexer.pysurfsense_backend/app/tasks/connector_indexers/google_calendar_indexer.pysurfsense_backend/app/tasks/connector_indexers/google_gmail_indexer.pysurfsense_backend/app/tasks/connector_indexers/jira_indexer.pysurfsense_backend/app/tasks/connector_indexers/linear_indexer.pysurfsense_backend/app/tasks/connector_indexers/luma_indexer.pysurfsense_backend/app/tasks/connector_indexers/notion_indexer.pysurfsense_backend/app/tasks/connector_indexers/obsidian_indexer.pysurfsense_backend/app/tasks/connector_indexers/slack_indexer.pysurfsense_backend/app/tasks/connector_indexers/teams_indexer.pysurfsense_backend/app/tasks/connector_indexers/webcrawler_indexer.pysurfsense_backend/app/tasks/document_processors/file_processors.pysurfsense_backend/app/tasks/surfsense_docs_indexer.pysurfsense_backend/app/connectors/composio_gmail_connector.pysurfsense_backend/app/connectors/composio_google_calendar_connector.pysurfsense_backend/app/connectors/composio_google_drive_connector.pysurfsense_backend/app/services/notion/kb_sync_service.pysurfsense_backend/app/services/linear/kb_sync_service.pysurfsense_backend/app/connectors/google_drive/client.pysurfsense_backend/app/services/google_drive/tool_metadata_service.pysurfsense_backend/app/agents/new_chat/tools/google_drive/create_file.pysurfsense_backend/app/agents/new_chat/tools/google_drive/trash_file.pysurfsense_backend/app/routes/google_drive_add_connector_route.pysurfsense_web/components/tool-ui/google-drive/create-file.tsxsurfsense_web/components/tool-ui/google-drive/trash-file.tsxsurfsense_backend/app/agents/new_chat/sandbox.pysurfsense_backend/app/routes/sandbox_routes.pysurfsense_backend/app/agents/new_chat/system_prompt.pysurfsense_backend/app/agents/new_chat/chat_deepagent.pysurfsense_backend/app/tasks/chat/stream_new_chat.pysurfsense_web/components/tool-ui/sandbox-execute.tsxsurfsense_backend/app/agents/new_chat/tools/mcp_tool.pysurfsense_backend/app/agents/new_chat/tools/registry.pysurfsense_backend/app/routes/search_source_connectors_routes.pysurfsense_web/components/assistant-ui/connector-popup/components/summary-config.tsxsurfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsxsurfsense_web/components/assistant-ui/connector-popup/connector-configs/views/indexing-configuration-view.tsxsurfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.tssurfsense_backend/app/services/task_dispatcher.pysurfsense_backend/app/routes/documents_routes.pysurfsense_web/components/assistant-ui/document-upload-popup.tsxsurfsense_web/components/assistant-ui/thread.tsxsurfsense_web/components/sources/DocumentUploadTab.tsxsurfsense_backend/app/agents/new_chat/tools/search_surfsense_docs.pysurfsense_backend/app/agents/new_chat/tools/shared_memory.pysurfsense_backend/app/agents/new_chat/tools/user_memory.pysurfsense_backend/app/services/llm_router_service.pysurfsense_backend/app/services/connector_service.pysurfsense_backend/app/app.pysurfsense_backend/main.pysurfsense_backend/app/routes/new_chat_routes.pysurfsense_web/app/dashboard/[search_space_id]/new-chat/[[...chat_id]]/page.tsx.cursor/skills/tdd/SKILL.md.cursor/skills/tdd/deep-modules.md.cursor/skills/tdd/interface-design.md.cursor/skills/tdd/mocking.md.cursor/skills/tdd/refactoring.md.cursor/skills/tdd/tests.mdsurfsense_backend/tests/conftest.pysurfsense_backend/tests/unit/indexing_pipeline/conftest.pysurfsense_backend/tests/unit/indexing_pipeline/test_connector_document.pysurfsense_backend/tests/unit/indexing_pipeline/test_document_hashing.pysurfsense_backend/tests/unit/indexing_pipeline/test_document_chunker.pysurfsense_backend/tests/unit/indexing_pipeline/test_document_summarizer.pysurfsense_backend/tests/integration/conftest.pysurfsense_backend/tests/integration/indexing_pipeline/test_prepare_for_indexing.pysurfsense_backend/tests/integration/indexing_pipeline/test_index_document.pysurfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.pysurfsense_backend/tests/integration/document_upload/conftest.pysurfsense_backend/tests/integration/document_upload/test_document_upload.pysurfsense_backend/tests/integration/document_upload/test_page_limits.pysurfsense_backend/tests/integration/document_upload/test_upload_limits.pysurfsense_backend/tests/utils/helpers.pysurfsense_web/components/settings/roles-manager.tsxsurfsense_web/app/dashboard/[search_space_id]/team/page.tsxsurfsense_web/app/dashboard/[search_space_id]/settings/page.tsxsurfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsFilters.tsxsurfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/DocumentsTableShell.tsxsurfsense_web/app/dashboard/[search_space_id]/documents/(manage)/components/PaginationControls.tsxsurfsense_web/components/assistant-ui/connector-popup.tsxsurfsense_web/components/layout/ui/sidebar/AllPrivateChatsSidebar.tsxsurfsense_web/components/layout/ui/sidebar/AllSharedChatsSidebar.tsxsurfsense_web/components/dashboard-breadcrumb.tsxsurfsense_web/components/layout/ui/sidebar/ChatListItem.tsxsurfsense_web/components/layout/ui/sidebar/MobileSidebar.tsxsurfsense_web/components/layout/ui/sidebar/Sidebar.tsxsurfsense_web/components/layout/ui/sidebar/SidebarHeader.tsxsurfsense_web/components/layout/ui/sidebar/SidebarSlideOutPanel.tsxsurfsense_web/components/layout/ui/sidebar/SidebarUserProfile.tsxsurfsense_web/components/new-chat/model-selector.tsxsurfsense_web/app/dashboard/[search_space_id]/onboard/page.tsxsurfsense_web/app/dashboard/[search_space_id]/more-pages/page.tsxsurfsense_web/components/layout/providers/LayoutDataProvider.tsxsurfsense_web/components/new-chat/chat-share-button.tsxsurfsense_web/app/docs/layout.tsxsurfsense_web/app/docs/sidebar-separator.tsxsurfsense_web/app/layout.config.tsxsurfsense_web/content/docs/index.mdxsurfsense_web/content/docs/installation.mdxsurfsense_web/content/docs/docker-installation.mdxsurfsense_web/content/docs/manual-installation.mdxsurfsense_web/content/docs/connectors/meta.jsonsurfsense_web/content/docs/how-to/meta.jsonsurfsense_web/content/docs/meta.jsonsurfsense_web/content/docs/testing.mdxsurfsense_web/lib/source.ts.cursor/skills/tdd/SKILL.md.cursor/skills/tdd/deep-modules.md.cursor/skills/tdd/interface-design.md.cursor/skills/tdd/mocking.md.cursor/skills/tdd/refactoring.md.cursor/skills/tdd/tests.mdsurfsense_web/components/icons/providers/xai.svgsurfsense_web/lib/provider-icons.tsx