Skip to content

fix!: drop Cursor support - #333

Merged
willkill07 merged 2 commits into
NVIDIA:mainfrom
willkill07:fix/relay-391-drop-cursor-support
Jun 30, 2026
Merged

fix!: drop Cursor support#333
willkill07 merged 2 commits into
NVIDIA:mainfrom
willkill07:fix/relay-391-drop-cursor-support

Conversation

@willkill07

@willkill07 willkill07 commented Jun 30, 2026

Copy link
Copy Markdown
Member

Overview

Remove Cursor as a supported NeMo Relay coding-agent integration because its inconsistent gateway behavior and limited hook coverage prevent reliable observability.

This is a breaking change for users of the nemo-relay cursor shortcut, --agent cursor, hook-forward cursor, the /hooks/cursor endpoint, or [agents.cursor] configuration.

  • I confirm this contribution is my own work, or I have the right to submit it under this project's license.
  • I searched existing issues and open pull requests, and this does not duplicate existing work.

Details

  • Remove the Cursor CLI command, agent variants, setup detection, configuration, doctor checks, hook endpoint, adapter, and temporary hook-file patching.
  • Delete the bundled Cursor hook integration and dedicated Cursor documentation.
  • Update public support matrices, examples, and CLI tests to list Claude Code, Codex, and Hermes.
  • Add regression coverage confirming cursor-agent is not inferred and Cursor is absent from CLI help.

Validation:

  • just test-rust
  • cargo fmt --all
  • cargo clippy --workspace --all-targets -- -D warnings
  • cargo test -p nemo-relay-cli after rebasing onto current main
  • just docs
  • uv run pre-commit run --all-files

Where should the reviewer start?

Start with crates/cli/src/config.rs for the supported-agent surface, then crates/cli/src/server.rs and crates/cli/src/launcher.rs for removal of the runtime hook and launch paths.

Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

Summary by CodeRabbit

  • Breaking Changes
    • Removed Cursor as a supported/recognized coding agent across the CLI, setup wizard, installer, launcher, and gateway hook routing.
    • Eliminated Cursor-specific hook handling and the related transparent-run restore/backup behavior.
  • Documentation
    • Updated all CLI and integration docs to remove Cursor from supported agents, examples, shortcut commands, and observability guidance (including deletion of the Cursor guide).
  • Tests
    • Updated coverage and expectations to exclude Cursor scenarios and verify remaining agents, including Hermes-focused hook-forwarding behavior.

Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07
willkill07 requested review from a team and lvojtku as code owners June 30, 2026 14:04
@github-actions github-actions Bot added size:XL PR is extra large Bug issue describes bug; PR fixes bug lang:rust PR changes/introduces Rust code labels Jun 30, 2026
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: b5569fe9-a1b0-4a64-a8c9-17ea8d7a401f

📥 Commits

Reviewing files that changed from the base of the PR and between 331235e and b7f8a4c.

📒 Files selected for processing (1)
  • crates/cli/tests/cli_tests.rs
📜 Recent review details
⏰ Context from checks skipped due to timeout. (2)
  • GitHub Check: Check / Run
  • GitHub Check: Preview docs
🧰 Additional context used
📓 Path-based instructions (10)
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Use snake_case naming convention for Rust identifiers (e.g., nemo_relay_tool_call)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

**/*.rs: Run cargo fmt --all to format all Rust code
Run cargo clippy --workspace --all-targets -- -D warnings to enforce all clippy lints as errors

**/*.rs: Run cargo fmt --all when Rust files changed as part of WebAssembly work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files changed as part of WebAssembly work

**/*.rs: If any Rust code changed, always run just test-rust
If any Rust code changed, also run cargo fmt --all
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings
Run Rust formatting with cargo fmt --all
Run Rust linting with cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Use cargo fmt for Rust code formatting
Run cargo clippy -- -D warnings to lint Rust code and treat all warnings as errors
Use Rust snake_case naming convention for Rust identifiers
Include SPDX license header in all Rust source files using double-slash comment syntax
Validate Rust code with uv run pre-commit run --all-files to enforce cargo fmt formatting check, cargo clippy lints, and cargo deny aud...

Files:

  • crates/cli/tests/cli_tests.rs
{crates/adaptive/**/*.rs,**/*test*.{rs,py,go,ts,js},**/*adaptive*test*.{rs,py,go,ts,js},docs/plugins/adaptive/**}

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Maintain documented and tested validation and report behavior for adaptive surfaces

Files:

  • crates/cli/tests/cli_tests.rs
**/{Cargo.toml,**/*.rs}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Maintain consistency between Rust package names in Cargo.toml and their actual usage across the codebase

Files:

  • crates/cli/tests/cli_tests.rs
**/*.{h,hpp,c,cpp,rs}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Ensure FFI header and library naming follows consistent conventions across platform-specific builds

Files:

  • crates/cli/tests/cli_tests.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)

Update Rust crate names and module prefixes during coordinated rename operations

Files:

  • crates/cli/tests/cli_tests.rs
**/*.{rs,py,js,ts,tsx,jsx,go,sh,toml,yaml,yml,md}

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files. The project is Apache-2.0.

Files:

  • crates/cli/tests/cli_tests.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions: Rust and Python use snake_case, C FFI exports prefixed nemo_relay_, Go uses PascalCase for public APIs, Node.js uses camelCase.

Files:

  • crates/cli/tests/cli_tests.rs
crates/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

crates/**/*.rs: Keep async behavior on the existing tokio-based model. Bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.
Use Json = serde_json::Value in Rust-facing runtime APIs for JSON payload handling.

Files:

  • crates/cli/tests/cli_tests.rs
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go, WebAssembly, and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings, documentation,
integration patches, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
  wasm/       # wasm-bindgen WebAssembly binding and JS wrappers
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
third_party/  # P...

Files:

  • crates/cli/tests/cli_tests.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/cli/tests/cli_tests.rs
🔇 Additional comments (1)
crates/cli/tests/cli_tests.rs (1)

1184-1199: LGTM!

Resolves the previously flagged gap: now explicitly asserts both nemo-relay cursor and hook-forward cursor are rejected (exit code 2, clap error messages), not just absent from help text.


Walkthrough

Removes Cursor support from the CLI, server routes, installer/launcher logic, setup and doctor flows, tests, and user-facing documentation. Claude Code, Codex, and Hermes remain as the supported agents.

Changes

Cursor Agent Removal

Layer / File(s) Summary
Documentation and integration artifacts
README.md, crates/cli/README.md, docs/..., integrations/coding-agents/...
Cursor is removed from support tables, quick-start guidance, integration READMEs, and Cursor-specific docs/artifacts.
Core type and config contract changes
crates/cli/src/config.rs, crates/cli/src/model.rs
Cursor is removed from the command, agent, and config enums/fields, and the agent mapping helpers no longer resolve Cursor names or hook paths.
Adapter module and server route removal
crates/cli/src/adapters/mod.rs, crates/cli/src/server.rs
The adapter registry drops Cursor, and /hooks/cursor routing and handling are removed from the server.
Installer and launcher cursor logic removal
crates/cli/src/installer.rs, crates/cli/src/launcher.rs, crates/cli/src/main.rs
Cursor-specific hook generation, helper utilities, backup/restore state, and CLI dispatch are removed.
Doctor and setup UI cursor removal
crates/cli/src/doctor.rs, crates/cli/src/setup.rs, crates/cli/src/setup/model.rs
Doctor and setup stop recognizing, listing, or parsing Cursor in agent detection, hook checks, and interactive selection.
Test suite updates
crates/cli/tests/cli_tests.rs, crates/cli/tests/coverage/*
Cursor test cases and fixtures are removed or rewritten to expect Claude Code, Codex, or Hermes behavior instead.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 70.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits and accurately summarizes the breaking removal of Cursor support.
Description check ✅ Passed The description matches the template with Overview, Details, reviewer start, and related issues sections filled in.
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 PR with unit tests

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

@github-actions

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/cli/tests/coverage/config_tests.rs (1)

238-298: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Add a regression for stale [agents.cursor] config.

Dropping the Cursor table from the happy-path fixture stops testing the breaking-change contract for existing user configs. Please add a dedicated parse test that feeds [agents.cursor] and asserts the intended outcome explicitly, so this removal cannot silently regress. As per path instructions, tests should cover the behavior promised by the changed API surface.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/cli/tests/coverage/config_tests.rs` around lines 238 - 298, The
happy-path TOML mapping test no longer covers the breaking-change behavior for
legacy Cursor configs. Add a dedicated regression test in the config tests
around resolve_run_config/explicit_toml_config_maps_supported_sections that
includes an [agents.cursor] table and asserts the intended result explicitly, so
the stale Cursor config contract is still verified independently of the other
agents.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@crates/cli/tests/cli_tests.rs`:
- Around line 1175-1181: The CLI help assertions in cli_tests should be paired
with explicit negative coverage for the removed Cursor entry points. Update the
relevant tests around the command parsing assertions to invoke both nemo-relay
cursor and hook-forward cursor and verify they fail/reject rather than just
omitting Cursor from help. Use the existing CLI test helpers and the affected
subcommand symbols to ensure a hidden alias or stale clap value cannot still
pass the suite.

---

Outside diff comments:
In `@crates/cli/tests/coverage/config_tests.rs`:
- Around line 238-298: The happy-path TOML mapping test no longer covers the
breaking-change behavior for legacy Cursor configs. Add a dedicated regression
test in the config tests around
resolve_run_config/explicit_toml_config_maps_supported_sections that includes an
[agents.cursor] table and asserts the intended result explicitly, so the stale
Cursor config contract is still verified independently of the other agents.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: d8c6a499-27ba-4f3b-b131-3ff101720382

📥 Commits

Reviewing files that changed from the base of the PR and between 06b324b and 331235e.

📒 Files selected for processing (34)
  • README.md
  • crates/cli/README.md
  • crates/cli/src/adapters/cursor.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/src/config.rs
  • crates/cli/src/doctor.rs
  • crates/cli/src/installer.rs
  • crates/cli/src/launcher.rs
  • crates/cli/src/main.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/tests/coverage/server_tests.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/agent-runtime-primer.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
  • docs/nemo-relay-cli/cursor.mdx
  • integrations/coding-agents/README.md
  • integrations/coding-agents/cursor/.cursor/hooks.json
  • integrations/coding-agents/cursor/README.md
💤 Files with no reviewable changes (9)
  • integrations/coding-agents/cursor/.cursor/hooks.json
  • integrations/coding-agents/cursor/README.md
  • docs/nemo-relay-cli/cursor.mdx
  • crates/cli/src/adapters/cursor.rs
  • crates/cli/src/main.rs
  • crates/cli/src/setup/model.rs
  • crates/cli/tests/coverage/installer_tests.rs
  • crates/cli/src/doctor.rs
  • crates/cli/tests/coverage/server_tests.rs
📜 Review details
🧰 Additional context used
📓 Path-based instructions (32)
{docs/**,README.md,CONTRIBUTING.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

{docs/**,README.md,CONTRIBUTING.md}: For docs-only changes, run targeted checks only if commands, package names, or examples changed. Use just docs for docs-site builds and just docs-linkcheck when links changed
Run docs site build with just docs

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
{docs/**,README.md,CONTRIBUTING.md,**/*.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Run docs link validation with just docs-linkcheck when links change

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • crates/cli/README.md
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • integrations/coding-agents/README.md
  • docs/nemo-relay-cli/basic-usage.mdx
{docs/**,README.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Verify README and docs entry points still match current package names and paths for large or public-facing changes

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
{docs/**,examples/**,README.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Verify examples still run with documented commands for large or public-facing changes

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
{docs/**,README.md,**/Cargo.toml,**/package.json,**/*.md}

📄 CodeRabbit inference engine (.agents/skills/validate-change/SKILL.md)

Ensure renamed public surfaces are reflected consistently in manifests and docs for large or public-facing changes

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • crates/cli/README.md
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • integrations/coding-agents/README.md
  • docs/nemo-relay-cli/basic-usage.mdx
**/*.{md,mdx,py,sh,yaml,yml,toml,json}

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

Keep package names, repo references, and build commands current

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • crates/cli/README.md
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • integrations/coding-agents/README.md
  • docs/nemo-relay-cli/basic-usage.mdx
**/*.mdx

📄 CodeRabbit inference engine (.agents/skills/contribute-docs/SKILL.md)

In MDX files, top-of-file comments must use JSX comment delimiters: {/* to open and */} to close. Do not use HTML comments for MDX SPDX headers.

MDX top-of-file SPDX comments must use {/* ... */} delimiters instead of HTML comment delimiters (Must-Fix)

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
**/*.{html,md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Include SPDX license header in HTML and Markdown files using HTML comment syntax

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • crates/cli/README.md
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • integrations/coding-agents/README.md
  • docs/nemo-relay-cli/basic-usage.mdx
docs/**/*.{md,mdx}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update embedded documentation snippets, patch docs, and binding-support notes if examples or supported bindings changed

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
docs/**

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Run just docs or ./scripts/build-docs.sh html to regenerate ignored Fern API reference pages before validation for documentation site changes

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
**

⚙️ CodeRabbit configuration file

**:

AGENTS.md

This file provides guidance to agents, including Claude Code and OpenAI Codex, when working in this repository.

Project Overview

NeMo Relay is a multi-language agent runtime framework for execution scopes, lifecycle events, middleware, plugins, and observability around tool and LLM calls. The core runtime is Rust. Primary supported bindings are Rust, Python, and Node.js. Go, WebAssembly, and the raw C FFI are experimental and source-first.

The shared runtime model is:

  1. Scope stacks decide where work belongs and which scope-local behavior is visible.
  2. Middleware registries decide what guardrails and intercepts run around managed calls.
  3. Plugins install reusable runtime behavior from configuration.
  4. Events record runtime behavior in ATOF form.
  5. Subscribers and exporters consume events in-process or export them to ATIF, OpenTelemetry, OpenInference, or other backends.

Repository Structure

The repository layout separates the Rust runtime, language bindings, documentation,
integration patches, and agent-facing skills.

crates/
  core/       # Rust core runtime crate, published as nemo-relay
  adaptive/   # Adaptive runtime primitives and plugin components
  python/     # PyO3 native extension for the Python package
  ffi/        # Raw C ABI layer used by downstream bindings such as Go
  node/       # NAPI Node.js binding and JavaScript/TypeScript entry points
  wasm/       # wasm-bindgen WebAssembly binding and JS wrappers
python/
  nemo_relay/  # Python wrapper package: scopes, tools, LLM, middleware, typed helpers, plugins, adaptive helpers
  tests/      # Python tests
go/
  nemo_relay/  # Experimental Go CGo binding and tests
fern/         # Fern documentation site
scripts/      # Stable wrappers and helper scripts; build/test/docs entry points live in justfile
third_party/  # P...

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/README.md
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • README.md
  • crates/cli/src/adapters/mod.rs
  • docs/nemo-relay-cli/about.mdx
  • crates/cli/tests/coverage/session_tests.rs
  • integrations/coding-agents/README.md
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • docs/nemo-relay-cli/basic-usage.mdx
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}

⚙️ CodeRabbit configuration file

{docs/**,README.md,CONTRIBUTING.md,RELEASING.md,SECURITY.md}: Review documentation for technical accuracy against the current API, command correctness, and consistency across language bindings.
Flag stale examples, missing SPDX headers where required, and instructions that no longer match CI or pre-commit behavior.

Files:

  • docs/getting-started/agent-runtime-primer.mdx
  • docs/about-nemo-relay/overview.mdx
  • docs/getting-started/quick-start/index.mdx
  • docs/integrate-into-frameworks/about.mdx
  • README.md
  • docs/nemo-relay-cli/about.mdx
  • docs/nemo-relay-cli/basic-usage.mdx
**/*.rs

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Use snake_case naming convention for Rust identifiers (e.g., nemo_relay_tool_call)

**/*.rs: Any Rust change must run just test-rust
Any Rust change must run cargo fmt --all
Any Rust change must run cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all for all FFI work since it is Rust work
Run just test-rust to validate FFI changes
Run cargo clippy --workspace --all-targets -- -D warnings to enforce strict linting on FFI work

When Rust files changed as part of Go work, also run cargo fmt --all, just test-rust, and cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Run cargo fmt --all when Rust files are changed as part of Node work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files are changed as part of Node work
Run just test-rust when Rust files are changed as part of Node work

**/*.rs: Run cargo fmt --all to format all Rust code
Run cargo clippy --workspace --all-targets -- -D warnings to enforce all clippy lints as errors

**/*.rs: Run cargo fmt --all when Rust files changed as part of WebAssembly work
Run cargo clippy --workspace --all-targets -- -D warnings when Rust files changed as part of WebAssembly work

**/*.rs: If any Rust code changed, always run just test-rust
If any Rust code changed, also run cargo fmt --all
If any Rust code changed, also run cargo clippy --workspace --all-targets -- -D warnings
Run Rust formatting with cargo fmt --all
Run Rust linting with cargo clippy --workspace --all-targets -- -D warnings

**/*.rs: Use cargo fmt for Rust code formatting
Run cargo clippy -- -D warnings to lint Rust code and treat all warnings as errors
Use Rust snake_case naming convention for Rust identifiers
Include SPDX license header in all Rust source files using double-slash comment syntax
Validate Rust code with uv run pre-commit run --all-files to enforce cargo fmt formatting check, cargo clippy lints, and cargo deny aud...

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
{crates/adaptive/**/*.rs,**/*test*.{rs,py,go,ts,js},**/*adaptive*test*.{rs,py,go,ts,js},docs/plugins/adaptive/**}

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Maintain documented and tested validation and report behavior for adaptive surfaces

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
**/{Cargo.toml,**/*.rs}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Maintain consistency between Rust package names in Cargo.toml and their actual usage across the codebase

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
**/*.{h,hpp,c,cpp,rs}

📄 CodeRabbit inference engine (.agents/skills/maintain-packaging/SKILL.md)

Ensure FFI header and library naming follows consistent conventions across platform-specific builds

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)

Update Rust crate names and module prefixes during coordinated rename operations

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
**/*.{rs,py,js,ts,tsx,jsx,go,sh,toml,yaml,yml,md}

📄 CodeRabbit inference engine (AGENTS.md)

Keep SPDX headers on source, docs, scripts, and configuration files. The project is Apache-2.0.

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/README.md
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • README.md
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • integrations/coding-agents/README.md
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
**/*.{rs,py,go,js,ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Follow binding naming conventions: Rust and Python use snake_case, C FFI exports prefixed nemo_relay_, Go uses PascalCase for public APIs, Node.js uses camelCase.

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
crates/**/*.rs

📄 CodeRabbit inference engine (AGENTS.md)

crates/**/*.rs: Keep async behavior on the existing tokio-based model. Bindings should preserve callback and future lifetimes rather than blocking or hiding async work unexpectedly.
Use Json = serde_json::Value in Rust-facing runtime APIs for JSON payload handling.

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/src/adapters/mod.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/src/model.rs
  • crates/cli/src/server.rs
  • crates/cli/src/setup.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/installer.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/src/launcher.rs
  • crates/cli/tests/coverage/launcher_tests.rs
  • crates/cli/src/config.rs
{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}

⚙️ CodeRabbit configuration file

{crates/**/tests/**,python/tests/**,go/nemo_relay/**/*_test.go}: Tests should cover the behavior promised by the changed API surface, including error paths and cross-request isolation where relevant.
Prefer assertions on lifecycle events, scope stacks, middleware ordering, and binding parity over shallow smoke tests.

Files:

  • crates/cli/tests/coverage/main_tests.rs
  • crates/cli/tests/coverage/setup_tests.rs
  • crates/cli/tests/coverage/plugin_shim_tests.rs
  • crates/cli/tests/coverage/session_tests.rs
  • crates/cli/tests/cli_tests.rs
  • crates/cli/tests/coverage/adapters_tests.rs
  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/tests/coverage/doctor_tests.rs
  • crates/cli/tests/coverage/launcher_tests.rs
**/*.{md,rst,html,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

**/*.{md,rst,html,txt}: Always spell NVIDIA in all caps. Do not use Nvidia, nvidia, nVidia, nVIDIA, or NV.
Use an NVIDIA before a noun because the name starts with an 'en' sound.
Do not add a registered trademark symbol after NVIDIA when referring to the company.
Use trademark symbols with product names only when the document type or legal guidance requires them.
Verify official capitalization, spacing, and hyphenation for product names.
Precede NVIDIA product names with NVIDIA on first mention when it is natural and accurate.
Do not rewrite product names for grammar or title-case rules.
Preserve third-party product names according to the owner's spelling.
Include the company name and full model qualifier on first use when it helps identify the model.
Preserve the official capitalization and punctuation of model names.
Use shorter family names only after the full name is established.
Spell out a term on first use and put the acronym in parentheses unless the acronym is widely understood by the intended audience.
Use the acronym on later mentions after it has been defined.
For long documents, reintroduce the full term if readers might lose context.
Form plurals of acronyms with s, not an apostrophe, such as GPUs.
In headings, common acronyms can remain abbreviated. Spell out the term in the first or second sentence of the body.
Common terms such as CPU, GPU, PC, API, and UI usually do not need to be spelled out for developer audiences.

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/*.{md,rst,html}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-brand-terminology.md)

Link the first mention of a product name when the destination helps the reader.

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/*.md

📄 CodeRabbit inference engine (.agents/skills/contribute-integration/SKILL.md)

Documentation must be updated if activation or usage changed

**/*.md: Use title case consistently in technical documentation headings
Avoid quotation marks, ampersands, and exclamation marks in headings
Keep product, event, research, and whitepaper names in their official title case
Use title case for table headers
Do not force social-media sentence case into technical docs
Format code elements, commands, parameters, package names, and expressions in monospace
Format directories, file names, and paths in monospace using backticks
Use angle brackets inside monospace for variables inside paths, such as /home/<username>/.login
Format error messages and strings in quotation marks, keeping literal code strings in code formatting when clearer
Format UI buttons, menus, fields, and labels in bold
Use angle brackets between UI labels for menu paths, such as File > Save As
Use italics for new terms on first use, sparingly and only when introducing the term
Use italics for publication titles
Format keyboard shortcuts in plain text, such as Press Ctrl+Alt+Delete
Use owner/repo link text for GitHub repositories, preferring [NVIDIA/NeMo](link) over prose references like 'the GitHub repo'
Introduce every code block with a complete sentence
Do not make a code block complete the grammar of the previous sentence
Do not continue a sentence after a code block
Use syntax highlighting when the format supports it for code blocks
Avoid the word 'snippet' unless the surrounding docs already use it as a term of art
Keep inline method, function, and class references consistent with nearby docs, omitting empty parentheses for prose readability when no call is shown
Use descriptive anchor text that matches the destination title when possible for links
Avoid raw URLs in running text
Avoid generic anchor text such as 'here,' 'this page,' and 'read more'
Include acronyms in link text when a linked term includes an acronym
Do not link long sentences or multiple sentences
Avoid links ...

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/{docs,examples,**/*.md,*.patch,*.diff,.github,*.sh,*.yaml,*.yml}

📄 CodeRabbit inference engine (.agents/skills/rename-surfaces/SKILL.md)

Update documentation, examples, CI configuration, and patch artifacts when performing rename operations

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/*.{md,rst,txt}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

Spell NVIDIA in all caps. Do not use Nvidia, nvidia, or NV.

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/*.{md,rst}

📄 CodeRabbit inference engine (.agents/skills/review-doc-style/assets/nvidia-style-guide.md)

**/*.{md,rst}: Format commands, code elements, expressions, package names, file names, and paths as inline code.
Use descriptive link text. Avoid raw URLs and weak anchors such as "here" or "read more."
Use title case consistently for technical documentation headings.
Introduce code blocks, lists, tables, and images with complete sentences.
Write procedures as imperative steps. Keep steps parallel and split long procedures into smaller tasks.
Prefer active voice, present tense, short sentences, contractions, and plain English.
Use can for possibility and reserve may for permission.
Use after for temporal relationships instead of once.
Prefer refer to over see when the wording points readers to another resource.
Avoid culture-specific idioms, unnecessary Latinisms, jokes, and marketing exaggeration in technical docs.
Spell out months in body text, avoid ordinal dates, and use clear time zones.
Spell out whole numbers from zero through nine unless they are technical values, parameters, versions, or UI values.
Use numerals for 10 or greater and include commas in thousands.
Do not add trademark symbols to learning-oriented docs unless the source, platform, or legal guidance explicitly requires them.

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
**/README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update relevant crate or package README when that surface changed

Files:

  • crates/cli/README.md
  • README.md
  • integrations/coding-agents/README.md
{README.md,docs/getting-started/**/*.md}

📄 CodeRabbit inference engine (.agents/skills/add-binding-feature/SKILL.md)

Update README.md, docs/getting-started/, or binding-level READMEs if behavior differs by language or usage changed

Files:

  • README.md
README.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update README.md to reflect current workspace members and top-level documentation when workspace structure changes

Files:

  • README.md
{README.md,docs/**/*.{md,rst,txt},fern/**/*}

📄 CodeRabbit inference engine (.agents/skills/prepare-code-freeze/SKILL.md)

Search and update documentation source for references to the old version in README.md, docs, and fern directories, updating current-version install commands, package examples, and configuration examples to <next-version>

Files:

  • README.md
**/*config*.{rs,ts,py,go,js,json,yaml,yml}

📄 CodeRabbit inference engine (.agents/skills/maintain-optimizer/SKILL.md)

Ensure dynamic config shape still matches the documented canonical model

Files:

  • crates/cli/tests/coverage/config_tests.rs
  • crates/cli/src/config.rs
🔇 Additional comments (22)
crates/cli/src/model.rs (1)

7-12: LGTM!

Also applies to: 17-24, 28-50

crates/cli/src/config.rs (1)

522-530: LGTM!

Also applies to: 613-617, 657-664, 952-952, 1229-1244, 1362-1368, 1373-1379, 1383-1394

crates/cli/src/adapters/mod.rs (1)

4-5: LGTM!

Also applies to: 377-403

crates/cli/src/server.rs (1)

26-26: LGTM!

Also applies to: 166-183, 376-389

crates/cli/src/installer.rs (2)

201-208: LGTM!

Also applies to: 230-244, 275-281


4-5: 📐 Maintainability & Code Quality

No unused import issue hereRead is used by stdin().read_to_string(...), and Path is no longer referenced.

crates/cli/src/launcher.rs (1)

22-22: LGTM!

Also applies to: 228-234, 238-248, 253-261, 263-269, 502-516, 582-613

crates/cli/src/setup.rs (2)

63-63: LGTM!

Also applies to: 185-186, 199-235


204-208: 🎯 Functional Correctness

No residual Cursor references remain in the CLI crate.

README.md (1)

29-29: LGTM!

Also applies to: 282-285

crates/cli/README.md (1)

30-31: LGTM!

Also applies to: 46-47

docs/about-nemo-relay/overview.mdx (1)

44-44: LGTM!

docs/nemo-relay-cli/basic-usage.mdx (1)

16-16: LGTM!

Also applies to: 28-30, 61-62, 74-74, 145-150, 337-345, 374-376

integrations/coding-agents/README.md (1)

33-36: LGTM!

Also applies to: 46-52

docs/getting-started/agent-runtime-primer.mdx (1)

112-112: LGTM!

docs/getting-started/quick-start/index.mdx (1)

41-41: LGTM!

docs/integrate-into-frameworks/about.mdx (1)

53-53: LGTM!

docs/nemo-relay-cli/about.mdx (1)

24-25: LGTM!

Also applies to: 50-51, 64-65

crates/cli/tests/coverage/launcher_tests.rs (1)

5-5: LGTM!

Also applies to: 161-201, 724-757, 760-795

crates/cli/tests/coverage/main_tests.rs (1)

215-215: LGTM!

crates/cli/tests/coverage/plugin_shim_tests.rs (1)

2033-2041: LGTM!

Also applies to: 2073-2073

crates/cli/tests/coverage/session_tests.rs (1)

3427-3448: LGTM!

Also applies to: 4272-4309, 4388-4409

Comment thread crates/cli/tests/cli_tests.rs
@willkill07 willkill07 self-assigned this Jun 30, 2026
@willkill07 willkill07 added this to the 0.5 milestone Jun 30, 2026
@willkill07 willkill07 added the breaking PR introduces a breaking change label Jun 30, 2026
@bbednarski9

Copy link
Copy Markdown
Contributor

Agree that this support should be dropped. I haven't seen a strong case or passionate customers for these features. No need to carry it for now

@mnajafian-nv mnajafian-nv left a comment

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.

LGTM overall. The Cursor removal looks clean and consistent end to end. I left one small inline note on the legacy config migration path, but this looks good to merge from my side.

CodingAgent::infer("cursor-agent"),
Some(CodingAgent::Cursor)
);
assert_eq!(CodingAgent::infer("cursor-agent"), None);

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.

One behavior I’d love to make explicit before this disappears into history is the legacy Cursor config path. We now verify that cursor-agent is no longer inferred, but existing [agents.cursor] config also appears to be ignored silently after this change. A small regression test for the intended stale-config behavior would make the breaking-change contract much clearer for future reviewers.

@bbednarski9

Copy link
Copy Markdown
Contributor

Do we now silently fail on cursor configs? Maybe a deprecation warning would be helpful

@willkill07

Copy link
Copy Markdown
Member Author

@bbednarski9 @mnajafian-nv the current behavior for config files do not specify deny_unknown_fields so it would be a breaking behavioral change to pivot to that. If you want this behavior, we can do that.

In config.toml, the typed configuration structs do not use deny_unknown_fields, so these are silently ignored:

  • Unknown top-level sections
  • Unknown keys under [gateway], [upstream], [plugins], or [agents]
  • Unknown agent names under [agents]
  • Unknown fields under [agents.claude], [agents.codex], or [agents.hermes]

Let me know what you want me to do.

cursor subcommands have all been removed and will fail as non-existent.

@willkill07 willkill07 changed the title fix: drop Cursor support fix!: drop Cursor support Jun 30, 2026
Signed-off-by: Will Killian <wkillian@nvidia.com>
@willkill07
willkill07 merged commit 13f054b into NVIDIA:main Jun 30, 2026
35 checks passed
@willkill07
willkill07 deleted the fix/relay-391-drop-cursor-support branch June 30, 2026 21:49
rapids-bot Bot pushed a commit that referenced this pull request Jul 1, 2026
#### Overview

Establish explicit, shared extraction-strategy boundaries before code is moved onto them: provider schema extraction (codec-owned), agent payload extraction (harness-owned), and exporter projection. This is a refactor — runtime ownership, event shapes, and binding-facing behavior are unchanged. The only public surface added is the additive `normalize_request_with_hint`.

This branch has been merged with current `main` after PR #333 removed Cursor support; the agent-side extraction split now covers the supported coding-agent integrations: Claude Code, Codex, and Hermes.

- [x] I confirm this contribution is my own work, or I have the right to submit it under this project's license.
- [x] I searched existing issues and open pull requests, and this does not duplicate existing work.

#### Details

**What changed**

Provider schema extraction (`crates/core`):
- Renamed the internal codec registry surface to provider-extraction names: `SurfaceDescriptor` → `ProviderSurfaceDescriptor`, `REGISTRY` → `BUILTIN_PROVIDER_SURFACES`, per-codec `SURFACE_DESCRIPTOR` → `PROVIDER_SURFACE`, and the detector fn aliases to `RequestSurfaceDetector` / `ResponseSurfaceDetector`. All remain `pub(crate)`.
- Documented `LlmResponseCodec::decode_response` as the provider response-extraction interface (model name, finish reason, tool calls, usage, cost, provider-specific fields, replayable response data).
- Added hint-aware request normalization: `normalize_request_with_hint(request, hint)` (the existing `normalize_request` now delegates with `None`). `EventNormalizationExt` threads the managed provider-route event name (e.g. `anthropic.messages`) as the codec hint, so an Anthropic Messages body without a top-level `system` no longer misroutes to the OpenAI Chat codec. The Anthropic detector accepts both `"anthropic"` and `"anthropic.messages"` hints.

Agent payload extraction (`crates/cli`):
- Added shared low-level JSON-path primitives in `crates/cli/src/json_path.rs`, consumed by both adapter and alignment code (existing names preserved via re-export).
- Split agent payload extraction into per-host `AgentPayloadExtractor` implementations for Claude Code, Codex, and Hermes; event construction (`common_*_event`, `classify`) stays shared and takes `&dyn AgentPayloadExtractor`.
- Split provider request extraction into per-route `ProviderRequestExtractor` implementations (OpenAI Responses / Chat Completions / Models, Anthropic Messages / Count-Tokens), selected by gateway route.
- Compatibility fallbacks (synthetic session IDs, synthetic tool-call IDs, `unknown_tool`, generic subagent ID, `Value::Null`) stay at the adapter/session boundary; extractors return `None` for absent fields. Path/PII fields (cwd, transcript_path, project_dir, user email) are not promoted into shared metadata.

Docs:
- New "Extraction Strategy Boundaries" section in `docs/about-nemo-relay/concepts/codecs.mdx` documenting the provider / agent / exporter split and fallback semantics for missing, sparse, lossy, and summary-only payloads.

**Why**

Multiple components pull structured information from heterogeneous agent and provider payloads. Defining the strategy interfaces (and separating agent-payload extraction from provider-schema extraction) up front lets later work migrate the duplicated, best-effort extraction chains onto shared seams without widening the public API.

**How it was tested**

Latest validation after merging current `main`:
- `cargo fmt --all`
- `cargo test -p nemo-relay-cli adapters::tests`
- `PYO3_PYTHON=/Users/yuchenz/Desktop/Work/Project/NeMo-Flow/.venv/bin/python cargo clippy --workspace --all-targets -- -D warnings`
- `just test-rust`
- `git diff --check`

Additional validation performed earlier on this branch:
- `uv run pre-commit run --all-files` — SPDX/fmt/clippy/audit + public-docstring gate.

Validation scope for review:
- `validate-change` was used to select the required matrix. Because this PR touches `crates/core` event normalization (`EventNormalizationExt` and `normalize_request_with_hint`), pre-merge verification should include the broader runtime/language matrix, not Rust-only coverage: `cargo fmt --all`, `cargo clippy --workspace --all-targets -- -D warnings`, `just test-rust`, `just test-python`, `just test-node`, `just test-go`, and `just test-wasm`.
- Docs changes should also be covered by `just docs` before merge. Binding behavior is expected to remain compatible because the core API change is additive, event shapes are unchanged, and renamed codec registry symbols remain `pub(crate)`; the full binding matrix is still the required check set for this `crates/core` change.

**Breaking changes**

None from this PR. `normalize_request_with_hint` is additive; `normalize_request` keeps its signature and behavior (delegates with no hint).

#### Where should the reviewer start?

`crates/cli/src/adapters/mod.rs` (the `AgentPayloadExtractor` implementations and the per-agent path tables), then `crates/cli/src/json_path.rs` and the adapter coverage tests, then `crates/cli/src/alignment/mod.rs` (`ProviderRequestExtractor` split), and finally `crates/core/src/codec/resolve.rs` (descriptor rename + hint threading) with `crates/core/src/api/event.rs` for the hint wiring.

#### Related Issues: (use one of the action keywords Closes / Fixes / Resolves / Relates to)

Authors:
  - Yuchen Zhang (https://github.com/yczhang-nv)

Approvers:
  - Will Killian (https://github.com/willkill07)
  - https://github.com/lvojtku

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

Labels

breaking PR introduces a breaking change Bug issue describes bug; PR fixes bug lang:rust PR changes/introduces Rust code size:XL PR is extra large

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants