Skip to content

Agent Harness 工具体验与执行反馈问题汇总 #1106

Description

@vastsa

背景

记录自 Agent Harness + user-installable plugins 预览阶段的使用反馈。本 issue 聚焦工具发现、命令执行、文件读写和会话体验;不涉及插件功能设计。

问题归类

工具发现与反馈

  • asktool 仅支持纯文本,无法呈现富格式选项。
  • 原生 Grep / Glob 不在默认工具列表中,需先通过 ToolSearch 激活;改用 Bash 搜索时输出可能失控、缺少限制。
  • 点击工具后只能看到执行结果,看不到实际执行的命令/输入,排查不便。

Bash 与路径

  • 默认 60 秒超时缺少清楚提示,长任务容易让人误以为仍在运行或执行失败。
  • Bash 调用 cmd 子进程时观察到编码不一致、输出乱码;具体触发条件和根因待确认。
  • Windows 下提供的 $PI_SCRATCH_DIR 路径不能直接在 Bash 中使用;分支会话中的路径更新/提示不足,可能静默指向错误位置。
  • 有反馈称长命令可能被静默截断、导致命令未完整执行;目前未能复现,需先验证。

Read / Write / Edit

  • Read / Write 的行号区间与 tag 校验可能造成反复读取和重写,失败、写错位置或写入成功不易区分。
  • 多个 PUT 操作时出现行号定位问题;展示的行号看似对应目标位置,实际内容却落在其他行。
  • 写入成功响应不稳定,有时返回内容、有时为空,难以判断结果。
  • 对不存在的文件返回权限错误,而非明确的文件不存在错误。

会话与长对话体验

  • 长对话中思考/执行链会自动折叠,查看历史过程不够顺手。
  • 曾遇到一次会话突然消失,原因不明,也不确定是否误操作;与已关闭的 #39 相似,需补充复现信息后再判断是否同一问题。
  • 正向反馈:分支和修改历史信息有帮助,可保留现有能力。

期望

  • 工具的输入、执行过程和结果清晰可见;输出有合理边界,成功与错误响应明确。
  • 常用搜索工具容易发现,Bash 超时、编码和跨 shell 路径行为明确且一致。
  • 文件操作的行号定位、写入结果和缺失文件错误可靠、可诊断。
  • 对未复现的命令截断和会话消失问题,先建立可验证的复现或明确排除。

范围说明

截图中已划掉的模型切换/自动选模反馈不纳入本 issue;编码根因中的推测不作为已确认结论。

Activity

  1. added
    bugSomething isn't working
    area: agent-runtimeAgent execution, subagents, tools, and runtime behavior
    on Sep 26, 2026
  2. GalaxyXieyu commented on Oct 5, 2026

    @GalaxyXieyu
    Contributor

    在最新 main(c1afefea7)上核实了 Read/Write/Edit 里的一个子项:legacy 形态的 Edit(只有 old_string / new_string,没有 tag/ops)在 old_string 只匹配行内一部分时,会静默丢掉同行未匹配的文本,却仍然返回成功和新 tag。

    复现:用 c1afefea7 编出的真实 pi-desktop-host-core,经 stdio tools.execute(先 Read,再 legacy Edit),按字节对比磁盘文件:

    文件 old_string → new_string 期望 main 上实际
    let x = foo; = foo; → = bar; let x = bar; = bar;
    value = 1; // keep me value = 1; → value = 2; value = 2; // keep me value = 2;
    call(alpha, beta); alpha → gamma call(gamma, beta); gamma
    a⏎foo⏎b⏎ foo⏎ → `` a⏎b⏎ a⏎⏎(下一行 b 也被删了)

    跨行且首尾落在行中的匹配、以及 CRLF 文件,同样会丢字。整行精确匹配是正常的(已有用例 edit_accepts_legacy_old_string_new_string_shape)。

    根因:crates/host-core/src/tools/mod.rs:1547-1555(#1269 为 #1217 加的适配)只用匹配偏移算出首尾行号,然后发出 PUT first.=last:,body 直接是 new_string。PUT N.=M 是整行替换(hashline/apply.rs:129-137),所以首行未匹配前缀、末行未匹配后缀都会丢。另外当 old_string 以 \n 结尾时,old.split('\n').count() 会多算一行,下一行也被删掉。

    拟议修复:只改 legacy 分支,tag + ops 路径不动。

    • 先算出子串结果:text[..start] + new_string + text[start + old.len()..]
    • 裁掉未变的首尾行,再对变更区间发一条行锚定 op(PUT a.=b: / CUT a.=b / PUT >N:)
    • 仍走现有的 hashline::apply_edit + 当前 live tag

    未找到 / 歧义匹配仍返回 EDIT_LEGACY_MATCH_FAILED,相同内容替换仍返回 EDIT_NO_CHANGE。

    本地已有修复(tools/mod.rs 约 50 行)和表驱动回归测试:其中 8 个用例在 c1afefea7 上失败,修后全部通过。

    • cargo test -p host-core --locked:757 通过(main 上 755 + 2 个新测试)
    • 上面的 stdio probe:修后 7/7 字节一致,main 上 1/7
    • pnpm test:e2e:两边都是 23/23

    如果还没有人在做这块,我打算开一个只覆盖这个子项的 fix(tools) PR,issue 里其它点先不动。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: agent-runtimeAgent execution, subagents, tools, and runtime behaviorbugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions