Skip to content

First-class Hermes Agent CLI support#10689

Open
srinitude wants to merge 13 commits into
warpdotdev:masterfrom
srinitude:kiren/hermes-agent-cli-parity
Open

First-class Hermes Agent CLI support#10689
srinitude wants to merge 13 commits into
warpdotdev:masterfrom
srinitude:kiren/hermes-agent-cli-parity

Conversation

@srinitude
Copy link
Copy Markdown

@srinitude srinitude commented May 11, 2026

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::Hermes
enum variant in app/src/terminal/cli_agent.rs and the full Pi dispatch surface
that every other recognized CLI agent (Pi / Auggie / Cursor CLI / Claude /
OpenCode / Gemini) already participates in:

  • Match-arm parity in every CLIAgent::Pi dispatch table (icon,
    command_prefix, detect_from_command, is_agent_supported, handler
    factory).
  • rich_input_submit_strategy(CLIAgent::Hermes) == DelayedEnter so Ctrl-G +
    rich input behave the same as Claude / OpenCode / Gemini / Auggie / Cursor
    CLI.
  • OSC777 agent="hermes" notifications deserialize to CLIAgent::Hermes and
    surface identically to Pi notifications.
  • AgentReviewCommentBatch accepts Hermes-attributed review comments.
  • Attach-code-as-context routes through SkillProvider::Agents for
    CLIAgent::Hermes.
  • launch_configs / vertical-tabs metadata round-trips a Hermes session.
  • ~/.warp/tab_configs/*.toml with agent = "hermes" deserializes to
    CLIAgent::Hermes.
  • hoa_remote_control / third-party remote-control dispatch accepts
    Hermes-tagged payloads.
  • CLIAgentType::from(CLIAgent::Hermes) == CLIAgentType::Hermes while
    preserving 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-implement issue 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

Testing

Automated

New deterministic tests are added in-place — no new files; existing
#[cfg(test)] modules and mod_tests.rs are grown in line with Warp practice:

  • app/src/terminal/cli_agent.rsCLIAgent::Hermes match-arm parity (icon,
    command_prefix, detect_from_command("hermes"), CLIAgentType::from /
    Serialize round-trip).
  • app/src/terminal/cli_agent_sessions/listener/mod.rs (+ mod_tests.rs) —
    is_agent_supported(&CLIAgent::Hermes) == true and
    create_handler(&CLIAgent::Hermes) returns
    Some(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 — OSC777 agent="hermes" deserialization
    plus CLIAgentType::Hermes / CLIAgentType::Claude telemetry round-trips
    that preserve the existing PascalCase wire convention.
  • Review-comment, attach-code-as-context, vertical-tabs, tab_configs, and
    remote-control dispatch tests for Hermes-tagged payloads, mirroring the
    existing Pi assertions.
  • Regression: every existing Pi-related test in the workspace continues to pass
    unchanged.

Manual

  • I have manually tested my changes locally with ./script/run
  • Oz manual-testing justification: the checkbox above remains intentionally
    unchecked 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 the
    pre-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

  • Warp Agent Mode - This PR was created via Warp's AI 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.

@cla-bot
Copy link
Copy Markdown

cla-bot Bot commented May 11, 2026

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 to trigger another check.

@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 11, 2026

@srinitude

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

oz-for-oss[bot]
oz-for-oss Bot previously requested changes May 11, 2026
Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

@srinitude

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

@github-actions github-actions Bot added the external-contributor Indicates that a PR has been opened by someone outside the Warp team. label May 11, 2026
@srinitude
Copy link
Copy Markdown
Author

Updated the PR description to use a closing keyword for same-repo issue #9745, which has the ready-to-implement label, while preserving references to prior Hermes PRs #9833 and #10546 per the implementation plan.

@srinitude srinitude force-pushed the kiren/hermes-agent-cli-parity branch from f342d24 to 2fc334f Compare May 11, 2026 23:48
@cla-bot
Copy link
Copy Markdown

cla-bot Bot commented May 11, 2026

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 to trigger another check.

@srinitude
Copy link
Copy Markdown
Author

@cla-bot check

@cla-bot cla-bot Bot added the cla-signed label May 11, 2026
@cla-bot
Copy link
Copy Markdown

cla-bot Bot commented May 11, 2026

The cla-bot has been summoned, and re-checked this pull request!

@srinitude
Copy link
Copy Markdown
Author

/oz-review

@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 11, 2026

@srinitude

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 /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

oz-for-oss[bot]
oz-for-oss Bot previously requested changes May 11, 2026
Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

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

  • CLIAgentType now uses enum-wide snake_case serde 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, making cargo test depend 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

Comment thread app/src/server/telemetry/events.rs Outdated

/// The CLI agent being used (for telemetry purposes).
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] This changes serialization for every existing CLI agent telemetry value (Claudeclaude, OpenCodeopen_code, etc.), not just Hermes; preserve the existing wire values or make the telemetry migration explicit.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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.

Comment thread app/src/terminal/cli_agent_tests.rs Outdated
.args([
"diff",
"--name-only",
"origin/master...HEAD",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ [IMPORTANT] This unit test depends on the local 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.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

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.

@srinitude srinitude force-pushed the kiren/hermes-agent-cli-parity branch from 2fc334f to baa6e27 Compare May 12, 2026 00:37
@srinitude
Copy link
Copy Markdown
Author

/oz-review

@oz-for-oss
Copy link
Copy Markdown
Contributor

oz-for-oss Bot commented May 12, 2026

@srinitude

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: @harryalbert.

Comment /oz-review on this pull request to retrigger a review (up to 3 times on the same pull request).

Powered by Oz

@oz-for-oss oz-for-oss Bot dismissed stale reviews from themself May 12, 2026 00:45

Oz no longer requests changes for this pull request after the latest automated review.

Copy link
Copy Markdown
Contributor

@oz-for-oss oz-for-oss Bot left a comment

Choose a reason for hiding this comment

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

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

@oz-for-oss oz-for-oss Bot requested a review from harryalbert May 12, 2026 00:46
Copy link
Copy Markdown
Contributor

@harryalbert harryalbert left a comment

Choose a reason for hiding this comment

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

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!

@srinitude
Copy link
Copy Markdown
Author

srinitude commented May 12, 2026

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.

@srinitude
Copy link
Copy Markdown
Author

@harryalbert Will make those PRs in the meantime over the next few days regardless

Copy link
Copy Markdown
Contributor

Makes sense, thank you for the contribution! Yeah if you send that notification PR my way I'm happy to take a look!

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

Labels

cla-signed external-contributor Indicates that a PR has been opened by someone outside the Warp team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Hermes Chat in Warp does not get the agent toolbelt / Rich Input / remote-control like Gemini CLI, and the session is harder to use

2 participants