Skip to content

Fix bugs - #926

Merged
tastelikefeet merged 11 commits into
modelscope:mainfrom
tastelikefeet:fix/0724-1
Jul 28, 2026
Merged

Fix bugs#926
tastelikefeet merged 11 commits into
modelscope:mainfrom
tastelikefeet:fix/0724-1

Conversation

@tastelikefeet

@tastelikefeet tastelikefeet commented Jul 28, 2026

Copy link
Copy Markdown
Collaborator

Bug 1(P1 数据错配):从 -n all 仓库下载单个命名 agent,拿到的是 default 的文件

现象:对一个用 -n all 上传的 root-per-agent 仓库(如 hermes:default 在裸路径、命名 agent 在 profiles/<name>/ 下),执行 agent download -f hermes -n coder 时:

  • 写入目录正确(~/.hermes/profiles/coder/),但写入的是 default 的全部文件(SOUL/config/memories/skills/hooks);
  • coder 自己的 profiles/coder/** 文件一个都没写入,全程无告警、退出码 0;
  • 若本地已有 coder,其内容被 default 整体覆盖。

根因:下载逻辑假设"仓库里所有文件都属于所请求的 agent"。对 all 布局仓库,default 的裸路径文件恰好命中单 agent 的样式过滤(SOUL.mdmemories/*.md...)被写进命名 agent 目录;而命名 agent 自己的文件带 profiles/<name>/ 前缀,匹配不上样式,被静默丢弃。

修复_commands.py):新增纯函数 _remote_paths_for_agent,在下载的增量/全量两条分支统一接入:

  • 仓库中存在所请求 agent 的前缀文件(profiles/coder/** 等)→ 只取这些并剥掉前缀;其它 agent 的文件列入 Excluded 清单明确展示(不再静默);
  • 仓库是 all 布局但没有所请求的 agent → 明确报错:repository has no agent named 'coder' (agents in repo: default, writer)
  • 老式单 agent 裸布局仓库 → 行为完全不变(向后兼容);
  • -n all / __global__ / 非 root-per-agent 框架 → 不走此逻辑,行为不变;
  • 增量下载的 sha 对比同步改为用剥前缀后的路径(否则永远比不中、永远全量重下)。

实现完全复用 WorkspaceSpec 既有的 join_all_path/split_all_path/matches 抽象,无任何框架前缀硬编码;qwenpaw 前缀即普通目录名的歧义(skills/x/SKILL.md 切分后形似 agent 前缀)通过"须不匹配裸布局样式才算 all 布局证据"规则消除。

已知边角(无法消除的歧义,保持旧行为):all 仓库若只含 default(无任何命名 agent),与单 agent 仓库在布局上不可区分,-n <名> 下载仍会取得裸路径内容。

Bug 2(P2 备份不可见):restore 前自动备份缺框架名前缀,backups -f 查不到

现象agent restore 覆盖本地前的自动备份名为 paw_qa_01_20260727_190757.zip(缺 qwenpaw_ 前缀),而 backups -f <fw> 按文件名前缀解析框架,该备份被误判为框架 paw,在 -f qwenpaw 下完全不可见,无法用于回滚一次误 restore;[LAST] 标记在带/不带 -f 时指向不同备份。

根因:三处自动备份中,convert({target_fw}_{agent})与 watch({framework}_{agent})均带框架前缀,唯独 cmd_recover 传的是裸 agent 名。

修复_commands.py::cmd_recover):备份标签对齐共用约定——单 agent 为 {framework}_{restore_name},all 范围为 {framework}(与 all 备份不含 name 段的既有文件名约定一致);同时移除仅为旧标签服务的 name 重赋值死代码。

Bug 3(P0 安全):qwenpaw agent.json 顶层 model.api_key 明文上传到公开仓库

现象:上传 qwenpaw agent 时,脱敏只遍历 channels.*mcp.clients.*.env 两个子树,顶层 model.api_key(DashScope/OpenAI 等 LLM 主凭据)未被清除,明文进入远端仓库(默认 public)及其 git 历史;download 入站同样漏,watch 每 120s 自动 push 会持续泄露。is_secret_key('api_key') 本就返回 True——属遍历路径遗漏,非设计取舍。

修复(两处,口径统一):

  • qwenpaw.py::_strip_agent_json_secrets:改为全 JSON 树递归——任何层级命中 is_secret_key 的字段整值清空(密钥名优先于下钻:"credentials": {...} 整包抹掉,不因内层字段名无害而幸存);保留两条结构性规则(channel 的 db_path 等本地字段照清;mcp.clients.*.env 整块清空)。非密钥字段(client_id、模型名等)原值保留。upload / download / watch 三条路共用此函数,一处修复三路生效;
  • _workspace.py::scrub_json_secrets(ms-agent 框架 settings.json 所用的共享清洗器):修掉同款缺口——原实现仅当值为标量时清空,"api_key": {...} 会漏;现改为命中即整值清空。

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

# Conflicts:
#	ms_agent/agent_hub/_commands.py
@tastelikefeet
tastelikefeet merged commit 4b299bc into modelscope:main Jul 28, 2026
0 of 2 checks passed
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.

2 participants