mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-06 10:30:44 +00:00
docs(plugins): define config ownership contract
* fix(plugins): flag channel config metadata gaps * docs(plugins): clarify config ownership
This commit is contained in:
@@ -122,6 +122,7 @@ provider / base-URL setup moved to a dedicated page — see
|
||||
- `plugins.entries.<id>.subagent.allowModelOverride`: explicitly trust this plugin to request per-run `provider` and `model` overrides for background subagent runs.
|
||||
- `plugins.entries.<id>.subagent.allowedModels`: optional allowlist of canonical `provider/model` targets for trusted subagent overrides. Use `"*"` only when you intentionally want to allow any model.
|
||||
- `plugins.entries.<id>.config`: plugin-defined config object (validated by native OpenClaw plugin schema when available).
|
||||
- Channel plugin account/runtime settings live under `channels.<id>` and should be described by the owning plugin's manifest `channelConfigs` metadata, not by a central OpenClaw option registry.
|
||||
- `plugins.entries.firecrawl.config.webFetch`: Firecrawl web-fetch provider settings.
|
||||
- `apiKey`: Firecrawl API key (accepts SecretRef). Falls back to `plugins.entries.firecrawl.config.webSearch.apiKey`, legacy `tools.web.fetch.firecrawl.apiKey`, or `FIRECRAWL_API_KEY` env var.
|
||||
- `baseUrl`: Firecrawl API base URL (default: `https://api.firecrawl.dev`).
|
||||
|
||||
@@ -507,6 +507,17 @@ runtime loads. Read-only channel setup/status discovery can use this metadata
|
||||
directly for configured external channels when no setup entry is available, or
|
||||
when `setup.requiresRuntime: false` declares setup runtime unnecessary.
|
||||
|
||||
For a channel plugin, `configSchema` and `channelConfigs` describe different
|
||||
paths:
|
||||
|
||||
- `configSchema` validates `plugins.entries.<plugin-id>.config`
|
||||
- `channelConfigs.<channel-id>.schema` validates `channels.<channel-id>`
|
||||
|
||||
Non-bundled plugins that declare `channels[]` should also declare matching
|
||||
`channelConfigs` entries. Without them, OpenClaw can still load the plugin, but
|
||||
cold-path config schema, setup, and Control UI surfaces cannot know the
|
||||
channel-owned option shape until plugin runtime executes.
|
||||
|
||||
```json
|
||||
{
|
||||
"channelConfigs": {
|
||||
|
||||
@@ -322,9 +322,13 @@ should use `resolveInboundMentionDecision({ facts, policy })`.
|
||||
"configSchema": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"acme-chat": {
|
||||
"properties": {}
|
||||
},
|
||||
"channelConfigs": {
|
||||
"acme-chat": {
|
||||
"schema": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"token": { "type": "string" },
|
||||
"allowFrom": {
|
||||
@@ -332,6 +336,12 @@ should use `resolveInboundMentionDecision({ facts, policy })`.
|
||||
"items": { "type": "string" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"uiHints": {
|
||||
"token": {
|
||||
"label": "Bot token",
|
||||
"sensitive": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -339,6 +349,11 @@ should use `resolveInboundMentionDecision({ facts, policy })`.
|
||||
```
|
||||
</CodeGroup>
|
||||
|
||||
`configSchema` validates `plugins.entries.acme-chat.config`. Use it for
|
||||
plugin-owned settings that are not the channel account config. `channelConfigs`
|
||||
validates `channels.acme-chat` and is the cold-path source used by config
|
||||
schema, setup, and UI surfaces before the plugin runtime loads.
|
||||
|
||||
</Step>
|
||||
|
||||
<Step title="Build the channel plugin object">
|
||||
|
||||
@@ -260,7 +260,7 @@ releases.
|
||||
| `plugin-sdk/channel-pairing` | DM pairing primitives | `createChannelPairingController` |
|
||||
| `plugin-sdk/channel-reply-pipeline` | Reply prefix + typing wiring | `createChannelReplyPipeline` |
|
||||
| `plugin-sdk/channel-config-helpers` | Config adapter factories | `createHybridChannelConfigAdapter` |
|
||||
| `plugin-sdk/channel-config-schema` | Config schema builders | Channel config schema types |
|
||||
| `plugin-sdk/channel-config-schema` | Config schema builders | Shared channel config schema primitives; bundled-channel-named schema exports are legacy compatibility only |
|
||||
| `plugin-sdk/telegram-command-config` | Telegram command config helpers | Command-name normalization, description trimming, duplicate/conflict validation |
|
||||
| `plugin-sdk/channel-policy` | Group/DM policy resolution | `resolveChannelGroupRequireMention` |
|
||||
| `plugin-sdk/channel-lifecycle` | Account status and draft stream lifecycle helpers | `createAccountStatusSink`, draft preview finalization helpers |
|
||||
|
||||
@@ -35,6 +35,12 @@ prefer `openclaw/plugin-sdk/channel-core`; keep `openclaw/plugin-sdk/core` for
|
||||
the broader umbrella surface and shared helpers such as
|
||||
`buildChannelConfigSchema`.
|
||||
|
||||
For channel config, publish the channel-owned JSON Schema through
|
||||
`openclaw.plugin.json#channelConfigs`. The `plugin-sdk/channel-config-schema`
|
||||
subpath is for shared schema primitives and the generic builder. Any
|
||||
bundled-channel-named schema exports on that subpath are legacy compatibility
|
||||
exports, not a pattern for new plugins.
|
||||
|
||||
<Warning>
|
||||
Do not import provider- or channel-branded convenience seams (for example
|
||||
`openclaw/plugin-sdk/slack`, `.../discord`, `.../signal`, `.../whatsapp`).
|
||||
|
||||
@@ -409,12 +409,12 @@ For channel-specific config, use the channel config section instead:
|
||||
|
||||
### Building channel config schemas
|
||||
|
||||
Use `buildChannelConfigSchema` from `openclaw/plugin-sdk/core` to convert a
|
||||
Zod schema into the `ChannelConfigSchema` wrapper that OpenClaw validates:
|
||||
Use `buildChannelConfigSchema` to convert a Zod schema into the
|
||||
`ChannelConfigSchema` wrapper used by plugin-owned config artifacts:
|
||||
|
||||
```typescript
|
||||
import { z } from "zod";
|
||||
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/core";
|
||||
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";
|
||||
|
||||
const accountSchema = z.object({
|
||||
token: z.string().optional(),
|
||||
@@ -426,6 +426,11 @@ const accountSchema = z.object({
|
||||
const configSchema = buildChannelConfigSchema(accountSchema);
|
||||
```
|
||||
|
||||
For third-party plugins, the cold-path contract is still the plugin manifest:
|
||||
mirror the generated JSON Schema into `openclaw.plugin.json#channelConfigs` so
|
||||
config schema, setup, and UI surfaces can inspect `channels.<id>` without
|
||||
loading runtime code.
|
||||
|
||||
## Setup wizards
|
||||
|
||||
Channel plugins can provide interactive setup wizards for `openclaw onboard`.
|
||||
|
||||
Reference in New Issue
Block a user