diff --git a/crates/core/src/setting/keys.rs b/crates/core/src/setting/keys.rs index 7cba6a7..7b860c7 100644 --- a/crates/core/src/setting/keys.rs +++ b/crates/core/src/setting/keys.rs @@ -37,8 +37,9 @@ pub const JAVA_INSTALL_ROOT_UNSET: &str = ""; /// 必须同一份集合(setting 层不依赖 game 层),一致性由 `tests/setting/java_install_keys.rs` 守。 pub const JDK_VENDORS: &[&str] = &["temurin", "oracle", "microsoft", "zulu", "termux"]; -/// 拆到各自文件的键域:中文字体 CDN(M168)/ 自更新(M161)/ 代理与 gh-proxy(M197)。 -/// 主表各留一行登记。 +/// 拆到各自文件的键域:中文字体 CDN(M168)/ 自更新(M161)/ 代理与 gh-proxy(M197)/ +/// 下载调优四键(M292)。主表各留一行登记。 +pub mod download; pub mod font; pub mod proxy; pub mod update; @@ -106,34 +107,9 @@ pub fn launcher_schema() -> SettingSchema { AiPolicy::sensitive(), "实例默认隔离模式:isolated(运行目录派生 versions/<版本 id>,D20 默认)/ shared(所有实例共用 .minecraft 根)", )) - .with(SettingSpec::int( - "download.concurrency", - crate::download::config::DEFAULT_MAX_CONCURRENCY as i64, - (1, crate::download::config::MAX_CONCURRENCY as i64), - AiPolicy::silent(), - "同时下载的文件数(1~64,出厂 8)。这是引擎真实持有的并发许可,不是展示值;越界或手改坏值按出厂值生效", - )) - .with(SettingSpec::int( - "download.retry_limit", - crate::download::config::DEFAULT_MAX_ATTEMPTS_PER_SOURCE as i64, - (0, crate::download::config::MAX_ATTEMPTS_PER_SOURCE as i64), - AiPolicy::silent(), - "单个下载源的最多尝试次数(含首次;出厂 3)。0 与 1 都等于「只试一次、不重试」——0 是旧版 GUI 提供过的档位,保留合法但不代表「不下载」。换源不受此限", - )) - .with(SettingSpec::enumeration( - "download.region", - "auto", - REGIONS, - AiPolicy::audited(), - "下载地区判定:auto(时区+语言+探测)/ cn / global", - )) - .with(SettingSpec::enumeration( - "download.mirror_preference", - "auto", - MIRROR_PREFERENCES, - AiPolicy::audited(), - "镜像偏好:auto(健康度评分)/ official(官方源优先)/ mirror(镜像优先)", - )) + // M292:下载调优四键(并发 / 单源尝试次数 / 地区 / 镜像偏好)搬到 [`download`]——主表这一行 + // 代替原先四条 `.with(..)`,登记顺序与搬到那边之前逐项相同。 + .with_all(download::specs()) // M197:代理与 gh-proxy 三键(`download.proxy_mode` / `proxy_url` / `gh_proxy`)搬到 // [`proxy`]——主表这一段的注释也一起搬过去,见那个模块的表格。 .with_all(proxy::specs()) diff --git a/crates/core/src/setting/keys/download.rs b/crates/core/src/setting/keys/download.rs new file mode 100644 index 0000000..ff21e79 --- /dev/null +++ b/crates/core/src/setting/keys/download.rs @@ -0,0 +1,49 @@ +//! `download.*` 的基础四键(M292 从 `keys.rs` 纯搬移拆出:那边 396 行、贴着 400 行硬线)。 +//! +//! 搬移范围与顺序都未改:并发 / 单源尝试次数 / 地区判定 / 镜像偏好,四项逐字搬来,主表只留 +//! `.with_all(download::specs())` 一行。语义与「谁消费」仍写在各自的 `doc` 里(那是给界面与 +//! AI 的 JSON Schema `description`,不是本文件的注释),所以这里不再抄第二份。 +//! +//! 与 [`super::proxy`] 的分工:代理 / gh-proxy 三个键在那边(它们问的是「怎么把包拿到手」, +//! 而本文件这四个问的是「怎么排队、怎么重试、从哪个源拿」)。M292 新增的三个超时键 +//! (吞吐下限 / 无进展窗口 / 单次请求上界)也登记在本文件,它们与并发、重试同属「下载调优」, +//! 而**改它们的代价**只写在一处:`core::download::stall` 的模块头。 + +use crate::setting::spec::{AiPolicy, SettingSpec}; + +use super::{MIRROR_PREFERENCES, REGIONS}; + +/// 四个基础键的完整登记项(主表一行 `.with_all(download::specs())`)。 +#[must_use] +pub fn specs() -> Vec { + vec![ + SettingSpec::int( + "download.concurrency", + crate::download::config::DEFAULT_MAX_CONCURRENCY as i64, + (1, crate::download::config::MAX_CONCURRENCY as i64), + AiPolicy::silent(), + "同时下载的文件数(1~64,出厂 8)。这是引擎真实持有的并发许可,不是展示值;越界或手改坏值按出厂值生效", + ), + SettingSpec::int( + "download.retry_limit", + crate::download::config::DEFAULT_MAX_ATTEMPTS_PER_SOURCE as i64, + (0, crate::download::config::MAX_ATTEMPTS_PER_SOURCE as i64), + AiPolicy::silent(), + "单个下载源的最多尝试次数(含首次;出厂 3)。0 与 1 都等于「只试一次、不重试」——0 是旧版 GUI 提供过的档位,保留合法但不代表「不下载」。换源不受此限", + ), + SettingSpec::enumeration( + "download.region", + "auto", + REGIONS, + AiPolicy::audited(), + "下载地区判定:auto(时区+语言+探测)/ cn / global", + ), + SettingSpec::enumeration( + "download.mirror_preference", + "auto", + MIRROR_PREFERENCES, + AiPolicy::audited(), + "镜像偏好:auto(健康度评分)/ official(官方源优先)/ mirror(镜像优先)", + ), + ] +}