nyaKazuha
bd1e1a06f2
feat(resource): 增加历史 release 与 CAS 复用
...
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s
Closes #47
2026-09-02 01:26:53 +08:00
nyaKazuha
2b053e247d
fix: 抽象官方库存与 sidecar hash 策略
2026-08-02 23:12:25 +08:00
nyaKazuha
ba28e067c9
fix: 明确并发下载报告按计划顺序输出
2026-08-02 22:47:21 +08:00
nyaKazuha
8b64cc94f3
fix: 完成下载并发与翻译交接链路
2026-08-02 22:34:23 +08:00
nyaKazuha
99e6b3a23a
fix(sync): 立即校验官方 hash sidecar
2026-07-31 13:12:21 +08:00
nyaKazuha
16e73327b4
fix(sync): 补齐发布清理与校验进度
2026-07-31 13:00:53 +08:00
nyaKazuha
2079c6a307
feat(sync): 接入解析缓存与汉化发布前置
...
补齐官方 release 解析缓存、TextUnit 明细索引、资源变更集、Crowdin handoff 预留、ResourceRepository 导入元数据和 localized release patch 前置链路。
同时开放文件级 patch.apply 与 UnityFS TextAsset/string/semantic field patch CLI/RPC 入口,并保留官方原版资源与汉化产物双目录发布状态。
验证:cargo test -p bat-assetbundle --locked;cargo clippy -p bat-assetbundle --all-targets --locked -- -D warnings;cargo test -p bat-infrastructure --locked。
2026-07-31 00:38:45 +08:00
nyaKazuha
a729615a48
fix(sync): 移除多线程下载并补齐staging复用回归
2026-07-24 10:34:58 +08:00
nyaKazuha
3f5d2a8da7
fix(sync): 修复官方资源并发下载与媒体路径
...
bat-rust / Build and test Rust (push) Successful in 3m47s
daemon 子进程现会透传下载并发配置,下载进度按已完成数量单调上报。MediaCatalog 改为使用官方相对路径生成全局媒体 URL,覆盖 GameData、Prologue 等目录并补齐 jpg 资源,避免叶子文件名误拼媒体根目录导致 403。同步更新测试、smoke 断言和运行文档。
2026-07-23 11:56:34 +08:00
nyaKazuha and Claude Fable 5
0ab3f3b953
feat(download): 多线程下载 + 重试指数退避(issue #17)
...
下载主循环由串行改为「并发下载 + 串行簿记」三段式:
- Phase A:无网络前置校验(官方性/目标路径/建目录)+ 判定跳过/需下载,
非官方 URL 在任何下载前 fail-fast
- Phase B:need-download 项经 scoped 线程池并发下载(默认并发 4,
可配 1..=256)。worker 只做只读 &self 的 pull_one(各 URL 独立
.part/目标文件),经 mpsc 把结果送回主线程;manifest/quarantine
簿记与进度回调全在主线程串行执行,无需加锁。首个失败或 should_cancel
置 cancel 标志,其余 worker 在任务边界停止
- Phase C:按 plan 顺序串行收尾——seed .hash 校验(顺序相关、可
fail-fast)+ 构建有序结果
fail-fast 与「不发布不完整资源」不变量保留;进度事件按 URL 配对但
顺序不再单调(并发下天然如此)。
curl 重试加指数退避(网络类 200ms→400ms→800ms…上限 5s;ETXTBSY 仍走
极短退避),并发下对官方 CDN 更礼貌;退避基值 cfg(test) 下为 0 不拖慢
单测。
并发度经 OfficialUpdateConfig.download_concurrency 贯通,CLI
--download-concurrency 与 BAT_DOWNLOAD_CONCURRENCY 可配,.env 模板
与 USERGUIDE/CURRENT_STATUS/CHANGELOG 同步。
验证:新增并发正确性测试(并发 8:每 URL 恰一次 started+finished、
全部落盘)、并发度钳制、退避时长计算、CLI/env 解析单测;progress
排序测试改为顺序无关不变量;workspace 全测试(20 套件) + fmt +
clippy --all-targets -D warnings 全绿。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-18 03:25:04 -07:00
nyaKazuha and Claude Fable 5
eac1edd455
feat(official-sync): 配置校验与 server-info/marker 拉取接入错误码
...
catalog.refresh 真机 e2e 暴露的缺口:任务配置校验失败落 900001,而
输入域码表(100xxx)早已定义却无使用点。本次接入:
- 配置校验四处类型化(经 anyhow::Error::new 保留 DownloadError,
task worker 现有 downcast 直接归类):
缺少应用版本 → MISSING_APP_VERSION(100001)、
缺少连接组 → MISSING_CONNECTION_GROUP(100002)、
缺少服务器信息来源 → MISSING_SERVER_INFO_SOURCE(100003)、
GameMainConfig 缺 ServerInfoDataUrl → LAUNCHER_RESPONSE_INVALID
(600004,launcher 链内容缺陷)。
- fetch_bytes 改返回 DownloadError:非官方 URL → NON_OFFICIAL_URL、
curl 失败保留准确网络域码。server-info / endpoint marker / 种子
catalog 拉取(5 处调用)由 anyhow::Error::msg 改 Error::new 保留
类型——发现阶段的网络失败此前全部落 internal,现携带 3xx 网络码。
测试:3 个配置校验错误码 downcast 断言 + fetch_bytes 双拒绝映射
(非官方 URL / 404)。真机 e2e:无 auto-discover 的 daemon 上
catalog.refresh → task.status 报 BAT-ERR-100001 missing_app_version
(domain=input),修复前为 900001。全量 fmt / clippy --workspace
--all-targets -D warnings / test --workspace 全绿。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-17 10:20:08 -07:00
nyaKazuha and Claude Fable 5
11b19683cf
feat(daemon): 实现 catalog.* 命名空间与 resource.manifest(issue #1)
...
补齐 issue #1 方法分层中可立即实现的剩余命名空间:
- catalog.status:当前已发布版本的 catalog 概览(读取其 snapshot:
app/bundle 版本、connection group、addressables 根、端点与 marker
计数、launcher 元数据、GameMainConfig 摘要)。
- catalog.versions:版本历史(current / in_progress / previous /
failed,来自 official-version-state.json)。
- catalog.diff:当前 snapshot 相对上一个可用版本的差异(复用
YostarJpSyncSnapshot::diff 与 diff_extended_snapshot;含
changed_endpoint_urls 与 previous_snapshot_missing 标志;无上一版本
时按首次观察处理 is_initial=true)。
- catalog.refresh:经任务执行器的 catalog 更新检查任务(dry-run +
plan,不下载不审计;支持 force),返回 task_id 可轮询。
- resource.manifest:当前版本下载 manifest 的分页只读查询(offset
默认 0、limit 默认 100/上限 1000,BTreeMap 按 URL 有序保证分页稳定;
非法 limit → 700002)。infrastructure 公开
OfficialDownloadManifest(Entry) 与 read_download_manifest_at。
约定:只读查询在尚无已发布版本或文件缺失时返回 ok=true 且
data.available=false(正常状态而非错误,便于 Go 层直接分支)。
is_pending_rpc_method 缩减为 task.create / resource.repair /
patch.* / unityfs.*(后两者待引擎;repair 待引擎独立修复模式)。
新增 read_daemon_resource_state 供 resource/catalog 只读查询共用。
测试:新增 10 个 dispatch 单测(含 fixture:状态文件 + 版本状态 +
snapshot + manifest)与 read_download_manifest_at 单测;调整 pending
断言。真实 daemon 端到端验证(fixture 资源根 + 死代理快速失败):
raw socket 依次断言 catalog.status/versions/diff、resource.manifest
分页与参数错误、catalog.refresh 入队与 task.status 轮询、
resource.repair→700003、未知方法→700001,全部通过,daemon.stop 干净
退出。全量 fmt / clippy --workspace --all-targets -D warnings /
test --workspace 全绿。
已知后续(另行推进):任务配置校验失败(如缺少 app-version)尚未接入
输入域错误码(应为 100001,现落 900001)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-17 10:10:03 -07:00
nyaKazuha and Claude Fable 5
d2466d60db
feat(official-sync): 错误码模型铺开到 launcher/metadata 拉取路径
...
此前统一错误码只覆盖资源下载路径,launcher/metadata 链
(fetch_game_config → manifest URL → remote manifest → resources.assets
→ GameMainConfig)整条返回 Result<_, String>,经 anyhow::Error::msg
抹成无类型消息,RPC/任务层只能标为 internal。
本次将该链整体改为 Result<_, DownloadError>:
- core 新增两个错误码:LAUNCHER_API_REJECTED(300031,官方启动器 API
返回非 200 业务码)与 LAUNCHER_RESPONSE_INVALID(600004,响应无法
解析或缺少必需字段),并纳入唯一性测试;
- official_launcher:curl 失败保留准确网络域码(403/404/DNS/超时/TLS/
代理等,final_error_code()),API 非 200 → LAUNCHER_API_REJECTED,
响应解析/缺字段 → LAUNCHER_RESPONSE_INVALID,非官方 manifest URL →
NON_OFFICIAL_URL,manifest 无文件条目 → MANIFEST_PARSE_FAILED,
空版本/路径入参 → INVALID_ARGUMENT;
- official_game_main_config:下载失败带网络域码(主/备 CDN 均失败时
以最终一次为准),ZIP 结构 → ZIP_STRUCTURE_INVALID,manifest 大小
不符 → SIZE_MISMATCH,GameMainConfig 解密/解析 →
GAME_MAIN_CONFIG_FAILED,manifest 缺 source →
LAUNCHER_RESPONSE_INVALID;
- official_update 两处调用改 anyhow::Error::msg → anyhow::Error::new,
保留类型,task worker 现有 downcast 直接接住 launcher 路径错误码;
- USERGUIDE 错误码表补录 300031 与 600004。
内部工具函数(launcher_package_url / launcher_api_url /
launcher_authorization_header)仍返回 String,经 From<String> 归
INTERNAL——这些是硬编码常量上的内部不变量校验,非运行时主要失败面。
验证:新增 4 个单测断言映射(API 403 业务码 → 300031、非法 JSON →
600004、HTTP 404 → 300002、非官方 URL → 300030);全量
fmt / clippy --workspace --all-targets -D warnings / test --workspace
全绿(含 examples 编译)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-17 08:29:16 -07:00
nyaKazuha and Claude Fable 5
ab11cc899d
feat(official-sync): 下载失败携带类型化错误码
...
用类型化错误(不做 message 匹配)把资源下载失败归到准确的 BAT-ERR 码:
- curl_transfer:CurlFailureKind::error_code() 映射到网络域码(403→300001、
404→300002、5xx→300005、dns/connect/timeout/tls/interrupted→30001x、
proxy→310001、其余→300015);CurlRetryError::final_error_code() 取末次失败的码。
- official_download:新增 pub DownloadError { code, message },From<String>→internal,
Display/Error;pull_* 的返回类型由 String 改为 DownloadError,内部 String 错误经
From 归 internal,下载失败边界带 pull_one 的 error_code(),非官方 URL 带
non_official_url(300030)。
- official_update:pull 错误改用 anyhow::Error::new 保留 DownloadError 类型。
- 任务 worker:downcast DownloadError 取 code 写入任务记录的 error(失败不再一律
900001),非下载失败仍归 internal。
验证:新增 kind→code 映射单测;pull 404 测试断言 DownloadError.code()==HTTP_NOT_FOUND;
lib/core 全量测试通过,clippy --all-targets 干净。
范围说明:本次覆盖资源下载路径;launcher/metadata 拉取(official_launcher)的网络
失败仍归 internal,可按同一模式后续接入。
对应 issue #1(错误码细分映射,第一批)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-17 07:01:31 -07:00
nyaKazuha and Claude Fable 5
28e9ce5a6f
refactor(official-sync): 删除误导性的 skipped_this_run 字段并修正措辞
...
quarantine 条目的 skipped_this_run 字段恒写 true、仅测试读取、不参与任何逻辑,
且名称误导——下载失败是 fail-fast 中止整轮,并非“跳过该 URL 继续”。删除该字段,
并把失败消息中的“跳过本轮”改为“中止本轮同步、不发布不完整资源”以消除歧义。
(quarantine 为瞬时状态文件且未启用 deny_unknown_fields,旧文件多出的键会被忽略。)
对应 issue #18 维护清单 3-2。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 09:21:16 -07:00
nyaKazuha and Claude Fable 5
42d69dd4bd
fix(official-sync): 拒绝携带 query/fragment 的资源 URL
...
destination_for_url 原来对每个路径片段静默剥除 query/fragment,导致仅 query
不同的两个官方 URL 映射到同一目标文件而相互覆盖,并使每轮 hash 复用校验失配、
反复重下。官方资源 URL 本不携带 query(发现 URL 由固定拼接生成),改为直接拒绝,
消除该碰撞路径。新增单测。
对应 issue #18 维护清单 2-3。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 08:03:40 -07:00
nyaKazuha
c123f6c0dc
feat(official-sync): 支持本地代理下载官方资源
2026-07-16 00:12:27 +08:00
nyaKazuha
60b8339ecb
fix(official): 修正官方 hash 校验算法
2026-07-15 22:30:33 +08:00
nyaKazuha
90307a3243
feat: track official versions and import resources
...
Persist official version-state, extend CAS/ResourceRepository import classification, and add offline catalog and failure regression fixtures.
Fixes #13
Fixes #12
Fixes #8
2026-07-15 19:53:10 +08:00
nyaKazuha
4192d7ee4c
fix: classify official download failures
...
Distinguish terminal HTTP errors from retryable CDN/network failures, record quarantined resources, and report failed download progress.
Fixes #7
2026-07-14 01:30:12 +08:00
nyaKazuha
45aba2fb2b
fix: harden official sync filesystem boundaries
...
Fixes #14
2026-07-13 23:17:52 +08:00
nyaKazuha
1bcb9c828a
feat: summarize official validation results
...
Fixes #5
2026-07-13 01:06:37 +08:00
nyaKazuha
e5fcf26e19
feat: validate official zip structure
2026-07-12 23:37:47 +08:00
nyaKazuha
f7255f7c04
feat: improve bat daemon cli output
2026-07-12 23:04:13 +08:00
nyaKazuha
264e78c440
feat: harden official sync scheduling and integrity
2026-07-11 01:06:02 +08:00
nyaKazuha
2bdc55a1be
feat: support cancellable official sync
2026-07-10 00:36:40 +08:00
nyaKazuha
ea0920e4e3
feat: add official sync progress logging
2026-07-07 22:13:07 +08:00
nyaKazuha
b2d6871926
fix: harden official resource sync retries
2026-07-07 01:14:54 +08:00
nyaKazuha
789402c887
feat: add official resource sync pipeline
...
Add the production-facing official update service and bat-official-sync watch CLI for unattended resource synchronization.
Support launcher-resource discovery without installing the launcher, remote marker snapshots, local manifest audit and repair, official seed hash validation, bootstrap caching, richer Addressables coverage, SQLite resource persistence, and FFI JSON helpers.
2026-07-05 23:49:56 +08:00
nyaKazuha
adc1cd5b91
feat: prepare experiment push package
2026-06-30 00:08:36 +08:00