合入两处 Jules 改进,并补齐评审发现的缺口

JU
7h ago
+305-32

User description

合入两处 Jules 改进,并补齐评审发现的缺口

这是 #2284 的循环重开:内容与 #2284 相同,另修评审与检查指出的真问题。

一是给 YAML 行扫描加冒号前置检查、行内集合名改借用切片;跟踪集合用哈希表。

二是给订阅 User-Agent 加长度与控制字符校验,入口与 HTTP 客户端两处都拦。

本轮另修:

  • 回滚快照的真 bug:上一轮的“恢复快照”实际恢复的是被拒绝的值本身——输入框监听先把新草稿写进本地存储,同步函数里再拍快照拍到的就是这份草稿,所谓回滚等于没滚。现在改为记后端最后一次接受的三元组(开关、类型、自定义文本),只在同步成功时更新;被拒绝时恢复到这份三元组;一次成功同步都没有时不谎称已恢复,改提示同步失败、保留修改。
  • 翻译完整性检查:新增的两条提示此前只补了中英文,其余 12 种语言缺失导致前端与构建验证失败,现按仓库惯例全部补齐,本地检查脚本 0 问题。
  • 字节上限测试:原测试只用纯 ASCII,多字节输入下按字符计数的错误实现也能通过;现补 300 个 é(600 字节、300 字符)应拒、256 个 é(正好 512 字节)应过的断言。

未改:后端先 trim 再校验的宽松处理——trim 掉的字符既不落盘也不发出,不构成注入,只是接受了首尾空白的输入。

本轮另修:校验拒绝回滚时只恢复了存储与自定义输入,开关与类型下拉还停在被拒绝的选项上,现改为回滚后按恢复后的三元组刷新全部三个控件(下拉只动选中值与触发文案,不会再触发一次同步)。

未改:自定义 UA 接受非 ASCII 字符——下载用的请求头值允许 obs-text 字节,真正会让构造失败的控制字符本来就被拒绝,昨天特意断言 256 个 é 能通过;重叠同步后到的旧值覆盖新快照是瞬时的、下次编辑即收敛,串行化会把单次调用挂起的风险扩散到后续同步,不做;同步函数复杂度只是度量提示,检查本身已通过,不拆。

本轮另修:回滚快照只认最新一次同步——旧同步后到、会把快照倒回旧三元组,之后再被拒绝就滚错地方,现成功时先核序号再记快照;另 rebase 到当前主干,主干与本分支的 bolt.md 笔记两边都保留。

本轮另修:

  • 回滚快照不再收未验证的自定义文本:预设或关闭状态下同步时,存储里的自定义文本根本没发出、没经过校验,却被记成“已接受”,之后一次拒绝会把它恢复回输入框。现只有自定义模式开启时才更新自定义文本的接受基线,其余情况沿用上一次已接受的值。
  • 回滚时预设已不在选项里(版本拉取换掉了旧版预设),界面显示自定义、存储却还是旧预设,之后改自定义文本实际不起作用。现回滚到这种情况时,把旧预设字符串本身作为自定义文本存下——发出的 UA 字符串不变,之后编辑自定义文本即刻生效。
  • 同步函数的说明注释被新声明隔开、落到了计数器头上,现移到同步函数正上方。

未改:重叠同步的后端落盘顺序——上一轮已定串行化不做(会把单次调用挂起的风险扩散到后续同步),序号保护只管快照不倒回;窗口极小,下次编辑即收敛。

本地验证:settings.js node --check 通过;前端完整测试交 CI 验证。

本轮另修(2026-11-05 评审):拉取最新客户端版本后不同步后端属实——初始化同步跑在版本拉取之前,拉取把预设换成新版后后端仍拿旧版 UA,直到下次手动改动才跟上。现拉取应用完后补一次同步。另三条不采纳,理由:恢复默认并不动 fake-client 的存储与控件,所谓“恢复后晚到的成功会记错快照”前提不存在;首轮同步被拒时从后端取 UA 重建三元组是另起的初始化对账,不在本轮回滚修法的范围内,现行“保留编辑并提示同步失败”仍是 11-01 定下的做法;旧同步成功后被新同步拒绝时回滚到更早快照的说法没法定论——后端提交顺序不由前端响应顺序决定,按响应顺序改快照会在反向顺序时错得更彻底。

本地验证:settings.js node --check 通过;前端完整测试交 CI。

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: meta-muse-ai[bot] <333466691+meta-muse-ai[bot]@users.noreply.github.com>

本轮另修(2026-11-06 评审):CodeRabbit 与 Qodo 各自独立指出的回滚错位属实——先发了合法的 B、又发了非法的 C,B 成功但因序号落后被丢弃,C 被拒后回滚到更早的 A,后端拿的却是 B。后端是先校验再落盘,非法请求永远落不了盘,所以错不在后端顺序。修法是把同步串起来按调用顺序跑:每轮同步等前一轮落定再发,成功就不会被丢弃,回滚的基准永远是后端真正拿着的那份。另修 CodeRabbit 指出的版本回填问题:回填时拿初始化那会儿的预设去比,查版本期间用户换了预设或切到自定义会被覆盖回去,现改读下发那一刻 localStorage 里的选择。CodeAnt 的小提醒也修了:回滚到关闭态时版本拉取没停,现关掉面板就顺手停掉重试。UA 测试补了 U+0085 与 U+009F 两条断言。CodeRabbit 另外那条“后端写入顺序没保证”的提醒没单独修——串行化以后写入顺序就是调用顺序,同一处已经盖住;Sonar 的复杂度提示也不跟,检查门已过。

本地验证:settings.js node --check 通过;zephyr-core 全量 279 例通过,clippy(-D warnings)干净;前端完整测试交 CI。


CodeAnt-AI Description

Reject unsafe subscription User-Agents and preserve accepted settings

What Changed

  • Custom User-Agents containing control characters or exceeding 512 bytes are rejected before saving. Invalid values already saved are replaced with the default for downloads, with a warning.
  • When a User-Agent is rejected, the setting and all related controls return to the last accepted values. Other sync failures keep the user's edit and explain that it will be retried after the next change.
  • User-Agent updates are applied in order, and newly fetched preset versions are synced without overwriting a selection made while versions were loading.

Impact

✅ Fewer subscription download failures from invalid saved User-Agents
✅ Rejected edits no longer replace accepted settings
✅ Preset updates reach subscription downloads without waiting for another edit

💡 Usage Guide

Checking Your Pull Request

Every time you make a pull request, our system automatically looks through it. We check for security issues, mistakes in how you're setting up your infrastructure, and common code problems. We do this to make sure your changes are solid and won't cause any trouble later.

Talking to CodeAnt AI

Got a question or need a hand with something in your pull request? You can easily get in touch with CodeAnt AI right here. Just type the following in a comment on your pull request, and replace "Your question here" with whatever you want to ask:

@codeant-ai ask: Your question here

This lets you have a chat with CodeAnt AI about your pull request, making it easier to understand and improve your code.

Example

@codeant-ai ask: Can you suggest a safer alternative to storing this secret?

Preserve Org Learnings with CodeAnt

You can record team preferences so CodeAnt AI applies them in future reviews. Reply directly to the specific CodeAnt AI suggestion (in the same thread) and replace "Your feedback here" with your input:

@codeant-ai: Your feedback here

This helps CodeAnt AI learn and adapt to your team's coding style and standards.

Example

@codeant-ai: Do not flag unused imports.

Retrigger review

Ask CodeAnt AI to review the PR again, by typing:

@codeant-ai: review

Check Your Repository Health

To analyze the health of your code repository, visit our dashboard at https://app.codeant.ai. This tool helps you identify potential issues and areas for improvement in your codebase, ensuring your repository maintains high standards of code health.