This report summarizes scanner evidence for zerx-lab/FluxDown. SynthScan examined 858,450 lines of code across 2646 source files, recording 1539 pattern matches distributed across 13 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? 1016 finding(s).
Are imports declared and package/API names verified? 50 finding(s).
Are wrappers, guards, and repeated structures necessary? 519 finding(s).
Which changes need focused human review? 1539 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 1539 distinct pattern matches across 13 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 | website-v2/docker-build-save.sh | 2 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/docker-build-save.sh | 17 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/docker-build-save.sh | 35 | # ── 1. 构建镜像 ────────────────────────────── | COMMENT |
| MEDIUM | website-v2/docker-build-save.sh | 45 | # ── 2. 保存镜像到文件 ──────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 2 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 17 | # ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 31 | # ── Docker 调用自适应 sudo ──────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 47 | # ── 1. 拉取最新代码 ────────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 66 | # ── 2. 重建镜像 ────────────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 70 | # ── 3. 重启容器 ────────────────────────────── | COMMENT |
| MEDIUM | website-v2/deploy.sh | 81 | # ── 4. 清理悬空镜像 ────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/lib/pay.ts | 162 | // ── Paid-order store (ephemeral, for frontend success signal) ────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 8 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 18 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 34 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 36 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 270 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 272 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 326 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 334 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 359 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 361 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 394 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 396 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 450 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 452 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 487 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 489 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 548 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 550 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 774 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/feature-vote.ts | 776 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/logo-vote.ts | 394 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/logo-vote.ts | 396 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/logo-vote.ts | 405 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/logo-vote.ts | 407 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 8 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 11 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 61 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 63 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 79 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 81 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 268 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 270 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 327 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 329 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 363 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 365 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 429 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 436 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 508 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 510 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 636 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/logo-vote.ts | 638 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/roadmap.ts | 6 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/roadmap.ts | 24 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/roadmap.ts | 34 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | website-v2/src/pages/api/roadmap.ts | 36 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/roadmap.ts | 134 | // ───────────────────────────────────────────── | COMMENT |
| MEDIUM | website-v2/src/pages/api/roadmap.ts | 136 | // ───────────────────────────────────────────── | COMMENT |
| 407 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Cargo.toml | 81 | # 全部 release 产物(GPUI 桌面端、agent、fluxdownd、CLI、原生移动端核心、nmh、 | COMMENT |
| LOW | packaging/synology/build_spk.sh | 1 | #!/bin/sh | COMMENT |
| LOW | packaging/openwrt/build.sh | 1 | #!/bin/sh | COMMENT |
| LOW | website-v2/docker-build-save.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | website-v2/deploy.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | website-v2/src/pages/api/feature-vote.ts | 1 | import type { APIRoute } from "astro"; | COMMENT |
| LOW | website-v2/src/pages/api/roadmap.ts | 1 | import type { APIRoute } from "astro"; | COMMENT |
| LOW | crates/settings/src/ui.rs | 1 | //! 设置页的自有布局原语:分类页 → 子 Tab → 分组卡片 → 设置行。 | COMMENT |
| LOW | crates/plugin_ui/src/lib.rs | 1 | //! 插件界面 capability,两层: | COMMENT |
| LOW | crates/app/src/app_icon.rs | 1 | //! 应用图标(Dock / Cmd-Tab / 任务栏 / 窗口管理器 / 标题栏):默认、内置「闪电」或用户导入的图片, | COMMENT |
| LOW | crates/app/src/app_icon.rs | 41 | /// `_NET_WM_ICON` 按 u32 逐像素塞进窗口属性,256² 足够任务栏 / 切换器使用。 | COMMENT |
| LOW | crates/app/src/preference_writes.rs | 1 | //! 单条 agent 连接上在途的 `agent.preferences.patch` 写入覆盖层。 | COMMENT |
| LOW | crates/app/src/logging.rs | 1 | //! 界面进程诊断日志:`<agent 数据目录>/logs/desktop.log`(与 `agent.log` 同目录,Doctor | COMMENT |
| LOW | crates/app/src/lifecycle.rs | 1 | //! 桌面进程的两种退出,与 agent 驻留策略(`AgentSnapshot.shell.resident`)配合: | COMMENT |
| LOW | crates/shell/src/window_controls.rs | 1 | //! 固定尺寸辅助窗口的自绘标题栏:Windows / Linux 上只提供最小化与关闭,不画最大化。 | COMMENT |
| LOW | crates/components/src/kit.rs | 1 | //! 全应用共用的控件规格:按钮 / 输入框统一高度与字号、分段标签、复选行。 | COMMENT |
| LOW | crates/components/src/busy.rs | 1 | //! 手动触发的异步动作的「进行中」最短可见时长。 | COMMENT |
| LOW | crates/components/src/motion.rs | 1 | //! 交互动效原语:按钮状态层(悬停 / 按下 / 选中的底色过渡)、随选中项滑动的高亮底块与 | COMMENT |
| LOW | crates/theme/src/cjk.rs | 1 | //! 汉字字体:按界面语言(简 / 繁)选主字体与缺字回退链。 | COMMENT |
| LOW | crates/theme/src/extended.rs | 1 | //! FluxDown 自有的扩展语义 token。 | COMMENT |
| LOW | crates/downloads/src/deletion.rs | 1 | //! 大批量删除本地任务:分块 `daemon.task.deleteMany`、进度、取消与结果汇总。 | COMMENT |
| LOW | crates/downloads/src/components/task_table.rs | 801 | /// queue_id → 名称(列 / 分组标签)。 | COMMENT |
| LOW | crates/downloads/src/components/task_table.rs | 3821 | /// 表格指针事件监听:只记录活动时刻,不写表格 entity、不触发重绘。 | COMMENT |
| LOW | crates/downloads/src/model/shutdown.rs | 1 | //! 完成后关机:跨 `downloads` / `app` 边界的最小共享契约。 | COMMENT |
| LOW | crates/downloads/src/model/refresh_gate.rs | 1 | //! 事件驱动刷新的合并:任务进度 / 运行态事件频繁(每个活跃任务约 500ms 一条,session 一批 | COMMENT |
| LOW | crates/downloads/src/model/aria2c.rs | 1 | //! aria2c 命令行解析(#299):粘贴 `aria2c ...` 命令文本即可建任务。 | COMMENT |
| LOW | crates/downloads/src/model/new_download.rs | 81 | /// `scheme://host/a/b.zip?x#y` → `b.zip`;无路径或以 `/` 结尾时为 `None`。 | COMMENT |
| LOW | crates/downloads/src/model/save_dir_category.rs | 1 | //! 「新建下载」保存目录的分类下拉:预测目录、选项列表与「自动」模式的跟随判定。 | COMMENT |
| LOW | crates/downloads/src/model/progress_window.rs | 1 | //! 独立下载进度 / 完成窗口的开关决策(纯状态机,不碰窗口与会话)。 | COMMENT |
| LOW | crates/downloads/src/pages/new_download/category.rs | 1 | //! 保存目录的分类下拉:按识别出的文件名预测分类目录并让目录框自动跟随, | COMMENT |
| LOW | crates/command_palette/src/matcher.rs | 1 | //! 查询匹配与打分:模糊子序列 + 拼音(全拼 / 首字母 / 混拼,含多音字)。 | COMMENT |
| LOW | docker/docker-compose.yml | 1 | # FluxDown Server 部署(fluxdown-agent --server + fluxdownd;Web UI + /rpc JSON-RPC + 兼容 HTTP API) | COMMENT |
| LOW | docker/docker-compose.yml | 21 | # NAS 硬盘休眠:/data 会承载 SQLite、日志与 BT 会话状态,建议映射到 SSD / 缓存池 | COMMENT |
| LOW | native/agent/Cargo.toml | 61 | [target.'cfg(windows)'.dependencies] | COMMENT |
| LOW | native/agent/build.rs | 1 | //! 构建期把 Web SPA 产物嵌入服务器二进制,实现单文件分发(下载即运行, | COMMENT |
| LOW | native/agent/src/category_dir.rs | 1 | //! 外部捕获的分类保存目录:由 `custom_categories` 偏好构建随建任务交给 daemon 的路由规则 | COMMENT |
| LOW | native/agent/src/remote.rs | 2421 | #[error("daemon remote command failed: {0:?}")] | COMMENT |
| LOW | native/agent/src/remote.rs | 2821 | #[derive(Clone, Copy, Default, Eq, PartialEq)] | COMMENT |
| LOW | native/agent/src/device_identity.rs | 1 | //! 本机设备身份探测:真实主机名,以及 Flutter 时代 `cloud_device_id` 的一次性沿用。 | COMMENT |
| LOW | native/agent/src/system_proxy.rs | 1 | //! agent 自身外网客户端「跟随系统代理」的显式装配。 | COMMENT |
| LOW | native/agent/src/server_mode.rs | 1 | //! `fluxdown-agent --server`:headless(NAS / 服务器)宿主形态。 | COMMENT |
| LOW | native/agent/src/permission.rs | 1 | //! Doctor 权限修复的执行层。 | COMMENT |
| LOW | native/agent/src/task_events.rs | 1 | //! 兼容 API 的任务生命周期事件(aria2 WS 通知源)与实时速率。 | COMMENT |
| LOW | native/agent/src/event_pump.rs | 1 | //! WebSocket 事件转发:广播接收与套接字写入解耦,落后的订阅者靠合并而非断线追赶。 | COMMENT |
| LOW | native/agent/src/sync.rs | 1 | //! 配置同步:目录 ownership、pull-before-push、dirty/tombstone、self-echo 与「本机专属」状态机。 | COMMENT |
| LOW | native/agent/src/sync.rs | 961 | }) | COMMENT |
| LOW | native/agent/src/sync.rs | 1301 | COMMENT | |
| LOW | native/agent/src/embedded.rs | 61 | #[error("agent data directory {} is owned by another fluxdown-agent", .0.display())] | COMMENT |
| LOW | native/agent/src/web_assets.rs | 1 | //! 嵌入式 Web SPA 托管 —— 构建期由 `build.rs` 把 `web/dist` 全量 `include_bytes!` | COMMENT |
| LOW | native/agent/src/bundle_watch.rs | 1 | //! 桌面宿主:自身程序文件消失后完全退出。 | COMMENT |
| LOW | native/agent/src/nmh.rs | 921 | } | COMMENT |
| LOW | native/agent/src/nmh.rs | 1001 | /// 中继可执行文件绝对路径;空表示未找到。 | COMMENT |
| LOW | native/agent/src/update/mod.rs | 1 | //! 应用内更新:检查 → 后台下载并校验 → 一键安装并重启。 | COMMENT |
| LOW | native/agent/src/update/restart.rs | 1 | //! 重启计划:登记后,agent 运行期**完全结束**(daemon 已退出、`agent.lock` 已释放)再由 | COMMENT |
| LOW | native/agent/src/update/install/macos.rs | 1 | //! macOS:整体替换外层 `FluxDown.app`。 | COMMENT |
| LOW | native/agent/src/update/install/detect.rs | 1 | //! 安装形态检测:把「环境事实」([`Facts`])纯函数式地映射为 [`InstallTarget`]。 | COMMENT |
| LOW | native/agent/src/update/install/mod.rs | 1 | //! 更新安装:按安装形态检测 → 预检 → 替换程序文件 → 返回重启计划。 | COMMENT |
| LOW | native/agent/src/update/install/mod.rs | 121 | #[error("{context}: {source}")] | COMMENT |
| LOW | native/agent/src/shell/mod.rs | 1 | //! agent 系统外壳:托盘可用性、关闭全部 UI 后的驻留策略、按需拉起桌面程序。 | COMMENT |
| LOW | native/agent/src/shell/prompt_launch.rs | 1 | //! agent 为待确认交互(外部捕获 / 引擎选择)、下载提示窗口与新版本提醒拉起官方 UI 的记账。 | COMMENT |
| 861 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | crates/extensions/src/pages/market_favorites.rs | 311 | self.plugins.market.favorites.load_failed.then(|| { | CODE |
| CRITICAL | crates/theme/src/manager.rs | 362 | let theme_body_size = theme.base.typography.sm.size.as_f32() / appearance.ui_scale(); | CODE |
| CRITICAL | web/src/pages/settings/sections/bt/guard/GuardBans.tsx | 131 | const feed = useGuardFeed<BtGuardEntryDto>((offset, limit) => rpc.daemon.bt.guard.entries.list({ ...entriesQuery(filte | CODE |
| CRITICAL | web/src/pages/settings/sections/bt/guard/GuardBans.tsx | 176 | for (const chunk of chunkIds(targets)) removed += (await rpc.daemon.bt.guard.entries.remove({ ids: chunk })).rem | CODE |
| CRITICAL | web/src/pages/settings/sections/bt/guard/GuardBans.tsx | 190 | await rpc.daemon.bt.guard.entries.add({ cidr: entry.cidr, action: 'allow', reason: '' }) | CODE |
| CRITICAL | …rc/pages/settings/sections/bt/guard/AddEntryDialog.tsx | 38 | await rpc.daemon.bt.guard.entries.add({ | CODE |
| CRITICAL | …b/src/pages/settings/sections/bt/guard/GuardEvents.tsx | 53 | const feed = useGuardFeed<BtGuardEventDto>((offset, limit) => rpc.daemon.bt.guard.events.list({ ...eventsQuery(filter, | CODE |
| CRITICAL | web/src/pages/downloads/detail/BtPeerGuard.tsx | 121 | Promise.all([rpc.daemon.bt.guard.entries.list(entriesQuery), rpc.daemon.bt.guard.events.list(eventsQuery)]).then( | CODE |
| CRITICAL | web/src/pages/downloads/detail/peerGuardActions.ts | 31 | await rpc.daemon.bt.guard.entries.add(peerCommandParams(group, command)) | CODE |
| CRITICAL | …n/FluxDown/Features/Settings/NotificationService.swift | 624 | let info = response.notification.request.content.userInfo.reduce(into: [String: String]()) { result, pair in | CODE |
| CRITICAL | …/src/main/java/com/fluxdown/app/actions/TaskActions.kt | 295 | task.status == TaskStatus.Completed -> nav.push(com.fluxdown.app.nav.Route.TaskDetail(task.taskId)) | CODE |
| CRITICAL | …down/app/feature/settings/extensions/ExtensionsPage.kt | 194 | yanked = com.fluxdown.core.protocol.PluginMarket.installedVersionYanked(model.ma | CODE |
| CRITICAL | …/com/fluxdown/app/feature/settings/bt/BtGuardSheets.kt | 355 | private fun com.fluxdown.fluxui.controls.GlassSectionScope.detailRow(title: String, value: String) { | CODE |
| CRITICAL | …m/fluxdown/app/feature/settings/service/WebhookPage.kt | 131 | val log = remember(rawLog) { WebhookDelivery.parseList(com.fluxdown.core.protocol.Json.parseOrNull(rawLog)) } | CODE |
| CRITICAL | …m/fluxdown/app/feature/settings/service/WebhookPage.kt | 965 | com.fluxdown.core.protocol.Json.parseOrNull(ctx.state.sections[HostSection.daemonWebhookDeliveries]), | CODE |
| CRITICAL | …java/com/fluxdown/app/feature/devices/DevicesScreen.kt | 262 | private fun com.fluxdown.core.store.HostState.toFacts(): HostFacts { | CODE |
| CRITICAL | …c/main/java/com/fluxdown/fluxui/controls/FluxSlider.kt | 215 | drawCircle(Color.Black.copy(alpha = 0.12f), tr - 0.25.dp.toPx(), Offset(tx, cy), style = androidx.compose.ui | CODE |
| CRITICAL | …uxui/src/main/java/com/fluxdown/fluxui/data/TaskRow.kt | 410 | horizontalArrangement = androidx.compose.foundation.layout.Arrangement.spacedBy(8.dp), | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | web/src/shell/useVisibleActivityEntries.ts | 19 | export function useVisibleActivityEntries(): ActivityEntry[] { | CODE |
| LOW | web/src/lib/saveDirHistory.ts | 36 | export function readCategorySaveDirHistory(value: unknown): Record<string, string[]> { | CODE |
| LOW | web/src/lib/rpc/apply.ts | 860 | export function serviceEventReloadsTables(event: ServiceEvent): boolean { | CODE |
| LOW | web/src/lib/rpc/reload.ts | 13 | export function shouldReloadForVersionChange(previous: string | null, next: string): boolean { | CODE |
| LOW | web/src/lib/rpc/reload.ts | 18 | export function shouldReloadOnIncompatible(lastReloadAt: number | null, now: number): boolean { | CODE |
| LOW | web/src/pages/downloads/model/actions.ts | 355 | export async function confirmDeleteGroupWithFiles(groupId: string, groupName: string): Promise<boolean> { | CODE |
| LOW | web/src/pages/downloads/dialogs/fileConflict.ts | 79 | export function useDismissedFileConflicts(): ReadonlySet<string> { | CODE |
| LOW | web/src/pages/downloads/dialogs/manifest.ts | 320 | export function manifestInvertVisibleSelection( | CODE |
| LOW | web/src/pages/downloads/dialogs/manifest.ts | 411 | export function manifestAdvancedOptionsDirty(options: ManifestAdvancedOptions): boolean { | CODE |
| LOW | fluxDown/background/menus.ts | 58 | export function extractSelectionDownloadUrl(raw: string | undefined): string | null { | CODE |
| LOW | fluxDown/background/settings-cache.ts | 80 | export function installSettingsCacheListener(): void { | CODE |
| LOW | fluxDown/background/android-handoff.ts | 76 | export function androidSendDownloadRequest(request: DownloadRequest): Promise<ApiResponse> { | CODE |
| LOW | fluxDown/background/android-handoff.ts | 81 | export async function androidSendBatchDownloadRequest(items: BatchDownloadItem[]): Promise<ApiResponse> { | CODE |
| LOW | fluxDown/background/browser-downloads.ts | 149 | export function installBrowserDownloadNotices(): void { | CODE |
| LOW | fluxDown/background/intercept.ts | 102 | async function decodeDispositionWithPageCharset( | CODE |
| LOW | fluxDown/background/intercept.ts | 120 | export function resolveResponseDispositionFilename( | CODE |
| LOW | fluxDown/background/intercept.ts | 267 | async function startFallbackInterception( | CODE |
| LOW | fluxDown/background/intercept.ts | 890 | function isFirefoxInlineViewableType(contentType: string): boolean { | CODE |
| LOW | fluxDown/background/intercept.ts | 1148 | export function setInterceptListenersActive(active: boolean): void { | CODE |
| LOW | fluxDown/background/index.ts | 65 | function broadcastPageConfigChanged(): void { | CODE |
| LOW | fluxDown/background/sw-scopes.ts | 49 | export function rememberServiceWorkerScope(scope: string): void { | CODE |
| LOW | fluxDown/background/tasks.ts | 54 | export function maybeArmTaskPollForChannel(channel?: "local" | "remote"): void { | CODE |
| LOW | fluxDown/background/tasks.ts | 108 | function extractTaskIdFromNotificationId( | CODE |
| LOW | fluxDown/background/tasks.ts | 153 | async function processTasksPollResultInner( | CODE |
| LOW | fluxDown/background/sender.ts | 312 | export async function fallbackToBrowserDownload( | CODE |
| LOW | fluxDown/utils/filename.ts | 59 | export function dispositionNeedsPageCharset( | CODE |
| LOW | fluxDown/utils/filename.ts | 531 | export function parseContentDispositionFilename( | CODE |
| LOW | fluxDown/utils/connection-diagnostics.ts | 12 | export function recordConnectionDiagnostic(event: ConnectionDiagnostic): void { | CODE |
| LOW | fluxDown/utils/connection-diagnostics.ts | 30 | export async function exportConnectionDiagnostics(): Promise<void> { | CODE |
| LOW | fluxDown/utils/media-candidates.ts | 134 | function isCompleteFragmentResource(resource: DetectedResource): boolean { | CODE |
| LOW | fluxDown/utils/remote-server.ts | 127 | export async function remoteSendDownloadRequest( | CODE |
| LOW | fluxDown/utils/remote-server.ts | 135 | export async function remoteSendBatchDownloadRequest( | CODE |
| LOW | fluxDown/utils/settings.ts | 491 | export async function ensureRemoteSettingsVerified( | CODE |
| LOW | fluxDown/utils/error-log-background.ts | 13 | export function installBackgroundErrorLog(): void { | CODE |
| LOW | fluxDown/utils/native-messaging.ts | 329 | async function nmhSendBatchDownloadLegacy( | CODE |
| LOW | fluxDown/utils/native-messaging.ts | 399 | export async function nmhSendBatchDownloadRequest( | CODE |
| LOW | fluxDown/utils/native-messaging.ts | 524 | export async function nmhCheckFluxDownAvailable(): Promise<boolean> { | CODE |
| LOW | fluxDown/utils/native-messaging.ts | 537 | export async function nmhCheckFluxDownAvailableWithRetry(): Promise<boolean> { | CODE |
| LOW | fluxDown/utils/download-dispatch.ts | 261 | async function remoteSendBatchPreservingAudio( | CODE |
| LOW | fluxDown/utils/download-dispatch.ts | 420 | export async function checkFluxDownAvailableWithRetry(): Promise<boolean> { | CODE |
| LOW | fluxDown/utils/sniff-limit.ts | 12 | export function normalizeSniffMaxResources(value: unknown): number { | CODE |
| LOW | fluxDown/utils/download-cancellation.ts | 22 | export async function cancelBeforeFilenameResolution( | CODE |
| LOW | fluxDown/utils/connection-diagnostics-background.ts | 13 | export function installConnectionDiagnostics() { | CODE |
| LOW | fluxDown/utils/resource-debug-log.ts | 350 | export function stringifyResourceDebugLog(log: ResourceDebugLog): string { | CODE |
| LOW | userscript/fluxdown.user.js | 336 | function isDownloadableContentType(ct) { | CODE |
| LOW | userscript/fluxdown.user.js | 774 | function scanPerformanceForStreams() { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | native/engine/src/download_manager.rs | 1811 | // Step 1: DB 复读;存储故障不能被当成「尚无名字」继续落盘。 | COMMENT |
| LOW | native/engine/src/download_manager.rs | 1828 | // Step 2: probe(名称仍未知时)。hint 任务(浏览器扩展 / 插件给了大小)不探测: | COMMENT |
| LOW | native/engine/src/download_manager.rs | 1890 | // Step 3: HLS 归一化为 .ts。force_ts_extension 幂等;HLS 下载器内仍保留 | COMMENT |
| LOW | native/engine/src/download_manager.rs | 2119 | // Step 4: dedup + 预订。磁盘探测在锁外(阻塞池)完成,锁内只核对 / 插入预订集合, | COMMENT |
| LOW | native/engine/src/download_manager.rs | 2140 | // Step 5: dedup 改名落库。 | COMMENT |
| LOW⚡ | native/engine/src/proxy_config.rs | 1318 | // Step 1: Greeting — tell proxy which auth methods we support | COMMENT |
| LOW⚡ | native/engine/src/proxy_config.rs | 1328 | // Step 2: Read method selection | COMMENT |
| LOW | native/engine/src/proxy_config.rs | 1365 | // Step 3: CONNECT request | COMMENT |
| LOW | native/engine/src/proxy_config.rs | 1388 | // Step 4: Read CONNECT response | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4292 | // Step 0: sparse 标记必须先于任何 set_len / 写入。失败只记日志, | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4306 | // Step 1: sparse 不可用时尽量预留物理簇;失败记日志后继续设置 EOF, | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4335 | // Step 2: 设置逻辑 EOF——后续 seek+write 依赖此值 | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 69 | // Step 1: If the target task is currently waiting in pending_queue, extract it | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 82 | // Step 2: Auto-pause all currently active tasks (except the target itself, | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 107 | // Step 3: Pause all remaining tasks in the pending queue (excluding the target). | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 119 | // Step 4: Mop up — drain_queue() calls in step 2/3 may have promoted additional | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 134 | // Step 5: Ensure the target task is downloading. | COMMENT |
| LOW | .github/workflows/release.yml | 675 | # Step 1: 提交 AMO 市场版本(X.Y.Z),continue-on-error 不阻塞 Release | COMMENT |
| LOW | .github/workflows/release.yml | 688 | # Step 2: 将 manifest 版本改为 X.Y.Z.1,unlisted 签名产出 GitHub Release 用 XPI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | native/engine/src/download_manager.rs | 1811 | // Step 1: DB 复读;存储故障不能被当成「尚无名字」继续落盘。 | COMMENT |
| LOW | native/engine/src/download_manager.rs | 1828 | // Step 2: probe(名称仍未知时)。hint 任务(浏览器扩展 / 插件给了大小)不探测: | COMMENT |
| LOW | native/engine/src/download_manager.rs | 1890 | // Step 3: HLS 归一化为 .ts。force_ts_extension 幂等;HLS 下载器内仍保留 | COMMENT |
| LOW | native/engine/src/download_manager.rs | 2119 | // Step 4: dedup + 预订。磁盘探测在锁外(阻塞池)完成,锁内只核对 / 插入预订集合, | COMMENT |
| LOW | native/engine/src/download_manager.rs | 2140 | // Step 5: dedup 改名落库。 | COMMENT |
| LOW⚡ | native/engine/src/proxy_config.rs | 1318 | // Step 1: Greeting — tell proxy which auth methods we support | COMMENT |
| LOW⚡ | native/engine/src/proxy_config.rs | 1328 | // Step 2: Read method selection | COMMENT |
| LOW | native/engine/src/proxy_config.rs | 1365 | // Step 3: CONNECT request | COMMENT |
| LOW | native/engine/src/proxy_config.rs | 1388 | // Step 4: Read CONNECT response | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4292 | // Step 0: sparse 标记必须先于任何 set_len / 写入。失败只记日志, | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4306 | // Step 1: sparse 不可用时尽量预留物理簇;失败记日志后继续设置 EOF, | COMMENT |
| LOW | native/engine/src/segment_coordinator.rs | 4335 | // Step 2: 设置逻辑 EOF——后续 seek+write 依赖此值 | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 69 | // Step 1: If the target task is currently waiting in pending_queue, extract it | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 82 | // Step 2: Auto-pause all currently active tasks (except the target itself, | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 107 | // Step 3: Pause all remaining tasks in the pending queue (excluding the target). | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 119 | // Step 4: Mop up — drain_queue() calls in step 2/3 may have promoted additional | COMMENT |
| LOW | native/engine/src/download_manager/boost.rs | 134 | // Step 5: Ensure the target task is downloading. | COMMENT |
| LOW | .github/workflows/release.yml | 675 | # Step 1: 提交 AMO 市场版本(X.Y.Z),continue-on-error 不阻塞 Release | COMMENT |
| LOW | .github/workflows/release.yml | 688 | # Step 2: 将 manifest 版本改为 X.Y.Z.1,unlisted 签名产出 GitHub Release 用 XPI | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | crates/plugin_ui/src/portable/render.rs | 879 | .when_some(opt_str_prop(node, "placeholder"), |this, text| { | CODE |
| LOW | crates/plugin_ui/src/portable/render.rs | 957 | let placeholder = opt_str_prop(node, "placeholder").map(str::to_owned); | CODE |
| LOW | crates/plugin_ui/src/portable/render.rs | 1022 | let placeholder = opt_str_prop(node, "placeholder").map(str::to_owned); | CODE |
| LOW | crates/account/src/dialogs/email.rs | 549 | email_error(" USER@example.com ", "user@example.com"), | CODE |
| LOW | native/agent/src/remote.rs | 3541 | "id": "u1", "email": "user@example.com", "nickname": "User", | CODE |
| LOW | native/agent/src/device_meta.rs | 239 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/sync.rs | 1913 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/sync.rs | 2362 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/cloud/client.rs | 1352 | "email": "user@example.com", | CODE |
| LOW | native/agent/src/cloud/client.rs | 1635 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/cloud/client.rs | 1669 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/cloud/client.rs | 1986 | "user": { "id": user_id, "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/cloud/client.rs | 2007 | "user": { "id": "u1", "email": "user@example.com" }, | CODE |
| LOW | native/agent/src/cloud/auth.rs | 182 | "email": "user@example.com", | CODE |
| LOW | native/agent/src/cloud/auth.rs | 229 | .login(&json!({ "account": "user@example.com", "password": "secret" })) | CODE |
| LOW | native/agent/src/cloud/auth.rs | 235 | assert_eq!(session.user.email, "user@example.com"); | CODE |
| LOW | native/protocol/tests/protocol/agent_wire_safety.rs | 43 | email: "user@example.com".to_owned(), | CODE |
| LOW | native/protocol/src/plugin_view_schema.json | 186 | "placeholder": { "type": "string" }, | CODE |
| LOW | native/protocol/src/plugin_view_schema.json | 195 | "placeholder": { "type": "string" }, | CODE |
| LOW | native/protocol/src/plugin_view_schema.json | 208 | "placeholder": { "type": "string" }, | CODE |
| LOW | native/protocol/src/agent.rs | 1757 | "email": "user@example.com", | CODE |
| LOW | native/protocol/src/agent.rs | 1767 | assert_eq!(profile.user.email, "user@example.com"); | CODE |
| LOW | web/src/pages/plugins/view/nodes/controls.tsx | 64 | placeholder={optStr(node.p, 'placeholder')} | CODE |
| LOW | web/src/pages/plugins/view/nodes/controls.tsx | 79 | placeholder={optStr(node.p, 'placeholder')} | CODE |
| LOW | web/src/pages/plugins/view/nodes/controls.tsx | 100 | placeholder={optStr(node.p, 'placeholder')} | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/test_file_server.py | 107 | except (BrokenPipeError, ConnectionResetError): | CODE |
| HIGH | scripts/send_notify.py | 328 | except Exception: | CODE |
| HIGH | scripts/send_notify.py | 189 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/test_file_server.py | 86 | CODE | |
| LOW | scripts/lint-changed.py | 106 | CODE | |
| LOW | scripts/lint-changed.py | 162 | CODE | |
| LOW | scripts/lint-changed.py | 231 | CODE | |
| LOW | .github/scripts/cws_crx.py | 105 | CODE | |
| LOW | .github/scripts/release_notify_qq.py | 58 | CODE | |
| LOW | .github/scripts/release_gate.py | 34 | CODE | |
| LOW | .github/scripts/check_ci_paths.py | 71 | CODE | |
| LOW | .github/scripts/check_ci_paths.py | 108 | CODE | |
| LOW | .github/scripts/check_ci_paths.py | 157 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | mobile/FluxDown/scripts/asc.py | 18 | CODE | |
| LOW | scripts/test_file_server.py | 39 | CODE | |
| LOW | scripts/test_file_server.py | 40 | CODE | |
| LOW | scripts/lint-changed.py | 35 | CODE | |
| LOW | .github/scripts/cws_crx.py | 21 | CODE | |
| LOW | .github/scripts/release_publish.py | 25 | CODE | |
| LOW | .github/scripts/check_ci_paths.py | 18 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Cargo.toml | 1 | # This file is used for telling Rust-related tools | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/send_notify.py | 189 | except Exception: | CODE |
| LOW | scripts/send_notify.py | 328 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | mobile/FluxDown/scripts/asc.py | 141 | def set_whats_new(client: Client, build_id: str, text: str) -> None: | CODE |