Add plugin manifest contract for SecretRef provider integrations#82326
Conversation
Dependency Changes DetectedThis PR changes dependency-related files. Maintainers should confirm these changes are intentional. Changed files:
Maintainer follow-up:
|
Vault/OpenClaw live smokeI tested this branch with an external
The smoke test uses a normal OpenClaw SecretRef: {
"source": "exec",
"provider": "vault",
"id": "providers/openrouter/apiKey"
}Verification result: {
"ok": true,
"warningCount": 0
}Then a live agent turn completed through Note: Vault was run in dev mode for this smoke, so the secret lives in Vault memory and disappears when the dev Vault container is removed. Re-review progress:
|
|
Codex review: needs maintainer review before merge. Reviewed May 29, 2026, 5:30 PM ET / 21:30 UTC. Summary PR surface: Source +996, Tests +1742, Docs +80, Config +4, Generated 0, Other +1522. Total +4344 across 37 files. Reproducibility: not applicable. this is a feature/API PR rather than a bug report. The after-fix behavior is supported by the PR body/comment live proof and the added E2E script surface. Review metrics: 3 noteworthy metrics.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge
Security Review detailsBest possible solution: Land only after maintainers explicitly approve the public manifest/config/SDK contract, fail-closed upgrade behavior, and trusted-plugin exec resolver model; otherwise narrow or defer the contract before release. Do we have a high-confidence way to reproduce the issue? Not applicable: this is a feature/API PR rather than a bug report. The after-fix behavior is supported by the PR body/comment live proof and the added E2E script surface. Is this the best way to solve the issue? Unclear until maintainer/security review: the manifest-first approach fits plugin ownership and avoids provider-specific core hardcoding, but it freezes a public config/SDK contract and fail-closed exec behavior that owners must accept. AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against a841778b7b94. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +996, Tests +1742, Docs +80, Config +4, Generated 0, Other +1522. Total +4344 across 37 files. View PR surface stats
Security concerns:
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
66d2b46 to
db32d0b
Compare
9a0f5ec to
cca6433
Compare
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
1cc05be to
5d3f4dc
Compare
|
@joshavant ptal. I have a few external secret provider plugins to go along with this. I've been testing with Related to #71593. My PR adds the manifest/provider integration layer that lets plugins declare installable SecretRef providers. |
5d3f4dc to
1990e8e
Compare
1990e8e to
7388581
Compare
e3c7fe7 to
f3b3763
Compare
582e43c to
675c4d7
Compare
675c4d7 to
b7f57f4
Compare
b7f57f4 to
c7597c0
Compare
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
Signed-off-by: sallyom <somalley@redhat.com>
Signed-off-by: sallyom <somalley@redhat.com>
Summary
secrets.providers.<alias>.pluginIntegrationinstead of copying plugin resolvercommand/argsinto configWhy
External providers like Vault, OneCLI, 1Password, Bitwarden, and similar stores were already possible through manual exec SecretRef configuration. This makes them discoverable, portable, and installable as plugins without hardcoding provider-specific logic in OpenClaw core.
Real Behavior Proof
Behavior addressed: External SecretRef providers could already be wired manually with
exec, but plugin-owned Vault-style integrations were not discoverable or portable through plugin manifest metadata. This patch lets config refer to the owning plugin integration and lets OpenClaw materialize the resolver from the installed plugin manifest.Real environment tested: OpenShift namespace
openclaw-bob, running podopenclaw-cbbc765d8-sth7w, containergateway; git-installed Vault plugin fromgit:github.com/sallyom/claw-vault; Vault available athttp://vault.vault.svc:8200; OpenClaw image from this PR branch. Earlier proof also covered a local Podman OpenClaw + HashiCorp Vault dev setup using an external git-installed Vault plugin and OpenRouter.Exact steps or command run after this patch:
The running deployment also confirmed configured models are accessible using Vault-resolved SecretRefs.
Evidence after fix:
{ "providerAlias": "vault", "provider": { "configured": true, "source": "exec", "pluginIntegration": { "pluginId": "vault", "integrationId": "vault" } }, "resolverScript": "/home/node/.openclaw/git/git-c317c86c2672b3ca/repo/dist/vault-secret-ref-resolver.js", "vaultAddr": "http://vault.vault.svc:8200", "kvMount": "secret", "kvVersion": "2", "hasVaultToken": true }Prior live proof also ran
openclaw secrets audit --allow-exec --jsonand a live OpenRouter agent turn using a Vault-resolved model API key; terminal-command repro is captured at https://gist.github.com/sallyom/50f4678b053eaa93c4311a5509e52aeb.Observed result after fix: The plugin-owned
openclaw vaultCLI command is registered,openclaw vault status --jsonreports the newpluginIntegrationcontract with canonical plugin idvault, the resolver script is loaded from the installed plugin root, Vault runtime env is visible without printing the token, and configured models are accessible through Vault-resolved SecretRefs.What was not tested: Production Vault auth methods beyond the current deployment setup, and non-Vault providers such as 1Password, Bitwarden, or OneCLI.
Before evidence: Before this contract, the same Vault resolver could only be wired by hand through explicit
secrets.providers.vault.command/argsconfig; there was no plugin manifest preset for OpenClaw to discover or materialize.Verification
node scripts/run-vitest.mjs src/secrets/provider-integrations.test.ts src/secrets/resolve.test.ts src/secrets/plan.test.ts src/commands/daemon-install-helpers.test.tsnode scripts/run-tsgo.mjs -p tsconfig.core.json --incremental --tsBuildInfoFile .artifacts/tsgo-cache/core.tsbuildinfogit diff --check.agents/skills/autoreview/scripts/autoreview --mode branch --base origin/main