Skip to content

feat(release: 0.0.29): ETL/embedding caches, unified model connections, reverse-proxy support, podcast & indexing improvements#1509

Merged
MODSetter merged 198 commits into
mainfrom
dev
Jun 18, 2026
Merged

feat(release: 0.0.29): ETL/embedding caches, unified model connections, reverse-proxy support, podcast & indexing improvements#1509
MODSetter merged 198 commits into
mainfrom
dev

Conversation

@MODSetter

Copy link
Copy Markdown
Owner

Summary

This release rolls up ~196 commits on dev into main, bumping the version to 0.0.29. The headline changes are a new layered ingestion caching system, a unified model-connections experience, a single-origin reverse-proxy deployment model, and a batch of podcast, indexing, and stability fixes.

Highlights

Layered ingestion & embedding caching

  • ETL parse cache: content-addressed extraction cache so identical files are only parsed once, with a dedicated etl_cache_parses table, blob storage backend, two-phase TTL/size eviction task (Celery-scheduled), and hit/miss/eviction metrics. All file-based sources now route through the parse cache.
  • Embedding (index) cache: serves chunk embeddings from a cache during indexing using pickle-free blob serialization, a cached-embedding-set table/repository, recall/remember service, eligibility/config flags, and TTL/size eviction with observability metrics.
  • New ETL_CACHE_* and embedding-cache settings, documented in .env.example.

Incremental chunk reconciliation

  • Added an explicit position column for chunks (with backfill migration) and order chunk reads by (document_id, position).
  • Re-indexing now reconciles chunks incrementally via a content-addressed diff reconciler, with a kill-switch flag and reconcile metric.
  • Batched chunk inserts via INDEXING_CHUNK_INSERT_BATCH_SIZE.

Unified model connections

  • New model-provider connections panel with provider-specific forms, connection cards, test/preview, and improved discovery error handling.
  • Reworked model selector with connection scope, free-model indication, AUTO provider mode + auto-pinning, and Redis-based shared cooldown for model selection.
  • Token-tracking improvements (model metadata registration, bare model-name reconciliation).
  • Migration to remove legacy model-config tables and stale connection code; added Azure/Claude/LM Studio icons and updated provider metadata.

Single-origin reverse-proxy deployment

  • Production stack now routes through a bundled Caddy reverse proxy with same-origin frontend/backend access.
  • Backend derives frontend/backend URLs from SURFSENSE_PUBLIC_URL; web consumes runtime-injected config instead of build-time NEXT_PUBLIC_* injection.
  • Shared persistent object_store volume across services; streaming buffering disabled for backend responses; docs and CI/Playwright aligned with runtime env vars.

Podcast improvements

  • Seconds-based brief duration with legacy minute support and a unit dropdown in the web UI.
  • Backend-driven language picker with curated common languages, GET /podcasts/languages endpoint, and custom-entry support.
  • Guarded public/in-flight streaming against missing audio (409/404) with an audio_exists storage helper.

Stability & fixes

  • Security: scoped the connector index endpoint authorization to the connector's own search space (cross-tenant authz fix) with regression tests.
  • DB: prevent boot-time index DDL from hanging FastAPI startup; reap orphaned idle-in-transaction sessions on the Celery engine.
  • Editor: updated limits and added an error boundary.
  • Image gen: resolve relative URLs returned by Xinference and compatible backends.
  • Notifications: truncate document-processing notification titles; continue indexing when notification creation fails.
  • Re-added Google sign-in and added a global announcement feature.
  • Migrations: dead-users cleanup and chunk-position backfill.

Notable migrations

  • etl_cache_parses table
  • cached embedding set table
  • chunk position column + backfill
  • remove legacy model-config tables
  • dead users cleanup

Test plan

  • Run backend test suite (ETL cache, embedding cache, indexing/reconcile, podcasts, connector authz)
  • Verify Alembic migrations apply cleanly on a fresh and an existing DB
  • Smoke-test single-origin proxy deployment (frontend auth + backend profile routes)
  • Verify model connections: add/test a provider, AUTO mode selection, free-model flow
  • Verify podcast generation with seconds-based duration and language picker
  • Confirm document ingestion hits/misses caches as expected

…on for chat streaming

- Introduced LLMErrorCategory and adapt_llm_exception to normalize LLM exceptions.
- Updated llm_retryable_message and llm_permanent_message to utilize the new adaptation logic.
- Enhanced classify_stream_exception to classify provider errors and return user-friendly messages.
- Added tests for error classification and adaptation to ensure robustness.
- Updated frontend error handling to display appropriate messages based on new classifications.
MODSetter and others added 23 commits June 16, 2026 17:01
…-tenant-authz

fix(connectors): scope index endpoint authorization to the connector's own search space
…atible backends

Some OpenAI-compatible image backends (e.g. Xinference) return a relative
URL like /files/image.png in data[0].url instead of an absolute one.
Browsers cannot resolve these, causing images to fail to load.

Track the provider's api_base after resolving model config via to_litellm().
When the returned URL starts with "/", extract the origin (scheme + host + port)
from api_base and prepend it to produce a full absolute URL.

No behaviour change for providers that return absolute URLs (OpenAI, Azure, etc).

Closes #1496
fix(image-gen): resolve relative URLs returned by Xinference and compatible backends
fix(indexing): batch chunk inserts and truncate notification titles
- Updated .env.example to include new environment variables for Google authentication and global announcement settings.
- Integrated Google sign-in functionality in SignInButton and HeroSection components, allowing users to log in with their Google accounts.
- Added GlobalAnnouncement component to display maintenance notices or announcements on the homepage layout.
- Enhanced styling for Google sign-in buttons to improve user experience.
@vercel

vercel Bot commented Jun 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
surf-sense-frontend Ready Ready Preview, Comment Jun 18, 2026 6:42am

Request Review

@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 299 files, which is 149 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a3925e89-17b3-4647-aa5a-004601fce52d

📥 Commits

Reviewing files that changed from the base of the PR and between 77688ac and 0729e5a.

⛔ Files ignored due to path filters (1)
  • surfsense_backend/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (299)
  • .github/workflows/desktop-release.yml
  • .github/workflows/docker-build.yml
  • .github/workflows/e2e-tests.yml
  • VERSION
  • docker/.env.example
  • docker/docker-compose.dev.yml
  • docker/docker-compose.proxy.yml
  • docker/docker-compose.yml
  • docker/proxy/Caddyfile
  • docker/proxy/Dockerfile
  • docker/scripts/install.sh
  • surfsense_backend/.env.example
  • surfsense_backend/alembic/versions/138_add_thread_auto_model_pinning_fields.py
  • surfsense_backend/alembic/versions/158_evolve_podcasts_lifecycle.py
  • surfsense_backend/alembic/versions/160_add_model_connections.py
  • surfsense_backend/alembic/versions/161_remove_legacy_model_configs.py
  • surfsense_backend/alembic/versions/162_add_etl_cache_parses.py
  • surfsense_backend/alembic/versions/163_add_embedding_cache_sets.py
  • surfsense_backend/alembic/versions/164_remove_inactive_users.py
  • surfsense_backend/alembic/versions/165_add_chunk_position.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/middleware/kb_persistence/middleware.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/runtime/agent_cache.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/main_agent/runtime/factory.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/filesystem/backends/kb_postgres.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/shared/middleware/knowledge_search.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/deliverables/tools/generate_image.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/deliverables/tools/index.py
  • surfsense_backend/app/agents/chat/multi_agent_chat/subagents/builtins/deliverables/tools/knowledge_base.py
  • surfsense_backend/app/agents/chat/runtime/llm_config.py
  • surfsense_backend/app/app.py
  • surfsense_backend/app/automations/actions/builtin/agent_task/dependencies.py
  • surfsense_backend/app/automations/actions/builtin/agent_task/invoke.py
  • surfsense_backend/app/automations/actions/types.py
  • surfsense_backend/app/automations/runtime/executor.py
  • surfsense_backend/app/automations/schemas/definition/envelope.py
  • surfsense_backend/app/automations/services/automation.py
  • surfsense_backend/app/automations/services/model_policy.py
  • surfsense_backend/app/celery_app.py
  • surfsense_backend/app/config/__init__.py
  • surfsense_backend/app/config/global_llm_config.example.yaml
  • surfsense_backend/app/connectors/dropbox/content_extractor.py
  • surfsense_backend/app/connectors/google_drive/content_extractor.py
  • surfsense_backend/app/connectors/onedrive/content_extractor.py
  • surfsense_backend/app/db.py
  • surfsense_backend/app/etl_pipeline/cache/__init__.py
  • surfsense_backend/app/etl_pipeline/cache/cached_extraction.py
  • surfsense_backend/app/etl_pipeline/cache/eligibility.py
  • surfsense_backend/app/etl_pipeline/cache/eviction/__init__.py
  • surfsense_backend/app/etl_pipeline/cache/eviction/policy.py
  • surfsense_backend/app/etl_pipeline/cache/eviction/task.py
  • surfsense_backend/app/etl_pipeline/cache/persistence/__init__.py
  • surfsense_backend/app/etl_pipeline/cache/persistence/models.py
  • surfsense_backend/app/etl_pipeline/cache/persistence/repository.py
  • surfsense_backend/app/etl_pipeline/cache/schemas/__init__.py
  • surfsense_backend/app/etl_pipeline/cache/schemas/eviction_candidate.py
  • surfsense_backend/app/etl_pipeline/cache/schemas/parse_key.py
  • surfsense_backend/app/etl_pipeline/cache/service.py
  • surfsense_backend/app/etl_pipeline/cache/settings.py
  • surfsense_backend/app/etl_pipeline/cache/storage/__init__.py
  • surfsense_backend/app/etl_pipeline/cache/storage/backend.py
  • surfsense_backend/app/etl_pipeline/cache/storage/markdown_store.py
  • surfsense_backend/app/etl_pipeline/cache/storage/object_keys.py
  • surfsense_backend/app/gateway/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/cached_indexing.py
  • surfsense_backend/app/indexing_pipeline/cache/eligibility.py
  • surfsense_backend/app/indexing_pipeline/cache/eviction/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/eviction/task.py
  • surfsense_backend/app/indexing_pipeline/cache/persistence/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/persistence/models.py
  • surfsense_backend/app/indexing_pipeline/cache/persistence/repository.py
  • surfsense_backend/app/indexing_pipeline/cache/schemas/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/schemas/embedding_key.py
  • surfsense_backend/app/indexing_pipeline/cache/schemas/embedding_set.py
  • surfsense_backend/app/indexing_pipeline/cache/serialization.py
  • surfsense_backend/app/indexing_pipeline/cache/service.py
  • surfsense_backend/app/indexing_pipeline/cache/settings.py
  • surfsense_backend/app/indexing_pipeline/cache/storage/__init__.py
  • surfsense_backend/app/indexing_pipeline/cache/storage/embedding_store.py
  • surfsense_backend/app/indexing_pipeline/cache/storage/object_keys.py
  • surfsense_backend/app/indexing_pipeline/chunk_reconciler.py
  • surfsense_backend/app/indexing_pipeline/document_persistence.py
  • surfsense_backend/app/indexing_pipeline/exceptions.py
  • surfsense_backend/app/indexing_pipeline/indexing_pipeline_service.py
  • surfsense_backend/app/notifications/constants.py
  • surfsense_backend/app/notifications/service/handlers/document_processing.py
  • surfsense_backend/app/notifications/service/messages/document_processing.py
  • surfsense_backend/app/notifications/service/messages/text.py
  • surfsense_backend/app/observability/metrics.py
  • surfsense_backend/app/podcasts/api/routes.py
  • surfsense_backend/app/podcasts/api/schemas.py
  • surfsense_backend/app/podcasts/voices/__init__.py
  • surfsense_backend/app/podcasts/voices/catalog.py
  • surfsense_backend/app/podcasts/voices/data/languages.py
  • surfsense_backend/app/prompts/default_system_instructions.py
  • surfsense_backend/app/prompts/system_prompt_composer/composer.py
  • surfsense_backend/app/retriever/chunks_hybrid_search.py
  • surfsense_backend/app/retriever/documents_hybrid_search.py
  • surfsense_backend/app/routes/__init__.py
  • surfsense_backend/app/routes/anonymous_chat_routes.py
  • surfsense_backend/app/routes/documents_routes.py
  • surfsense_backend/app/routes/editor_routes.py
  • surfsense_backend/app/routes/gateway_webhook_routes.py
  • surfsense_backend/app/routes/image_generation_routes.py
  • surfsense_backend/app/routes/model_connections_routes.py
  • surfsense_backend/app/routes/new_chat_routes.py
  • surfsense_backend/app/routes/new_llm_config_routes.py
  • surfsense_backend/app/routes/search_source_connectors_routes.py
  • surfsense_backend/app/routes/search_spaces_routes.py
  • surfsense_backend/app/routes/vision_llm_routes.py
  • surfsense_backend/app/schemas/__init__.py
  • surfsense_backend/app/schemas/image_generation.py
  • surfsense_backend/app/schemas/model_connections.py
  • surfsense_backend/app/schemas/new_llm_config.py
  • surfsense_backend/app/schemas/vision_llm.py
  • surfsense_backend/app/services/ai_file_sort_service.py
  • surfsense_backend/app/services/auto_model_pin_service.py
  • surfsense_backend/app/services/billable_calls.py
  • surfsense_backend/app/services/export_service.py
  • surfsense_backend/app/services/global_model_catalog.py
  • surfsense_backend/app/services/image_gen_router_service.py
  • surfsense_backend/app/services/llm_error_adapter.py
  • surfsense_backend/app/services/llm_router_service.py
  • surfsense_backend/app/services/llm_service.py
  • surfsense_backend/app/services/model_capabilities.py
  • surfsense_backend/app/services/model_connection_service.py
  • surfsense_backend/app/services/model_list_service.py
  • surfsense_backend/app/services/model_resolver.py
  • surfsense_backend/app/services/obsidian_plugin_indexer.py
  • surfsense_backend/app/services/openrouter_integration_service.py
  • surfsense_backend/app/services/openrouter_model_normalizer.py
  • surfsense_backend/app/services/pricing_registration.py
  • surfsense_backend/app/services/provider_api_base.py
  • surfsense_backend/app/services/provider_capabilities.py
  • surfsense_backend/app/services/provider_registry.py
  • surfsense_backend/app/services/quality_score.py
  • surfsense_backend/app/services/revert_service.py
  • surfsense_backend/app/services/token_tracking_service.py
  • surfsense_backend/app/services/vision_llm_router_service.py
  • surfsense_backend/app/services/vision_model_list_service.py
  • surfsense_backend/app/tasks/celery_tasks/document_tasks.py
  • surfsense_backend/app/tasks/chat/llm_history_normalizer.py
  • surfsense_backend/app/tasks/chat/message_parts_normalizer.py
  • surfsense_backend/app/tasks/chat/streaming/agent/event_loop.py
  • surfsense_backend/app/tasks/chat/streaming/errors/classifier.py
  • surfsense_backend/app/tasks/chat/streaming/flows/new_chat/title_gen.py
  • surfsense_backend/app/tasks/chat/streaming/flows/shared/assistant_finalize.py
  • surfsense_backend/app/tasks/chat/streaming/flows/shared/llm_bundle.py
  • surfsense_backend/app/tasks/chat/streaming/shared/stream_result.py
  • surfsense_backend/app/tasks/connector_indexers/github_indexer.py
  • surfsense_backend/app/tasks/connector_indexers/local_folder_indexer.py
  • surfsense_backend/app/tasks/document_processors/file_processors.py
  • surfsense_backend/app/utils/content_utils.py
  • surfsense_backend/app/utils/document_converters.py
  • surfsense_backend/pyproject.toml
  • surfsense_backend/scripts/verify_chat_image_capability.py
  • surfsense_backend/tests/conftest.py
  • surfsense_backend/tests/e2e/fakes/embeddings.py
  • surfsense_backend/tests/e2e/fixtures/global_llm_config.yaml
  • surfsense_backend/tests/integration/conftest.py
  • surfsense_backend/tests/integration/document_upload/conftest.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/conftest.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/test_cached_extraction.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/test_cached_parse_repository.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/test_etl_cache_service.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/test_eviction_task.py
  • surfsense_backend/tests/integration/etl_pipeline/cache/test_markdown_store.py
  • surfsense_backend/tests/integration/indexing_pipeline/adapters/test_file_upload_adapter.py
  • surfsense_backend/tests/integration/indexing_pipeline/cache/conftest.py
  • surfsense_backend/tests/integration/indexing_pipeline/cache/test_cached_embedding_repository.py
  • surfsense_backend/tests/integration/indexing_pipeline/cache/test_embedding_cache_service.py
  • surfsense_backend/tests/integration/indexing_pipeline/cache/test_embedding_store.py
  • surfsense_backend/tests/integration/indexing_pipeline/test_index_editions.py
  • surfsense_backend/tests/integration/notifications/test_document_processing_handler.py
  • surfsense_backend/tests/integration/podcasts/test_voices.py
  • surfsense_backend/tests/integration/test_connector_index_authz.py
  • surfsense_backend/tests/unit/agents/chat/runtime/test_llm_config_sanitizer.py
  • surfsense_backend/tests/unit/automations/actions/builtin/agent_task/test_dependencies.py
  • surfsense_backend/tests/unit/automations/runtime/test_executor_action_ctx.py
  • surfsense_backend/tests/unit/automations/schemas/definition/test_envelope.py
  • surfsense_backend/tests/unit/automations/services/test_automation_service_policy.py
  • surfsense_backend/tests/unit/automations/services/test_model_policy.py
  • surfsense_backend/tests/unit/etl_pipeline/cache/conftest.py
  • surfsense_backend/tests/unit/etl_pipeline/cache/test_eligibility.py
  • surfsense_backend/tests/unit/etl_pipeline/cache/test_eviction_policy.py
  • surfsense_backend/tests/unit/etl_pipeline/cache/test_parse_key.py
  • surfsense_backend/tests/unit/indexing_pipeline/cache/conftest.py
  • surfsense_backend/tests/unit/indexing_pipeline/cache/test_eligibility.py
  • surfsense_backend/tests/unit/indexing_pipeline/cache/test_embedding_key.py
  • surfsense_backend/tests/unit/indexing_pipeline/cache/test_serialization.py
  • surfsense_backend/tests/unit/indexing_pipeline/test_chunk_reconciler.py
  • surfsense_backend/tests/unit/indexing_pipeline/test_index_batch_parallel.py
  • surfsense_backend/tests/unit/indexing_pipeline/test_persist_scratch_index.py
  • surfsense_backend/tests/unit/notifications/service/messages/test_document_processing.py
  • surfsense_backend/tests/unit/notifications/service/messages/test_text.py
  • surfsense_backend/tests/unit/podcasts/test_voice_catalog.py
  • surfsense_backend/tests/unit/routes/test_byok_supports_image_input.py
  • surfsense_backend/tests/unit/routes/test_global_configs_is_premium.py
  • surfsense_backend/tests/unit/routes/test_global_new_llm_configs_supports_image.py
  • surfsense_backend/tests/unit/routes/test_image_gen_quota.py
  • surfsense_backend/tests/unit/services/test_agent_billing_resolver.py
  • surfsense_backend/tests/unit/services/test_auto_model_pin_service.py
  • surfsense_backend/tests/unit/services/test_auto_pin_image_aware.py
  • surfsense_backend/tests/unit/services/test_image_gen_api_base_defense.py
  • surfsense_backend/tests/unit/services/test_llm_router_pool_filter.py
  • surfsense_backend/tests/unit/services/test_model_connections.py
  • surfsense_backend/tests/unit/services/test_openrouter_integration_service.py
  • surfsense_backend/tests/unit/services/test_or_health_enrichment.py
  • surfsense_backend/tests/unit/services/test_pricing_registration.py
  • surfsense_backend/tests/unit/services/test_provider_api_base.py
  • surfsense_backend/tests/unit/services/test_provider_capabilities.py
  • surfsense_backend/tests/unit/services/test_quality_score.py
  • surfsense_backend/tests/unit/services/test_token_quota_service_cost.py
  • surfsense_backend/tests/unit/services/test_vision_llm_api_base_defense.py
  • surfsense_backend/tests/unit/tasks/chat/streaming/test_error_classifier.py
  • surfsense_backend/tests/unit/tasks/chat/test_llm_history_normalizer.py
  • surfsense_backend/tests/unit/tasks/chat/test_message_parts_normalizer.py
  • surfsense_backend/tests/unit/tasks/test_stream_new_chat_image_safety_net.py
  • surfsense_browser_extension/package.json
  • surfsense_desktop/package.json
  • surfsense_desktop/scripts/build-electron.mjs
  • surfsense_desktop/src/modules/server.ts
  • surfsense_evals/README.md
  • surfsense_evals/data/multimodal_doc/runs/2026-05-14T00-53-19Z/parser_compare/run_artifact.json
  • surfsense_evals/src/surfsense_evals/core/cli.py
  • surfsense_evals/src/surfsense_evals/core/clients/search_space.py
  • surfsense_evals/src/surfsense_evals/core/config.py
  • surfsense_evals/src/surfsense_evals/core/registry.py
  • surfsense_evals/src/surfsense_evals/core/vision_llm.py
  • surfsense_evals/src/surfsense_evals/suites/medical/medxpertqa/runner.py
  • surfsense_evals/src/surfsense_evals/suites/multimodal_doc/mmlongbench/runner.py
  • surfsense_evals/src/surfsense_evals/suites/multimodal_doc/parser_compare/runner.py
  • surfsense_evals/src/surfsense_evals/suites/research/crag/runner.py
  • surfsense_evals/src/surfsense_evals/suites/research/frames/runner.py
  • surfsense_evals/tests/core/test_clients.py
  • surfsense_evals/tests/core/test_config.py
  • surfsense_evals/tests/test_integration_smoke.py
  • surfsense_web/.env.example
  • surfsense_web/Dockerfile
  • surfsense_web/app/(home)/free/[model_slug]/page.tsx
  • surfsense_web/app/(home)/free/page.tsx
  • surfsense_web/app/(home)/layout.tsx
  • surfsense_web/app/(home)/login/GoogleLoginButton.tsx
  • surfsense_web/app/(home)/login/LocalLoginForm.tsx
  • surfsense_web/app/(home)/login/layout.tsx
  • surfsense_web/app/(home)/login/page.tsx
  • surfsense_web/app/(home)/register/layout.tsx
  • surfsense_web/app/(home)/register/page.tsx
  • surfsense_web/app/api/v1/[...path]/route.ts
  • surfsense_web/app/api/zero/query/route.ts
  • surfsense_web/app/auth/[...path]/route.ts
  • surfsense_web/app/dashboard/[search_space_id]/automations/components/automations-empty-state.tsx
  • surfsense_web/app/dashboard/[search_space_id]/automations/components/automations-table.tsx
  • surfsense_web/app/dashboard/[search_space_id]/automations/components/builder/automation-builder-form.tsx
  • surfsense_web/app/dashboard/[search_space_id]/automations/components/builder/automation-model-fields.tsx
  • surfsense_web/app/dashboard/[search_space_id]/client-layout.tsx
  • surfsense_web/app/dashboard/[search_space_id]/connectors/callback/route.ts
  • 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]/search-space-settings/image-models/page.tsx
  • surfsense_web/app/dashboard/[search_space_id]/search-space-settings/layout-shell.tsx
  • surfsense_web/app/dashboard/[search_space_id]/search-space-settings/models/page.tsx
  • surfsense_web/app/dashboard/[search_space_id]/search-space-settings/roles/page.tsx
  • surfsense_web/app/dashboard/[search_space_id]/search-space-settings/vision-models/page.tsx
  • surfsense_web/app/dashboard/[search_space_id]/user-settings/components/MessagingChannelsContent.tsx
  • surfsense_web/app/dashboard/dashboard-shell.tsx
  • surfsense_web/app/dashboard/layout.tsx
  • surfsense_web/app/desktop/login/layout.tsx
  • surfsense_web/app/desktop/login/page.tsx
  • surfsense_web/app/docs/layout.tsx
  • surfsense_web/app/layout.tsx
  • surfsense_web/app/sitemap.ts
  • surfsense_web/app/verify-token/route.ts
  • surfsense_web/atoms/automations/automations-mutation.atoms.ts
  • surfsense_web/atoms/image-gen-config/image-gen-config-mutation.atoms.ts
  • surfsense_web/atoms/image-gen-config/image-gen-config-query.atoms.ts
  • surfsense_web/atoms/model-connections/model-connections-mutation.atoms.ts
  • surfsense_web/atoms/model-connections/model-connections-query.atoms.ts
  • surfsense_web/atoms/new-llm-config/new-llm-config-mutation.atoms.ts
  • surfsense_web/atoms/new-llm-config/new-llm-config-query.atoms.ts
  • surfsense_web/atoms/vision-llm-config/vision-llm-config-mutation.atoms.ts
  • surfsense_web/atoms/vision-llm-config/vision-llm-config-query.atoms.ts
  • surfsense_web/components/agent-action-log/action-log-dialog.tsx
  • surfsense_web/components/assistant-ui/assistant-message.tsx
  • surfsense_web/components/assistant-ui/connector-popup/connect-forms/components/obsidian-connect-form.tsx
  • surfsense_web/components/assistant-ui/connector-popup/connector-configs/components/circleback-config.tsx
  • surfsense_web/components/assistant-ui/connector-popup/connector-configs/views/connector-edit-view.tsx
  • surfsense_web/components/assistant-ui/connector-popup/hooks/use-connector-dialog.ts
  • surfsense_web/components/assistant-ui/connector-popup/tabs/all-connectors-tab.tsx
  • surfsense_web/components/assistant-ui/connector-popup/views/connector-accounts-list-view.tsx
  • surfsense_web/components/assistant-ui/thread.tsx
  • surfsense_web/components/assistant-ui/token-usage-context.tsx
  • surfsense_web/components/auth/sign-in-button.tsx
  • surfsense_web/components/documents/download-original-button.tsx
  • surfsense_web/components/editor-panel/editor-panel.tsx
  • surfsense_web/components/editor-panel/memory.ts
  • surfsense_web/components/free-chat/anonymous-chat.tsx
  • surfsense_web/components/free-chat/free-chat-page.tsx
  • surfsense_web/components/free-chat/free-composer.tsx

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

- Introduced a new endpoint to check the existence of a global LLM configuration file.
- Updated the frontend to utilize this status, affecting onboarding flow and user experience.
- Added necessary atoms and types for managing global LLM config status in the application state.
- Refactored navigation to ensure proper routing based on the global config status.
@MODSetter MODSetter merged commit c941907 into main Jun 18, 2026
24 of 27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants