nyaKazuha and Claude Fable 5
c362fd80f4
fix(import): 导入失败回滚,find_bundle 拒绝同名歧义
...
- 非事务导入:import_manifest_bundles 中途某条目失败(如 AssetBundle 解析失败)
时,之前已写入的 CAS 对象和 ResourceRepository 行不回滚,留下部分导入状态。
改为记录本次写入的 object_id 与资源 id,任一条目失败时 best-effort 回滚
(删除资源行、对 store 增加的引用逐一 remove_reference)。
- find_bundle 跨目录同名:文件名回退无目录约束,jp/data.bundle 与 en/data.bundle
同名时可能静默取错数据。改为返回 Result:精确路径优先,文件名回退仅在唯一匹配
时采用,多个同名 bundle 时显式报错而非猜测。
新增单测:后续条目失败时回滚先前成功条目(资源行清空、CAS 引用回滚为 0)、
同名 bundle 歧义显式报错。
对应 issue #18 维护清单 2-2。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 08:29:27 -07:00
nyaKazuha and Claude Fable 5
b570f37359
fix(official-sync): 区分代理故障并前置校验代理配置
...
- 代理故障分类:curl 因代理 407 认证失败(CONNECT 隧道失败)、无法解析/连接
代理等,原被归为普通可重试网络错误,永不成功也会耗尽 per-URL 重试且无诊断。
新增 CurlFailureKind::Proxy,从 curl stderr 识别代理故障,per-URL 层 fail-fast
不重试(daemon error-retry 循环仍整体重试以覆盖代理短暂抖动),并在失败摘要里
以 kind=proxy 明确标注。
- 前置校验:parse_proxy_config 新增 validate_proxy_url,拒绝拼错的代理 scheme
(如 htp://),只接受 http/https/socks4/socks4a/socks5/socks5h 或无 scheme
的 host:port。
- doctor:proxy 检查不再恒 ok,对解析出的代理 URL(含 auto 从环境变量取得的)
做 scheme 校验,前置暴露配置错误。
新增单测:代理 407/解析失败归为 Proxy 且不重试、源站连接失败仍为 Connect 可重试、
拒绝不支持的 scheme、无 scheme host:port 接受。
对应 issue #18 维护清单 2-5。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 08:18:37 -07:00
nyaKazuha and Claude Fable 5
f0fbe65429
fix(official-sync): 复用 staging 异常时退化为全量重下而非中止
...
recoverable_staging_path 对「staging 存在但不可用」(被外部替换成文件/symlink、
路径组件含 symlink、id 不匹配、路径逃逸等)一律返回 Err,经调用方 ? 中止整轮
同步。失败记录残留时每轮都会撞到同一异常而永久失败、无法自愈。
改为返回 Option<PathBuf>:任何无法安全复用的情况返回 None,走全量重下(始终安全
的 fail-closed 回退,复用文件仍逐一校验,不会发布损坏内容)。新增单测:staging
被替换成普通文件时不复用、返回 None 而非 Err。
对应 issue #18 维护清单 2-6。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 08:08:12 -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 and Claude Fable 5
02d5bc537e
fix(patch): 占位函数返回未实现错误而非空结果
...
apply_patch / apply_json_patch 原返回 Ok(空 Vec/空 String),调用方会把未实现
的占位误当成一次成功的补丁应用。改为返回 PatchError::ApplyFailed,让占位状态
显式可见。新增单测确认返回错误。
对应 issue #18 维护清单 2-4。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 08:00:31 -07:00
nyaKazuha and Claude Fable 5
962261ba12
fix(ffi): 统一 cgo 链接与 release 构建 profile
...
internal/ffi/ffi.go 的 cgo LDFLAGS 硬编码 -L target/debug,而 build-rust 用
--release(产物落 target/release),干净环境下 make build/test-go/ci 必然
报 cannot find -lbat_ffi。
- LDFLAGS 指向 target/release,并加 -Wl,-rpath 让产物运行时无需 LD_LIBRARY_PATH
即可定位 libbat_ffi.so;删除指向不存在目录的无效 CFLAGS -I(C 声明本就内联)。
- 新增 build-ffi target(cargo build --release -p bat-ffi),build-go 与 test-go
依赖它,确保链接前 release FFI 库已存在。
验证:make build-go 成功产出并可运行 bin/bat;make test-go 链接并通过;
go vet(check-go)通过。
对应 issue #18 维护清单 1-6。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 07:46:37 -07:00
nyaKazuha and Claude Fable 5
1c4debbaa7
fix(cas): 消除 store/gc 之间的引用计数竞态
...
store() 原来先 ensure_object(建行 ref_count=0)再 add_reference,两条语句
非事务;即使连接池 max_connections=1,两语句间的 await 也会释放连接,让并发
gc() 在 ref_count=0 窗口删掉刚存的对象文件与元数据(静默丢数据),或使 store
返回 ObjectNotFound。
- 新增 store_reference:单条 UPSERT 原子建行为 ref_count=1 或 +1,对象行不再
出现 ref_count=0 的可见窗口;store() 与 repository add_reference() 均改用它。
- 新增 delete_zero_ref_metadata:gc 先原子执行 DELETE ... WHERE ref_count=0,
仅当 rows_affected>0 才删对象文件;被并发递增抢先时跳过,绝不删除仍被引用对象。
元数据先删、文件后删,最坏只留无元数据的孤儿文件(可覆盖,无数据丢失)。
新增单测:store 后不暴露 ref_count=0(gc_candidates 为空)、候选被重新引用后
gc 跳过、store_reference 原子建行/递增、delete_zero_ref_metadata 守卫。
对应 issue #18 维护清单 1-5。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 07:39:07 -07:00
nyaKazuha and Claude Fable 5
3cb3637749
fix(official-sync): 清理未被引用的孤儿 staging 目录
...
同版本失败 staging 复用已由 060b7d7 处理,但跨版本失败、或被 trim/去重挤出
failed_versions 记录后残留的 .staging/<id> 目录永不被复用也无人清理,长期 daemon
场景下多 GB 孤儿目录会累积耗尽磁盘。
新增 gc_orphan_staging:枚举 .staging 下子目录,只保留 in_progress_version 与
failed_versions 引用的 <id>,删除其余(跳过普通文件与 symlink,staging 根不存在
时无操作)。在同步成功发布后(读取最新版本状态)和 clean-stable(后台已停止)两处
调用;GC 失败仅告警,不影响发布结果。
对应 issue #18 维护清单 1-4。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 07:29:37 -07:00
nyaKazuha and Claude Fable 5
4d818f512c
fix(official-sync): 发布成功后立即提交版本状态事务
...
publish() 切换 current symlink 后,写最终 snapshot 或 complete_version_state
若失败会经 ? 提前返回,此时 VersionStateGuard 尚未 commit,其 Drop 会把这个
磁盘上已发布(current 已指向)的版本记入 failed_versions,造成状态与磁盘不一致。
改为在 publish() 成功后立即取出完成记录并 commit 版本状态事务,随后 snapshot
与 version-state 写入失败降级为可下轮重试的警告(不再 ? 中断、不再误记 failed);
snapshot_written 也改为仅在实际写入成功时置 Some。
对应 issue #18 维护清单 1-3。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 07:17:51 -07:00
nyaKazuha and Claude Fable 5
4c123b9560
docs(official-sync): 推荐环境变量配置代理并同步凭据处理说明
...
- official-resource-test-pull.md §0.1:新增"带凭据代理优先用 HTTPS_PROXY 环境
变量"推荐(含 systemd EnvironmentFile 0600 用法),补充凭据处理说明——日志/
status 脱敏、经 ALL_PROXY 环境变量传 curl、daemon 经环境变量下传、bat-proxy.secret
复用与 clean-stable 清除;修正旧表述"代理参数写入后台子进程启动参数"。
- official-resource-backend.md 第 13 条:把"仅日志脱敏"扩写为全链路凭据不落
世界可读位置。
- CURRENT_STATUS.md 第 7 条:同步上述凭据处理描述。
- deployments/systemd/official-sync.env.example:新增注释版 HTTPS_PROXY/NO_PROXY
示例,并提示含凭据时按 0600 安装。
- CHANGELOG:新增"修复"(Unity 版本数值比较)与"安全"(代理凭据不落世界可读
位置)条目。
对应 issue #18 维护清单 1-1 / 1-2。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 06:58:11 -07:00
nyaKazuha and Claude Fable 5
565fd317de
fix(official-sync): curl 代理改由环境变量传入,堵住 argv 泄漏
...
apply_curl_proxy 原来对 URL 型代理执行 command.arg("--proxy").arg(url),
把可能含凭据的代理 URL 放进 curl 子进程 argv,会出现在 curl 进程的
/proc/<pid>/cmdline(0444,世界可读,每次下载存活期间可被本地任意用户读到)。
改为先 remove_proxy_env 清除所有继承的代理变量,再通过 ALL_PROXY/all_proxy
环境变量把代理传给 curl(大小写两种写法都设,避免 curl 只读其一)。凭据从
世界可读的 cmdline 转移到仅属主可读的 /proc/<pid>/environ(0400)。no_proxy
列表不含凭据,仍以 --noproxy 参数传入;disabled 模式保持 --noproxy * 直连。
至此代理凭据泄漏面全部堵住:daemon 子进程 argv、0600 状态文件(55b9bab),
以及本次的 curl 孙进程 argv。
验证:
- 新增单测用 Command::get_args/get_envs 断言 URL 只进 ALL_PROXY 环境变量、
不进 argv,且 scheme 专用变量被清除;disabled 模式强制直连。
- 真机经本地混合代理 127.0.0.1:7897 端到端验证:curl shim 记录 11 次调用,
凭据 0 次进 argv、0 个 --proxy 参数,代理仅在 ALL_PROXY 环境变量中;curl
确实经该代理到达官方 launcher/CDN/resources.assets 端点,功能未回归。
- 对抗性审查确认 auto/disabled/no_proxy 语义与旧 --proxy 等价,env 先删后设
最终为 set,无其它遗漏的凭据落 argv/日志/状态文件路径。
对应 issue #18 维护清单 1-2 残留项(curl 子进程)。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 06:44:03 -07:00
nyaKazuha and Claude Fable 5
55b9babb66
fix(official-sync): 代理凭据改由环境变量下传子进程
...
彻底收敛 1-2 的两处残留凭据暴露:
- 子进程 argv:daemon_child_args 不再把 --proxy <url> 写入子进程参数,改为
只放不含凭据的内部 flag --proxy-from-env,真实 URL 经 BAT_OFFICIAL_SYNC_PROXY_URL
环境变量下传。凭据从世界可读的 /proc/<pid>/cmdline(0444)转移到仅属主可读的
/proc/<pid>/environ(0400);子进程解析后立即 env::remove_var,避免被 curl 等
孙进程继承。
- 状态文件 at-rest:0600 状态文件的 command 字段不再含凭据。restart/reload 复用
所需的 URL 改存专用 0600 文件 bat-proxy.secret,该文件永不进入状态输出或 --json;
clean-stable 会在后台停止后清除它。
复用型 restart/reload 从 bat-proxy.secret 还原代理;凭据文件缺失时(如 clean-stable
后)明确报错要求重新传入 --proxy,而非静默丢弃代理。
验证:新增 curl_proxy_url、secret 文件 0600 往返、--proxy-from-env 读取并清除
环境变量的单测;真机起停 daemon 确认凭据不在 cmdline/状态文件/status --json,
仅在 0600 secret 文件与 owner-only environ;复用 restart 成功还原、clean-stable
后复用 restart 明确报错。
对应 issue #18 维护清单 1-2 残留项。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 05:20:22 -07:00
nyaKazuha and Claude Fable 5
810b39c2cd
fix(official-sync): 修复阻塞 clippy 门禁的两处告警
...
cargo clippy --workspace -- -D warnings 在 HEAD 上失败,阻塞项目验证门禁:
- resolve_bootstrap 因 c123f6c 新增 curl_proxy 参数达到 8 个,触发
too_many_arguments。将 curl_command/curl_proxy/unzip_command 收拢为
BootstrapTools 结构体,降到 6 个参数。
- visible_historical_failed_versions(169822a 引入)的显式生命周期可省略,
触发 needless_lifetimes。按 clippy 建议省略。
对应 issue #18 维护清单 1-7。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 04:40:35 -07:00
nyaKazuha and Claude Fable 5
eef8c52497
fix(official-sync): 脱敏代理凭据避免泄漏到日志与状态输出
...
两处代理凭据泄漏:
- redact_proxy_url 对无 scheme 的代理串(user:secret@host:port,curl 默认按
http 处理)完全不脱敏,明文凭据会进入 progress 事件、daemon 日志和
bat-events.jsonl。现对无 scheme 但含 userinfo 的情况一并脱敏。
- daemon 保存的 command 含原始代理 URL,经 RPC status 和 bat status --json
回显到 stdout(会被监控采集)。新增 redact_command_proxy_credentials,在
build_daemon_status_report 的对外拷贝里脱敏 --proxy 值;磁盘状态文件
(0600)仍保留原始 command 供 restart/reload 复用。
残留:子进程 argv 仍可经 /proc/<pid>/cmdline 读到代理凭据,以及 0600 状态
文件内的 at-rest 凭据,二者受进程属主与文件权限约束,后续可改由环境变量下
传子进程进一步收敛。
对应 issue #18 维护清单 1-2。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-16 04:31:10 -07:00
nyaKazuha and Claude Fable 5
7c2f6824a6
fix(adapters): 按数值比较 Unity 版本范围
...
VersionRange::contains 原为字符串字典序比较,2021.3.9f1 等带发布后缀的
正式版本会被 can_handle/parse 误拒,多位补丁号排序也不正确。改为解析
(major, minor, patch) 数值元组比较,补丁号剥离发布后缀,无法解析的版本
一律视为不在范围内,并补充多位补丁号、后缀版本和畸形版本的测试。
对应 issue #18 维护清单 1-1。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 10:27:28 -07:00
nyaKazuha
060b7d73e5
fix(official-sync): 复用失败 staging 避免重复全量下载
2026-07-16 00:35:24 +08:00
nyaKazuha
c123f6c0dc
feat(official-sync): 支持本地代理下载官方资源
2026-07-16 00:12:27 +08:00
nyaKazuha
169822abaf
fix(daemon): 区分当前下载与历史失败状态
2026-07-15 23:22:30 +08:00
nyaKazuha
5b31112e91
fix(daemon): 使用人类格式输出 RPC 下载进度
2026-07-15 23:05:28 +08:00
nyaKazuha
7890b667d7
fix(daemon): 去重失败版本并优化状态输出
2026-07-15 22:32:27 +08:00
nyaKazuha
60b8339ecb
fix(official): 修正官方 hash 校验算法
2026-07-15 22:30:33 +08:00
nyaKazuha and Claude Fable 5
9e83bbea11
docs(docs): 按 issue 状态同步当前状态与缺口文档
...
G-018 已关闭并进入长期运行测试阶段,运行报告后续提供;阻塞项和下一步按
open issue #1/#2/#3 重排,明确 daemon JSON-RPC 扩展为 Rust Resource
Backend API 的优先级和最小方法集。
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com >
2026-07-15 06:51:46 -07:00
nyaKazuha
0d07b9f4ce
docs(docs): 记录提交信息 scope 规则
...
要求提交标题统一使用 type(scope): 中文说明,并在开发指南和贡献指南中补充示例。
2026-07-15 21:28:22 +08:00
nyaKazuha
b4b4f25cb3
refactor(ffi): 降级 FFI 为可选兼容层并整理文档
...
将 bat-ffi 明确收敛为无状态 C ABI 兼容层,默认集成路径改为 bat --json 进程边界或未来稳定 SDK。
同步 README、当前状态、项目计划、架构文档、开发指南和缺口清单,移除 FFI 作为主集成边界的表述。
新增 AGENTS.md 和 CONTRIBUTING.md,压缩 CLAUDE.md 为兼容入口,并归档阶段性报告、同步 .gitignore 规则。
2026-07-15 21:12:17 +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
25c2c4d40f
feat: add official full pull smoke
...
Emit runtime download progress and validation summaries for official sync.
Add repeatable real-network full pull smoke runbook and script.
Fixes #4
Fixes #6
2026-07-14 00:48:59 +08:00
nyaKazuha
2ff99ae9e3
feat: publish official resources atomically
...
Fixes #9
Fixes #11
2026-07-14 00:10:39 +08:00
nyaKazuha
45aba2fb2b
fix: harden official sync filesystem boundaries
...
Fixes #14
2026-07-13 23:17:52 +08:00
nyaKazuha
1bdbb47b52
docs: define production sync deployment
...
Fixes #15
2026-07-13 22:22:20 +08:00
nyaKazuha
599ead8391
fix: serialize daemon control commands
...
Fixes #10
2026-07-13 22:02:11 +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
559206962c
chore: update license holder
2026-07-12 23:04:27 +08:00
nyaKazuha
8a743d90e5
chore: update rust dependencies
2026-07-12 23:04:27 +08:00
nyaKazuha
bd9f50c85c
docs: update bat runtime documentation
2026-07-12 23:04:26 +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
f704ec18c5
feat: add official sync startup banner
2026-07-07 23:00:02 +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
e0d43fb994
fix official auto discovery for current launcher manifest
2026-07-06 23:02:52 +08:00
nyaKazuha
5e76ea4ae3
docs: align project status with official sync pipeline
...
Update the authoritative docs, guides, architecture notes, gap list, deployment guidance, handoff notes, and changelog to reflect the current Rust official resource sync boundary.
2026-07-06 00:34:22 +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
99e66a48d7
docs: add status handoff
2026-06-30 22:20:01 +08:00
nyaKazuha
adc1cd5b91
feat: prepare experiment push package
2026-06-30 00:08:36 +08:00
nyaKazuha
3c00659691
refactor: reduce quality findings
2026-06-28 15:42:12 +08:00
nyaKazuha
02716d3ccd
refactor: address quality findings
2026-06-28 13:04:53 +08:00
nyaKazuha
b202d7b231
feat: implement production cas v1
2026-06-28 12:39:17 +08:00
nyaKazuha
dd53e3054e
chore: establish development baseline
2026-06-28 01:27:09 +08:00