Skip to content

fix(plugins): stop tool-discovery loads from clearing active providers#93276

Merged
steipete merged 7 commits into
openclaw:mainfrom
medns:fix/tool-discovery-provider-clobber
Jun 19, 2026
Merged

fix(plugins): stop tool-discovery loads from clearing active providers#93276
steipete merged 7 commits into
openclaw:mainfrom
medns:fix/tool-discovery-provider-clobber

Conversation

@medns

@medns medns commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Tool-discovery plugin loads run with activate: false and a tool-only plugin scope, so the registry they build omits provider-only plugins.
  • installStandaloneRegistry unconditionally called setActivePluginRegistry, so those loads replaced the live active registry and wiped its providers. The gateway tools-catalog channel load behind agents.list (and the resolvePluginTools cold-load) hit this path, so a bundled provider plugin disappeared at runtime after the first tool-discovery load.
  • Fix: a tool-discovery load becomes the active registry only when none exists yet (cold start). Once an active registry is present, the tool-only registry is only pinned to its requested channel/http-route surface, so the live providers are preserved. The cold-start promotion still initializes runtime state (cache key / workspaceDir), so later surface lookups hit and the bootstrap path does not reload redundantly.
  • Also source plugin tool catalog metadata and declared tools from the active registry, the selected channel registry, and the raw pinned channel registry, so a tool-only plugin's display name, description, risk, and tags survive even when the channel selector returns an active registry that has channels. The active registry stays authoritative for duplicate keys.
  • Out of scope: normal activation (activate !== false) and the migration provider runtime, which intentionally relies on setActivePluginRegistry and does not set toolDiscovery.
  • Reviewers should focus on installStandaloneRegistry (cold-start promotion vs pin-only) and the tools.catalog metadata merge (active + selected channel + raw pinned channel).

Linked context

No linked issue; this is a standalone runtime bug fix. Not requested by a maintainer.

Real behavior proof (required for external PRs)

  • Behavior or issue addressed: After the first tool-discovery load (e.g. a gateway agents.list / tools-catalog call), getActivePluginRegistry().providers dropped to an empty array, so a bundled provider-only plugin vanished from the live runtime even though it was loaded at startup.
  • Real environment tested: OpenClaw gateway running from a packaged build on Windows, where the defect was first observed through console instrumentation in setActivePluginRegistry (active providers going from 1 to 0 on the tool-discovery stack). Verified after the patch with a Node reproduction (tsx) driving the real loader/runtime source on this branch (Node 22, this checkout).
  • Exact steps or command run after this patch: npx tsx __repro_provider_clobber.mts it seeds an active registry that carries a provider-only plugin, then drives the real ensureStandaloneRuntimePluginRegistryLoaded channel tool-discovery path that the gateway tools-catalog / agents.list relies on, and prints the active providers count before and after.
  • Evidence after fix (terminal capture): copied live terminal output after the patch:
REPRO providers BEFORE tool-discovery : 1
REPRO providers AFTER  tool-discovery : 1
REPRO active registry was replaced?   : false
REPRO RESULT                          : PROVIDERS PRESERVED
  • Observed result after fix: the active registry keeps its provider across a tool-discovery channel load providers stays at 1 and the active registry object is not replaced, so the live provider list survives.
  • What was not tested: a full over-the-wire agents.list round-trip inside the packaged gateway binary was not re-run after a full rebuild; provider preservation was confirmed through the Node reproduction and the loader regression coverage instead.
  • Proof limitations or environment constraints: the reproduction drives the real loader/runtime source through tsx rather than the fully repackaged gateway binary, because rebuilding and re-syncing the packaged runtime into the host application is out of band for this checkout. The pre-fix symptom itself was captured in the live gateway runtime via console instrumentation.
  • Before evidence (optional but encouraged): same script with the patch stashed (guard removed):
REPRO providers BEFORE tool-discovery : 1
REPRO providers AFTER  tool-discovery : 0
REPRO active registry was replaced?   : true
REPRO RESULT                          : PROVIDERS CLEARED
Reproduction script used above
import { createEmptyPluginRegistry } from "./src/plugins/registry-empty.js";
import {
  getActivePluginRegistry,
  resetPluginRuntimeStateForTest,
  setActivePluginRegistry,
} from "./src/plugins/runtime.js";
import { ensureStandaloneRuntimePluginRegistryLoaded } from "./src/plugins/runtime/standalone-runtime-registry-loader.js";

resetPluginRuntimeStateForTest();

const active = createEmptyPluginRegistry();
active.plugins.push({ id: "qclaw", status: "loaded" } as never);
active.providers.push({ id: "qclaw", pluginId: "qclaw" } as never);
setActivePluginRegistry(active, "startup-key", "default", "/tmp/ws");

console.log("REPRO providers BEFORE tool-discovery :", getActivePluginRegistry()?.providers.length);

ensureStandaloneRuntimePluginRegistryLoaded({
  surface: "channel",
  forceLoad: true,
  loadOptions: {
    config: { plugins: { enabled: true } } as never,
    onlyPluginIds: ["__repro_tool_plugin__"],
    activate: false,
    toolDiscovery: true,
    workspaceDir: "/tmp/ws",
  },
});

const after = getActivePluginRegistry();
console.log("REPRO providers AFTER  tool-discovery :", after?.providers.length);
console.log("REPRO active registry was replaced?   :", after !== active);
console.log(
  "REPRO RESULT                          :",
  after?.providers.length ? "PROVIDERS PRESERVED" : "PROVIDERS CLEARED",
);

Tests and validation

  • Focused suites (all green): node scripts/run-vitest.mjs src/plugins/runtime/standalone-runtime-registry-loader.test.ts src/gateway/server-methods/tools-catalog.test.ts src/plugins/tools.optional.test.ts -> gateway shard 16/16, plugins shard 73/73.
  • Types: pnpm tsgo:core and pnpm tsgo:test:src are clean for the changed files; git diff --check is clean.
  • Ran the Node reproduction above before and after the patch (see Real behavior proof).
  • Regression coverage:
    • loader (standalone-runtime-registry-loader.test.ts): a toolDiscovery channel load pins the channel surface without replacing an existing active registry; a toolDiscovery active load does not replace an existing active registry; a toolDiscovery load initializes the active registry when none exists (cold start); a non-toolDiscovery active load still installs as the active registry (migration provider path).
    • catalog (tools-catalog.test.ts): plugin tool metadata is projected from the pinned channel registry; and from the raw pinned channel registry even when the channel selector returns an active registry that has channels (the active-with-channels + pinned-tool-only case).
  • What failed before this fix: the reproduction showed the active providers dropping from 1 to 0 (active registry replaced) before the guard was added.

Risk checklist

  • Did user-visible behavior change? Yes once an active registry exists, provider-only plugins are no longer wiped from it by tool-discovery loads.
  • Did config, environment, or migration behavior change? No the migration provider runtime load has no toolDiscovery flag and still installs as the active registry exactly as before.
  • Did security, auth, secrets, network, or tool execution behavior change? No.
  • Highest-risk area: changing when a standalone load becomes globally active (cold-start promotion vs pin-only) and the tools.catalog metadata source.
  • How is that risk mitigated: full activation (activate !== false) and the migration-provider path are unchanged; on a true cold start the promoted tool-only registry is replaced by the first full activation; catalog metadata reads the raw pinned channel registry so tool-only plugins are not hidden by the channel selector; the loader and tools.catalog branches are covered by regression tests.

Current review state

  • Next action: maintainer review (the open ClawSweeper P1 below is addressed).
  • Copilot review: addressed the load cache that prevents reloads (setCachedPluginRegistry / getReusableCachedPluginRegistry) is keyed off the load cache key and is independent of setActivePluginRegistry, so skipping the active-registry write does not cause extra plugin reloads.
  • ClawSweeper P1 (raw pinned registry): addressed tools.catalog now merges metadata and declared tools from the raw pinned channel registry (getPinnedActivePluginChannelRegistry) in addition to the active and selected channel registries, so a pinned tool-only registry is read even when getActivePluginChannelRegistry() selects an active registry that has channels. Added a regression for the active-with-channels + pinned-tool-only case.

Copilot AI review requested due to automatic review settings June 15, 2026 11:45
@openclaw-barnacle openclaw-barnacle Bot added size: S proof: supplied External PR includes structured after-fix real behavior proof. labels Jun 15, 2026

Copilot AI 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.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Prevents tool-discovery plugin-registry loads (tool-only scope with activate:false) from overwriting the active runtime registry (and thereby dropping provider-only plugins), and adds regression tests for the behavior.

Changes:

  • Skip promoting tool-discovery registries to the active registry during standalone installs.
  • Add Vitest coverage to ensure tool-discovery loads pin channel registries without clobbering the active registry.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
src/plugins/runtime/standalone-runtime-registry-loader.ts Avoids replacing the active registry when toolDiscovery: true to prevent provider loss.
src/plugins/runtime/standalone-runtime-registry-loader.test.ts Adds tests asserting active registry preservation and correct channel pinning for tool-discovery loads.

Comment thread src/plugins/runtime/standalone-runtime-registry-loader.ts Outdated
@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 19, 2026, 6:52 AM ET / 10:52 UTC.

Summary
The PR makes tool-discovery plugin registry loads request-local, passes the prepared registry into plugin tool resolution/catalog/MCP paths, and adds focused regression coverage.

PR surface: Source +26, Tests +167. Total +193 across 8 files.

Reproducibility: yes. The current-main source path sets activate:false/toolDiscovery:true and then installs that registry globally, and the PR body includes before/after terminal output showing provider count changing from 0 before the patch to preserved after the patch; I did not execute the repro in this read-only review.

Review metrics: 2 noteworthy metrics.

  • Registry Promotion Path: 1 global install path bypassed for toolDiscovery. This is the central compatibility-sensitive change that prevents request-local tool registries from replacing active provider/channel state.
  • Tool Resolver Surface: 1 return value added, 1 optional parameter added. The request-local registry is now carried explicitly from preloading into resolver/catalog callers while preserving existing callers that ignore the return value.

Stored data model
Persistent data-model change detected: vector/embedding metadata: src/gateway/server-methods/tools-catalog.test.ts, vector/embedding metadata: src/gateway/server-methods/tools-catalog.ts. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • Refresh the PR body summary so it describes the final request-local toolDiscovery behavior instead of pin-only/cold-start promotion.
  • Wait for exact-head checks to finish green or record a maintainer determination for any unrelated latest-main failures.

Risk before merge

  • [P1] Plugin registry promotion is compatibility-sensitive: request-local tool-discovery loads no longer update active, channel, or HTTP-route registry state, so maintainers should confirm no caller depended on that side effect.
  • [P1] The PR body still contains stale pin-only/cold-start promotion wording while the final head keeps toolDiscovery registries request-local; that should be refreshed or explicitly accepted before landing.
  • [P1] Live GitHub status for head f2c4978 was still queued/unstable, so merge should wait for exact-head green checks or an explicit unrelated-failure determination.

Maintainer options:

  1. Refresh And Land With Runtime Signoff (recommended)
    Update the PR body to match the final request-local semantics, then land after plugin/runtime signoff and exact-head checks are green.
  2. Accept The Compatibility Change As-Is
    Maintainers may intentionally accept the request-local registry behavior if they are comfortable relying on the existing tests and verification despite the stale wording.
  3. Pause For Registry Contract Redesign
    If tool discovery should still have a lifecycle-owned cache or pin contract, pause this PR and redesign the registry handoff before merge.

Next step before merge

  • [P2] The remaining actions are maintainer compatibility signoff, PR-body refresh, and exact-head validation, not a narrow automated code repair.

Security
Cleared: The diff changes in-memory plugin registry routing and tests only; it does not touch workflows, dependencies, lockfiles, secrets, permissions, package resolution, or downloaded code paths.

Review details

Best possible solution:

Land the request-local tool-discovery fix after plugin/runtime signoff, a PR-body refresh that matches the final behavior, and exact-head validation; keep the adjacent cached descriptor retention work in #82562 separate.

Do we have a high-confidence way to reproduce the issue?

Yes. The current-main source path sets activate:false/toolDiscovery:true and then installs that registry globally, and the PR body includes before/after terminal output showing provider count changing from 0 before the patch to preserved after the patch; I did not execute the repro in this read-only review.

Is this the best way to solve the issue?

Yes. The final request-local approach fixes the clobber at the standalone loader boundary and carries the prepared registry to catalog/MCP resolution without adding another global fallback path; the remaining question is owner acceptance of the compatibility-sensitive registry semantics.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 92d1f04de340.

Label changes

Label changes:

  • add proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix terminal output from a Node reproduction driving the real loader/runtime source, plus before output showing providers were cleared without the guard.

Label justifications:

  • P1: The PR fixes a gateway/plugin runtime regression where tool discovery can make active providers disappear for users.
  • merge-risk: 🚨 compatibility: The diff changes global plugin registry promotion semantics used by gateway, provider, channel, and plugin tool resolution paths.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (terminal): The PR body includes after-fix terminal output from a Node reproduction driving the real loader/runtime source, plus before output showing providers were cleared without the guard.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix terminal output from a Node reproduction driving the real loader/runtime source, plus before output showing providers were cleared without the guard.
Evidence reviewed

PR surface:

Source +26, Tests +167. Total +193 across 8 files.

View PR surface stats
Area Files Added Removed Net
Source 4 43 17 +26
Tests 4 177 10 +167
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 8 220 27 +193

What I checked:

  • Repository policy read: Root plus scoped plugin/gateway AGENTS.md files were read fully; their guidance treats plugin runtime registry state, gateway hot paths, and compatibility-sensitive PRs as requiring broad source/caller/test review. (AGENTS.md:1, 92d1f04de340)
  • Current-main clobber path: On current main, activate:false standalone installs still call setActivePluginRegistry before pinning the requested surface, so a tool-only registry can replace active providers. (src/plugins/runtime/standalone-runtime-registry-loader.ts:37, 92d1f04de340)
  • Tool-discovery caller path: resolvePluginToolLoadState builds loadOptions with activate:false and toolDiscovery:true, and ensureStandalonePluginToolRegistryLoaded sends those options through the standalone loader with surface channel. (src/plugins/tools.ts:1006, 92d1f04de340)
  • PR head request-local guard: At the PR head, ensureStandaloneRuntimePluginRegistryLoaded returns the loaded registry for toolDiscovery before installStandaloneRegistry can update active, channel, or HTTP-route global registry state. (src/plugins/runtime/standalone-runtime-registry-loader.ts:96, f2c4978f5dab)
  • PR head carries prepared registry: The PR returns the prepared registry from ensureStandalonePluginToolRegistryLoaded and lets resolvePluginTools use it only when it contains the scoped plugin tool entries. (src/plugins/tools.ts:1022, f2c4978f5dab)
  • Gateway catalog uses exact discovery registry: tools.catalog now passes the prepared registry to resolvePluginTools and uses that registry for metadata/declared tool projection before falling back to the active registry. (src/gateway/server-methods/tools-catalog.ts:83, f2c4978f5dab)

Likely related people:

  • vincentkoc: Recent history and blame show broad touches to the central plugin runtime/tool files, including cached tool runtime sibling isolation near this surface. (role: recent plugin runtime contributor; confidence: medium; commits: ccdec2e294c4, 570e2db25210; files: src/plugins/runtime/standalone-runtime-registry-loader.ts, src/plugins/tools.ts)
  • Takhoffman: Introduced and refined the tools catalog/plugin tool view that this PR changes, including catalog provenance and plugin tool description summarization. (role: tool catalog feature contributor; confidence: high; commits: 9c7823350bf6, d11dc8feba5f; files: src/gateway/server-methods/tools-catalog.ts, src/gateway/server-methods/tools-catalog.test.ts, src/plugins/tools.ts)
  • Edionwheels: Authored the cold-load partial tool registry fix that tightened scoped registry reuse and is directly adjacent to the request-local registry handoff here. (role: adjacent plugin tool registry contributor; confidence: medium; commits: 66ffb29679c7; files: src/plugins/tools.ts)
  • samzong: Authored the selected channel registry lookup cache behavior relevant to how pinned and active channel registries are selected. (role: adjacent channel-registry contributor; confidence: medium; commits: 1ecd46f49b21; files: src/plugins/runtime-channel-state.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. P1 High-priority user-facing bug, regression, or broken workflow. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. labels Jun 15, 2026
@medns medns changed the title fix(plugins): stop tool-discovery loads from clearing active providers WIP(plugins): stop tool-discovery loads from clearing active providers Jun 15, 2026
@openclaw-barnacle openclaw-barnacle Bot added gateway Gateway runtime size: M and removed proof: sufficient ClawSweeper judged the real behavior proof convincing. size: S labels Jun 15, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. and removed rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 15, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 15, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 15, 2026
@medns

medns commented Jun 15, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🦞👀
ClawSweeper picked this up.

Command router queued. I will update this comment with the next step.

@medns
medns force-pushed the fix/tool-discovery-provider-clobber branch from e07d482 to 987b18f Compare June 16, 2026 03:34
@medns medns changed the title WIP(plugins): stop tool-discovery loads from clearing active providers fix(plugins): stop tool-discovery loads from clearing active providers Jun 16, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 16, 2026
@medns

medns commented Jun 16, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@medns
medns force-pushed the fix/tool-discovery-provider-clobber branch from 2b6218d to 97b596a Compare June 17, 2026 03:46
@medns

medns commented Jun 17, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@medns

medns commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

medns and others added 7 commits June 19, 2026 10:52
Tool-discovery plugin loads run with activate:false and a tool-only plugin scope, so the registry they build omits provider-only plugins. installStandaloneRegistry promoted that registry to the active registry, so a tool-discovery load (e.g. the gateway tools-catalog channel load behind agents.list) replaced the live active registry and wiped its providers.

Promote a tool-discovery load to the active registry only when none exists yet (cold start); once an active registry is present it is only pinned to its requested channel/http-route surface, preserving the live providers. Non-tool-discovery loads (e.g. the migration provider runtime, which reads off the active registry) are unchanged.

Source plugin tool catalog metadata and declared tools from the raw pinned channel registry in addition to the active registry, so tool-only plugins keep their display name, description, risk, and tags even when the channel selector returns an active registry that has channels. The active registry stays authoritative for duplicate keys.

Adds loader and tools.catalog regression coverage, including the active-with-channels plus pinned-tool-only case.
@steipete
steipete force-pushed the fix/tool-discovery-provider-clobber branch from 97b596a to f2c4978 Compare June 19, 2026 10:46
@steipete

Copy link
Copy Markdown
Contributor

Land-ready verification:

  • Rebased onto origin/main at 3091c13713f.
  • pnpm build: passed (Node 24.16.0); full typecheck passed.
  • Focused lint for src/plugins/tools.ts: passed after making the empty-registry return explicit.
  • node scripts/run-vitest.mjs src/plugins/tools.optional.test.ts src/gateway/server-methods/tools-catalog.test.ts src/plugins/runtime/standalone-runtime-registry-loader.test.ts src/mcp/plugin-tools-serve.test.ts: 94 tests passed.
  • Fresh Codex autoreview: clean; no accepted/actionable findings.

Known gap: broad local pnpm test was not used as a gate because latest-main macOS filesystem fixtures fail outside this diff. Thanks @medns.

@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 19, 2026
@steipete
steipete merged commit 0781dae into openclaw:main Jun 19, 2026
37 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 20, 2026
Keep plugin tool discovery request-local, preserve active provider/channel registries, and carry the prepared registry through MCP and catalog resolution.

Co-authored-by: 郑苏波 (Super Zheng) <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gateway Gateway runtime merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P1 High-priority user-facing bug, regression, or broken workflow. proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: M status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants