Open-source LLM knowledge platform: turn raw documents into a queryable RAG, an autonomous reasoning agent, and a self-maintaining Wiki.
This report summarizes scanner evidence for Tencent/WeKnora, a Go project with 36,108 GitHub stars. SynthScan examined 1,346,780 lines of code across 5026 source files, recording 3351 pattern matches distributed across 22 syntactic categories. The legacy adjusted pattern signal is 3.0 (Low 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.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 2950 finding(s).
Are imports declared and package/API names verified? 121 finding(s).
Are wrappers, guards, and repeated structures necessary? 1306 finding(s).
Which changes need focused human review? 3351 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 3351 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 | docker-compose.dev.yml | 381 | # Langfuse 自建栈(dev 对称版) | COMMENT |
| LOW | docker-compose.yml | 61 | # - /var/run/docker.sock:/var/run/docker.sock | COMMENT |
| LOW | docker-compose.yml | 81 | # requires Docker Compose v2.24+ (Jan 2024) and would break parsing on | COMMENT |
| LOW | docker-compose.yml | 101 | # 时区,默认为Asia/Shanghai | COMMENT |
| LOW | docker-compose.yml | 301 | # Redis 频道命名空间后缀(多部署共享同一 Redis 时隔离用) | COMMENT |
| LOW | docker-compose.yml | 321 | - IMAGE_HOST_KEEP_URL=${IMAGE_HOST_KEEP_URL:-} | COMMENT |
| LOW | docker-compose.yml | 781 | - weaviate | COMMENT |
| LOW | docker-compose.yml | 841 | ports: | COMMENT |
| LOW | cmd/server/bootstrap.go | 21 | // may be promoted to system administrator when the deployment has no | COMMENT |
| LOW | cmd/server/bootstrap.go | 61 | // not abort startup — bootstrap is best-effort. | COMMENT |
| LOW | cmd/server/main.go | 1 | // Package main is the main package for the WeKnora server | COMMENT |
| LOW | docker/sandbox-pty-prompt.sh | 1 | # WeKnora interactive PTY prompt: classic \u@\h:\W\$ | COMMENT |
| LOW | docker/scripts/wk-chrome.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docker/scripts/start-desktop.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docker/scripts/start-desktop.sh | 21 | # response at all (a bad handshake on the backend, for every session on the | COMMENT |
| LOW | docker/scripts/chrome-wk.sh | 1 | #!/bin/sh | COMMENT |
| LOW | docker/scripts/wk-display.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/scripts/tests/smoke-flows.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | frontend/src/composables/useResourcePins.ts | 1 | // useResourcePins – per-(user, tenant) favorites + per-user recents for | COMMENT |
| LOW | frontend/src/composables/useListUrlState.ts | 1 | // useListUrlState keeps a list view's filter state (sidebar scope, creator | COMMENT |
| LOW | frontend/src/composables/useFont.ts | 1 | import { ref } from 'vue' | COMMENT |
| LOW | frontend/src/composables/useFont.ts | 21 | // system sans, PingFang, and Helvetica are all visually close enough | COMMENT |
| LOW | frontend/src/composables/useFont.ts | 221 | } | COMMENT |
| LOW | frontend/src/wailsjs/runtime/runtime.d.ts | 101 | // *Windows only* | COMMENT |
| LOW | frontend/src/stores/auth.ts | 41 | const selectedTenantName = ref<string | null>(null) | COMMENT |
| LOW | frontend/src/stores/auth.ts | 101 | COMMENT | |
| LOW | frontend/src/stores/auth.ts | 121 | // bit in DevTools will get a 403 the moment they hit a guarded endpoint. | COMMENT |
| LOW | frontend/src/utils/workspaceNotifyContent.ts | 1 | // Shared content renderer for the post-login and post-tenant-switch | COMMENT |
| LOW | frontend/src/utils/wikiLineDiff.ts | 1 | // Line-level diff for the wiki revision viewer. Deliberately small: the | COMMENT |
| LOW | frontend/src/utils/loginNotify.ts | 1 | // Rich "you're now in {workspace} as {role}" notification for the | COMMENT |
| LOW | frontend/src/utils/imageAttrDisplay.ts | 1 | import type { | COMMENT |
| LOW | frontend/src/utils/finalAnswer.ts | 1 | // finalAnswer.ts | COMMENT |
| LOW | frontend/src/components/UserMenu.vue | 361 | // ---------- Tenant switcher submenu ---------- | COMMENT |
| LOW | frontend/src/components/ModelEditorDialog.vue | 3061 | // 容器留点呼吸:避免选项贴着 popup 圆角 | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 41 | stall_state?: string | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 101 | const expandedRows = ref<Set<string>>(new Set(['__root__'])) | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 121 | // expanded unless the user has spoken. Discoverability + respect | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 141 | // watchers, watchdogs, fetchInFlight gates routing through tick | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 261 | // 1. If we have data: still live while parse_status is polling | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 301 | } | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 321 | ) | COMMENT |
| LOW | …ntend/src/components/knowledge-processing-timeline.vue | 341 | // the tree quiesces (so wiki ingest's 30s-debounced subspan | COMMENT |
| LOW | …tend/src/components/credentials/CredentialResource.vue | 181 | // Local view state per field. Source of truth is props.meta, but we track | COMMENT |
| LOW | frontend/src/api/knowledge-base/index.ts | 61 | // - source 'env' → KB uses the tenant's env-configured store | COMMENT |
| LOW | frontend/src/api/knowledge-base/index.ts | 81 | // attribute panel dynamically. The types/constants below mirror the v1 shape | COMMENT |
| LOW | frontend/src/api/image-gallery/index.ts | 1 | import { get, post } from '@/utils/request'; | COMMENT |
| LOW | frontend/src/i18n/memoryKeyReferences.test.ts | 1 | import assert from 'node:assert/strict' | COMMENT |
| LOW | frontend/src/views/settings/Settings.vue | 301 | // 以「页面里至少有 1 个有意义的写操作所要求的最低角色」为基准,把基础设 | COMMENT |
| LOW | frontend/src/views/settings/TenantMembers.vue | 601 | const invitationsError = ref('') | COMMENT |
| LOW | frontend/src/views/chat/components/botmsg.vue | 301 | COMMENT | |
| LOW | …ntend/src/views/chat/components/AgentStreamDisplay.vue | 1301 | // ----------------------------------------------------------------------------- | COMMENT |
| LOW | …ntend/src/views/chat/components/AgentStreamDisplay.vue | 2221 | // Drop thinking cards that are entirely empty (no title and no body). Some | COMMENT |
| LOW | frontend/src/views/agent/AgentList.vue | 1381 | else next.add(key) | COMMENT |
| LOW | frontend/src/views/agent/AgentEditorModal.vue | 3361 | }; | COMMENT |
| LOW | frontend/src/views/agent/AgentEditorModal.vue | 4041 | // 监听知识库启用状态变化: | COMMENT |
| LOW | frontend/src/views/knowledge/kbListMerge.ts | 1 | // Pure helpers backing the "All" scope of the knowledge-base list. | COMMENT |
| LOW | frontend/src/views/knowledge/KnowledgeBase.vue | 301 | // tenant role does NOT grant edit/manage — only the share grant does. | COMMENT |
| LOW | frontend/src/views/knowledge/KnowledgeBase.vue | 321 | // (Contributor+) or tenant Admin+ in the home tenant. | COMMENT |
| LOW | frontend/src/views/knowledge/KnowledgeBaseList.vue | 761 | // 左侧空间选择:默认根据当前角色决定。 | COMMENT |
| LOW | frontend/src/views/knowledge/KnowledgeBaseList.vue | 1021 | } | COMMENT |
| 1624 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/vite.config.ts | 56 | function resolveVueOfficePptxEntry(): string { | CODE |
| LOW | frontend/src/composables/preferenceStorage.ts | 81 | export function migratePreferencesIntoUser(): void { | CODE |
| LOW | …tend/src/composables/useChatAttachmentPreviewDrawer.ts | 21 | export function provideChatAttachmentPreviewDrawer(): ChatAttachmentPreviewDrawerContext { | CODE |
| LOW | …tend/src/composables/useChatAttachmentPreviewDrawer.ts | 46 | export function useChatAttachmentPreviewDrawer(): ChatAttachmentPreviewDrawerContext | null { | CODE |
| LOW | frontend/src/composables/useChatReferencesDrawer.ts | 41 | export function provideChatReferencesDrawer(): ChatReferencesDrawerContext { | CODE |
| LOW | frontend/src/composables/useChatScrollFollow.ts | 92 | export function useDeferredTimelineCompletion(done: Readonly<Ref<boolean>>, reading: Readonly<Ref<boolean>>) { | CODE |
| LOW | frontend/src/composables/useProtectedImageRecovery.ts | 6 | export function useProtectedImageRecovery( | CODE |
| LOW | …ntend/src/composables/useConfigSkillInstallProgress.ts | 26 | export function useConfigSkillInstallProgress(options?: { | CODE |
| LOW | frontend/src/composables/useDocumentPictureInPicture.ts | 8 | export function useDocumentPictureInPicture(selected: Ref<boolean>, title: () => string) { | CODE |
| LOW | frontend/src/config/deploymentCapabilities.ts | 32 | export function isDeploymentCapabilitySupported( | CODE |
| LOW | frontend/src/config/settingsRoute.ts | 12 | export function integrationTabFromSection(section: string): IntegrationTab { | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.d.ts | 16 | export function GetDesktopHTTPBindPublicSetting():Promise<boolean>; | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.d.ts | 18 | export function GetDesktopHTTPPortSetting():Promise<number>; | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.d.ts | 20 | export function GetDesktopListenPublicActive():Promise<boolean>; | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.d.ts | 30 | export function SetDesktopHTTPBindPublicSetting(arg1:boolean):Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.d.ts | 32 | export function SetDesktopHTTPPortSetting(arg1:number):Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.js | 29 | export function GetDesktopHTTPBindPublicSetting() { | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.js | 33 | export function GetDesktopHTTPPortSetting() { | CODE |
| LOW⚡ | frontend/src/wailsjs/go/main/App.js | 37 | export function GetDesktopListenPublicActive() { | CODE |
| LOW | frontend/src/wailsjs/go/main/App.js | 57 | export function SetDesktopHTTPBindPublicSetting(arg1) { | CODE |
| LOW | frontend/src/wailsjs/go/main/App.js | 61 | export function SetDesktopHTTPPortSetting(arg1) { | CODE |
| LOW | frontend/src/wailsjs/runtime/runtime.d.ts | 103 | export function WindowSetSystemDefaultTheme(): void; | CODE |
| LOW | frontend/src/wailsjs/runtime/runtime.d.ts | 203 | export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 290 | export function RequestNotificationAuthorization(): Promise<boolean>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 294 | export function CheckNotificationAuthorization(): Promise<boolean>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 302 | export function SendNotificationWithActions(options: NotificationOptions): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 306 | export function RegisterNotificationCategory(category: NotificationCategory): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 310 | export function RemoveNotificationCategory(categoryId: string): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 314 | export function RemoveAllPendingNotifications(): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 318 | export function RemovePendingNotification(identifier: string): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 322 | export function RemoveAllDeliveredNotifications(): Promise<void>; | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.d.ts | 326 | export function RemoveDeliveredNotification(identifier: string): Promise<void>; | CODE |
| LOW | frontend/src/wailsjs/runtime/runtime.js | 76 | export function WindowSetSystemDefaultTheme() { | CODE |
| LOW | frontend/src/wailsjs/runtime/runtime.js | 164 | export function WindowSetBackgroundColour(R, G, B, A) { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 256 | export function RequestNotificationAuthorization() { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 260 | export function CheckNotificationAuthorization() { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 268 | export function SendNotificationWithActions(options) { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 272 | export function RegisterNotificationCategory(category) { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 276 | export function RemoveNotificationCategory(categoryId) { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 280 | export function RemoveAllPendingNotifications() { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 284 | export function RemovePendingNotification(identifier) { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 288 | export function RemoveAllDeliveredNotifications() { | CODE |
| LOW⚡ | frontend/src/wailsjs/runtime/runtime.js | 292 | export function RemoveDeliveredNotification(identifier) { | CODE |
| LOW | frontend/src/stores/localizedResourceCache.ts | 11 | export function isLocalizedSnapshotUsable( | CODE |
| LOW | frontend/src/stores/localizedResourceCache.ts | 20 | export function shouldReuseLocalizedInflight( | CODE |
| LOW | frontend/src/stores/localizedResourceCache.ts | 33 | export function shouldForceLocalizedRefetch( | CODE |
| LOW | frontend/src/stores/editorResources.ts | 27 | export function pickUsableStorageProvider( | CODE |
| LOW | frontend/src/stores/editorResources.ts | 256 | function resolveUsableStorageProvider(candidate?: string): string { | CODE |
| LOW | frontend/src/stores/editorResources.ts | 310 | async function ensureTenantRetrievalConfig(force = false): Promise<void> { | CODE |
| LOW | frontend/src/stores/uploadQueue.ts | 343 | export function createListRefreshThrottle( | CODE |
| LOW | frontend/src/stores/modelProvidersState.ts | 58 | export function credentialLabelForModelType( | CODE |
| LOW | frontend/src/stores/chatResources.ts | 160 | async function fetchKnowledgeBasesForList( | CODE |
| LOW | frontend/src/stores/chatResources.ts | 266 | async function ensureAgentKnowledgeBases(agentId: string, sourceTenantId?: string, force = false): Promise<any[]> { | CODE |
| LOW | frontend/src/stores/chatResources.ts | 276 | function invalidateKnowledgeBaseDetail(kbId?: string) { | CODE |
| LOW | frontend/src/stores/organization.ts | 159 | function adjustOrganizationResourceCount( | CODE |
| LOW | frontend/src/stores/organization.ts | 460 | async function fetchSharedKnowledgeBases(options?: { force?: boolean }) { | CODE |
| LOW | frontend/src/stores/organization.ts | 518 | function invalidateSearchableOrganizations(organizationId?: string) { | CODE |
| LOW | frontend/src/stores/organization.ts | 527 | function invalidateOrganizationData(options: InvalidateOrganizationDataOptions) { | CODE |
| LOW | frontend/src/stores/organization.ts | 544 | async function fetchSearchableOrganizations( | CODE |
| LOW | frontend/src/stores/organization.ts | 575 | function clearSearchableOrganizations() { | CODE |
| 966 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker-compose.dev.yml | 380 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker-compose.dev.yml | 393 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker-compose.yml | 783 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker-compose.yml | 798 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker-compose.yml | 850 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | docker-compose.yml | 866 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | …/src/views/knowledge/KnowledgeBaseFolderCounts.test.ts | 95 | // ── Breadcrumb ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/views/knowledge/KnowledgeBaseFolderCounts.test.ts | 157 | // ── Sub-folders as list entries ───────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/views/knowledge/KnowledgeBaseFolderCounts.test.ts | 216 | // ── Wording ───────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …/src/views/knowledge/KnowledgeBaseFolderCounts.test.ts | 253 | // ── Empty state ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | frontend/src/views/knowledge/wiki/WikiBrowser.vue | 3390 | // ─── Bloom: additive neighbor expansion ────────────────────────────────── | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 31 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 34 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config/agent_type_presets.yaml | 67 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | config/agent_type_presets.yaml | 70 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 101 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 104 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 148 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 153 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 195 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 197 | # -------------------------------------------------------------------------- | COMMENT |
| MEDIUM | mcp-server/weknora_mcp_server.py | 240 | # ── UUID pattern (8-4-4-4-12 hex) ────────────────────────────────────── | COMMENT |
| MEDIUM | mcp-server/weknora_mcp_server.py | 693 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | mcp-server/weknora_mcp_server.py | 702 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | mcp-server/weknora_mcp_server.py | 1130 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | mcp-server/weknora_mcp_server.py | 1132 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | internal/datasource/scheduler_test.go | 14 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/scheduler_test.go | 16 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/scheduler_test.go | 165 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/scheduler_test.go | 167 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 606 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 613 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 736 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 738 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 868 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/core/client.go | 872 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …asource/connector/feishu/wiki/connector_golden_test.go | 15 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …asource/connector/feishu/wiki/connector_golden_test.go | 22 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …asource/connector/feishu/wiki/connector_stream_test.go | 301 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …asource/connector/feishu/wiki/connector_stream_test.go | 303 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 30 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 32 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 251 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 253 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 390 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 392 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 577 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 579 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 900 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 902 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1111 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1113 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1298 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1300 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1335 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1337 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1829 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …nal/datasource/connector/feishu/wiki/connector_test.go | 1831 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/wiki/paths_test.go | 15 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | internal/datasource/connector/feishu/wiki/paths_test.go | 18 | // ────────────────────────────────────────────────────────────────────── | COMMENT |
| 66 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …rc/views/knowledge/settings/DataSourceEditorDialog.vue | 243 | // Step 2: Resources | COMMENT |
| LOW⚡ | config/config.yaml | 57 | ## Step 1: Entity Extraction and Attribute Enrichment | COMMENT |
| LOW⚡ | config/config.yaml | 61 | ## Step 2: Relationship Extraction and Verification | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 132 | # Step 1: Split text by separators recursively | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 134 | # Step 2: Extract protected content positions | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 136 | # Step 3: Merge splits with protected content to ensure integrity | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 142 | # Step 4: Merge splits into final chunks with overlap | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 145 | # Step 5: Validate chunks and test restoration | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 13 | ## Step 1: Create Connector Package Structure | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 24 | ## Step 2: Define Platform Types (types.go) | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 70 | ## Step 3: Implement API Client (client.go) | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 113 | ## Step 4: Implement Connector Interface (connector.go) | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 295 | ## Step 5: Register in Container | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 334 | ## Step 6: Add Connector Type Constant | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 345 | ## Step 7: Add Metadata | COMMENT |
| LOW | internal/datasource/CONNECTOR_IMPLEMENTATION_GUIDE.md | 363 | ## Step 8: Test Your Connector | COMMENT |
| LOW⚡ | internal/datasource/connector/feishu/core/client.go | 691 | // Step 1: create export task | COMMENT |
| LOW⚡ | internal/datasource/connector/feishu/core/client.go | 697 | // Step 2: retain the same ticket while waiting on shared API limits. A wall | COMMENT |
| LOW | internal/datasource/connector/feishu/core/client.go | 722 | // Step 3: download file using file_token (NOT ticket) | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 348 | // Step 2: caller A snapshots the row with counter=5 in memory. | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 353 | // Step 3: an enrichment subtask decrements concurrently. | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 357 | // Step 4: caller A persists an unrelated change. The in-memory copy | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 362 | // Step 5: the live counter is still 4, not clobbered back to 5. | COMMENT |
| LOW | internal/application/service/message.go | 616 | // Step 1: Keyword search (dialect-aware LIKE in the repository) | COMMENT |
| LOW | internal/application/service/message.go | 627 | // Step 2: Vector search via chat history knowledge base (if configured) | COMMENT |
| LOW | internal/application/service/message.go | 640 | // Step 3: Merge results based on mode | COMMENT |
| LOW⚡ | internal/application/service/message.go | 659 | // Step 4: Fetch partner messages (Q&A counterparts) to ensure complete pairs | COMMENT |
| LOW⚡ | internal/application/service/message.go | 662 | // Step 5: Group by request_id to merge Q&A pairs | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 990 | // Step 1: Delete the knowledge base record first (mark as deleted) | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1038 | // Step 2: Enqueue async task for heavy cleanup operations | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1129 | // Step 1: Get all knowledge entries in this knowledge base | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1149 | // Step 2: Delete all knowledge entries and their resources | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 3058 | // Step 2: Update knowledge status and metadata | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 3070 | // Step 3: Trigger async re-parsing based on knowledge type | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4174 | // Step 2: Store images and update markdown references | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4242 | // Step 3: Split into chunks using Go chunker. Line endings and inline | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4302 | // Step 4: Process chunks (vectorize + index + enqueue async tasks) | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 55 | // Step 1: Select input | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 58 | // Step 2: Initial dedup | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 61 | // Step 3: Inject history references | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 76 | // Step 4: Resolve parent chunks | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 79 | // Step 5: Group by knowledge/chunkType and merge overlapping ranges | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 82 | // Step 6: Populate FAQ answers | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 85 | // Step 7: Expand short contexts | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 91 | // Step 8: Final dedup — catches exact duplicates plus partial content overlaps | COMMENT |
| LOW | …plication/service/chat_pipeline/extract_entity_test.go | 330 | const prose = "## Step 1: Entity Extraction\n1. Romeo and Juliet is a play" | CODE |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 294 | // Step 1: Find protected spans | COMMENT |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 297 | // Step 2: Split non-protected regions by separators, keep protected as atomic units. | COMMENT |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 302 | // Step 3: Merge units into chunks with overlap | COMMENT |
| LOW⚡ | internal/event/example_test.go | 65 | // Step 1: Query received | COMMENT |
| LOW⚡ | internal/event/example_test.go | 72 | // Step 2: Query rewrite | COMMENT |
| LOW⚡ | internal/event/example_test.go | 79 | // Step 3: Retrieval | COMMENT |
| LOW⚡ | internal/event/example_test.go | 86 | // Step 4: Rerank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docreader/preprocess_worker.py | 132 | except (EOFError, BrokenPipeError): | CODE |
| HIGH | docreader/tests/test_sandbox_executor.py | 89 | except ProcessLookupError: | CODE |
| HIGH | docreader/tests/test_ssrf_proxy.py | 105 | except Exception: | CODE |
| HIGH | docreader/tests/preprocess_worker_fixture.py | 53 | except (EOFError, BrokenPipeError): | CODE |
| HIGH | docreader/utils/tempfile.py | 29 | except OSError: | CODE |
| HIGH | docreader/utils/tempfile.py | 33 | except OSError: | CODE |
| HIGH | docreader/utils/ssrf.py | 283 | except ValueError: | CODE |
| HIGH | docreader/parser/pdf_parser.py | 1597 | except FileNotFoundError: | CODE |
| HIGH | docreader/parser/pdf_parser.py | 1573 | except OSError: | CODE |
| HIGH | docreader/parser/pdf_parser.py | 1696 | except StopIteration: | CODE |
| HIGH | docreader/parser/docx_parser.py | 1139 | except OSError: | CODE |
| HIGH | docreader/parser/pptx_media.py | 34 | except OSError: | CODE |
| HIGH | docreader/parser/doc_parser.py | 124 | except subprocess.TimeoutExpired: | CODE |
| HIGH | docreader/parser/doc_parser.py | 137 | except OSError: | CODE |
| HIGH | docreader/parser/doc_parser.py | 115 | except OSError: | CODE |
| HIGH | docreader/parser/doc_parser.py | 149 | except OSError: | CODE |
| HIGH | docreader/parser/doc_parser.py | 163 | except OSError: | CODE |
| HIGH | internal/application/service/tenant_skill_verify.py | 205 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …rc/views/knowledge/settings/DataSourceEditorDialog.vue | 243 | // Step 2: Resources | COMMENT |
| LOW⚡ | config/config.yaml | 57 | ## Step 1: Entity Extraction and Attribute Enrichment | COMMENT |
| LOW⚡ | config/config.yaml | 61 | ## Step 2: Relationship Extraction and Verification | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 132 | # Step 1: Split text by separators recursively | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 134 | # Step 2: Extract protected content positions | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 136 | # Step 3: Merge splits with protected content to ensure integrity | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 142 | # Step 4: Merge splits into final chunks with overlap | COMMENT |
| LOW⚡ | docreader/splitter/splitter.py | 145 | # Step 5: Validate chunks and test restoration | COMMENT |
| LOW⚡ | internal/datasource/connector/feishu/core/client.go | 691 | // Step 1: create export task | COMMENT |
| LOW⚡ | internal/datasource/connector/feishu/core/client.go | 697 | // Step 2: retain the same ticket while waiting on shared API limits. A wall | COMMENT |
| LOW | internal/datasource/connector/feishu/core/client.go | 722 | // Step 3: download file using file_token (NOT ticket) | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 348 | // Step 2: caller A snapshots the row with counter=5 in memory. | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 353 | // Step 3: an enrichment subtask decrements concurrently. | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 357 | // Step 4: caller A persists an unrelated change. The in-memory copy | COMMENT |
| LOW⚡ | …rnal/application/repository/knowledge_finalize_test.go | 362 | // Step 5: the live counter is still 4, not clobbered back to 5. | COMMENT |
| LOW | internal/application/service/message.go | 616 | // Step 1: Keyword search (dialect-aware LIKE in the repository) | COMMENT |
| LOW | internal/application/service/message.go | 627 | // Step 2: Vector search via chat history knowledge base (if configured) | COMMENT |
| LOW | internal/application/service/message.go | 640 | // Step 3: Merge results based on mode | COMMENT |
| LOW⚡ | internal/application/service/message.go | 659 | // Step 4: Fetch partner messages (Q&A counterparts) to ensure complete pairs | COMMENT |
| LOW⚡ | internal/application/service/message.go | 662 | // Step 5: Group by request_id to merge Q&A pairs | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 990 | // Step 1: Delete the knowledge base record first (mark as deleted) | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1038 | // Step 2: Enqueue async task for heavy cleanup operations | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1129 | // Step 1: Get all knowledge entries in this knowledge base | COMMENT |
| LOW | internal/application/service/knowledgebase.go | 1149 | // Step 2: Delete all knowledge entries and their resources | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 3058 | // Step 2: Update knowledge status and metadata | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 3070 | // Step 3: Trigger async re-parsing based on knowledge type | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4174 | // Step 2: Store images and update markdown references | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4242 | // Step 3: Split into chunks using Go chunker. Line endings and inline | COMMENT |
| LOW | internal/application/service/knowledge_process.go | 4302 | // Step 4: Process chunks (vectorize + index + enqueue async tasks) | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 55 | // Step 1: Select input | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 58 | // Step 2: Initial dedup | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 61 | // Step 3: Inject history references | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 76 | // Step 4: Resolve parent chunks | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 79 | // Step 5: Group by knowledge/chunkType and merge overlapping ranges | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 82 | // Step 6: Populate FAQ answers | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 85 | // Step 7: Expand short contexts | COMMENT |
| LOW⚡ | internal/application/service/chat_pipeline/merge.go | 91 | // Step 8: Final dedup — catches exact duplicates plus partial content overlaps | COMMENT |
| LOW | …plication/service/chat_pipeline/extract_entity_test.go | 330 | const prose = "## Step 1: Entity Extraction\n1. Romeo and Juliet is a play" | CODE |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 294 | // Step 1: Find protected spans | COMMENT |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 297 | // Step 2: Split non-protected regions by separators, keep protected as atomic units. | COMMENT |
| LOW⚡ | internal/infrastructure/chunker/splitter.go | 302 | // Step 3: Merge units into chunks with overlap | COMMENT |
| LOW⚡ | internal/event/example_test.go | 65 | // Step 1: Query received | COMMENT |
| LOW⚡ | internal/event/example_test.go | 72 | // Step 2: Query rewrite | COMMENT |
| LOW⚡ | internal/event/example_test.go | 79 | // Step 3: Retrieval | COMMENT |
| LOW⚡ | internal/event/example_test.go | 86 | // Step 4: Rerank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rerank_server_demo.py | 52 | except Exception as e: | CODE |
| LOW | docreader/config.py | 29 | except Exception: | CODE |
| LOW | docreader/preprocess.py | 253 | except Exception: | CODE |
| LOW | docreader/preprocess_worker.py | 109 | except Exception: | CODE |
| LOW | docreader/main.py | 95 | except Exception: | CODE |
| LOW | docreader/main.py | 143 | except Exception: | CODE |
| LOW | docreader/main.py | 265 | except Exception as e: | CODE |
| LOW | docreader/main.py | 316 | except Exception as e: | CODE |
| LOW | docreader/main.py | 363 | except Exception: | CODE |
| LOW | docreader/tests/test_ssrf_proxy.py | 105 | except Exception: | CODE |
| LOW | docreader/splitter/splitter.py | 487 | except Exception as e: | CODE |
| LOW | docreader/splitter/splitter.py | 526 | except Exception as e: | CODE |
| MEDIUM | docreader/parser/pdf_parser.py | 1437 | def _page_geometry(page): | CODE |
| LOW⚡ | docreader/parser/pdf_parser.py | 719 | except Exception: | CODE |
| LOW⚡ | docreader/parser/pdf_parser.py | 725 | except Exception: | CODE |
| LOW⚡ | docreader/parser/pdf_parser.py | 730 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 223 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 703 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 764 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 781 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 809 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 826 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1360 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1430 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1440 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1563 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1588 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1710 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1870 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1920 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 1927 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 2106 | except Exception as e: | CODE |
| LOW | docreader/parser/pdf_parser.py | 2222 | except Exception: | CODE |
| LOW | docreader/parser/pdf_parser.py | 2254 | except Exception: | CODE |
| LOW | docreader/parser/image_preprocess.py | 375 | except Exception as e: | CODE |
| LOW | docreader/parser/opendataloader_parser.py | 101 | except Exception as e: | CODE |
| LOW | docreader/parser/html_parser.py | 55 | except Exception as exc: # never fail a parse the full conversion can serve | CODE |
| LOW | docreader/parser/markitdown_parser.py | 89 | except Exception as exc: | CODE |
| LOW | docreader/parser/markitdown_parser.py | 117 | except Exception as exc: | CODE |
| LOW | docreader/parser/markitdown_parser.py | 151 | except Exception: | CODE |
| LOW | docreader/parser/registry.py | 131 | except Exception as e: | CODE |
| LOW⚡ | docreader/parser/docx_parser.py | 469 | except Exception as e: | CODE |
| LOW⚡ | docreader/parser/docx_parser.py | 472 | except Exception as e: | CODE |
| LOW⚡ | docreader/parser/docx_parser.py | 1639 | except Exception as e: | CODE |
| LOW⚡ | docreader/parser/docx_parser.py | 1647 | except Exception as e: | CODE |
| LOW⚡ | docreader/parser/docx_parser.py | 1653 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 263 | except Exception as exc: | CODE |
| LOW | docreader/parser/docx_parser.py | 307 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 337 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 416 | except Exception as backup_error: | CODE |
| LOW | docreader/parser/docx_parser.py | 692 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 714 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 979 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1064 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1142 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1160 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1250 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1287 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1408 | except Exception as e: | CODE |
| LOW | docreader/parser/docx_parser.py | 1441 | except Exception as e: | CODE |
| 34 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | CHANGELOG.md | 146 | - **NEW**: **Model catalog** — model integration is rebuilt on protocol, vendor and catalog layers (#3470, #3589): 27 bu | CODE |
| MEDIUM | frontend/src/utils/wikiToolReferences.test.ts | 50 | <content># RAG\n\nFull **Markdown** body.</content> | CODE |
| MEDIUM | frontend/src/utils/wikiToolReferences.test.ts | 58 | assert.equal(refs[0]?.content, '# RAG\n\nFull **Markdown** body.') | CODE |
| MEDIUM⚡ | config/agent_type_presets.yaml | 32 | # RAG Q&A — classic evidence-based retrieval over chunk indexes. | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 102 | # Hybrid RAG + Wiki — single agent that orchestrates both indexes. | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 102 | # Hybrid RAG + Wiki — single agent that orchestrates both indexes. | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 138 | # - KB has wiki + chunks → full "wiki-first, RAG-verify" workflow | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 139 | # - KB has only chunks → fallback to pure RAG (see prompt's "Fallback rules") | COMMENT |
| MEDIUM⚡ | config/agent_type_presets.yaml | 186 | # ChunkTypeTableColumn chunks, which are produced by the normal RAG | COMMENT |
| MEDIUM | config/prompt_templates/intent_prompts.yaml | 2 | # Used to override the default RAG system prompt when the query intent | COMMENT |
| MEDIUM⚡ | docreader/tests/test_html_parser.py | 126 | self.assertIn("# 深入理解 RAG 的召回策略", content) | CODE |
| MEDIUM | internal/event/SUMMARY.md | 61 | │ └── main.go # 完整的 RAG 流程演示 | CODE |
| MEDIUM | internal/mcpserver/tools_ask.go | 30 | // agentic MCP calls without changing unrelated chat endpoints. | COMMENT |
| MEDIUM | cli/README.md | 99 | # 9. Inspect a document's chunks for RAG retrieval debug | COMMENT |
| MEDIUM | cli/cmd/mcp/mcp.go | 4 | // the JSON-RPC 2.0 wire protocol agentic IDEs use to call external tools. | COMMENT |
| MEDIUM | cli/cmd/model/create.go | 132 | // Mode-specific guardrails: a remote model needs a provider to route | COMMENT |
| MEDIUM | cli/skills/weknora-rag-search/SKILL.md | 8 | # WeKnora — retrieval & RAG queries | COMMENT |
| MEDIUM | cli/skills/weknora-rag-search/references/chat.md | 1 | # `chat` and `session ask` — RAG answers and raw streams | COMMENT |
| MEDIUM | website-docs/02-architecture/04-rag-pipeline.md | 1 | # 检索问答全流程(RAG Pipeline) | COMMENT |
| MEDIUM | website-docs/02-architecture/04-rag-pipeline.md | 300 | ## 完整 RAG 流程图 {#_4-完整-rag-流程图} | COMMENT |
| MEDIUM | website-docs/03-features/07-agent.md | 617 | ### Agent 模式与普通 RAG 问答模式 {#_9-agent-模式与普通-rag-问答模式} | COMMENT |
| MEDIUM | website-docs/05-clients/02-cli.md | 343 | ### chat — 流式 RAG 问答(`cli/cmd/chat/chat.go`) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | frontend/src/utils/pageSnapshot.ts | 129 | return collapse(control.getAttribute('placeholder') || control.getAttribute('title') || control.getAttribute('name')) | CODE |
| LOW | frontend/src/utils/pageSnapshot.ts | 145 | isSecretLabel(label, control.getAttribute('name'), control.id, control.getAttribute('placeholder')) | CODE |
| LOW | frontend/src/utils/pageSnapshot.ts | 320 | ? field.box.querySelector('input')?.getAttribute('placeholder') | CODE |
| LOW | frontend/src/utils/pageSnapshot.ts | 321 | : field.control.getAttribute('placeholder')) | CODE |
| LOW | frontend/src/components/UserMenu.vue | 289 | email: authStore.user?.email || 'user@example.com', | CODE |
| LOW | frontend/src/i18n/embed.ts | 549 | "placeholder": "直接向模型提问", | CODE |
| LOW | frontend/src/i18n/embed.ts | 1147 | "placeholder": "直接向模型提問", | CODE |
| LOW | frontend/src/i18n/embed.ts | 1745 | "placeholder": "モデルに直接質問", | CODE |
| LOW | frontend/src/i18n/embed.ts | 2343 | "placeholder": "Ask questions directly to the model", | CODE |
| LOW | frontend/src/views/system/ModelCatalogFieldControl.vue | 2 | <t-input v-if="kind === 'text'" :model-value="modelValue" :placeholder="placeholder" class="field-control--text" | CODE |
| LOW | frontend/src/views/system/ModelCatalogFieldControl.vue | 5 | :placeholder="placeholder" class="field-control--number" @update:model-value="emit('update:modelValue', $event)" /> | CODE |
| LOW | internal/handler/system_password_reset_test.go | 87 | ID: "admin-user", Username: "admin", Email: "admin@example.com", | CODE |
| LOW | internal/handler/system_password_reset_test.go | 92 | "email": "admin@example.com", "new_password": "FreshPass9", | CODE |
| LOW | internal/middleware/auth_role_test.go | 246 | svc.seedActive("placeholder", 8, types.TenantRoleAdmin) | CODE |
| LOW | internal/datasource/connector/feishu/core/board_test.go | 31 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | internal/datasource/connector/feishu/core/board_test.go | 147 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | internal/datasource/connector/feishu/core/board_test.go | 203 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | internal/datasource/connector/feishu/core/board_test.go | 393 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | …/datasource/connector/feishu/core/client_retry_test.go | 24 | TenantAccessToken: "fake-token", | CODE |
| LOW | …/datasource/connector/feishu/core/client_retry_test.go | 220 | _, _ = io.WriteString(w, `{"code":0,"tenant_access_token":"fake-token","expire":7200,"pad":"`) | CODE |
| LOW | …asource/connector/feishu/wiki/connector_golden_test.go | 67 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | …asource/connector/feishu/wiki/connector_stream_test.go | 23 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | …asource/connector/feishu/wiki/connector_stream_test.go | 373 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 43 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 157 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 1270 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 1353 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 1476 | TenantAccessToken: "fake-token", | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 1627 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | …nal/datasource/connector/feishu/wiki/connector_test.go | 1700 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | …ce/connector/feishu/wiki/connector_convergence_test.go | 45 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | internal/datasource/connector/feishu/wiki/paths_test.go | 39 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | …asource/connector/feishu/drive/connector_paths_test.go | 48 | TenantAccessToken: "fake-token", Expire: 7200, | CODE |
| LOW | …l/datasource/connector/feishu/drive/pagination_test.go | 100 | TenantAccessToken: "fake-token", | CODE |
| LOW | …datasource/connector/feishu/drive/drive_blocks_test.go | 41 | writeJSON(w, core.TokenResponse{ApiResponse: core.ApiResponse{Code: 0}, TenantAccessToken: "fake-token", Expire: 7200} | CODE |
| LOW | internal/datasource/connector/confluence/types_test.go | 35 | "username": "user@example.com", | CODE |
| LOW | internal/datasource/connector/confluence/types_test.go | 47 | "edition": "cloud", "base_url": "https://team.atlassian.net/wiki", "username": "user@example.com", | CODE |
| LOW | internal/datasource/connector/confluence/types_test.go | 50 | if err != nil || !cfg.cloud() || cfg.username != "user@example.com" || cfg.secret != "token" { | CODE |
| LOW | internal/datasource/connector/confluence/types_test.go | 65 | "username": "user@example.com", "api_token": "token", | CODE |
| LOW | internal/agent/prompts_wiki.go | 148 | "name": "Acme Corp", | CODE |
| LOW | internal/agent/prompts_wiki.go | 233 | "name": "Acme Corp", | CODE |
| LOW | internal/agent/prompts_wiki.go | 497 | - "Acme Corp" → "Acme Corporation" (same company, abbreviation) | CODE |
| LOW | internal/agent/tools/sandbox_edit_test.go | 278 | mustEditSandboxArgs(path, "placeholder", "这不是一个\"大干快上\"的夜晚", false), | CODE |
| LOW | internal/application/repository/wiki_page_test.go | 907 | partial.Title = "Acme Corp" | CODE |
| LOW | internal/application/repository/wiki_page_test.go | 958 | assert.Greater(t, wikiTrigramJaccard(wikiTitleTrigrams("Acme Corporation"), wikiTitleTrigrams("Acme Corp")), 0.0) | CODE |
| LOW | internal/application/service/wiki_ingest_dedup_test.go | 221 | // filter keeps legitimate merge candidates like "Acme Corp" ↔ "Acme Corporation". | COMMENT |
| LOW | internal/application/service/wiki_ingest_dedup_test.go | 225 | nameGramSets: gramsPerSurface([]string{"Acme Corp"}), | CODE |
| LOW | …nal/application/service/user_token_persistence_test.go | 45 | user := persistedTestUser(t, 0, "user@example.com", "Secure9!") | CODE |
| LOW | …nal/application/service/user_token_persistence_test.go | 62 | user := persistedTestUser(t, 1, "user@example.com", "Secure9!") | CODE |
| LOW | …nal/application/service/user_token_persistence_test.go | 92 | user := persistedTestUser(t, 1, "user@example.com", "Secure9!") | CODE |
| LOW | internal/application/service/wiki_ingest_dedup.go | 42 | // is excluded while "Acme Corp" vs "Acme Corporation" (Jaccard ≈ 0.5) | COMMENT |
| LOW | internal/application/service/wiki_ingest_dedup.go | 208 | // model formatting drift such as "Acme Corp" vs "acme corp". | COMMENT |
| LOW | internal/application/service/user_oidc_verify_test.go | 82 | "email": "user@example.com", | CODE |
| LOW | internal/application/service/user_oidc_verify_test.go | 109 | if got, _ := claims["email"].(string); got != "user@example.com" { | CODE |
| LOW | internal/application/service/user_oidc_verify_test.go | 135 | forgedPayload["email"] = "admin@example.com" | CODE |
| LOW | internal/application/service/user_oidc_verify_test.go | 332 | "email": "admin@example.com", | CODE |
| LOW | internal/application/service/user_oidc_verify_test.go | 402 | if info.Email != "user@example.com" { | CODE |
| LOW | internal/application/service/wiki_page_revision_test.go | 115 | edit.Title = "Acme Corp" | CODE |
| LOW | internal/application/service/wiki_ingest_test.go | 46 | {"Acme Corp", "acme-corp"}, | CODE |
| LOW | …ternal/infrastructure/chunker/heading_splitter_test.go | 13 | body := strings.Repeat("Lorem ipsum dolor sit amet consectetur adipiscing elit. ", 4) | CODE |
| 10 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rerank_server_demo.py | 67 | CODE | |
| LOW | docreader/preprocess_worker.py | 34 | CODE | |
| LOW | docreader/main.py | 271 | CODE | |
| LOW | docreader/tests/test_source_locator_pdf.py | 53 | CODE | |
| LOW | docreader/tests/test_web_parser.py | 100 | CODE | |
| LOW | docreader/tests/test_epub_external_images.py | 50 | CODE | |
| LOW | docreader/tests/test_xlsx_percent_format.py | 114 | CODE | |
| LOW | docreader/tests/test_pdf_router.py | 115 | CODE | |
| LOW | docreader/tests/test_pdf_router.py | 163 | CODE | |
| LOW | docreader/tests/test_epub_parser.py | 170 | CODE | |
| LOW | docreader/tests/test_epub_parser.py | 357 | CODE | |
| LOW | docreader/tests/test_excel_parser.py | 21 | CODE | |
| LOW | docreader/tests/test_excel_parser.py | 223 | CODE | |
| LOW | docreader/tests/test_request_memory.py | 37 | CODE | |
| LOW | docreader/tests/test_docreader_memory.py | 117 | CODE | |
| LOW | docreader/tests/test_ssrf_proxy.py | 60 | CODE | |
| LOW | docreader/tests/test_ssrf_proxy.py | 68 | CODE | |
| LOW | docreader/tests/preprocess_worker_fixture.py | 15 | CODE | |
| LOW | docreader/tests/test_image_preprocess.py | 263 | CODE | |
| LOW | docreader/tests/test_pdf_embedded_images.py | 328 | CODE | |
| LOW | docreader/tests/test_pdf_embedded_images.py | 353 | CODE | |
| LOW | docreader/tests/test_docreader_stream.py | 40 | CODE | |
| LOW | docreader/splitter/splitter.py | 187 | CODE | |
| LOW | docreader/splitter/splitter.py | 424 | CODE | |
| LOW | docreader/splitter/header_hook.py | 143 | CODE | |
| LOW | docreader/utils/ssrf_proxy.py | 90 | CODE | |
| LOW | docreader/utils/request.py | 87 | CODE | |
| LOW | docreader/utils/ssrf.py | 163 | CODE | |
| LOW | docreader/utils/endecode.py | 23 | CODE | |
| LOW | docreader/utils/endecode.py | 138 | CODE | |
| LOW | docreader/parser/excel_convert.py | 49 | CODE | |
| LOW | docreader/parser/pdf_parser.py | 344 | CODE | |
| LOW | docreader/parser/pdf_parser.py | 638 | CODE | |
| LOW | docreader/parser/pdf_parser.py | 1648 | CODE | |
| LOW | docreader/parser/pdf_parser.py | 1894 | CODE | |
| LOW | docreader/parser/pdf_parser.py | 2300 | CODE | |
| LOW | docreader/parser/opendataloader_parser.py | 75 | CODE | |
| LOW | docreader/parser/ppt_convert.py | 37 | CODE | |
| LOW | docreader/parser/markdown_parser.py | 176 | CODE | |
| LOW | docreader/parser/docx_merge.py | 24 | CODE | |
| LOW | docreader/parser/docx_merge.py | 98 | CODE | |
| LOW | docreader/parser/markitdown_parser.py | 40 | CODE | |
| LOW | docreader/parser/xlsx_merge.py | 168 | CODE | |
| LOW | docreader/parser/excel_parser.py | 87 | CODE | |
| LOW | docreader/parser/docx_parser.py | 99 | CODE | |
| LOW | docreader/parser/docx_parser.py | 118 | CODE | |
| LOW | docreader/parser/docx_parser.py | 1292 | CODE | |
| LOW | docreader/parser/docx_parser.py | 1447 | CODE | |
| LOW | docreader/parser/docx_parser.py | 1547 | CODE | |
| LOW | docreader/parser/docx_parser.py | 103 | CODE | |
| LOW | docreader/parser/docx_parser.py | 232 | CODE | |
| LOW | docreader/parser/docx_parser.py | 342 | CODE | |
| LOW | docreader/parser/docx_parser.py | 936 | CODE | |
| LOW | docreader/parser/docx_parser.py | 995 | CODE | |
| LOW | docreader/parser/docx_parser.py | 1114 | CODE | |
| LOW | docreader/parser/docx_parser.py | 1163 | CODE | |
| LOW | docreader/parser/xmind_parser.py | 34 | CODE | |
| LOW | docreader/parser/xmind_parser.py | 142 | CODE | |
| LOW | docreader/parser/epub_parser.py | 69 | CODE | |
| LOW | docreader/parser/doc_parser.py | 141 | CODE | |
| 20 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …tend/src/views/integrations/ApiIntegrationSettings.vue | 1085 | const apiKeyHeader = ` -H "X-API-Key: ${apiKey.value ? '<API_KEY>' : '<YOUR_API_KEY>'}"` | CODE |
| HIGH | …tend/src/views/integrations/ApiIntegrationSettings.vue | 1085 | const apiKeyHeader = ` -H "X-API-Key: ${apiKey.value ? '<API_KEY>' : '<YOUR_API_KEY>'}"` | CODE |
| HIGH | frontend/src/views/integrations/ClawSkillLanding.vue | 134 | return `export WEKNORA_BASE_URL="${base}"\nexport WEKNORA_API_KEY="sk-your-api-key"` | CODE |
| HIGH | frontend/src/views/integrations/mcpServerIntegration.ts | 6 | export const MCP_TOKEN_PLACEHOLDER = '<YOUR_TOKEN>' | CODE |
| HIGH | mcp-server/PROJECT_SUMMARY.md | 134 | export WEKNORA_API_KEY="your_api_key" | CODE |
| HIGH | mcp-server/EXAMPLES.md | 421 | "WEKNORA_API_KEY": "your_api_key" | CODE |
| HIGH | mcp-server/INSTALL.md | 188 | Environment=WEKNORA_API_KEY=your_api_key | CODE |
| HIGH | website-docs/05-clients/03-go-sdk.md | 499 | client.WithAPIKey("your-api-key"), | CODE |
| HIGH | website-docs/05-clients/03-go-sdk.md | 551 | client.WithAPIKey("your-api-key")) | CODE |
| HIGH | website-docs/05-clients/03-go-sdk.md | 610 | client.WithAPIKey("your-api-key")) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | cmd/desktop/main.go | 45 | // and instead uses robust DOM-traversal via el.closest() plus a Y-position | COMMENT |
| MEDIUM | frontend/package-lock.json | 4763 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| MEDIUM | frontend/src/components/css/chat-timeline-loading.less | 4 | // One full gradient width (background-size is 200%) so the loop is seamless. | COMMENT |
| MEDIUM | docreader/parser/image_preprocess.py | 249 | """Outer SUPPORTING line for one side: robust slope + outward shift. | STRING |
| MEDIUM | internal/searchutil/normalize.go | 11 | // NormalizeKeywordScores normalizes keyword match scores in-place using robust percentile bounds. | COMMENT |
| MEDIUM | …ion/repository/retriever/opensearch/repository_test.go | 247 | // parseMajorMinor — robust semver parsing | COMMENT |
| MEDIUM | cli/cmd/doctor/doctor.go | 288 | // but type-assertion is structurally more robust to scheme renames. | COMMENT |
| MEDIUM | cli/acceptance/e2e/e2e_test.go | 48 | // the most robust path for CI and local e2e alike. | COMMENT |
| MEDIUM⚡ | .github/workflows/dsh-plugin.yml | 9 | # tool calls through the harness agent loop against a mock backend | COMMENT |
| MEDIUM⚡ | .github/workflows/dsh-plugin.yml | 12 | # The e2e job pins the harness version so a plugin change is the only thing that | COMMENT |
| MEDIUM⚡ | .github/workflows/dsh-plugin.yml | 14 | # is allowed to fail: it exists to notice a harness breaking change early, since | COMMENT |
| MEDIUM | .github/workflows/dsh-plugin.yml | 30 | # Monday 03:00 UTC: catch a harness release that breaks the plugin. | COMMENT |
| MEDIUM | .github/workflows/dsh-plugin.yml | 42 | # The harness release this plugin is verified against. Bump it together with | COMMENT |
| MEDIUM | website-docs/package-lock.json | 3764 | "resolved": "https://mirrors.tencent.com/npm/robust-predicates/-/robust-predicates-3.0.3.tgz", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docreader/auth.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/config.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/preprocess.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/preprocess_worker.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/main.py | 57 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/splitter/splitter.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/utils/tempfile.py | 5 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/utils/request.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/utils/request.py | 17 | def set_request_id(request_id: str) -> None: | CODE |
| LOW | docreader/utils/endecode.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/models/document.py | 88 | def set_content(self, content: str) -> None: | CODE |
| LOW | docreader/parser/excel_convert.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/pdf_parser.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/image_preprocess.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/opendataloader_parser.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/ppt_convert.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/markdown_parser.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/html_parser.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/docx_merge.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/markitdown_parser.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/docx2_parser.py | 7 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/xlsx_merge.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/excel_parser.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/registry.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/docx_parser.py | 52 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/concurrency.py | 6 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/__init__.py | 28 | __all__ = [ | CODE |
| LOW | docreader/parser/base_parser.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/parser.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/xlsx_repair.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/image_parser.py | 8 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/pptx_media.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/epub_parser.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/chain_parser.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/doc_parser.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/doc_parser.py | 167 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/web_parser.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | docreader/parser/mhtml_parser.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | mcp-server/__init__.py | 14 | __all__ = ["WeKnoraClient", "run"] | CODE |
| LOW | mcp-server/upload_paths.py | 11 | def set_active_transport(transport: str) -> None: | CODE |
| LOW | mcp-server/weknora_mcp_server.py | 28 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | rerank_server_demo.py | 5 | CODE | |
| LOW | docreader/tests/test_pdf_router.py | 11 | CODE | |
| LOW | docreader/utils/ssrf_proxy.py | 7 | CODE | |
| LOW | docreader/utils/ssrf.py | 7 | CODE | |
| LOW | docreader/parser/excel_convert.py | 3 | CODE | |
| LOW | docreader/parser/opendataloader_parser.py | 11 | CODE | |
| LOW | docreader/parser/ppt_convert.py | 3 | CODE | |
| LOW | docreader/parser/markdown_parser.py | 16 | CODE | |
| LOW | docreader/parser/docx_merge.py | 3 | CODE | |
| LOW | docreader/parser/xlsx_merge.py | 3 | CODE | |
| LOW | docreader/parser/source_locator.py | 11 | CODE | |
| LOW | docreader/parser/__init__.py | 16 | CODE | |
| LOW | docreader/parser/__init__.py | 17 | CODE | |
| LOW | docreader/parser/__init__.py | 18 | CODE | |
| LOW | docreader/parser/__init__.py | 19 | CODE | |
| LOW | docreader/parser/__init__.py | 20 | CODE | |
| LOW | docreader/parser/__init__.py | 21 | CODE | |
| LOW | docreader/parser/__init__.py | 22 | CODE | |
| LOW | docreader/parser/__init__.py | 23 | CODE | |
| LOW | docreader/parser/__init__.py | 24 | CODE | |
| LOW | docreader/parser/__init__.py | 24 | CODE | |
| LOW | docreader/parser/__init__.py | 25 | CODE | |
| LOW | docreader/parser/xlsx_repair.py | 3 | CODE | |
| LOW | docreader/parser/pptx_media.py | 3 | CODE | |
| LOW | docreader/parser/doc_parser.py | 6 | CODE | |
| LOW | mcp-server/test_module.py | 34 | CODE | |
| LOW | mcp-server/test_module.py | 35 | CODE | |
| LOW | mcp-server/__init__.py | 12 | CODE | |
| LOW | mcp-server/__init__.py | 12 | CODE | |
| LOW | mcp-server/upload_paths.py | 3 | CODE | |
| LOW | mcp-server/main.py | 34 | CODE | |
| LOW | mcp-server/main.py | 35 | CODE | |
| LOW | mcp-server/check_imports.py | 17 | CODE | |
| LOW | mcp-server/check_imports.py | 24 | CODE | |
| LOW | mcp-server/check_imports.py | 31 | CODE | |
| LOW | docs/images/readme/src/generate.py | 13 | CODE | |
| LOW | examples/mcp-demo/server.py | 18 | CODE | |
| LOW | examples/mcp-demo/test_tools.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | frontend/src/views/agent/AgentEditorModal.vue | 3030 | formData.value.config.question_suggestions.starters.items.splice(index, 1); | CODE |
| CRITICAL | …src/views/knowledge/components/UploadConfirmDialog.vue | 809 | uiState.value.imageActions.ocr.on.map((cond) => | CODE |
| CRITICAL⚡ | dataset/tests/test_qa_dataset_model.py | 144 | self.client.chat.completions.create.assert_not_called() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | …ntend/src/views/knowledge/KnowledgeBaseEditorModal.vue | 746 | // AI-generated knowledge-base description (edit mode only). Kept outside | COMMENT |
| HIGH | internal/middleware/access_test.go | 24 | // EnableCrossTenantAccess flag set as requested. EnableRBAC is left at | COMMENT |
| HIGH | internal/types/interfaces/wiki_page.go | 393 | // that do not have AI-generated document questions or recommended FAQ entries. | COMMENT |
| HIGH | internal/application/repository/wiki_page.go | 1311 | // the KB has no FAQ entries or AI-generated document questions (typical for | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docreader/parser/excel_parser.py | 142 | # Create a chunk for this row with position tracking | COMMENT |
| MEDIUM | docreader/parser/docx_parser.py | 505 | # Create an estimated page mapping | COMMENT |
| MEDIUM | docreader/parser/docx_parser.py | 1096 | # Create the final text with proper ordering | COMMENT |
| MEDIUM | docreader/parser/docx_parser.py | 1234 | # Create a new image | COMMENT |
| MEDIUM | docreader/parser/docx_parser.py | 1276 | # Create a temporary file | COMMENT |
| MEDIUM | docreader/parser/chain_parser.py | 29 | # Create a custom FirstParser with specific parser classes | STRING |
| MEDIUM | docreader/parser/chain_parser.py | 103 | # Create a custom PipelineParser with specific parser classes | STRING |
| MEDIUM | docreader/parser/doc_parser.py | 273 | # Create a temporary directory to store the converted file | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | docreader/utils/endecode.py | 24 | Convert image to base64 encoded string. This function handles multiple image input formats and converts them to | STRING |
| HIGH | docreader/utils/endecode.py | 79 | Decode a base64 encoded image string back to bytes. This function converts a base64 encoded string representation o | STRING |
| HIGH | docreader/parser/web_parser.py | 246 | Parse web page content into a Document object. Args: content: URL encoded as bytes Returns | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docreader/splitter/splitter.py | 250 | # Check if adding this split would exceed chunk size | COMMENT |
| LOW | docreader/parser/docx_parser.py | 324 | # Check if the generated text is empty | COMMENT |
| LOW | docreader/parser/docx_parser.py | 787 | # Check if the document contains images to optimize processing speed | COMMENT |
| LOW | docreader/parser/docx_parser.py | 1011 | # Check if there are images | COMMENT |
| LOW | docreader/parser/docx_parser.py | 1077 | if line_data.content_sequence: # Check if we have processed_content | CODE |
| LOW | docreader/parser/doc_parser.py | 220 | # Check if antiword is installed | COMMENT |
| LOW | docreader/parser/doc_parser.py | 258 | # Check if LibreOffice or OpenOffice is installed | COMMENT |
| LOW | docreader/parser/doc_parser.py | 354 | # Check if path is set in environment variable | COMMENT |
| LOW | scripts/migrate.sh | 26 | # Check if migrate tool is installed | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | config/prompt_templates/fallback.yaml | 84 | content: "Sorry, I'm unable to answer this question at the moment. Please try rephrasing your question, or contact c | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docreader/auth.py | 129 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/build-anydoc-lib.sh | 8 | # Usage: | COMMENT |