Air-gapped, privacy-focused, open-source NotebookLM alternative. AI agent that researches, transforms, and edits your documents. Join our Discord: https://discord.gg/ejRNvftDp9
This report summarizes scanner evidence for MODSetter/SurfSense, a Python project with 16,348 GitHub stars. SynthScan examined 994,569 lines of code across 6359 source files, recording 15009 pattern matches distributed across 25 syntactic categories. The legacy adjusted pattern signal is 20.2 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 8558 finding(s).
Are imports declared and package/API names verified? 3002 finding(s).
Are wrappers, guards, and repeated structures necessary? 11171 finding(s).
Which changes need focused human review? 15009 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 15009 distinct pattern matches across 25 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 44 | def test_a_valid_manifest_loads_with_its_fields(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 56 | def test_what_an_action_leaves_out_takes_its_default(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 67 | def test_a_field_this_version_does_not_know_is_ignored(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 79 | def test_the_version_is_the_one_a_release_stamped( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 113 | def test_a_badly_formed_identity_is_refused( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 123 | def test_access_is_free_or_paid(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 151 | def test_a_host_is_exactly_what_the_user_consents_to( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 162 | def test_a_bare_hostname_or_address_is_a_host(tmp_path: Path, host: str) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 180 | def test_a_secret_has_a_title_and_a_name_that_can_be_a_variable( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 216 | def _a_capitalised_action_name(declared: dict) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 241 | def test_actions_and_their_inputs_are_well_formed( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 252 | def test_a_run_lasts_between_a_second_and_six_hours( | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 264 | def test_every_error_is_reported_at_once(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 279 | def test_a_missing_manifest_is_one_error(tmp_path: Path) -> None: | CODE |
| LOW | plugins/core/manifest/tests/test_load_manifest.py | 294 | def test_a_manifest_that_is_not_a_json_object_is_one_error( | CODE |
| LOW | …anifest/surfsense_plugin_manifest/rules/run_timeout.py | 11 | def _between_a_second_and_six_hours(value: int) -> int: | CODE |
| LOW | plugins/core/cli/surfsense_plugin_cli/new/command.py | 42 | def _refuse_what_it_cannot_take(plugin_id: str, manifest: dict[str, object]) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 28 | def test_add_lists_the_library_and_pins_it_with_hashes(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 43 | def test_adding_a_library_keeps_the_versions_already_pinned( | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 61 | def test_remove_drops_a_library_from_both_files(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 79 | def test_removing_the_last_library_removes_both_files(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 94 | def test_removing_a_library_the_plugin_does_not_list_is_refused(cli, written) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 102 | def test_adding_a_library_that_cannot_be_found_changes_nothing( | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 118 | def test_pin_dependencies_pins_again_after_a_hand_edit(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 134 | def test_the_pinned_file_says_which_command_made_it(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_dependencies.py | 144 | def test_a_removal_that_cannot_be_pinned_changes_nothing(cli, written, wheels) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_build_targets.py | 12 | def test_a_machine_plugins_are_not_built_for_is_told_which_are( | CODE |
| LOW | plugins/core/cli/tests/test_example.py | 20 | def test_the_example_counts_words_into_numbered_notes(cli, example, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 6 | def test_new_lays_out_a_plugin_that_passes_the_manifest_rules(cli, tmp_path) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 20 | def test_new_says_how_to_try_the_plugin(cli, tmp_path) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 30 | def test_new_signs_the_plugin_with_the_authors_git_name(cli, tmp_path, home) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 41 | def test_a_new_plugin_runs_with_invoke_unchanged(cli, tmp_path, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 73 | def test_new_refuses_an_id_it_cannot_take( | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 87 | def test_new_never_writes_over_a_plugin_that_exists(cli, tmp_path) -> None: | CODE |
| LOW | plugins/core/cli/tests/test_new.py | 101 | def test_new_works_on_a_machine_without_git(cli, tmp_path) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_feedback.py | 21 | def test_invoke_says_where_it_runs_and_that_it_finished( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_feedback.py | 34 | def test_invoke_says_how_a_failed_run_ended(cli, plugin, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_feedback.py | 56 | def test_a_workspace_the_app_does_not_have_is_refused_before_running( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_inputs.py | 24 | def test_inputs_arrive_as_their_declared_kinds(cli, plugin, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_inputs.py | 62 | def test_an_input_the_action_cannot_take_is_refused_before_running( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_inputs.py | 78 | def test_an_action_the_plugin_does_not_declare_is_refused(cli, plugin) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_dependencies.py | 54 | def test_a_pinned_dependency_is_installed_for_this_machine_and_imported( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_dependencies.py | 69 | def test_an_unchanged_list_of_dependencies_is_not_installed_again( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_dependencies.py | 100 | def test_a_dependency_with_no_wheel_for_this_machine_is_refused( | CODE |
| LOW | …s/core/cli/tests/invoke/test_choosing_the_workspace.py | 6 | def test_with_one_workspace_invoke_writes_to_it( | CODE |
| LOW | …s/core/cli/tests/invoke/test_choosing_the_workspace.py | 27 | def test_with_several_workspaces_invoke_lists_them_and_runs_nothing( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_finding_the_app.py | 21 | def test_invoke_finds_the_app_by_the_file_it_writes( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_finding_the_app.py | 36 | def test_invoke_finds_the_app_named_in_the_environment( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_finding_the_app.py | 55 | def test_with_no_app_running_invoke_says_how_to_reach_one( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_finding_the_app.py | 68 | def test_an_app_that_no_longer_answers_is_not_running( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_secrets.py | 38 | def test_a_secret_comes_from_the_authors_own_environment(cli, plugin, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_secrets.py | 50 | def test_a_secret_not_in_the_environment_is_asked_for_and_kept_nowhere( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_running.py | 6 | def test_invoke_runs_the_action_once_against_the_app( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_running.py | 31 | def test_invoke_exits_with_the_plugins_own_code(cli, plugin, real_app) -> None: | CODE |
| LOW | plugins/core/cli/tests/invoke/test_running.py | 61 | def test_a_plugin_cannot_import_what_the_cli_has_installed( | CODE |
| LOW | plugins/core/cli/tests/invoke/test_data_folder.py | 18 | def test_the_plugins_data_is_kept_between_invokes_in_dev_data( | STRING |
| LOW | plugins/core/sdk/tests/unit/test_secret.py | 20 | def test_a_declared_secret_is_read_from_the_environment_the_app_set(plugin) -> None: | CODE |
| LOW | plugins/core/sdk/tests/unit/test_secret.py | 33 | def test_a_secret_the_manifest_does_not_declare_is_refused_by_name(plugin) -> None: | CODE |
| LOW | plugins/core/sdk/tests/unit/test_secret.py | 46 | def test_a_declared_secret_with_no_value_is_refused_by_name(plugin) -> None: | CODE |
| LOW | plugins/core/sdk/tests/unit/test_public_surface.py | 50 | def test_the_only_any_a_plugin_meets_is_a_sources_json() -> None: | CODE |
| 7640 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/docker-compose.e2e.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM | docker/docker-compose.e2e.yml | 3 | # ============================================================================= | COMMENT |
| MEDIUM | docker/docker-compose.e2e.yml | 20 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.dev.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.dev.yml | 3 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.dev.yml | 9 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 4 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/docker-compose.yml | 8 | # ============================================================================= | COMMENT |
| MEDIUM | docker/docker-compose.deps-only.yml | 1 | # ============================================================================= | COMMENT |
| MEDIUM | docker/docker-compose.deps-only.yml | 3 | # ============================================================================= | COMMENT |
| MEDIUM | docker/docker-compose.deps-only.yml | 34 | # ============================================================================= | COMMENT |
| MEDIUM | docker/scripts/install.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM | docker/scripts/install.sh | 27 | # ============================================================================= | COMMENT |
| MEDIUM | docker/scripts/install.sh | 49 | # ── Parse flags ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 126 | # ── Pre-flight checks ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 147 | # ── Wait-for-postgres helper ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 166 | # ── Stack startup helper ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 192 | # ── Variant and .env helpers ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 330 | # ── Download files ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 360 | # ── Legacy all-in-one detection ────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 394 | # ── Set up .env ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 426 | # ── Start containers ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 500 | # ── Watchtower (auto-update) ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/install.sh | 528 | # ── Done ───────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 2 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 39 | # ============================================================================= | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 43 | # ── Colours ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 51 | # ── Logging — tee everything to a log file ─────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 55 | # ── Output helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 62 | # ── Constants ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 69 | # ── Defaults ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | docker/scripts/migrate-database.sh | 75 | # ── Argument parsing ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 90 | # ── Confirmation helper ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 98 | # ── Cleanup trap — always remove the temp container ────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 114 | # ── Wait-for-postgres helper ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 137 | # ── Step 0: Pre-flight checks ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 195 | # ── Confirmation prompt ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 204 | # ── Step 1: Start temporary PostgreSQL 14 container ────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 239 | # ── Step 2: Dump the database ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 275 | # ── Step 3: Recover SECRET_KEY ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | docker/scripts/migrate-database.sh | 314 | # ── Done ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | surfsense_backend/app/celery_app.py | 225 | # ── Queue names ────────────────────────────────────────────── | COMMENT |
| MEDIUM | surfsense_backend/app/celery_app.py | 258 | # ── Task routing ───────────────────────────────────────── | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 77 | # ============================================================================ | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 79 | # ============================================================================ | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 125 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 311 | # ============================================================================ | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 313 | # ============================================================================ | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 761 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 763 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 782 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 784 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 827 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | surfsense_backend/app/app.py | 829 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/connectors/notion_history.py | 804 | # ========================================================================= | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/connectors/notion_history.py | 806 | # ========================================================================= | COMMENT |
| MEDIUM | surfsense_backend/app/connectors/notion_history.py | 32 | # ============================================================================ | COMMENT |
| MEDIUM | surfsense_backend/app/connectors/notion_history.py | 36 | # ============================================================================ | COMMENT |
| 980 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 3 | CODE | |
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 4 | CODE | |
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 5 | CODE | |
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 5 | CODE | |
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 5 | CODE | |
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 5 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 3 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 4 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 5 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 6 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 7 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 3 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 4 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 5 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 5 | CODE | |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 5 | CODE | |
| LOW | plugins/example/main.py | 6 | CODE | |
| LOW | surfsense_mcp/tests/test_auth_headers.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_workspace_context.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_update_document.py | 8 | CODE | |
| LOW | surfsense_mcp/tests/test_client_errors.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_note_ingestion.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_rendering.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_client_params.py | 3 | CODE | |
| LOW | surfsense_mcp/tests/test_get_document_okf.py | 9 | CODE | |
| LOW | surfsense_mcp/tests/test_request_auth.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/server.py | 7 | CODE | |
| LOW | surfsense_mcp/mcp_server/selfcheck.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/config.py | 7 | CODE | |
| LOW | surfsense_mcp/mcp_server/__main__.py | 12 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/rendering.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/client.py | 7 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/workspace_matching.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/workspace_context.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/errors.py | 8 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/transport/__init__.py | 3 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/transport/http.py | 7 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/__init__.py | 4 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/__init__.py | 4 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/__init__.py | 5 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/headers.py | 6 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/identity.py | 9 | CODE | |
| LOW | surfsense_mcp/mcp_server/core/auth/middleware.py | 12 | CODE | |
| LOW | …rfsense_mcp/mcp_server/features/workspaces/__init__.py | 8 | CODE | |
| LOW | …mcp/mcp_server/features/knowledge_base/search_tools.py | 7 | CODE | |
| LOW | …p/mcp_server/features/knowledge_base/note_ingestion.py | 9 | CODE | |
| LOW | …nse_mcp/mcp_server/features/knowledge_base/__init__.py | 8 | CODE | |
| LOW | …p/mcp_server/features/knowledge_base/document_tools.py | 7 | CODE | |
| LOW | …_mcp/mcp_server/features/knowledge_base/annotations.py | 3 | CODE | |
| LOW | surfsense_mcp/mcp_server/features/scrapers/__init__.py | 10 | CODE | |
| LOW | …rfsense_mcp/mcp_server/features/scrapers/capability.py | 7 | CODE | |
| LOW | …fsense_mcp/mcp_server/features/scrapers/annotations.py | 3 | CODE | |
| LOW | …fsense_mcp/mcp_server/features/scrapers/run_history.py | 7 | CODE | |
| LOW | …/mcp_server/features/scrapers/platforms/google_maps.py | 3 | CODE | |
| LOW | …ense_mcp/mcp_server/features/scrapers/platforms/web.py | 3 | CODE | |
| LOW | …_mcp/mcp_server/features/scrapers/platforms/youtube.py | 3 | CODE | |
| LOW | …_mcp/mcp_server/features/scrapers/platforms/walmart.py | 3 | CODE | |
| LOW | …cp_server/features/scrapers/platforms/google_search.py | 3 | CODE | |
| LOW | …cp/mcp_server/features/scrapers/platforms/instagram.py | 3 | CODE | |
| LOW | …e_mcp/mcp_server/features/scrapers/platforms/tiktok.py | 3 | CODE | |
| 2794 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/docker-compose.e2e.yml | 133 | except Exception: | CODE |
| LOW | surfsense_backend/app/db.py | 3097 | except Exception as exc: | CODE |
| LOW | surfsense_backend/app/users.py | 168 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/users.py | 187 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/users.py | 239 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/users.py | 308 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/users.py | 394 | except Exception: | CODE |
| LOW | surfsense_backend/app/users.py | 405 | except Exception: | CODE |
| LOW | surfsense_backend/app/celery_app.py | 78 | except Exception: | CODE |
| LOW | surfsense_backend/app/celery_app.py | 102 | except Exception: | CODE |
| LOW | surfsense_backend/app/app.py | 574 | except Exception: | CODE |
| LOW | surfsense_backend/app/app.py | 598 | except Exception: | CODE |
| LOW | surfsense_backend/app/app.py | 633 | except Exception: | CODE |
| LOW | surfsense_backend/app/app.py | 659 | except Exception: | CODE |
| LOW | surfsense_backend/app/app.py | 1141 | except Exception as exc: | CODE |
| LOW | surfsense_backend/app/connectors/clickup_connector.py | 207 | except Exception as e: | CODE |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 124 | except Exception as e: | CODE |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 134 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 182 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 302 | except Exception as general_error: | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 409 | except Exception as general_error: # Catch any other unexpected errors | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 519 | except Exception as general_error: # Catch any other unexpected errors | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 556 | except Exception: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 50 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 166 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 197 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 225 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 266 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 300 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 370 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 431 | except Exception as e: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 497 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 171 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 205 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 258 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 396 | except Exception as callback_error: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 789 | except Exception: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 832 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 928 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 969 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 997 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 1027 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 1076 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 120 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 148 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 228 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 651 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 75 | except Exception as e: | STRING |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 154 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 174 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 222 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 284 | except Exception: | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 555 | except Exception as e: | STRING |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 684 | except Exception as e: | STRING |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 748 | except Exception as e: | STRING |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 772 | except Exception as e: | STRING |
| LOW | surfsense_backend/app/connectors/teams_history.py | 57 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/teams_history.py | 75 | except Exception as e: | CODE |
| LOW | surfsense_backend/app/connectors/teams_history.py | 123 | except Exception: | CODE |
| LOW | surfsense_backend/app/connectors/teams_history.py | 140 | except Exception as e: | CODE |
| 1233 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | surfsense_backend/app/connectors/notion_history.py | 0 | initialize the airtablehistoryconnector with auto-refresh capability. args: session: database session for updating conne | STRING |
| HIGH | surfsense_backend/app/connectors/confluence_history.py | 0 | initialize the airtablehistoryconnector with auto-refresh capability. args: session: database session for updating conne | STRING |
| HIGH | surfsense_backend/app/connectors/airtable_history.py | 0 | initialize the airtablehistoryconnector with auto-refresh capability. args: session: database session for updating conne | STRING |
| HIGH | surfsense_backend/app/connectors/notion_history.py | 0 | get valid airtable access token, refreshing if needed. returns: valid access token raises: valueerror: if credentials ar | STRING |
| HIGH | surfsense_backend/app/connectors/confluence_history.py | 0 | get valid airtable access token, refreshing if needed. returns: valid access token raises: valueerror: if credentials ar | STRING |
| HIGH | surfsense_backend/app/connectors/linear_connector.py | 0 | get valid airtable access token, refreshing if needed. returns: valid access token raises: valueerror: if credentials ar | STRING |
| HIGH | surfsense_backend/app/connectors/teams_connector.py | 0 | get valid airtable access token, refreshing if needed. returns: valid access token raises: valueerror: if credentials ar | STRING |
| HIGH | surfsense_backend/app/connectors/airtable_history.py | 0 | get valid airtable access token, refreshing if needed. returns: valid access token raises: valueerror: if credentials ar | STRING |
| HIGH | …ackend/app/tasks/connector_indexers/discord_indexer.py | 0 | slack connector indexer. implements batch indexing: groups up to slack_batch_size messages per channel into a single doc | STRING |
| HIGH | …_backend/app/tasks/connector_indexers/teams_indexer.py | 0 | slack connector indexer. implements batch indexing: groups up to slack_batch_size messages per channel into a single doc | STRING |
| HIGH | …_backend/app/tasks/connector_indexers/slack_indexer.py | 0 | slack connector indexer. implements batch indexing: groups up to slack_batch_size messages per channel into a single doc | STRING |
| HIGH | …ackend/app/tasks/connector_indexers/discord_indexer.py | 0 | index slack messages from all accessible channels. messages are grouped into batches of slack_batch_size per channel, so | STRING |
| HIGH | …_backend/app/tasks/connector_indexers/teams_indexer.py | 0 | index slack messages from all accessible channels. messages are grouped into batches of slack_batch_size per channel, so | STRING |
| HIGH | …_backend/app/tasks/connector_indexers/slack_indexer.py | 0 | index slack messages from all accessible channels. messages are grouped into batches of slack_batch_size per channel, so | STRING |
| HIGH | …ckend/app/tasks/connector_indexers/onedrive_indexer.py | 0 | download and etl files in parallel. returns (connector_docs, failed_files), where failed_files is a list of (file_id, re | STRING |
| HIGH | …ackend/app/tasks/connector_indexers/dropbox_indexer.py | 0 | download and etl files in parallel. returns (connector_docs, failed_files), where failed_files is a list of (file_id, re | STRING |
| HIGH | …d/app/tasks/connector_indexers/google_drive_indexer.py | 0 | download and etl files in parallel. returns (connector_docs, failed_files), where failed_files is a list of (file_id, re | STRING |
| HIGH | …ckend/app/tasks/connector_indexers/onedrive_indexer.py | 0 | full scan indexing of a folder. returns (indexed, skipped, unsupported_count). | STRING |
| HIGH | …d/app/tasks/connector_indexers/google_drive_indexer.py | 0 | full scan indexing of a folder. returns (indexed, skipped, unsupported_count). | STRING |
| HIGH | …ackend/app/tasks/connector_indexers/dropbox_indexer.py | 0 | full scan indexing of a folder. returns (indexed, skipped, unsupported_count). | STRING |
| HIGH | …ckend/app/proprietary/platforms/google_maps/scraper.py | 0 | collect :func:`iter_serps` into a list, honoring an optional ``limit``. ``limit`` is a request-time policy guard (used b | STRING |
| HIGH | …e_backend/app/proprietary/platforms/youtube/scraper.py | 0 | collect :func:`iter_serps` into a list, honoring an optional ``limit``. ``limit`` is a request-time policy guard (used b | STRING |
| HIGH | …end/app/proprietary/platforms/google_search/scraper.py | 0 | collect :func:`iter_serps` into a list, honoring an optional ``limit``. ``limit`` is a request-time policy guard (used b | STRING |
| HIGH | …ckend/app/proprietary/platforms/google_maps/schemas.py | 0 | serialize to the flat dict shape apify emits (keeps extras). | STRING |
| HIGH | …e_backend/app/proprietary/platforms/youtube/schemas.py | 0 | serialize to the flat dict shape apify emits (keeps extras). | STRING |
| HIGH | …end/app/proprietary/platforms/google_search/schemas.py | 0 | serialize to the flat dict shape apify emits (keeps extras). | STRING |
| HIGH | …backend/app/proprietary/platforms/youtube/innertube.py | 0 | drop the current ip and connect through a fresh one. returns new session. | STRING |
| HIGH | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 0 | drop the current ip and connect through a fresh one. returns new session. | STRING |
| HIGH | …e_backend/app/proprietary/platforms/instagram/fetch.py | 0 | drop the current ip and connect through a fresh one. returns new session. | STRING |
| HIGH | …backend/app/proprietary/platforms/youtube/innertube.py | 0 | open a warm rotate-on-block session holder (caller owns ``close()``). | STRING |
| HIGH | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 0 | open a warm rotate-on-block session holder (caller owns ``close()``). | STRING |
| HIGH | …kend/app/proprietary/platforms/tiktok/session/proxy.py | 0 | open a warm rotate-on-block session holder (caller owns ``close()``). | STRING |
| HIGH | …e_backend/app/proprietary/platforms/instagram/fetch.py | 0 | open a warm rotate-on-block session holder (caller owns ``close()``). | STRING |
| HIGH | …backend/app/proprietary/platforms/youtube/innertube.py | 0 | open one reused, rotate-on-block proxy session for a continuation chain. | STRING |
| HIGH | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 0 | open one reused, rotate-on-block proxy session for a continuation chain. | STRING |
| HIGH | …kend/app/proprietary/platforms/tiktok/session/proxy.py | 0 | open one reused, rotate-on-block proxy session for a continuation chain. | STRING |
| HIGH | …e_backend/app/proprietary/platforms/instagram/fetch.py | 0 | open one reused, rotate-on-block proxy session for a continuation chain. | STRING |
| HIGH | …e_backend/app/proprietary/platforms/walmart/schemas.py | 0 | serialize to the flat output dict shape (keeps extras). | STRING |
| HIGH | …se_backend/app/proprietary/platforms/reddit/schemas.py | 0 | serialize to the flat output dict shape (keeps extras). | STRING |
| HIGH | …backend/app/proprietary/platforms/instagram/schemas.py | 0 | serialize to the flat output dict shape (keeps extras). | STRING |
| HIGH | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 0 | utc timestamp in the millisecond iso shape used by scraper output. | STRING |
| HIGH | …backend/app/proprietary/platforms/indeed_jobs/fetch.py | 0 | utc timestamp in the millisecond iso shape used by scraper output. | STRING |
| HIGH | …e_backend/app/proprietary/platforms/instagram/fetch.py | 0 | utc timestamp in the millisecond iso shape used by scraper output. | STRING |
| HIGH | …ackend/app/capabilities/google_maps/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …nse_backend/app/capabilities/indeed/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …se_backend/app/capabilities/youtube/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …kend/app/capabilities/google_search/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …nse_backend/app/capabilities/reddit/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …nse_backend/app/capabilities/tiktok/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …backend/app/capabilities/instagram/details/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …_backend/app/capabilities/instagram/scrape/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …ckend/app/capabilities/google_maps/reviews/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …_backend/app/capabilities/youtube/comments/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …e_backend/app/capabilities/tiktok/comments/executor.py | 0 | bind the executor to a comments fn (defaults to the proprietary actor). | STRING |
| HIGH | …nse_backend/app/capabilities/amazon/scrape/executor.py | 0 | bind the capability input mapping to a replaceable reviews scraper function. | STRING |
| HIGH | …se_backend/app/capabilities/walmart/scrape/executor.py | 0 | bind the capability input mapping to a replaceable reviews scraper function. | STRING |
| HIGH | …e_backend/app/capabilities/walmart/reviews/executor.py | 0 | bind the capability input mapping to a replaceable reviews scraper function. | STRING |
| HIGH | …ense_backend/app/capabilities/indeed/scrape/schemas.py | 0 | per-call cap on urls + search_queries: bounds a synchronous request's fan-out. | STRING |
| HIGH | …ense_backend/app/capabilities/reddit/scrape/schemas.py | 0 | per-call cap on urls + search_queries: bounds a synchronous request's fan-out. | STRING |
| HIGH | …e_backend/app/capabilities/instagram/scrape/schemas.py | 0 | per-call cap on urls + search_queries: bounds a synchronous request's fan-out. | STRING |
| 108 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ns/core/manifest/surfsense_plugin_manifest/__init__.py | 7 | __all__ = ["Action", "Input", "Manifest", "ManifestError", "Secret", "load_manifest"] | CODE |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/__init__.py | 9 | __all__ = ["action", "data", "document", "http", "secret"] | CODE |
| LOW | plugins/core/sdk/surfsense_plugin_sdk/http/__init__.py | 7 | __all__ = ["HostNotDeclared", "Response", "get", "post", "request"] | CODE |
| LOW | surfsense_mcp/mcp_server/core/transport/__init__.py | 5 | __all__ = ["build_http_app"] | CODE |
| LOW | surfsense_mcp/mcp_server/core/auth/__init__.py | 7 | __all__ = ["current_api_key", "current_identity", "ApiKeyIdentityMiddleware"] | CODE |
| LOW | surfsense_backend/app/db.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/users.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/session_events.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/app.py | 1018 | def _set_google_oauth_csrf_cookie(response: Response, csrf_token: str) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/clickup_connector.py | 26 | def set_api_token(self, api_token: str) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 24 | logger = logging.getLogger(__name__) # Added logger | CODE |
| LOW | surfsense_backend/app/connectors/slack_history.py | 211 | def set_token(self, token: str) -> None: | CODE |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/notion_history.py | 99 | def set_retry_callback(self, callback: RetryCallbackType | None) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/teams_history.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/luma_connector.py | 27 | def set_api_key(self, api_key: str) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/teams_connector.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/discord_connector.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/discord_connector.py | 272 | def set_token(self, token: str) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/airtable_connector.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/composio_connector.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/bookstack_connector.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/bookstack_connector.py | 45 | def set_credentials(self, base_url: str, token_id: str, token_secret: str) -> None: | CODE |
| LOW | surfsense_backend/app/connectors/github_connector.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/airtable_history.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/clickup_history.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 36 | def set_credentials(self, base_url: str, email: str, api_token: str) -> None: | CODE |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 49 | def set_email(self, email: str) -> None: | CODE |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 58 | def set_api_token(self, api_token: str) -> None: | CODE |
| LOW | …ense_backend/app/connectors/elasticsearch_connector.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ense_backend/app/connectors/onedrive/folder_manager.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | …e_backend/app/connectors/onedrive/content_extractor.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/onedrive/client.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/onedrive/__init__.py | 7 | __all__ = [ | CODE |
| LOW | …sense_backend/app/connectors/dropbox/folder_manager.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | …se_backend/app/connectors/dropbox/content_extractor.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/dropbox/client.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/dropbox/__init__.py | 7 | __all__ = [ | CODE |
| LOW | …_backend/app/connectors/google_drive/folder_manager.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | …ckend/app/connectors/google_drive/content_extractor.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | …nse_backend/app/connectors/google_drive/credentials.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/connectors/google_drive/client.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | …fsense_backend/app/connectors/google_drive/__init__.py | 9 | __all__ = [ | CODE |
| LOW | …_backend/app/connectors/google_drive/change_tracker.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/artifacts/service.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | surfsense_backend/app/artifacts/__init__.py | 12 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/flashcards/__init__.py | 13 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/access/authenticated.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | …fsense_backend/app/artifacts/infographic/generation.py | 103 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/infographic/presets.py | 121 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/infographic/__init__.py | 14 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/infographic/schemas.py | 82 | __all__ = [ | CODE |
| LOW | …rfsense_backend/app/artifacts/infographic/selection.py | 185 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/infographic/prompt.py | 44 | __all__ = ["assemble_infographic_prompt"] | CODE |
| LOW | surfsense_backend/app/artifacts/quiz/__init__.py | 13 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/schemas/__init__.py | 10 | __all__ = [ | CODE |
| LOW | surfsense_backend/app/artifacts/schemas/input.py | 12 | __all__ = ["ArtifactFileInput", "ArtifactFormat", "ArtifactInput"] | CODE |
| 767 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …core/cli/surfsense_plugin_cli/invoke/request/inputs.py | 45 | except ValueError: | CODE |
| HIGH | surfsense_backend/app/celery_app.py | 78 | except Exception: | CODE |
| HIGH | surfsense_backend/app/celery_app.py | 102 | except Exception: | CODE |
| HIGH | surfsense_backend/app/connectors/linear_connector.py | 284 | except Exception: | CODE |
| HIGH | surfsense_backend/app/connectors/airtable_connector.py | 102 | except Exception: | CODE |
| HIGH | surfsense_backend/app/connectors/onedrive/client.py | 121 | except Exception: | CODE |
| HIGH | surfsense_backend/app/connectors/dropbox/client.py | 118 | except Exception: | CODE |
| HIGH | …_backend/app/connectors/google_drive/change_tracker.py | 178 | except Exception: | CODE |
| HIGH | surfsense_backend/app/artifacts/verification/service.py | 149 | except ValueError: | CODE |
| HIGH | …se_backend/app/artifacts/verification/formats/video.py | 61 | except (TypeError, ValueError, json.JSONDecodeError): | CODE |
| HIGH | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 117 | except Exception: | CODE |
| HIGH | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 140 | except asyncio.CancelledError: | CODE |
| HIGH | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 1363 | except Exception: | CODE |
| HIGH | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 1491 | except Exception: | CODE |
| HIGH | …ackend/app/tasks/chat/streaming/handlers/tool_start.py | 179 | except (TypeError, ValueError, OverflowError): | CODE |
| HIGH | …d/app/tasks/connector_indexers/local_folder_indexer.py | 375 | except Exception: | CODE |
| HIGH | …nd/app/tasks/document_processors/_direct_converters.py | 51 | except (UnicodeDecodeError, UnicodeError): | CODE |
| HIGH | …nd/app/tasks/document_processors/_direct_converters.py | 56 | except (UnicodeDecodeError, UnicodeError): | CODE |
| HIGH | …se_backend/app/proprietary/platforms/amazon/parsers.py | 315 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | …ckend/app/proprietary/platforms/google_search/fetch.py | 333 | except Exception: # clamp absent/detached; the collapsed text still parses | CODE |
| HIGH | …nd/app/proprietary/platforms/tiktok/session/listing.py | 105 | except Exception: | CODE |
| HIGH | …app/proprietary/web_crawler/testbench/suite_stealth.py | 73 | except Exception: | CODE |
| HIGH | …sense_backend/app/indexing_pipeline/pipeline_logger.py | 65 | except Exception: | CODE |
| HIGH | surfsense_backend/app/agents/chat/runtime/llm_config.py | 202 | except Exception: | CODE |
| HIGH | …ckend/app/agents/chat/shared/middleware/retry_after.py | 112 | except (TypeError, ValueError): | CODE |
| HIGH | …ckend/app/agents/chat/shared/middleware/retry_after.py | 118 | except (TypeError, ValueError): | CODE |
| HIGH | …red/middleware/filesystem/middleware/async_dispatch.py | 20 | except RuntimeError: | CODE |
| HIGH | …/shared/middleware/filesystem/backends/local_folder.py | 440 | except StopIteration: | CODE |
| HIGH | …/agents/chat/multi_agent_chat/shared/tools/mcp/tool.py | 946 | except ImportError: | CODE |
| HIGH | …nt_chat/main_agent/middleware/action_log/middleware.py | 294 | except Exception: # pragma: no cover - defensive | CODE |
| HIGH | …nt_chat/main_agent/middleware/action_log/middleware.py | 338 | except Exception: # pragma: no cover | CODE |
| HIGH | …nt_chat/main_agent/middleware/action_log/middleware.py | 369 | except Exception: # pragma: no cover - defensive | CODE |
| HIGH | …hat/main_agent/middleware/knowledge_tree/middleware.py | 75 | except Exception: | CODE |
| HIGH | …hat/main_agent/middleware/knowledge_tree/middleware.py | 174 | except RuntimeError: | CODE |
| HIGH | …at/main_agent/middleware/context_editing/middleware.py | 86 | except RuntimeError: | CODE |
| HIGH | …ent_chat/main_agent/middleware/otel_span/middleware.py | 180 | except Exception: # pragma: no cover — defensive | CODE |
| HIGH | …ent_chat/main_agent/middleware/otel_span/middleware.py | 197 | except Exception: # pragma: no cover — defensive | CODE |
| HIGH | …ent_chat/main_agent/middleware/otel_span/middleware.py | 224 | except Exception: # pragma: no cover — defensive | CODE |
| HIGH | …ent_chat/main_agent/middleware/otel_span/middleware.py | 276 | except Exception: # pragma: no cover — defensive | CODE |
| HIGH | …ent_chat/main_agent/middleware/otel_span/middleware.py | 299 | except Exception: # pragma: no cover — defensive | CODE |
| HIGH | …rfsense_backend/app/agents/video_presentation/nodes.py | 428 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | …rfsense_backend/app/agents/video_presentation/nodes.py | 438 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | surfsense_backend/app/utils/structured_output.py | 45 | except (ValidationError, ValueError): | CODE |
| HIGH | surfsense_backend/app/utils/structured_output.py | 54 | except (ValidationError, ValueError): | CODE |
| HIGH | surfsense_backend/app/utils/connector_naming.py | 90 | except (ValueError, TypeError, AttributeError): | CODE |
| HIGH | surfsense_backend/app/utils/crawl/net_guard.py | 83 | except ValueError: | CODE |
| HIGH | surfsense_backend/app/knowledge_store/remote/shadow.py | 93 | except KeyError: | CODE |
| HIGH | …sense_backend/app/routes/linear_add_connector_route.py | 300 | except Exception: | CODE |
| HIGH | …sense_backend/app/routes/linear_add_connector_route.py | 537 | except Exception: | CODE |
| HIGH | …nse_backend/app/routes/airtable_add_connector_route.py | 248 | except Exception: | CODE |
| HIGH | …nse_backend/app/routes/airtable_add_connector_route.py | 434 | except Exception: | CODE |
| HIGH | …fsense_backend/app/routes/slack_add_connector_route.py | 228 | except Exception: | CODE |
| HIGH | …fsense_backend/app/routes/slack_add_connector_route.py | 426 | except Exception: | CODE |
| HIGH | …e_backend/app/routes/confluence_add_connector_route.py | 238 | except Exception: | CODE |
| HIGH | …e_backend/app/routes/confluence_add_connector_route.py | 554 | except Exception: | CODE |
| HIGH | surfsense_backend/app/routes/new_chat_routes.py | 544 | except RuntimeError: | CODE |
| HIGH | …sense_backend/app/routes/notion_add_connector_route.py | 299 | except Exception: | CODE |
| HIGH | …sense_backend/app/routes/notion_add_connector_route.py | 539 | except Exception: | CODE |
| HIGH | …_backend/app/routes/search_source_connectors_routes.py | 124 | except asyncio.CancelledError: | CODE |
| HIGH | …_backend/app/routes/search_source_connectors_routes.py | 1787 | except Exception: | CODE |
| 50 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | surfsense_backend/app/connectors/clickup_connector.py | 58 | Make a request to the ClickUp API. Args: endpoint: API endpoint (without base URL) | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_connector.py | 105 | Fetch all tasks from a ClickUp workspace using the filtered team tasks endpoint. Args: wor | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_connector.py | 211 | Fetch detailed information about a specific task. Args: task_id: ClickUp task ID | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_connector.py | 227 | Fetch comments for a specific task. Args: task_id: ClickUp task ID Returns: | STRING |
| HIGH | surfsense_backend/app/connectors/slack_history.py | 223 | Fetch all channels that the bot has access to, with rate limit handling. Args: include_pri | STRING |
| HIGH | surfsense_backend/app/connectors/slack_history.py | 320 | Fetch conversation history for a channel. Args: channel_id: The ID of the channel to fetch | STRING |
| HIGH | surfsense_backend/app/connectors/slack_history.py | 475 | Get information about a user. Args: user_id: The ID of the user to get info for R | STRING |
| HIGH | surfsense_backend/app/connectors/notion_history.py | 288 | Execute Notion API call with retry logic and exponential backoff. Handles retryable errors per Notion | STRING |
| HIGH | surfsense_backend/app/connectors/notion_history.py | 843 | Create a new Notion page. Args: title: Page title content: Page content (markd | STRING |
| HIGH | surfsense_backend/app/connectors/notion_history.py | 938 | Update an existing Notion page by appending new content. Note: Content is appended to the page, not re | STRING |
| HIGH | surfsense_backend/app/connectors/notion_history.py | 1035 | Delete (archive) a Notion page. Note: Notion doesn't truly delete pages, it archives them. Ar | STRING |
| HIGH | surfsense_backend/app/connectors/confluence_history.py | 288 | Make a request to the Confluence API. Args: endpoint: API endpoint (without base URL) | STRING |
| HIGH | surfsense_backend/app/connectors/confluence_history.py | 449 | Fetch all pages in a specific space. Args: space_id: The ID of the space to fetch pages fr | STRING |
| HIGH | surfsense_backend/app/connectors/confluence_history.py | 500 | Fetch all comments for a specific page (both footer and inline comments). Args: page_id: T | STRING |
| HIGH | surfsense_backend/app/connectors/linear_connector.py | 292 | Execute a GraphQL query against the Linear API with automatic token refresh. Args: query: | STRING |
| HIGH | surfsense_backend/app/connectors/linear_connector.py | 332 | Fetch all issues from Linear. Args: include_comments: Whether to include comments in the r | STRING |
| HIGH | surfsense_backend/app/connectors/luma_connector.py | 57 | Make a request to the Luma API. Args: endpoint: API endpoint path (without base URL) | STRING |
| HIGH | surfsense_backend/app/connectors/discord_connector.py | 345 | Fetch all text channels in a guild. Args: guild_id (str): The ID of the guild to fetch cha | STRING |
| HIGH | surfsense_backend/app/connectors/discord_connector.py | 384 | Fetch message history from a text channel. Args: channel_id (str): The ID of the channel t | STRING |
| HIGH | surfsense_backend/app/connectors/discord_connector.py | 460 | Get information about a user in a guild. Args: guild_id (str): The ID of the guild. | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 107 | Make a request to the BookStack API. Args: endpoint: API endpoint (without base URL, e.g., | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 159 | Fetch all pages from BookStack with pagination. Args: count: Number of records per request | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 202 | Get detailed information for a single page. The response includes 'html' (rendered) and optionally 'ma | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 225 | Export a page as Markdown content. Args: page_id: The ID of the page Returns: | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 244 | Get detailed information for a single book. The response includes a 'content' property with the book's | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 272 | Fetch pages updated within a specific date range. Uses the filter[updated_at:gt] parameter for increme | STRING |
| HIGH | surfsense_backend/app/connectors/bookstack_connector.py | 334 | Get page details along with its full content. Args: page_id: The ID of the page | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_history.py | 271 | Fetch all tasks from a ClickUp workspace. Args: workspace_id: ClickUp workspace (team) ID | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_history.py | 318 | Fetch detailed information about a specific task. Args: task_id: ClickUp task ID | STRING |
| HIGH | surfsense_backend/app/connectors/clickup_history.py | 335 | Fetch comments for a specific task. Args: task_id: ClickUp task ID Returns: | STRING |
| HIGH | …rfsense_backend/app/connectors/confluence_connector.py | 96 | Make a request to the Confluence API. Args: endpoint: API endpoint (without base URL) | STRING |
| HIGH | …rfsense_backend/app/connectors/confluence_connector.py | 172 | Fetch all pages in a specific space. Args: space_id: The ID of the space to fetch pages fr | STRING |
| HIGH | …rfsense_backend/app/connectors/confluence_connector.py | 223 | Fetch all comments for a specific page (both footer and inline comments). Args: page_id: T | STRING |
| HIGH | …nse_backend/app/connectors/google_drive/credentials.py | 24 | Get valid Google OAuth credentials, refreshing if needed. Args: session: Database session conn | STRING |
| HIGH | surfsense_backend/app/tasks/composio_indexer.py | 60 | Dynamically import and return the indexer function for a toolkit. Args: toolkit_id: The toolkit ID (e. | STRING |
| HIGH | surfsense_backend/app/tasks/connector_indexers/base.py | 66 | Parse date from multiple common formats. Args: date_str: Date string to parse Returns: Pa | STRING |
| HIGH | …subagents/connectors/google_drive/tools/create_file.py | 34 | Create a new Google Doc or Google Sheet in Google Drive. Use this tool when the user explicitly asks to create | STRING |
| HIGH | …/subagents/connectors/google_drive/tools/trash_file.py | 27 | Move a Google Drive file to trash. Use this tool when the user explicitly asks to delete, remove, or trash | STRING |
| HIGH | …/builtins/mcp_discovery/tools/calendar/update_event.py | 49 | Update an existing Google Calendar event. Use when the user asks to modify, reschedule, or change a calendar ev | STRING |
| HIGH | …/builtins/mcp_discovery/tools/calendar/delete_event.py | 30 | Delete a Google Calendar event. Use when the user asks to delete, remove, or cancel a calendar event. | STRING |
| HIGH | …/builtins/mcp_discovery/tools/calendar/create_event.py | 34 | Create a new event on Google Calendar. Use when the user asks to schedule, create, or add a calendar event. | STRING |
| HIGH | …nts/builtins/mcp_discovery/tools/gmail/create_draft.py | 32 | Create a draft email in Gmail. Use when the user asks to draft, compose, or prepare an email without se | STRING |
| HIGH | …ts/builtins/mcp_discovery/tools/gmail/search_emails.py | 28 | Search emails in the user's Gmail inbox using Gmail search syntax. Args: query: Gmail search query, | STRING |
| HIGH | …gents/builtins/mcp_discovery/tools/gmail/send_email.py | 37 | Send an email via Gmail. Use when the user explicitly asks to send an email. This sends the email immed | STRING |
| HIGH | …ents/builtins/mcp_discovery/tools/gmail/trash_email.py | 27 | Move an email or draft to trash in Gmail. Use when the user asks to delete, remove, or trash an email or draft. | STRING |
| HIGH | …nts/builtins/mcp_discovery/tools/gmail/update_draft.py | 33 | Update an existing Gmail draft. Use when the user asks to modify, edit, or add content to an existing e | STRING |
| HIGH | …pp/agents/chat/multi_agent_chat/shared/date_filters.py | 11 | Parse either an ISO date (YYYY-MM-DD) or ISO datetime into an aware UTC datetime. - If `value` is a date, inte | STRING |
| HIGH | …gents/chat/multi_agent_chat/shared/tools/mcp/client.py | 46 | Connect to the MCP server and manage its lifecycle. Retries only apply to the **connection** phase (spawning th | STRING |
| HIGH | …gents/chat/multi_agent_chat/shared/tools/mcp/client.py | 181 | Call a tool on the MCP server. Args: tool_name: Name of the tool to call arguments: Arg | STRING |
| HIGH | …are/checkpointed_subagent_middleware/resume_routing.py | 88 | Extract ``[(tool_call_id, action_count), ...]`` from a paused parent state. Reads ``state.interrupts`` (the bundle | STRING |
| HIGH | surfsense_backend/app/utils/oauth_security.py | 100 | Validate and decode state parameter with signature verification. Args: state: The state pa | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 69 | Validate and convert workspace_id to integer. Args: workspace_id: The workspace ID to validate Re | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 123 | Validate and convert document_ids to list of integers. Args: document_ids: The document IDs to validat | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 189 | Validate selected_connectors list. Args: connectors: The connectors to validate Returns: | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 233 | Validate research_mode parameter. Args: research_mode: The research mode to validate Returns: | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 264 | Validate search_mode parameter. Args: search_mode: The search mode to validate Returns: s | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 295 | Validate and convert top_k to integer. Args: top_k: The top_k value to validate Returns: | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 349 | Validate messages structure. Args: messages: The messages to validate Returns: List[dict] | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 411 | Validate email address using pyvalidators library. Args: email: The email address to validate Ret | STRING |
| HIGH | surfsense_backend/app/utils/validators.py | 435 | Validate URL using pyvalidators library. Args: url: The URL to validate Returns: str: Val | STRING |
| 21 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | plans/community-local/seo/data/parse.py | 522 | CODE | |
| LOW | plans/community-local/seo/data/parse.py | 785 | CODE | |
| LOW | plans/community-local/seo/data/parse.py | 1061 | CODE | |
| LOW | …core/cli/surfsense_plugin_cli/invoke/request/inputs.py | 11 | CODE | |
| LOW | plugins/core/sdk/tests/unit/test_public_surface.py | 27 | CODE | |
| LOW | docs/contracts/check-export-sample.py | 29 | CODE | |
| LOW | surfsense_backend/app/users.py | 108 | CODE | |
| LOW | surfsense_backend/app/connectors/slack_history.py | 55 | CODE | |
| LOW | surfsense_backend/app/connectors/slack_history.py | 220 | CODE | |
| LOW | surfsense_backend/app/connectors/slack_history.py | 313 | CODE | |
| LOW | surfsense_backend/app/connectors/slack_history.py | 474 | CODE | |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 79 | CODE | |
| LOW | …sense_backend/app/connectors/google_gmail_connector.py | 385 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 115 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 281 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 591 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 675 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 757 | CODE | |
| LOW | surfsense_backend/app/connectors/notion_history.py | 935 | CODE | |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 57 | CODE | |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 347 | CODE | |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 574 | CODE | |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 102 | CODE | |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 256 | CODE | |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 406 | CODE | |
| LOW | surfsense_backend/app/connectors/teams_history.py | 79 | CODE | |
| LOW | …se_backend/app/connectors/google_calendar_connector.py | 50 | CODE | |
| LOW | surfsense_backend/app/connectors/luma_connector.py | 54 | CODE | |
| LOW | surfsense_backend/app/connectors/luma_connector.py | 210 | CODE | |
| LOW | surfsense_backend/app/connectors/teams_connector.py | 53 | CODE | |
| LOW | surfsense_backend/app/connectors/discord_connector.py | 87 | CODE | |
| LOW | surfsense_backend/app/connectors/airtable_connector.py | 53 | CODE | |
| LOW | surfsense_backend/app/connectors/airtable_connector.py | 332 | CODE | |
| LOW | surfsense_backend/app/connectors/airtable_history.py | 49 | CODE | |
| LOW | surfsense_backend/app/connectors/clickup_history.py | 53 | CODE | |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 295 | CODE | |
| LOW | …ense_backend/app/connectors/onedrive/folder_manager.py | 50 | CODE | |
| LOW | …sense_backend/app/connectors/dropbox/folder_manager.py | 43 | CODE | |
| LOW | …nse_backend/app/connectors/google_drive/credentials.py | 20 | CODE | |
| LOW | …fsense_backend/app/artifacts/infographic/generation.py | 39 | CODE | |
| LOW | …_backend/app/artifacts/verification/formats/mindmap.py | 32 | CODE | |
| LOW | …_backend/app/artifacts/verification/formats/mindmap.py | 158 | CODE | |
| LOW | …nse_backend/app/artifacts/verification/formats/xlsx.py | 53 | CODE | |
| LOW | …se_backend/app/artifacts/verification/formats/ooxml.py | 19 | CODE | |
| LOW | …kend/app/artifacts/verification/formats/infographic.py | 61 | CODE | |
| LOW | …ckend/app/artifacts/verification/formats/study_text.py | 26 | CODE | |
| LOW | …ckend/app/artifacts/verification/formats/study_text.py | 44 | CODE | |
| LOW | …nse_backend/app/artifacts/verification/formats/pptx.py | 184 | CODE | |
| LOW | …fsense_backend/app/tasks/celery_tasks/gateway_tasks.py | 66 | CODE | |
| LOW | …fsense_backend/app/tasks/celery_tasks/gateway_tasks.py | 67 | CODE | |
| LOW | …d/app/tasks/celery_tasks/stripe_reconciliation_task.py | 39 | CODE | |
| LOW | …/tasks/celery_tasks/stale_notification_cleanup_task.py | 81 | CODE | |
| LOW | …/tasks/celery_tasks/stale_notification_cleanup_task.py | 264 | CODE | |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 542 | CODE | |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 825 | CODE | |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 1262 | CODE | |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 1401 | CODE | |
| LOW | …ackend/app/tasks/celery_tasks/schedule_checker_task.py | 30 | CODE | |
| LOW | surfsense_backend/app/tasks/chat/persistence.py | 114 | CODE | |
| LOW | …sense_backend/app/tasks/chat/llm_history_normalizer.py | 43 | CODE | |
| 303 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | surfsense_backend/app/connectors/clickup_connector.py | 143 | # Check if there are more pages | COMMENT |
| LOW | surfsense_backend/app/connectors/clickup_connector.py | 196 | # Check if there are more pages | COMMENT |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 67 | # Check if client was initialized with a token directly (not via credentials) | COMMENT |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 137 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 211 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 323 | # Check if this error is retryable | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 328 | # Check if we've exhausted retries | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 638 | # Check if this is an unsupported block type error | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 691 | # Check if this is a known unsupported block type before processing | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 709 | # Check if block has children | COMMENT |
| LOW | surfsense_backend/app/connectors/notion_history.py | 731 | # Check if this is an unsupported block type error | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 82 | # Check if using OAuth or legacy API token | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 89 | # Check if access_token exists before processing | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 168 | # Check if token is expired and refreshable (only for OAuth) | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 432 | # Check if there are more spaces to fetch | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 485 | # Check if there are more pages to fetch | COMMENT |
| LOW | surfsense_backend/app/connectors/confluence_history.py | 560 | # Check if there are more comments to fetch | COMMENT |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 127 | # Check if access_token exists before processing | COMMENT |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 177 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/linear_connector.py | 538 | # Check if there are more pages | STRING |
| LOW | …se_backend/app/connectors/google_calendar_connector.py | 241 | # Set start to beginning of day (00:00:00) and end to end of day (23:59:59) | COMMENT |
| LOW | surfsense_backend/app/connectors/luma_connector.py | 246 | # Check if event falls within the date range | COMMENT |
| LOW | surfsense_backend/app/connectors/teams_connector.py | 127 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/teams_connector.py | 295 | # Check if message is within date range | COMMENT |
| LOW⚡ | surfsense_backend/app/connectors/discord_connector.py | 159 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/bookstack_connector.py | 191 | # Check if we've fetched all pages | COMMENT |
| LOW | surfsense_backend/app/connectors/bookstack_connector.py | 312 | # Check if we've fetched all pages | COMMENT |
| LOW | surfsense_backend/app/connectors/airtable_history.py | 74 | # Check if access_token exists before processing | COMMENT |
| LOW | surfsense_backend/app/connectors/airtable_history.py | 124 | # Check if token is expired and refreshable | COMMENT |
| LOW | surfsense_backend/app/connectors/clickup_history.py | 83 | # Check if using OAuth or legacy API token | COMMENT |
| LOW | surfsense_backend/app/connectors/clickup_history.py | 162 | # Check if token is expired and refreshable (only for OAuth) | COMMENT |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 155 | # Check if there are more spaces to fetch | COMMENT |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 208 | # Check if there are more pages to fetch | COMMENT |
| LOW | …rfsense_backend/app/connectors/confluence_connector.py | 281 | # Check if there are more comments to fetch | COMMENT |
| LOW | …nse_backend/app/connectors/google_drive/credentials.py | 141 | # Check if this is an invalid_grant error (token expired/revoked) | COMMENT |
| LOW | surfsense_backend/app/tasks/composio_indexer.py | 161 | # Check if toolkit is indexable | COMMENT |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 495 | # Check if file exists and is accessible | COMMENT |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 636 | # Check if this is an insufficient-credit error (either direct or | COMMENT |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 758 | # Check if file exists and is accessible | COMMENT |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 923 | # Set status to PROCESSING (shows spinner in UI via Zero) | COMMENT |
| LOW | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 975 | # Check if this is an insufficient-credit error | COMMENT |
| LOW | …e_backend/app/tasks/connector_indexers/luma_indexer.py | 299 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …e_backend/app/tasks/connector_indexers/luma_indexer.py | 341 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …kend/app/tasks/connector_indexers/bookstack_indexer.py | 251 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …kend/app/tasks/connector_indexers/bookstack_indexer.py | 293 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/discord_indexer.py | 240 | # Check if using OAuth (has bot_token in config) or legacy (has DISCORD_BOT_TOKEN) | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/discord_indexer.py | 517 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/discord_indexer.py | 562 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …_backend/app/tasks/connector_indexers/teams_indexer.py | 409 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …_backend/app/tasks/connector_indexers/teams_indexer.py | 454 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …_backend/app/tasks/connector_indexers/slack_indexer.py | 391 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …_backend/app/tasks/connector_indexers/slack_indexer.py | 434 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/clickup_indexer.py | 100 | # Check if using OAuth (has access_token in config) or legacy (has CLICKUP_API_TOKEN) | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/clickup_indexer.py | 252 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …ackend/app/tasks/connector_indexers/clickup_indexer.py | 296 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …backend/app/tasks/connector_indexers/github_indexer.py | 230 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …backend/app/tasks/connector_indexers/github_indexer.py | 264 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| LOW | …/app/tasks/connector_indexers/elasticsearch_indexer.py | 504 | # Check if custom query is provided | COMMENT |
| LOW | …ckend/app/tasks/connector_indexers/airtable_indexer.py | 270 | # Check if document with this unique identifier already exists | COMMENT |
| LOW | …ckend/app/tasks/connector_indexers/airtable_indexer.py | 306 | # Check if a document with the same content_hash exists (from another connector) | COMMENT |
| 56 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …/tasks/celery_tasks/stale_notification_cleanup_task.py | 87 | 3. Mark those as failed with O(1) batch UPDATE using JSONB || operator | STRING |
| HIGH | …/tasks/celery_tasks/stale_notification_cleanup_task.py | 159 | SET metadata = metadata || CAST(:update_json AS jsonb), | CODE |
| HIGH | …/tasks/celery_tasks/stale_notification_cleanup_task.py | 335 | SET metadata = metadata || CAST(:update_json AS jsonb), | CODE |
| HIGH⚡ | …rfsense_backend/app/proprietary/web_crawler/captcha.py | 172 | if (cfg && cfg.clients) { | CODE |
| HIGH⚡ | …rfsense_backend/app/proprietary/web_crawler/captcha.py | 177 | if (o && typeof o === 'object') { | CODE |
| HIGH⚡ | …rfsense_backend/app/proprietary/web_crawler/captcha.py | 180 | if (cb && cb.callback && typeof cb.callback === 'function') { | CODE |
| HIGH | surfsense_backend/app/knowledge_store/service.py | 167 | lambda: engine.push( | CODE |
| HIGH | surfsense_backend/app/knowledge_store/engines/git.py | 207 | porcelain.push( | CODE |
| HIGH | surfsense_backend/app/knowledge_store/remote/facade.py | 302 | return shadow.push( | CODE |
| HIGH | surfsense_backend/app/knowledge_store/remote/facade.py | 417 | return shadow.push( | CODE |
| HIGH | surfsense_backend/app/knowledge_store/remote/shadow.py | 131 | porcelain.push( | CODE |
| HIGH⚡ | …backend/tests/unit/knowledge_store/engines/test_git.py | 369 | pushed = source.push( | CODE |
| HIGH | …backend/tests/unit/knowledge_store/engines/test_git.py | 395 | source.push( | CODE |
| HIGH | …ckend/tests/unit/knowledge_store/remote/test_shadow.py | 54 | shadow.push(url=str(dest._path), ref=shadow.head_ref()) | CODE |
| HIGH | …sts/integration/knowledge_store/remote/test_connect.py | 47 | seed.push( | CODE |
| HIGH | …/tests/integration/knowledge_store/remote/test_sync.py | 22 | seed.push( | CODE |
| HIGH | …/tests/integration/knowledge_store/remote/test_sync.py | 279 | editor.push(url=str(dest._path), ref="refs/heads/main") | CODE |
| HIGH | …/tests/integration/knowledge_store/remote/test_sync.py | 325 | editor.push(url=str(dest._path), ref="refs/heads/main") | CODE |
| HIGH | …/tests/integration/knowledge_store/remote/test_sync.py | 371 | editor.push(url=str(dest._path), ref="refs/heads/main") | CODE |
| HIGH | …/tests/integration/knowledge_store/remote/test_sync.py | 409 | editor.push(url=str(dest._path), ref="refs/heads/main") | CODE |
| HIGH | …/alembic/versions/107_add_video_presentations_table.py | 34 | WHEN duplicate_object THEN null; | CODE |
| HIGH | …d/alembic/versions/82_add_podcast_status_and_thread.py | 26 | WHEN duplicate_object THEN null; | STRING |
| HIGH | …ckend/tests/unit/llm/providers/test_prompt_progress.py | 29 | 'data: {"choices":[{"delta":{"role":"assistant","content":null}}],' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/proposals/plugins/core/02-registry.md | 134 | "author": "Jane Doe", | CODE |
| LOW | docs/proposals/file-agent/01-sources-and-folders.md | 124 | state CHECK in ('ready','placeholder','trashed','deleting'), | CODE |
| LOW | docs/proposals/file-agent/01-sources-and-folders.md | 128 | WHERE parent_id IS NOT NULL AND state IN ('ready','placeholder') | CODE |
| LOW | docs/proposals/file-agent/01-sources-and-folders.md | 141 | state CHECK in ('queued','indexed','stale','unsupported','placeholder', | CODE |
| LOW | surfsense_web/messages/zh.json | 433 | "placeholder": "输入 URL 并按 Enter", | CODE |
| LOW | surfsense_web/messages/zh.json | 462 | "placeholder": "在此粘贴 YouTube 视频或播放列表 URL", | CODE |
| LOW | surfsense_web/messages/pt.json | 433 | "placeholder": "Insira uma URL e pressione Enter", | CODE |
| LOW | surfsense_web/messages/pt.json | 462 | "placeholder": "Cole URLs de vídeos ou playlists do YouTube aqui", | CODE |
| LOW | surfsense_web/messages/en.json | 257 | "name_placeholder": "John Doe", | CODE |
| LOW | surfsense_web/messages/en.json | 433 | "placeholder": "Enter a URL and press Enter", | CODE |
| LOW | surfsense_web/messages/en.json | 462 | "placeholder": "Paste YouTube video or playlist URLs here", | CODE |
| LOW | surfsense_web/messages/hi.json | 433 | "placeholder": "URL दर्ज करें और Enter दबाएं", | CODE |
| LOW | surfsense_web/messages/hi.json | 462 | "placeholder": "YouTube वीडियो या प्लेलिस्ट URL यहां पेस्ट करें", | CODE |
| LOW | surfsense_web/messages/ko.json | 433 | "placeholder": "URL을 입력하고 Enter를 누르세요", | CODE |
| LOW | surfsense_web/messages/ko.json | 462 | "placeholder": "유튜브 동영상 또는 재생목록 URL을 붙여넣으세요", | CODE |
| LOW | surfsense_web/messages/es.json | 433 | "placeholder": "Ingresa una URL y presiona Enter", | CODE |
| LOW | surfsense_web/messages/es.json | 462 | "placeholder": "Pega URLs de videos o listas de reproducción de YouTube aquí", | CODE |
| LOW | …se_web/features/chat-messages/timeline/turn-timing.tsx | 64 | if (display.phase === "placeholder") return null; | CODE |
| LOW | …b/features/chat-messages/timeline/turn-timing-state.ts | 10 | | { phase: "placeholder" } | CODE |
| LOW | …b/features/chat-messages/timeline/turn-timing-state.ts | 22 | if (!snapshot) return { phase: "placeholder" }; | CODE |
| LOW | surfsense_web/tests/unit/chat/turn-timing.test.ts | 7 | assert.deepEqual(resolveTurnTimingDisplay(null, true), { phase: "placeholder" }); | CODE |
| LOW | …tant-ui/connector-popup/views/youtube-crawler-view.tsx | 254 | placeholder={t("placeholder")} | CODE |
| LOW | …fsense_backend/app/tasks/celery_tasks/gateway_tasks.py | 154 | parsed = TelegramAdapter("placeholder").parse_inbound(raw_update) | CODE |
| LOW | surfsense_backend/app/utils/crawl/contacts.py | 143 | "placeholder", | CODE |
| LOW | surfsense_backend/app/utils/crawl/contacts.py | 163 | "placeholder", | CODE |
| LOW | …ckend/tests/unit/platforms/indeed_jobs/test_parsers.py | 26 | "company": "Acme Corp", | CODE |
| LOW | …ckend/tests/unit/platforms/indeed_jobs/test_parsers.py | 71 | assert item["company"] == "Acme Corp" | CODE |
| LOW | …/tests/unit/proprietary/web_crawler/test_url_policy.py | 76 | "text": "Jane Doe", | STRING |
| LOW⚡ | …fsense_backend/tests/unit/capabilities/test_billing.py | 35 | fake_user = _FakeUser(balance_micros) | CODE |
| LOW⚡ | …fsense_backend/tests/unit/capabilities/test_billing.py | 42 | result.unique.return_value.scalar_one_or_none.return_value = fake_user # debit | CODE |
| LOW⚡ | …fsense_backend/tests/unit/capabilities/test_billing.py | 46 | return session, fake_user | CODE |
| LOW | …backend/tests/unit/capabilities/test_run_truncation.py | 243 | "text": "Jane Doe", | CODE |
| LOW | …backend/tests/unit/capabilities/test_run_truncation.py | 256 | "text": "Jane Doe", | CODE |
| LOW⚡ | …backend/tests/unit/capabilities/test_run_truncation.py | 278 | assert links[0]["text"] == "Jane Doe" | CODE |
| LOW⚡ | …backend/tests/unit/capabilities/test_run_truncation.py | 291 | assert "Jane Doe" in lines[1] | CODE |
| LOW⚡ | …ense_backend/tests/unit/license/test_license_routes.py | 397 | ["user@example.com", "user+a@example.com", "user+b@example.com"] | CODE |
| LOW⚡ | …/unit/connector_indexers/test_google_drive_parallel.py | 258 | fake_user = _FakeUser(balance_micros, reserved_micros) | CODE |
| LOW⚡ | …/unit/connector_indexers/test_google_drive_parallel.py | 264 | fake_user.credit_micros_balance, | CODE |
| LOW⚡ | …/unit/connector_indexers/test_google_drive_parallel.py | 265 | fake_user.credit_micros_reserved, | CODE |
| LOW⚡ | …/unit/connector_indexers/test_google_drive_parallel.py | 267 | r.unique.return_value.scalar_one_or_none.return_value = fake_user | CODE |
| LOW⚡ | …/unit/connector_indexers/test_google_drive_parallel.py | 271 | return session, fake_user | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 129 | fake_user = _FakeUser(balance_micros, reserved_micros) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 135 | fake_user.credit_micros_balance, | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 136 | fake_user.credit_micros_reserved, | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 138 | result.unique.return_value.scalar_one_or_none.return_value = fake_user | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 142 | return session, fake_user | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 164 | session, fake_user = _make_credit_session(_micros(100)) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 291 | assert m["fake_user"].credit_micros_balance == _micros(100) - _micros(2) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 297 | m["fake_user"].credit_micros_balance = _micros(95) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 307 | assert m["fake_user"].credit_micros_balance == _micros(95) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 313 | m["fake_user"].credit_micros_balance = 0 | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 338 | session, fake_user = _make_credit_session(_micros(100)) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 427 | assert m["fake_user"].credit_micros_balance == _micros(100) - _micros(3) | CODE |
| LOW⚡ | …kend/tests/unit/connector_indexers/test_etl_credits.py | 583 | assert m["fake_user"].credit_micros_balance == _micros(100) - _micros(2) | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 188 | "fake_user": fake_user, | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 213 | m["fake_user"].credit_micros_balance = _micros(100) | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 235 | m["fake_user"].credit_micros_balance = _micros(2) | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 254 | m["fake_user"].credit_micros_balance = _micros(2) | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 276 | m["fake_user"].credit_micros_balance = _micros(100) | CODE |
| LOW | …kend/tests/unit/connector_indexers/test_etl_credits.py | 359 | "fake_user": fake_user, | CODE |
| 55 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | plans/community-local/file-agent-strategy.md | 100 | | Engine | built: `docxkit` about 19,000 lines, `crlib` about 12,000 ([02, Today](../../docs/proposals/file-agent/02-ski | CODE |
| MEDIUM | docs/architecture/studio.md | 12 | [`service.py`](../../surfsense_local/backend/modules/artifacts/service.py)`::create_artifact_job(session, workspace, pay | CODE |
| MEDIUM | docs/architecture/studio.md | 162 | The agent's PDF tools make their file themselves ([agent](agent.md#pdfs-the-agent-works-on)), so [`made_file.py`](../../ | CODE |
| MEDIUM | docs/proposals/embedding-model-choice.md | 20 | # Choosing the embedding model once | COMMENT |
| MEDIUM | docs/proposals/embedding-model-change.md | 9 | # Changing the embedding model | COMMENT |
| MEDIUM | docs/proposals/file-agent/README.md | 48 | - **Editing the customer's file is now expected.** Claude for Word writes native tracked changes ([Anthropic](https://cl | CODE |
| MEDIUM | .github/workflows/desktop-tests.yml | 92 | # Tests that need the real embedding model skip without it. | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9 | "description": "Gemini 3.1 Pro Preview is Google’s frontier reasoning model, delivering enhanced software engineer | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9 | "description": "Gemini 3.1 Pro Preview is Google’s frontier reasoning model, delivering enhanced software engineer | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9 | "description": "Gemini 3.1 Pro Preview is Google’s frontier reasoning model, delivering enhanced software engineer | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 2715 | "description": "Gemini 3 Pro is Google’s flagship frontier model for high-precision multimodal reasoning, combinin | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 2715 | "description": "Gemini 3 Pro is Google’s flagship frontier model for high-precision multimodal reasoning, combinin | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 2715 | "description": "Gemini 3 Pro is Google’s flagship frontier model for high-precision multimodal reasoning, combinin | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9834 | "description": "Note: Sonar Pro pricing includes Perplexity search pricing. See [details here](https://docs.perple | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 1011 | "description": "GPT-5.2-Codex is an upgraded version of GPT-5.1-Codex optimized for software engineering and codin | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 1011 | "description": "GPT-5.2-Codex is an upgraded version of GPT-5.1-Codex optimized for software engineering and codin | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 1762 | "description": "The relace-search model uses 4-12 `view_file` and `grep` tools in parallel to explore a codebase a | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 2896 | "description": "GPT-5.1-Codex is a specialized version of GPT-5.1 optimized for software engineering and coding wo | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 2896 | "description": "GPT-5.1-Codex is a specialized version of GPT-5.1 optimized for software engineering and coding wo | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4311 | "description": "DeepSeek-V3.2-Exp is an experimental large language model released by DeepSeek as an intermediate | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4311 | "description": "DeepSeek-V3.2-Exp is an experimental large language model released by DeepSeek as an intermediate | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4670 | "description": "GPT-5-Codex is a specialized version of GPT-5 optimized for software engineering and coding workfl | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4670 | "description": "GPT-5-Codex is a specialized version of GPT-5 optimized for software engineering and coding workfl | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4713 | "description": "DeepSeek-V3.1 Terminus is an update to [DeepSeek V3.1](/deepseek/deepseek-chat-v3.1) that maintain | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4713 | "description": "DeepSeek-V3.1 Terminus is an update to [DeepSeek V3.1](/deepseek/deepseek-chat-v3.1) that maintain | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4764 | "description": "DeepSeek-V3.1 Terminus is an update to [DeepSeek V3.1](/deepseek/deepseek-chat-v3.1) that maintain | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 4764 | "description": "DeepSeek-V3.1 Terminus is an update to [DeepSeek V3.1](/deepseek/deepseek-chat-v3.1) that maintain | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 5558 | "description": "DeepSeek-V3.1 is a large hybrid reasoning model (671B parameters, 37B active) that supports both t | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 5558 | "description": "DeepSeek-V3.1 is a large hybrid reasoning model (671B parameters, 37B active) that supports both t | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 9794 | "description": "Note: Sonar Pro pricing includes Perplexity search pricing. See [details here](https://docs.perple | CODE |
| MEDIUM | …ents/builtins/deliverables/tools/video_presentation.py | 92 | # timeout (multi-agent) or HTTP lifetime (single-agent) — | COMMENT |
| MEDIUM | …/agents/chat/multi_agent_chat/shared/tools/mcp/tool.py | 61 | # multi-agent paths cannot share tool closures with different HITL wiring. | COMMENT |
| MEDIUM | …ent_chat/main_agent/middleware/otel_span/middleware.py | 69 | # the usual culprit when the multi-agent path feels slow to start. | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/utils/document_converters.py | 19 | # This reentrant lock serialises tokenizer + embedding model access so that | COMMENT |
| MEDIUM | surfsense_backend/app/utils/document_converters.py | 145 | # Get model context window | COMMENT |
| MEDIUM | surfsense_backend/app/routes/documents_routes.py | 741 | # Local import: the retriever pulls in the embedding model + agent stack, | COMMENT |
| MEDIUM | surfsense_backend/tests/e2e/fakes/embeddings.py | 74 | # passthrough to a real embedding model would be expensive | COMMENT |
| MEDIUM | surfsense_local/backend/tests/conftest.py | 33 | # Where the real embedding model might be: the staged pack `pnpm dev` points the | COMMENT |
| MEDIUM | …sense_local/backend/tests/integration/chat/conftest.py | 22 | # The context window /props reports, or None to omit it (an older build / | COMMENT |
| MEDIUM | surfsense_local/backend/scripts/retrieval_eval/run.py | 76 | # Imported here: it pulls onnxruntime and the embedding model. | COMMENT |
| MEDIUM | …local/backend/modules/llm/catalog/remote/classifier.py | 25 | # context window. | COMMENT |
| MEDIUM | …fsense_local/backend/modules/llm/connections/router.py | 59 | # spending the budget on a reasoning trace gets near it. At 64 such a model | COMMENT |
| MEDIUM | surfsense_local/backend/modules/llm/profile/classify.py | 3 | # Under the first a model loses accuracy when asked to follow a scaffold; between | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | surfsense_backend/app/connectors/notion_history.py | 890 | # Create the page with standard title property | COMMENT |
| MEDIUM | surfsense_backend/app/connectors/github_connector.py | 90 | # Create a temporary file for output | COMMENT |
| MEDIUM | …nse_backend/app/tasks/celery_tasks/auto_reload_task.py | 133 | # Create the PENDING purchase row first so its id seeds the Stripe | COMMENT |
| MEDIUM | …sense_backend/app/tasks/celery_tasks/document_tasks.py | 655 | # Create a dedicated insufficient credits notification | COMMENT |
| MEDIUM | …rfsense_backend/app/proprietary/web_crawler/captcha.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …rfsense_backend/app/proprietary/web_crawler/stealth.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …sense_backend/app/proprietary/web_crawler/connector.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …app/proprietary/web_crawler/testbench/suite_stealth.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …kend/app/proprietary/web_crawler/testbench/__init__.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …_backend/app/proprietary/web_crawler/testbench/core.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …/proprietary/web_crawler/testbench/suite_extraction.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …kend/app/proprietary/web_crawler/testbench/__main__.py | 3 | # This module is part of the ``app.proprietary`` package and is licensed | COMMENT |
| MEDIUM | …ense_backend/app/config/global_llm_config.example.yaml | 8 | # This file is intentionally safe to commit. Do not put real API keys in this | COMMENT |
| MEDIUM | surfsense_backend/app/config/__init__.py | 1359 | # Create a config instance | COMMENT |
| MEDIUM | surfsense_backend/app/routes/new_chat_routes.py | 2302 | # Create a wrapper generator that deletes messages only AFTER streaming succeeds | COMMENT |
| MEDIUM | …_backend/app/routes/search_source_connectors_routes.py | 2058 | # Create a wrapper function that calls index_google_gmail_messages with max_messages | COMMENT |
| MEDIUM | …_backend/app/routes/search_source_connectors_routes.py | 2712 | # Create the connector with single server config | COMMENT |
| MEDIUM | surfsense_backend/app/routes/incentive_tasks_routes.py | 114 | # Create the task completion record | COMMENT |
| MEDIUM | surfsense_backend/app/services/reranker_service.py | 106 | # Create a deep copy to preserve the full structure including chunks | COMMENT |
| MEDIUM | surfsense_backend/app/services/llm_router_service.py | 745 | # Create a new instance with tools bound. Carry through ``model_kwargs`` | COMMENT |
| MEDIUM | …sions/9_add_discord_connector_enum_and_documenttype.py | 17 | # Define the ENUM type name and the new value | COMMENT |
| MEDIUM | …ckend/alembic/versions/59_add_teams_connector_enums.py | 17 | # Define the ENUM type name and the new value | COMMENT |
| MEDIUM | …d/alembic/versions/48_add_note_to_documenttype_enum.py | 18 | # Define the ENUM type name and the new value | COMMENT |
| MEDIUM | …ic/versions/3_add_linear_connector_to_documenttype_.py | 18 | # Define the ENUM type name and the new value | COMMENT |
| MEDIUM | …/e55302644c51_add_github_connector_to_documenttype_.py | 11 | # Define the ENUM type name and the new value | COMMENT |
| MEDIUM | …backend/alembic/versions/73_add_user_memories_table.py | 30 | # Create the MemoryCategory enum type | COMMENT |
| MEDIUM | …66_add_notifications_table_and_electric_replication.py | 113 | # Create the publication if not exists | STRING |
| MEDIUM | …ons/10_update_chattype_enum_to_qna_report_structure.py | 19 | # Define the ENUM type name | COMMENT |
| MEDIUM | …sense_backend/alembic/versions/99_add_reports_table.py | 21 | # Create the reports table | COMMENT |
| MEDIUM | …nd/alembic/versions/79_add_composio_connector_enums.py | 30 | # Define the ENUM type names and the new values | COMMENT |
| MEDIUM | …mbic/versions/61_add_chat_visibility_and_created_by.py | 26 | # Create the ChatVisibility enum type | COMMENT |
| MEDIUM⚡ | …/alembic/versions/80_add_user_incentive_tasks_table.py | 35 | # Create the enum type only if it doesn't exist | COMMENT |
| MEDIUM⚡ | …/alembic/versions/80_add_user_incentive_tasks_table.py | 53 | # Create the user_incentive_tasks table | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/docker-compose.e2e.yml | 1 | # ============================================================================= | COMMENT |
| LOW | docker/docker-compose.yml | 181 | timeout: 5s | COMMENT |
| LOW | docker/docker-compose.deps-only.yml | 1 | # ============================================================================= | COMMENT |
| LOW | docker/docker-compose.deps-only.yml | 21 | # - Web .env: NEXT_PUBLIC_ZERO_CACHE_URL=http://localhost:${ZERO_CACHE_PORT:-4848} | COMMENT |
| LOW | docker/opensandbox/sandbox.toml | 21 | # leaving network_mode at its "host" default, which egress rejects. | COMMENT |
| LOW | docker/scripts/install.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/scripts/migrate-database.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/scripts/migrate-database.sh | 21 | # - ~500 MB free disk space for the dump file | COMMENT |
| LOW | surfsense_web/components/editor/plate-editor.tsx | 221 | [onSave, hasUnsavedChanges, isSaving, canToggleMode, reserveToolbarSpace] | COMMENT |
| LOW | …fsense_web/components/editor/utils/safe-deserialize.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | surfsense_web/components/editor/utils/escape-mdx.ts | 1 | // --------------------------------------------------------------------------- | COMMENT |
| LOW | surfsense_web/lib/markdown/code-regions.ts | 1 | // Matches fenced (```...```) and inline (`...`) code regions. Used by MDX | COMMENT |
| LOW | surfsense_web/lib/announcements/announcements-data.ts | 61 | // category: "feature", | COMMENT |
| LOW | surfsense_web/lib/announcements/announcements-data.ts | 81 | // id: "2026-02-08-scheduled-maintenance", | COMMENT |
| LOW | surfsense_web/lib/announcements/announcements-data.ts | 101 | // audience: "users", | COMMENT |
| LOW | .github/workflows/release-local.yml | 361 | surfsense_local/electron/release/*.deb | COMMENT |
| LOW | surfsense_backend/alembic.ini | 1 | # A generic, single database configuration. | COMMENT |
| LOW | surfsense_backend/alembic.ini | 21 | # leave blank for localtime | COMMENT |
| LOW | surfsense_backend/alembic.ini | 41 | COMMENT | |
| LOW | surfsense_backend/alembic.ini | 61 | # are written from script.py.mako | COMMENT |
| LOW | surfsense_backend/app/db.py | 1381 | document_type = Column(SQLAlchemyEnum(DocumentType), nullable=False) | COMMENT |
| LOW | surfsense_backend/app/users.py | 281 | # CookieTransport, | COMMENT |
| LOW | …e_backend/app/tasks/chat/streaming/agent/event_loop.py | 141 | COMMENT | |
| LOW | …ckend/app/proprietary/platforms/google_maps/parsers.py | 381 | COMMENT | |
| LOW | …ckend/app/proprietary/platforms/google_search/fetch.py | 81 | # Gateways whose sticky sessions are selected by destination port. A random port | COMMENT |
| LOW | …ckend/app/proprietary/platforms/google_search/fetch.py | 101 | # IP is exactly what Google re-walls), and each pool IP is solved **once** — so | COMMENT |
| LOW | …ckend/app/proprietary/platforms/google_search/fetch.py | 121 | _WARM_IP_MAX_CONCURRENCY = int(os.getenv("GOOGLE_SEARCH_IP_MAX_CONCURRENCY", "2")) | COMMENT |
| LOW | …ckend/app/proprietary/platforms/google_search/fetch.py | 381 | return await _expand_blocks(page) | COMMENT |
| LOW | …ckend/app/proprietary/platforms/google_search/fetch.py | 401 | COMMENT | |
| LOW | …end/app/proprietary/platforms/google_search/parsers.py | 521 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 81 | # different handling per status (spec section 3). | COMMENT |
| LOW | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 101 | # floor just ADDED ~0.4s of dead sleep to every fetch. A 0.5s floor is a no-op | COMMENT |
| LOW | …ense_backend/app/proprietary/platforms/reddit/fetch.py | 121 | # The browser warm loads *a* public HTML page so Reddit's JS challenge runs and | COMMENT |
| LOW | …backend/app/proprietary/platforms/instagram/parsers.py | 281 | # 1. An inline ``<script type="application/json">`` block embedding the mobile | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 1 | # Global LLM Configuration | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 21 | # - Connection fields: provider, api_key, api_base, api_version | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 41 | # | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 61 | router_settings: | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 181 | tpm: 4000000 | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 281 | # Field Notes | COMMENT |
| LOW | …ense_backend/app/config/global_llm_config.example.yaml | 301 | # - is_planner: true marks the internal-only planner model. Only one config | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 501 | # CREATE INDEX / CREATE TABLE fails fast instead of hanging the FastAPI | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 721 | # app/users.py grow up -- so these are named like the other shared | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 741 | SMTP_FROM = os.getenv("SMTP_FROM", "").strip() | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 781 | # Web-crawl billing debits the credit wallet per *successful* crawl request | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 801 | # crawl-billing flag. Price is config-driven (no hardcoded rate): | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 1241 | # Phase 3d — Captcha solving (reCAPTCHA v2/v3, hCaptcha, v2-Enterprise) via | COMMENT |
| LOW | surfsense_backend/app/config/__init__.py | 1261 | # Abort a single solve after this many seconds (solves take 10-60s). | COMMENT |
| LOW | …/agents/chat/multi_agent_chat/subagents/shared/spec.py | 21 | COMMENT | |
| LOW | …p/agents/chat/multi_agent_chat/shared/feature_flags.py | 61 | enable_revert_route: bool = True | COMMENT |
| LOW | surfsense_backend/app/utils/validators.py | 541 | "BAIDU_SEARCH_API": { | COMMENT |
| LOW | surfsense_backend/app/utils/validators.py | 561 | # "scope", | COMMENT |
| LOW | surfsense_backend/app/utils/validators.py | 581 | # "JIRA_EMAIL": lambda: validate_email_field("JIRA_EMAIL", "JIRA"), | COMMENT |
| LOW | surfsense_backend/app/etl_pipeline/picture_describer.py | 61 | # raises if OCR failed unrecoverably (which the describer catches and | COMMENT |
| LOW | surfsense_backend/app/etl_pipeline/picture_describer.py | 401 | parts.append(description.strip()) | COMMENT |
| LOW | surfsense_backend/app/routes/new_chat_routes.py | 1441 | # Update thread's updated_at timestamp (always — both insert | COMMENT |
| LOW | surfsense_backend/app/routes/new_chat_routes.py | 1461 | # async greenlet boundary, so even ``Raised Exceptions`` | COMMENT |
| LOW | surfsense_backend/app/routes/new_chat_routes.py | 1561 | status_code=500, | COMMENT |
| LOW | surfsense_backend/app/routes/new_chat_routes.py | 2041 | status_code=400, detail="No conversation history found for this thread" | COMMENT |
| LOW | surfsense_backend/app/routes/new_chat_routes.py | 2061 | # ``from_message_id`` we look up its persisted ``turn_id`` (added | COMMENT |
| 30 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 176 | // Step 1: kick off OAuth, get auth_url. | COMMENT |
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 193 | // Step 2: follow the auth_url. The fake makes this same-origin and | COMMENT |
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 204 | // Step 3: look up the resulting connector (if any). | COMMENT |
| LOW | …ckend/app/connectors/google_drive/content_extractor.py | 178 | # Step 1: Download or export the file | COMMENT |
| LOW⚡ | surfsense_backend/app/etl_pipeline/picture_describer.py | 566 | # Step 1: layout-aware figures. One-shot batch -- finds ALL | COMMENT |
| LOW⚡ | surfsense_backend/app/etl_pipeline/picture_describer.py | 571 | # Step 2: Docling-style replacement markers. One match per | COMMENT |
| LOW⚡ | …tests/integration/chat/test_append_message_recovery.py | 477 | # Step 2: server stream's persist_assistant_shell now races | COMMENT |
| LOW⚡ | …tests/integration/chat/test_append_message_recovery.py | 486 | # Step 3: server finalize then overwrites the FE's stub with | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 343 | # Step 1: server stream completes. Server-built rich content is | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 363 | # Step 2: simulate the legacy FE ``appendMessage`` round-trip | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 462 | # Step 1: legacy FE appendMessage lands first. No prior shell | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 42 | # Step 1: Add search_space_id column as nullable first (if it doesn't exist) | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 49 | # Step 2: Populate search_space_id with each user's first search space | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 65 | # Step 3: Make search_space_id NOT NULL | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 72 | # Step 4: Add foreign key constraint (if it doesn't exist) | COMMENT |
| LOW | …versions/23_associate_connectors_with_search_spaces.py | 86 | # Step 5: Drop the old unique constraint (user_id, connector_type) if it exists | COMMENT |
| LOW | …versions/23_associate_connectors_with_search_spaces.py | 98 | # Step 6: Create new unique constraint (search_space_id, user_id, connector_type) if it doesn't exist | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 130 | # Step 1: Drop the new unique constraint if it exists | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 138 | # Step 2: Recreate the old unique constraint (user_id, connector_type) if it doesn't exist | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 148 | # Step 3: Drop the foreign key constraint if it exists | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 156 | # Step 4: Drop the search_space_id column if it exists | COMMENT |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 70 | # Step 1: Move all memberships from Admin roles to corresponding Editor roles (BULK) | COMMENT |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 84 | # Step 2: Move all invites from Admin roles to corresponding Editor roles (BULK) | STRING |
| LOW⚡ | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 97 | # Step 3: Delete all Admin roles (BULK) | STRING |
| LOW⚡ | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 105 | # Step 4: Update Editor permissions for all search spaces (BULK) | STRING |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 118 | # Step 5: Update Viewer permissions for all search spaces (BULK) | STRING |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 33 | # Step 1: Copy last_edited_at values to updated_at where updated_at is NULL | COMMENT |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 43 | # Step 2: For documents where both exist, use the most recent timestamp | STRING |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 53 | # Step 3: Drop the last_edited_at column | STRING |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 63 | # Step 1: Rename the current enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 66 | # Step 2: Create the new enum type with new values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 69 | # Step 3: Add a temporary column with the new type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 74 | # Step 4: Update the temporary column with mapped values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 88 | # Step 5: Drop the old column | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 91 | # Step 6: Rename the new column to the original name | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 96 | # Step 7: Drop the old enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 118 | # Step 1: Rename the current enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 121 | # Step 2: Create the new enum type with original values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 124 | # Step 3: Add a temporary column with the original type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 129 | # Step 4: Update the temporary column with mapped values back to old values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 143 | # Step 5: Drop the old column | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 146 | # Step 6: Rename the new column to the original name | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 151 | # Step 7: Drop the old enum type | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 176 | // Step 1: kick off OAuth, get auth_url. | COMMENT |
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 193 | // Step 2: follow the auth_url. The fake makes this same-origin and | COMMENT |
| LOW | surfsense_web/tests/helpers/api/connectors.ts | 204 | // Step 3: look up the resulting connector (if any). | COMMENT |
| LOW | …ckend/app/connectors/google_drive/content_extractor.py | 178 | # Step 1: Download or export the file | COMMENT |
| LOW⚡ | surfsense_backend/app/etl_pipeline/picture_describer.py | 566 | # Step 1: layout-aware figures. One-shot batch -- finds ALL | COMMENT |
| LOW⚡ | surfsense_backend/app/etl_pipeline/picture_describer.py | 571 | # Step 2: Docling-style replacement markers. One match per | COMMENT |
| LOW⚡ | …tests/integration/chat/test_append_message_recovery.py | 477 | # Step 2: server stream's persist_assistant_shell now races | COMMENT |
| LOW⚡ | …tests/integration/chat/test_append_message_recovery.py | 486 | # Step 3: server finalize then overwrites the FE's stub with | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 343 | # Step 1: server stream completes. Server-built rich content is | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 363 | # Step 2: simulate the legacy FE ``appendMessage`` round-trip | COMMENT |
| LOW | …tests/integration/chat/test_append_message_recovery.py | 462 | # Step 1: legacy FE appendMessage lands first. No prior shell | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 42 | # Step 1: Add search_space_id column as nullable first (if it doesn't exist) | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 49 | # Step 2: Populate search_space_id with each user's first search space | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 65 | # Step 3: Make search_space_id NOT NULL | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 72 | # Step 4: Add foreign key constraint (if it doesn't exist) | COMMENT |
| LOW | …versions/23_associate_connectors_with_search_spaces.py | 86 | # Step 5: Drop the old unique constraint (user_id, connector_type) if it exists | COMMENT |
| LOW | …versions/23_associate_connectors_with_search_spaces.py | 98 | # Step 6: Create new unique constraint (search_space_id, user_id, connector_type) if it doesn't exist | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 130 | # Step 1: Drop the new unique constraint if it exists | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 138 | # Step 2: Recreate the old unique constraint (user_id, connector_type) if it doesn't exist | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 148 | # Step 3: Drop the foreign key constraint if it exists | COMMENT |
| LOW⚡ | …versions/23_associate_connectors_with_search_spaces.py | 156 | # Step 4: Drop the search_space_id column if it exists | COMMENT |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 70 | # Step 1: Move all memberships from Admin roles to corresponding Editor roles (BULK) | COMMENT |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 84 | # Step 2: Move all invites from Admin roles to corresponding Editor roles (BULK) | STRING |
| LOW⚡ | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 97 | # Step 3: Delete all Admin roles (BULK) | STRING |
| LOW⚡ | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 105 | # Step 4: Update Editor permissions for all search spaces (BULK) | STRING |
| LOW | …nse_backend/alembic/versions/72_simplify_rbac_roles.py | 118 | # Step 5: Update Viewer permissions for all search spaces (BULK) | STRING |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 33 | # Step 1: Copy last_edited_at values to updated_at where updated_at is NULL | COMMENT |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 43 | # Step 2: For documents where both exist, use the most recent timestamp | STRING |
| LOW⚡ | …ic/versions/46_remove_last_edited_at_from_documents.py | 53 | # Step 3: Drop the last_edited_at column | STRING |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 63 | # Step 1: Rename the current enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 66 | # Step 2: Create the new enum type with new values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 69 | # Step 3: Add a temporary column with the new type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 74 | # Step 4: Update the temporary column with mapped values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 88 | # Step 5: Drop the old column | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 91 | # Step 6: Rename the new column to the original name | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 96 | # Step 7: Drop the old enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 118 | # Step 1: Rename the current enum type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 121 | # Step 2: Create the new enum type with original values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 124 | # Step 3: Add a temporary column with the original type | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 129 | # Step 4: Update the temporary column with mapped values back to old values | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 143 | # Step 5: Drop the old column | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 146 | # Step 6: Rename the new column to the original name | COMMENT |
| LOW⚡ | …ons/10_update_chattype_enum_to_qna_report_structure.py | 151 | # Step 7: Drop the old enum type | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/sandbox/remotion/package-lock.json | 4720 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | …stant-ui/connector-popup/utils/mcp-config-validator.ts | 130 | // Use Zod schema validation for robust type checking | COMMENT |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 77 | # But we can't easily extract the token, so we'll just use the client | COMMENT |
| LOW⚡ | surfsense_backend/app/connectors/slack_history.py | 79 | # This is the old pattern - just use the client as-is | COMMENT |
| MEDIUM | …_backend/app/proprietary/web_crawler/testbench/core.py | 27 | # Results live next to the harness; screenshots are gitignored, scorecard JSON is | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/config/__init__.py | 1274 | # is the single source of truth imported by the crawler AND the 03f harness | COMMENT |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 2715 | "description": "Gemini 3 Pro is Google’s flagship frontier model for high-precision multimodal reasoning, combinin | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 2715 | "description": "Gemini 3 Pro is Google’s flagship frontier model for high-precision multimodal reasoning, combinin | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9834 | "description": "Note: Sonar Pro pricing includes Perplexity search pricing. See [details here](https://docs.perple | CODE |
| MEDIUM⚡ | surfsense_backend/app/config/model_list_fallback.json | 9834 | "description": "Note: Sonar Pro pricing includes Perplexity search pricing. See [details here](https://docs.perple | CODE |
| MEDIUM | surfsense_backend/app/config/model_list_fallback.json | 9794 | "description": "Note: Sonar Pro pricing includes Perplexity search pricing. See [details here](https://docs.perple | CODE |
| MEDIUM | …nts/chat/multi_agent_chat/main_agent/tools/registry.py | 35 | # call-time import to keep module import order robust. | COMMENT |
| MEDIUM⚡ | …nts/chat/multi_agent_chat/main_agent/plugins/loader.py | 110 | except Exception: # pragma: no cover - defensive (entry_points is robust) | CODE |
| MEDIUM | …sense_backend/app/agents/video_presentation/prompts.py | 218 | "content_in_markdown": "## The Quantum Leap\\n- Classical computers use **bits** (0 or 1)\\n- Quantum computers us | STRING |
| MEDIUM | …d/tests/unit/services/test_token_quota_service_cost.py | 582 | # simulate "no outer" explicitly to be robust against test order. | COMMENT |
| MEDIUM | …rsions/35_update_litellmprovider_enum_comprehensive.py | 1 | """Update LiteLLMProvider enum with comprehensive provider support | STRING |
| LOW | …ackend/alembic/versions/1_add_github_connector_enum.py | 72 | # For now, we'll just pass. If you needed to reverse this, you'd likely | COMMENT |
| LOW | …ocal/backend/tests/integration/search/test_retrieve.py | 19 | # Five distinct topics, so ranking has to discriminate, not just return the one | COMMENT |
| MEDIUM | surfsense_local/backend/tests/live/sweep/runner.py | 35 | # Harness faults in a row, across models, that stop the sweep: then the harness is broken, not the models. | COMMENT |
| MEDIUM | …_local/backend/modules/agent/previews/inline_images.py | 18 | # not on llama-server. Deterministic, which the live harness relies on. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | surfsense_web/messages/zh.json | 127 | "your_api_key": "您的API密钥", | CODE |
| HIGH | surfsense_web/messages/pt.json | 127 | "your_api_key": "Sua chave API", | CODE |
| HIGH | surfsense_web/messages/en.json | 127 | "your_api_key": "Your API Key", | CODE |
| HIGH | surfsense_web/messages/hi.json | 127 | "your_api_key": "आपकी API कुंजी", | CODE |
| HIGH | surfsense_web/messages/ko.json | 127 | "your_api_key": "내 API 키", | CODE |
| HIGH | surfsense_web/messages/es.json | 127 | "your_api_key": "Tu clave API", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | surfsense_backend/app/file_storage/backends/azure.py | 74 | from azure.core.exceptions import ResourceNotFoundError | CODE |
| CRITICAL | …ration/document_upload/test_stripe_credit_purchases.py | 22 | from tests.utils.helpers import TEST_EMAIL, TEST_PASSWORD, auth_headers | CODE |
| CRITICAL | …end/tests/integration/document_upload/test_okf_read.py | 14 | from tests.utils.helpers import poll_document_status, upload_file | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …ests/unit/platforms/instagram/test_fetch_resilience.py | 297 | CODE | |
| MEDIUM | …nd/tests/unit/tasks/test_video_presentation_billing.py | 108 | CODE | |
| MEDIUM | …ackend/tests/unit/tasks/chat/test_activity_contract.py | 902 | CODE | |
| MEDIUM | …ents/new_chat/middleware/test_scoped_model_fallback.py | 50 | CODE | |
| MEDIUM | …i_agent_chat/subagents/shared/test_subagent_builder.py | 71 | CODE | |
| MEDIUM | surfsense_backend/tests/unit/podcasts/test_renderer.py | 45 | CODE | |
| MEDIUM | …d/tests/unit/services/test_quota_checked_vision_llm.py | 111 | CODE | |
| MEDIUM | …nse_backend/tests/integration/artifacts/test_roster.py | 148 | CODE | |
| MEDIUM | …_backend/tests/integration/podcasts/test_draft_task.py | 82 | CODE | |
| MEDIUM | …ion/knowledge_store/test_paused_turn_keeps_its_copy.py | 60 | CODE | |
| MEDIUM | …end/tests/unit/llm/catalog/local/test_install_steps.py | 57 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …/mcp_server/features/scrapers/platforms/google_maps.py | 28 | CODE | |
| LOW | …/mcp_server/features/scrapers/platforms/google_maps.py | 90 | CODE | |
| LOW | …e_mcp/mcp_server/features/scrapers/platforms/indeed.py | 40 | CODE | |
| LOW | …e_mcp/mcp_server/features/scrapers/platforms/reddit.py | 29 | CODE | |
| LOW | …e_mcp/mcp_server/features/scrapers/platforms/amazon.py | 26 | CODE | |
| LOW | …e_backend/app/tasks/chat/streaming/agent/event_loop.py | 48 | CODE | |
| LOW | …tasks/chat/streaming/flows/resume_chat/orchestrator.py | 108 | CODE | |
| LOW | …pp/tasks/chat/streaming/flows/new_chat/orchestrator.py | 126 | CODE | |
| LOW | …ense_backend/app/proprietary/platforms/amazon/fetch.py | 144 | CODE | |
| LOW | …/app/proprietary/platforms/indeed_jobs/url_resolver.py | 89 | CODE | |
| LOW | surfsense_backend/app/capabilities/core/runs.py | 79 | CODE | |
| LOW | …/shared/middleware/filesystem/middleware/middleware.py | 46 | CODE | |
| LOW | …ts/chat/multi_agent_chat/main_agent/runtime/factory.py | 65 | CODE | |
| LOW | …agent_chat/main_agent/system_prompt/builder/compose.py | 42 | CODE | |
| LOW | surfsense_backend/app/observability/domains/chat.py | 12 | CODE | |
| LOW | surfsense_backend/app/routes/logs_routes.py | 60 | CODE | |
| LOW | surfsense_backend/app/routes/documents_routes.py | 357 | CODE | |
| LOW | surfsense_backend/app/routes/documents_routes.py | 1670 | CODE | |
| LOW | surfsense_backend/app/notifications/api/api.py | 213 | CODE | |
| LOW | …rfsense_backend/app/services/token_tracking_service.py | 549 | CODE | |
| LOW | surfsense_backend/app/services/composio_service.py | 1325 | CODE | |
| LOW | …nse_local/backend/modules/llm/catalog/local/service.py | 71 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …/community-local/seo/data/keyword-ideas-questions.json | 892 | "core_keyword": "is this generated by ai", | CODE |
| HIGH | …ures/models/remote/models/server-model-picker.test.tsx | 304 | await screen.findByRole("img", { name: "Test generated by gpt-image-1" }) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | surfsense_web/lib/playground/code-snippets.ts | 80 | print(data["items"])`; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | docker/docker-compose.yml | 5 | # Usage: | COMMENT |
| LOW | docker/scripts/migrate-database.sh | 8 | # Usage: | COMMENT |