Skip to content

feat(bettergi): BetterGI 一条龙队列可视化配置 - #579

Merged
ClozyA merged 31 commits into
AUTO-MAS-Project:devfrom
TCddddd:feat/bettergi-onedragon-config
Sep 10, 2026
Merged

feat(bettergi): BetterGI 一条龙队列可视化配置#579
ClozyA merged 31 commits into
AUTO-MAS-Project:devfrom
TCddddd:feat/bettergi-onedragon-config

Conversation

@TCddddd

@TCddddd TCddddd commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

主要改动

  • 一条龙队列可视化编排:BetterGI 用户编辑页的一条龙配置区重构为可视化队列——左栏队列支持拖拽排序、启用开关、右键移出与一键清空;添加配置组支持点击分号批量输入,可重复加入(每行独立实例)。
  • 任务设置面板:内置/体力/自定义配置组以「默认/专项/自定义」前缀 tag 区分,右栏任务设置补全遗漏字段,并扩展首领讨伐目标弹窗与字段类型。
  • OpenAPI 重新生成:接入一条龙设置读写接口。
  • 已同步 res/version.json BetterGI changelog 条目。

「体力作战」专项组为预留项,当前默认隐藏,相关冻结/恢复逻辑保留。

校验

  • py_compile 通过
  • oxlint 0 error
  • yarn typecheck 通过

BetterGI 鐢ㄦ埛缂栬緫椤电殑涓€鏉¢緳閰嶇疆鍖洪噸鏋勪负鍙鍖栭槦鍒楋細
- 宸︽爮闃熷垪鏀寔鎷栨嫿鎺掑簭銆佸惎鐢ㄥ紑鍏炽€佸彸閿Щ鍑轰笌涓€閿竻绌?- 娣诲姞閰嶇疆缁勬敮鎸佸€欓€夌偣鍑?鍒嗗彿鎵归噺杈撳叆锛屽彲閲嶅鍔犲叆锛堟瘡琛岀嫭绔嬪疄渚嬶級
- 鏂板銆屼綋鍔涗綔鎴樸€嶄笓椤归」锛氬惎鐢ㄦ椂鑷姩鍏抽棴骞跺喕缁撳埛鍙栫被瀹樻柟缁勶紝鍏抽棴鍚庢寜璁板繂鎭㈠
- 鍐呯疆/浣撳姏/鑷畾涔夐厤缃粍浠ャ€岄粯璁?涓撻」/鑷畾涔夈€嶅墠缂€ tag 鍖哄垎
- 队列行/详情/候选 tag 统一配色(默认=灰、专项=紫、自定义&JS=蓝、路径=绿,浅底深字)
- 队列多选修复:Shift 区间选择以 uid 锚点,普通点击保留锚点
- 默认一条龙顺序调整并同步模板 TaskOrder/后端单一来源
- 体力作战冻结名单补充「自动幽境危战」
- 添加配置组弹窗输入改为标签输入(彩色气泡+回车/分号提交+未知名称拼写检查)
- 新增任务设置:右栏按 BGI 一条龙 JSON 字段分组展示/编辑并写回 per-user 副本(含设置读写 API)
- yarn openapi 生成 BetterGIOneDragonSettingsIn/Out 模型与
  BetterGiService 的类型化 get/save 方法
- 手写 settings composable 改为调用生成的 BetterGiService,消除旁路
- 自动秘境补 SundayEverySelectedValue / SundayWeeklySelectedValue(每日/每周模式的选择序号)
- 每条内置龙右栏追加公共「完成后操作」CompletionAction(BGI 为全局卡,非任务专属)
- 依据 BGI OneDragonFlowPage.xaml 核对字段归属(领奖树脂/分解圣遗物/奖励识别属 BGI 全局 config,不在一条龙 JSON,暂不接入)
- 首领讨伐「选择首领」改为二级连列弹窗(地区 → 首领 Boss),
  首领候选按 BetterGI AutoBossData.CountryToBosses 分组(41 个,无至冬)
- 「选择战斗策略」复用已有策略弹窗:顶部通用策略与右栏字段共用一套候选
- 讨伐目标字段顺序调整为:选择首领 → 切换队伍 → 战斗策略
- 设置面板支持 strategy/boss 字段类型(点击输入框弹窗单选)
- 首领候选展示「首领名称-地区」,value 保持首领名语义

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, we are unable to review this pull request

The GitHub API does not allow us to fetch diffs exceeding 300 files, and this pull request has 896

@TCddddd
TCddddd changed the base branch from main to dev September 6, 2026 07:50
TCddddd and others added 4 commits September 6, 2026 16:02
- 基于 BGI 全局 config.json 物化/还原幽境危战刷取策略与树脂次数设置
- 队列行启停开关、批量操作与标签展示细化
- 同步 res/version.json changelog
解决冲突:
- frontend/src/i18n/locales/zh-CN.ts:4 处 BetterGI 文案保留本分支的可视化队列/独立配置新文案
- res/version.json:保留双方 changelog 条目
@1w1w11w1

1w1w11w1 commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

更正说明

此前评论把 await self.spawn(method) 误判成“只等待创建任务”,因此将同一 BetterGI 脚本的多用户执行误判为并发。实际 spawn() 返回的是 asyncio.Taskawait 会等待该用户子任务的整个 _execute_task() 完成,包括 main_task()final_task()for 循环只有在当前用户及其收尾结束后才进入下一用户。顶层 app/core/task_manager.py 对脚本项也采用同样的 await self.spawn(task_item)。因此,撤回“同一脚本多用户并发”这一问题;本评论不再将其作为 finding。

审查结论

需要修改后再合并。 本 PR 的 BetterGI 队列 UI 目前没有把拖拽排序和重复队列项写入后端执行模型;此外,新增 per-user 文件接口直接使用未经校验的用户 ID/配置名拼接路径,存在路径穿越和跨用户/跨脚本访问风险。

以下结论基于 PR 073cdf7 相对 base 6da33cda 的完整 diff。

常规审查(code-review

1. [P1] 新增 per-user API 存在路径穿越和越权读写

涉及:

  • app/api/scripts.py:1292-1501,1688-1802
  • app/task/BetterGI/tools/one_dragon.py:258-272,655-664,1142-1157,1311-1325

新增接口只通过 _bettergi_script_config() 校验了 scriptId 对应的脚本类型,但 userId 直接拼接到 Path.cwd() / "data" / script_id / user_id / ...,没有校验 UUID、路径边界或用户归属。configNameresolve_config_name() 处理后也没有拒绝 /\\..,随后被用于 per-user 一条龙文件名。

因此,构造路径型 userIdconfigName 后,读写接口可能越出预期的 data/<script>/<user>/ 目录;即使只允许 UUID,也仍可传入另一个脚本下的用户 UUID,访问不属于当前脚本的数据。

受影响的接口包括一条龙设置、秘境/幽境设置、配置组列表/详情和配置组保存。

请在 API 信任边界统一:

  1. 使用 uuid.UUID() 校验并规范化两个 ID;
  2. 通过 script_config.UserData[user_uid] 验证用户确实属于 scriptId
  3. 对配置名做单路径段校验,或在路径生成后用 resolve() 验证仍位于预期目录;
  4. 路径辅助函数也增加同等防护,避免未来调用方绕过 API 校验;
  5. 增加合法读写、非法 UUID、路径穿越和跨脚本用户 ID 的回归测试。

2. [P1] 既有用户的详细配置可能因固定新槽位而被绕过

app/task/BetterGI/tools/one_dragon.py:785-797,1482-1499 将独立模式的 per-user 配置固定为 MAS独立配置.json,并明确在该文件不存在时不再回退用户原先选择的 OneDragonConfigName 对应副本;base 版本则使用用户选择的配置名,并在副本缺失时回退 BGI 实配。

因此,已有用户保存于 data/<script>/<user>/OneDragon/<旧配置名>.json 的设置不会自动迁移到新槽位,首次进入新逻辑时会以模板作为底稿,用户的既有自定义组和设置可能消失或恢复默认。

请在切换到固定槽位时增加一次兼容迁移(旧副本优先迁移到新副本),或继续读取旧 key;迁移后应保留旧文件并提供一次性回归测试。

3. [P1] 可视化队列的排序和重复项没有进入实际执行模型

前端 frontend/src/views/EditView/User/BetterGIUserEdit.vue:1392-1400,1557-1577,2424-2426 明确把 dragonList 的拖拽结果只保留在内存,并记录“后端顺序化尚未配套”。

后端 app/task/BetterGI/tools/one_dragon.py:1543-1650 仍然通过 GroupsCustomGroups 和已有配置的 TaskOrder 重建队列;前端拖拽后的顺序既不保存,也不会传给运行时。ALLOW_DUPLICATE_GROUPS = true 允许同一组出现多行,但后端的 TaskDefinitions/TaskEnabledList 仍按组名和唯一 UID 表达,无法表达同一组的多次队列实例。

结果是用户看到的核心交互与实际运行不一致:刷新后顺序恢复,运行时仍按旧顺序执行,重复加入也不会变成多次执行。

请在合并前补齐后端持久化和运行时映射;如果本 PR 暂不实现,应先删除或明确禁用这些未生效的拖拽/重复交互。

4. [P2] 物化配置组的覆盖和清理没有所有权标记

app/task/BetterGI/tools/one_dragon.py:673-743 用固定的 MAS-{用户短 ID}-{原名}.json 写入 BGI 的 User/ScriptGroup,写入前没有确认目标文件属于当前运行;cleanup_leftover_mas_groups() 又按通配符删除该前缀下的全部文件,remove_materialized_script_groups() 也会无条件删除本轮记录的路径。

如果上一次运行异常留下文件,或同名前缀文件在两次运行之间被修改/手工创建,下一次运行可能覆盖它,结束清理时还可能删除不属于本轮的内容。组文件缺少 owner/token 标记,无法区分“本轮创建”和“已有文件”。

请使用带运行实例 token 的临时文件名,记录创建前是否存在,并在清理前验证 owner;已有文件不得直接覆盖,必要时先备份。

5. [P2] 秘境目录接口的文档承诺与实现不一致

app/api/scripts.py:1528-1532 的 docstring 声称优先读取 User/JsScript/**/Genshin_Domains_SC_Live_Source.json,缺失时再回退 tp.json

scan_domain_catalog()app/task/BetterGI/tools/one_dragon.py:329-353)实际只扫描 GameTask/AutoTrackPath/Assets/tp.json/TP.json,没有产出表读取逻辑。安装了产出表的用户不会得到接口文档承诺的来源和奖励数据。

请实现文档声明的优先级,或修改文档和 PR 描述,使其与实际数据源一致。

6. [P2] changelog 为同一 PR 写入了两条记录

res/version.json:13-14 同时新增了两条 BetterGI 记录,而项目规范要求一条 PR 只贡献一条 changelog,并将全部用户可见改动合并为一句面向用户的描述。

请合并为一条记录,并保留拖拽队列、批量添加、任务设置等用户可见结果即可,不必描述内部字段或接口。

过度工程审查(ponytail-review

  • frontend/src/views/EditView/User/BetterGIUserEdit.vue:1392-1408,1611-1638,2758-2762yagni: 体力作战始终由 STAMINA_COMBAT_VISIBLE = false 隐藏,但仍保留整套队列、冻结、恢复和互斥状态机。删除隐藏分支,等专项真正上线时再加入。
  • frontend/src/views/EditView/User/BetterGIUserEdit.vue:1392-1394,1601-1607,2424-2426yagni: 重复/拖拽队列模型没有后端表达方式;删除这层本地状态和对应交互,或先实现真实持久化,不要长期保留“看起来可用但不生效”的功能。
  • .codebuddy/commit_msg.txt:1-5delete: 提交说明草稿属于本地元数据,不应进入仓库。

net: -200 lines possible.

校验信息

  • PR base:dev6da33cda
  • PR HEAD:073cdf7
  • 变更规模:36 个文件,新增 9154 行,删除 732 行
  • GitHub checks:version.json 检查通过;uv.lock 一致性检查通过;Sourcery skipped
  • 本地 checkout 缺少 docs/agents/issue-tracker.md,因此 Spec 审查以 PR 描述、提交记录和实际 diff 为依据。

Comment thread .codebuddy/commit_msg.txt Outdated
Comment thread res/version.json Outdated
Comment thread frontend/src/views/EditView/User/BetterGIUserEdit.vue
Comment thread frontend/src/views/EditView/User/BetterGIUserEdit.vue
Comment thread frontend/src/views/EditView/User/BetterGIUserEdit.vue
- 新增 OneDragon.Queue 持久化可视化队列(顺序/成员/同名重复实例),运行时按队列重建一条龙 TaskOrder,为空时保持旧行为
- 前端队列拖拽/添加/移除/清空落库,加载时优先恢复持久化队列
- per-user 接口统一校验 userId 归属(UUID + UserData)与 configName 路径边界,防越权与目录穿越
- 任务收尾关闭游戏改为直接强制结束,失败原因落日志并推送调度台(拒绝访问时给出权限指引)
- 每周秘境数据源文档与实现对齐(仅官方 tp.json)
- PR changelog 合并为一条,移除误提交的本地草稿文件
- 按最新后端 openapi 重新生成 src/api:OneDragon 模型新增 Queue 持久化队列字段
- BetterGI 部分接口 userId 改为必填(带默认值),秘境/配置组接口描述与实现对齐
- 新建用户默认表单补 Queue,与后端默认值一致(空队列回退旧顺序行为)
…lan 鐨?weeklyDomain/weeklyLeyLine 宓屽骞跺洖鏄捐繕鍘燂紙鍓嶇闆舵敼鍔級锛宮ain.js 鎸夊綋澶╂槦鏈熷彇鍊肩洿浼狅紝绉樺褰撳ぉ鏃犻厤缃垯璺宠繃锛涗慨澶嶇┖ Plan 鎴栦粎鏈?weekly 鏃?merge 涓㈠け鏁版嵁鐨?bug
- 修复右栏保存/回显端点把 configName 当组名传给 Plan 路由,导致每日/每周秘境、每日/每周地脉花的 StrategyName/leyLineDailyEnabled/team/country/周表键被静默丢弃:请求新增 groupName 字段,保存与回显均按内置组名路由
- 修复执行层 JS 读不到 Plan:manifest 声明 settings_ui(BGI 按 settings.json 字段白名单注入 jsScriptSettingsObject),Plan 以 JSON 字符串注入规避 .NET 对象包装;main.js 日志改走注入 logger(masLog),地脉花策略调用加存在性守卫
- 幽境危战右栏:标签改名「刷取设置」,队伍/策略优先级改为右栏优先、通用兜底(AutoProxy 物化顺序对调);执行层接入面板策略 strategyName
- 首领讨伐右栏:「讨伐目标」改名「刷取设置」并并入原「战斗细节」四项
- 新用户空白默认:种子模板队列顺序与前端 ONE_DRAGON_GROUPS 对齐(尘歌壶提前),每周地脉花执行开关默认全关,每日地脉花缺省开启(回显与执行层缺省语义对齐),幽境面板缺失副本时返回固定标准默认(不再回退可能被污染的 BGI 现状)
…l process

- _run_plan_combat fail_markers previously contained [ERR]/task-exec-exception, which set done_event immediately and finally force-killed BGI while it was still recovering and running remaining tasks.

- _switch_account switch_group_fail had the same issue; fixed its misleading comment.

- In BGI, [ERR]/task-exec-exception are per-task recoverable exceptions caught by TaskRunner (no rethrow); the config-group / one-dragon still reaches its done line. Align with _BGI_BUILTIN_FATAL (never treat [ERR] as fatal) and main check_log: keep only truly fatal markers (config-group task failure / task start failure / [FTL]); stalls covered by outer timeout.
… group

- Plan / 鎵ц灞?now accept suffix-named steps (e.g. 鑷姩绉樺-鍓湰A) so the same combat type can run multiple times with different per-instance settings.

- build_combat_steps no longer dedups by name; each enabled combat step (resolved to base name) is an independent instance carrying its own uid/settings.

- one_dragon_plan: add _resolve_base_name (base-name normalization) used by validate_step_settings, merge/extract_rightbar_into_plan, is_combat_group, and the weekly struct helpers.

- MASOneDragon/main.js: dispatchCombat / shouldRunToday / step routing resolve to base name, executing each suffixed instance with its own settings.

- AutoProxy: _exclude now uses base names so suffixed combat groups are correctly filtered out of the native one-dragon run (no duplicate execution).

- Remove TEMP PROBE block from main.js (verification deferred; probe must not enter repo).
- 前端队列与用户编辑页支持同一战斗组多实例独立保存与回显
- 执行层 main.js 按实例名分发到对应 Plan 步骤
- 修复 maxArtifactStar 跨组同步误建 base 幽境步骤的隐患
- res/version.json 补充用户可见 changelog
- 执行层排序支持队列条目 planUid 精确绑定 Plan 实例,同名多实例(自动秘境×3)的左栏拖拽顺序可逐实例生效;队列解析保留 planUid
- 执行层超时改为空闲超时(日志静默 300s 判卡死),移除固定 900s 墙钟,多实例长任务不再被误杀
- 执行层失败不再中止任务:记录警告并继续一条龙日常,避免战斗异常连坐吞掉日常收益
- MAS_PLAN_FAIL / MAS_STEP_FAIL 纳入失败判定,执行层 JS 失败不再被「配置组执行结束」误判为成功
- 幽境危战按 BGI 官方 Param 源码修正:移除无效的 maxArtifactStar 透传(前端面板/后端白名单与映射/执行层),策略改为直接调用 setCombatStrategyPath(副作用写入 CombatScriptBagPath),改用无参构造保留全局默认策略
- 组开关保存失败时回滚本地状态并提示,消除界面与后端静默脱节
fastapi_mcp 的 resolve_schema_references 对互相 $ref 引用的模型会无限展开
(A→B→A…),递归约 1000 层即 RecursionError,导致整个后台初始化失败
(MainTimer / 通知管理器等后续服务全部跳过)。

- 加载 fastapi_mcp 后替换为带深度上限(96 层)的同逻辑实现,
  超限的 $ref 原样保留,仅影响 MCP 工具 schema 展示完整度
- 同时替换 utils 与 convert 两处按名绑定的函数引用
- 移除启动脚本中的 AUTO_MAS_ENABLE_MCP=0,恢复 MCP 默认开启
- 路径 B 下把队列里出现的战斗组从原生一条龙副本剔除,队列开关同时管住执行层与原生一条龙两侧
- 原生副本已无启用任务时跳过启动原生一条龙的阶段,避免 BetterGI 空跑不退出、任务一直结束不了
- 保存用户配置时按队列清理 Plan 中不再被引用的战斗实例
- res/version.json 的 BetterGI 条目收敛为一条
…gon-config

# Conflicts:
#	app/api/scripts.py
#	app/models/schema.py
#	app/task/BetterGI/ScriptConfig.py
#	frontend/src/api/services/Service.ts
#	frontend/src/i18n/locales/en-US.ts
#	frontend/src/i18n/locales/ja-JP.ts
#	frontend/src/i18n/locales/zh-CN.ts
#	res/version.json
- 合并 upstream/dev 时冲突区被 dev 的 ZZZ-OD 端点占据,补回 /bettergi/one-dragon/settings、/bettergi/one-dragon/plan/step-enabled、/bettergi/global-domain/settings、/bettergi/global-stygian/settings、/bettergi/domain-catalog、/bettergi/script-group/save
- 前端 src/api 由 openapi 生成器基于本地后端重新生成,未手改生成文件
- /user/update 恢复「队列为唯一真相源」逻辑:保存队列时同步清理 Plan 中不再被引用的战斗实例
- /bettergi/one-dragon/custom-groups 恢复 userId 参数,用户独立配置下按 per-user 副本读取自定义组
- 前端对齐重新生成后的接口:修正一条龙步骤启用接口名、补齐 OneDragon 的 Plan 与 UseExecutionLayer 默认值
- src/api 由 openapi 生成器重新生成
CHANGELOG.md 是唯一手写来源,res/version.json 等由它生成。此前该条目被直接手改进 version.json,导致 CI「检查 CHANGELOG.md 与生成物一致」失败。现把条目补回 CHANGELOG.md 的 v5.5.0-beta.3 新增分类,并运行 scripts/changelog.py sync 重新生成 version.json,使检查通过。
TCddddd and others added 5 commits September 10, 2026 11:51
BetterGI 用户配置面板(一条龙队列可视化、配置组设置、秘境选择器、方案配置)
在 frontend 中新增了一批 edit.bettergi* 翻译键,但三个语言包(zh-CN / en-US /
ja-JP)此前均未补,导致界面直接显示原始 key 字符串。

- 补全 93 个缺失的 bettergi* 键(覆盖 BetterGIUserEdit /
  BettergiGroupProjectBody / BettergiDragonGroupSettings 三处组件用到的全部
  edit.* 键,已验证三语言包均 0 缺失)
- 修正英文值中一处未转义的单引号(bettergiDuplicateTip),避免 TS 语法错误

验证方式:脚本扫描三个 BetterGI 组件的全部 edit.* 键,三语言包均 0 缺失,
三个语言包括号配平正常。
@ClozyA
ClozyA merged commit 149d1ec into AUTO-MAS-Project:dev Sep 10, 2026
3 checks passed
qiyinxi added a commit that referenced this pull request Sep 10, 2026
PR #579 合并时冲掉了上次精简(275e21b),version_info 回到 31749 字符。
重新合并同区域条目、去重复、缩短冗长描述,保留全部贡献者署名。

- beta.3: 89→42 条, 11716→5302 字符
- beta.2: 34→16 条, 4231→2717 字符
- version_info 总计: 31749→10962 字符 (-65%)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@TCddddd
TCddddd deleted the feat/bettergi-onedragon-config branch September 10, 2026 09:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants