Skip to content

fix(host): 保留外部 Harness 图片引用并支持运行中追加 - #654

Merged
BytePioneer-AI merged 2 commits into
BytePioneer-AI:mainfrom
vv-get-ti:fix/external-harness-attachments-20261030
Oct 30, 2026
Merged

BytePioneer-AI merged 2 commits into
BytePioneer-AI:mainfrom
vv-get-ti:fix/external-harness-attachments-20261030

Conversation

@vv-get-ti

Copy link
Copy Markdown
Contributor

问题

外部 Harness 的图片输入在普通发送和运行中追加时行为不一致:

  • turn/start 只提取文字,localImage 没有对应的 Desktop 文字附件清单时,图片路径会被丢弃。
  • Desktop 已经提供完整附件清单,同时保留 localImage 或 image 预览条目时,turn/steer 仍因存在非文本条目而拒绝消息。
  • 没有落盘路径的 inline 图片在普通发送时可能被忽略,只剩文字继续执行。

修改

start 和 steer 共用 Host 内部的输入规范化,保持现有 HostTextInput[] 公共契约:

  • 保留 Desktop 已提供的附件清单;只有明确的 localImage 路径缺失时,才补入同格式的清单。
  • inline 图片必须已有完整的原生文件引用,不猜测部分清单的对应关系,不读取或上传文件,也不把 base64 当作提示词。检查清单完整性,不宣称校验了图片与磁盘文件的字节一致性。
  • 无法表示的输入在提交前报错;steer 会在能力查询和取消当前轮次之前完成检查。直接附图的 Harness 命令要求分开发送,避免把图片当作命令参数丢弃。
  • 重试仍使用原始输入作为指纹;原生 Codex 请求保持原样透传。

同步更新中英文远程附件说明及调整方向文档。

验证

Windows,Node.js 24.14.0。

  • 新增 AppServerHost 回归测试在修复前出现 4 项预期失败:路径丢失、两种图片预览导致 steer 拒绝、未保存 inline 图片被忽略。修复后通过。
  • 9 个定向测试文件共 139 项通过,包含输入规范化、真实 Host start/steer 入口、停止后重发、图片重试去重、命令处理、会话恢复/历史和原生 Codex 透传。
  • 覆盖中文/空格/UNC 路径、CRLF、图片单独发送、部分清单、重复路径的混合预览、无 My request 分隔符的原生清单、非法路径和未知输入类型。
  • npm run typecheck、改动文件 ESLint/Prettier、node tools/check-boundaries.mjs、git diff --check 通过。

定向测试命令:

npx vitest run --config tests/vitest.config.js packages/host-runtime/test/external-turn-input.test.ts packages/host-runtime/test/app-server-host.attachments.test.ts packages/host-runtime/test/external-turn-steering.test.ts packages/host-runtime/test/app-server-host.native-steering.test.ts packages/host-runtime/test/app-server-host.command-steering.test.ts packages/host-runtime/test/app-server-host.official-passthrough.test.ts packages/host-runtime/test/external-command-routing.test.ts packages/host-runtime/test/external-thread-recovery.test.ts packages/host-runtime/test/external-thread-history.test.ts

未运行真实 Desktop 拖图/粘贴截图、真实 Harness 或跨平台实机验收。

关联

Issue:N/A。

与 #604 的缩略图/媒体显示修复互补。本 PR 处理输入送达,不依赖该 PR,也不改图片呈现、所有 Adapter 的类型或专用图片协议。

@coderabbitai

coderabbitai Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Caution

Review failed

The pull request is closed.

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 3aa4920 and 679f3cb.

Files selected for processing: 10
  • docs/architecture/external-thread-steering.md
  • docs/platforms/remote/remote-ssh-host.md
  • docs/platforms/remote/remote-ssh-host.zh-CN.md
  • packages/host-runtime/src/app-server-host.ts
  • packages/host-runtime/src/external-turn-input.ts
  • packages/host-runtime/src/external-turn-steering.ts
  • packages/host-runtime/test/app-server-host.attachments.test.ts
  • packages/host-runtime/test/app-server-host.official-passthrough.test.ts
  • packages/host-runtime/test/external-turn-input.test.ts
  • packages/host-runtime/test/external-turn-steering.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.

Recent review details
Context from checks skipped due to timeout: 4
  • GitHub Check: CodeRabbit
  • GitHub Check: Check macos-14
  • GitHub Check: Check windows-latest
  • GitHub Check: Check ubuntu-22.04
Additional context used
Code guidelines: 1
AGENTS.md — auto-discovered
Path-based instructions: 1
Source excerpt: `codexhost` runs external Agent Harnesses as independent Threads inside Codex Desktop, preserving the official shell and native Codex path.

CodeRabbit inference engine (AGENTS.md)

Files:

  • packages/host-runtime/test/app-server-host.official-passthrough.test.ts
  • packages/host-runtime/src/external-turn-steering.ts
  • docs/platforms/remote/remote-ssh-host.zh-CN.md
  • packages/host-runtime/test/app-server-host.attachments.test.ts
  • docs/platforms/remote/remote-ssh-host.md
  • packages/host-runtime/src/app-server-host.ts
  • packages/host-runtime/src/external-turn-input.ts
  • packages/host-runtime/test/external-turn-input.test.ts
  • docs/architecture/external-thread-steering.md
  • packages/host-runtime/test/external-turn-steering.test.ts
Learnings: 1
Common learnings
Learnt from: CR
Repo: BytePioneer-AI/codex-host

Timestamp: 2026-10-29T18:45:03.266Z
Learning: Applicability reference:
AGENTS.md: # Repository Guidelines
## Repository Skills
| Task | Skill |
| --- | --- |
| Auditing comments and docs for reasoning-transcript leakage | [codexhost-trim-cot-leakage](.agents/skills/codexhost-trim-cot-leakage/SKILL.md) |

Source excerpt:
# 清理推理泄漏

## 范围与排除

- 多语言文档配对(如 `docs/project/README.zh-CN.md`、`README.ko.md`):同步改对应语言版本。
Learnt from: CR
Repo: BytePioneer-AI/codex-host

Timestamp: 2026-10-29T18:44:44.291Z
Learning: Applicability reference:
AGENTS.md: # Repository Guidelines
## Repository Skills
| Task | Skill |
| --- | --- |
| Reviewing a PR or local diff for correctness and boundaries | [codexhost-code-review](.agents/skills/codexhost-code-review/SKILL.md) |

Source excerpt:
# codexhost 代码审查

## 阻断项

4. **文档与实现一致**:改动核心逻辑或契约时,对应 `docs/` 功能文档、`docs/index.md` 链接已同步;没有把变更报告当功能文档写。
LanguageTool
docs/platforms/remote/remote-ssh-host.zh-CN.md

[uncategorized] ~51-~51: 您的意思是“"不"入”?
Context: ...xhost 会调用同一远程连接的原生附件存储,等待保存成功,再把远程路径补入文字。已有完整原生图片路径时不重复上传。补存不作用于本地会话或原生 Codex...

(BU)

[uncategorized] ~51-~51: 您的意思是“"不"存”?
Context: ...存储**,等待保存成功,再把远程路径补入文字。已有完整原生图片路径时不重复上传。补存不作用于本地会话或原生 Codex 会话。外部会话的普通发送与「调整方向」共用...

(BU)

docs/architecture/external-thread-steering.md

[uncategorized] ~72-~72: 您的意思是“"不"入”?
Context: ...ktop 的原生图片清单;localImage 缺少清单时,按明确的绝对路径补入,不读取或上传文件。内嵌 image 必须已有完整的原生文件路径清单,Ho...

(BU)

Additional comments: 10
packages/host-runtime/src/app-server-host.ts: 1

571-571: LGTM!

packages/host-runtime/test/external-turn-input.test.ts: 1

1-108: LGTM!

docs/architecture/external-thread-steering.md: 1

72-73: LGTM!

packages/host-runtime/test/app-server-host.attachments.test.ts: 1

1-108: LGTM!

packages/host-runtime/src/external-turn-steering.ts: 1

27-27: LGTM!

Also applies to: 105-110

packages/host-runtime/test/app-server-host.official-passthrough.test.ts: 1

69-83: LGTM!

packages/host-runtime/test/external-turn-steering.test.ts: 1

66-78: LGTM!

Also applies to: 80-100, 154-158

docs/platforms/remote/remote-ssh-host.md: 1

51-51: LGTM!

docs/platforms/remote/remote-ssh-host.zh-CN.md: 1

51-51: LGTM!

packages/host-runtime/src/external-turn-input.ts: 1

45-54: 🎯 Functional Correctness

该回归担忧没有得到仓库契约支持。

External Harness 的公共输入契约是文本。skill 输入项只由 Native Codex 的 delegation 重写路径追加,不会进入 External Thread 的 turn/start 路径。External delegation 使用文本重写,不使用 skill 输入项。当前证据不能证明 Desktop 会向 External Thread 发送 mention 或 skill 输入项,因此不需要按该假设修改实现或补充说明。

📝 Summary

Summary by CodeRabbit

  • 新功能
    • 外部 Thread 支持提交包含图片的请求,包括仅含图片的消息和队列中的图片输入;图片路径信息会保留。
    • 远程 SSH 外部会话的普通提交可为缺少路径的内嵌图片补存附件;已有完整路径时会直接复用。
  • 改进
    • 附件上下文不完整、输入无效,或图片与 Harness 命令同时提交时,请求会在影响会话前被拒绝。
    • 图片内容不同的输入会分别处理,避免被误判为重复消息。

外部 Harness 的 turn/start 和 turn/steer 现在共用图片输入规范化。处理逻辑校验图片路径和附件上下文,并拒绝无法表示的输入。新增测试覆盖启动、steering、远程附件回退和相关拒绝条件。

Changes: 外部 Harness 图片输入

Layer / File(s) Summary
共享输入规范化与 turn 启动
packages/host-runtime/src/external-turn-input.ts, packages/host-runtime/src/app-server-host.ts, packages/host-runtime/test/external-turn-input.test.ts, packages/host-runtime/test/app-server-host.attachments.test.ts, packages/host-runtime/test/app-server-host.official-passthrough.test.ts
新增共享输入转换,处理文本、本地图片路径和内嵌图片。转换会校验绝对路径及附件上下文;图片引用不足或图片与 Harness 命令同时提交时会拒绝输入。turn/start 使用该转换。测试覆盖输入规范化、启动行为及原生请求转发。
Renderer 校验与 steering 接入
packages/renderer-extension/src/renderer-external-steering.ts, packages/renderer-extension/test/renderer-external-steering.test.ts, packages/host-runtime/src/external-turn-steering.ts, packages/host-runtime/test/external-turn-steering.test.ts, packages/host-runtime/test/app-server-host.attachments.test.ts
Renderer 校验接受有效的文本和图片项。steering 使用共享输入转换,并将解析错误转换为 -32602。测试覆盖图片输入、去重、活动 Turn 和停止后重启路径。
端到端验证与附件规则说明
tests/integration/external-image-steering.test.ts, tests/vitest.config.js, docs/architecture/external-thread-steering.md, docs/platforms/remote/remote-ssh-host*.md
集成测试覆盖远程附件回退、队列图片 steering、附件上下文和输入拒绝。文档说明外部 Thread 的图片路径规则、回退行为及限制;Vitest 配置纳入集成测试。

Priority: Not assessed

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Possibly related PRs

  • BytePioneer-AI/codex-host#572:该 PR 建立 External Thread 的 turn.steer 插入和停止后重启路径;本次改动更新同一入口的图片输入解析。
  • BytePioneer-AI/codex-host#604:该 PR 恢复 Desktop 附件上下文中的图片路径;本次改动在外部输入中使用该附件上下文。
  • BytePioneer-AI/codex-host#511:该 PR 为 turn/start 和 turn/steer 增加输入准备回调;本次改动修改同一外部 steering 输入管线。

Suggested labels: 功能:生成中调整, 范围:桌面界面

Suggested reviewers: bytepioneer-ai

Merge Risk: Low · up to 5eacc

The image-steering integration test bypasses package boundaries. Give its cross-package dependencies public test entry points before merging, or explicitly accept this bounded issue for follow-up.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed 标题准确概括了主要变更:保留外部 Harness 图片引用,并支持在运行中的 Turn 中追加图片。
Description check Passed 描述与变更内容直接相关,并清楚说明了输入规范化、图片引用处理、steer 行为、测试验证和未覆盖的实机验证范围。
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@BytePioneer-AI
BytePioneer-AI merged commit c74326a into BytePioneer-AI:main Oct 30, 2026
4 of 5 checks passed
@BytePioneer-AI

BytePioneer-AI commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

@vv-get-ti 感谢你定位并修复外部 Harness 运行中追加(steer)时只有图片的排队消息会消失的问题,已合并。

深审后维护者在你的分支上追加了一个提交 5eaccab:

  • 贯通 Renderer 与 Host 的纯图片 steer/停止后重发入口,保留图片引用和附件展示上下文。
  • 远程补存后多出的图片引用不再被 Host 拒绝(仍拒绝引用不足)。
  • 识别原生清单 ## My request: 之后的附图命令,拒绝与图片混发。
  • 补了 Renderer、远程补存器与 Host 连起来的组合测试,并同步中英文文档。

如果你在实际使用中发现问题,欢迎直接在这里或新 Issue 反馈。再次感谢你的贡献。

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