Private AI platform for agents, assistants and enterprise search. Built-in Agent Builder, Deep research, Document analysis, Multi-model support, and API connectivity for agents.
This report summarizes scanner evidence for arc53/DocsGPT, a Python project with 18,316 GitHub stars. SynthScan examined 730,492 lines of code across 2510 source files, recording 18652 pattern matches distributed across 24 syntactic categories. The legacy adjusted pattern signal is 34.0 (High 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? 13742 finding(s).
Are imports declared and package/API names verified? 958 finding(s).
Are wrappers, guards, and repeated structures necessary? 16778 finding(s).
Which changes need focused human review? 18652 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 18652 distinct pattern matches across 24 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 | frontend/src/connectors/ConnectionDrawer.tsx | 163 | function DisconnectConnectionModal({ | CODE |
| LOW | frontend/src/constants/fileUpload.ts | 309 | async function isSupportedAttachmentFile(file: File): Promise<boolean> { | CODE |
| LOW | frontend/src/agents/schedules/TimezoneCombobox.tsx | 52 | function computeTimezoneOffsetLabel(tz: string): string { | CODE |
| LOW | frontend/src/agents/schedules/cronBuilder.ts | 166 | export function parseScheduleToFormValues( | CODE |
| LOW | frontend/src/agents/workflow/documentConfig.ts | 38 | export function documentsModeToInputDocuments( | CODE |
| LOW | frontend/src/agents/workflow/documentConfig.ts | 72 | export function toDocumentVariableOptions( | CODE |
| LOW | frontend/src/agents/workflow/documentConfig.ts | 102 | export function withChosenDocumentOptions( | CODE |
| LOW | frontend/src/agents/workflow/workflowPreviewSlice.ts | 59 | export function handleWorkflowPreviewAbort() { | CODE |
| LOW | frontend/src/agents/workflow/workflowPreviewSlice.ts | 75 | export function collectCompletedAttachmentIds( | CODE |
| LOW | frontend/src/modals/RegenerateAccessTokenModal.tsx | 40 | export default function RegenerateAccessTokenModal({ | CODE |
| LOW | frontend/src/utils/sourceUtils.ts | 64 | export function selectedSourceIdsFromAgent(agent: { | CODE |
| LOW | frontend/src/components/artifactViewUtils.ts | 249 | export function filenameFromContentDisposition( | CODE |
| LOW | frontend/src/upload/uploadSlice.ts | 247 | function pruneEarlyAttachmentEvents(state: UploadState): void { | CODE |
| LOW | frontend/src/upload/uploadSlice.ts | 259 | function stashEarlyAttachmentEvent( | CODE |
| LOW | frontend/src/upload/uploadSlice.ts | 289 | function replayEarlyAttachmentEvents( | CODE |
| LOW | …d/src/backgroundJobs/ConversationNotificationToast.tsx | 123 | export default function ConversationNotificationToast() { | CODE |
| LOW | frontend/src/conversation/conversationHandlers.ts | 252 | export function handleFetchAnswerSteaming( | CODE |
| LOW | frontend/src/conversation/conversationHandlers.ts | 903 | export function handleFetchSharedAnswerStreaming( | CODE |
| LOW | docsgpt/worker.py | 217 | def _maybe_enqueue_graph_extraction(cfg, source_id, user): | CODE |
| LOW | docsgpt/worker.py | 293 | def _make_parse_progress_callback(task, user, source_id, start_pct, end_pct): | CODE |
| LOW | docsgpt/worker.py | 354 | def _apply_display_names_to_structure(structure, file_name_map, prefix=""): | CODE |
| LOW | docsgpt/worker.py | 369 | def _download_source_files_to_dir(storage, source_file_path, temp_dir): | CODE |
| LOW | docsgpt/worker.py | 965 | def _flatten_directory_structure(struct, prefix=""): | CODE |
| LOW | docsgpt/worker.py | 1728 | def _reject_unparseable_attachment( | CODE |
| LOW | docsgpt/worker.py | 1752 | def _reject_attachment_zip_bomb(local_path: str) -> None: | CODE |
| LOW | docsgpt/worker.py | 2118 | def _write_attachment_failure_row( | CODE |
| LOW | docsgpt/worker.py | 2165 | def record_attachment_failure(user, file_info, error, parser=None): | CODE |
| LOW | docsgpt/worker.py | 2218 | def _single_attachment_worker(self, file_info, user, *, emit_events: bool = True): | CODE |
| LOW | docsgpt/worker.py | 2745 | def _count_archive_member_outcome( | CODE |
| LOW | docsgpt/worker.py | 2771 | def _dispatch_archive_members(members: List[Dict[str, Any]], user: str) -> None: | CODE |
| LOW | docsgpt/worker.py | 2812 | def _record_archive_member_outcome(user: str, member_info: Dict[str, Any], outcome: Dict[str, Any]) -> None: | CODE |
| LOW | docsgpt/worker.py | 2836 | def sweep_stuck_archive_members( | CODE |
| LOW | docsgpt/worker.py | 2965 | def record_archive_member_failure(user: str, member_info: Dict[str, Any], error: Any) -> None: | CODE |
| LOW | docsgpt/worker.py | 3117 | def record_archive_task_failure(user: str, file_info: Dict[str, Any], error: Any) -> None: | CODE |
| LOW | docsgpt/worker.py | 3141 | def _archive_attachment_worker(self, file_info, user): | CODE |
| LOW | docsgpt/worker.py | 3543 | def _with_connection_credentials(source_data, connection_id: str): | CODE |
| LOW | docsgpt/worker.py | 3582 | def _link_source_to_connection(source_id: str, connection_id: str) -> None: | CODE |
| LOW | docsgpt/worker.py | 4001 | def publish_awaiting_redirect(authorization_url: str) -> None: | CODE |
| LOW | docsgpt/worker.py | 4249 | def convert_source_to_wiki_worker(self, source_id, user): | CODE |
| LOW | docsgpt/logging.py | 313 | def _accumulate_response_summary(item: Any, context: "LogContext") -> None: | CODE |
| LOW | docsgpt/attachment_names.py | 47 | def normalize_attachment_filename( | CODE |
| LOW | docsgpt/celery_init.py | 40 | def _dispose_db_engine_on_fork(*args, **kwargs): | CODE |
| LOW | docsgpt/celery_init.py | 129 | def _reclaim_memory_after_task(task=None, **kwargs): | CODE |
| LOW | docsgpt/celery_init.py | 224 | def register_legacy_task_names(app: Celery) -> int: | CODE |
| LOW | docsgpt/cache.py | 159 | def get_pubsub_redis_instance(): | CODE |
| LOW | docsgpt/upload_limits.py | 43 | def unsupported_upload_message(filename: str | None) -> str: | CODE |
| LOW | docsgpt/upload_limits.py | 56 | def is_unsupported_upload_message(message: str | None) -> bool: | CODE |
| LOW | docsgpt/upload_limits.py | 163 | def enforce_parseable_attachment( | CODE |
| LOW | docsgpt/upload_limits.py | 240 | def upload_request_limit_message(max_bytes: int | None = None) -> str: | CODE |
| LOW | docsgpt/utils.py | 117 | def truncate_to_line_boundary(data: bytes) -> bytes: | CODE |
| LOW | docsgpt/utils.py | 151 | def num_tokens_from_object_or_list(thing): | CODE |
| LOW | docsgpt/utils.py | 170 | def calculate_doc_token_budget( | CODE |
| LOW | docsgpt/utils.py | 200 | def get_field_validation_errors(data, required_fields): | CODE |
| LOW | docsgpt/utils.py | 295 | def safe_user_storage_component(user_id: object) -> str: | CODE |
| LOW | docsgpt/utils.py | 303 | def get_agent_image_content_type(image_path: object) -> str | None: | CODE |
| LOW | docsgpt/utils.py | 347 | def generate_agent_image_capability( | CODE |
| LOW | docsgpt/utils.py | 366 | def verify_agent_image_capability( | CODE |
| LOW | docsgpt/utils.py | 397 | def calculate_compression_threshold( | CODE |
| LOW | docsgpt/app.py | 143 | def _upload_limit_error_payload() -> dict[str, bool | str]: | CODE |
| LOW⚡ | docsgpt/app.py | 155 | def handle_request_entity_too_large(_error): | CODE |
| 12724 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | setup.sh | 172 | # ======================== | COMMENT |
| MEDIUM | setup.sh | 174 | # ======================== | COMMENT |
| MEDIUM | setup.sh | 236 | # ======================== | COMMENT |
| MEDIUM | setup.sh | 238 | # ======================== | COMMENT |
| MEDIUM⚡ | docsgpt/background/wake.py | 178 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/background/wake.py | 180 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/background/wake.py | 258 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/background/wake.py | 260 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/connectors/service.py | 439 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/connectors/service.py | 441 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 936 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 938 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1085 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1087 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1187 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1189 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1743 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/service.py | 1745 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 47 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 112 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 192 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/linear.py | 194 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/mcp.py | 215 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/connectors/mcp.py | 217 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/service.py | 130 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/service.py | 132 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/monitors/service.py | 174 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/monitors/service.py | 176 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/service.py | 579 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/service.py | 581 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/triggers.py | 321 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/triggers.py | 323 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/spec.py | 444 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/spec.py | 446 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/monitors/tick.py | 260 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/monitors/tick.py | 262 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 114 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 116 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 371 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 373 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 513 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 515 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 575 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 577 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 664 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 666 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 817 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM | docsgpt/monitors/tick.py | 819 | # ---------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docsgpt/llm/anthropic.py | 563 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | docsgpt/llm/anthropic.py | 565 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 226 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 228 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 494 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 496 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 668 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 670 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 801 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | docsgpt/llm/anthropic.py | 803 | # ------------------------------------------------------------------ | COMMENT |
| 1995 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docsgpt/worker.py | 517 | def download_file(url, params, dest_path): | CODE |
| MEDIUM | docsgpt/worker.py | 1508 | def sync( | CODE |
| LOW | docsgpt/worker.py | 213 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 242 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 266 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 340 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 383 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 507 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 707 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 839 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 962 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 998 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1060 | except Exception as de: | CODE |
| LOW | docsgpt/worker.py | 1067 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1133 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1148 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 1164 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1189 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1229 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1235 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1458 | except Exception as upd_err: | CODE |
| LOW | docsgpt/worker.py | 1480 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1534 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 1807 | except Exception as exc: | CODE |
| LOW | docsgpt/worker.py | 1901 | except Exception: # noqa: BLE001 - an unreadable PDF just has no page count | CODE |
| LOW | docsgpt/worker.py | 1930 | except Exception: # noqa: BLE001 - the planner falls back to an estimate | CODE |
| LOW | docsgpt/worker.py | 2073 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 2179 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 2454 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 2794 | except Exception as exc: | CODE |
| LOW | docsgpt/worker.py | 2950 | except Exception as exc: | CODE |
| LOW | docsgpt/worker.py | 3109 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 3134 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 3279 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 3335 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 3346 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 3437 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 3473 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 3595 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 3914 | except Exception as upd_err: | CODE |
| LOW | docsgpt/worker.py | 3954 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 4051 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 4058 | except Exception as e: | CODE |
| LOW | docsgpt/worker.py | 4148 | except Exception: | CODE |
| LOW | docsgpt/worker.py | 4358 | except Exception as exc: | CODE |
| LOW | docsgpt/worker.py | 4485 | except Exception as e: | CODE |
| LOW | docsgpt/auth.py | 63 | except Exception: | CODE |
| LOW | docsgpt/logging.py | 186 | except Exception as exc: | CODE |
| LOW | docsgpt/logging.py | 346 | except Exception as e: | CODE |
| LOW | docsgpt/logging.py | 405 | except Exception as e: | CODE |
| LOW | docsgpt/attachment_full_text.py | 75 | except Exception as exc: | CODE |
| LOW | docsgpt/attachment_full_text.py | 116 | except Exception as exc: | CODE |
| LOW | docsgpt/attachment_full_text.py | 194 | except Exception as exc: | CODE |
| LOW | docsgpt/celery_init.py | 53 | except Exception: | CODE |
| LOW | docsgpt/celery_init.py | 148 | except Exception: | CODE |
| LOW | docsgpt/celery_init.py | 168 | except Exception: | CODE |
| LOW | docsgpt/cache.py | 263 | except Exception as e: | CODE |
| LOW | docsgpt/cache.py | 270 | except Exception as e: | CODE |
| LOW | docsgpt/cache.py | 328 | except Exception as e: | CODE |
| LOW | docsgpt/cache.py | 359 | except Exception as e: | CODE |
| 1357 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docsgpt/worker.py | 254 | CODE | |
| LOW | docsgpt/attachment_full_text.py | 22 | CODE | |
| LOW | docsgpt/version.py | 3 | CODE | |
| LOW | docsgpt/attachment_names.py | 10 | CODE | |
| LOW | docsgpt/ui.py | 13 | CODE | |
| LOW | docsgpt/asgi.py | 3 | CODE | |
| LOW | docsgpt/upload_limits.py | 3 | CODE | |
| LOW | docsgpt/gunicorn_conf.py | 3 | CODE | |
| LOW | docsgpt/gunicorn_worker.py | 15 | CODE | |
| LOW | docsgpt/cli.py | 8 | CODE | |
| LOW | docsgpt/audit_events.py | 15 | CODE | |
| LOW | docsgpt/pricing.py | 3 | CODE | |
| LOW | docsgpt/app.py | 32 | CODE | |
| LOW | docsgpt/mcp_server.py | 15 | CODE | |
| LOW | docsgpt/background/service.py | 3 | CODE | |
| LOW | docsgpt/background/reconciler.py | 17 | CODE | |
| LOW | docsgpt/background/results.py | 8 | CODE | |
| LOW | docsgpt/background/handoff.py | 18 | CODE | |
| LOW | docsgpt/background/celery_runner.py | 14 | CODE | |
| LOW | docsgpt/background/events.py | 3 | CODE | |
| LOW | docsgpt/background/sandbox_runner.py | 13 | CODE | |
| LOW | docsgpt/background/device_runner.py | 27 | CODE | |
| LOW | docsgpt/background/continuation.py | 28 | CODE | |
| LOW | docsgpt/background/jobs.py | 9 | CODE | |
| LOW | docsgpt/background/context.py | 12 | CODE | |
| LOW | docsgpt/background/guard.py | 20 | CODE | |
| LOW | docsgpt/background/watch.py | 29 | CODE | |
| LOW | docsgpt/background/pool.py | 15 | CODE | |
| LOW | docsgpt/background/wake.py | 15 | CODE | |
| LOW | docsgpt/background/fold.py | 9 | CODE | |
| LOW | docsgpt/background/schema.py | 9 | CODE | |
| LOW | docsgpt/connectors/catalog.py | 11 | CODE | |
| LOW | docsgpt/connectors/oauth_flows.py | 11 | CODE | |
| LOW | docsgpt/connectors/service.py | 9 | CODE | |
| LOW | docsgpt/connectors/resolve.py | 10 | CODE | |
| LOW | docsgpt/connectors/linear.py | 12 | CODE | |
| LOW | docsgpt/connectors/attribution.py | 8 | CODE | |
| LOW | docsgpt/connectors/github.py | 9 | CODE | |
| LOW | docsgpt/monitors/fetch.py | 15 | CODE | |
| LOW | docsgpt/monitors/service.py | 10 | CODE | |
| LOW | docsgpt/monitors/tasks.py | 3 | CODE | |
| LOW | docsgpt/monitors/triggers.py | 14 | CODE | |
| LOW | docsgpt/monitors/secret_refs.py | 28 | CODE | |
| LOW | docsgpt/monitors/events.py | 3 | CODE | |
| LOW | docsgpt/monitors/checks.py | 20 | CODE | |
| LOW | docsgpt/monitors/spec.py | 15 | CODE | |
| LOW | docsgpt/monitors/links.py | 20 | CODE | |
| LOW | docsgpt/monitors/sources.py | 19 | CODE | |
| LOW | docsgpt/monitors/signatures.py | 29 | CODE | |
| LOW | docsgpt/monitors/judge.py | 11 | CODE | |
| LOW | docsgpt/monitors/tick.py | 32 | CODE | |
| LOW | docsgpt/monitors/prefetch.py | 19 | CODE | |
| LOW | docsgpt/tracing/preview.py | 3 | CODE | |
| LOW | docsgpt/tracing/sink.py | 3 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| LOW | docsgpt/tracing/__init__.py | 20 | CODE | |
| 808 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docsgpt/worker.py | 1901 | except Exception: # noqa: BLE001 - an unreadable PDF just has no page count | CODE |
| HIGH | docsgpt/worker.py | 504 | except OSError: | CODE |
| HIGH | docsgpt/worker.py | 2306 | except OSError: | CODE |
| HIGH | docsgpt/worker.py | 1148 | except Exception: | CODE |
| HIGH | docsgpt/logging.py | 84 | except AttributeError: | CODE |
| HIGH | docsgpt/celery_init.py | 116 | except (OSError, AttributeError): | CODE |
| HIGH | docsgpt/celery_init.py | 148 | except Exception: | CODE |
| HIGH | docsgpt/cache.py | 321 | except AttributeError: | CODE |
| HIGH | docsgpt/usage.py | 257 | except AttributeError: | CODE |
| HIGH | docsgpt/background/handoff.py | 326 | except FuturesTimeout: | CODE |
| HIGH | docsgpt/connectors/service.py | 656 | except ImportError: # pragma: no cover - google libs are core deps | CODE |
| HIGH | docsgpt/connectors/service.py | 1499 | except CredentialDecryptionError: | CODE |
| HIGH | docsgpt/connectors/service.py | 856 | except CredentialDecryptionError: | CODE |
| HIGH | docsgpt/monitors/fetch.py | 198 | except ValueError: | CODE |
| HIGH | docsgpt/monitors/triggers.py | 110 | except ValueError: | CODE |
| HIGH | docsgpt/tracing/sink.py | 81 | except RuntimeError: | CODE |
| HIGH | docsgpt/tracing/llm.py | 148 | except AttributeError: | CODE |
| HIGH | docsgpt/llm/google_ai.py | 620 | except Exception: | CODE |
| HIGH | docsgpt/llm/google_ai.py | 377 | except (_json.JSONDecodeError, TypeError): | CODE |
| HIGH | docsgpt/llm/openai.py | 743 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | docsgpt/llm/openai.py | 811 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | docsgpt/llm/handlers/base.py | 745 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | docsgpt/core/url_validation.py | 185 | except ValueError: | CODE |
| HIGH | docsgpt/guardrails/config.py | 28 | except Exception: | CODE |
| HIGH | docsgpt/security/encryption.py | 153 | except Exception: | CODE |
| HIGH | docsgpt/graphrag/store.py | 2000 | except Exception: | CODE |
| HIGH | docsgpt/deploy/docker.py | 174 | except (OSError, http.client.HTTPException): | CODE |
| HIGH | docsgpt/deploy/dev.py | 145 | except (ProcessLookupError, PermissionError, OSError): | CODE |
| HIGH | docsgpt/deploy/commands.py | 1032 | except Exception: # noqa: BLE001 - fall back to the message | CODE |
| HIGH | docsgpt/agents/research_agent.py | 384 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/agents/research_agent.py | 470 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/agents/research_agent.py | 394 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | docsgpt/agents/research_agent.py | 484 | except (json.JSONDecodeError, ValueError): | CODE |
| HIGH | docsgpt/agents/workflows/workflow_engine.py | 1182 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/agents/workflows/workflow_engine.py | 1192 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/parser/file/tabular_parser.py | 62 | except (TypeError, ValueError): | CODE |
| HIGH | docsgpt/parser/file/audio_parser.py | 26 | except OSError: | CODE |
| HIGH | docsgpt/parser/file/docling_parser.py | 314 | except OSError: | CODE |
| HIGH | docsgpt/parser/remote/remote_creator.py | 70 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/storage/local.py | 80 | except OSError: | CODE |
| HIGH | docsgpt/storage/db/bootstrap.py | 263 | except Exception: | CODE |
| HIGH | docsgpt/sandbox/daytona.py | 476 | except TypeError: | CODE |
| HIGH | docsgpt/sandbox/daytona.py | 887 | except Exception: # noqa: BLE001 - second failure -> generic IOError below | CODE |
| HIGH | docsgpt/sandbox/daytona.py | 967 | except Exception: # noqa: BLE001 - second failure -> classified below | CODE |
| HIGH | docsgpt/sandbox/jupyter_gateway.py | 500 | except Exception: # noqa: BLE001 - closing a socket must not mask results | CODE |
| HIGH | docsgpt/api/v1/translator.py | 110 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | docsgpt/api/user/tasks.py | 486 | except Exception: | CODE |
| HIGH | docsgpt/api/user/tasks.py | 570 | except Exception: | CODE |
| HIGH | docsgpt/api/user/agents/routes.py | 175 | except json.JSONDecodeError: | CODE |
| HIGH | docsgpt/api/user/sources/routes.py | 317 | except FileNotFoundError: | CODE |
| HIGH | docsgpt/api/connector/routes.py | 628 | except Exception: | CODE |
| HIGH | docsgpt/api/events/routes.py | 374 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/embeddings_local.py | 292 | except Exception: # noqa: BLE001 -- any miss means the snapshot is incomplete | CODE |
| HIGH | docsgpt/vectorstore/pgconn.py | 124 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 882 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 441 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 432 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 511 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 559 | except Exception: | CODE |
| HIGH | docsgpt/vectorstore/pgvector.py | 660 | except Exception: | CODE |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docsgpt/worker.py | 1781 | Decode an image attachment fully, so a damaged one is refused here. ``verify`` catches a broken structure and ``loa | STRING |
| HIGH | docsgpt/worker.py | 1936 | Store a PNG copy, beside the original, of an image the providers reject. Args: storage: The storage backend | STRING |
| HIGH | docsgpt/worker.py | 2928 | Parse one member of a zip attachment, then count it on the zip. The member is parsed like any upload but silently: | STRING |
| HIGH | docsgpt/worker.py | 3142 | Unpack a zip attachment and fan its members out to their own tasks. The zip keeps its own row as an index (``metada | STRING |
| HIGH | docsgpt/attachment_full_text.py | 48 | Save the whole extracted text beside the original file. Never raises: the upload must not fail because its side cop | STRING |
| HIGH | docsgpt/cache.py | 48 | Stable fingerprint of the generation-affecting kwargs. Args: extra: Keyword arguments forwarded to the gene | STRING |
| HIGH | docsgpt/cache.py | 197 | Build the Redis key for one generation call. Args: messages: Chat messages for the call. model: Mod | STRING |
| HIGH | docsgpt/utils.py | 459 | Convert PDF pages to images for LLMs that support images but not PDFs. This enables "synthetic PDF support" by | STRING |
| HIGH | docsgpt/background/handoff.py | 233 | Run one tool call, handing it off to a background job if it outlives the yield window. Args: context: The t | STRING |
| HIGH | docsgpt/background/jobs.py | 131 | The files a finished call produced, read off the tool as the executor does. Args: tool: The tool instance t | STRING |
| HIGH | docsgpt/background/jobs.py | 180 | Finish a job from the tool call that ran it: shape the result as the executor would. Args: job_id: The job. | STRING |
| HIGH | docsgpt/connectors/service.py | 680 | An unexpired OAuth ``token_info`` for an ingest connection. Holds a row lock (``SELECT ... FOR UPDATE``) while it c | STRING |
| HIGH | docsgpt/connectors/service.py | 872 | Store a connection for pasted credentials, or reuse the matching one. The same credentials for the same service map | STRING |
| HIGH | docsgpt/connectors/service.py | 1569 | Fix or release parameters of one action of a tool the user owns. Args: conn: Open database connection. | STRING |
| HIGH | docsgpt/connectors/linear.py | 74 | What a Linear source syncs, as it is stored in ``sources.remote_data``. Args: items: The wizard's choice (o | STRING |
| HIGH | docsgpt/connectors/mcp.py | 173 | Point a connection's built-in MCP tool (GitHub's) at its write or read-only endpoint. The tool's actions are re-rea | STRING |
| HIGH | docsgpt/connectors/mcp.py | 355 | Open one MCP session signed in with ``connection`` and run ``work`` in it. Args: connection: An MCP OAuth c | STRING |
| HIGH | docsgpt/connectors/github.py | 104 | Repositories ``token`` can read, most recently pushed first. Args: token: The connection's access token. | STRING |
| HIGH | docsgpt/monitors/fetch.py | 127 | Fetch a page and normalize it. Redirects are followed up to :data:`MAX_REDIRECTS` hops; every hop is a new pinn | STRING |
| HIGH | docsgpt/monitors/service.py | 392 | Store the signing secret the owner pasted in for a webhook monitor's live link (Stripe's, Slack's). Records an audi | STRING |
| HIGH | docsgpt/monitors/service.py | 685 | Show (or stop showing) a webhook monitor's raw secret to the assistant: the owner's choice only. Audited as ``monit | STRING |
| HIGH | docsgpt/monitors/secret_refs.py | 270 | Fill the referenced secrets into an approved call's arguments. Args: executor: The turn's ``ToolExecutor`` | STRING |
| HIGH | docsgpt/monitors/checks.py | 176 | Run ``check`` on ``content`` against the stored state. Args: check: The monitor's check, or None (any chang | STRING |
| HIGH | docsgpt/monitors/spec.py | 345 | Validate ``monitor_create`` arguments into a :class:`MonitorRequest`. Args: arguments: What the model sent. | STRING |
| HIGH | docsgpt/monitors/links.py | 101 | Validate a signing secret the owner pastes in, for the link's scheme. Args: scheme: The link's signature sc | STRING |
| HIGH | docsgpt/monitors/sources.py | 128 | Find the call a source names: a function name the chat sees, or a tool name plus action. Args: executor: Th | STRING |
| HIGH | docsgpt/monitors/sources.py | 275 | Replay a tool source's call once, unattended, and normalize its result. Args: user_id: The owner the call r | STRING |
| HIGH | docsgpt/monitors/signatures.py | 77 | Verify a Standard Webhooks delivery. Args: secret: The ``whsec_`` secret. headers: The request head | STRING |
| HIGH | docsgpt/monitors/signatures.py | 224 | Verify a delivery for the link's scheme. Args: scheme: ``none``, ``standard_webhooks``, ``github``, ``hmac_ | STRING |
| HIGH | docsgpt/monitors/judge.py | 179 | Ask the judge model whether ``content`` meets ``condition``. Args: user_id: The monitor's owner (billed, an | STRING |
| HIGH | docsgpt/llm/tool_images.py | 38 | The image as PNG, JPEG or WebP no larger than ``MAX_SIDE``. Args: raw: The image file's bytes. Returns | STRING |
| HIGH | docsgpt/llm/openai.py | 925 | Send a request, retrying once without tools on a tools-unsupported 400. Args: create: The provider | STRING |
| HIGH | docsgpt/llm/anthropic.py | 123 | Rewrite JSON Schema spellings ``transform_schema`` cannot read. Returns a copy (the input is not mutated) where a l | STRING |
| HIGH | docsgpt/core/url_validation.py | 125 | Validate a URL to prevent SSRF attacks. This function checks that: 1. The URL has an allowed scheme (http | STRING |
| HIGH | docsgpt/core/secret_key.py | 95 | Return a shared configured secret or a stable local-development secret. Args: configured_secret: Operator-s | STRING |
| HIGH | docsgpt/core/docs_pages.py | 42 | Return the page with its ``lastUpdated`` date set to ``day``. The field is replaced where it is, or added as the la | STRING |
| HIGH | docsgpt/core/model_registry.py | 367 | Build the deployment-wide model catalog for ``settings``. Loads the built-in YAMLs plus ``MODELS_CONFIG_DIR``, then | STRING |
| HIGH | docsgpt/core/model_registry.py | 601 | Log the problems :func:`diagnose_model_setup` finds; called at API and worker startup. Builds its own catalog rathe | STRING |
| HIGH | docsgpt/core/optional_deps.py | 64 | Import ``module`` or raise ``ImportError`` naming the extra to install. Args: module: Importable module pat | STRING |
| HIGH | docsgpt/core/settings/_shared.py | 54 | Turn a list setting's raw string into a list, or ``None`` to fall back to the field's default. Args: name: | STRING |
| HIGH | docsgpt/graphrag/store.py | 242 | Run ``operation(conn)``, once more on a fresh connection if it was dead. A graph build holds one checked-out co | STRING |
| HIGH | docsgpt/graphrag/store.py | 869 | Number of nodes for a source. Zero drives the ClassicRAG fallback. Args: source_id: Source whose no | STRING |
| HIGH | docsgpt/graphrag/store.py | 933 | One page of a source's nodes, highest degree first, with the match count. Args: source_id: Source w | STRING |
| HIGH | docsgpt/graphrag/store.py | 1014 | Node counts per type key over every node of a source. Spellings that share a :func:`graph_type_key` are folded | STRING |
| HIGH | docsgpt/graphrag/naming.py | 82 | Merge key for an entity name. Args: name: The entity name as the model wrote it. Returns: A lo | STRING |
| HIGH | docsgpt/agents/tool_pins.py | 236 | Validate a full list of actions sent by a client against the stored ones. The stored actions are the schema: a clie | STRING |
| HIGH | docsgpt/agents/attachment_context.py | 156 | Fence a file's text as untrusted data under its ref and name. The same fence the turn's inlined files use, so tool | STRING |
| HIGH | docsgpt/agents/tools/api_body_serializer.py | 31 | Serialize body data to appropriate format. Args: body_data: Dictionary of body parameters | STRING |
| HIGH | docsgpt/agents/tools/ntfy.py | 21 | Execute the specified action with given parameters. Args: action_name (str): Name of the a | STRING |
| HIGH | docsgpt/agents/tools/ntfy.py | 43 | Send a message to an ntfy topic on the specified server. Args: server_url (str): Base URL | STRING |
| HIGH | docsgpt/agents/tools/code_executor.py | 635 | Start the run detached and follow it until it ends or the turn hands it off. Args: manager: The san | STRING |
| HIGH | docsgpt/agents/tools/spec_parser.py | 23 | Parse an API specification and convert operations to action definitions. Supports OpenAPI 3.x and Swagger 2.0 | STRING |
| HIGH | docsgpt/parser/embedding_pipeline.py | 254 | Embeds documents and stores them in a vector store. Resumable across Celery autoretries of the *same* task: when | STRING |
| HIGH | docsgpt/parser/chunking_creator.py | 34 | Instantiate the chunker registered under ``strategy``. Args: strategy: Registry key (e.g. ``classic | STRING |
| HIGH | docsgpt/parser/attachment_archive.py | 192 | Unpack the zip at ``path`` into ``dest_dir``. Args: path: The uploaded zip. dest_dir: An existing p | STRING |
| HIGH | docsgpt/parser/connectors/connector_creator.py | 35 | Create a connector instance for the specified type. Args: connector_type: Type of connecto | STRING |
| HIGH | docsgpt/parser/connectors/connector_creator.py | 55 | Create an auth provider instance for the specified connector type. Args: connector_type: T | STRING |
| HIGH | docsgpt/parser/file/ocr_parser.py | 710 | OCR ``(key, image)`` pairs, up to ``engine.concurrency`` requests at a time. ``items`` is consumed on the calling t | STRING |
| HIGH | docsgpt/parser/file/ocr_parser.py | 1030 | OCR only the given 0-based pages of ``file``, ignoring their text layers. Used by ``AnydocParser`` for mixed do | STRING |
| HIGH | docsgpt/parser/file/bulk.py | 467 | Load data from the input directory. Args: concatenate (bool): whether to concatenate all files into | STRING |
| 56 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docsgpt/worker.py | 587 | CODE | |
| LOW | docsgpt/worker.py | 863 | CODE | |
| LOW | docsgpt/worker.py | 1252 | CODE | |
| LOW | docsgpt/worker.py | 1684 | CODE | |
| LOW | docsgpt/worker.py | 1862 | CODE | |
| LOW | docsgpt/worker.py | 1906 | CODE | |
| LOW | docsgpt/worker.py | 2218 | CODE | |
| LOW | docsgpt/worker.py | 2473 | CODE | |
| LOW | docsgpt/worker.py | 3408 | CODE | |
| LOW | docsgpt/worker.py | 3669 | CODE | |
| LOW | docsgpt/worker.py | 4225 | CODE | |
| LOW | docsgpt/worker.py | 965 | CODE | |
| LOW | docsgpt/logging.py | 47 | CODE | |
| LOW | docsgpt/cache.py | 110 | CODE | |
| LOW | docsgpt/cache.py | 159 | CODE | |
| LOW | docsgpt/cache.py | 243 | CODE | |
| LOW | docsgpt/cache.py | 278 | CODE | |
| LOW | docsgpt/cache.py | 244 | CODE | |
| LOW | docsgpt/cache.py | 279 | CODE | |
| LOW | docsgpt/utils.py | 450 | CODE | |
| LOW | docsgpt/app.py | 334 | CODE | |
| LOW | docsgpt/background/reconciler.py | 53 | CODE | |
| LOW | docsgpt/background/continuation.py | 145 | CODE | |
| LOW | docsgpt/background/continuation.py | 166 | CODE | |
| LOW | docsgpt/background/continuation.py | 453 | CODE | |
| LOW | docsgpt/background/continuation.py | 569 | CODE | |
| LOW | docsgpt/background/pool.py | 140 | CODE | |
| LOW | docsgpt/connectors/service.py | 679 | CODE | |
| LOW | docsgpt/connectors/service.py | 1192 | CODE | |
| LOW | docsgpt/connectors/service.py | 1606 | CODE | |
| LOW | docsgpt/connectors/service.py | 1662 | CODE | |
| LOW | docsgpt/monitors/service.py | 446 | CODE | |
| LOW | docsgpt/monitors/secret_refs.py | 85 | CODE | |
| LOW | docsgpt/monitors/secret_refs.py | 89 | CODE | |
| LOW | docsgpt/monitors/checks.py | 97 | CODE | |
| LOW | docsgpt/monitors/checks.py | 218 | CODE | |
| LOW | docsgpt/monitors/tick.py | 119 | CODE | |
| LOW | docsgpt/monitors/tick.py | 201 | CODE | |
| LOW | docsgpt/monitors/tick.py | 1083 | CODE | |
| LOW | docsgpt/seed/seeder.py | 243 | CODE | |
| LOW | docsgpt/llm/llm_creator.py | 29 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 98 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 173 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 259 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 493 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 542 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 577 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 695 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 791 | CODE | |
| LOW | docsgpt/llm/google_ai.py | 810 | CODE | |
| LOW | docsgpt/llm/openai.py | 117 | CODE | |
| LOW | docsgpt/llm/openai.py | 143 | CODE | |
| LOW | docsgpt/llm/openai.py | 692 | CODE | |
| LOW | docsgpt/llm/openai.py | 1173 | CODE | |
| LOW | docsgpt/llm/openai.py | 1212 | CODE | |
| LOW | docsgpt/llm/openai.py | 1395 | CODE | |
| LOW | docsgpt/llm/openai.py | 1798 | CODE | |
| LOW | docsgpt/llm/openai.py | 1902 | CODE | |
| LOW | docsgpt/llm/openai.py | 2084 | CODE | |
| LOW | docsgpt/llm/openai.py | 2164 | CODE | |
| 314 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docsgpt/worker.py | 2214 | def update_state(self, *args: Any, **kwargs: Any) -> None: | CODE |
| LOW | docsgpt/attachment_full_text.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/ui.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/cache.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/utils.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/usage.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/mcp_server.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/service.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/reconciler.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/handoff.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/celery_runner.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/events.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/sandbox_runner.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/device_runner.py | 41 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | docsgpt/background/device_runner.py | 343 | def _set_waiting(row: Dict[str, Any], waiting: bool) -> None: | CODE |
| LOW | docsgpt/background/continuation.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/jobs.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/jobs.py | 343 | def _settle_journal(conn: Any, row: Dict[str, Any]) -> None: | CODE |
| LOW | docsgpt/background/context.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/guard.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/watch.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/pool.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/wake.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/background/fold.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/connectors/resolve.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/connectors/attribution.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/service.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/tasks.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/triggers.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/secret_refs.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/events.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/sources.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/monitors/judge.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | docsgpt/monitors/tick.py | 1070 | def _settle_event(row_id: Optional[str], status: str, error: Optional[str] = None) -> None: | CODE |
| LOW | docsgpt/monitors/tick.py | 57 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/tracing/sink.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/tracing/__init__.py | 55 | __all__ = [ | CODE |
| LOW | docsgpt/tracing/core.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/tracing/otel.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/tool_images.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/llm_creator.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/openai.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/credential_scope.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | docsgpt/llm/anthropic.py | 557 | def _set_finish_reason(self, stop_reason: Optional[str]) -> None: | CODE |
| LOW | docsgpt/llm/anthropic.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/base.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/providers/openai_compatible.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/llm/providers/__init__.py | 41 | __all__ = ["ALL_PROVIDERS", "PROVIDERS_BY_NAME", "Provider"] | CODE |
| LOW⚡ | docsgpt/llm/handlers/base.py | 1292 | def _set_context_room(agent, messages: List[Dict]) -> None: | CODE |
| LOW | docsgpt/llm/handlers/base.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/core/model_settings.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/core/model_registry.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/core/model_registry.py | 84 | def _setup(self) -> None: | CODE |
| LOW | docsgpt/core/model_yaml.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/core/settings/__init__.py | 87 | __all__ = ["SETTINGS_GROUPS", "Settings", "SettingsGroup", "current_dir", "settings"] | CODE |
| LOW | docsgpt/guardrails/config.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/guardrails/__init__.py | 17 | __all__ = [ | CODE |
| LOW | docsgpt/guardrails/runtime.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/guardrails/guardrail_creator.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | docsgpt/guardrails/engine.py | 24 | logger = logging.getLogger(__name__) | CODE |
| 185 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docsgpt/connectors/service.py | 1713 | text("UPDATE user_tools SET config = config || CAST(:patch AS jsonb) WHERE id = :id"), | CODE |
| HIGH | docsgpt/storage/db/repositories/connector_sessions.py | 443 | (connector_sessions.session_data || EXCLUDED.session_data) | STRING |
| HIGH | docsgpt/storage/db/repositories/background_jobs.py | 234 | sets.append("progress = progress || CAST(:progress AS jsonb)") | CODE |
| HIGH | docsgpt/storage/db/repositories/background_jobs.py | 279 | "external = external || CAST(:external AS jsonb), heartbeat_at = now(), " | CODE |
| HIGH | docsgpt/storage/db/repositories/background_jobs.py | 296 | "UPDATE background_jobs SET external = external || CAST(:fields AS jsonb), " | CODE |
| HIGH | docsgpt/storage/db/repositories/conversations.py | 1250 | CASE WHEN elem->>'job_id' = :job_id THEN elem || CAST(:patch AS jsonb) ELSE elem END | STRING |
| HIGH | docsgpt/api/user/teams/routes.py | 639 | when on file, else null) and ``caller`` — the caller's own live | STRING |
| HIGH | docsgpt/api/connector/connections.py | 621 | "Fix or release an action's parameters: {action, parameters: {name: value | null}}. " | CODE |
| HIGH | docsgpt/api/connector/routes.py | 153 | if (payload && window.opener) {{ | CODE |
| HIGH | docsgpt/alembic/versions/0019_agent_slug.py | 4 | ``(user_id, slug)`` where slug is not null, so an exported agent can be | STRING |
| HIGH | docsgpt/alembic/versions/0051_device_jobs_links.py | 19 | header a ``header_token`` link reads (``X-Webhook-Token`` when null). | STRING |
| HIGH | docsgpt/devices/normalizer.py | 12 | ``ls /tmp && whoami`` -> ``ls * && whoami`` | STRING |
| HIGH | docsgpt/devices/normalizer.py | 71 | normalized segment sequence (approving ``ls /tmp && whoami`` won't | STRING |
| HIGH | docsgpt/devices/normalizer.py | 72 | auto-approve ``ls /tmp && rm /tmp/x``). Empty segments are skipped; | STRING |
| HIGH | docsgpt/devices/broker.py | 918 | """A client-sent JSON number as an int; None for null, a bool or junk.""" | STRING |
| HIGH | docsgpt/devices/denylist.py | 146 | ``echo safe && rm -rf /`` still trips. Returns ``None`` if no segment | STRING |
| HIGH⚡ | tests/test_template_engine.py | 62 | "{{ content }}", {"content": "<code>a < b && c == 'd'</code>"} | CODE |
| HIGH⚡ | tests/test_template_engine.py | 64 | assert result == "<code>a < b && c == 'd'</code>" | CODE |
| HIGH⚡ | …sts/agents/test_workflow_engine_structured_recovery.py | 18 | ok, val = _engine()._parse_structured_output('```json\n{"a": 1, "b": null}\n```') | CODE |
| HIGH⚡ | tests/agents/test_cel_evaluator.py | 103 | assert evaluate_cel("a && b", {"a": True, "b": True}) is True | CODE |
| HIGH⚡ | tests/agents/test_cel_evaluator.py | 104 | assert evaluate_cel("a && b", {"a": True, "b": False}) is False | CODE |
| HIGH⚡ | tests/agents/test_cel_evaluator.py | 105 | assert evaluate_cel("a || b", {"a": False, "b": True}) is True | CODE |
| HIGH | tests/agents/test_workflow_code_node.py | 506 | assert evaluate_cel('report.size > 0 && report.mime_type == "application/pdf"', state) is True | CODE |
| HIGH⚡ | tests/agents/tools/test_code_executor_hints.py | 191 | "import subprocess\nsubprocess.run('apt-get update && apt-get install -y wkhtmltopdf', shell=True)", | CODE |
| HIGH⚡ | tests/parser/file/test_tabular_parser.py | 209 | assert result == "COLUMNS: A | B || x | y" | CODE |
| HIGH | tests/retriever/test_graph_rag.py | 998 | from_null = _personalized_pagerank(null, personalization=personalization) | CODE |
| HIGH⚡ | tests/sandbox/test_detached_runs.py | 118 | assert request.command.startswith("cd /home/daytona/docsgpt-sandbox && echo ") | CODE |
| HIGH | tests/api/test_agent_portability.py | 855 | ctx.push() | CODE |
| HIGH | tests/api/test_workflow_portability.py | 434 | # Explicit null, with no prior workflow to fall back on. | COMMENT |
| HIGH⚡ | tests/api/test_connector_oauth_security.py | 71 | with patch.object(settings, "CONNECTOR_ALLOWED_ORIGINS", "*, javascript:alert(1), null, not a url"), \ | CODE |
| HIGH | tests/api/test_connector_oauth_security.py | 176 | assert "const payload = null;" in body | CODE |
| HIGH⚡ | tests/api/test_pat_rules.py | 324 | ctx.push() | CODE |
| HIGH⚡ | tests/notifications/test_routes.py | 95 | body = '{"tab_id": "t1", "conversation_id": null, "visible": false, "closing": true}' | CODE |
| HIGH | tests/devices/test_splitter.py | 11 | assert split_command("ls && rm -rf /") == ["ls", "rm -rf /"] | CODE |
| HIGH | tests/devices/test_splitter.py | 15 | assert split_command("foo || bar") == ["foo", "bar"] | CODE |
| HIGH⚡ | tests/devices/test_splitter.py | 71 | assert head_tokens("ls && rm -rf / | grep foo") == ["ls", "rm", "grep"] | CODE |
| HIGH⚡ | tests/devices/test_splitter.py | 75 | assert head_tokens("timeout 5 ls && nohup git push") == ["ls", "git"] | CODE |
| HIGH⚡ | tests/devices/test_normalizer.py | 37 | assert normalize_command("ls -la && rm -rf /tmp") == "ls * && rm *" | CODE |
| HIGH⚡ | tests/devices/test_normalizer.py | 42 | assert normalize_command("ls /tmp && whoami") == "ls * && whoami" | CODE |
| HIGH⚡ | tests/devices/test_normalizer.py | 44 | normalize_command("ls /tmp && rm /tmp/x") | CODE |
| HIGH⚡ | tests/devices/test_normalizer.py | 45 | != normalize_command("ls /tmp && whoami") | CODE |
| HIGH⚡ | tests/devices/test_denylist.py | 208 | assert check_denylist("echo safe && rm -rf /") == "rm -rf /" | CODE |
| HIGH | scripts/db/backfill.py | 249 | SET agent_preferences = users.agent_preferences || EXCLUDED.agent_preferences, | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 121 | "uvicorn-worker>=0.4,<1", | COMMENT |
| LOW | frontend/src/vite-env.d.ts | 1 | /// <reference types="vite/client" /> | COMMENT |
| LOW | frontend/src/settings/types/index.ts | 161 | default?: boolean; | COMMENT |
| LOW | frontend/src/constants/fileUpload.ts | 221 | return ext !== '' && ATTACHMENT_PARSER_EXTENSIONS.includes(ext); | COMMENT |
| LOW | frontend/src/components/ui/card.tsx | 21 | // picker choices, whose selection is the border. | COMMENT |
| LOW | frontend/src/components/ui/button.tsx | 61 | // Popover combobox triggers: mirrors SelectTrigger so the two sit | COMMENT |
| LOW | frontend/src/hooks/useTokenAuth.ts | 21 | const OIDC_RETURN_TO_KEY = 'oidc_return_to'; | COMMENT |
| LOW | frontend/src/events/eventStreamClient.ts | 121 | notifyHealth('connecting'); | COMMENT |
| LOW | frontend/src/events/useEventStream.ts | 41 | // inside ``connectEventStream``. | COMMENT |
| LOW | docsgpt/requirements.txt | 1 | # GENERATED by scripts/export_requirements.sh from uv.lock -- do not edit. | COMMENT |
| LOW | docsgpt/requirements.txt | 21 | # daytona-toolbox-api-client-async | COMMENT |
| LOW | docsgpt/requirements.txt | 41 | anthropic==1.11.0 | COMMENT |
| LOW | docsgpt/requirements.txt | 61 | # cyclopts | COMMENT |
| LOW | docsgpt/requirements.txt | 81 | botocore==1.43.108 | COMMENT |
| LOW | docsgpt/requirements.txt | 101 | # requests | COMMENT |
| LOW | docsgpt/requirements.txt | 121 | # via celery | COMMENT |
| LOW | docsgpt/requirements.txt | 161 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 181 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 201 | # tldextract | COMMENT |
| LOW | docsgpt/requirements.txt | 221 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 241 | # opentelemetry-exporter-otlp-proto-http | COMMENT |
| LOW | docsgpt/requirements.txt | 261 | # via httpx | COMMENT |
| LOW | docsgpt/requirements.txt | 281 | # via | COMMENT |
| LOW | docsgpt/requirements.txt | 301 | # fastembed | COMMENT |
| LOW | docsgpt/requirements.txt | 321 | # via keyring | COMMENT |
| LOW | docsgpt/requirements.txt | 341 | joserfc==1.7.5 | COMMENT |
| LOW | docsgpt/requirements.txt | 361 | lark==1.3.1 | COMMENT |
| LOW | docsgpt/requirements.txt | 381 | marshmallow==3.26.2 | COMMENT |
| LOW | docsgpt/requirements.txt | 401 | # aiohttp | COMMENT |
| LOW | docsgpt/requirements.txt | 421 | # docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 441 | # opentelemetry-exporter-otlp-proto-http | COMMENT |
| LOW | docsgpt/requirements.txt | 461 | opentelemetry-exporter-otlp==1.45.1 | COMMENT |
| LOW | docsgpt/requirements.txt | 481 | # opentelemetry-instrumentation-asgi | COMMENT |
| LOW | docsgpt/requirements.txt | 501 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 521 | opentelemetry-sdk==1.45.1 | COMMENT |
| LOW | docsgpt/requirements.txt | 541 | # opentelemetry-instrumentation-wsgi | COMMENT |
| LOW | docsgpt/requirements.txt | 561 | # opentelemetry-instrumentation-sqlalchemy | COMMENT |
| LOW | docsgpt/requirements.txt | 581 | # via qdrant-client | COMMENT |
| LOW | docsgpt/requirements.txt | 601 | # opentelemetry-proto | COMMENT |
| LOW | docsgpt/requirements.txt | 621 | # via google-auth | COMMENT |
| LOW | docsgpt/requirements.txt | 641 | # openapi-pydantic | COMMENT |
| LOW | docsgpt/requirements.txt | 661 | # msal | COMMENT |
| LOW | docsgpt/requirements.txt | 681 | # daytona-toolbox-api-client-async | COMMENT |
| LOW | docsgpt/requirements.txt | 701 | python-socketio==5.17.0 | COMMENT |
| LOW | docsgpt/requirements.txt | 721 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 741 | # fastembed | COMMENT |
| LOW | docsgpt/requirements.txt | 761 | # via docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 781 | # via python-engineio | COMMENT |
| LOW | docsgpt/requirements.txt | 801 | # docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 821 | # docsgpt | COMMENT |
| LOW | docsgpt/requirements.txt | 841 | # daytona-analytics-api-client-async | COMMENT |
| LOW | docsgpt/requirements.txt | 861 | # opentelemetry-semantic-conventions | COMMENT |
| LOW | docsgpt/requirements.txt | 881 | # via | COMMENT |
| LOW | docsgpt/requirements.txt | 901 | # daytona-toolbox-api-client | COMMENT |
| LOW | docsgpt/requirements.txt | 921 | # fastmcp-slim | COMMENT |
| LOW | docsgpt/requirements.txt | 941 | win32-setctime==1.2.0 ; sys_platform == 'win32' | COMMENT |
| LOW | docsgpt/requirements-milvus.txt | 1 | # GENERATED by scripts/export_requirements.sh from uv.lock -- do not edit. | COMMENT |
| LOW | docsgpt/requirements-milvus.txt | 21 | # daytona-toolbox-api-client-async | COMMENT |
| LOW | docsgpt/requirements-milvus.txt | 41 | anthropic==1.11.0 | COMMENT |
| LOW | docsgpt/requirements-milvus.txt | 61 | # cyclopts | COMMENT |
| 204 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docsgpt/llm/handlers/google.py | 0 | create a tool result message in the standard internal format. | STRING |
| HIGH | docsgpt/llm/handlers/openai.py | 0 | create a tool result message in the standard internal format. | STRING |
| HIGH | docsgpt/llm/handlers/anthropic.py | 0 | create a tool result message in the standard internal format. | STRING |
| HIGH | docsgpt/agents/tools/memory.py | 0 | initialize the tool. args: tool_config: optional tool configuration. should include: - tool_id: unique identifier for th | STRING |
| HIGH | docsgpt/agents/tools/todo_list.py | 0 | initialize the tool. args: tool_config: optional tool configuration. should include: - tool_id: unique identifier for th | STRING |
| HIGH | docsgpt/agents/tools/notes.py | 0 | initialize the tool. args: tool_config: optional tool configuration. should include: - tool_id: unique identifier for th | STRING |
| HIGH | docsgpt/agents/tools/memory.py | 0 | return json metadata describing supported actions for tool schemas. | STRING |
| HIGH | docsgpt/agents/tools/todo_list.py | 0 | return json metadata describing supported actions for tool schemas. | STRING |
| HIGH | docsgpt/agents/tools/notes.py | 0 | return json metadata describing supported actions for tool schemas. | STRING |
| HIGH | docsgpt/storage/db/repositories/conversation_wakes.py | 0 | serialize ``value`` for a jsonb cast, stripping nuls postgres rejects. | STRING |
| HIGH | docsgpt/storage/db/repositories/monitors.py | 0 | serialize ``value`` for a jsonb cast, stripping nuls postgres rejects. | STRING |
| HIGH | docsgpt/storage/db/repositories/background_jobs.py | 0 | serialize ``value`` for a jsonb cast, stripping nuls postgres rejects. | STRING |
| HIGH | docsgpt/storage/db/repositories/todos.py | 0 | resolve a prompt by pg uuid or legacy mongo objectid. picks the lookup path from the id shape so non-uuid input never re | STRING |
| HIGH | docsgpt/storage/db/repositories/notes.py | 0 | resolve a prompt by pg uuid or legacy mongo objectid. picks the lookup path from the id shape so non-uuid input never re | STRING |
| HIGH | docsgpt/storage/db/repositories/prompts.py | 0 | resolve a prompt by pg uuid or legacy mongo objectid. picks the lookup path from the id shape so non-uuid input never re | STRING |
| HIGH | docsgpt/api/user/agents/routes.py | 0 | the json error response for an :class:`accessdenied`. | STRING |
| HIGH | docsgpt/api/user/sources/access.py | 0 | the json error response for an :class:`accessdenied`. | STRING |
| HIGH | docsgpt/api/user/analytics/routes.py | 0 | the json error response for an :class:`accessdenied`. | STRING |
| HIGH | docsgpt/vectorstore/embeddings_local.py | 0 | embed a single query string, clipped to ``embeddings_max_query_tokens``. | STRING |
| HIGH | docsgpt/vectorstore/embeddings_openai.py | 0 | embed a single query string, clipped to ``embeddings_max_query_tokens``. | STRING |
| HIGH | docsgpt/vectorstore/base.py | 0 | embed a single query string, clipped to ``embeddings_max_query_tokens``. | STRING |
| HIGH | tests/test_todo_tool.py | 0 | a ``default_{user_id}`` tool_id must no-op with a polite error. | STRING |
| HIGH | tests/test_memory_tool.py | 0 | a ``default_{user_id}`` tool_id must no-op with a polite error. | STRING |
| HIGH | tests/test_notes_tool.py | 0 | a ``default_{user_id}`` tool_id must no-op with a polite error. | STRING |
| HIGH | tests/graphrag/test_extraction.py | 0 | never leak a pool into another test; the ephemeral dsn dies with its db. | STRING |
| HIGH | tests/graphrag/test_store.py | 0 | never leak a pool into another test; the ephemeral dsn dies with its db. | STRING |
| HIGH | tests/graphrag/test_retriever_live.py | 0 | never leak a pool into another test; the ephemeral dsn dies with its db. | STRING |
| HIGH | …torage/db/repositories/test_reconciliation_liveness.py | 0 | update tool_call_attempts set attempted_at = clock_timestamp() - make_interval(mins => :age), updated_at = clock_timesta | STRING |
| HIGH | tests/storage/db/repositories/test_reconciliation.py | 0 | update tool_call_attempts set attempted_at = clock_timestamp() - make_interval(mins => :age), updated_at = clock_timesta | STRING |
| HIGH | tests/api/user/test_reconciliation.py | 0 | update tool_call_attempts set attempted_at = clock_timestamp() - make_interval(mins => :age), updated_at = clock_timesta | STRING |
| HIGH | tests/storage/db/repositories/test_todos.py | 0 | insert a user_tools row and return its uuid as a string. | STRING |
| HIGH | tests/storage/db/repositories/test_memories.py | 0 | insert a user_tools row and return its uuid as a string. | STRING |
| HIGH | tests/storage/db/repositories/test_notes.py | 0 | insert a user_tools row and return its uuid as a string. | STRING |
| HIGH | tests/vectorstore/test_milvus.py | 0 | deterministic 3-dim embeddings: distinct texts get distinct directions. | STRING |
| HIGH | tests/vectorstore/test_qdrant.py | 0 | deterministic 3-dim embeddings: distinct texts get distinct directions. | STRING |
| HIGH | tests/vectorstore/test_faiss.py | 0 | deterministic 3-dim embeddings: distinct texts get distinct directions. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/src/admin/AdminUI.test.ts | 70 | // The values below are the only ones the writers produce: guardrails emit | COMMENT |
| MEDIUM | frontend/src/admin/AdminUI.tsx | 181 | // (guardrails/runtime.py) and its .action carries flag/block; the device feed | COMMENT |
| MEDIUM | docsgpt/app.py | 72 | # Which embedding model this installation uses is a property of its index, not of | COMMENT |
| MEDIUM⚡ | docsgpt/background/wake.py | 253 | # The stored result passed the guardrails when the job finished (jobs.finalize). | COMMENT |
| MEDIUM | docsgpt/llm/openai.py | 280 | # the model's chain-of-thought survives the in-turn tool round-trip. | COMMENT |
| MEDIUM⚡ | docsgpt/agents/research_agent.py | 181 | # Main orchestration | COMMENT |
| MEDIUM | docsgpt/agents/headless_runner.py | 259 | # Agentic and research agents render the agentic preset, as in a chat. | COMMENT |
| MEDIUM | docsgpt/agents/headless_runner.py | 286 | # Sources are used as in a chat turn of this agent type: agentic and | COMMENT |
| MEDIUM | docsgpt/agents/headless_runner.py | 374 | # agent, so it carries the same guardrails an interactive turn would. | COMMENT |
| MEDIUM | docsgpt/agents/tool_executor.py | 1784 | # Journal it like the branches below, so a hallucination storm | COMMENT |
| MEDIUM | docsgpt/agents/tools/internal_search.py | 58 | # Dispatch per-source so on-demand agentic search honours the same | COMMENT |
| MEDIUM | docsgpt/agents/tools/read_document.py | 352 | # docsgpt/guardrails/engine.py. ``shutdown(cancel_futures=True)`` | COMMENT |
| MEDIUM | docsgpt/agents/workflows/workflow_engine.py | 408 | # No ``agent_config`` here, deliberately: per-agent guardrails are not | COMMENT |
| MEDIUM | docsgpt/parser/chunking.py | 39 | # Counted in the embedding model's tokenizer, not cl100k: ``max_tokens`` | COMMENT |
| MEDIUM | docsgpt/retriever/graph_rag.py | 338 | # mass rather than whatever absolute cosine this embedding model emits. | COMMENT |
| MEDIUM | docsgpt/storage/db/models.py | 413 | # Per-agent behavior contract (AgentConfig — guardrails today). Empty | COMMENT |
| MEDIUM | docsgpt/storage/db/models.py | 414 | # ``{}`` parses to guardrails-disabled. | COMMENT |
| MEDIUM | docsgpt/storage/db/repositories/token_usage.py | 198 | # title generation, history compression, RAG question condensing, | COMMENT |
| MEDIUM | docsgpt/api/answer/routes/base.py | 1275 | # blobs, never plaintext chain-of-thought. | COMMENT |
| MEDIUM⚡ | docsgpt/api/answer/services/stream_processor.py | 2111 | # the agentic swap applied. | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 791 | # actual context window instead of the default 128k. | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 1550 | # Per-agent behavior contract (guardrails). The floor is | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 1655 | # the upstream context window for any small (e.g. 8k/32k) BYOM. | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 2390 | # A resumed turn is still the same turn: rebuild it with the guardrails | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 2448 | # _get_prompt_content handles the agentic preset swap and caching; | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 2496 | # Create LLM and handler (dependency injection) | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 2593 | # tools_dict (classic/agentic/research), and only when a writable wiki | COMMENT |
| MEDIUM | docsgpt/api/answer/services/stream_processor.py | 2601 | # D11: agentic/research always carry a retriever_config; classic carries | COMMENT |
| MEDIUM | …t/api/answer/services/compression/threshold_checker.py | 68 | # Get context window limit for model | COMMENT |
| MEDIUM | docsgpt/api/user/resource_access.py | 56 | "edit_policy": "editor", # guardrails and quotas | CODE |
| MEDIUM | docsgpt/api/user/agents/routes.py | 219 | # Agent fields that are the owner's policy (guardrails and the pooled quota). | COMMENT |
| MEDIUM | tests/llm/test_credential_scope.py | 670 | # Sub-LLMs the agent builds (rephrase, guardrails) get no OpenAI key to misroute. | COMMENT |
| MEDIUM⚡ | tests/core/test_models_config_dir.py | 121 | # Override anthropic claude-haiku-4-5 to claim a 1M context window | STRING |
| MEDIUM | tests/integration/test_chat.py | 1212 | # Workflow with agentic node tests | COMMENT |
| MEDIUM⚡ | tests/agents/test_workflow_agent_types.py | 180 | # Workflow engine: agentic agent node execution | COMMENT |
| MEDIUM⚡ | tests/agents/test_research_agent.py | 818 | # _gen_inner (full orchestration tests) | COMMENT |
| MEDIUM | tests/parser/test_chunking_strategies.py | 22 | # Chunk budgets are enforced in the embedding model's tokenizer, so a | COMMENT |
| MEDIUM⚡ | tests/storage/db/repositories/test_activity.py | 87 | # The values the writers actually produce: guardrails/runtime.py emits | COMMENT |
| MEDIUM⚡ | …sts/api/answer/services/test_stream_processor_utils.py | 670 | # agentic ones instruct the model to call the search tool. | COMMENT |
| MEDIUM⚡ | …sts/api/answer/services/test_stream_processor_utils.py | 678 | # prompt — the agentic swap must still apply. | COMMENT |
| MEDIUM⚡ | …sts/api/answer/services/test_stream_processor_utils.py | 695 | # agentic ones instruct the model to call the search tool. | COMMENT |
| MEDIUM | …s/api/answer/services/compression/test_orchestrator.py | 166 | # the user's declared context window in the threshold check. | COMMENT |
| MEDIUM⚡ | tests/api/user/agents/test_guardrails_routes.py | 136 | # GET /api/guardrails/catalog | COMMENT |
| MEDIUM⚡ | tests/api/user/agents/test_guardrails_routes.py | 210 | # GET /api/guardrails/events | COMMENT |
| MEDIUM⚡ | tests/api/user/agents/test_guardrails_routes.py | 438 | # GET /api/guardrails/summary | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails.spec.ts | 149 | // AgentConfig (guardrails/config.py) normalizes the whole document, | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails.spec.ts | 515 | // agent (minus its guardrails) is the worst outcome: the operator | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails.spec.ts | 762 | // /api/guardrails/catalog has resolved. | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails-runtime.spec.ts | 9 | * // inside `StreamingOutputGuard` (application/guardrails/stream.py). Once a | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails-runtime.spec.ts | 38 | * // blocked prompts through `/api/guardrails/events`. | COMMENT |
| MEDIUM | tests/e2e/specs/tier-b/guardrails-runtime.spec.ts | 783 | // (application/guardrails/config.py:129-136) — that downgrade is the | COMMENT |
| MEDIUM | docs/public/llms.txt | 33 | - [Guardrails](https://docs.docsgpt.cloud/Agents/guardrails): Scan user input, retrieved sources, tool results and answe | CODE |
| MEDIUM | .devcontainer/post-create-command.sh | 24 | # The embedding model is fetched on first use and cached, so nothing to download | COMMENT |
| MEDIUM | scripts/e2e/mock_llm.py | 519 | # tool_calls are present, matching what RAG code paths expect. | COMMENT |
| MEDIUM | .github/workflows/docker-image-verify.yml | 5 | # encoding, an embedding model) fails here instead of in an air-gapped install. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | docsgpt/worker.py | 3770 | # Create a clean config for storage | COMMENT |
| MEDIUM | docsgpt/worker.py | 327 | # Define a function to extract metadata from a given filename. | COMMENT |
| MEDIUM | docsgpt/worker.py | 388 | # Define a function to generate a random string of a given length. | COMMENT |
| MEDIUM | docsgpt/worker.py | 584 | # Define the main function for ingesting and processing documents. | COMMENT |
| MEDIUM⚡ | docsgpt/connectors/service.py | 451 | # This module is the only caller of encrypt_json / decrypt_json for | COMMENT |
| MEDIUM | docsgpt/seed/config/agents_template.yaml | 2 | # This file contains template agents that will be seeded into the database | COMMENT |
| MEDIUM | docsgpt/parser/file/docs_parser.py | 37 | # Create a PDF object | COMMENT |
| MEDIUM | docsgpt/parser/remote/crawler_markdown.py | 69 | # Create a Document for each visited page | COMMENT |
| MEDIUM | tests/test_agent_token_tracking.py | 163 | # Create a concrete handler for testing | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 175 | # Create a small valid zip | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 189 | # Create a zip with many files (just over limit) | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 205 | # Create a zip with path traversal | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 383 | # Create a file with highly compressible content (all zeros) | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 386 | # Create a large file with repetitive content - compresses extremely well | COMMENT |
| MEDIUM⚡ | tests/test_zip_extraction_security.py | 402 | # Create a zip with random-ish content that doesn't compress well | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 223 | # Create a corrupted "zip" file | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 242 | # Create a valid zip | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 295 | # Create a chain of nested zips | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 324 | # Create a malicious zip | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 362 | # Create a corrupted file | COMMENT |
| MEDIUM | tests/test_zip_extraction_security.py | 424 | # Create a zip with a reasonable size (no compression to avoid ratio issues) | COMMENT |
| MEDIUM | tests/test_compression_service.py | 931 | # Create a long conversation with important info buried in the middle | COMMENT |
| MEDIUM | tests/test_integration.py | 268 | # Create a simple text file for upload | COMMENT |
| MEDIUM | tests/test_integration.py | 299 | # Create a file-like object | STRING |
| MEDIUM | tests/test_coverage_gaps.py | 2175 | # Create the BulkIndexError mock | COMMENT |
| MEDIUM⚡ | tests/test_remaining_coverage.py | 882 | # Create an object where accessing certain attrs raises AttributeError | COMMENT |
| MEDIUM | tests/llm/test_openai.py | 1410 | # Create a schema with a problematic object that raises during iteration | COMMENT |
| MEDIUM⚡ | tests/integration/test_misc.py | 186 | # Create a small test file content | COMMENT |
| MEDIUM⚡ | tests/integration/test_misc.py | 224 | # Create a larger test file (1KB) | COMMENT |
| MEDIUM⚡ | tests/integration/test_prompts.py | 359 | # Create a prompt specifically for deletion | COMMENT |
| MEDIUM⚡ | tests/integration/test_conversations.py | 281 | # Create a conversation specifically for deletion | COMMENT |
| MEDIUM⚡ | tests/integration/test_tools.py | 441 | # Create a tool specifically for deletion - must use available tool name | COMMENT |
| MEDIUM⚡ | tests/integration/test_agents.py | 316 | # Create an agent first | COMMENT |
| MEDIUM⚡ | tests/integration/test_agents.py | 521 | # Create a fresh agent for deletion | COMMENT |
| MEDIUM | tests/integration/test_agents.py | 74 | # Create a minimal test source | COMMENT |
| MEDIUM | tests/agents/test_tool_executor.py | 1453 | # Create a fake call object matching what ToolActionParser expects | COMMENT |
| MEDIUM | tests/agents/test_workflow_engine_coverage.py | 120 | # Create a cycle: start -> state -> state (loop) | COMMENT |
| MEDIUM | …sts/storage/db/repositories/test_pending_tool_state.py | 90 | # Create a state with TTL of 0 seconds (already expired) | COMMENT |
| MEDIUM⚡ | tests/storage/db/repositories/test_users.py | 247 | # Create an agent with a known legacy_mongo_id | COMMENT |
| MEDIUM⚡ | tests/storage/db/repositories/test_users.py | 251 | # Create a user whose pinned list has the ObjectId, an already-UUID, | COMMENT |
| MEDIUM | tests/stt/test_faster_whisper.py | 217 | # Create a segment that uses getattr fallbacks | COMMENT |
| MEDIUM⚡ | scripts/e2e/env.sh | 5 | # This file is intentionally passive: it exports variables and nothing else. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_logging.py | 339 | CODE | |
| MEDIUM | tests/test_extra_coverage.py | 218 | CODE | |
| MEDIUM | tests/test_extra_coverage.py | 284 | CODE | |
| MEDIUM | tests/test_version_check.py | 64 | CODE | |
| MEDIUM | tests/test_event_replay.py | 141 | CODE | |
| MEDIUM | tests/test_usage_latency.py | 79 | CODE | |
| MEDIUM | tests/tracing/test_tool_spans.py | 124 | CODE | |
| MEDIUM | tests/tracing/test_tool_spans.py | 79 | CODE | |
| MEDIUM | tests/tracing/test_tool_spans.py | 108 | CODE | |
| MEDIUM | tests/tracing/test_llm_spans.py | 167 | CODE | |
| MEDIUM | tests/seed/test_seeder.py | 181 | CODE | |
| MEDIUM | tests/llm/test_fallback_attachments.py | 26 | CODE | |
| MEDIUM | tests/llm/test_base.py | 578 | CODE | |
| MEDIUM | tests/llm/test_base.py | 599 | CODE | |
| MEDIUM | tests/agents/test_workflow_agent_graph.py | 178 | CODE | |
| MEDIUM | tests/agents/test_workflow_agent_graph.py | 259 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1388 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1527 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1561 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1595 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1629 | CODE | |
| MEDIUM | tests/agents/test_research_agent.py | 1664 | CODE | |
| MEDIUM | tests/agents/test_workflow_engine_coverage.py | 1079 | CODE | |
| MEDIUM | tests/parser/file/test_embedding_pipeline.py | 270 | CODE | |
| MEDIUM | tests/scripts/test_grant_admin.py | 101 | CODE | |
| MEDIUM | tests/api/test_events_routes.py | 84 | CODE | |
| MEDIUM | tests/api/v1/test_v1_idempotency.py | 393 | CODE | |
| MEDIUM | tests/api/v1/test_routes_extended.py | 248 | CODE | |
| MEDIUM | tests/api/v1/test_routes_extended.py | 292 | CODE | |
| MEDIUM | tests/api/answer/services/test_conversation_service.py | 84 | CODE | |
| MEDIUM | tests/api/answer/services/test_conversation_service.py | 802 | CODE | |
| MEDIUM | tests/api/answer/services/test_conversation_service.py | 854 | CODE | |
| MEDIUM | tests/api/answer/services/test_conversation_service.py | 906 | CODE | |
| MEDIUM | tests/api/user/test_sharing.py | 253 | CODE | |
| MEDIUM | tests/api/user/test_sharing.py | 515 | CODE | |
| MEDIUM | tests/api/user/test_prompts.py | 209 | CODE | |
| MEDIUM | tests/api/user/test_prompts.py | 261 | CODE | |
| MEDIUM | tests/api/user/test_prompts.py | 399 | CODE | |
| MEDIUM | tests/api/user/test_prompts.py | 556 | CODE | |
| MEDIUM | tests/api/user/test_analytics.py | 203 | CODE | |
| MEDIUM | tests/api/user/test_analytics.py | 262 | CODE | |
| MEDIUM | tests/api/user/test_analytics.py | 329 | CODE | |
| MEDIUM | tests/api/user/test_analytics.py | 471 | CODE | |
| MEDIUM | tests/api/user/test_analytics.py | 1156 | CODE | |
| MEDIUM | tests/api/user/test_tools_routes.py | 1220 | CODE | |
| MEDIUM | tests/api/user/test_tools_routes.py | 1262 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 203 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 248 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 292 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 440 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 725 | CODE | |
| MEDIUM | tests/api/user/test_conversations.py | 846 | CODE | |
| MEDIUM | tests/api/user/workflows/test_routes_coverage.py | 354 | CODE | |
| MEDIUM | tests/api/user/workflows/test_routes_coverage.py | 421 | CODE | |
| MEDIUM | tests/api/user/workflows/test_routes_coverage.py | 540 | CODE | |
| MEDIUM | tests/api/user/workflows/test_routes_coverage.py | 600 | CODE | |
| MEDIUM | tests/api/user/agents/test_sharing.py | 106 | CODE | |
| MEDIUM | tests/api/user/agents/test_sharing.py | 170 | CODE | |
| MEDIUM | tests/api/user/agents/test_sharing.py | 278 | CODE | |
| MEDIUM | tests/api/user/agents/test_routes_happy.py | 154 | CODE | |
| 9 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 903 | assert created.fs.create_folder.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 930 | assert created.fs.create_folder.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 937 | assert created.fs.get_file_info.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 944 | assert created.fs.list_files.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 951 | assert created.fs.delete_file.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 958 | assert sandbox._client.get.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| CRITICAL⚡ | tests/sandbox/test_daytona.py | 968 | assert box._client.list.call_args.kwargs.get("request_timeout") == 60.0 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/locale/zh.json | 2076 | "placeholder": "输入更新的查询...", | CODE |
| LOW | frontend/src/locale/de.json | 2084 | "placeholder": "Aktualisierte Anfrage eingeben...", | CODE |
| LOW | frontend/src/locale/ru.json | 2188 | "placeholder": "Введите обновленный запрос...", | CODE |
| LOW | frontend/src/locale/en.json | 2084 | "placeholder": "Type the updated query...", | CODE |
| LOW | frontend/src/locale/jp.json | 2077 | "placeholder": "更新されたクエリを入力...", | CODE |
| LOW | frontend/src/locale/zh-TW.json | 2077 | "placeholder": "輸入更新的查詢...", | CODE |
| LOW | frontend/src/locale/es.json | 2084 | "placeholder": "Ingrese la consulta actualizada...", | CODE |
| LOW | frontend/src/modals/MCPServerModal.test.tsx | 274 | expect(nameInput.getAttribute('placeholder')).not.toBe( | CODE |
| LOW⚡ | frontend/src/components/ui/form-field.test.tsx | 60 | expect(blank.getAttribute('placeholder')).toBe(' '); | CODE |
| LOW⚡ | frontend/src/components/ui/form-field.test.tsx | 66 | expect(input.getAttribute('placeholder')).toBe('name@example.com'); | CODE |
| LOW⚡ | frontend/src/components/ui/form-field.test.tsx | 76 | expect(textarea.getAttribute('placeholder')).toBe(' '); | CODE |
| LOW | frontend/src/components/ui/form-field.test.tsx | 112 | expect(input.hasAttribute('placeholder')).toBe(false); | CODE |
| LOW⚡ | tests/test_oidc.py | 221 | assert claims["email"] == "user@example.com" | CODE |
| LOW⚡ | tests/test_oidc.py | 1156 | "oidc-user-1", email="user@example.com" | CODE |
| LOW⚡ | tests/test_oidc.py | 1160 | assert call.kwargs["metadata"] == {"email": "user@example.com", "groups": None} | CODE |
| LOW⚡ | tests/test_oidc.py | 1171 | "oidc-user-1", "user@example.com" | CODE |
| LOW⚡ | tests/test_oidc.py | 1448 | email="user@example.com", name="OIDC User", oidc_sid="sess-2" | CODE |
| LOW⚡ | tests/test_oidc.py | 1458 | assert decoded["email"] == "user@example.com" | CODE |
| LOW | tests/test_oidc.py | 70 | "email": "user@example.com", | CODE |
| LOW | tests/test_oidc.py | 789 | assert decoded["email"] == "user@example.com" | CODE |
| LOW⚡ | tests/llm/test_fallback.py | 171 | get_api_key=lambda prov: "fake-key", | CODE |
| LOW⚡ | tests/llm/handlers/test_planned_attachments.py | 144 | return text_att(name, "lorem ipsum " * (tokens // 2)) | CODE |
| LOW⚡ | tests/llm/handlers/test_planned_attachments.py | 400 | files = [text_att(f"r{i}.txt", "lorem ipsum " * 10_000) for i in range(6)] | CODE |
| LOW | tests/agents/test_attachments_tool_wiring.py | 45 | body = "lorem ipsum " * (tokens // 2 + 1) | CODE |
| LOW | tests/agents/test_stateless_resume_attachments.py | 64 | assert "a.txt" in text and "lorem ipsum" in text | CODE |
| LOW | tests/agents/test_attachment_wiring.py | 31 | body = ("lorem ipsum " * (tokens // 2 + 1)) | CODE |
| LOW⚡ | tests/agents/test_tool_action_parser.py | 34 | call.arguments = '{"to": "user@example.com"}' | CODE |
| LOW⚡ | tests/agents/test_tool_action_parser.py | 40 | assert call_args == {"to": "user@example.com"} | CODE |
| LOW⚡ | tests/parser/connectors/test_share_point_auth.py | 243 | "preferred_username": "user@example.com", | CODE |
| LOW⚡ | tests/parser/connectors/test_share_point_auth.py | 253 | assert mapped["user_info"]["email"] == "user@example.com" | CODE |
| LOW⚡ | tests/storage/db/repositories/test_conversations.py | 616 | placeholder_response="placeholder", | CODE |
| LOW⚡ | tests/storage/db/repositories/test_conversations.py | 623 | assert msg["response"] == "placeholder" | CODE |
| LOW⚡ | tests/scripts/test_readme_translate.py | 283 | assert "placeholder" in agent.messages[1] | CODE |
| LOW | tests/scripts/test_readme_translate.py | 148 | assert any("placeholder" in error for error in errors) | CODE |
| LOW | tests/api/test_connector_routes_happy.py | 405 | "user_email": "user@example.com", | CODE |
| LOW⚡ | scripts/e2e/env.sh | 79 | export API_KEY="e2e-fake-key" | CODE |
| LOW⚡ | scripts/e2e/env.sh | 80 | export OPENAI_API_KEY="e2e-fake-key" | CODE |
| LOW⚡ | scripts/e2e/env.sh | 83 | export EMBEDDINGS_KEY="e2e-fake-key" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docsgpt/worker.py | 1252 | CODE | |
| LOW | docsgpt/worker.py | 3669 | CODE | |
| LOW | docsgpt/tracing/core.py | 247 | CODE | |
| LOW | docsgpt/guardrails/base.py | 14 | CODE | |
| LOW | docsgpt/deploy/stack.py | 102 | CODE | |
| LOW | docsgpt/agents/headless_runner.py | 102 | CODE | |
| LOW | docsgpt/agents/headless_runner.py | 188 | CODE | |
| LOW | docsgpt/agents/tool_executor.py | 457 | CODE | |
| LOW | docsgpt/agents/tool_executor.py | 634 | CODE | |
| LOW | docsgpt/agents/base.py | 186 | CODE | |
| LOW | docsgpt/agents/tools/brave.py | 33 | CODE | |
| LOW | docsgpt/agents/tools/mcp_tool.py | 988 | CODE | |
| LOW | docsgpt/agents/tools/internal_search.py | 470 | CODE | |
| LOW | docsgpt/parser/file/bulk.py | 386 | CODE | |
| LOW | docsgpt/retriever/dispatcher.py | 55 | CODE | |
| LOW | docsgpt/retriever/graph_rag.py | 193 | CODE | |
| LOW | docsgpt/retriever/classic_rag.py | 30 | CODE | |
| LOW | docsgpt/storage/db/repositories/stack_logs.py | 48 | CODE | |
| LOW | docsgpt/storage/db/repositories/activity.py | 163 | CODE | |
| LOW | docsgpt/storage/db/repositories/activity.py | 218 | CODE | |
| LOW | docsgpt/storage/db/repositories/activity.py | 292 | CODE | |
| LOW | docsgpt/storage/db/repositories/quota_policies.py | 108 | CODE | |
| LOW | docsgpt/storage/db/repositories/attachments.py | 53 | CODE | |
| LOW | docsgpt/storage/db/repositories/sources.py | 130 | CODE | |
| LOW | docsgpt/storage/db/repositories/connector_sessions.py | 64 | CODE | |
| LOW | docsgpt/storage/db/repositories/token_usage.py | 26 | CODE | |
| LOW | docsgpt/storage/db/repositories/artifacts.py | 43 | CODE | |
| LOW | docsgpt/storage/db/repositories/artifacts.py | 599 | CODE | |
| LOW | docsgpt/storage/db/repositories/background_jobs.py | 44 | CODE | |
| LOW | docsgpt/storage/db/repositories/user_tools.py | 52 | CODE | |
| LOW | docsgpt/storage/db/repositories/schedules.py | 30 | CODE | |
| LOW | docsgpt/storage/db/repositories/device_audit_log.py | 66 | CODE | |
| LOW | docsgpt/sandbox/daytona.py | 97 | CODE | |
| LOW | docsgpt/api/answer/routes/base.py | 481 | CODE | |
| LOW | docsgpt/api/answer/services/conversation_service.py | 105 | CODE | |
| LOW | docsgpt/api/answer/services/conversation_service.py | 263 | CODE | |
| LOW | docsgpt/api/answer/services/conversation_service.py | 400 | CODE | |
| LOW | docsgpt/api/user/tasks.py | 496 | CODE | |
| LOW | docsgpt/vectorstore/pgvector.py | 33 | CODE | |
| LOW | tests/core/test_model_utils.py | 23 | CODE | |
| LOW | tests/agents/test_attachment_budget.py | 50 | CODE | |
| LOW | tests/agents/tools/test_attachments_tool.py | 43 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | setup.sh | 80 | # Check if Docker is running | COMMENT |
| LOW | setup.sh | 813 | if [[ "$CONTAINER_STATUS" == *"ollama"* ]]; then # Check if 'ollama' service is in running services | CODE |
| LOW | setup.sh | 1014 | # Check if .env file exists and is not empty | COMMENT |
| LOW | docsgpt/llm/google_ai.py | 726 | # Check if we have both tools and file attachments | COMMENT |
| LOW | docsgpt/llm/openai.py | 131 | # Check if it looks like a data URL with base64 | COMMENT |
| LOW | docsgpt/llm/openai.py | 2203 | # Check if this is a pre-converted image (from PDF-to-image conversion) | COMMENT |
| LOW | docsgpt/llm/handlers/base.py | 276 | # Check if provider supports images but not PDF (synthetic PDF support) | COMMENT |
| LOW | docsgpt/llm/handlers/base.py | 1080 | # Check if compression actually reduced tokens — and produced | COMMENT |
| LOW | docsgpt/llm/handlers/base.py | 2068 | # Check if context limit was reached during tool execution. | COMMENT |
| LOW | docsgpt/core/url_validation.py | 173 | # Check if hostname is an IP address directly | COMMENT |
| LOW⚡ | docsgpt/agents/tools/memory.py | 283 | # Check if viewing directory (ends with / or is root) | COMMENT |
| LOW | docsgpt/agents/tools/memory.py | 381 | # Check if old_str exists (case-insensitive) | COMMENT |
| LOW | docsgpt/agents/tools/memory.py | 443 | # Check if it's a directory (ends with /) | COMMENT |
| LOW | docsgpt/agents/tools/internal_search.py | 218 | # Check if it's a file metadata dict or a folder | COMMENT |
| LOW | docsgpt/parser/remote/sitemap_loader.py | 23 | # Check if the input is a list and if it is, use the first element | COMMENT |
| LOW | docsgpt/parser/remote/github_loader.py | 380 | # Check if it's a rate limit issue | COMMENT |
| LOW | docsgpt/api/answer/services/stream_processor.py | 755 | # Check if compression is enabled and needed | COMMENT |
| LOW | docsgpt/api/answer/services/compression/service.py | 106 | # Check if there are existing compressions. ``compression_metadata`` | COMMENT |
| LOW | tests/test_integration.py | 719 | # Check if it's the detailed validation error or generic error | COMMENT |
| LOW | tests/test_integration.py | 919 | # Check if conversation was compressed by examining metadata | COMMENT |
| LOW | tests/test_integration.py | 1050 | # Check if the critical info was preserved | COMMENT |
| LOW | extensions/react-widget/publish.sh | 11 | # Check if a specific version was provided | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | docsgpt/worker.py | 3777 | # Step 2: Download files to temp directory | COMMENT |
| LOW | docsgpt/worker.py | 3751 | # Step 1: Initialize the appropriate loader | COMMENT |
| LOW | docsgpt/worker.py | 3815 | # Step 3: Use SimpleDirectoryReader to process downloaded files | COMMENT |
| LOW | docsgpt/worker.py | 3834 | # Step 4: Process documents (chunking, embedding, etc.) | COMMENT |
| LOW | docsgpt/worker.py | 3885 | # Step 6: Upload index files | COMMENT |
| LOW⚡ | tests/test_integration.py | 981 | # Step 2: Send CRITICAL information | COMMENT |
| LOW⚡ | tests/test_integration.py | 1006 | # Step 3: Send more general questions to bury the critical info | COMMENT |
| LOW⚡ | tests/test_integration.py | 1035 | # Step 4: Ask about the critical information | COMMENT |
| LOW | tests/test_integration.py | 950 | # Step 1: Send general questions | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 328 | # Step 1: trigger a tool call | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 350 | # Step 2: send continuation with tool result + top-level conversation_id | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 423 | # Step 1: trigger a tool call | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 449 | # Step 2: send continuation (standard format, top-level conversation_id) | COMMENT |
| LOW⚡ | .github/workflows/sync_fork.yaml | 18 | # Step 1: run a standard checkout action | COMMENT |
| LOW⚡ | .github/workflows/sync_fork.yaml | 22 | # Step 2: run the sync action | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | docsgpt/worker.py | 3777 | # Step 2: Download files to temp directory | COMMENT |
| LOW | docsgpt/worker.py | 3751 | # Step 1: Initialize the appropriate loader | COMMENT |
| LOW | docsgpt/worker.py | 3815 | # Step 3: Use SimpleDirectoryReader to process downloaded files | COMMENT |
| LOW | docsgpt/worker.py | 3834 | # Step 4: Process documents (chunking, embedding, etc.) | COMMENT |
| LOW | docsgpt/worker.py | 3885 | # Step 6: Upload index files | COMMENT |
| LOW⚡ | tests/test_integration.py | 981 | # Step 2: Send CRITICAL information | COMMENT |
| LOW⚡ | tests/test_integration.py | 1006 | # Step 3: Send more general questions to bury the critical info | COMMENT |
| LOW⚡ | tests/test_integration.py | 1035 | # Step 4: Ask about the critical information | COMMENT |
| LOW | tests/test_integration.py | 950 | # Step 1: Send general questions | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 328 | # Step 1: trigger a tool call | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 350 | # Step 2: send continuation with tool result + top-level conversation_id | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 423 | # Step 1: trigger a tool call | COMMENT |
| LOW | tests/integration/test_v1_tool_calls.py | 449 | # Step 2: send continuation (standard format, top-level conversation_id) | COMMENT |
| LOW⚡ | .github/workflows/sync_fork.yaml | 18 | # Step 1: run a standard checkout action | COMMENT |
| LOW⚡ | .github/workflows/sync_fork.yaml | 22 | # Step 2: run the sync action | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | frontend/package-lock.json | 11382 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | frontend/src/components/SkeletonLoader.tsx | 33 | // reader gets no signal at all while a section loads. Absolutely | COMMENT |
| MEDIUM | tests/test_compression_service.py | 1052 | "response": """Python decorators are a powerful feature that allows you to modify or enhance functions and c | CODE |
| LOW⚡ | tests/agents/test_workflow_agent_graph.py | 213 | # Should just return None since workflow not found in DB | COMMENT |
| MEDIUM | tests/retriever/test_prescreen.py | 66 | # A robust model judges relevance and drops the irrelevant chunk even | COMMENT |
| MEDIUM⚡ | tests/api/v1/test_reasoning_heartbeat_liveness.py | 120 | # Test harness | COMMENT |
| MEDIUM⚡ | tests/api/v1/test_v1_tool_pause_finalization.py | 143 | # Test harness | COMMENT |
| MEDIUM | docs/package-lock.json | 8844 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docsgpt/utils.py | 580 | # <your-api-key> or "a <= b" is kept. Single-letter names other than a, b, i | COMMENT |
| HIGH⚡ | tests/test_utils.py | 776 | "Replace <your-api-key> with your key.", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docsgpt/parser/file/docs_parser.py | 24 | # alternatively you can use local vision capable LLM | COMMENT |
| MEDIUM | docsgpt/parser/file/image_parser.py | 75 | # alternatively you can use local vision capable LLM | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docsgpt/security/safe_url.py | 595 | def handle_request(self, request: httpx.Request) -> httpx.Response: | CODE |
| LOW | tests/test_compression_service.py | 805 | def process_data(self, input_data: List[str]) -> Dict[str, Any]: | CODE |
| LOW | tests/test_compression_service.py | 1071 | def my_function(): | CODE |