Skip to content

feat(core): compile-time mcp feature gate (#4799)#4914

Merged
M3gA-Mind merged 24 commits into
tinyhumansai:mainfrom
oxoxDev:feat/4799-mcp-feature-gate
Jul 16, 2026
Merged

feat(core): compile-time mcp feature gate (#4799)#4914
M3gA-Mind merged 24 commits into
tinyhumansai:mainfrom
oxoxDev:feat/4799-mcp-feature-gate

Conversation

@oxoxDev

@oxoxDev oxoxDev commented Jul 15, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Adds a compile-time Cargo mcp feature (default-ON) gating mcp_client / mcp_server / mcp_registry / mcp_audit~20.1k LOC and ~19 agent tools — composing with the runtime DomainSet::mcp flag from feat(core): DomainSet on CoreBuilder + DomainRegistration filter seam (feature-gate prerequisite) #4796.
  • Default build is byte-identical — every change is cfg-off-only. Slim builds opt out via cargo build --no-default-features --features "<gates without mcp>".
  • Corrects the issue's premise: "sheds the MCP SDK / transport stack" is false — there is no MCP SDK. The protocol is hand-rolled over tokio stdio + reqwest + axum, all load-bearing elsewhere. Sheds zero deps (mcp = []).
  • The CLI fails loudly, not silently (the issue's explicit requirement) — openhuman-core mcp and mcp-server exit 1 with a build-fact error. Verified on the real binary.
  • Pattern: facade+stub, plus a split facade for mcp_client — the gate follows the real dependency graph, not the directory name.

Problem

#4795 wants one compile-time feature gate per subsystem family; #4796 shipped the runtime DomainSet axis. This PR adds the compile-time half for the MCP family. Three findings reshaped the scope:

  • There is no MCP SDK to shed. The issue's DoD claims this gate "sheds the MCP SDK / transport stack". A full dependency sweep found no such crate: transport is hand-rolled over tokio process stdio, reqwest, and axum — each load-bearing for non-MCP domains. So mcp = [] and the gate's value is LOC, RPC surface, tool-belt size and attack surface, not binary size.
  • mcp_client is not all MCP. sanitize and client::{McpHttpClient, redact_endpoint} are mis-housed shared utilities: a GitBook docs tool dials McpHttpClient, and the orchestrator prompt runs sanitize::sanitize_for_llm over skill descriptions. Gating the module wholesale breaks both.
  • Naming is inverted from intuition. mcp_client holds the static, config-declared server set; mcp_registry holds the dynamic mcp_clients.db installs. Both must be gated, and the names actively mislead — now documented in AGENTS.md.

Two epic DoD bullets also do not apply: "Add a DomainSet flag on CoreBuilder" is already landed by #4796 (PR #4808); "sheds its exclusive dependencies" is boilerplate that is false here, as above.

Solution

  • Cargo.toml: mcp = [] added to default — dep list intentionally empty, commented so nobody "fixes" it later.

  • Split facade for mcp_client. The real client/registry surface goes behind #[cfg(feature = "mcp")]; sanitize + client::{McpHttpClient, redact_endpoint} stay always compiled, because the docs tool and the orchestrator prompt reach them from outside the MCP family. (Recommend a follow-up to relocate them — see ## Related.)

  • Facade+stub for mcp_server, mcp_registry, mcp_audit: pub mod stays compiled, real submodules gated, stub.rs mirrors the always-on caller surface with disabled-error / empty bodies.

  • ConnectedServerOverview relocated into the dep-free types.rs rather than mirrored in a stub — an improvement on the plan: both builds now share one definition, so field drift between configs is structurally impossible.

  • CLI fails loudly. cli.rs is untouched; the stub bails. Verified on the real binary — openhuman-core mcp and mcp-server both exit=1 with:

    mcp feature disabled at compile time: this build was compiled without the mcpfeature, so the MCP stdio server is unavailable. Rebuild with--features mcp.

    Not "unknown namespace". No existing test covered this path — only running the binary proved it.

  • Dangling-subagent contract pinned. The gate rests on the agent loader tolerating a dangling mcp_agent subagent id (it warns and skips — a documented contract). Two new tests pin it, so a future "strict unknown subagent" change fails loudly instead of silently breaking slim builds.

  • App forwarding (app/src-tauri/Cargo.toml): openhuman_core is default-features = false, so mcp is added explicitly to keep the domain in the shipped desktop app. Verified via cargo tree -e features -i openhuman.

  • CI: no change needed — the rust-feature-gate-smoke lane is a deny-by-default allow-list (--no-default-features --features tokenjuice-treesitter), so a new default-ON gate is excluded automatically and the disabled combination is already covered.

When off: the mcp_clients + mcp_audit namespaces are absent from /schema and their methods return a clean JSON-RPC unknown-method (-32000); the ~19 MCP tools are absent; the MCP CLI subcommands exit 1 with the build-fact error above.

Submission Checklist

If a section does not apply to this change, mark the item as N/A with a one-line reason. Do not delete items.

  • Tests added or updated (happy path + at least one failure / edge case) per Testing Strategy — both-direction gate tests, the CLI build-fact error, and 2 new tests pinning the dangling-subagent contract; non-MCP coverage kept alive in slim builds.
  • N/A: no instrumented changed lines — the diff is compile-config only (#[cfg] attrs, a Cargo feature, stub facades, a type relocation, docs); diff-cover reports no coverable lines. The directional gate tests cover the on/off behaviour. — Diff coverage ≥ 80%
  • N/A: compile-time build-config change, no user-facing feature row — Coverage matrix updated
  • N/A: no matrix rows affected — All affected feature IDs from the matrix are listed in the PR description under ## Related
  • No new external network dependencies introduced (mock backend used per Testing Strategy) — no deps added or removed; mcp = [].
  • N/A: default build is byte-identical, so no release-cut surface changes — Manual smoke checklist updated if this touches release-cut surfaces (docs/RELEASE-MANUAL-SMOKE.md)
  • Linked issue closed via Closes #NNN in the ## Related section

Impact

  • Desktop / CLI / mobile / web: no behaviour change — default keeps mcp on and the build is byte-identical.
  • CLI (slim builds only): openhuman-core mcp and mcp-server exit 1 with an explicit build-fact error rather than appearing to work.
  • Slim builds: drop ~20.1k LOC, 2 RPC namespaces, and ~19 agent tools. No binary-size win — zero deps shed.
  • Security: slim builds lose the MCP stdio/HTTP server and dynamic Smithery installs — a substantial attack-surface reduction for headless deployments.
  • Migration / compatibility: none. Additive and default-preserving.

Related


AI Authored PR Metadata (required for Codex/Linear PRs)

Linear Issue

  • Key: N/A — GitHub-issue driven, no Linear ticket.
  • URL: N/A

Commit & Branch

  • Branch: feat/4799-mcp-feature-gate
  • Commit SHA: a74f15ad79a098485c6470c25ba1e41f2b7d5222 (13 commits, 26 files, +918/-59)

Validation Run

  • N/A: no frontend changes — pnpm --filter openhuman-app format:check
  • N/A: no frontend changes — pnpm typecheck
  • Focused tests: scoped enabled-config tests pass; both-direction gate tests + the CLI build-fact test + the 2 dangling-subagent contract tests pass.
  • Rust fmt/check (if changed): cargo fmt clean · enabled cargo check 0 errors · disabled cargo check --no-default-features --features tokenjuice-treesitter 0 errors · clippy — see Validation Blocked for 6 pre-existing errors.
  • N/A: manifest-only change to app/src-tauri/Cargo.toml (one dep line), no Tauri Rust source touched — forwarding verified via cargo tree -e features -i openhuman — Tauri fmt/check (if changed)

Boot smoke (both directions, 2 runs for repeatability) — both configs built, linked, booted, and served /rpc:

  • Gate ON: mcp_clients namespace present in /schema; probe → {"result":{"installed":[]}}.
  • Gate OFF: mcp_clients + mcp_audit absent; methods return a clean JSON-RPC unknown-method (-32000); the process survives. CLI subcommands exit 1 with the build-fact error — verified on the real binary, since no test covered it.

Validation Blocked

  • command: cargo clippy
  • error: 6 clippy errors.
  • impact: Pre-existing — they reproduce identically on a clean base, so they are not introduced by this PR. Disclosed rather than worked around.

  • command: cargo test --no-default-features
  • error: 2 pre-existing failures on main today — group_mapping_smoke and harness_excludes_gated_namespaces, both asserting the voice namespace uncfg'd (fallout from the merged voice gate feat(core): feature gate — voice #4803). CI cannot see them: the feature-gate smoke lane runs cargo check, which never compiles test code.
  • impact: Not introduced by this PR and not fixed by it. This PR cfg'd its own asserts and left voice's alone; the voice asserts are a separate, epic-level fix that is pending. Scoped enabled-config tests and both-direction cargo check are green.

Behavior Changes

  • Intended behavior change: new default-ON mcp compile-time gate. Default build unchanged.
  • User-visible effect: none by default. Slim builds omit the MCP namespaces + ~19 tools, and the MCP CLI subcommands exit 1 with an explicit build-fact error.

Parity Contract

  • Legacy behavior preserved: yes — every change is cfg-off-only, so the default build is byte-identical.
  • Guard/fallback/dispatch parity checks: gate ON reproduces current registration exactly (verified by boot smoke against the live /rpc); gate OFF yields absence at every registration site, and the CLI fails loudly rather than degrading to "unknown namespace". ConnectedServerOverview has a single definition shared by both configs (relocated to types.rs), so field drift is structurally impossible. The loader's dangling-mcp_agent tolerance is now pinned by tests, so the contract the gate rests on cannot silently regress. Composes with, and does not replace, the runtime DomainSet::mcp guard from feat(core): DomainSet on CoreBuilder + DomainRegistration filter seam (feature-gate prerequisite) #4796.

Duplicate / Superseded PR Handling

Summary by CodeRabbit

  • New Features
    • Added an mcp build option enabled by default, bringing MCP connectivity, MCP tools, MCP registry behavior, and MCP audit support into standard builds.
  • Bug Fixes
    • Disabled builds now reliably respond with clear “feature disabled at compile time” behavior for MCP commands, and MCP-specific tools/agents/audit entries are omitted without breaking orchestrator config.
  • Documentation
    • Added MCP gate documentation describing enabled/disabled behavior and expected CLI diagnostics.
  • Tests
    • Expanded feature-aware test coverage for MCP vs non-MCP builds across commands, tools, registries, audits, and agent loading.

oxoxDev added 13 commits July 15, 2026 18:08
Empty feature list on purpose: there is no MCP SDK in this crate. The whole
protocol stack is hand-rolled over tokio process stdio + reqwest + axum, all
load-bearing for non-MCP domains, so the gate drops ~20k LOC and ~19 agent
tools but ZERO dependencies. The comment records that fact so nobody "fixes"
the empty list into `dep:` entries later.
…pes (tinyhumansai#4799)

The always-compiled orchestrator prompt builder consumes this type, but it
lived in connections.rs alongside the tokio/stdio connection map that the
`mcp` feature gates. Relocating it to the inert serde-only types module lets
both builds share ONE real definition instead of a hand-mirrored stub copy,
so the struct's fields can never drift between them.

connections re-exports it, so mcp_registry::connections::ConnectedServerOverview
keeps resolving for every existing caller.
…umansai#4799)

Facade + stub: types stays ungated (inert serde data consumed by the
always-compiled orchestrator prompt), behaviour is gated. The stub's
aggregator returns an empty Vec, which is what keeps src/core/all.rs — the
epic's hottest multi-agent file — free of any #[cfg] for this gate.

boot/bus/supervisor no-op, oauth::complete errors, connected_overview and
all_connected_tools return empty; every always-on caller already tolerates
those shapes with zero call-site edits.
…sai#4799)

Same facade+stub+ungated-types shape as mcp_registry. The audit log records
calls made through the MCP server, so with MCP compiled out there is no
writer: list_writes returns Ok(empty) rather than Err — the query genuinely
succeeded and the log is genuinely empty.
…st (tinyhumansai#4799)

tools::types stays ungated so McpToolSpec — inert &'static str + Value data
named by the always-compiled tool_registry — is the same real type in both
builds.

src/core/cli.rs is deliberately NOT touched. The naive gate is to delete the
"mcp" | "mcp-server" match arm, but then `mcp` falls through to generic
namespace resolution and dies with "unknown namespace: mcp" — reading like a
user typo rather than a build fact. Instead the arm resolves to the stub,
which bails with a message naming the cause and the fix, so an MCP host
spawning `openhuman mcp` gets a non-zero exit + diagnostic instead of hanging
on stdout that never speaks JSON-RPC.
…led (tinyhumansai#4799)

mcp_client is NOT gated wholesale, because the directory does not match the
real dependency graph. Two submodules stay always compiled:

  sanitize — orchestrator/prompt.rs runs *skill* descriptions through
             sanitize_for_llm. Nothing to do with MCP; stubbing it would
             corrupt the orchestrator prompt in slim builds.
  client   — the gitbooks docs tool dials McpHttpClient + redact_endpoint
             directly (GitBook is modelled as a legacy MCP server); stubbing
             it would break a docs tool users still reach.

Only registry/stdio/spawn_env/setup_agent are gated. The gate follows the
real dependency graph, not the directory name. Keeping client compiled also
keeps McpUnauthorizedError — and so the McpServerNeedsAuth classifier
coupling test — always compiled, with no #[cfg] and no wording-drift leak.
…4799)

Three clusters, both halves of the (confusingly named) MCP surface:

  mcp_registry_* × 11  — DYNAMIC, sqlite-installed servers
  mcp_setup_*    × 5   — setup-agent surface
  mcp_*          × 3   — STATIC, config-declared servers (mcp_client)

The naming is inverted from intuition, so gating only one half would leave
the gate half-applied. gitbooks deliberately stays — it dials McpHttpClient
but is a docs tool, not MCP-subsystem code.

network/{mcp,mcp_setup}.rs are leaf-gated: their only consumers are the
gated blocks above, so no stub is needed.
…act (tinyhumansai#4799)

Drops delegate_use_mcp_server from the orchestrator's synthesised belt.

The orchestrator's agent.toml still lists mcp_agent in subagents — TOML is
data, it cannot be #[cfg]'d, and forking it per-feature would invite exactly
the drift this gate avoids. That dangling id is safe: collect_orchestrator_tools
warns and skips unknown subagent ids, and validate_tier_hierarchy continues
past them rather than failing the boot.

Because the whole gate rests on that tolerance, pin it from both build
configurations: orchestrator_tolerates_unresolvable_subagent_id and
orchestrator_tolerates_absent_mcp_agent. A future "unknown subagent is a hard
error" change now fails loudly here instead of silently breaking the slim
build's boot — a failure mode CI's cargo check lane cannot catch.
…tinyhumansai#4799)

all_tests: mcp_clients + mcp_audit registered when the gate is on, absent
when off. An assert that only ever runs in one build configuration cannot
prove a gate works.

cli_tests: `openhuman mcp` must fail naming the BUILD as the cause and must
NOT degrade into "unknown namespace" — the exact confusing failure the issue
forbids. Covers the mcp-server alias too.

These only run under --no-default-features, which CI never test-runs.
)

Rather than gating whole tests away and losing their non-MCP coverage, gate
only the MCP-specific assertions:

  - desktop tool tables: per-element #[cfg] on the mcp_registry_* rows
  - tool_registry: MCP-transport half gated, controller half keeps asserting;
    trim/list tests fall back to a controller-transport id
  - diagnostics: mcp_stdio_tools > 0 when on, == 0 when off

Adds all_tools_omits_mcp_tools_when_gate_off, which asserts by PREFIX rather
than naming the ~19 tools — a new MCP tool added later must not be able to
leak into slim builds just because nobody extended a hardcoded list.
…cks (tinyhumansai#4799)

legacy_aliases: the frontend RPC catalog and the alias table are DATA — they
are authored against the full shipped surface and are built independently of
the core's Cargo features, so in a slim build they legitimately name
openhuman.mcp_clients_* methods whose controllers no longer exist. Ignore
exactly the gated namespaces and keep asserting on everything else, so the
drift signal survives instead of tempting someone to delete live frontend
methods from the catalog. Same data-vs-code shape as the orchestrator TOML.

definition_tests: gate the mcp_agent max-iterations row. mcp_setup stays —
only its tools are gated, the agent definition still loads in both builds.

tool_prep: use_mcp_server is mcp_agent's delegate_name; setup_mcp_server is
mcp_setup's and stays.
…ansai#4799)

default-features = false means the shell must opt in explicitly or the
shipped app silently loses MCP. Multi-line array so sibling gates append
cleanly.
…sions (tinyhumansai#4799)

Records the three things most likely to be got wrong later:

  - the gate drops ZERO dependencies (there is no MCP SDK; the DoD line
    claiming it sheds one is superseded), so mcp = [] is empty on purpose;
  - static vs dynamic is INVERTED from intuition — mcp_client is the STATIC
    config-declared set, mcp_registry the DYNAMIC installed one; gating only
    one leaves the gate half-applied;
  - mcp_client is split-gated because the gate follows the real dependency
    graph, not the directory name.

Plus the type carve-out, why cli.rs stays untouched, and why the orchestrator
TOML's dangling mcp_agent reference is expected and safe.
@oxoxDev
oxoxDev requested a review from a team July 15, 2026 14:33
@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 41 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: e2ae33d6-534a-41f5-994f-ab7f4f29081f

📥 Commits

Reviewing files that changed from the base of the PR and between 940482e and 43f19da.

📒 Files selected for processing (15)
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/core/all_tests.rs
  • src/openhuman/agent/harness/definition_tests.rs
  • src/openhuman/agent_registry/agents/loader.rs
  • src/openhuman/mcp_audit/stub.rs
  • src/openhuman/mcp_server/stub.rs
  • src/openhuman/tools/mod.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs
  • tests/mcp_registry_e2e.rs
  • tests/mcp_registry_multi_server.rs
  • tests/mcp_setup_e2e.rs
  • tests/mcp_stdio_integration.rs
📝 Walkthrough

Walkthrough

Adds a default-on mcp Cargo feature that gates MCP implementations, registrations, agents, tools, and schemas. Disabled builds use compatible stubs, explicit CLI errors, preserved shared types, and feature-aware tests.

Changes

MCP compile-time gate

Layer / File(s) Summary
Feature contract and build configuration
AGENTS.md, Cargo.toml, app/src-tauri/Cargo.toml
Documents the gate, enables mcp by default, and forwards it to the Tauri core dependency.
Gated MCP facades and shared types
src/openhuman/mcp_{client,registry,audit,server}/...
Separates enabled implementations from disabled stubs while preserving shared types and callable surfaces.
Agent and tool registration gates
src/openhuman/agent_registry/..., src/openhuman/tools/...
Compiles MCP agents, registry tools, setup tools, and bridge tools only when mcp is enabled.
Core routing and boot compatibility
src/core/..., src/openhuman/agent_registry/agents/loader.rs
Adds disabled-build CLI diagnostics and tolerates compiled-out MCP methods and agent references.
Enabled and disabled build regression coverage
src/core/all_tests.rs, src/openhuman/{tool_registry,tools}/...
Updates tests for feature-dependent namespaces, inventories, schemas, desktop surfaces, and MCP behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Possibly related issues

  • tinyhumansai/openhuman#4795 — Tracks the broader subsystem feature-gate work implemented here.

Suggested labels: feature, rust-core

Poem

A rabbit toggles gates with care,
MCP blooms—or isn’t there.
Stubs stand ready, quiet and neat,
Tests hop through both build states.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Linked Issues check ❓ Inconclusive Most MCP gate requirements are covered, but the CoreBuilder DomainSet::mcp change and CI smoke evidence are not shown, so full compliance can't be verified. Add the missing CoreBuilder DomainSet::mcp diff and disabled-build CI smoke evidence, or provide the fuller PR context.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and directly describes the main change: adding a compile-time MCP feature gate.
Out of Scope Changes check ✅ Passed The changes stay focused on MCP gating, tests, docs, and Tauri feature forwarding without obvious unrelated additions.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

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

@coderabbitai coderabbitai Bot added feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure. labels Jul 15, 2026

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a74f15ad79

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread src/openhuman/tools/ops.rs

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 5

🤖 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 `@AGENTS.md`:
- Line 247: Standardize the spelling of “sanitize” in the mcp_client
documentation paragraph by replacing the British “sanitises” variant with the
existing American spelling used elsewhere. Leave the dependency-gating
explanation and all other wording unchanged.
- Line 249: Update the scope note’s grep claim to inspect only Cargo.toml
dependency declarations, rather than all file contents, so the intentional mcp
feature definition and comments do not produce matches. Preserve the statement
that the only MCP-named dependency-related entry is the test-mcp-stub binary and
do not add dependencies to the mcp feature.

In `@app/src-tauri/Cargo.toml`:
- Around line 135-137: Update the openhuman_core dependency configuration to
preserve the root crate’s default features while enabling "mcp": remove
default-features = false, or explicitly include the existing
"tokenjuice-treesitter" and "voice" defaults alongside "mcp".

In `@src/openhuman/mcp_audit/stub.rs`:
- Around line 24-49: Add trace-level entry and exit diagnostics to all disabled
MCP facade flows: instrument all_mcp_audit_internal_controllers, record_write,
and list_writes in src/openhuman/mcp_audit/stub.rs (lines 24-49), and CLI
rejection, HTTP-server rejection, and empty tool-catalog generation in
src/openhuman/mcp_server/stub.rs (lines 25-85). Keep diagnostics verbose enough
to identify each operation and its outcome, while excluding secrets, full PII,
and audit payload contents.

In `@src/openhuman/tools/ops.rs`:
- Around line 866-871: Move the registration block for GitbooksSearchTool and
GitbooksGetPageTool under the same #[cfg(feature = "mcp")] gate as the
surrounding static MCP server registrations. Ensure both legacy GitBooks tools
are unavailable when the mcp feature is disabled, while preserving their
existing registration behavior when enabled.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 10b9f4c5-cd25-4ff8-bb57-09265e4d2b7d

📥 Commits

Reviewing files that changed from the base of the PR and between 2dcaaba and a74f15a.

📒 Files selected for processing (26)
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/core/all_tests.rs
  • src/core/cli_tests.rs
  • src/core/legacy_aliases.rs
  • src/openhuman/agent/harness/definition_tests.rs
  • src/openhuman/agent/harness/subagent_runner/tool_prep.rs
  • src/openhuman/agent_registry/agents/loader.rs
  • src/openhuman/agent_registry/agents/mod.rs
  • src/openhuman/mcp_audit/mod.rs
  • src/openhuman/mcp_audit/stub.rs
  • src/openhuman/mcp_client/mod.rs
  • src/openhuman/mcp_registry/connections.rs
  • src/openhuman/mcp_registry/mod.rs
  • src/openhuman/mcp_registry/stub.rs
  • src/openhuman/mcp_registry/types.rs
  • src/openhuman/mcp_server/mod.rs
  • src/openhuman/mcp_server/stub.rs
  • src/openhuman/mcp_server/tools/mod.rs
  • src/openhuman/tool_registry/ops_tests.rs
  • src/openhuman/tool_registry/schemas.rs
  • src/openhuman/tools/impl/network/mod.rs
  • src/openhuman/tools/mod.rs
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs

Comment thread AGENTS.md Outdated
Comment thread AGENTS.md Outdated
Comment thread app/src-tauri/Cargo.toml
Comment thread src/openhuman/mcp_audit/stub.rs
Comment thread src/openhuman/tools/ops.rs
oxoxDev added 2 commits July 15, 2026 20:24
…re-gate

# Conflicts:
#	AGENTS.md
#	Cargo.toml
#	app/src-tauri/Cargo.toml
…mansai#4799)

- Use the American "sanitizes" consistently (the file already uses
  "sanitize" 4x); the lone British variant tripped LanguageTool.
- The "grep -i mcp Cargo.toml matches only test-mcp-stub" claim went stale
  in this PR: the new mcp = [] feature definition, the default list and the
  gate comments all match it now. Scope the statement to dependency
  declarations, which is what it was actually asserting.

@coderabbitai coderabbitai Bot 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.

Caution

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

⚠️ Outside diff range comments (1)
src/openhuman/tools/ops.rs (1)

851-852: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Correct the MCP setup-agent gating comment.

#[cfg(feature = "mcp")] means this block is compiled in when MCP is enabled and omitted when disabled, but the surrounding text says it is “registered unconditionally” and “compiled out ... with” the feature. Update the comments to describe the actual behavior.

🤖 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 `@src/openhuman/tools/ops.rs` around lines 851 - 852, Update the comments
surrounding the MCP-gated setup-agent block to state that it is compiled and
registered when the mcp feature is enabled, and omitted when the feature is
disabled. Remove wording that says it is registered unconditionally or compiled
out with the feature, while leaving the #[cfg(feature = "mcp")] gating
unchanged.
♻️ Duplicate comments (1)
src/openhuman/tools/ops.rs (1)

866-895: 🎯 Functional Correctness | 🟠 Major

Gate the legacy GitBooks MCP tools too.

The generic MCP block is now gated, but GitbooksSearchTool and GitbooksGetPageTool remain registered unconditionally at Lines 833-842. They can therefore survive --no-default-features; because their names are gitbooks_*, tool_group() also does not apply the runtime DomainSet::mcp gate. Put their registration behind #[cfg(feature = "mcp")] and classify the gitbooks_ prefix as DomainGroup::Mcp.

🤖 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 `@src/openhuman/tools/ops.rs` around lines 866 - 895, Gate the GitBooks tool
registration containing GitbooksSearchTool and GitbooksGetPageTool with
#[cfg(feature = "mcp")], and update tool_group() so the gitbooks_ name prefix
maps to DomainGroup::Mcp. Ensure these legacy tools are excluded without the mcp
feature and subject to the runtime MCP domain gate.
🤖 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.

Outside diff comments:
In `@src/openhuman/tools/ops.rs`:
- Around line 851-852: Update the comments surrounding the MCP-gated setup-agent
block to state that it is compiled and registered when the mcp feature is
enabled, and omitted when the feature is disabled. Remove wording that says it
is registered unconditionally or compiled out with the feature, while leaving
the #[cfg(feature = "mcp")] gating unchanged.

---

Duplicate comments:
In `@src/openhuman/tools/ops.rs`:
- Around line 866-895: Gate the GitBooks tool registration containing
GitbooksSearchTool and GitbooksGetPageTool with #[cfg(feature = "mcp")], and
update tool_group() so the gitbooks_ name prefix maps to DomainGroup::Mcp.
Ensure these legacy tools are excluded without the mcp feature and subject to
the runtime MCP domain gate.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 417a85f9-1c32-4268-b2ab-3fb3f9ef799b

📥 Commits

Reviewing files that changed from the base of the PR and between a74f15a and 64eca0d.

📒 Files selected for processing (5)
  • AGENTS.md
  • Cargo.toml
  • app/src-tauri/Cargo.toml
  • src/openhuman/tools/ops.rs
  • src/openhuman/tools/ops_tests.rs
🚧 Files skipped from review as they are similar to previous changes (3)
  • app/src-tauri/Cargo.toml
  • AGENTS.md
  • src/openhuman/tools/ops_tests.rs

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: cc20a03b00

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/openhuman/mcp_registry/mod.rs
oxoxDev and others added 3 commits July 16, 2026 12:30
…re-gate

# Conflicts:
#	Cargo.toml
#	app/src-tauri/Cargo.toml
Maintainer review follow-ups for the mcp compile-time gate (tinyhumansai#4799):

- Add `#![cfg(feature = "mcp")]` to the four MCP integration test files
  (mcp_registry_e2e, mcp_registry_multi_server, mcp_setup_e2e,
  mcp_stdio_integration). They import gated APIs (mcp_registry::{store,
  boot,ops,connections,setup}, mcp_client::McpStdioClient) unconditionally
  and are auto-discovered, so `cargo test --no-default-features --features
  tokenjuice-treesitter --tests` failed to compile in slim builds. Gating
  the whole file compiles them to nothing when mcp is off.

- Add debug/warn diagnostics to the mcp_audit and mcp_server disabled
  stubs, matching the sibling mcp_registry stub and the repo's Rust-flow
  observability rule (no secrets/PII logged).
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer review changes (pushed as cfdb11b39, on top of a clean merge of latest main):

1. Gated the four MCP-only integration teststests/mcp_registry_e2e.rs, tests/mcp_registry_multi_server.rs, tests/mcp_setup_e2e.rs, tests/mcp_stdio_integration.rs. Each imports now-gated APIs unconditionally (mcp_registry::{store, boot, ops, connections, setup}, mcp_client::McpStdioClient) and is auto-discovered by Cargo (no [[test]] entry / required-features). Without a gate, cargo test --no-default-features --features tokenjuice-treesitter --tests would fail to compile in slim builds. Added a top-level #![cfg(feature = "mcp")] to each so the whole file compiles to nothing when mcp is off. (Addresses the Codex "Gate MCP-only integration tests" finding on mcp_registry/mod.rs.)

2. Instrumented the two silent disabled stubssrc/openhuman/mcp_audit/stub.rs and src/openhuman/mcp_server/stub.rs now emit log::debug!/log::warn! entry markers (prefixed [mcp_audit] / [mcp_server]), matching the sibling mcp_registry/stub.rs and the repo's Rust-flow observability rule ("Changes lacking logging are incomplete"). No secrets/PII logged. (Addresses CodeRabbit's "Add trace diagnostics to both disabled MCP facades".)

Both changes are cfg-off-path / test-only, so the default (shipped) build remains byte-identical.

Declined items are answered in inline replies below.

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer sync: merged current main (includes #4949, the fix for the red-main typecheck failure tracked in #4948) into this branch. The "Frontend Checks (quality, i18n, docs, coverage)" failure on this PR was inherited from main — the two ToolTimelineEntry fixtures in Conversations.render.test.tsx were missing the required 'seq' property introduced by #4945 — not caused by this PR's Rust feature-gate changes. Clean merge, no conflicts to resolve. Re-running CI should clear that lane.

@M3gA-Mind

Copy link
Copy Markdown
Collaborator

@coderabbitai review

The head has moved on since the standing review: every actionable comment has been addressed (fixed, or declined in-thread with reasoning), and the branch has since been re-synced onto current main — which now includes #4949, the fix for the red-main typecheck failure tracked in #4948. Requesting a re-review of the current head so the stale CHANGES_REQUESTED state reflects the actual tree.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

@M3gA-Mind Thanks for the update. I'll re-review the current head now that the branch has been resynced onto main and the standing feedback has been addressed.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 16, 2026
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer follow-up: my earlier stub-diagnostics commit referenced DISABLED_MSG in mcp_audit/stub.rs without defining it there (it is a module-private const in mcp_registry/stub.rs), which broke the gates-off build. Fixed by defining the const locally, mirroring the sibling stub. Apologies for the churn — the Feature-Gate Smoke lane caught it correctly.

Resolve sibling-gate conflicts with tinyhumansai#4915 (meet gate, tinyhumansai#4800) by union:
- Cargo.toml: keep both `meet` and `mcp` in default + both feature blocks
- app/src-tauri/Cargo.toml: forward both `meet` and `mcp`
- AGENTS.md: keep both gate-table rows and both gate sections
- src/core/all_tests.rs: keep all four both-direction gate tests
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer follow-up — two things in one push (387c9d8cc):

1. Fixed my own gates-off regression. My earlier stub-diagnostics commit referenced DISABLED_MSG in mcp_audit/stub.rs without defining it there (it was a module-private const in the sibling mcp_registry/stub.rs), which broke the --no-default-features build (E0425). Defined the const locally in mcp_audit/stub.rs, mirroring the sibling stubs (mcp_server/stub.rs already had its own local copy, so it was unaffected). Apologies for the churn — the Feature-Gate Smoke lane caught it correctly.

2. Re-synced onto current main and resolved sibling-gate conflicts. #4915 (the meet gate, #4800) merged to main (head 56841ebae), so this PR went CONFLICTING on the shared registration sites — expected mechanical drift between siblings in the #4797#4800 series, not a defect. Resolved every conflict as a union (both gates belong):

  • Cargo.tomldefault array keeps both "meet" and "mcp"; both feature blocks (meet = [] and mcp = []) retained with their comments.
  • app/src-tauri/Cargo.toml — desktop build forwards both "meet" and "mcp" (on top of main's newly-added tokenjuice-treesitter/voice forwards from fix(app): forward voice + tokenjuice-treesitter to the desktop build #4916).
  • AGENTS.md — both gate-table rows and both prose gate sections kept.
  • src/core/all_tests.rs — kept all four both-direction gate tests (mcp_namespaces_{registered,absent}_* + meet_controllers_{registered,absent}_*); the conflict was purely the shared closing brace where both sides appended tests.
  • src/core/all.rs and src/openhuman/tools/ops.rs auto-merged cleanly (non-overlapping hunks); verified both the meet and mcp registrations/gates survived.

No local cargo run (gates-off CI lane is the authority). Letting CI verify.

M3gA-Mind
M3gA-Mind previously approved these changes Jul 16, 2026

@M3gA-Mind M3gA-Mind left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving — both conditions genuinely met.

CI: fully green. 14 pass, 4 skipped by changed-area detection (correct for a Rust-only change), zero pending, zero failing — including Rust Quality, Rust Core Coverage, Rust Tauri Coverage, Test Inventory, PR CI Gate, and critically Rust Feature-Gate Smoke (gates off).

That last lane deserves a note, because it caught a regression we introduced. An earlier maintainer commit on this PR added debug logging to mcp_audit/stub.rs referencing DISABLED_MSG without defining it there — that const is module-private in the sibling mcp_registry/stub.rs:24, so it was never in scope. Result: E0425 × 3 and a broken gates-off build. Fixed by defining the const locally (mirroring the sibling stub) rather than making the sibling's pub — each stub owning its own const keeps the modules independent. The sibling stubs were swept: mcp_server/stub.rs already defines its own, so no further defects. stub.rs compiles only in the gates-off lane, which is precisely why that lane is the authority on this class of change — it did its job here.

Review state: no CHANGES_REQUESTED. CodeRabbit's earlier block was stale; it has since re-reviewed and passed.

Verified beyond CI:

  • The mcp gate uses a deliberate split facade with a single-definition type carve-out; default build byte-identical, with symmetric registered-when-on / absent-when-off tests.
  • Re-synced onto current main (includes #4915's meet gate). Four conflicts resolved to the union, including a genuinely structural one in src/core/all_tests.rs where both sides appended test fns sharing the final brace — all four tests retained, each verified to appear once and be well-braced. src/core/all.rs and tools/ops.rs auto-merged cleanly with both gates' content intact.
  • Bot items: fixed where legitimate; the two declined (gating GitBooks tools behind mcp; the pre-existing Tauri default-features gap) were declined with reasons — the first contradicts the documented split-facade design, the second is a known epic-level gap the PR body already documents.

Not merging — that is the maintainer's call.

…nflicts

Both sibling gates append their feature to the default set, add a feature
definition, a shell-forwarding entry, and docs. Kept both:
- Cargo.toml [features].default: [..., "meet", "skills", "mcp"]
- Cargo.toml: kept both skills = [] and mcp = [] definitions + comments
- app/src-tauri/Cargo.toml: forward both skills and mcp; also deduped a
  doubled "tokenjuice-treesitter" entry left by the merge
- AGENTS.md: kept both feature-table rows and both gate-pattern doc sections
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer sync: merged current main to resolve conflicts introduced when sibling gate #4913 (skills) merged.

Conflicts resolved (kept both sides — the gates are additive, not competing):

  • Cargo.toml [features].default: now […, "meet", "skills", "mcp"] — kept main's skills and this PR's mcp.
  • Cargo.toml: kept both the skills = [] and mcp = [] feature definitions and their doc comments.
  • app/src-tauri/Cargo.toml: forward both skills and mcp to the desktop shell. Also removed a duplicate tokenjuice-treesitter entry the auto-merge left in the forwarding list (it appeared twice) so the Feature Forwarding Gate sees a clean 1:1 list.
  • AGENTS.md: kept both feature-table rows (skills, mcp) and both gate-pattern doc sections.

All Rust registration sites (tools/ops.rs, tools/mod.rs, agent_registry/agents/loader.rs, src/core/all_tests.rs) auto-merged cleanly; verified main's skills cfg registrations are fully preserved (17/17, 3/3, 2/2, 3/3) and all mcp cfg gates are intact. No code behavior changed — pure conflict resolution. Letting CI re-run on the merged head.

M3gA-Mind
M3gA-Mind previously approved these changes Jul 16, 2026

@M3gA-Mind M3gA-Mind left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Approving — both conditions genuinely met, on the re-synced head.

CI: fully green — 15 pass, 4 skipped by changed-area detection (correct for a Rust-only change), zero pending, zero failing. Includes Rust Quality, Rust Core Coverage, Rust Tauri Coverage, Test Inventory, PR CI Gate, and critically Rust Feature-Gate Smoke (gates off).

That last lane earned its place on this PR. An earlier maintainer commit here added debug logging to mcp_audit/stub.rs referencing DISABLED_MSG without defining it in that module — the const is module-private in the sibling mcp_registry/stub.rs:24 — producing E0425 × 3 and a broken gates-off build. stub.rs files compile only in that lane, which is exactly why it is the authority for this class of change. Fixed by defining the const locally rather than making the sibling's pub, keeping each stub self-contained; mcp_server/stub.rs was swept and already had its own, so no further instances. To be clear: that regression was ours, not the author's.

Review state: no CHANGES_REQUESTED; CodeRabbit's earlier block is cleared.

Verified beyond CI:

  • The mcp gate uses a deliberate split facade with a single-definition type carve-out; default build byte-identical, with symmetric registered-when-on / absent-when-off tests.
  • Re-synced onto current main (includes #4913 and #4915). Conflicts resolved to the union, including a genuinely structural one in src/core/all_tests.rs where both sides appended test fns sharing the closing brace — all four tests retained, each verified to appear once and be well-braced. src/core/all.rs and tools/ops.rs auto-merged with both gates' content intact.
  • Declined items were declined with reasons, not dropped: gating the GitBooks tools behind mcp contradicts the documented split-facade design (gitbooks is a docs tool, not MCP-subsystem code), and the Tauri default-features gap is pre-existing and documented in the PR body.
  • The Codex mcp_setup-agent finding is acknowledged and deferred with reason — fully gating it needs a coordinated pass across unconditional refs in awaiting_user.rs/dispatch.rs/core/all.rs; it is not a boot hazard (the loader tolerates it, pinned by test), only a degraded-UX edge in slim builds.

Not merging — that is the maintainer's call.

…ate conflicts

tinyhumansai#4912 (flows) merged into main since the last sync, re-introducing sibling
drift. Kept all gates (additive, not competing):
- Cargo.toml [features].default: [..., "meet", "skills", "flows", "mcp"]
- AGENTS.md: kept skills + flows + mcp feature-table rows and the flows
  leaf-gate doc block alongside this PR's mcp gate section
- src/core/all_tests.rs: kept BOTH the mcp directional-gate tests
  (registered/absent) and main's flows directional-gate tests
  (registered/absent) — the conflict fused their shared trailing braces
- app/src-tauri/Cargo.toml auto-merged: forwards all 8 gates incl. flows + mcp
@M3gA-Mind

Copy link
Copy Markdown
Collaborator

Maintainer sync (2nd): merged current main again — #4912 (flows) merged after the last sync, re-introducing sibling-gate drift (expected: all three gates touch the same feature wiring).

Conflicts resolved (kept every gate — additive, not competing):

  • Cargo.toml [features].default: now […, "meet", "skills", "flows", "mcp"] — main's skills+flows and this PR's mcp.
  • AGENTS.md: kept the flows feature-table row + flows leaf-gate doc block (from main) alongside this PR's mcp row + mcp gate section.
  • src/core/all_tests.rs: the merge fused two directional-gate test pairs that shared a trailing brace. Kept bothmcp_namespaces_registered/absent_when_gate_off (this PR) and flows_controllers_registered/absent_when_feature_off (main) — as four complete test fns.
  • app/src-tauri/Cargo.toml auto-merged cleanly: forwards all 8 gates incl. both flows and mcp.

Verified against upstream/main: flows (28/5/7) and skills (17/2/3) cfg registrations fully preserved across tools/ops.rs, loader.rs, all_tests.rs; all mcp gates intact. No code behavior changed — pure conflict resolution. Letting CI re-run.

@M3gA-Mind M3gA-Mind left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-approving after the final conflict resolution — both conditions genuinely met on the new head.

CI: fully green — 15 pass, 4 skipped by changed-area detection (correct for a Rust-only change), zero pending, zero failing. Includes Rust Quality (fmt, clippy), Rust Core Coverage, Rust Tauri Coverage, Test Inventory, PR CI Gate, and critically Rust Feature-Gate Smoke (gates off).

Review state: no CHANGES_REQUESTED.

Why the re-approval: #4912 (flows gate) merged, which conflicted this branch — the fourth time this series has cascaded, since every gate in #4797-#4800 edits the same registration sites. Conflicts were resolved to the union across Cargo.toml, AGENTS.md, src/core/all.rs, src/openhuman/tools/ops.rs, and src/core/all_tests.rs; that push dismissed the prior approval, hence this one. This is the last gate in the series — the other three (#4913 skills, #4915 meet, #4912 flows) are merged.

Verified across the life of this PR:

  • The mcp gate uses a deliberate split facade with a single-definition type carve-out; default build byte-identical, symmetric registered-when-on / absent-when-off tests.
  • src/core/all_tests.rs has repeatedly conflicted structurally — both sides appending test fns that share the closing brace. Re-verified after this resolution: every test fn appears exactly once and the braces balance.
  • A regression we introduced was caught and fixed here, not by the author. An earlier maintainer commit added debug logging to mcp_audit/stub.rs referencing DISABLED_MSG without defining it in that module (the const is module-private in the sibling mcp_registry/stub.rs:24), breaking the gates-off build with E0425 x 3. Fixed by defining the const locally rather than making the sibling's pub. stub.rs files compile only in the gates-off lane — which is exactly why that lane is the authority for this class of change, and why it is green here that matters.
  • Declined items were declined with reasons, not dropped: gating the GitBooks tools behind mcp contradicts the documented split-facade design (gitbooks is a docs tool, not MCP-subsystem code); the Tauri default-features gap is pre-existing and documented in the PR body. The Codex mcp_setup-agent finding is deferred with reason — fully gating it needs a coordinated pass across unconditional refs in awaiting_user.rs/dispatch.rs/core/all.rs, and it is not a boot hazard (the loader tolerates it, pinned by test), only a degraded-UX edge in slim builds.

Not merging — that is the maintainer's call.

@M3gA-Mind
M3gA-Mind merged commit 9fd5fde into tinyhumansai:main Jul 16, 2026
19 checks passed
senamakel added a commit to M3gA-Mind/openhuman that referenced this pull request Jul 18, 2026
…mansai#4914)

Co-authored-by: Steven Enamakel <enamakel@tinyhumans.ai>
Co-authored-by: M3gA-Mind <elvin@tinyhumans.ai>
Co-authored-by: oxoxDev <oxoxdev@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature Net-new user-facing capability or product behavior. rust-core Core Rust runtime in src/: CLI, core_server, shared infrastructure.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(core): feature gate — MCP

3 participants