DeepTutor: Lifelong Personalized Tutoring. https://deeptutor.info/.
This report summarizes scanner evidence for HKUDS/DeepTutor, a Python project with 41,097 GitHub stars. SynthScan examined 836,464 lines of code across 3526 source files, recording 16925 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 26.3 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 10097 finding(s).
Are imports declared and package/API names verified? 2532 finding(s).
Are wrappers, guards, and repeated structures necessary? 13648 finding(s).
Which changes need focused human review? 16925 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 16925 distinct pattern matches across 22 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 | web/context/app-shell-storage.ts | 100 | export function readStoredChatResponseTimeout(): number { | CODE |
| LOW | web/context/app-shell-storage.ts | 117 | export function writeStoredChatResponseTimeout(seconds: number): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 206 | export function hasStoredResponseLanguage(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 217 | export function readStoredResponseLanguage(): ResponseLanguage { | CODE |
| LOW | web/context/app-shell-storage.ts | 229 | export function writeStoredResponseLanguage(language: ResponseLanguage): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 243 | export function readStoredActiveSessionId(): string | null { | CODE |
| LOW | web/context/app-shell-storage.ts | 252 | export function writeStoredActiveSessionId(sessionId: string | null): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 270 | export function readStoredSidebarCollapsed(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 281 | export function writeStoredSidebarCollapsed(collapsed: boolean): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 321 | export function writeStoredCodeBlockTheme(theme: string): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 339 | export function normalizeCodeBlockShowLineNumbers( | CODE |
| LOW | web/context/app-shell-storage.ts | 347 | export function readStoredCodeBlockShowLineNumbers(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 361 | export function writeStoredCodeBlockShowLineNumbers(show: boolean): void { | CODE |
| LOW | web/context/app-shell-storage.ts | 379 | export function normalizeCodeBlockWrapLongLines( | CODE |
| LOW | web/context/app-shell-storage.ts | 387 | export function readStoredCodeBlockWrapLongLines(): boolean { | CODE |
| LOW | web/context/app-shell-storage.ts | 400 | export function writeStoredCodeBlockWrapLongLines(wrap: boolean): void { | CODE |
| LOW | web/context/QuizFollowupContext.tsx | 650 | export function useQuizFollowupController(): QuizFollowupController { | CODE |
| LOW | web/app/(workspace)/learning/reading/page.tsx | 7 | export default function ImmersiveReadingLibraryRoute() { | CODE |
| LOW | …pp/(workspace)/learning/reading/[workspaceId]/page.tsx | 3 | export default function NewImmersiveReadingSessionRoute() { | CODE |
| LOW | …pace)/learning/reading/[workspaceId]/sessions/page.tsx | 3 | export default function ImmersiveReadingWorkspaceRoute() { | CODE |
| LOW | …ng/reading/[workspaceId]/sessions/[sessionId]/page.tsx | 3 | export default function ImmersiveReadingWorkspaceSessionRoute() { | CODE |
| LOW | …orkspace)/learning/reading/folders/[folderId]/page.tsx | 3 | export default async function ImmersiveReadingFolderRoute({ | CODE |
| LOW | …p/(workspace)/learning/books/components/PageReader.tsx | 57 | function rememberPendingChapterEnd(bookId: string, pageId: string): void { | CODE |
| LOW | …es/settings/sections/LearnerProfileSettingsSection.tsx | 22 | export default function LearnerProfileSettingsPage() { | CODE |
| LOW | …res/settings/sections/DataMigrationSettingsSection.tsx | 74 | export default function DataMigrationSettingsSection() { | CODE |
| LOW | …res/settings/sections/ArchivedChatsSettingsSection.tsx | 36 | export default function ArchivedChatsSettingsSection() { | CODE |
| LOW | …res/settings/sections/VideoLearningSettingsSection.tsx | 23 | export default function VideoLearningSettingsPage() { | CODE |
| LOW | …s/settings/sections/DocumentParsingSettingsSection.tsx | 73 | export default function DocumentParsingSettingsPage() { | CODE |
| LOW | …res/settings/sections/ImageDescriptionModelSetting.tsx | 10 | export function ImageDescriptionModelSetting({ | CODE |
| LOW | web/features/settings/navigation/settings-access.ts | 22 | export function settingsAccessFromAuthStatus( | CODE |
| LOW | web/features/settings/navigation/settings-nav.ts | 95 | export function isSettingsCategoryVisible( | CODE |
| LOW | web/features/settings/navigation/settings-pages.ts | 158 | export function legacySettingsDestination(hash: string, search: string): string { | CODE |
| LOW | web/features/settings/store/SettingsStore.tsx | 130 | export function syncLoadedCodeBlockSettingsToAppShell( | CODE |
| LOW | web/features/settings/store/SettingsStore.tsx | 425 | function readStoredDiagnosticsResults(): Partial< | CODE |
| LOW | web/features/capabilities/model.ts | 64 | export function parseCapabilityCatalogPayload( | CODE |
| LOW | web/features/capabilities/presentation.tsx | 214 | export function mergeCapabilityPresentations( | CODE |
| LOW | web/features/capabilities/presentation.tsx | 259 | export function visibleCapabilityPresentations( | CODE |
| LOW | web/features/chat/ChatStateAdapter.tsx | 572 | function applySessionConfiguration( | CODE |
| LOW | web/features/chat/ChatStateAdapter.tsx | 1572 | export function hydrateMessageAttachments( | CODE |
| LOW | web/features/chat/ChatStateAdapter.tsx | 1622 | function normalizeSelectedBranches(value: unknown): Record<string, number> { | CODE |
| LOW | web/features/chat/trace/TracePresentation.tsx | 1406 | function getDeepResearchStatusLabel( | CODE |
| LOW | web/features/chat/trace/TracePresentation.tsx | 1466 | function getExploreContextStatusLabel( | CODE |
| LOW | web/features/chat/trace/TracePresentation.tsx | 1496 | function getReasoningProgressStatusLabel( | CODE |
| LOW | web/features/chat/trace/TracePresentation.tsx | 1933 | function formatResearchStageSummary(events: StreamEvent[], fallback: string) { | CODE |
| LOW | web/features/chat/controllers/useChatRouteSession.ts | 11 | export function shouldRevalidateCachedSession(input: { | CODE |
| LOW | web/features/chat/selectors/attachment-processing.ts | 57 | export function selectAttachmentProcessing( | CODE |
| LOW | …/multi-user/components/GuardianRelationshipsEditor.tsx | 33 | export function GuardianRelationshipsEditor({ | CODE |
| LOW | web/features/multi-user/components/GrantEditor.tsx | 40 | function conservativeLearningPolicy(): LearningPolicy { | CODE |
| LOW | web/features/knowledge/api/client.ts | 369 | export function invalidateKnowledgeCaches() { | CODE |
| LOW | web/features/knowledge/api/client.ts | 612 | export async function testGraphRagModelCompatibility( | CODE |
| LOW | web/features/knowledge/api/client.ts | 730 | export function knowledgeBaseFilePreviewTextPath( | CODE |
| LOW | web/tests/build-wrapper.test.ts | 80 | assert.match(worker, /getOrInsertComputed: function getOrInsertComputed\(/); | CODE |
| LOW | web/tests/message-branches.test.ts | 12 | function conversationWithShortBranch() { | CODE |
| LOW | web/tests/sidebar-prefetch.spec.tsx | 71 | function expectSidebarLinksToDisablePrefetch() { | CODE |
| LOW | web/tests/app-shell-code-block-hydration.spec.tsx | 12 | function CodeBlockPreferencesProbe() { | CODE |
| LOW | web/tests/settings-context-ui-sync.test.ts | 61 | function readSettingsContextSource() { | CODE |
| LOW | web/tests/settings-context-boolean-hydration.test.ts | 21 | function readSettingsContextSource() { | CODE |
| LOW | web/tests/visualize/VisualizationViewer.spec.tsx | 95 | async function renderPastMermaidDebounce(result: VisualizeResult) { | CODE |
| LOW | web/shared/auth/return-url.ts | 10 | export function normalizeInternalReturnPath( | CODE |
| LOW | web/shared/storage/store.ts | 167 | export function createBrowserStorageStore(): StorageStore { | CODE |
| 9245 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | docker-compose.ghcr.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.ghcr.yml | 3 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 24 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 26 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.ghcr.yml | 39 | # ============================================ | COMMENT |
| MEDIUM | requirements.txt | 1 | # ============================================ | COMMENT |
| MEDIUM | requirements.txt | 3 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 22 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 24 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 48 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 50 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 64 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 66 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 78 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 80 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 107 | # ============================================ | COMMENT |
| MEDIUM | .pre-commit-config.yaml | 109 | # ============================================ | COMMENT |
| MEDIUM | pyproject.toml | 329 | # ============================================ | COMMENT |
| MEDIUM | pyproject.toml | 331 | # ============================================ | COMMENT |
| MEDIUM⚡ | pyproject.toml | 453 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 455 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 461 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 463 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 470 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 472 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 476 | # ============================================ | STRING |
| MEDIUM⚡ | pyproject.toml | 478 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 356 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 358 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 497 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 499 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 525 | # ============================================ | STRING |
| MEDIUM | pyproject.toml | 527 | # ============================================ | STRING |
| MEDIUM⚡ | docker-compose.dev.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.dev.yml | 3 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.dev.yml | 10 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | compose.yaml | 3 | # ============================================ | COMMENT |
| MEDIUM | compose.yaml | 63 | # ============================================ | COMMENT |
| MEDIUM | compose.yaml | 85 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM | compose.yaml | 87 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM | compose.yaml | 129 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM | compose.yaml | 131 | # ---------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 1 | # ============================================ | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 3 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 24 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 45 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 49 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 74 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 76 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 144 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 146 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 211 | # ============================================ | COMMENT |
| MEDIUM | docker-compose.yml | 213 | # ============================================ | COMMENT |
| MEDIUM | web/app/(workspace)/learning/books/BooksRoute.tsx | 160 | // ── Data loaders ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/learning/books/BooksRoute.tsx | 317 | // ── Live event handling ──────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/learning/books/BooksRoute.tsx | 357 | // ── Selectors ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/learning/books/BooksRoute.tsx | 389 | // ── Handlers ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | web/app/(workspace)/learning/books/BooksRoute.tsx | 1002 | // ── Render ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/(workspace)/learning/books/components/BookCreator.tsx | 342 | // ─── helpers ─────────────────────────────────────────────────────────── | COMMENT |
| 1502 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 5 | CODE | |
| LOW | tests/test_release_workflow_guards.py | 3 | CODE | |
| LOW | tests/test_packaging_metadata.py | 3 | CODE | |
| LOW | tests/reading/test_epub_bilingual_units.py | 9 | CODE | |
| LOW | tests/reading/test_reading_media_notes.py | 14 | CODE | |
| LOW | tests/reading/test_quiz.py | 1 | CODE | |
| LOW | tests/reading/test_reading_hints.py | 3 | CODE | |
| LOW | tests/reading/test_vocabulary.py | 1 | CODE | |
| LOW | tests/reading/test_workspace_tools.py | 1 | CODE | |
| LOW | tests/reading/test_catalog_store.py | 1 | CODE | |
| LOW | tests/reading/test_router.py | 7 | CODE | |
| LOW | tests/reading/test_extensions.py | 1 | CODE | |
| LOW | tests/reading/test_reading_captions.py | 7 | CODE | |
| LOW | tests/reading/test_turn_wiring.py | 10 | CODE | |
| LOW | tests/reading/test_reading_pdf_media.py | 8 | CODE | |
| LOW | tests/reading/test_extension_router.py | 1 | CODE | |
| LOW | tests/reading/test_knowledge_capture.py | 1 | CODE | |
| LOW | tests/reading/test_view_figure.py | 3 | CODE | |
| LOW | tests/reading/test_read_aloud.py | 1 | CODE | |
| LOW | tests/reading/test_study_guidance.py | 1 | CODE | |
| LOW | tests/reading/test_epub_bilingual.py | 3 | CODE | |
| LOW | tests/reading/test_mode_registration.py | 10 | CODE | |
| LOW | tests/reading/test_reading_page_render.py | 14 | CODE | |
| LOW | tests/reading/test_translation.py | 1 | CODE | |
| LOW | tests/reading/test_references.py | 1 | CODE | |
| LOW | tests/tools/test_web_search.py | 3 | CODE | |
| LOW | tests/tools/test_github_query.py | 7 | CODE | |
| LOW | tests/tools/test_github_query.py | 10 | CODE | |
| LOW | tests/tools/test_github_query.py | 14 | CODE | |
| LOW | tests/tools/test_ask_user.py | 8 | CODE | |
| LOW | tests/tools/test_knowledge_frontier_tool.py | 3 | CODE | |
| LOW | tests/tools/test_office_artifact_execution.py | 3 | CODE | |
| LOW | tests/tools/test_kb_files_tool.py | 9 | CODE | |
| LOW | tests/tools/test_mineru.py | 1 | CODE | |
| LOW | tests/tools/test_learning_journal_tools.py | 3 | CODE | |
| LOW | tests/tools/test_rag_tool.py | 3 | CODE | |
| LOW | tests/tools/test_read_source.py | 1 | CODE | |
| LOW | tests/tools/test_mineru_models.py | 1 | CODE | |
| LOW | tests/tools/test_write_note.py | 3 | CODE | |
| LOW | tests/tools/test_question_bank_tool.py | 10 | CODE | |
| LOW | tests/tools/test_question_extractor.py | 1 | CODE | |
| LOW | tests/tools/test_list_notebook.py | 3 | CODE | |
| LOW | tests/tools/test_file_tools.py | 1 | CODE | |
| LOW | tests/tools/test_tex_tools.py | 8 | CODE | |
| LOW | tests/tools/test_code_execution_guidance.py | 1 | CODE | |
| LOW | tests/tools/test_pptx_workspace_flow.py | 1 | CODE | |
| LOW | tests/tools/test_zotero_search.py | 1 | CODE | |
| LOW | tests/tools/test_exec_prompt_hints.py | 3 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 3 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 11 | CODE | |
| LOW | tests/tools/test_web_fetch.py | 11 | CODE | |
| LOW | tests/tools/builtin/test_read_skill_tool.py | 1 | CODE | |
| LOW | tests/core/test_answer_call_kinds.py | 14 | CODE | |
| LOW | tests/core/test_record_streamed_usage.py | 8 | CODE | |
| LOW | tests/core/test_labeled_step_image_fallback.py | 9 | CODE | |
| LOW | tests/core/test_prompt_parity.py | 1 | CODE | |
| LOW | tests/core/test_provider_state_thinking_blocks.py | 8 | CODE | |
| LOW | tests/core/test_labeled_step_think_prelude.py | 19 | CODE | |
| LOW | tests/core/test_stream_bus.py | 3 | CODE | |
| LOW | tests/core/test_math_animator_capability.py | 1 | CODE | |
| 2370 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/conftest.py | 44 | except Exception: # pragma: no cover | CODE |
| LOW⚡ | tests/multi_user/test_registration_invite_only.py | 35 | except Exception: | CODE |
| MEDIUM | tests/multi_user/test_registration_invite_only.py | 31 | def _save(name): | CODE |
| LOW | tests/multi_user/test_learning_surface_map.py | 478 | except Exception as exc: | CODE |
| MEDIUM | tests/multi_user/test_learning_surface_map.py | 473 | def write_newer_grant() -> None: | CODE |
| LOW | tests/agents/test_failure_notices_name_the_cause.py | 39 | except Exception: # pragma: no cover - a broken bundle is its own test | CODE |
| LOW | tests/api/test_skills_hub_router.py | 18 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_knowledge_router.py | 33 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_linked_folder_routes.py | 13 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_partner_groups_router.py | 13 | except Exception: # pragma: no cover | CODE |
| LOW | tests/api/test_subagents_router.py | 19 | except Exception: # pragma: no cover - optional dependency in lightweight envs | CODE |
| LOW | tests/api/test_workspace_router.py | 14 | except Exception: # pragma: no cover - optional in the CLI-only package | CODE |
| LOW | tests/api/test_capabilities_router.py | 16 | except Exception: # pragma: no cover | CODE |
| LOW | tests/api/test_plugins_router.py | 20 | except Exception: # pragma: no cover | CODE |
| LOW | tests/api/test_knowledge_upload_guards.py | 36 | except Exception: # pragma: no cover - optional heavy imports in lightweight envs | CODE |
| LOW | tests/api/test_partners_router.py | 16 | except Exception: # pragma: no cover | CODE |
| LOW | tests/services/llm/test_llm_live.py | 94 | except Exception as exc: | CODE |
| LOW | tests/services/llm/test_llm_live.py | 129 | except Exception as exc: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 141 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 196 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 229 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 259 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 293 | except Exception as e: | CODE |
| LOW | tests/services/rag/test_pipeline_integration.py | 303 | except Exception as e: | CODE |
| LOW⚡ | tests/services/session/test_turn_repository.py | 35 | except Exception as exc: | CODE |
| LOW | scripts/reading_refresh_figures.py | 92 | except Exception as exc: # noqa: BLE001 - a bad config must not block dry runs | CODE |
| LOW | scripts/docker_compose.py | 33 | except Exception: | CODE |
| LOW | scripts/_cli_kit.py | 10 | except Exception: | CODE |
| MEDIUM | scripts/_cli_kit.py | 6 | def _ensure_replace_errors() -> None: | CODE |
| LOW | scripts/pb_setup.py | 63 | except Exception: | CODE |
| LOW | scripts/pb_setup.py | 130 | except Exception as exc: | CODE |
| LOW | scripts/pb_setup.py | 137 | except Exception as exc: | CODE |
| MEDIUM | scripts/pb_setup.py | 46 | def _get_client(): | CODE |
| LOW | scripts/install_extras.py | 72 | except Exception: | CODE |
| LOW | scripts/install_extras.py | 118 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/provider_cmd.py | 146 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/provider_cmd.py | 157 | except Exception: | CODE |
| LOW | deeptutor_cli/provider_cmd.py | 160 | except Exception as login_exc: | CODE |
| LOW | deeptutor_cli/config_cmd.py | 140 | except Exception: | CODE |
| LOW | deeptutor_cli/skill_login.py | 123 | except Exception: | CODE |
| LOW | deeptutor_cli/chat.py | 98 | except Exception: | CODE |
| LOW | deeptutor_cli/common.py | 298 | except Exception: | CODE |
| MEDIUM | deeptutor_cli/common.py | 295 | def _stdin_interactive() -> bool: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 647 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 770 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 897 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/init_wizard.py | 956 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 205 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 216 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 262 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 282 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 321 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 344 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 406 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 470 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 501 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 534 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 625 | except Exception as exc: | CODE |
| LOW | deeptutor_cli/kb.py | 643 | except Exception as exc: | CODE |
| LOW | deeptutor/reading/store.py | 431 | except Exception: | CODE |
| 1465 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/conftest.py | 44 | except Exception: # pragma: no cover | CODE |
| HIGH | tests/multi_user/test_learner_profile.py | 43 | except ValueError: | CODE |
| HIGH | tests/runtime/test_launcher.py | 530 | except psutil.NoSuchProcess: | CODE |
| HIGH | tests/services/rag/test_lightrag_server_pipeline.py | 84 | except LightRagServerNotConfiguredError: | CODE |
| HIGH | tests/services/partners/test_channel_secrets.py | 182 | except asyncio.CancelledError: | CODE |
| HIGH | tests/services/partners/test_channel_secrets.py | 222 | except asyncio.CancelledError: | CODE |
| HIGH | tests/services/partners/test_wecom_channel.py | 83 | except asyncio.CancelledError: | CODE |
| HIGH | scripts/_cli_kit.py | 10 | except Exception: | CODE |
| HIGH | scripts/export_discord_history.py | 265 | except ValueError: | CODE |
| HIGH | deeptutor_cli/provider_cmd.py | 157 | except Exception: | CODE |
| HIGH | deeptutor_cli/skill_login.py | 123 | except Exception: | CODE |
| HIGH | deeptutor/reading/store.py | 1200 | except OSError: | CODE |
| HIGH | deeptutor/tools/web_fetch.py | 189 | except ValueError: | CODE |
| HIGH | deeptutor/tools/brainstorm.py | 65 | except ValueError: | CODE |
| HIGH | deeptutor/tools/reason.py | 77 | except ValueError: | CODE |
| HIGH | deeptutor/co_writer/docx_converter.py | 272 | except Exception: | CODE |
| HIGH | deeptutor/co_writer/docx_converter.py | 356 | except Exception: | CODE |
| HIGH | deeptutor/co_writer/docx_converter.py | 566 | except (KeyError, ValueError): | CODE |
| HIGH | deeptutor/capabilities/setup/binding.py | 135 | except Exception: # noqa: BLE001 - advisory only | CODE |
| HIGH | deeptutor/capabilities/setup/binding.py | 207 | except Exception: # noqa: BLE001 - best effort | CODE |
| HIGH | deeptutor/capabilities/subagent/capability.py | 178 | except (TypeError, ValueError): | CODE |
| HIGH | deeptutor/multi_user/session_handoff.py | 226 | except FileNotFoundError: # pragma: no cover - dropped concurrently | CODE |
| HIGH | deeptutor/plugins/runtime.py | 635 | except ProcessLookupError: | CODE |
| HIGH | deeptutor/plugins/runtime.py | 650 | except (OSError, BrokenPipeError): | CODE |
| HIGH | deeptutor/plugins/lifecycle.py | 455 | except OSError: | CODE |
| HIGH | deeptutor/learning/storage.py | 784 | except OSError: | CODE |
| HIGH | deeptutor/learning/storage.py | 1825 | except ValueError: | CODE |
| HIGH | deeptutor/runtime/background_leader.py | 102 | except TimeoutError: | CODE |
| HIGH | deeptutor/runtime/update_worker.py | 171 | except Exception: | CODE |
| HIGH | deeptutor/runtime/launcher.py | 1143 | except OSError: | CODE |
| HIGH | deeptutor/runtime/launcher.py | 758 | except Exception: | CODE |
| HIGH | deeptutor/runtime/launcher.py | 907 | except Exception: | CODE |
| HIGH | deeptutor/runtime/launcher.py | 1118 | except OSError: | CODE |
| HIGH | deeptutor/runtime/launcher.py | 1163 | except (OSError, ValueError): | CODE |
| HIGH | deeptutor/runtime/memory_probe.py | 304 | except Exception: # noqa: BLE001 - psutil raises platform-specific errors | CODE |
| HIGH | deeptutor/agents/base_agent.py | 333 | except Exception: | CODE |
| HIGH | deeptutor/agents/research/pipeline.py | 2644 | except (IndexError, ValueError): | CODE |
| HIGH | deeptutor/agents/research/data_structures.py | 126 | except (TypeError, ValueError): | CODE |
| HIGH | deeptutor/agents/research/data_structures.py | 538 | except (ValueError, IndexError): | CODE |
| HIGH | deeptutor/agents/research/utils/citation_manager.py | 754 | except (ValueError, IndexError): | CODE |
| HIGH | deeptutor/agents/research/utils/citation_manager.py | 433 | except (json.JSONDecodeError, Exception): | CODE |
| HIGH | deeptutor/agents/research/utils/citation_manager.py | 186 | except ValueError: | CODE |
| HIGH | deeptutor/agents/research/utils/citation_manager.py | 199 | except (ValueError, IndexError): | CODE |
| HIGH | deeptutor/agents/research/utils/json_utils.py | 36 | except json.JSONDecodeError: | CODE |
| HIGH | deeptutor/agents/research/utils/json_utils.py | 30 | except json.JSONDecodeError: | CODE |
| HIGH | deeptutor/agents/_shared/json_output.py | 27 | except json.JSONDecodeError: | CODE |
| HIGH | deeptutor/agents/loop/dsml_tool_calls.py | 189 | except (TypeError, ValueError): | CODE |
| HIGH | deeptutor/utils/config_manager.py | 96 | except OSError: | CODE |
| HIGH | deeptutor/utils/error_utils.py | 77 | except (json.JSONDecodeError, AttributeError): | CODE |
| HIGH | deeptutor/utils/json_parser.py | 21 | except ImportError: | CODE |
| HIGH | deeptutor/knowledge/progress_tracker.py | 105 | except (ImportError, Exception): | CODE |
| HIGH | deeptutor/knowledge/progress_tracker.py | 103 | except RuntimeError: | CODE |
| HIGH | deeptutor/knowledge/indexing_run.py | 435 | except Exception: | CODE |
| HIGH | deeptutor/knowledge/manager.py | 1356 | except Exception: | CODE |
| HIGH | deeptutor/knowledge/manager.py | 1710 | except Exception: | CODE |
| HIGH | deeptutor/knowledge/manager.py | 1717 | except Exception: | CODE |
| HIGH | deeptutor/knowledge/manager.py | 1724 | except Exception: | CODE |
| HIGH | deeptutor/knowledge/manager.py | 221 | except ValueError: | CODE |
| HIGH | deeptutor/partners/channels/matrix.py | 529 | except Exception: | CODE |
| HIGH | deeptutor/partners/channels/matrix.py | 544 | except asyncio.CancelledError: | CODE |
| 140 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_capabilities_runtime.py | 241 | def set_trace_callback(self, callback) -> None: | CODE |
| LOW | tests/utils/test_document_extractor.py | 621 | def set_limits(max_file: int, max_total: int) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 189 | def update_kb_status(self, name: str, status: str, progress: dict | None = None) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 2194 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 2223 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | tests/api/test_knowledge_router.py | 2256 | def set_kb_config(self, kb_name: str, config: dict) -> None: | CODE |
| LOW | tests/api/test_linked_folder_routes.py | 92 | def update_kb_status(self, name: str, status: str, progress: dict | None = None) -> None: | CODE |
| LOW | tests/api/test_linked_folder_routes.py | 253 | def update_metadata(self, _count) -> None: | CODE |
| LOW | tests/api/test_linked_folder_routes.py | 292 | def update_metadata(self, _count) -> None: | CODE |
| LOW | tests/api/test_linked_folder_routes.py | 340 | def update_metadata(self, _count) -> None: | CODE |
| LOW | tests/services/test_task_model_call_sites.py | 210 | async def update_session_title(self, session_id: str, title: str) -> None: | CODE |
| LOW | tests/services/test_github_source_sync_service.py | 41 | def update_github_source_state(self, **_kwargs) -> None: | CODE |
| LOW | tests/services/test_github_source_unchanged_sync.py | 52 | def update_github_source_state(self, **fields: Any) -> None: | CODE |
| LOW | scripts/_cli_kit.py | 31 | __all__ = ["banner", "log_error", "log_success"] | CODE |
| LOW | deeptutor_cli/skill_prompts.py | 208 | __all__ = ["collect_classification", "select_domains", "select_many", "select_one"] | CODE |
| LOW | deeptutor_cli/_tool_result.py | 159 | __all__ = [ | CODE |
| LOW | deeptutor_cli/skill_login.py | 134 | __all__ = ["LoginResult", "hub_origin_from_base", "oauth_start_url", "run_login"] | CODE |
| LOW | deeptutor_cli/common.py | 610 | def _settle_round(self, call_id: str, *, role: str) -> None: | CODE |
| LOW | deeptutor_cli/workspace_cmd.py | 44 | __all__ = ["register"] | CODE |
| LOW | deeptutor_cli/init_wizard.py | 1026 | __all__ = [ | CODE |
| LOW | deeptutor_cli/setup_config.py | 225 | def update_catalog(catalog: dict) -> None: | CODE |
| LOW | deeptutor_cli/doctor.py | 78 | __all__ = ["register"] | CODE |
| LOW | deeptutor/response_languages.py | 8 | __all__ = ["SUPPORTED_RESPONSE_LANGUAGES", "validate_reply_language_override"] | CODE |
| LOW | deeptutor/reading/store.py | 64 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/store.py | 1562 | __all__ = [ | CODE |
| LOW | deeptutor/reading/service.py | 240 | __all__ = [ | CODE |
| LOW | deeptutor/reading/ingestion.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/ingestion.py | 1173 | __all__ = [ | CODE |
| LOW | deeptutor/reading/quiz.py | 139 | __all__ = ["ReadingQuizExtension"] | CODE |
| LOW | deeptutor/reading/models.py | 515 | __all__ = [ | CODE |
| LOW | deeptutor/reading/page_render.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/references.py | 177 | __all__ = [ | CODE |
| LOW | deeptutor/reading/read_aloud.py | 33 | __all__ = ["ReadAloudExtension"] | CODE |
| LOW | deeptutor/reading/epub_bilingual.py | 242 | __all__ = [ | CODE |
| LOW | deeptutor/reading/__init__.py | 77 | __all__ = [ | CODE |
| LOW | deeptutor/reading/catalog_store.py | 1092 | __all__ = ["ReadingCatalogStore"] | CODE |
| LOW | deeptutor/reading/study_guidance.py | 103 | __all__ = ["StudyGuidanceExtension"] | CODE |
| LOW | deeptutor/reading/export.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/export.py | 259 | __all__ = ["ExportFormat", "ExportResult", "export_material"] | CODE |
| LOW | deeptutor/reading/catalog_models.py | 136 | __all__ = [ | CODE |
| LOW | deeptutor/reading/_grounding.py | 108 | __all__ = [ | CODE |
| LOW | deeptutor/reading/extensions.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/extensions.py | 196 | __all__ = [ | CODE |
| LOW | deeptutor/reading/translation.py | 133 | __all__ = ["TranslationExtension"] | CODE |
| LOW | deeptutor/reading/refresh.py | 26 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/search.py | 231 | __all__ = [ | CODE |
| LOW | deeptutor/reading/captions.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/captions.py | 139 | __all__ = [ | CODE |
| LOW | deeptutor/reading/vocabulary.py | 131 | __all__ = ["VocabularyExtension"] | CODE |
| LOW | deeptutor/reading/extract.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/reading/extract.py | 588 | __all__ = [ | CODE |
| LOW | deeptutor/reading/knowledge_capture.py | 172 | __all__ = [ | CODE |
| LOW | deeptutor/tools/paper_search_tool.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/partner_memory.py | 310 | __all__ = [ | CODE |
| LOW | deeptutor/tools/web_fetch.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/web_fetch.py | 288 | __all__ = [ | CODE |
| LOW | deeptutor/tools/brainstorm.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | deeptutor/tools/mastery_nav.py | 492 | __all__ = [ | CODE |
| LOW | deeptutor/tools/ask_user.py | 369 | __all__ = [ | CODE |
| LOW | deeptutor/tools/file_tools.py | 291 | __all__ = ["EditFileTool", "ListDirTool", "ReadFileTool", "WriteFileTool"] | CODE |
| 944 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/core/test_prompt_parity.py | 33 | CODE | |
| LOW | tests/core/test_prompt_parity.py | 62 | CODE | |
| LOW | tests/multi_user/test_workspace_resources.py | 136 | CODE | |
| LOW | tests/services/test_mimo_voice.py | 105 | CODE | |
| LOW | tests/services/memory/test_modes.py | 260 | CODE | |
| LOW | tests/services/memory/test_modes.py | 279 | CODE | |
| LOW | tests/services/config/test_readiness.py | 284 | CODE | |
| LOW | tests/services/rag/test_pipeline_integration.py | 334 | CODE | |
| LOW | tests/services/rag/test_lightrag_roles.py | 265 | CODE | |
| LOW | tests/services/parsing/test_mineru_normalization.py | 18 | CODE | |
| LOW | examples/plugins/learning_echo/learning_echo/worker.py | 14 | CODE | |
| LOW | scripts/check_architecture.py | 56 | CODE | |
| LOW | deeptutor_cli/provider_cmd.py | 43 | CODE | |
| LOW | deeptutor_cli/provider_cmd.py | 119 | CODE | |
| LOW | deeptutor_cli/init_cmd.py | 382 | CODE | |
| LOW | deeptutor_cli/memory.py | 20 | CODE | |
| LOW | deeptutor_cli/memory.py | 64 | CODE | |
| LOW | deeptutor_cli/chat.py | 86 | CODE | |
| LOW | deeptutor_cli/chat.py | 192 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 613 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 685 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 736 | CODE | |
| LOW | deeptutor_cli/init_wizard.py | 902 | CODE | |
| LOW | deeptutor_cli/doctor.py | 20 | CODE | |
| LOW | deeptutor/reading/store.py | 254 | CODE | |
| LOW | deeptutor/reading/store.py | 440 | CODE | |
| LOW | deeptutor/reading/store.py | 605 | CODE | |
| LOW | deeptutor/reading/store.py | 1225 | CODE | |
| LOW | deeptutor/reading/service.py | 63 | CODE | |
| LOW | deeptutor/reading/ingestion.py | 660 | CODE | |
| LOW | deeptutor/reading/models.py | 324 | CODE | |
| LOW | deeptutor/reading/catalog_store.py | 396 | CODE | |
| LOW | deeptutor/reading/export.py | 87 | CODE | |
| LOW | deeptutor/reading/export.py | 208 | CODE | |
| LOW | deeptutor/reading/refresh.py | 104 | CODE | |
| LOW | deeptutor/reading/extract.py | 131 | CODE | |
| LOW | deeptutor/reading/extract.py | 436 | CODE | |
| LOW | deeptutor/tools/web_fetch.py | 73 | CODE | |
| LOW | deeptutor/tools/tex_chunker.py | 90 | CODE | |
| LOW | deeptutor/tools/tex_chunker.py | 203 | CODE | |
| LOW | deeptutor/tools/ask_user.py | 243 | CODE | |
| LOW | deeptutor/tools/prompting/__init__.py | 169 | CODE | |
| LOW | deeptutor/tools/vision/image_utils.py | 113 | CODE | |
| LOW | deeptutor/tools/vision/ggb_validator.py | 174 | CODE | |
| LOW | deeptutor/tools/vision/block_parser.py | 121 | CODE | |
| LOW | deeptutor/co_writer/docx_converter.py | 194 | CODE | |
| LOW | deeptutor/co_writer/docx_converter.py | 626 | CODE | |
| LOW | deeptutor/capabilities/mastery/tools.py | 2771 | CODE | |
| LOW | deeptutor/capabilities/course_study/tools.py | 461 | CODE | |
| LOW | deeptutor/capabilities/audio_overview/pipeline.py | 110 | CODE | |
| LOW | deeptutor/multi_user/book_permission.py | 45 | CODE | |
| LOW | deeptutor/multi_user/book_access.py | 119 | CODE | |
| LOW | deeptutor/multi_user/grants.py | 48 | CODE | |
| LOW | deeptutor/multi_user/session_handoff.py | 331 | CODE | |
| LOW | deeptutor/multi_user/session_handoff.py | 403 | CODE | |
| LOW | deeptutor/app/service.py | 37 | CODE | |
| LOW | deeptutor/app/service.py | 179 | CODE | |
| LOW | deeptutor/app/container.py | 163 | CODE | |
| LOW | deeptutor/textbook_struct/page_headers.py | 49 | CODE | |
| LOW | deeptutor/textbook_struct/chapter_rebuild.py | 146 | CODE | |
| 419 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | web/tests/provider-registry-workflow.spec.tsx | 310 | const added = mocks.settings.draft.services.llm.profiles.flatMap(p => p.models).find(m => m.model === "custom/model-id | CODE |
| CRITICAL | web/tests/provider-registry-workflow.spec.tsx | 359 | const profile = mocks.settings.draft.services.embedding.profiles.at(-1)!; | CODE |
| CRITICAL | web/tests/provider-registry-workflow.spec.tsx | 549 | expect(mocks.settings.draft.services.tts.profiles.at(-1)?.provider_ref).toMatchObject({ service: "llm", profile_id: "l | CODE |
| CRITICAL | web/tests/epub-display-preferences.spec.tsx | 221 | const oldCfiDisplays = fixture.rendition.display.mock.calls.filter( | CODE |
| CRITICAL | web/tests/epub-display-preferences.spec.tsx | 236 | fixture.rendition.display.mock.calls.filter( | CODE |
| CRITICAL | web/tests/epub-display-preferences.spec.tsx | 250 | const relocated = fixture.rendition.on.mock.calls.find(([event]) => event === "relocated")?.[1] as unknown as (locatio | CODE |
| CRITICAL | tests/api/test_partner_groups_router.py | 346 | config_path = client.app.state.partner_groups.store.group_dir(group_id) / "config.json" | CODE |
| CRITICAL⚡ | tests/services/partners/test_feishu_reply_delivery.py | 55 | channel._client.im.v1.message.create.assert_not_called() | CODE |
| CRITICAL⚡ | tests/services/partners/test_feishu_reply_delivery.py | 58 | channel._client.im.v1.message.create.assert_called_once() | CODE |
| CRITICAL⚡ | tests/services/partners/test_feishu_reply_delivery.py | 67 | channel._client.im.v1.message.reply.assert_called_once() | CODE |
| CRITICAL⚡ | tests/services/partners/test_feishu_reply_delivery.py | 68 | channel._client.im.v1.message.create.assert_called_once() | CODE |
| CRITICAL⚡ | tests/services/partners/test_feishu_reply_delivery.py | 77 | channel._client.im.v1.message.create.assert_not_called() | CODE |
| CRITICAL | tests/services/partners/test_feishu_reply_delivery.py | 142 | channel._client.im.v1.message.create.assert_not_called() | CODE |
| CRITICAL | tests/services/partners/test_feishu_thinking_notice.py | 99 | channel._client.im.v1.message.create.assert_not_called() | CODE |
| CRITICAL⚡ | deeptutor/partners/channels/feishu.py | 1306 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL⚡ | deeptutor/partners/channels/feishu.py | 1325 | response = self._client.im.v1.message.delete(request) | CODE |
| CRITICAL⚡ | deeptutor/partners/channels/feishu.py | 1564 | response = self._client.cardkit.v1.card_element.content(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 720 | response = self._client.im.v1.message_reaction.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 762 | response = self._client.im.v1.message_reaction.delete(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1116 | response = self._client.im.v1.image.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1150 | response = self._client.im.v1.file.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1178 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1213 | response = self._client.im.v1.message_resource.get(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1399 | response = self._client.im.v1.message.reply(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1432 | response = self._client.im.v1.message.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1517 | response = self._client.cardkit.v1.card.create(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1601 | response = self._client.cardkit.v1.card.settings(request) | CODE |
| CRITICAL | deeptutor/partners/channels/feishu.py | 1953 | response = self._client.im.v1.message.patch(request) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 119 | # RAG (LlamaIndex) | COMMENT |
| MEDIUM | README.md | 114 | > **[2026.7.19]** [v1.5.2](https://github.com/HKUDS/DeepTutor/releases/tag/v1.5.2) — Configurable chat attachment limits | CODE |
| MEDIUM | README.md | 150 | > **[2026.5.22]** [v1.4.0](https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0) — GA cut of v1.4: Auto Mode, three-la | CODE |
| MEDIUM | README.md | 152 | > **[2026.5.21]** [v1.4.0-beta](https://github.com/HKUDS/DeepTutor/releases/tag/v1.4.0-beta) — Three-layer Memory workbe | CODE |
| MEDIUM⚡ | docker-compose.yml | 4 | # This file provides orchestration for DeepTutor services | COMMENT |
| MEDIUM | tests/core/test_labeled_step_think_prelude.py | 403 | # No reasoning trace events emitted for a clean FINISH. | COMMENT |
| MEDIUM | tests/core/test_capabilities_runtime.py | 82 | # Course Study orchestrates across the surfaces above rather than | COMMENT |
| MEDIUM | tests/agents/chat/test_agent_loop.py | 872 | # The pre-pass streamed THINKING (reasoning trace), never CONTENT — the | COMMENT |
| MEDIUM | tests/agents/chat/test_agent_loop.py | 213 | """#1611: exercise the active Mastery loop, real RAG tool and verified store.""" | STRING |
| MEDIUM | tests/services/llm/test_capabilities.py | 69 | # M3 is the current default model (1M-token context window, image input | COMMENT |
| MEDIUM⚡ | tests/services/skill/test_skill_hub.py | 388 | # ── orchestration ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …ts/services/config/test_provider_runtime_api_format.py | 139 | # The agentic gate normally refuses tools on local servers; the | COMMENT |
| MEDIUM | tests/services/rag/test_pageindex_pipeline.py | 209 | # Constructing a real LlamaIndexPipeline resolves the active embedding model | COMMENT |
| MEDIUM | tests/services/rag/__init__.py | 1 | # Tests for RAG pipeline | COMMENT |
| MEDIUM | requirements/cli.txt | 41 | # --- RAG (LlamaIndex) --- | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-3.md | 99 | ### RAG and Knowledge Base Resilience | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 49 | ### 🧩 RAG Module Decoupling | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 104 | ├── rag/ # 🆕 Decoupled RAG system | CODE |
| MEDIUM | assets/releases/past_releases/ver0-4-0.md | 109 | │ └── components/ # Modular RAG components | CODE |
| MEDIUM | assets/releases/past_releases/ver0-5-1.md | 9 | ### 📄 Docling Support for RAG-Anything | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-4-0-beta.md | 86 | ### Chat Capability & LlamaIndex RAG Refactor | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-6.md | 38 | ### RAG and Knowledge Reliability | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-0.md | 46 | ### RAG Pipeline Selection | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-0.md | 101 | ### RAG System | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-2.md | 42 | ### RAG Re-index and Retrieval Resilience | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-5-5.md | 21 | ### Traceable RAG citations | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-5-0.md | 116 | - #532 — RAG chat could not return information from the selected knowledge base | CODE |
| MEDIUM | assets/releases/past_releases/ver1-5-0.md | 118 | - #552 — RAG chat on a 250 MB knowledge base returned nothing | CODE |
| MEDIUM | assets/releases/past_releases/ver1-5-15.md | 33 | `max_concurrent_files`, `llm_model_max_async`, and `entity_extract_max_gleaning` reached runtime settings and the API in | CODE |
| MEDIUM | assets/releases/past_releases/ver1-3-5.md | 26 | ### More Reliable RAG Tool Calls | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-1.md | 11 | ### Safer RAG and Knowledge Base Routing | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-6-0.md | 21 | ### Flexible RAG Pipeline Import | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-3-4.md | 57 | ### RAG, Documents, and Knowledge Base Recovery | COMMENT |
| MEDIUM | assets/releases/past_releases/ver1-1-2.md | 16 | ### RAG Simplified to a Single Pipeline | COMMENT |
| MEDIUM | assets/releases/past_releases/ver0-5-2.md | 7 | ### Docling Support for RAG-Anything | COMMENT |
| MEDIUM | deeptutor_cli/README.md | 11 | # 仅 CLI(本地源码安装,含 RAG / 文档解析 / 各家 LLM provider SDK) | COMMENT |
| MEDIUM | deeptutor/tools/web_fetch.py | 46 | # pages. For JS-heavy SPAs the tool will return the bare HTML scaffold — | COMMENT |
| MEDIUM | deeptutor/tools/list_notebook.py | 29 | # context window. The cap is recorded in the rendered output so the | COMMENT |
| MEDIUM | deeptutor/co_writer/edit_agent.py | 194 | # RAG and web sources keep the existing prefetch path above. | COMMENT |
| MEDIUM | deeptutor/capabilities/explore_context/explorer.py | 177 | # ---- agentic loop ---------------------------------------------------- | COMMENT |
| MEDIUM | deeptutor/capabilities/explore_context/capability.py | 128 | # ``core.agentic``, and this capability is constructed at | COMMENT |
| MEDIUM | …capabilities/course_study/prompts/en/course_study.yaml | 1 | # Prompt fragments for the Course Study orchestration mode. | COMMENT |
| MEDIUM | deeptutor/learning/prompts.py | 54 | # scaffolding. The directive — the same one book, quiz and Deep Research | COMMENT |
| MEDIUM⚡ | deeptutor/learning/tests/test_topic_materials.py | 108 | # The instruction that actually prevents the hallucination. | COMMENT |
| MEDIUM | deeptutor/visualizers/loop_capability.py | 23 | # unconditionally. Streaming that prose would show the reader scaffolding | COMMENT |
| MEDIUM | deeptutor/runtime/agentic/labeled_step.py | 545 | # Reasoning models that surface chain-of-thought via the dedicated | COMMENT |
| MEDIUM | deeptutor/runtime/agentic/labeled_step.py | 551 | # see only the answer with no reasoning trace. Route the reasoning | COMMENT |
| MEDIUM | deeptutor/runtime/agentic/usage.py | 85 | # Local import keeps ``core.agentic`` import-light at module load. | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 171 | # Per-block research: the headline agentic loop. ``APPEND`` is the | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 365 | # and the resolution is a pure read with no RAG usage audit. Unresolvable | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 290 | knowledge: str # accumulated FINISH text from the block's agentic loop | CODE |
| MEDIUM | deeptutor/agents/research/utils/citation_manager.py | 731 | # For RAG/web_search/etc: each citation gets unique ref_number | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/zh/pipeline.yaml | 138 | # Phase 3 — Per-block research (agentic loop) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/en/pipeline.yaml | 91 | # Phase 1 — Rephrase (mini agentic loop with ask_user) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/research/prompts/en/pipeline.yaml | 147 | # Phase 3 — Per-block research (agentic loop) | COMMENT |
| MEDIUM | deeptutor/agents/visualize/capability.py | 179 | # model can spend most of one round on chain-of-thought, which truncated | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/zh/pipeline.yaml | 18 | # 阶段 1:探索(agentic loop —— 沿用 chat 风格工具集) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/zh/pipeline.yaml | 172 | # 阶段 3:出题(每道题一个 agentic loop) | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 4 | # * explore.step — agentic loop with ``THINK`` / ``TOOL`` / | COMMENT |
| MEDIUM⚡ | deeptutor/agents/question/prompts/en/pipeline.yaml | 13 | # * quiz_step — agentic loop with ``THINK`` / ``TOOL`` / | COMMENT |
| 37 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/core/test_config_manager.py | 84 | "embedding": {"active_profile_id": null, "active_model_id": null, "profiles": []}, | STRING |
| HIGH | tests/core/test_config_manager.py | 85 | "search": {"active_profile_id": null, "profiles": []} | STRING |
| HIGH | tests/runtime/test_launcher_lifecycle.py | 399 | "export default function Page() { return null; }", encoding="utf-8" | CODE |
| HIGH | tests/runtime/test_launcher.py | 767 | page.write_text("export default function Page() { return null; }", encoding="utf-8") | CODE |
| HIGH⚡ | tests/scripts/test_docker_compose.py | 224 | assert "chown -R deeptutor:deeptutor /app/data 2>/dev/null || true" not in content | CODE |
| HIGH⚡ | tests/api/test_partners_channel_schema.py | 140 | # Pydantic's ``Optional[str]`` becomes ``anyOf: [{type: string}, {type: null}]``. | COMMENT |
| HIGH | tests/services/test_app_update.py | 252 | assert installation.command == "git pull && pip install -e ." | CODE |
| HIGH | tests/services/test_model_catalog.py | 74 | "search": {"active_profile_id": null, "profiles": []} | STRING |
| HIGH⚡ | tests/services/embedding/test_extract_embeddings.py | 164 | """When a provider returns {"embedding": null}, use [] instead of None. | STRING |
| HIGH⚡ | tests/services/cli_apps/test_models.py | 98 | "cd sketch/agent-harness && npm install && npm link", | CODE |
| HIGH⚡ | tests/services/sandbox/test_argv_exec.py | 172 | result = runner_server.execute({"command": "echo a && echo b", "limits": {"timeout_s": 10}}) | CODE |
| HIGH | …ts/services/session/test_pocketbase_store_fallbacks.py | 76 | workspace = re.search(r'preferences_json\.workspace_id=("(?:\\.|[^"\\])*"|null)', flt) | CODE |
| HIGH | …ts/services/session/test_pocketbase_store_fallbacks.py | 84 | flt = re.sub(r'preferences_json\.workspace_id=("(?:\\.|[^"\\])*"|null)', "", flt) | CODE |
| HIGH | tests/services/session/test_pocketbase_isolation.py | 62 | workspace = re.search(r'preferences_json\.workspace_id=("(?:\\.|[^"\\])*"|null)', flt) | CODE |
| HIGH | tests/services/session/test_pocketbase_isolation.py | 70 | flt = re.sub(r'preferences_json\.workspace_id=("(?:\\.|[^"\\])*"|null)', "", flt) | CODE |
| HIGH | scripts/update.py | 341 | hints.append("Frontend dependencies changed: consider running cd web && npm install") | CODE |
| HIGH | deeptutor/visualizers/builtin.py | 247 | Never include functions, comments, undefined, single-quoted strings or trailing | CODE |
| HIGH | deeptutor/runtime/launcher.py | 984 | "npm not found. Source installs require Node.js/npm and `cd web && npm install`." | CODE |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 248 | ] | null, | STRING |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 249 | "user_answer_image": str | null, # legacy single-image form | STRING |
| HIGH⚡ | deeptutor/api/routers/quiz_judge.py | 250 | "image_filename": str | null, # legacy filename for the above | STRING |
| HIGH | deeptutor/api/routers/quiz_judge.py | 237 | "options": dict | null, | STRING |
| HIGH | deeptutor/services/app_update.py | 236 | command="git pull && pip install -e .", | CODE |
| HIGH | deeptutor/services/app_update.py | 254 | command="git pull && pip install -e .", | CODE |
| HIGH | deeptutor/services/setup/data_volume.py | 5 | owned by a different host UID (``PUID``/``PGID``). A silent ``chown || true`` | STRING |
| HIGH | deeptutor/services/partners/manager.py | 223 | #: YAML null: a bare ``mcp_tools:`` key parses as null, and a hand-edit that | COMMENT |
| HIGH | deeptutor/services/partners/manager.py | 236 | ``mcp_tools`` key), a bare key (YAML null), and a malformed value all read | STRING |
| HIGH | deeptutor/services/session/pocketbase_store.py | 592 | " && (preferences_json.archived=null || preferences_json.archived=false)" | CODE |
| HIGH | deeptutor/services/session/pocketbase_store.py | 593 | ' && (preferences_json.parent_session_id=null || preferences_json.parent_session_id="")' | CODE |
| HIGH | deeptutor/services/session/pocketbase_store.py | 1114 | "filter": f'({turn_scope}) && (type="result" || type="done" || metadata_json.model != null)' | CODE |
| HIGH | deeptutor/services/session/turns/executor.py | 864 | # with explicit null). Otherwise let the store auto-append. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.ghcr.yml | 1 | # ============================================ | COMMENT |
| LOW | docker-compose.ghcr.yml | 21 | # Use "host.docker.internal" instead of "localhost" in provider base_url fields. | COMMENT |
| LOW | docker-compose.ghcr.yml | 81 | - DEEPTUTOR_WORKSPACE_ALLOWED_ROOTS=/workspace | COMMENT |
| LOW | requirements.txt | 1 | # ============================================ | COMMENT |
| LOW | pyproject.toml | 41 | # default chat/tool surface includes configurable MCP servers, so a plain | COMMENT |
| LOW | pyproject.toml | 141 | ] | COMMENT |
| LOW | pyproject.toml | 201 | "aiohttp>=3.10.0,<4.0.0", | COMMENT |
| LOW | pyproject.toml | 241 | COMMENT | |
| LOW | pyproject.toml | 461 | # ============================================ | COMMENT |
| LOW | pyproject.toml | 521 | [[tool.mypy.overrides]] | COMMENT |
| LOW | compose.yaml | 1 | # ============================================ | COMMENT |
| LOW | compose.yaml | 21 | # picks this file up without -f. | COMMENT |
| LOW | compose.yaml | 41 | # the `sandbox_allow_subprocess` setting in system.json. See | COMMENT |
| LOW | compose.yaml | 161 | ports: | COMMENT |
| LOW | compose.yaml | 201 | redis: | COMMENT |
| LOW | docker-compose.yml | 1 | # ============================================ | COMMENT |
| LOW | docker-compose.yml | 101 | # Route untrusted shell exec to the runner sidecar (SYSTEM isolation). | COMMENT |
| LOW | docker-compose.yml | 141 | networks: | COMMENT |
| LOW | docker-compose.yml | 161 | COMMENT | |
| LOW | web/next.config.js | 161 | COMMENT | |
| LOW | web/next-env.d.ts | 1 | /// <reference types="next" /> | COMMENT |
| LOW | web/features/chat/ChatStateAdapter.tsx | 2061 | // Pick up a title written after this point — see | COMMENT |
| LOW | web/features/chat/ChatStateAdapter.tsx | 2541 | // Reached on a revalidate too, when the turn is live on the server but | COMMENT |
| LOW | web/features/chat/messages/ChatMessageList.tsx | 921 | // layers: the process stays open and streams live, then folds itself into | COMMENT |
| LOW | web/features/chat/messages/ChatMessageList.tsx | 941 | // the reader actually came for, never moves at all. | COMMENT |
| LOW | web/features/chat/messages/ChatMessageList.tsx | 2001 | // Visible path: when no branching has happened the result is identical | COMMENT |
| LOW | web/features/chat/messages/ChatMessageList.tsx | 2021 | // deep_research msg, we synthesise a merged msg with: | COMMENT |
| LOW | web/features/chat/trace/TracePresentation.tsx | 1021 | const isToolRow = kind === "tool_planning" || group === "tool_call"; | COMMENT |
| LOW | web/features/chat/components/ChatWorkspace.tsx | 481 | // Capability-config confirmation gate. | COMMENT |
| LOW | web/features/chat/components/ChatWorkspace.tsx | 601 | // Bridge ref: ``ChatComposer`` writes a prefill function into this on | COMMENT |
| LOW | web/components/reading/TextUnitView.tsx | 541 | // everything around it, so the chosen line width was invisible and | COMMENT |
| LOW | web/components/reading/ReaderPane.tsx | 541 | // -- resume where the reader left off ------------------------------------ | COMMENT |
| LOW | web/components/reading/workspace/ReadingCompanion.tsx | 401 | // Opts this scrollport into the global `overflow-anchor: none` rule; | COMMENT |
| LOW | web/components/reading/workspace/useReadingWorkspace.ts | 181 | // answer for whatever partial row the backend has written so far. | COMMENT |
| LOW | web/components/reading/workspace/useReadingWorkspace.ts | 421 | sessionConfiguration, | COMMENT |
| LOW | web/components/sidebar/WorkspaceSidebar.tsx | 141 | // `cancel_turn` to the backend and dropping its socket — so opening a new | COMMENT |
| LOW | web/components/settings/search-providers.ts | 1 | // Which connection fields a web-search provider actually uses. | COMMENT |
| LOW | web/components/settings/profile-naming.ts | 1 | // Auto-naming for connection profiles. | COMMENT |
| LOW | web/components/memory/MemoryWorkbench.tsx | 41 | // m_xxx footnote to scroll the user back to the citing bullet. Convert | COMMENT |
| LOW | web/components/chat/home/ChatComposer.tsx | 741 | COMMENT | |
| LOW | web/components/chat/home/AskUserOptions.tsx | 341 | // Where the preview whose call id never arrived lives, if any: a provider | COMMENT |
| LOW | web/components/chat/home/AskUserOptions.tsx | 641 | // remains, because a segment removed afterwards would leave the text it had | COMMENT |
| LOW | web/components/chat/preview/FilePreviewDrawer.tsx | 81 | // the body keeps the main thread free for the slide animations. | COMMENT |
| LOW | web/components/common/MarkdownRenderer.tsx | 41 | trackSourceLines, | COMMENT |
| LOW | web/hooks/useChatAutoScroll.ts | 101 | // ``next/dynamic`` chunks all change the height of the message | COMMENT |
| LOW | web/hooks/useChatAutoScroll.ts | 161 | mo.disconnect(); | COMMENT |
| LOW | web/hooks/useChatAutoScroll.ts | 261 | COMMENT | |
| LOW | web/lib/streaming-upload-proxy.ts | 1 | import { resolveBackendApiBase } from "./backend-runtime-config"; | COMMENT |
| LOW | web/lib/reasoning-effort.ts | 181 | return options(["minimal", "high"], current); | COMMENT |
| LOW | tests/api/test_question_router.py | 161 | # DT-22 HIGH-chain regression pins (evidence: agent/dt22-todo-scan report §7). | COMMENT |
| LOW | tests/services/storage/test_file_library.py | 281 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | requirements/partners.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/cli.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/matrix.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/math-animator.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/server.txt | 1 | # ============================================ | COMMENT |
| LOW | requirements/matrix-e2e.txt | 1 | # ============================================ | COMMENT |
| LOW | .github/workflows/pypi-release.yml | 1 | name: PyPI Release | COMMENT |
| LOW | deeptutor/capabilities/mastery/loop.py | 61 | # …and the same announcement with the noun left out: "再试一道,把这套 | COMMENT |
| LOW | deeptutor/capabilities/mastery/loop.py | 201 | # is bound before any of them runs, so without this a ``mastery_switch`` + | COMMENT |
| 49 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | deeptutor/tools/vision/image_utils.py | 62 | Download image from URL. Args: url: Image URL Returns: (image bytes, MIME type) Raises: | STRING |
| HIGH | deeptutor/tools/vision/image_utils.py | 156 | Convert image URL to base64 data URL. Args: url: Image URL Returns: data:image/...;base64,... | STRING |
| HIGH | deeptutor/tools/vision/image_utils.py | 175 | Resolve image input to base64 format. Prioritizes image_base64, falls back to downloading from image_url. Args | STRING |
| HIGH | deeptutor/utils/document_validator.py | 75 | Validate file upload safety Args: filename: Name of the file file_size: Size o | STRING |
| HIGH | deeptutor/utils/document_validator.py | 179 | Validate that a file exists, is readable, and has valid content. Args: path: Path to the f | STRING |
| HIGH | deeptutor/utils/archive_extractor.py | 74 | Extract ``zip_path`` into ``target_dir``, flattening to safe basenames. Args: zip_path: Path to the ``.zip` | STRING |
| HIGH | deeptutor/knowledge/manager.py | 1959 | Link a local folder to a knowledge base. Args: kb_name: Knowledge base name fo | STRING |
| HIGH | deeptutor/book/blocks/_prompts.py | 30 | Load a YAML prompt bundle for the ``book`` module. Args: name: File stem under ``deeptutor/book/prompts/{la | STRING |
| HIGH | deeptutor/services/llm/registry.py | 36 | Get a registered provider class by name. Args: name: Provider name Returns: Provider clas | STRING |
| HIGH | deeptutor/services/embedding/adapters/base.py | 174 | Generate embeddings for a list of texts. Args: request: EmbeddingRequest with texts and pa | STRING |
| HIGH | deeptutor/services/setup/init.py | 302 | Get both backend and frontend ports from configuration. Args: project_root: Project root directory (if | STRING |
| HIGH | …tutor/services/rag/pipelines/graphrag/compatibility.py | 14 | Probe one configured model by ID while leaving the active catalog unchanged. Args: profile_id: Server-side | STRING |
| HIGH | deeptutor/services/rag/eval/dataset.py | 192 | Read an evaluation set from ``path``. Args: path: A ``.jsonl``, ``.ndjson`` or ``.json`` file. name | STRING |
| HIGH | deeptutor/services/search/providers/__init__.py | 61 | Get a provider instance by name. Args: name: Provider name (case-insensitive). **kwargs: Argum | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | web/package-lock.json | 11859 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | web/features/settings/navigation/settings-nav.ts | 430 | href: "/settings#agent-deepseek-harness", | CODE |
| MEDIUM | web/tests/subagent-harnesses.test.ts | 88 | assert.match(nav, new RegExp(`/settings#agent-${harness.route}`)); | CODE |
| MEDIUM | web/components/common/GeogebraOpenCTA.tsx | 37 | // robust even if the assistant doesn't bother emitting an explicit | COMMENT |
| MEDIUM | tests/capabilities/test_explore_context_capability.py | 293 | """A loop that errors before producing anything degrades to the robust | STRING |
| MEDIUM | tests/utils/test_json_parser.py | 1 | """Tests for robust JSON parsing utilities.""" | STRING |
| MEDIUM | tests/services/cli_apps/test_installer.py | 40 | target: str = "git+https://example.invalid/x.git@abc#subdirectory=demo/agent-harness", | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 36 | f"pip install git+{HARNESS_REPO}#subdirectory=blender/agent-harness", app_id="blender" | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 41 | assert plan.target == f"git+{HARNESS_REPO}@{PIN}#subdirectory=blender/agent-harness" | CODE |
| MEDIUM⚡ | tests/services/cli_apps/test_models.py | 47 | assert plan.target.endswith("#subdirectory=zotero/agent-harness") | CODE |
| MEDIUM | deeptutor/capabilities/explore_context/explorer.py | 166 | # Non-native providers, or a failed/empty loop, degrade to the robust | COMMENT |
| MEDIUM | deeptutor/agents/research/pipeline.py | 1683 | """Make report planning robust to partial / invalid block maps. | STRING |
| MEDIUM | deeptutor/partners/channels/dingtalk.py | 54 | # Parse using SDK's ChatbotMessage for robust handling | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 536 | # If quoted message is media, just pass the text | COMMENT |
| MEDIUM | deeptutor/book/blocks/_llm_writer.py | 147 | """Run a structured JSON LLM call with robust parsing and one safe retry. | STRING |
| LOW | deeptutor/api/main.py | 519 | # Fallback: just create the main directory if it doesn't exist | COMMENT |
| MEDIUM | deeptutor/services/cli_apps/models.py | 142 | #: harness, a URL for several public entries, or "" — read from the | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 44 | #: Where an installed harness keeps its agent-facing guide, most specific first. | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 47 | #: harness publishes ``cli_anything/<package>/skills/SKILL.md``, which is six | COMMENT |
| MEDIUM⚡ | deeptutor/services/cli_apps/provider.py | 55 | #: exactly one harness, so the glob resolves to one directory. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …s/settings/sections/DocumentParsingSettingsSection.tsx | 960 | typeof slice.image_mode === "string" ? slice.image_mode : "placeholder"; | CODE |
| LOW | …s/settings/sections/DocumentParsingSettingsSection.tsx | 992 | {["placeholder", "off", "embed"].map((m) => ( | CODE |
| LOW | tests/tools/test_ask_user.py | 199 | payload, _ = build_ask_user_payload(questions=[{"prompt": "x", "placeholder": "type here"}]) | CODE |
| LOW | tests/tools/test_ask_user.py | 425 | "placeholder": None, | CODE |
| LOW | tests/tools/test_ask_user.py | 434 | "placeholder": None, | CODE |
| LOW⚡ | tests/multi_user/test_task_board.py | 69 | save_user("admin", "placeholder", role="admin") | CODE |
| LOW⚡ | tests/multi_user/test_task_board.py | 70 | learner = save_user("alice", "placeholder", preset="learner") | CODE |
| LOW | tests/knowledge/test_document_adder_provider.py | 29 | (output_dir / "entities.parquet").write_bytes(b"placeholder") | CODE |
| LOW | tests/api/test_output_files.py | 219 | link = _write_output(users_root / "u_alice", relative_path, b"placeholder") | CODE |
| LOW | tests/api/test_knowledge_router.py | 2794 | b"placeholder", | CODE |
| LOW⚡ | tests/api/test_marginnote4_router.py | 63 | "Authorization": "MarginNote fake-device:fake-token", | CODE |
| LOW⚡ | tests/api/test_marginnote4_router.py | 76 | "Authorization": "MarginNote fake-device:fake-token", | CODE |
| LOW | tests/services/llm/test_codebuddy_provider.py | 438 | raise RuntimeError("Authorization: Bearer fake-token; prompt=private-user-body") | CODE |
| LOW | tests/services/llm/test_codebuddy_provider.py | 487 | assert "fake-token" not in caplog.text | CODE |
| LOW⚡ | tests/services/llm/test_codebuddy_provider.py | 568 | raise RuntimeError("Authorization: Bearer fake-token; prompt=private-user-body") | CODE |
| LOW⚡ | tests/services/llm/test_codebuddy_provider.py | 574 | assert "fake-token" not in caplog.text | CODE |
| LOW | tests/services/config/test_runtime_settings.py | 145 | "pocketbase_admin_email": "admin@example.com", | CODE |
| LOW | tests/services/rag/test_index_probe.py | 127 | (out / "entities.parquet").write_bytes(b"placeholder") | CODE |
| LOW | tests/services/rag/test_file_routing.py | 224 | assert "Jane Doe" in content | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 99 | ch = _make_channel(allow_from=["user@example.com"]) | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 129 | assert ch._is_own_message({"sender_email": "user@example.com", "sender_id": 200}) is False | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 498 | "sender_email": "user@example.com", | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 501 | assert req["to"] == ["user@example.com"] | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 511 | "sender_email": "user@example.com", | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 514 | {"id": 42, "email": "user@example.com"}, | CODE |
| LOW⚡ | tests/services/partners/test_zulip_channel.py | 933 | "sender_email": "user@example.com", | CODE |
| LOW | tests/services/parsing/test_engines.py | 842 | "image_mode": "placeholder", | CODE |
| LOW | tests/services/session/test_turn_runtime_subscribe.py | 116 | runtime._executions["placeholder"] = SimpleNamespace(task=None) # type: ignore[assignment] | CODE |
| LOW | deeptutor_cli/common.py | 589 | placeholder=str(question.get("placeholder") or "").strip(), | CODE |
| LOW | deeptutor/tools/ask_user.py | 76 | "placeholder": self.placeholder, | CODE |
| LOW | deeptutor/tools/ask_user.py | 314 | placeholder_raw = raw.get("placeholder") | CODE |
| LOW | deeptutor/tools/builtin/__init__.py | 1662 | "placeholder": { | CODE |
| LOW | deeptutor/api/routers/space_mcp.py | 381 | "placeholder": field.placeholder, | CODE |
| LOW⚡ | deeptutor/services/config/runtime_settings.py | 1223 | image_mode = _string(settings.get("image_mode")).lower() or "placeholder" | CODE |
| LOW⚡ | deeptutor/services/config/runtime_settings.py | 1225 | image_mode = "placeholder" | CODE |
| LOW | deeptutor/services/config/runtime_settings.py | 159 | LITEPARSE_IMAGE_MODES = frozenset({"off", "placeholder", "embed"}) | CODE |
| LOW | deeptutor/services/config/runtime_settings.py | 228 | "image_mode": "placeholder", | CODE |
| LOW | deeptutor/services/mcp/catalog/loader.py | 228 | placeholder=str(row.get("placeholder", "")), | CODE |
| LOW | deeptutor/services/parsing/engines/liteparse/config.py | 23 | # How images appear in the Markdown: "off" | "placeholder" | "embed". | COMMENT |
| LOW | deeptutor/services/parsing/engines/liteparse/config.py | 24 | image_mode: str = "placeholder" | CODE |
| LOW | deeptutor/services/parsing/engines/liteparse/config.py | 35 | return mode if mode in LITEPARSE_IMAGE_MODES else "placeholder" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/services/search/test_web_search_runtime.py | 31 | CODE | |
| LOW | …sts/services/partners/test_telegram_message_parsing.py | 91 | CODE | |
| LOW | deeptutor_cli/chat.py | 45 | CODE | |
| LOW | deeptutor_cli/main.py | 83 | CODE | |
| LOW | deeptutor_cli/kb.py | 420 | CODE | |
| LOW | deeptutor/reading/store.py | 605 | CODE | |
| LOW | deeptutor/reading/ingestion.py | 152 | CODE | |
| LOW | deeptutor/reading/catalog_store.py | 260 | CODE | |
| LOW | deeptutor/tools/question_bank.py | 470 | CODE | |
| LOW | deeptutor/tools/write_note.py | 61 | CODE | |
| LOW | deeptutor/core/trace.py | 55 | CODE | |
| LOW | deeptutor/capabilities/mastery/tools.py | 344 | CODE | |
| LOW | deeptutor/capabilities/course_study/tools.py | 315 | CODE | |
| LOW | deeptutor/learning/service.py | 1037 | CODE | |
| LOW | deeptutor/runtime/agentic/tool_dispatch.py | 122 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 52 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 349 | CODE | |
| LOW | deeptutor/agents/base_agent.py | 519 | CODE | |
| LOW | deeptutor/agents/question/coordinator.py | 39 | CODE | |
| LOW | deeptutor/agents/loop/pipeline.py | 230 | CODE | |
| LOW | deeptutor/knowledge/progress_tracker.py | 176 | CODE | |
| LOW | deeptutor/book/engine.py | 467 | CODE | |
| LOW | deeptutor/book/inputs.py | 312 | CODE | |
| LOW | deeptutor/api/routers/knowledge.py | 3508 | CODE | |
| LOW | deeptutor/api/routers/knowledge.py | 3586 | CODE | |
| LOW | deeptutor/api/routers/question_notebook.py | 352 | CODE | |
| LOW | deeptutor/services/llm/factory.py | 411 | CODE | |
| LOW | deeptutor/services/llm/factory.py | 519 | CODE | |
| LOW | …r/services/llm/provider_core/openai_compat_provider.py | 171 | CODE | |
| LOW | …r/services/llm/provider_core/openai_compat_provider.py | 1083 | CODE | |
| LOW | …/services/llm/provider_core/github_copilot_provider.py | 218 | CODE | |
| LOW | …or/services/llm/provider_core/azure_openai_provider.py | 189 | CODE | |
| LOW | …or/services/llm/provider_core/openai_codex_provider.py | 151 | CODE | |
| LOW | …tutor/services/llm/provider_core/anthropic_provider.py | 540 | CODE | |
| LOW | …tutor/services/llm/provider_core/codebuddy_provider.py | 193 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 256 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 439 | CODE | |
| LOW | deeptutor/services/llm/provider_core/base.py | 488 | CODE | |
| LOW | …/services/llm/provider_core/codebuddy_http_provider.py | 179 | CODE | |
| LOW | deeptutor/services/rag/linked_kb.py | 68 | CODE | |
| LOW | deeptutor/services/rag/eval/runner.py | 255 | CODE | |
| LOW | deeptutor/services/search/source_filter.py | 347 | CODE | |
| LOW | deeptutor/services/search/providers/tavily.py | 34 | CODE | |
| LOW | deeptutor/services/search/providers/serper.py | 40 | CODE | |
| LOW | deeptutor/services/search/providers/perplexity.py | 157 | CODE | |
| LOW | deeptutor/services/voice/base.py | 216 | CODE | |
| LOW | deeptutor/services/session/sqlite_store.py | 4067 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | deeptutor/services/session/turns/request_preparer.py | 0 | generated behavior slice of the unified turn runtime. | STRING |
| HIGH | deeptutor/services/session/turns/learning_adapter.py | 0 | generated behavior slice of the unified turn runtime. | STRING |
| HIGH | deeptutor/services/session/turns/lifecycle.py | 0 | generated behavior slice of the unified turn runtime. | STRING |
| HIGH | deeptutor/services/session/turns/title_service.py | 0 | generated behavior slice of the unified turn runtime. | STRING |
| HIGH | deeptutor/services/session/turns/executor.py | 0 | generated behavior slice of the unified turn runtime. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | compose.yaml | 10 | # This file is `podman-compose` 1.5+ compatible. | COMMENT |
| MEDIUM⚡ | docker-compose.yml | 4 | # This file provides orchestration for DeepTutor services | COMMENT |
| MEDIUM⚡ | tests/services/session/test_regenerate.py | 583 | # Create a running turn directly via the store. | COMMENT |
| MEDIUM | deeptutor/tools/vision/block_parser.py | 95 | # Create the block with validated content | COMMENT |
| MEDIUM | deeptutor/api/routers/mastery_path.py | 53 | # Create a fresh store + service per request to avoid object-level race conditions. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/tools/tex_chunker.py | 141 | # Check if can merge into current chunk | STRING |
| LOW | deeptutor/tools/tex_chunker.py | 244 | # Check if can merge | STRING |
| LOW | deeptutor/tools/vision/ggb_validator.py | 335 | # Check if anything was fixed | COMMENT |
| LOW | deeptutor/tools/vision/block_parser.py | 156 | # Check if we might be at the start of a block pattern | COMMENT |
| LOW | deeptutor/tools/vision/block_parser.py | 159 | # Check if this could be a block start | COMMENT |
| LOW | deeptutor/agents/base_agent.py | 731 | # Check if this is a nested lookup (section.field pattern) | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 723 | # Check if this is a valid KB directory (flat versions or legacy stores) | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 2006 | # Check if already linked | COMMENT |
| LOW | deeptutor/knowledge/manager.py | 2151 | # Check if modified since last sync | COMMENT |
| LOW | deeptutor/partners/channels/discord.py | 477 | # Check if bot was mentioned in the message | COMMENT |
| LOW | deeptutor/services/llm/capabilities.py | 11 | # Check if a provider supports response_format | STRING |
| LOW | deeptutor/services/sandbox/runner/server.py | 144 | # Open file descriptors. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | web/app/(workspace)/co-writer/sampleTemplate.ts | 66 | print("DeepTutor is ready.") | CODE |
| HIGH | …atures/settings/sections/AppearanceSettingsSection.tsx | 31 | print(summary) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | docker-compose.ghcr.yml | 7 | # Usage: | COMMENT |
| LOW | .pre-commit-config.yaml | 8 | # Usage: | COMMENT |
| LOW⚡ | docker-compose.yml | 6 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/partners/channels/weixin.py | 1230 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1254 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1282 | # Step 3: Send message with the media item | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | deeptutor/partners/channels/weixin.py | 1230 | # Step 1: Get upload URL from server (prefer upload_full_url, fallback to upload_param) | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1254 | # Step 2: AES-128-ECB encrypt and POST to CDN | COMMENT |
| LOW | deeptutor/partners/channels/weixin.py | 1282 | # Step 3: Send message with the media item | COMMENT |