First-class Hermes Agent CLI support#10689
Conversation
|
Thank you for your pull request and welcome to our community. We require contributors to sign our Contributor License Agreement, and we don't seem to have the users @srinitude on file. In order for us to review and merge your code, each contributor must visit https://cla.warp.dev to read and agree to our CLA. Once you have done so, please comment |
|
This PR is not linked to an issue that is marked with Issue-state enforcement details:
To continue, link this PR to a same-repo issue such as Powered by Oz |
There was a problem hiding this comment.
This PR is not linked to an issue that is marked with ready-to-implement.
Issue-state enforcement details:
-
Associated same-repo issues checked: none
-
Required readiness label:
ready-to-implement
To continue, link this PR to a same-repo issue such as Closes #123 in the PR description, and make sure that issue has ready-to-implement.
Powered by Oz
f342d24 to
2fc334f
Compare
|
Thank you for your pull request and welcome to our community. We require contributors to sign our Contributor License Agreement, and we don't seem to have the users @srinitude on file. In order for us to review and merge your code, each contributor must visit https://cla.warp.dev to read and agree to our CLA. Once you have done so, please comment |
|
@cla-bot check |
|
The cla-bot has been summoned, and re-checked this pull request! |
|
/oz-review |
|
I'm re-reviewing this pull request in response to a review request. You can view the conversation on Warp. I completed the review and no human review was requested for this pull request. Comment Powered by Oz |
There was a problem hiding this comment.
Overview
This PR adds Hermes recognition across Warp's CLI-agent surfaces, including detection/session handling, tab configs, footer behavior, telemetry, and parity tests.
Concerns
CLIAgentTypenow uses enum-widesnake_caseserde output, which changes existing telemetry values for all agents instead of only adding Hermes.- A new Rust unit test shells out to
git diff origin/master...HEAD, makingcargo testdepend on local Git remote state. - This is a user-visible behavioral change, but the PR description still has manual testing unchecked and only promises a future screen recording; manual testing evidence or a justification is required before merge.
- Security pass: no security-specific findings from the changed lines.
Verdict
Found: 0 critical, 3 important, 0 suggestions
Request changes
Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).
Powered by Oz
|
|
||
| /// The CLI agent being used (for telemetry purposes). | ||
| #[derive(Clone, Copy, Debug, Serialize, Deserialize)] | ||
| #[serde(rename_all = "snake_case")] |
There was a problem hiding this comment.
Claude→claude, OpenCode→open_code, etc.), not just Hermes; preserve the existing wire values or make the telemetry migration explicit.
There was a problem hiding this comment.
Addressed in baa6e27. I removed both the enum-wide snake_case serde setting and the Hermes-specific serde rename so CLIAgentType::Hermes now follows the same existing PascalCase telemetry wire convention as Claude, OpenCode, Pi, etc. The regression now asserts Hermes and Claude serialization explicitly.
| .args([ | ||
| "diff", | ||
| "--name-only", | ||
| "origin/master...HEAD", |
There was a problem hiding this comment.
origin/master...HEAD ref, so ordinary cargo test runs fail in source archives, shallow checkouts, or branches without that remote; move this dependency-diff check to CI/presubmit instead.
There was a problem hiding this comment.
Addressed in baa6e27. I removed the unit test that shelled out to git diff origin/master...HEAD and moved the lock/dependency freshness check into script/presubmit using the same pattern Warp already uses in CI: cargo metadata --locked --format-version=1. The PR-level no-Cargo-change proof remains an external validation (git diff origin/master...HEAD -- **/Cargo.toml Cargo.lock) rather than a Rust unit test.
2fc334f to
baa6e27
Compare
|
/oz-review |
|
I'm re-reviewing this pull request in response to a review request. You can view the conversation on Warp. I reviewed this pull request and requested human review from: Comment Powered by Oz |
Oz no longer requests changes for this pull request after the latest automated review.
There was a problem hiding this comment.
Overview
This PR extends the existing CLI-agent integration paths so Hermes participates in the same session listener, rich-input submit, tab-config command rendering, and metadata/test coverage surfaces as the other recognized CLI agents.
Concerns
No blocking correctness or security concerns found in the reviewed diff. The PR description includes an explicit headless/manual-testing justification, and the behavioral paths changed here are covered by deterministic Rust tests in the diff.
Verdict
Found: 0 critical, 0 important, 0 suggestions
Approve
Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).
Powered by Oz
harryalbert
left a comment
There was a problem hiding this comment.
Thanks for this contribution @srinitude! However, I think this PR might be doing a few too many things at once.
To start, could we maybe tighten this PR's scope to just add notification support for Hermes? In other words, basically doing what we did in this PR for Pi but for Hermes.
For the other additions here (tab configs, comments, etc.), I think the process we'd go through to get those merged would be to create an issue for each extension separately, and then for each of those issues decide whether it's something we want to support and, if so, plan how to implement them in a way that's extensible for all CLI agents (not just Hermes).
Again, thank you so much for the thoughtful contribution!
@harryalbert Np! I think I might just fork my own copy of Warp because I want all of these features to work with Hermes, and then merge all the stable Warp changes into my fork. If all of these features are eventually merged into the master branch of Warp, then I can just onboard onto regular Warp again. |
|
@harryalbert Will make those PRs in the meantime over the next few days regardless |
|
Makes sense, thank you for the contribution! Yeah if you send that notification PR my way I'm happy to take a look! |
Description
This PR adds first-class recognition for the Hermes Agent CLI within Warp's
existing CLI-agent integration surface, modeled after the Pi CLI coding agent.
The change closes the parity gap between the already-present
CLIAgent::Hermesenum variant in
app/src/terminal/cli_agent.rsand the full Pi dispatch surfacethat every other recognized CLI agent (Pi / Auggie / Cursor CLI / Claude /
OpenCode / Gemini) already participates in:
CLIAgent::Pidispatch table (icon,command_prefix,detect_from_command,is_agent_supported, handlerfactory).
rich_input_submit_strategy(CLIAgent::Hermes) == DelayedEnterso Ctrl-G +rich input behave the same as Claude / OpenCode / Gemini / Auggie / Cursor
CLI.
agent="hermes"notifications deserialize toCLIAgent::Hermesandsurface identically to Pi notifications.
AgentReviewCommentBatchaccepts Hermes-attributed review comments.SkillProvider::AgentsforCLIAgent::Hermes.launch_configs/ vertical-tabs metadata round-trips a Hermes session.~/.warp/tab_configs/*.tomlwithagent = "hermes"deserializes toCLIAgent::Hermes.hoa_remote_control/ third-party remote-control dispatch acceptsHermes-tagged payloads.
CLIAgentType::from(CLIAgent::Hermes) == CLIAgentType::Hermeswhilepreserving the existing PascalCase telemetry wire convention.
Scope is intentionally narrow: Hermes is recognized as a community-integration-
compatible CLI agent on the same surface that already recognizes Pi / Auggie /
Cursor CLI. No Warp-controlled or Warp-endorsed Hermes plugin is introduced.
There is no install flow, no plugin download step, no doc steer, and no UI copy
that recommends a specific Hermes plugin — Warp simply recognizes the CLI when
users already have it on their
PATH, exactly the way Pi is recognized today.This PR references prior Hermes PRs #9833 and #10546 and closes #9745, the
same-repo
ready-to-implementissue for Hermes CLI agent toolbelt / rich-input/ remote-control parity, so we preserve the existing issue-before-implementation
workflow while moving forward with an implementation-ready change.
Closes #9745
cc @harryalbert
Linked Issue
References feat: add Hermes CLI agent detection and configuration #9833
References fix: improve Hermes CLI agent integration #10546
Closes Hermes Chat in Warp does not get the agent toolbelt / Rich Input / remote-control like Gemini CLI, and the session is harder to use #9745
The linked issue is labeled
ready-to-specorready-to-implement.Where appropriate, screenshots or a short video of the implementation are included below (especially for user-visible or UI changes).
Testing
Automated
New deterministic tests are added in-place — no new files; existing
#[cfg(test)]modules andmod_tests.rsare grown in line with Warp practice:app/src/terminal/cli_agent.rs—CLIAgent::Hermesmatch-arm parity (icon,command_prefix,detect_from_command("hermes"),CLIAgentType::from/Serializeround-trip).app/src/terminal/cli_agent_sessions/listener/mod.rs(+mod_tests.rs) —is_agent_supported(&CLIAgent::Hermes) == trueandcreate_handler(&CLIAgent::Hermes)returnsSome(Box::new(DefaultSessionListener)).app/src/terminal/view/use_agent_footer/mod.rs—rich_input_submit_strategy(CLIAgent::Hermes) == RichInputSubmitStrategy::DelayedEnter(Ctrl-G + rich-input parity).
app/src/server/telemetry/events.rs— OSC777agent="hermes"deserializationplus
CLIAgentType::Hermes/CLIAgentType::Claudetelemetry round-tripsthat preserve the existing PascalCase wire convention.
tab_configs, andremote-control dispatch tests for Hermes-tagged payloads, mirroring the
existing Pi assertions.
unchanged.
Manual
./script/rununchecked because this PR is being produced from a non-interactive/headless
agent environment where a trustworthy Warp GUI smoke pass cannot be captured.
Instead, the user-visible Hermes paths are covered by deterministic Rust tests:
command detection, Ctrl-G submit strategy, OSC777 notification parsing,
code-review prompts, attach-code providers, vertical-tab/session metadata,
tab-config rendering, and remote-control dispatch. Local validation also ran
cargo fmt --all -- --check,cargo clippy --workspace --all-targets --all-features --tests -- -D warnings,cargo metadata --locked --format-version=1,cargo build --workspace --locked --exclude command-signatures-v2,cargo test --doc --workspace, and the workspace nextest sweep with thepre-existing non-Hermes SSH/GCP tests excluded.
Screenshots / Videos
Not included: this diff adds no new UI surface, visual state, copy, install flow,
or plugin onboarding. The observable change is CLI-agent routing/metadata behavior,
which is covered by the automated tests listed above.
Agent Mode
CHANGELOG-NEW-FEATURE: Hermes Agent CLI is now recognized as a first-class CLI agent in Warp with parity to the Pi CLI integration surface — rich input + Ctrl-G, agent notifications, code review comments, attach-code-as-context, vertical tabs with metadata, tab configs, and remote control. No plugin install flow is introduced.