LLM Wiki is a cross-platform desktop application that turns your documents into an organized, interlinked knowledge base — automatically. Instead of traditional RAG (retrieve-and-answer from scratch every time), the LLM incrementally builds and maintains a persistent wiki from your sources。
This report summarizes scanner evidence for nashsu/llm_wiki, a TypeScript project with 20,441 GitHub stars. SynthScan examined 155,429 lines of code across 444 source files, recording 455 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 5.2 (Moderate 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? 268 finding(s).
Are imports declared and package/API names verified? 19 finding(s).
Are wrappers, guards, and repeated structures necessary? 364 finding(s).
Which changes need focused human review? 455 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 455 distinct pattern matches across 11 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 |
|---|---|---|---|---|
| MEDIUM | scripts/debug_ollama_tokens.py | 35 | # 1687-1693). maxContextSize is in CHARACTERS. ──────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 179 | // ── PDF (pdfium) ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 456 | // ── PPTX / DOCX (zip) ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 572 | // ── Helpers ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 681 | // ── Extract-and-save: write to disk, skip the base64 round-trip ──────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 993 | // ── Tauri command bindings ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/extract_images.rs | 1067 | // ── Tests ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/vectorstore.rs | 348 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/vectorstore.rs | 376 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/vectorstore.rs | 917 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/vectorstore.rs | 925 | // ────────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src-tauri/src/commands/fs.rs | 2567 | // ── collect_related_pages: regression coverage for the three match ───── | COMMENT |
| MEDIUM | src-tauri/src/commands/fs.rs | 2763 | // ── copy_directory: folder import recursion + filtering ────────── | COMMENT |
| MEDIUM | src/lib/lint.ts | 29 | // ── helpers ─────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/lint.ts | 108 | // ── Structural lint ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/lint.ts | 200 | // ── Semantic lint ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/enrich-wikilinks.real-llm.test.ts | 145 | // ── Scenario-specific strict assertions ──────────────────────── | COMMENT |
| MEDIUM | src/lib/sweep-reviews.scenarios.test.ts | 50 | // ── Setup ──────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/sweep-reviews.scenarios.test.ts | 69 | // ── Scenario runner ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/sweep-reviews.scenarios.test.ts | 177 | // ── Test cases ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 37 | // ── Happy paths ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 128 | // ── H1: CRLF normalization ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 163 | // ── H2: Stream truncation ────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 223 | // ── H3: Marker whitespace / case variants ────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 276 | // ── H5: Literal markers inside fenced code blocks ────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 368 | // ── H6: Empty path ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-parse.test.ts | 383 | // ── Path traversal guard (security) ───────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/lib/greeting-detector.ts | 21 | // ── English ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/lib/greeting-detector.ts | 27 | // ── Chinese (简体 + 繁體) ────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/lib/greeting-detector.ts | 35 | // ── Japanese ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/lib/greeting-detector.ts | 38 | // ── Korean ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | src/lib/greeting-detector.ts | 41 | // ── European casual openers ───────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 16 | // ── Tiny helpers ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 24 | // ── stripFrontmatter ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 56 | // ── Empty / trivial inputs ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 80 | // ── Heading breadcrumb tracking ──────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 142 | // ── Code block preservation ──────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 189 | // ── Table preservation ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 227 | // ── Recursive split levels ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 270 | // ── Overlap semantics ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 318 | // ── Small-chunk merging ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 346 | // ── Section-aware chunking (headings cut chunks) ─────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 368 | // ── Character offsets ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 391 | // ── Indices and determinism ──────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 420 | // ── End-to-end: realistic wiki page ──────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 518 | // ── CRLF content body (Windows line endings) ─────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 539 | // ── Nested fences (4-tick wrapping 3-tick) ───────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 570 | // ── Tables without a separator row ───────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.test.ts | 595 | // ── Contract checks on the output shape ──────────────────────────── | COMMENT |
| MEDIUM | src/lib/ingest-queue.test.ts | 1348 | // ── cleanupWrittenFiles — centralized page cascade ───────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 91 | // ── Public API ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 129 | // ── Frontmatter handling ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 151 | // ── Section segmentation ───────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 245 | // ── Section → chunks ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 285 | // ── Atom tokenization (splittable vs indivisible) ──────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 376 | // ── Splittable atom → pieces ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 497 | // ── Piece sizing: pack pieces into chunks ≤ maxChars ───────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 538 | // ── Small-chunk merge pass ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/text-chunker.ts | 563 | // ── Overlap injection ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/lib/wiki-page-delete.test.ts | 132 | // ── Media cascade: source-summary deletion drops images too ────── | COMMENT |
| 107 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/debug_ollama_tokens.py | 36 | def app_generation_max_tokens(max_context_chars: int) -> int: | CODE |
| LOW | src/App.tsx | 98 | async function hydrateScheduledImportAfterOpen(proj: WikiProject): Promise<void> { | CODE |
| LOW | src/stores/wiki-store.ts | 250 | export function createDefaultGraphUiState(): GraphUiState { | CODE |
| LOW | src/components/lint/lint-view.tsx | 39 | export function groupLintResultsForDisplay(results: readonly LintItem[]): { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 114 | async function readAgentActivitySnapshot(path: string): Promise<string | null> { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 275 | function backendReferenceToMessageReference(ref: BackendAgentReference): MessageReference { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 418 | function summarizeAgentStepsForResume(steps: ChatAgentStep[] = []): string { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 430 | function compactChatHistoryForResume( | CODE |
| LOW | src/components/chat/chat-panel.tsx | 1637 | function GeneratedOutputPreviewDialog({ | CODE |
| LOW | src/components/chat/chat-panel.tsx | 1680 | function ChatReferencePreviewPanel({ | CODE |
| LOW | src/components/chat/chat-panel.tsx | 1964 | function ChatReferencePreviewContent({ preview }: { preview: ChatReferencePreview }) { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 1978 | function clampReferencePreviewWidth(width: number): number { | CODE |
| LOW | src/components/chat/chat-panel.tsx | 1982 | function ChatMarkdownReferencePreview({ preview }: { preview: ChatReferencePreview }) { | CODE |
| LOW | src/components/chat/chat-message.tsx | 302 | function extractShellApprovalCommand(steps: ChatAgentStep[]): string | null { | CODE |
| LOW | src/components/layout/icon-sidebar.tsx | 68 | function handleResearchPanelToggle() { | CODE |
| LOW | src/components/layout/research-panel-nav.ts | 14 | export function nextResearchPanelNavState( | CODE |
| LOW | src/components/graph/graph-view.tsx | 141 | function createGraphNodeHoverRenderer(palette: GraphThemePalette): NodeHoverDrawingFunction { | CODE |
| LOW | src/components/project/create-project-dialog.tsx | 33 | export function getCreateProjectFormStatus( | CODE |
| LOW | src/components/sources/sources-view.tsx | 282 | async function handleOpenSourceExternally(node: FileNode) { | CODE |
| LOW | src/lib/web-search.ts | 110 | export function hasConfiguredSearchProvider(config: SearchApiConfig): boolean { | CODE |
| LOW | src/lib/web-search.ts | 119 | export function hasConfiguredDeepResearchSources(config: SearchApiConfig): boolean { | CODE |
| LOW | src/lib/ingest-cache.ts | 42 | export async function listIngestedSourceIdentities(projectPath: string): Promise<string[]> { | CODE |
| LOW | src/lib/graph-visibility.ts | 8 | export function shouldHideEdgeByNodeTypes( | CODE |
| LOW | src/lib/claude-cli-transport.ts | 31 | export function createClaudeCodeStreamParser() { | CODE |
| LOW | src/lib/claude-cli-transport.ts | 102 | export function extractClaudeCodeStructuredError(rawLine: string): string | null { | CODE |
| LOW | src/lib/claude-cli-transport.ts | 133 | export function shouldCaptureClaudeDiagnostic(rawLine: string): boolean { | CODE |
| LOW | src/lib/claude-cli-transport.ts | 148 | export function createBoundedDiagnosticBuffer(capacity = 4096) { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 58 | export function sanitizeIngestedFileContent(content: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 95 | export function normalizeMalformedWikilinks(content: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 142 | function normalizeMalformedLinksOutsideInlineCode(text: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 164 | function normalizeMalformedLinkSegment(segment: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 217 | function stripFrontmatterKeyPrefix(content: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 223 | function addMissingOpeningFrontmatterFence(content: string): string { | CODE |
| LOW | src/lib/ingest-sanitize.ts | 252 | function repairWikilinkListsInFrontmatter(content: string): string { | CODE |
| LOW | src/lib/detect-language.ts | 53 | function detectArabicScriptLanguage(text: string): "Arabic" | "Persian" { | CODE |
| LOW | src/lib/selection-edit.ts | 6 | export function normalizeSelectionReplacement(content: string): string { | CODE |
| LOW | src/lib/selection-edit.ts | 17 | export function normalizeEditableMarkdown(content: string): string { | CODE |
| LOW | src/lib/file-types.ts | 182 | export function isExtractedTextPreviewFile(filePath: string): boolean { | CODE |
| LOW | src/lib/embedding.test.ts | 101 | async function fetchEmbeddingViaMockHttp( | CODE |
| LOW | src/lib/embedding.test.ts | 189 | function isGoogleEmbeddingConfigForTest(config: { endpoint: string }): boolean { | CODE |
| LOW⚡ | src/lib/embedding.test.ts | 208 | function isVolcengineEndpointForTest(endpoint: string): boolean { | CODE |
| LOW⚡ | src/lib/embedding.test.ts | 217 | function volcengineEndpointForTest(config: { endpoint: string; model: string }): string { | CODE |
| LOW⚡ | src/lib/embedding.test.ts | 223 | function appendEndpointPathForTest(endpoint: string, suffix: string): string { | CODE |
| LOW | src/lib/graph-insights.ts | 23 | export function researchSeedForKnowledgeGap( | CODE |
| LOW | src/lib/graph-insights.ts | 52 | export function findSurprisingConnections( | CODE |
| LOW | src/lib/review-create-page.ts | 35 | function extractMissingPageCandidates(text: string): string[] { | CODE |
| LOW | src/lib/review-create-page.ts | 100 | export async function availableReviewPageFileName( | CODE |
| LOW | src/lib/project-file-sync.ts | 203 | function scheduleRefreshAfterFileChanges(tasks: FileChangeTask[]): void { | CODE |
| LOW | src/lib/project-file-sync.ts | 269 | async function migrateUnchangedSourceMoves( | CODE |
| LOW | src/lib/project-file-sync.ts | 426 | function isRawSourcePathForCascade(relativePath: string): boolean { | CODE |
| LOW | src/lib/reasoning-detector.ts | 42 | export function countReasoningCharsInLine(rawLine: string): number { | CODE |
| LOW | src/lib/reasoning-detector.ts | 50 | export function extractReasoningTextFromLine(rawLine: string): string[] { | CODE |
| LOW | src/lib/mineru.ts | 214 | function mineruExtensionForMimeType(mimeType: string): string | null { | CODE |
| LOW | src/lib/mineru.ts | 326 | function convertHtmlTablesInSegment(segment: string): string { | CODE |
| LOW | src/lib/mineru.ts | 358 | function convertHtmlTablesToMarkdown(markdown: string): string { | CODE |
| LOW | src/lib/mineru.ts | 380 | function rewriteMineruMarkdownImages(markdown: string, pathMap: Map<string, string>): string { | CODE |
| LOW | src/lib/mineru.ts | 622 | async function downloadAndExtractMarkdown( | CODE |
| LOW | src/lib/mineru.ts | 683 | function localMineruBackendForVersion( | CODE |
| LOW | src/lib/page-merge.ts | 245 | function removeIntroducedReservedExampleUrls( | CODE |
| LOW | src/lib/page-merge.ts | 356 | export function stripBodyWikilinkPathPrefixes(content: string): string { | CODE |
| 136 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .github/workflows/build.yml | 61 | if: startsWith(matrix.platform, 'ubuntu-22.04') | COMMENT |
| LOW | src-tauri/Cargo.toml | 41 | office_oxide = "=0.1.2" | COMMENT |
| LOW | src-tauri/src/proxy.rs | 1 | //! Global outbound HTTP proxy plumbing. | COMMENT |
| LOW | src-tauri/src/proxy.rs | 61 | /// Read `proxyConfig` out of the project's `app-state.json`. Returns | COMMENT |
| LOW | src-tauri/src/proxy.rs | 81 | /// instant. Two callers exist: (1) the Tauri setup hook, which | COMMENT |
| LOW | src-tauri/src/lib.rs | 561 | None::<Vec<&str>>, | COMMENT |
| LOW | src-tauri/src/agent/runtime.rs | 81 | // only when the user explicitly asks to update/overwrite an existing page; | COMMENT |
| LOW | src-tauri/src/agent/types.rs | 101 | pub tools: AgentToolOptions, | COMMENT |
| LOW | src-tauri/src/agent/types.rs | 121 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/agent/provider.rs | 41 | #[serde(default)] | COMMENT |
| LOW | src-tauri/src/commands/extract_images.rs | 1 | //! Image extraction from PDF / PPTX / DOCX (Phase 1 of the multimodal | COMMENT |
| LOW | src-tauri/src/commands/extract_images.rs | 41 | /// (each image base64'd is ~MB-scale) AND blow up downstream VLM | COMMENT |
| LOW | src-tauri/src/commands/extract_images.rs | 81 | pub index: u32, | COMMENT |
| LOW | src-tauri/src/commands/extract_images.rs | 181 | /// Combined PDF text + image extraction in a single pdfium session. | COMMENT |
| LOW | src-tauri/src/commands/extract_images.rs | 681 | // ── Extract-and-save: write to disk, skip the base64 round-trip ──────── | COMMENT |
| LOW | src-tauri/src/commands/vectorstore.rs | 341 | .map_err(|e| format!("Count error: {e}"))?; | COMMENT |
| LOW | src-tauri/src/commands/vectorstore.rs | 361 | // chunk_text Utf8 raw chunk content (for UI re-ranking + showing | COMMENT |
| LOW | src-tauri/src/commands/vectorstore.rs | 921 | // of the v2 chunk store against a throwaway LanceDB instance per test. | COMMENT |
| LOW | src-tauri/src/commands/claude_cli.rs | 1 | //! Claude Code CLI subprocess transport. | COMMENT |
| LOW | src-tauri/src/commands/cli_resolver.rs | 41 | #[cfg(not(windows))] | COMMENT |
| LOW | src-tauri/src/commands/fs_anydoc_benchmark.rs | 1 | //! Local-only comparison harness for AnyDoc and the compatibility parsers. | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 361 | } | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 381 | /// | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 401 | /// resource-dir logic. | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 421 | if let Ok(p) = std::env::var("PDFIUM_DYNAMIC_LIB_PATH") { | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 1861 | COMMENT | |
| LOW | src-tauri/src/commands/fs.rs | 1941 | require_absolute_path("create_directory", &path)?; | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 2361 | } | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 2561 | err, | COMMENT |
| LOW | src-tauri/src/commands/fs.rs | 2761 | } | COMMENT |
| LOW | src/components/layout/update-banner.tsx | 61 | dismissedVersion: result.remote, | COMMENT |
| LOW | src/components/search/search-view.tsx | 61 | }, | COMMENT |
| LOW | src/lib/ingest-sanitize.ts | 61 | // (1) Strip a code fence wrapping the whole document or just its | COMMENT |
| LOW | src/lib/markdown-image-resolver.ts | 121 | COMMENT | |
| LOW | src/lib/markdown-image-resolver.ts | 141 | // embedded images as `media/<source-slug>/img-N.png` — a path | COMMENT |
| LOW | src/lib/wiki-page-delete.test.ts | 121 | COMMENT | |
| LOW | src/lib/llm-providers.ts | 681 | return ( | COMMENT |
| LOW | src/lib/wiki-page-delete.ts | 81 | // embedding cascade) so a failure in either of those — already | COMMENT |
| LOW | src/lib/frontmatter.ts | 21 | // step before falling back to the locator below. | COMMENT |
| LOW | src/lib/embedding.real-llm.test.ts | 221 | "fetchEmbedding returned null on oversize input but error isn't the oversize-specific message — looksLikeOversiz | COMMENT |
| LOW | src/lib/embedding.real-llm.test.ts | 381 | } | COMMENT |
| LOW | src/lib/ingest.ts | 841 | // safety-net section uses the cache to populate alt text. | COMMENT |
| LOW | src/lib/ingest.ts | 921 | // `wiki/media/<source-slug>/`. We DON'T inject the markdown | COMMENT |
| LOW | src/lib/ingest.ts | 961 | // Why this matters: an empty-alt image gets paraphrased away by | COMMENT |
| LOW | src/lib/ingest.ts | 981 | // `## Embedded Images` section to wiki/sources/<slug>.md | COMMENT |
| LOW | src/lib/ingest.ts | 2161 | // comparisons / sources summaries): if a page with this | COMMENT |
| LOW | src/lib/ingest.ts | 3761 | // Image cascade: surface any embedded images on the source-summary | COMMENT |
| LOW | src/lib/__tests__/llm-providers.test.ts | 521 | expect(body.max_tokens).toBe(8192) | COMMENT |
| LOW | src/lib/__tests__/llm-providers.test.ts | 541 | // TCP connection rather than 403, which surfaces as a generic | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src-tauri/src/agent/runtime.rs | 3232 | .get("placeholder") | CODE |
| LOW | src-tauri/src/agent/runtime.rs | 5020 | {"type":"text","id":"watermark","label":"Watermark","placeholder":"Optional"}, | CODE |
| LOW | src/i18n/zh.json | 65 | "placeholder": "解释、改写、缩短……", | CODE |
| LOW | src/i18n/zh.json | 181 | "placeholder": "https://example.com/article-one\nhttps://example.com/article-two", | CODE |
| LOW | src/i18n/zh.json | 261 | "placeholder": "向你的 Wiki 提问...", | CODE |
| LOW | src/i18n/zh.json | 375 | "placeholder": "搜索 Wiki 页面...", | CODE |
| LOW | src/i18n/ru.json | 65 | "placeholder": "Объяснить, переписать, сократить...", | CODE |
| LOW | src/i18n/ru.json | 181 | "placeholder": "https://example.com/article-one\nhttps://example.com/article-two", | CODE |
| LOW | src/i18n/ru.json | 261 | "placeholder": "Спросите о своей вики...", | CODE |
| LOW | src/i18n/ru.json | 375 | "placeholder": "Поиск по страницам вики...", | CODE |
| LOW | src/i18n/en.json | 65 | "placeholder": "Explain, rewrite, shorten...", | CODE |
| LOW | src/i18n/en.json | 181 | "placeholder": "https://example.com/article-one\nhttps://example.com/article-two", | CODE |
| LOW | src/i18n/en.json | 261 | "placeholder": "Ask about your wiki...", | CODE |
| LOW | src/i18n/en.json | 375 | "placeholder": "Search wiki pages...", | CODE |
| LOW | src/i18n/it.json | 65 | "placeholder": "Spiega, riscrivi, accorcia...", | CODE |
| LOW | src/i18n/it.json | 181 | "placeholder": "https://example.com/article-one\nhttps://example.com/article-two", | CODE |
| LOW | src/i18n/it.json | 261 | "placeholder": "Fai una domanda sul tuo wiki...", | CODE |
| LOW | src/i18n/it.json | 375 | "placeholder": "Cerca nelle pagine wiki...", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/components/sources/sources-view.tsx | 304 | // Step 8: Refresh everything (UI side — must run with parent | COMMENT |
| LOW⚡ | src/lib/sources-merge.test.ts | 355 | // Step 2: ingest test2.md, which also covers attention. LLM emits | COMMENT |
| LOW⚡ | src/lib/sources-merge.test.ts | 364 | // Step 3: user later deletes test2.md. sources-view's deletion | COMMENT |
| LOW | src/lib/mineru.ts | 457 | // Step 1: Get upload URL | COMMENT |
| LOW | src/lib/mineru.ts | 477 | // Step 2: Upload file binary (convert base64 back to binary) | COMMENT |
| LOW | src/lib/deep-research.ts | 535 | // Step 1: gather research sources — use multiple queries if available, | COMMENT |
| LOW | src/lib/deep-research.ts | 569 | // Step 2: LLM synthesis | COMMENT |
| LOW | src/lib/deep-research.ts | 638 | // Step 3: Validate before writing. A successful stream can still contain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/components/sources/sources-view.tsx | 304 | // Step 8: Refresh everything (UI side — must run with parent | COMMENT |
| LOW⚡ | src/lib/sources-merge.test.ts | 355 | // Step 2: ingest test2.md, which also covers attention. LLM emits | COMMENT |
| LOW⚡ | src/lib/sources-merge.test.ts | 364 | // Step 3: user later deletes test2.md. sources-view's deletion | COMMENT |
| LOW | src/lib/mineru.ts | 457 | // Step 1: Get upload URL | COMMENT |
| LOW | src/lib/mineru.ts | 477 | // Step 2: Upload file binary (convert base64 back to binary) | COMMENT |
| LOW | src/lib/deep-research.ts | 535 | // Step 1: gather research sources — use multiple queries if available, | COMMENT |
| LOW | src/lib/deep-research.ts | 569 | // Step 2: LLM synthesis | COMMENT |
| LOW | src/lib/deep-research.ts | 638 | // Step 3: Validate before writing. A successful stream can still contain | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | plans/multimodal-images.md | 240 | ### Phase 4: Settings toggle + cost guardrails | COMMENT |
| MEDIUM | src/components/settings/llm-presets.ts | 273 | // NVIDIA's own reasoning / agentic models | COMMENT |
| MEDIUM | src/components/settings/llm-presets.ts | 281 | // Popular third-party agentic / open-weight | COMMENT |
| MEDIUM | src/lib/lint.test.ts | 260 | makeFileNode("rag.md", "# RAG\nRetrieval augmented generation uses vector search."), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | package-lock.json | 9567 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | src/components/layout/update-banner.tsx | 40 | // robust to (a) a newer release shipping between notification | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | src/lib/dedup.test.ts | 88 | 'Sure, here are the duplicates I found:\n\n{"groups": [{"slugs": ["foo","bar"], "reason": "synonyms", "confidence" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/debug_ollama_tokens.py | 55 | except Exception as e: # noqa: BLE001 — we want every failure mode visible | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/debug_ollama_tokens.py | 31 | CODE |