Files
openclaw/src/plugins/bundled-plugin-metadata.generated.ts
2026-03-27 12:26:01 +00:00

19162 lines
635 KiB
TypeScript

// Auto-generated by scripts/generate-bundled-plugin-metadata.mjs. Do not edit directly.
export const GENERATED_BUNDLED_PLUGIN_METADATA = [
{
dirName: "acpx",
idHint: "acpx",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/acpx",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw ACP runtime backend via acpx",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "acpx",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
command: {
type: "string",
minLength: 1,
},
expectedVersion: {
type: "string",
minLength: 1,
},
cwd: {
type: "string",
minLength: 1,
},
permissionMode: {
type: "string",
enum: ["approve-all", "approve-reads", "deny-all"],
},
nonInteractivePermissions: {
type: "string",
enum: ["deny", "fail"],
},
strictWindowsCmdWrapper: {
type: "boolean",
},
timeoutSeconds: {
type: "number",
minimum: 0.001,
},
queueOwnerTtlSeconds: {
type: "number",
minimum: 0,
},
mcpServers: {
type: "object",
additionalProperties: {
type: "object",
properties: {
command: {
type: "string",
minLength: 1,
description: "Command to run the MCP server",
},
args: {
type: "array",
items: {
type: "string",
},
description: "Arguments to pass to the command",
},
env: {
type: "object",
additionalProperties: {
type: "string",
},
description: "Environment variables for the MCP server",
},
},
required: ["command"],
},
},
},
},
skills: ["./skills"],
name: "ACPX Runtime",
description:
"ACP runtime backend powered by acpx with configurable command path and version policy.",
uiHints: {
command: {
label: "acpx Command",
help: "Optional path/command override for acpx (for example /home/user/repos/acpx/dist/cli.js). Leave unset to use plugin-local bundled acpx.",
},
expectedVersion: {
label: "Expected acpx Version",
help: 'Exact version to enforce or "any" to skip strict version matching.',
},
cwd: {
label: "Default Working Directory",
help: "Default cwd for ACP session operations when not set per session.",
},
permissionMode: {
label: "Permission Mode",
help: "Default acpx permission policy for runtime prompts.",
},
nonInteractivePermissions: {
label: "Non-Interactive Permission Policy",
help: "acpx policy when interactive permission prompts are unavailable.",
},
strictWindowsCmdWrapper: {
label: "Strict Windows cmd Wrapper",
help: "Enabled by default. On Windows, reject unresolved .cmd/.bat wrappers instead of shell fallback. Disable only for compatibility with non-standard wrappers.",
advanced: true,
},
timeoutSeconds: {
label: "Prompt Timeout Seconds",
help: "Optional acpx timeout for each runtime turn.",
advanced: true,
},
queueOwnerTtlSeconds: {
label: "Queue Owner TTL Seconds",
help: "Idle queue-owner TTL for acpx prompt turns. Keep this short in OpenClaw to avoid delayed completion after each turn.",
advanced: true,
},
mcpServers: {
label: "MCP Servers",
help: "Named MCP server definitions to inject into ACPX-backed session bootstrap. Each entry needs a command and can include args and env.",
advanced: true,
},
},
},
},
{
dirName: "amazon-bedrock",
idHint: "amazon-bedrock",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/amazon-bedrock-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Amazon Bedrock provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "amazon-bedrock",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["amazon-bedrock"],
},
},
{
dirName: "anthropic",
idHint: "anthropic",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/anthropic-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Anthropic provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "anthropic",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["anthropic"],
cliBackends: ["claude-cli"],
providerAuthEnvVars: {
anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"],
},
providerAuthChoices: [
{
provider: "anthropic",
method: "cli",
choiceId: "anthropic-cli",
choiceLabel: "Anthropic Claude CLI",
choiceHint: "Reuse a local Claude CLI login on this host",
groupId: "anthropic",
groupLabel: "Anthropic",
groupHint: "Claude CLI + setup-token + API key",
},
{
provider: "anthropic",
method: "setup-token",
choiceId: "token",
choiceLabel: "Anthropic token (paste setup-token)",
choiceHint: "Run `claude setup-token` elsewhere, then paste the token here",
groupId: "anthropic",
groupLabel: "Anthropic",
groupHint: "Claude CLI + setup-token + API key",
},
{
provider: "anthropic",
method: "api-key",
choiceId: "apiKey",
choiceLabel: "Anthropic API key",
groupId: "anthropic",
groupLabel: "Anthropic",
groupHint: "Claude CLI + setup-token + API key",
optionKey: "anthropicApiKey",
cliFlag: "--anthropic-api-key",
cliOption: "--anthropic-api-key <key>",
cliDescription: "Anthropic API key",
},
],
contracts: {
mediaUnderstandingProviders: ["anthropic"],
},
},
},
{
dirName: "bluebubbles",
idHint: "bluebubbles",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/bluebubbles",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw BlueBubbles channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "bluebubbles",
label: "BlueBubbles",
selectionLabel: "BlueBubbles (macOS app)",
detailLabel: "BlueBubbles",
docsPath: "/channels/bluebubbles",
docsLabel: "bluebubbles",
blurb: "iMessage via the BlueBubbles mac app + REST API.",
aliases: ["bb"],
preferOver: ["imessage"],
systemImage: "bubble.left.and.text.bubble.right",
order: 75,
},
install: {
npmSpec: "@openclaw/bluebubbles",
localPath: "extensions/bluebubbles",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "bluebubbles",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["bluebubbles"],
channelConfigs: {
bluebubbles: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
serverUrl: {
type: "string",
},
password: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
type: "string",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
enrichGroupParticipantsFromContacts: {
default: true,
type: "boolean",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
mediaLocalRoots: {
type: "array",
items: {
type: "string",
},
},
sendReadReceipts: {
type: "boolean",
},
allowPrivateNetwork: {
type: "boolean",
},
blockStreaming: {
type: "boolean",
},
groups: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
},
accounts: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
serverUrl: {
type: "string",
},
password: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
type: "string",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
enrichGroupParticipantsFromContacts: {
default: true,
type: "boolean",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
mediaLocalRoots: {
type: "array",
items: {
type: "string",
},
},
sendReadReceipts: {
type: "boolean",
},
allowPrivateNetwork: {
type: "boolean",
},
blockStreaming: {
type: "boolean",
},
groups: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
},
},
required: ["enrichGroupParticipantsFromContacts"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
actions: {
type: "object",
properties: {
reactions: {
default: true,
type: "boolean",
},
edit: {
default: true,
type: "boolean",
},
unsend: {
default: true,
type: "boolean",
},
reply: {
default: true,
type: "boolean",
},
sendWithEffect: {
default: true,
type: "boolean",
},
renameGroup: {
default: true,
type: "boolean",
},
setGroupIcon: {
default: true,
type: "boolean",
},
addParticipant: {
default: true,
type: "boolean",
},
removeParticipant: {
default: true,
type: "boolean",
},
leaveGroup: {
default: true,
type: "boolean",
},
sendAttachment: {
default: true,
type: "boolean",
},
},
required: [
"reactions",
"edit",
"unsend",
"reply",
"sendWithEffect",
"renameGroup",
"setGroupIcon",
"addParticipant",
"removeParticipant",
"leaveGroup",
"sendAttachment",
],
additionalProperties: false,
},
},
required: ["enrichGroupParticipantsFromContacts"],
additionalProperties: false,
},
uiHints: {
"": {
label: "BlueBubbles",
help: "BlueBubbles channel provider configuration used for Apple messaging bridge integrations. Keep DM policy aligned with your trusted sender model in shared deployments.",
},
dmPolicy: {
label: "BlueBubbles DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.bluebubbles.allowFrom=["*"].',
},
},
label: "BlueBubbles",
description: "iMessage via the BlueBubbles mac app + REST API.",
preferOver: ["imessage"],
},
},
},
},
{
dirName: "brave",
idHint: "brave",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/brave-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Brave plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "brave",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
mode: {
type: "string",
enum: ["web", "llm-context"],
},
},
},
},
},
providerAuthEnvVars: {
brave: ["BRAVE_API_KEY"],
},
uiHints: {
"webSearch.apiKey": {
label: "Brave Search API Key",
help: "Brave Search API key (fallback: BRAVE_API_KEY env var).",
sensitive: true,
placeholder: "BSA...",
},
"webSearch.mode": {
label: "Brave Search Mode",
help: "Brave Search mode: web or llm-context.",
},
},
contracts: {
webSearchProviders: ["brave"],
},
},
},
{
dirName: "browser",
idHint: "browser",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/browser-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw browser tool plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "browser",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
},
},
{
dirName: "byteplus",
idHint: "byteplus",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/byteplus-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw BytePlus provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "byteplus",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["byteplus", "byteplus-plan"],
providerAuthEnvVars: {
byteplus: ["BYTEPLUS_API_KEY"],
},
providerAuthChoices: [
{
provider: "byteplus",
method: "api-key",
choiceId: "byteplus-api-key",
choiceLabel: "BytePlus API key",
groupId: "byteplus",
groupLabel: "BytePlus",
groupHint: "API key",
optionKey: "byteplusApiKey",
cliFlag: "--byteplus-api-key",
cliOption: "--byteplus-api-key <key>",
cliDescription: "BytePlus API key",
},
],
},
},
{
dirName: "chutes",
idHint: "chutes",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/chutes-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Chutes.ai provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "chutes",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["chutes"],
providerAuthEnvVars: {
chutes: ["CHUTES_API_KEY", "CHUTES_OAUTH_TOKEN"],
},
providerAuthChoices: [
{
provider: "chutes",
method: "oauth",
choiceId: "chutes",
choiceLabel: "Chutes (OAuth)",
choiceHint: "Browser sign-in",
groupId: "chutes",
groupLabel: "Chutes",
groupHint: "OAuth + API key",
},
{
provider: "chutes",
method: "api-key",
choiceId: "chutes-api-key",
choiceLabel: "Chutes API key",
choiceHint: "Open-source models including Llama, DeepSeek, and more",
groupId: "chutes",
groupLabel: "Chutes",
groupHint: "OAuth + API key",
optionKey: "chutesApiKey",
cliFlag: "--chutes-api-key",
cliOption: "--chutes-api-key <key>",
cliDescription: "Chutes API key",
},
],
},
},
{
dirName: "cloudflare-ai-gateway",
idHint: "cloudflare-ai-gateway",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/cloudflare-ai-gateway-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Cloudflare AI Gateway provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "cloudflare-ai-gateway",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["cloudflare-ai-gateway"],
providerAuthEnvVars: {
"cloudflare-ai-gateway": ["CLOUDFLARE_AI_GATEWAY_API_KEY"],
},
providerAuthChoices: [
{
provider: "cloudflare-ai-gateway",
method: "api-key",
choiceId: "cloudflare-ai-gateway-api-key",
choiceLabel: "Cloudflare AI Gateway",
choiceHint: "Account ID + Gateway ID + API key",
groupId: "cloudflare-ai-gateway",
groupLabel: "Cloudflare AI Gateway",
groupHint: "Account ID + Gateway ID + API key",
optionKey: "cloudflareAiGatewayApiKey",
cliFlag: "--cloudflare-ai-gateway-api-key",
cliOption: "--cloudflare-ai-gateway-api-key <key>",
cliDescription: "Cloudflare AI Gateway API key",
},
],
},
},
{
dirName: "copilot-proxy",
idHint: "copilot-proxy",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/copilot-proxy",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Copilot Proxy provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "copilot-proxy",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["copilot-proxy"],
providerAuthChoices: [
{
provider: "copilot-proxy",
method: "local",
choiceId: "copilot-proxy",
choiceLabel: "Copilot Proxy",
choiceHint: "Configure base URL + model ids",
groupId: "copilot",
groupLabel: "Copilot",
groupHint: "GitHub + local proxy",
},
],
},
},
{
dirName: "deepgram",
idHint: "deepgram",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/deepgram-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Deepgram media-understanding provider",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "deepgram",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
contracts: {
mediaUnderstandingProviders: ["deepgram"],
},
},
},
{
dirName: "deepseek",
idHint: "deepseek",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/deepseek-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw DeepSeek provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "deepseek",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["deepseek"],
providerAuthEnvVars: {
deepseek: ["DEEPSEEK_API_KEY"],
},
providerAuthChoices: [
{
provider: "deepseek",
method: "api-key",
choiceId: "deepseek-api-key",
choiceLabel: "DeepSeek API key",
groupId: "deepseek",
groupLabel: "DeepSeek",
groupHint: "API key",
optionKey: "deepseekApiKey",
cliFlag: "--deepseek-api-key",
cliOption: "--deepseek-api-key <key>",
cliDescription: "DeepSeek API key",
},
],
},
},
{
dirName: "diagnostics-otel",
idHint: "diagnostics-otel",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/diagnostics-otel",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw diagnostics OpenTelemetry exporter",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "diagnostics-otel",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
},
},
{
dirName: "diffs",
idHint: "diffs",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/diffs",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw diff viewer plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "diffs",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
defaults: {
type: "object",
additionalProperties: false,
properties: {
fontFamily: {
type: "string",
default: "Fira Code",
},
fontSize: {
type: "number",
minimum: 10,
maximum: 24,
default: 15,
},
lineSpacing: {
type: "number",
minimum: 1,
maximum: 3,
default: 1.6,
},
layout: {
type: "string",
enum: ["unified", "split"],
default: "unified",
},
showLineNumbers: {
type: "boolean",
default: true,
},
diffIndicators: {
type: "string",
enum: ["bars", "classic", "none"],
default: "bars",
},
wordWrap: {
type: "boolean",
default: true,
},
background: {
type: "boolean",
default: true,
},
theme: {
type: "string",
enum: ["light", "dark"],
default: "dark",
},
fileFormat: {
type: "string",
enum: ["png", "pdf"],
default: "png",
},
format: {
type: "string",
enum: ["png", "pdf"],
},
fileQuality: {
type: "string",
enum: ["standard", "hq", "print"],
default: "standard",
},
fileScale: {
type: "number",
minimum: 1,
maximum: 4,
default: 2,
},
fileMaxWidth: {
type: "number",
minimum: 640,
maximum: 2400,
default: 960,
},
imageFormat: {
type: "string",
enum: ["png", "pdf"],
},
imageQuality: {
type: "string",
enum: ["standard", "hq", "print"],
},
imageScale: {
type: "number",
minimum: 1,
maximum: 4,
},
imageMaxWidth: {
type: "number",
minimum: 640,
maximum: 2400,
},
mode: {
type: "string",
enum: ["view", "image", "file", "both"],
default: "both",
},
},
},
security: {
type: "object",
additionalProperties: false,
properties: {
allowRemoteViewer: {
type: "boolean",
default: false,
},
},
},
},
},
skills: ["./skills"],
name: "Diffs",
description: "Read-only diff viewer and file renderer for agents.",
uiHints: {
"defaults.fontFamily": {
label: "Default Font",
help: "Preferred font family name for diff content and headers.",
},
"defaults.fontSize": {
label: "Default Font Size",
help: "Base diff font size in pixels.",
},
"defaults.lineSpacing": {
label: "Default Line Spacing",
help: "Line-height multiplier applied to diff rows.",
},
"defaults.layout": {
label: "Default Layout",
help: "Initial diff layout shown in the viewer.",
},
"defaults.showLineNumbers": {
label: "Show Line Numbers",
help: "Show line numbers by default.",
},
"defaults.diffIndicators": {
label: "Diff Indicator Style",
help: "Choose added/removed indicators style.",
},
"defaults.wordWrap": {
label: "Default Word Wrap",
help: "Wrap long lines by default.",
},
"defaults.background": {
label: "Default Background Highlights",
help: "Show added/removed background highlights by default.",
},
"defaults.theme": {
label: "Default Theme",
help: "Initial viewer theme.",
},
"defaults.fileFormat": {
label: "Default File Format",
help: "Rendered file format for file mode (PNG or PDF).",
},
"defaults.fileQuality": {
label: "Default File Quality",
help: "Quality preset for PNG/PDF rendering.",
},
"defaults.fileScale": {
label: "Default File Scale",
help: "Device scale factor used while rendering file artifacts.",
},
"defaults.fileMaxWidth": {
label: "Default File Max Width",
help: "Maximum file render width in CSS pixels.",
},
"defaults.mode": {
label: "Default Output Mode",
help: "Tool default when mode is omitted. Use view for canvas/gateway viewer, file for PNG/PDF, or both.",
},
"security.allowRemoteViewer": {
label: "Allow Remote Viewer",
help: "Allow non-loopback access to diff viewer URLs when the token path is known.",
},
},
},
},
{
dirName: "discord",
idHint: "discord",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/discord",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Discord channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "discord",
label: "Discord",
selectionLabel: "Discord (Bot API)",
detailLabel: "Discord Bot",
docsPath: "/channels/discord",
docsLabel: "discord",
blurb: "very well supported right now.",
systemImage: "bubble.left.and.bubble.right",
},
install: {
npmSpec: "@openclaw/discord",
localPath: "extensions/discord",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "discord",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["discord"],
channelConfigs: {
discord: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
token: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
proxy: {
type: "string",
},
allowBots: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "mentions",
},
],
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
streamMode: {
type: "string",
enum: ["partial", "block", "off"],
},
draftChunk: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
breakPreference: {
anyOf: [
{
type: "string",
const: "paragraph",
},
{
type: "string",
const: "newline",
},
{
type: "string",
const: "sentence",
},
],
},
},
additionalProperties: false,
},
maxLinesPerMessage: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
retry: {
type: "object",
properties: {
attempts: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
minDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
jitter: {
type: "number",
minimum: 0,
maximum: 1,
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
stickers: {
type: "boolean",
},
emojiUploads: {
type: "boolean",
},
stickerUploads: {
type: "boolean",
},
polls: {
type: "boolean",
},
permissions: {
type: "boolean",
},
messages: {
type: "boolean",
},
threads: {
type: "boolean",
},
pins: {
type: "boolean",
},
search: {
type: "boolean",
},
memberInfo: {
type: "boolean",
},
roleInfo: {
type: "boolean",
},
roles: {
type: "boolean",
},
channelInfo: {
type: "boolean",
},
voiceStatus: {
type: "boolean",
},
events: {
type: "boolean",
},
moderation: {
type: "boolean",
},
channels: {
type: "boolean",
},
presence: {
type: "boolean",
},
},
additionalProperties: false,
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupEnabled: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
},
additionalProperties: false,
},
guilds: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
slug: {
type: "string",
},
requireMention: {
type: "boolean",
},
ignoreOtherMentions: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
roles: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
channels: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
ignoreOtherMentions: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
roles: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
includeThreadStarter: {
type: "boolean",
},
autoThread: {
type: "boolean",
},
autoThreadName: {
type: "string",
enum: ["message", "generated"],
},
autoArchiveDuration: {
anyOf: [
{
type: "string",
enum: ["60", "1440", "4320", "10080"],
},
{
type: "number",
const: 60,
},
{
type: "number",
const: 1440,
},
{
type: "number",
const: 4320,
},
{
type: "number",
const: 10080,
},
],
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
execApprovals: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
approvers: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
agentFilter: {
type: "array",
items: {
type: "string",
},
},
sessionFilter: {
type: "array",
items: {
type: "string",
},
},
cleanupAfterResolve: {
type: "boolean",
},
target: {
type: "string",
enum: ["dm", "channel", "both"],
},
},
additionalProperties: false,
},
agentComponents: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
ui: {
type: "object",
properties: {
components: {
type: "object",
properties: {
accentColor: {
type: "string",
pattern: "^#?[0-9a-fA-F]{6}$",
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
slashCommand: {
type: "object",
properties: {
ephemeral: {
type: "boolean",
},
},
additionalProperties: false,
},
threadBindings: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
idleHours: {
type: "number",
minimum: 0,
},
maxAgeHours: {
type: "number",
minimum: 0,
},
spawnSubagentSessions: {
type: "boolean",
},
spawnAcpSessions: {
type: "boolean",
},
},
additionalProperties: false,
},
intents: {
type: "object",
properties: {
presence: {
type: "boolean",
},
guildMembers: {
type: "boolean",
},
},
additionalProperties: false,
},
voice: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
autoJoin: {
type: "array",
items: {
type: "object",
properties: {
guildId: {
type: "string",
minLength: 1,
},
channelId: {
type: "string",
minLength: 1,
},
},
required: ["guildId", "channelId"],
additionalProperties: false,
},
},
daveEncryption: {
type: "boolean",
},
decryptionFailureTolerance: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
tts: {
type: "object",
properties: {
auto: {
type: "string",
enum: ["off", "always", "inbound", "tagged"],
},
enabled: {
type: "boolean",
},
mode: {
type: "string",
enum: ["final", "all"],
},
provider: {
type: "string",
minLength: 1,
},
summaryModel: {
type: "string",
},
modelOverrides: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allowText: {
type: "boolean",
},
allowProvider: {
type: "boolean",
},
allowVoice: {
type: "boolean",
},
allowModelId: {
type: "boolean",
},
allowVoiceSettings: {
type: "boolean",
},
allowNormalization: {
type: "boolean",
},
allowSeed: {
type: "boolean",
},
},
additionalProperties: false,
},
providers: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
apiKey: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
},
additionalProperties: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
{
type: "boolean",
},
{
type: "null",
},
{
type: "array",
items: {},
},
{
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {},
},
],
},
},
},
prefsPath: {
type: "string",
},
maxTextLength: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
timeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
pluralkit: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
token: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
ackReactionScope: {
type: "string",
enum: ["group-mentions", "group-all", "direct", "all", "off", "none"],
},
activity: {
type: "string",
},
status: {
type: "string",
enum: ["online", "dnd", "idle", "invisible"],
},
autoPresence: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
intervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
minUpdateIntervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
healthyText: {
type: "string",
},
degradedText: {
type: "string",
},
exhaustedText: {
type: "string",
},
},
additionalProperties: false,
},
activityType: {
anyOf: [
{
type: "number",
const: 0,
},
{
type: "number",
const: 1,
},
{
type: "number",
const: 2,
},
{
type: "number",
const: 3,
},
{
type: "number",
const: 4,
},
{
type: "number",
const: 5,
},
],
},
activityUrl: {
type: "string",
format: "uri",
},
inboundWorker: {
type: "object",
properties: {
runTimeoutMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
eventQueue: {
type: "object",
properties: {
listenerTimeout: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxQueueSize: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxConcurrency: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
token: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
proxy: {
type: "string",
},
allowBots: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "mentions",
},
],
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
streamMode: {
type: "string",
enum: ["partial", "block", "off"],
},
draftChunk: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
breakPreference: {
anyOf: [
{
type: "string",
const: "paragraph",
},
{
type: "string",
const: "newline",
},
{
type: "string",
const: "sentence",
},
],
},
},
additionalProperties: false,
},
maxLinesPerMessage: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
retry: {
type: "object",
properties: {
attempts: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
minDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
jitter: {
type: "number",
minimum: 0,
maximum: 1,
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
stickers: {
type: "boolean",
},
emojiUploads: {
type: "boolean",
},
stickerUploads: {
type: "boolean",
},
polls: {
type: "boolean",
},
permissions: {
type: "boolean",
},
messages: {
type: "boolean",
},
threads: {
type: "boolean",
},
pins: {
type: "boolean",
},
search: {
type: "boolean",
},
memberInfo: {
type: "boolean",
},
roleInfo: {
type: "boolean",
},
roles: {
type: "boolean",
},
channelInfo: {
type: "boolean",
},
voiceStatus: {
type: "boolean",
},
events: {
type: "boolean",
},
moderation: {
type: "boolean",
},
channels: {
type: "boolean",
},
presence: {
type: "boolean",
},
},
additionalProperties: false,
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupEnabled: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
},
additionalProperties: false,
},
guilds: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
slug: {
type: "string",
},
requireMention: {
type: "boolean",
},
ignoreOtherMentions: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
roles: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
channels: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
ignoreOtherMentions: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
roles: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
includeThreadStarter: {
type: "boolean",
},
autoThread: {
type: "boolean",
},
autoThreadName: {
type: "string",
enum: ["message", "generated"],
},
autoArchiveDuration: {
anyOf: [
{
type: "string",
enum: ["60", "1440", "4320", "10080"],
},
{
type: "number",
const: 60,
},
{
type: "number",
const: 1440,
},
{
type: "number",
const: 4320,
},
{
type: "number",
const: 10080,
},
],
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
execApprovals: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
approvers: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
agentFilter: {
type: "array",
items: {
type: "string",
},
},
sessionFilter: {
type: "array",
items: {
type: "string",
},
},
cleanupAfterResolve: {
type: "boolean",
},
target: {
type: "string",
enum: ["dm", "channel", "both"],
},
},
additionalProperties: false,
},
agentComponents: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
ui: {
type: "object",
properties: {
components: {
type: "object",
properties: {
accentColor: {
type: "string",
pattern: "^#?[0-9a-fA-F]{6}$",
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
slashCommand: {
type: "object",
properties: {
ephemeral: {
type: "boolean",
},
},
additionalProperties: false,
},
threadBindings: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
idleHours: {
type: "number",
minimum: 0,
},
maxAgeHours: {
type: "number",
minimum: 0,
},
spawnSubagentSessions: {
type: "boolean",
},
spawnAcpSessions: {
type: "boolean",
},
},
additionalProperties: false,
},
intents: {
type: "object",
properties: {
presence: {
type: "boolean",
},
guildMembers: {
type: "boolean",
},
},
additionalProperties: false,
},
voice: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
autoJoin: {
type: "array",
items: {
type: "object",
properties: {
guildId: {
type: "string",
minLength: 1,
},
channelId: {
type: "string",
minLength: 1,
},
},
required: ["guildId", "channelId"],
additionalProperties: false,
},
},
daveEncryption: {
type: "boolean",
},
decryptionFailureTolerance: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
tts: {
type: "object",
properties: {
auto: {
type: "string",
enum: ["off", "always", "inbound", "tagged"],
},
enabled: {
type: "boolean",
},
mode: {
type: "string",
enum: ["final", "all"],
},
provider: {
type: "string",
minLength: 1,
},
summaryModel: {
type: "string",
},
modelOverrides: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allowText: {
type: "boolean",
},
allowProvider: {
type: "boolean",
},
allowVoice: {
type: "boolean",
},
allowModelId: {
type: "boolean",
},
allowVoiceSettings: {
type: "boolean",
},
allowNormalization: {
type: "boolean",
},
allowSeed: {
type: "boolean",
},
},
additionalProperties: false,
},
providers: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
apiKey: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
},
additionalProperties: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
{
type: "boolean",
},
{
type: "null",
},
{
type: "array",
items: {},
},
{
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {},
},
],
},
},
},
prefsPath: {
type: "string",
},
maxTextLength: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
timeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
pluralkit: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
token: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
ackReactionScope: {
type: "string",
enum: ["group-mentions", "group-all", "direct", "all", "off", "none"],
},
activity: {
type: "string",
},
status: {
type: "string",
enum: ["online", "dnd", "idle", "invisible"],
},
autoPresence: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
intervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
minUpdateIntervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
healthyText: {
type: "string",
},
degradedText: {
type: "string",
},
exhaustedText: {
type: "string",
},
},
additionalProperties: false,
},
activityType: {
anyOf: [
{
type: "number",
const: 0,
},
{
type: "number",
const: 1,
},
{
type: "number",
const: 2,
},
{
type: "number",
const: 3,
},
{
type: "number",
const: 4,
},
{
type: "number",
const: 5,
},
],
},
activityUrl: {
type: "string",
format: "uri",
},
inboundWorker: {
type: "object",
properties: {
runTimeoutMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
eventQueue: {
type: "object",
properties: {
listenerTimeout: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxQueueSize: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxConcurrency: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
required: ["groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "Discord",
help: "Discord channel provider configuration for bot auth, retry policy, streaming, thread bindings, and optional voice capabilities. Keep privileged intents and advanced features disabled unless needed.",
},
dmPolicy: {
label: "Discord DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.discord.allowFrom=["*"].',
},
"dm.policy": {
label: "Discord DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.discord.allowFrom=["*"] (legacy: channels.discord.dm.allowFrom).',
},
configWrites: {
label: "Discord Config Writes",
help: "Allow Discord to write config in response to channel events/commands (default: true).",
},
proxy: {
label: "Discord Proxy URL",
help: "Proxy URL for Discord gateway + API requests (app-id lookup and allowlist resolution). Set per account via channels.discord.accounts.<id>.proxy.",
},
"commands.native": {
label: "Discord Native Commands",
help: 'Override native commands for Discord (bool or "auto").',
},
"commands.nativeSkills": {
label: "Discord Native Skill Commands",
help: 'Override native skill commands for Discord (bool or "auto").',
},
streaming: {
label: "Discord Streaming Mode",
help: 'Unified Discord stream preview mode: "off" | "partial" | "block" | "progress". "progress" maps to "partial" on Discord. Legacy boolean/streamMode keys are auto-mapped.',
},
streamMode: {
label: "Discord Stream Mode (Legacy)",
help: "Legacy Discord preview mode alias (off | partial | block); auto-migrated to channels.discord.streaming.",
},
"draftChunk.minChars": {
label: "Discord Draft Chunk Min Chars",
help: 'Minimum chars before emitting a Discord stream preview update when channels.discord.streaming="block" (default: 200).',
},
"draftChunk.maxChars": {
label: "Discord Draft Chunk Max Chars",
help: 'Target max size for a Discord stream preview chunk when channels.discord.streaming="block" (default: 800; clamped to channels.discord.textChunkLimit).',
},
"draftChunk.breakPreference": {
label: "Discord Draft Chunk Break Preference",
help: "Preferred breakpoints for Discord draft chunks (paragraph | newline | sentence). Default: paragraph.",
},
"retry.attempts": {
label: "Discord Retry Attempts",
help: "Max retry attempts for outbound Discord API calls (default: 3).",
},
"retry.minDelayMs": {
label: "Discord Retry Min Delay (ms)",
help: "Minimum retry delay in ms for Discord outbound calls.",
},
"retry.maxDelayMs": {
label: "Discord Retry Max Delay (ms)",
help: "Maximum retry delay cap in ms for Discord outbound calls.",
},
"retry.jitter": {
label: "Discord Retry Jitter",
help: "Jitter factor (0-1) applied to Discord retry delays.",
},
maxLinesPerMessage: {
label: "Discord Max Lines Per Message",
help: "Soft max line count per Discord message (default: 17).",
},
"inboundWorker.runTimeoutMs": {
label: "Discord Inbound Worker Timeout (ms)",
help: "Optional queued Discord inbound worker timeout in ms. This is separate from Carbon listener timeouts; defaults to 1800000 and can be disabled with 0. Set per account via channels.discord.accounts.<id>.inboundWorker.runTimeoutMs.",
},
"eventQueue.listenerTimeout": {
label: "Discord EventQueue Listener Timeout (ms)",
help: "Canonical Discord listener timeout control in ms for gateway normalization/enqueue handlers. Default is 120000 in OpenClaw; set per account via channels.discord.accounts.<id>.eventQueue.listenerTimeout.",
},
"eventQueue.maxQueueSize": {
label: "Discord EventQueue Max Queue Size",
help: "Optional Discord EventQueue capacity override (max queued events before backpressure). Set per account via channels.discord.accounts.<id>.eventQueue.maxQueueSize.",
},
"eventQueue.maxConcurrency": {
label: "Discord EventQueue Max Concurrency",
help: "Optional Discord EventQueue concurrency override (max concurrent handler executions). Set per account via channels.discord.accounts.<id>.eventQueue.maxConcurrency.",
},
"threadBindings.enabled": {
label: "Discord Thread Binding Enabled",
help: "Enable Discord thread binding features (/focus, bound-thread routing/delivery, and thread-bound subagent sessions). Overrides session.threadBindings.enabled when set.",
},
"threadBindings.idleHours": {
label: "Discord Thread Binding Idle Timeout (hours)",
help: "Inactivity window in hours for Discord thread-bound sessions (/focus and spawned thread sessions). Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set.",
},
"threadBindings.maxAgeHours": {
label: "Discord Thread Binding Max Age (hours)",
help: "Optional hard max age in hours for Discord thread-bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set.",
},
"threadBindings.spawnSubagentSessions": {
label: "Discord Thread-Bound Subagent Spawn",
help: "Allow subagent spawns with thread=true to auto-create and bind Discord threads (default: false; opt-in). Set true to enable thread-bound subagent spawns for this account/channel.",
},
"threadBindings.spawnAcpSessions": {
label: "Discord Thread-Bound ACP Spawn",
help: "Allow /acp spawn to auto-create and bind Discord threads for ACP sessions (default: false; opt-in). Set true to enable thread-bound ACP spawns for this account/channel.",
},
"ui.components.accentColor": {
label: "Discord Component Accent Color",
help: "Accent color for Discord component containers (hex). Set per account via channels.discord.accounts.<id>.ui.components.accentColor.",
},
"intents.presence": {
label: "Discord Presence Intent",
help: "Enable the Guild Presences privileged intent. Must also be enabled in the Discord Developer Portal. Allows tracking user activities (e.g. Spotify). Default: false.",
},
"intents.guildMembers": {
label: "Discord Guild Members Intent",
help: "Enable the Guild Members privileged intent. Must also be enabled in the Discord Developer Portal. Default: false.",
},
"voice.enabled": {
label: "Discord Voice Enabled",
help: "Enable Discord voice channel conversations (default: true). Omit channels.discord.voice to keep voice support disabled for the account.",
},
"voice.autoJoin": {
label: "Discord Voice Auto-Join",
help: "Voice channels to auto-join on startup (list of guildId/channelId entries).",
},
"voice.daveEncryption": {
label: "Discord Voice DAVE Encryption",
help: "Toggle DAVE end-to-end encryption for Discord voice joins (default: true in @discordjs/voice; Discord may require this).",
},
"voice.decryptionFailureTolerance": {
label: "Discord Voice Decrypt Failure Tolerance",
help: "Consecutive decrypt failures before DAVE attempts session recovery (passed to @discordjs/voice; default: 24).",
},
"voice.tts": {
label: "Discord Voice Text-to-Speech",
help: "Optional TTS overrides for Discord voice playback (merged with messages.tts).",
},
"pluralkit.enabled": {
label: "Discord PluralKit Enabled",
help: "Resolve PluralKit proxied messages and treat system members as distinct senders.",
},
"pluralkit.token": {
label: "Discord PluralKit Token",
help: "Optional PluralKit token for resolving private systems or members.",
},
activity: {
label: "Discord Presence Activity",
help: "Discord presence activity text (defaults to custom status).",
},
status: {
label: "Discord Presence Status",
help: "Discord presence status (online, dnd, idle, invisible).",
},
"autoPresence.enabled": {
label: "Discord Auto Presence Enabled",
help: "Enable automatic Discord bot presence updates based on runtime/model availability signals. When enabled: healthy=>online, degraded/unknown=>idle, exhausted/unavailable=>dnd.",
},
"autoPresence.intervalMs": {
label: "Discord Auto Presence Check Interval (ms)",
help: "How often to evaluate Discord auto-presence state in milliseconds (default: 30000).",
},
"autoPresence.minUpdateIntervalMs": {
label: "Discord Auto Presence Min Update Interval (ms)",
help: "Minimum time between actual Discord presence update calls in milliseconds (default: 15000). Prevents status spam on noisy state changes.",
},
"autoPresence.healthyText": {
label: "Discord Auto Presence Healthy Text",
help: "Optional custom status text while runtime is healthy (online). If omitted, falls back to static channels.discord.activity when set.",
},
"autoPresence.degradedText": {
label: "Discord Auto Presence Degraded Text",
help: "Optional custom status text while runtime/model availability is degraded or unknown (idle).",
},
"autoPresence.exhaustedText": {
label: "Discord Auto Presence Exhausted Text",
help: "Optional custom status text while runtime detects exhausted/unavailable model quota (dnd). Supports {reason} template placeholder.",
},
activityType: {
label: "Discord Presence Activity Type",
help: "Discord presence activity type (0=Playing,1=Streaming,2=Listening,3=Watching,4=Custom,5=Competing).",
},
activityUrl: {
label: "Discord Presence Activity URL",
help: "Discord presence streaming URL (required for activityType=1).",
},
allowBots: {
label: "Discord Allow Bot Messages",
help: 'Allow bot-authored messages to trigger Discord replies (default: false). Set "mentions" to only accept bot messages that mention the bot.',
},
token: {
label: "Discord Bot Token",
help: "Discord bot token used for gateway and REST API authentication for this provider account. Keep this secret out of committed config and rotate immediately after any leak.",
},
},
label: "Discord",
description: "very well supported right now.",
},
},
},
},
{
dirName: "duckduckgo",
idHint: "duckduckgo",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/duckduckgo-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw DuckDuckGo plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "duckduckgo",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
region: {
type: "string",
},
safeSearch: {
type: "string",
enum: ["strict", "moderate", "off"],
},
},
},
},
},
uiHints: {
"webSearch.region": {
label: "DuckDuckGo Region",
help: "Optional DuckDuckGo region code such as us-en, uk-en, or de-de.",
},
"webSearch.safeSearch": {
label: "DuckDuckGo SafeSearch",
help: "SafeSearch level for DuckDuckGo results.",
},
},
contracts: {
webSearchProviders: ["duckduckgo"],
},
},
},
{
dirName: "elevenlabs",
idHint: "elevenlabs",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/elevenlabs-speech",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw ElevenLabs speech plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "elevenlabs",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
contracts: {
speechProviders: ["elevenlabs"],
},
},
},
{
dirName: "exa",
idHint: "exa",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/exa-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Exa plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "exa",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
},
},
},
},
providerAuthEnvVars: {
exa: ["EXA_API_KEY"],
},
uiHints: {
"webSearch.apiKey": {
label: "Exa API Key",
help: "Exa Search API key (fallback: EXA_API_KEY env var).",
sensitive: true,
placeholder: "exa-...",
},
},
contracts: {
webSearchProviders: ["exa"],
},
},
},
{
dirName: "fal",
idHint: "fal",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/fal-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw fal provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "fal",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["fal"],
providerAuthEnvVars: {
fal: ["FAL_KEY"],
},
providerAuthChoices: [
{
provider: "fal",
method: "api-key",
choiceId: "fal-api-key",
choiceLabel: "fal API key",
groupId: "fal",
groupLabel: "fal",
groupHint: "Image generation",
onboardingScopes: ["image-generation"],
optionKey: "falApiKey",
cliFlag: "--fal-api-key",
cliOption: "--fal-api-key <key>",
cliDescription: "fal API key",
},
],
contracts: {
imageGenerationProviders: ["fal"],
},
},
},
{
dirName: "feishu",
idHint: "feishu",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/feishu",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "feishu",
label: "Feishu",
selectionLabel: "Feishu/Lark (飞书)",
docsPath: "/channels/feishu",
docsLabel: "feishu",
blurb: "飞书/Lark enterprise messaging with doc/wiki/drive tools.",
aliases: ["lark"],
order: 35,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/feishu",
localPath: "extensions/feishu",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "feishu",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["feishu"],
skills: ["./skills"],
channelConfigs: {
feishu: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
enabled: {
type: "boolean",
},
defaultAccount: {
type: "string",
},
appId: {
type: "string",
},
appSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
encryptKey: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
verificationToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
domain: {
default: "feishu",
anyOf: [
{
type: "string",
enum: ["feishu", "lark"],
},
{
type: "string",
format: "uri",
pattern: "^https:\\/\\/.*",
},
],
},
connectionMode: {
default: "websocket",
type: "string",
enum: ["websocket", "webhook"],
},
webhookPath: {
default: "/feishu/events",
type: "string",
},
webhookHost: {
type: "string",
},
webhookPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
mode: {
type: "string",
enum: ["native", "escape", "strip"],
},
tableMode: {
type: "string",
enum: ["native", "ascii", "simple"],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["open", "pairing", "allowlist"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
anyOf: [
{
type: "string",
enum: ["open", "allowlist", "disabled"],
},
{},
],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupSenderAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
requireMention: {
type: "boolean",
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
groupSessionScope: {
type: "string",
enum: ["group", "group_sender", "group_topic", "group_topic_sender"],
},
topicSessionMode: {
type: "string",
enum: ["disabled", "enabled"],
},
replyInThread: {
type: "string",
enum: ["disabled", "enabled"],
},
},
additionalProperties: false,
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreamingCoalesce: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
minDelayMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
httpTimeoutMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 300000,
},
heartbeat: {
type: "object",
properties: {
visibility: {
type: "string",
enum: ["visible", "hidden"],
},
intervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
renderMode: {
type: "string",
enum: ["auto", "raw", "card"],
},
streaming: {
type: "boolean",
},
tools: {
type: "object",
properties: {
doc: {
type: "boolean",
},
chat: {
type: "boolean",
},
wiki: {
type: "boolean",
},
drive: {
type: "boolean",
},
perm: {
type: "boolean",
},
scopes: {
type: "boolean",
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
replyInThread: {
type: "string",
enum: ["disabled", "enabled"],
},
reactionNotifications: {
default: "own",
type: "string",
enum: ["off", "own", "all"],
},
typingIndicator: {
default: true,
type: "boolean",
},
resolveSenderNames: {
default: true,
type: "boolean",
},
groupSessionScope: {
type: "string",
enum: ["group", "group_sender", "group_topic", "group_topic_sender"],
},
topicSessionMode: {
type: "string",
enum: ["disabled", "enabled"],
},
dynamicAgentCreation: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
workspaceTemplate: {
type: "string",
},
agentDirTemplate: {
type: "string",
},
maxAgents: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
name: {
type: "string",
},
appId: {
type: "string",
},
appSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
encryptKey: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
verificationToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
domain: {
anyOf: [
{
type: "string",
enum: ["feishu", "lark"],
},
{
type: "string",
format: "uri",
pattern: "^https:\\/\\/.*",
},
],
},
connectionMode: {
type: "string",
enum: ["websocket", "webhook"],
},
webhookPath: {
type: "string",
},
webhookHost: {
type: "string",
},
webhookPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
mode: {
type: "string",
enum: ["native", "escape", "strip"],
},
tableMode: {
type: "string",
enum: ["native", "ascii", "simple"],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
dmPolicy: {
type: "string",
enum: ["open", "pairing", "allowlist"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
anyOf: [
{
type: "string",
enum: ["open", "allowlist", "disabled"],
},
{},
],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupSenderAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
requireMention: {
type: "boolean",
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
groupSessionScope: {
type: "string",
enum: ["group", "group_sender", "group_topic", "group_topic_sender"],
},
topicSessionMode: {
type: "string",
enum: ["disabled", "enabled"],
},
replyInThread: {
type: "string",
enum: ["disabled", "enabled"],
},
},
additionalProperties: false,
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreamingCoalesce: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
minDelayMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
httpTimeoutMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 300000,
},
heartbeat: {
type: "object",
properties: {
visibility: {
type: "string",
enum: ["visible", "hidden"],
},
intervalMs: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
renderMode: {
type: "string",
enum: ["auto", "raw", "card"],
},
streaming: {
type: "boolean",
},
tools: {
type: "object",
properties: {
doc: {
type: "boolean",
},
chat: {
type: "boolean",
},
wiki: {
type: "boolean",
},
drive: {
type: "boolean",
},
perm: {
type: "boolean",
},
scopes: {
type: "boolean",
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
replyInThread: {
type: "string",
enum: ["disabled", "enabled"],
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all"],
},
typingIndicator: {
type: "boolean",
},
resolveSenderNames: {
type: "boolean",
},
groupSessionScope: {
type: "string",
enum: ["group", "group_sender", "group_topic", "group_topic_sender"],
},
topicSessionMode: {
type: "string",
enum: ["disabled", "enabled"],
},
},
additionalProperties: false,
},
},
},
required: [
"domain",
"connectionMode",
"webhookPath",
"dmPolicy",
"groupPolicy",
"reactionNotifications",
"typingIndicator",
"resolveSenderNames",
],
additionalProperties: false,
},
label: "Feishu",
description: "飞书/Lark enterprise messaging with doc/wiki/drive tools.",
},
},
},
},
{
dirName: "firecrawl",
idHint: "firecrawl",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/firecrawl-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Firecrawl plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "firecrawl",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
baseUrl: {
type: "string",
},
},
},
},
},
providerAuthEnvVars: {
firecrawl: ["FIRECRAWL_API_KEY"],
},
uiHints: {
"webSearch.apiKey": {
label: "Firecrawl Search API Key",
help: "Firecrawl API key for web search (fallback: FIRECRAWL_API_KEY env var).",
sensitive: true,
placeholder: "fc-...",
},
"webSearch.baseUrl": {
label: "Firecrawl Search Base URL",
help: "Firecrawl Search base URL override.",
},
},
contracts: {
webSearchProviders: ["firecrawl"],
tools: ["firecrawl_search", "firecrawl_scrape"],
},
},
},
{
dirName: "github-copilot",
idHint: "github-copilot",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/github-copilot-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw GitHub Copilot provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "github-copilot",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["github-copilot"],
providerAuthEnvVars: {
"github-copilot": ["COPILOT_GITHUB_TOKEN", "GH_TOKEN", "GITHUB_TOKEN"],
},
providerAuthChoices: [
{
provider: "github-copilot",
method: "device",
choiceId: "github-copilot",
choiceLabel: "GitHub Copilot",
choiceHint: "Device login with your GitHub account",
groupId: "copilot",
groupLabel: "Copilot",
groupHint: "GitHub + local proxy",
},
],
},
},
{
dirName: "google",
idHint: "google",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/google-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Google plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "google",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
model: {
type: "string",
},
},
},
},
},
providers: ["google", "google-gemini-cli"],
cliBackends: ["google-gemini-cli"],
providerAuthEnvVars: {
google: ["GEMINI_API_KEY", "GOOGLE_API_KEY"],
},
providerAuthChoices: [
{
provider: "google",
method: "api-key",
choiceId: "gemini-api-key",
choiceLabel: "Google Gemini API key",
groupId: "google",
groupLabel: "Google",
groupHint: "Gemini API key + OAuth",
optionKey: "geminiApiKey",
cliFlag: "--gemini-api-key",
cliOption: "--gemini-api-key <key>",
cliDescription: "Gemini API key",
},
{
provider: "google-gemini-cli",
method: "oauth",
choiceId: "google-gemini-cli",
choiceLabel: "Gemini CLI OAuth",
choiceHint: "Google OAuth with project-aware token payload",
groupId: "google",
groupLabel: "Google",
groupHint: "Gemini API key + OAuth",
},
],
uiHints: {
"webSearch.apiKey": {
label: "Gemini Search API Key",
help: "Gemini API key for Google Search grounding (fallback: GEMINI_API_KEY env var).",
sensitive: true,
placeholder: "AIza...",
},
"webSearch.model": {
label: "Gemini Search Model",
help: "Gemini model override for web search grounding.",
},
},
contracts: {
mediaUnderstandingProviders: ["google"],
imageGenerationProviders: ["google"],
webSearchProviders: ["gemini"],
},
},
},
{
dirName: "googlechat",
idHint: "googlechat",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/googlechat",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Google Chat channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "googlechat",
label: "Google Chat",
selectionLabel: "Google Chat (Chat API)",
detailLabel: "Google Chat",
docsPath: "/channels/googlechat",
docsLabel: "googlechat",
blurb: "Google Workspace Chat app via HTTP webhooks.",
aliases: ["gchat", "google-chat"],
order: 55,
},
install: {
npmSpec: "@openclaw/googlechat",
localPath: "extensions/googlechat",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "googlechat",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["googlechat"],
channelConfigs: {
googlechat: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
allowBots: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
defaultTo: {
type: "string",
},
serviceAccount: {
anyOf: [
{
type: "string",
},
{
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {},
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
serviceAccountRef: {
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
serviceAccountFile: {
type: "string",
},
audienceType: {
type: "string",
enum: ["app-url", "project-number"],
},
audience: {
type: "string",
},
appPrincipal: {
type: "string",
},
webhookPath: {
type: "string",
},
webhookUrl: {
type: "string",
},
botUser: {
type: "string",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streamMode: {
default: "replace",
type: "string",
enum: ["replace", "status_final", "append"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
},
required: ["policy"],
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
typingIndicator: {
type: "string",
enum: ["none", "message", "reaction"],
},
responsePrefix: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
allowBots: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
defaultTo: {
type: "string",
},
serviceAccount: {
anyOf: [
{
type: "string",
},
{
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {},
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
serviceAccountRef: {
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
serviceAccountFile: {
type: "string",
},
audienceType: {
type: "string",
enum: ["app-url", "project-number"],
},
audience: {
type: "string",
},
appPrincipal: {
type: "string",
},
webhookPath: {
type: "string",
},
webhookUrl: {
type: "string",
},
botUser: {
type: "string",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streamMode: {
default: "replace",
type: "string",
enum: ["replace", "status_final", "append"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
},
required: ["policy"],
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
typingIndicator: {
type: "string",
enum: ["none", "message", "reaction"],
},
responsePrefix: {
type: "string",
},
},
required: ["groupPolicy", "streamMode"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["groupPolicy", "streamMode"],
additionalProperties: false,
},
label: "Google Chat",
description: "Google Workspace Chat app via HTTP webhooks.",
},
},
},
},
{
dirName: "groq",
idHint: "groq",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/groq-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Groq media-understanding provider",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "groq",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
contracts: {
mediaUnderstandingProviders: ["groq"],
},
},
},
{
dirName: "huggingface",
idHint: "huggingface",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/huggingface-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Hugging Face provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "huggingface",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["huggingface"],
providerAuthEnvVars: {
huggingface: ["HUGGINGFACE_HUB_TOKEN", "HF_TOKEN"],
},
providerAuthChoices: [
{
provider: "huggingface",
method: "api-key",
choiceId: "huggingface-api-key",
choiceLabel: "Hugging Face API key",
choiceHint: "Inference API (HF token)",
groupId: "huggingface",
groupLabel: "Hugging Face",
groupHint: "Inference API (HF token)",
optionKey: "huggingfaceApiKey",
cliFlag: "--huggingface-api-key",
cliOption: "--huggingface-api-key <key>",
cliDescription: "Hugging Face API key (HF token)",
},
],
},
},
{
dirName: "imessage",
idHint: "imessage",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/imessage",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw iMessage channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "imessage",
label: "iMessage",
selectionLabel: "iMessage (imsg)",
detailLabel: "iMessage",
docsPath: "/channels/imessage",
docsLabel: "imessage",
blurb: "this is still a work in progress.",
aliases: ["imsg"],
systemImage: "message.fill",
},
},
manifest: {
id: "imessage",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["imessage"],
channelConfigs: {
imessage: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
cliPath: {
type: "string",
},
dbPath: {
type: "string",
},
remoteHost: {
type: "string",
},
service: {
anyOf: [
{
type: "string",
const: "imessage",
},
{
type: "string",
const: "sms",
},
{
type: "string",
const: "auto",
},
],
},
region: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
includeAttachments: {
type: "boolean",
},
attachmentRoots: {
type: "array",
items: {
type: "string",
},
},
remoteAttachmentRoots: {
type: "array",
items: {
type: "string",
},
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
cliPath: {
type: "string",
},
dbPath: {
type: "string",
},
remoteHost: {
type: "string",
},
service: {
anyOf: [
{
type: "string",
const: "imessage",
},
{
type: "string",
const: "sms",
},
{
type: "string",
const: "auto",
},
],
},
region: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
includeAttachments: {
type: "boolean",
},
attachmentRoots: {
type: "array",
items: {
type: "string",
},
},
remoteAttachmentRoots: {
type: "array",
items: {
type: "string",
},
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "iMessage",
help: "iMessage channel provider configuration for CLI integration and DM access policy handling. Use explicit CLI paths when runtime environments have non-standard binary locations.",
},
dmPolicy: {
label: "iMessage DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.imessage.allowFrom=["*"].',
},
configWrites: {
label: "iMessage Config Writes",
help: "Allow iMessage to write config in response to channel events/commands (default: true).",
},
cliPath: {
label: "iMessage CLI Path",
help: "Filesystem path to the iMessage bridge CLI binary used for send/receive operations. Set explicitly when the binary is not on PATH in service runtime environments.",
},
},
label: "iMessage",
description: "this is still a work in progress.",
},
},
},
},
{
dirName: "irc",
idHint: "irc",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/irc",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw IRC channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "irc",
label: "IRC",
selectionLabel: "IRC (Server + Nick)",
detailLabel: "IRC",
docsPath: "/channels/irc",
docsLabel: "irc",
blurb: "classic IRC networks with DM/channel routing and pairing controls.",
systemImage: "network",
},
install: {
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "irc",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["irc"],
channelConfigs: {
irc: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
host: {
type: "string",
},
port: {
type: "integer",
minimum: 1,
maximum: 65535,
},
tls: {
type: "boolean",
},
nick: {
type: "string",
},
username: {
type: "string",
},
realname: {
type: "string",
},
password: {
type: "string",
},
passwordFile: {
type: "string",
},
nickserv: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
service: {
type: "string",
},
password: {
type: "string",
},
passwordFile: {
type: "string",
},
register: {
type: "boolean",
},
registerEmail: {
type: "string",
},
},
additionalProperties: false,
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
channels: {
type: "array",
items: {
type: "string",
},
},
mentionPatterns: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
host: {
type: "string",
},
port: {
type: "integer",
minimum: 1,
maximum: 65535,
},
tls: {
type: "boolean",
},
nick: {
type: "string",
},
username: {
type: "string",
},
realname: {
type: "string",
},
password: {
type: "string",
},
passwordFile: {
type: "string",
},
nickserv: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
service: {
type: "string",
},
password: {
type: "string",
},
passwordFile: {
type: "string",
},
register: {
type: "boolean",
},
registerEmail: {
type: "string",
},
},
additionalProperties: false,
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
channels: {
type: "array",
items: {
type: "string",
},
},
mentionPatterns: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "IRC",
help: "IRC channel provider configuration and compatibility settings for classic IRC transport workflows. Use this section when bridging legacy chat infrastructure into OpenClaw.",
},
dmPolicy: {
label: "IRC DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.irc.allowFrom=["*"].',
},
"nickserv.enabled": {
label: "IRC NickServ Enabled",
help: "Enable NickServ identify/register after connect (defaults to enabled when password is configured).",
},
"nickserv.service": {
label: "IRC NickServ Service",
help: "NickServ service nick (default: NickServ).",
},
"nickserv.password": {
label: "IRC NickServ Password",
help: "NickServ password used for IDENTIFY/REGISTER (sensitive).",
},
"nickserv.passwordFile": {
label: "IRC NickServ Password File",
help: "Optional file path containing NickServ password.",
},
"nickserv.register": {
label: "IRC NickServ Register",
help: "If true, send NickServ REGISTER on every connect. Use once for initial registration, then disable.",
},
"nickserv.registerEmail": {
label: "IRC NickServ Register Email",
help: "Email used with NickServ REGISTER (required when register=true).",
},
configWrites: {
label: "IRC Config Writes",
help: "Allow IRC to write config in response to channel events/commands (default: true).",
},
},
label: "IRC",
description: "classic IRC networks with DM/channel routing and pairing controls.",
},
},
},
},
{
dirName: "kilocode",
idHint: "kilocode",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/kilocode-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Kilo Gateway provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "kilocode",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["kilocode"],
providerAuthEnvVars: {
kilocode: ["KILOCODE_API_KEY"],
},
providerAuthChoices: [
{
provider: "kilocode",
method: "api-key",
choiceId: "kilocode-api-key",
choiceLabel: "Kilo Gateway API key",
choiceHint: "API key (OpenRouter-compatible)",
groupId: "kilocode",
groupLabel: "Kilo Gateway",
groupHint: "API key (OpenRouter-compatible)",
optionKey: "kilocodeApiKey",
cliFlag: "--kilocode-api-key",
cliOption: "--kilocode-api-key <key>",
cliDescription: "Kilo Gateway API key",
},
],
},
},
{
dirName: "kimi-coding",
idHint: "kimi",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/kimi-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Kimi provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "kimi",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["kimi", "kimi-coding"],
providerAuthEnvVars: {
kimi: ["KIMI_API_KEY", "KIMICODE_API_KEY"],
"kimi-coding": ["KIMI_API_KEY", "KIMICODE_API_KEY"],
},
providerAuthChoices: [
{
provider: "kimi",
method: "api-key",
choiceId: "kimi-code-api-key",
choiceLabel: "Kimi Code API key (subscription)",
groupId: "moonshot",
groupLabel: "Moonshot AI (Kimi K2.5)",
groupHint: "Kimi K2.5",
optionKey: "kimiCodeApiKey",
cliFlag: "--kimi-code-api-key",
cliOption: "--kimi-code-api-key <key>",
cliDescription: "Kimi Code API key (subscription)",
},
],
},
},
{
dirName: "line",
idHint: "line",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/line",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LINE channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "line",
label: "LINE",
selectionLabel: "LINE (Messaging API)",
docsPath: "/channels/line",
docsLabel: "line",
blurb: "LINE Messaging API bot for Japan/Taiwan/Thailand markets.",
order: 75,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/line",
localPath: "extensions/line",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "line",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["line"],
channelConfigs: {
line: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
enabled: {
type: "boolean",
},
channelAccessToken: {
type: "string",
},
channelSecret: {
type: "string",
},
tokenFile: {
type: "string",
},
secretFile: {
type: "string",
},
name: {
type: "string",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["open", "allowlist", "pairing", "disabled"],
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "allowlist", "disabled"],
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
},
webhookPath: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
channelAccessToken: {
type: "string",
},
channelSecret: {
type: "string",
},
tokenFile: {
type: "string",
},
secretFile: {
type: "string",
},
name: {
type: "string",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["open", "allowlist", "pairing", "disabled"],
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "allowlist", "disabled"],
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
},
webhookPath: {
type: "string",
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
requireMention: {
type: "boolean",
},
systemPrompt: {
type: "string",
},
skills: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
requireMention: {
type: "boolean",
},
systemPrompt: {
type: "string",
},
skills: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
label: "LINE",
description: "LINE Messaging API bot for Japan/Taiwan/Thailand markets.",
},
},
},
},
{
dirName: "litellm",
idHint: "litellm",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/litellm-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LiteLLM provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "litellm",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["litellm"],
providerAuthEnvVars: {
litellm: ["LITELLM_API_KEY"],
},
providerAuthChoices: [
{
provider: "litellm",
method: "api-key",
choiceId: "litellm-api-key",
choiceLabel: "LiteLLM API key",
choiceHint: "Unified gateway for 100+ LLM providers",
groupId: "litellm",
groupLabel: "LiteLLM",
groupHint: "Unified LLM gateway (100+ providers)",
optionKey: "litellmApiKey",
cliFlag: "--litellm-api-key",
cliOption: "--litellm-api-key <key>",
cliDescription: "LiteLLM API key",
},
],
},
},
{
dirName: "llm-task",
idHint: "llm-task",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/llm-task",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw JSON-only LLM task plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "llm-task",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
defaultProvider: {
type: "string",
},
defaultModel: {
type: "string",
},
defaultAuthProfileId: {
type: "string",
},
allowedModels: {
type: "array",
items: {
type: "string",
},
description: "Allowlist of provider/model keys like openai-codex/gpt-5.2.",
},
maxTokens: {
type: "number",
},
timeoutMs: {
type: "number",
},
},
},
name: "LLM Task",
description: "Generic JSON-only LLM tool for structured tasks callable from workflows.",
},
},
{
dirName: "lobster",
idHint: "lobster",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/lobster",
packageVersion: "2026.3.26",
packageDescription: "Lobster workflow tool plugin (typed pipelines + resumable approvals)",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "lobster",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
name: "Lobster",
description: "Typed workflow tool with resumable approvals.",
},
},
{
dirName: "matrix",
idHint: "matrix",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/matrix",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Matrix channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "matrix",
label: "Matrix",
selectionLabel: "Matrix (plugin)",
docsPath: "/channels/matrix",
docsLabel: "matrix",
blurb: "open protocol; install the plugin to enable.",
order: 70,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/matrix",
localPath: "extensions/matrix",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "matrix",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["matrix"],
channelConfigs: {
matrix: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
defaultAccount: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
homeserver: {
type: "string",
},
allowPrivateNetwork: {
type: "boolean",
},
userId: {
type: "string",
},
accessToken: {
type: "string",
},
password: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
deviceId: {
type: "string",
},
deviceName: {
type: "string",
},
avatarUrl: {
type: "string",
},
initialSyncLimit: {
type: "number",
},
encryption: {
type: "boolean",
},
allowlistOnly: {
type: "boolean",
},
allowBots: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "mentions",
},
],
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
replyToMode: {
type: "string",
enum: ["off", "first", "all"],
},
threadReplies: {
type: "string",
enum: ["off", "inbound", "always"],
},
textChunkLimit: {
type: "number",
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
ackReactionScope: {
type: "string",
enum: ["group-mentions", "group-all", "direct", "all", "none", "off"],
},
reactionNotifications: {
type: "string",
enum: ["off", "own"],
},
threadBindings: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
idleHours: {
type: "number",
minimum: 0,
},
maxAgeHours: {
type: "number",
minimum: 0,
},
spawnSubagentSessions: {
type: "boolean",
},
spawnAcpSessions: {
type: "boolean",
},
},
additionalProperties: false,
},
startupVerification: {
type: "string",
enum: ["off", "if-unverified"],
},
startupVerificationCooldownHours: {
type: "number",
},
mediaMaxMb: {
type: "number",
},
autoJoin: {
type: "string",
enum: ["always", "allowlist", "off"],
},
autoJoinAllowlist: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
},
additionalProperties: false,
},
groups: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
allowBots: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "mentions",
},
],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
autoReply: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
rooms: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
allowBots: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "mentions",
},
],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
autoReply: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
messages: {
type: "boolean",
},
pins: {
type: "boolean",
},
profile: {
type: "boolean",
},
memberInfo: {
type: "boolean",
},
channelInfo: {
type: "boolean",
},
verification: {
type: "boolean",
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
label: "Matrix",
description: "open protocol; install the plugin to enable.",
},
},
},
},
{
dirName: "mattermost",
idHint: "mattermost",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/mattermost",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Mattermost channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "mattermost",
label: "Mattermost",
selectionLabel: "Mattermost (plugin)",
docsPath: "/channels/mattermost",
docsLabel: "mattermost",
blurb: "self-hosted Slack-style chat; install the plugin to enable.",
order: 65,
},
install: {
npmSpec: "@openclaw/mattermost",
localPath: "extensions/mattermost",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "mattermost",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["mattermost"],
channelConfigs: {
mattermost: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
baseUrl: {
type: "string",
},
chatmode: {
type: "string",
enum: ["oncall", "onmessage", "onchar"],
},
oncharPrefixes: {
type: "array",
items: {
type: "string",
},
},
requireMention: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
replyToMode: {
type: "string",
enum: ["off", "first", "all"],
},
responsePrefix: {
type: "string",
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
callbackPath: {
type: "string",
},
callbackUrl: {
type: "string",
},
},
additionalProperties: false,
},
interactions: {
type: "object",
properties: {
callbackBaseUrl: {
type: "string",
},
allowedSourceIps: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
allowPrivateNetwork: {
type: "boolean",
},
dmChannelRetry: {
type: "object",
properties: {
maxRetries: {
type: "integer",
minimum: 0,
maximum: 10,
},
initialDelayMs: {
type: "integer",
minimum: 100,
maximum: 60000,
},
maxDelayMs: {
type: "integer",
minimum: 1000,
maximum: 60000,
},
timeoutMs: {
type: "integer",
minimum: 5000,
maximum: 120000,
},
},
additionalProperties: false,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
baseUrl: {
type: "string",
},
chatmode: {
type: "string",
enum: ["oncall", "onmessage", "onchar"],
},
oncharPrefixes: {
type: "array",
items: {
type: "string",
},
},
requireMention: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
replyToMode: {
type: "string",
enum: ["off", "first", "all"],
},
responsePrefix: {
type: "string",
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
callbackPath: {
type: "string",
},
callbackUrl: {
type: "string",
},
},
additionalProperties: false,
},
interactions: {
type: "object",
properties: {
callbackBaseUrl: {
type: "string",
},
allowedSourceIps: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
allowPrivateNetwork: {
type: "boolean",
},
dmChannelRetry: {
type: "object",
properties: {
maxRetries: {
type: "integer",
minimum: 0,
maximum: 10,
},
initialDelayMs: {
type: "integer",
minimum: 100,
maximum: 60000,
},
maxDelayMs: {
type: "integer",
minimum: 1000,
maximum: 60000,
},
timeoutMs: {
type: "integer",
minimum: 5000,
maximum: 120000,
},
},
additionalProperties: false,
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
label: "Mattermost",
description: "self-hosted Slack-style chat; install the plugin to enable.",
},
},
},
},
{
dirName: "memory-core",
idHint: "memory-core",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/memory-core",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw core memory search plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "memory-core",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
kind: "memory",
},
},
{
dirName: "memory-lancedb",
idHint: "memory-lancedb",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/memory-lancedb",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw LanceDB-backed long-term memory plugin with auto-recall/capture",
packageManifest: {
extensions: ["./index.ts"],
install: {
npmSpec: "@openclaw/memory-lancedb",
localPath: "extensions/memory-lancedb",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "memory-lancedb",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
embedding: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: "string",
},
model: {
type: "string",
},
baseUrl: {
type: "string",
},
dimensions: {
type: "number",
},
},
required: ["apiKey"],
},
dbPath: {
type: "string",
},
autoCapture: {
type: "boolean",
},
autoRecall: {
type: "boolean",
},
captureMaxChars: {
type: "number",
minimum: 100,
maximum: 10000,
},
},
required: ["embedding"],
},
kind: "memory",
uiHints: {
"embedding.apiKey": {
label: "OpenAI API Key",
sensitive: true,
placeholder: "sk-proj-...",
help: "API key for OpenAI embeddings (or use ${OPENAI_API_KEY})",
},
"embedding.model": {
label: "Embedding Model",
placeholder: "text-embedding-3-small",
help: "OpenAI embedding model to use",
},
"embedding.baseUrl": {
label: "Base URL",
placeholder: "https://api.openai.com/v1",
help: "Base URL for compatible providers (e.g. http://localhost:11434/v1)",
advanced: true,
},
"embedding.dimensions": {
label: "Dimensions",
placeholder: "1536",
help: "Vector dimensions for custom models (required for non-standard models)",
advanced: true,
},
dbPath: {
label: "Database Path",
placeholder: "~/.openclaw/memory/lancedb",
advanced: true,
},
autoCapture: {
label: "Auto-Capture",
help: "Automatically capture important information from conversations",
},
autoRecall: {
label: "Auto-Recall",
help: "Automatically inject relevant memories into context",
},
captureMaxChars: {
label: "Capture Max Chars",
help: "Maximum message length eligible for auto-capture",
advanced: true,
placeholder: "500",
},
},
},
},
{
dirName: "microsoft",
idHint: "microsoft",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/microsoft-speech",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft speech plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "microsoft",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
contracts: {
speechProviders: ["microsoft"],
},
},
},
{
dirName: "microsoft-foundry",
idHint: "microsoft-foundry",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/microsoft-foundry",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft Foundry provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "microsoft-foundry",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
enabledByDefault: true,
providers: ["microsoft-foundry"],
providerAuthEnvVars: {
"microsoft-foundry": ["AZURE_OPENAI_API_KEY"],
},
providerAuthChoices: [
{
provider: "microsoft-foundry",
method: "entra-id",
choiceId: "microsoft-foundry-entra",
choiceLabel: "Microsoft Foundry (Entra ID / az login)",
choiceHint: "Use your Azure login — no API key needed",
groupId: "microsoft-foundry",
groupLabel: "Microsoft Foundry",
groupHint: "Entra ID + API key",
},
{
provider: "microsoft-foundry",
method: "api-key",
choiceId: "microsoft-foundry-apikey",
choiceLabel: "Microsoft Foundry (API key)",
choiceHint: "Use an Azure OpenAI API key directly",
groupId: "microsoft-foundry",
groupLabel: "Microsoft Foundry",
groupHint: "Entra ID + API key",
},
],
},
},
{
dirName: "minimax",
idHint: "minimax",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/minimax-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw MiniMax provider and OAuth plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "minimax",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["minimax", "minimax-portal"],
providerAuthEnvVars: {
minimax: ["MINIMAX_API_KEY"],
"minimax-portal": ["MINIMAX_OAUTH_TOKEN", "MINIMAX_API_KEY"],
},
providerAuthChoices: [
{
provider: "minimax-portal",
method: "oauth",
choiceId: "minimax-global-oauth",
choiceLabel: "MiniMax OAuth (Global)",
choiceHint: "Global endpoint - api.minimax.io",
groupId: "minimax",
groupLabel: "MiniMax",
groupHint: "M2.7 (recommended)",
},
{
provider: "minimax",
method: "api-global",
choiceId: "minimax-global-api",
choiceLabel: "MiniMax API key (Global)",
choiceHint: "Global endpoint - api.minimax.io",
groupId: "minimax",
groupLabel: "MiniMax",
groupHint: "M2.7 (recommended)",
optionKey: "minimaxApiKey",
cliFlag: "--minimax-api-key",
cliOption: "--minimax-api-key <key>",
cliDescription: "MiniMax API key",
},
{
provider: "minimax-portal",
method: "oauth-cn",
choiceId: "minimax-cn-oauth",
choiceLabel: "MiniMax OAuth (CN)",
choiceHint: "CN endpoint - api.minimaxi.com",
groupId: "minimax",
groupLabel: "MiniMax",
groupHint: "M2.7 (recommended)",
},
{
provider: "minimax",
method: "api-cn",
choiceId: "minimax-cn-api",
choiceLabel: "MiniMax API key (CN)",
choiceHint: "CN endpoint - api.minimaxi.com",
groupId: "minimax",
groupLabel: "MiniMax",
groupHint: "M2.7 (recommended)",
optionKey: "minimaxApiKey",
cliFlag: "--minimax-api-key",
cliOption: "--minimax-api-key <key>",
cliDescription: "MiniMax API key",
},
],
contracts: {
mediaUnderstandingProviders: ["minimax", "minimax-portal"],
imageGenerationProviders: ["minimax", "minimax-portal"],
},
},
},
{
dirName: "mistral",
idHint: "mistral",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/mistral-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Mistral provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "mistral",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["mistral"],
providerAuthEnvVars: {
mistral: ["MISTRAL_API_KEY"],
},
providerAuthChoices: [
{
provider: "mistral",
method: "api-key",
choiceId: "mistral-api-key",
choiceLabel: "Mistral API key",
groupId: "mistral",
groupLabel: "Mistral AI",
groupHint: "API key",
optionKey: "mistralApiKey",
cliFlag: "--mistral-api-key",
cliOption: "--mistral-api-key <key>",
cliDescription: "Mistral API key",
},
],
contracts: {
mediaUnderstandingProviders: ["mistral"],
},
},
},
{
dirName: "modelstudio",
idHint: "modelstudio",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/modelstudio-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Model Studio provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "modelstudio",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["modelstudio"],
providerAuthEnvVars: {
modelstudio: ["MODELSTUDIO_API_KEY"],
},
providerAuthChoices: [
{
provider: "modelstudio",
method: "standard-api-key-cn",
choiceId: "modelstudio-standard-api-key-cn",
choiceLabel: "Standard API Key for China (pay-as-you-go)",
choiceHint: "Endpoint: dashscope.aliyuncs.com",
groupId: "modelstudio",
groupLabel: "Qwen (Alibaba Cloud Model Studio)",
groupHint: "Standard / Coding Plan (CN / Global)",
optionKey: "modelstudioStandardApiKeyCn",
cliFlag: "--modelstudio-standard-api-key-cn",
cliOption: "--modelstudio-standard-api-key-cn <key>",
cliDescription: "Alibaba Cloud Model Studio Standard API key (China)",
},
{
provider: "modelstudio",
method: "standard-api-key",
choiceId: "modelstudio-standard-api-key",
choiceLabel: "Standard API Key for Global/Intl (pay-as-you-go)",
choiceHint: "Endpoint: dashscope-intl.aliyuncs.com",
groupId: "modelstudio",
groupLabel: "Qwen (Alibaba Cloud Model Studio)",
groupHint: "Standard / Coding Plan (CN / Global)",
optionKey: "modelstudioStandardApiKey",
cliFlag: "--modelstudio-standard-api-key",
cliOption: "--modelstudio-standard-api-key <key>",
cliDescription: "Alibaba Cloud Model Studio Standard API key (Global/Intl)",
},
{
provider: "modelstudio",
method: "api-key-cn",
choiceId: "modelstudio-api-key-cn",
choiceLabel: "Coding Plan API Key for China (subscription)",
choiceHint: "Endpoint: coding.dashscope.aliyuncs.com",
groupId: "modelstudio",
groupLabel: "Qwen (Alibaba Cloud Model Studio)",
groupHint: "Standard / Coding Plan (CN / Global)",
optionKey: "modelstudioApiKeyCn",
cliFlag: "--modelstudio-api-key-cn",
cliOption: "--modelstudio-api-key-cn <key>",
cliDescription: "Alibaba Cloud Model Studio Coding Plan API key (China)",
},
{
provider: "modelstudio",
method: "api-key",
choiceId: "modelstudio-api-key",
choiceLabel: "Coding Plan API Key for Global/Intl (subscription)",
choiceHint: "Endpoint: coding-intl.dashscope.aliyuncs.com",
groupId: "modelstudio",
groupLabel: "Qwen (Alibaba Cloud Model Studio)",
groupHint: "Standard / Coding Plan (CN / Global)",
optionKey: "modelstudioApiKey",
cliFlag: "--modelstudio-api-key",
cliOption: "--modelstudio-api-key <key>",
cliDescription: "Alibaba Cloud Model Studio Coding Plan API key (Global/Intl)",
},
],
},
},
{
dirName: "moonshot",
idHint: "moonshot",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/moonshot-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Moonshot provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "moonshot",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
baseUrl: {
type: "string",
},
model: {
type: "string",
},
},
},
},
},
providers: ["moonshot"],
providerAuthEnvVars: {
moonshot: ["MOONSHOT_API_KEY"],
},
providerAuthChoices: [
{
provider: "moonshot",
method: "api-key",
choiceId: "moonshot-api-key",
choiceLabel: "Moonshot API key (.ai)",
groupId: "moonshot",
groupLabel: "Moonshot AI (Kimi K2.5)",
groupHint: "Kimi K2.5",
optionKey: "moonshotApiKey",
cliFlag: "--moonshot-api-key",
cliOption: "--moonshot-api-key <key>",
cliDescription: "Moonshot API key",
},
{
provider: "moonshot",
method: "api-key-cn",
choiceId: "moonshot-api-key-cn",
choiceLabel: "Moonshot API key (.cn)",
groupId: "moonshot",
groupLabel: "Moonshot AI (Kimi K2.5)",
groupHint: "Kimi K2.5",
optionKey: "moonshotApiKey",
cliFlag: "--moonshot-api-key",
cliOption: "--moonshot-api-key <key>",
cliDescription: "Moonshot API key",
},
],
uiHints: {
"webSearch.apiKey": {
label: "Kimi Search API Key",
help: "Moonshot/Kimi API key (fallback: KIMI_API_KEY or MOONSHOT_API_KEY env var).",
sensitive: true,
},
"webSearch.baseUrl": {
label: "Kimi Search Base URL",
help: "Kimi base URL override.",
},
"webSearch.model": {
label: "Kimi Search Model",
help: "Kimi model override.",
},
},
contracts: {
mediaUnderstandingProviders: ["moonshot"],
webSearchProviders: ["kimi"],
},
},
},
{
dirName: "msteams",
idHint: "msteams",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/msteams",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Microsoft Teams channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "msteams",
label: "Microsoft Teams",
selectionLabel: "Microsoft Teams (Teams SDK)",
docsPath: "/channels/msteams",
docsLabel: "msteams",
blurb: "Teams SDK; enterprise support.",
aliases: ["teams"],
order: 60,
},
install: {
npmSpec: "@openclaw/msteams",
localPath: "extensions/msteams",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "msteams",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["msteams"],
channelConfigs: {
msteams: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
enabled: {
type: "boolean",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
appId: {
type: "string",
},
appPassword: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
tenantId: {
type: "string",
},
webhook: {
type: "object",
properties: {
port: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
path: {
type: "string",
},
},
additionalProperties: false,
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
type: "string",
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
mediaAllowHosts: {
type: "array",
items: {
type: "string",
},
},
mediaAuthAllowHosts: {
type: "array",
items: {
type: "string",
},
},
requireMention: {
type: "boolean",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
replyStyle: {
type: "string",
enum: ["thread", "top-level"],
},
teams: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
replyStyle: {
type: "string",
enum: ["thread", "top-level"],
},
channels: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
replyStyle: {
type: "string",
enum: ["thread", "top-level"],
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
sharePointSiteId: {
type: "string",
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
welcomeCard: {
type: "boolean",
},
promptStarters: {
type: "array",
items: {
type: "string",
},
},
groupWelcomeCard: {
type: "boolean",
},
feedbackEnabled: {
type: "boolean",
},
feedbackReflection: {
type: "boolean",
},
feedbackReflectionCooldownMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "MS Teams",
help: "Microsoft Teams channel provider configuration and provider-specific policy toggles. Use this section to isolate Teams behavior from other enterprise chat providers.",
},
configWrites: {
label: "MS Teams Config Writes",
help: "Allow Microsoft Teams to write config in response to channel events/commands (default: true).",
},
},
label: "Microsoft Teams",
description: "Teams SDK; enterprise support.",
},
},
},
},
{
dirName: "nextcloud-talk",
idHint: "nextcloud-talk",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/nextcloud-talk",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Nextcloud Talk channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "nextcloud-talk",
label: "Nextcloud Talk",
selectionLabel: "Nextcloud Talk (self-hosted)",
docsPath: "/channels/nextcloud-talk",
docsLabel: "nextcloud-talk",
blurb: "Self-hosted chat via Nextcloud Talk webhook bots.",
aliases: ["nc-talk", "nc"],
order: 65,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/nextcloud-talk",
localPath: "extensions/nextcloud-talk",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "nextcloud-talk",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["nextcloud-talk"],
channelConfigs: {
"nextcloud-talk": {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
baseUrl: {
type: "string",
},
botSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
botSecretFile: {
type: "string",
},
apiUser: {
type: "string",
},
apiPassword: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
apiPasswordFile: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
webhookPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
webhookHost: {
type: "string",
},
webhookPath: {
type: "string",
},
webhookPublicUrl: {
type: "string",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
groupAllowFrom: {
type: "array",
items: {
type: "string",
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
rooms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
allowPrivateNetwork: {
type: "boolean",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
baseUrl: {
type: "string",
},
botSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
botSecretFile: {
type: "string",
},
apiUser: {
type: "string",
},
apiPassword: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
apiPasswordFile: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
webhookPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
webhookHost: {
type: "string",
},
webhookPath: {
type: "string",
},
webhookPublicUrl: {
type: "string",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
groupAllowFrom: {
type: "array",
items: {
type: "string",
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
rooms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
allowPrivateNetwork: {
type: "boolean",
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
label: "Nextcloud Talk",
description: "Self-hosted chat via Nextcloud Talk webhook bots.",
},
},
},
},
{
dirName: "nostr",
idHint: "nostr",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/nostr",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Nostr channel plugin for NIP-04 encrypted DMs",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "nostr",
label: "Nostr",
selectionLabel: "Nostr (NIP-04 DMs)",
docsPath: "/channels/nostr",
docsLabel: "nostr",
blurb: "Decentralized protocol; encrypted DMs via NIP-04.",
order: 55,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/nostr",
localPath: "extensions/nostr",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "nostr",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["nostr"],
channelConfigs: {
nostr: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
defaultAccount: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
privateKey: {
type: "string",
},
relays: {
type: "array",
items: {
type: "string",
},
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
profile: {
type: "object",
properties: {
name: {
type: "string",
maxLength: 256,
},
displayName: {
type: "string",
maxLength: 256,
},
about: {
type: "string",
maxLength: 2000,
},
picture: {
type: "string",
format: "uri",
},
banner: {
type: "string",
format: "uri",
},
website: {
type: "string",
format: "uri",
},
nip05: {
type: "string",
},
lud16: {
type: "string",
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
label: "Nostr",
description: "Decentralized protocol; encrypted DMs via NIP-04.",
},
},
},
},
{
dirName: "nvidia",
idHint: "nvidia",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/nvidia-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw NVIDIA provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "nvidia",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["nvidia"],
providerAuthEnvVars: {
nvidia: ["NVIDIA_API_KEY"],
},
},
},
{
dirName: "ollama",
idHint: "ollama",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/ollama-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Ollama provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "ollama",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["ollama"],
providerAuthEnvVars: {
ollama: ["OLLAMA_API_KEY"],
},
providerAuthChoices: [
{
provider: "ollama",
method: "local",
choiceId: "ollama",
choiceLabel: "Ollama",
choiceHint: "Cloud and local open models",
groupId: "ollama",
groupLabel: "Ollama",
groupHint: "Cloud and local open models",
},
],
},
},
{
dirName: "open-prose",
idHint: "open-prose",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/open-prose",
packageVersion: "2026.3.26",
packageDescription: "OpenProse VM skill pack plugin (slash command + telemetry).",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "open-prose",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
skills: ["./skills"],
name: "OpenProse",
description: "OpenProse VM skill pack with a /prose slash command.",
},
},
{
dirName: "openai",
idHint: "openai",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/openai-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenAI provider plugins",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "openai",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["openai", "openai-codex"],
cliBackends: ["codex-cli"],
providerAuthEnvVars: {
openai: ["OPENAI_API_KEY"],
},
providerAuthChoices: [
{
provider: "openai-codex",
method: "oauth",
choiceId: "openai-codex",
choiceLabel: "OpenAI Codex (ChatGPT OAuth)",
choiceHint: "Browser sign-in",
groupId: "openai",
groupLabel: "OpenAI",
groupHint: "Codex OAuth + API key",
},
{
provider: "openai",
method: "api-key",
choiceId: "openai-api-key",
choiceLabel: "OpenAI API key",
groupId: "openai",
groupLabel: "OpenAI",
groupHint: "Codex OAuth + API key",
optionKey: "openaiApiKey",
cliFlag: "--openai-api-key",
cliOption: "--openai-api-key <key>",
cliDescription: "OpenAI API key",
},
],
contracts: {
speechProviders: ["openai"],
mediaUnderstandingProviders: ["openai", "openai-codex"],
imageGenerationProviders: ["openai"],
},
},
},
{
dirName: "opencode",
idHint: "opencode",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/opencode-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenCode Zen provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "opencode",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["opencode"],
providerAuthEnvVars: {
opencode: ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
},
providerAuthChoices: [
{
provider: "opencode",
method: "api-key",
choiceId: "opencode-zen",
choiceLabel: "OpenCode Zen catalog",
groupId: "opencode",
groupLabel: "OpenCode",
groupHint: "Shared API key for Zen + Go catalogs",
optionKey: "opencodeZenApiKey",
cliFlag: "--opencode-zen-api-key",
cliOption: "--opencode-zen-api-key <key>",
cliDescription: "OpenCode API key (Zen catalog)",
},
],
},
},
{
dirName: "opencode-go",
idHint: "opencode-go",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/opencode-go-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenCode Go provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "opencode-go",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["opencode-go"],
providerAuthEnvVars: {
"opencode-go": ["OPENCODE_API_KEY", "OPENCODE_ZEN_API_KEY"],
},
providerAuthChoices: [
{
provider: "opencode-go",
method: "api-key",
choiceId: "opencode-go",
choiceLabel: "OpenCode Go catalog",
groupId: "opencode",
groupLabel: "OpenCode",
groupHint: "Shared API key for Zen + Go catalogs",
optionKey: "opencodeGoApiKey",
cliFlag: "--opencode-go-api-key",
cliOption: "--opencode-go-api-key <key>",
cliDescription: "OpenCode API key (Go catalog)",
},
],
},
},
{
dirName: "openrouter",
idHint: "openrouter",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/openrouter-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenRouter provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "openrouter",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["openrouter"],
providerAuthEnvVars: {
openrouter: ["OPENROUTER_API_KEY"],
},
providerAuthChoices: [
{
provider: "openrouter",
method: "api-key",
choiceId: "openrouter-api-key",
choiceLabel: "OpenRouter API key",
groupId: "openrouter",
groupLabel: "OpenRouter",
groupHint: "API key",
optionKey: "openrouterApiKey",
cliFlag: "--openrouter-api-key",
cliOption: "--openrouter-api-key <key>",
cliDescription: "OpenRouter API key",
},
],
contracts: {
mediaUnderstandingProviders: ["openrouter"],
},
},
},
{
dirName: "openshell",
idHint: "openshell",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/openshell-sandbox",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw OpenShell sandbox backend",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "openshell",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
mode: {
type: "string",
enum: ["mirror", "remote"],
},
command: {
type: "string",
minLength: 1,
},
gateway: {
type: "string",
minLength: 1,
},
gatewayEndpoint: {
type: "string",
minLength: 1,
},
from: {
type: "string",
minLength: 1,
},
policy: {
type: "string",
minLength: 1,
},
providers: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
gpu: {
type: "boolean",
},
autoProviders: {
type: "boolean",
},
remoteWorkspaceDir: {
type: "string",
minLength: 1,
},
remoteAgentWorkspaceDir: {
type: "string",
minLength: 1,
},
timeoutSeconds: {
type: "number",
minimum: 1,
},
},
},
name: "OpenShell Sandbox",
description:
"Sandbox backend powered by OpenShell with mirrored local workspaces and SSH-based command execution.",
uiHints: {
mode: {
label: "Mode",
help: "Sandbox mode. Use mirror for the default local-workspace flow or remote for a fully remote workspace.",
},
command: {
label: "OpenShell Command",
help: "Path or command name for the openshell CLI.",
},
gateway: {
label: "Gateway Name",
help: "Optional OpenShell gateway name passed as --gateway.",
},
gatewayEndpoint: {
label: "Gateway Endpoint",
help: "Optional OpenShell gateway endpoint passed as --gateway-endpoint.",
},
from: {
label: "Sandbox Source",
help: "OpenShell sandbox source for first-time create. Defaults to openclaw.",
},
policy: {
label: "Policy File",
help: "Optional path to a custom OpenShell sandbox policy YAML.",
},
providers: {
label: "Providers",
help: "Provider names to attach when a sandbox is created.",
},
gpu: {
label: "GPU",
help: "Request GPU resources when creating the sandbox.",
advanced: true,
},
autoProviders: {
label: "Auto-create Providers",
help: "When enabled, pass --auto-providers during sandbox create.",
advanced: true,
},
remoteWorkspaceDir: {
label: "Remote Workspace Dir",
help: "Primary writable workspace inside the OpenShell sandbox.",
advanced: true,
},
remoteAgentWorkspaceDir: {
label: "Remote Agent Dir",
help: "Mirror path for the real agent workspace when workspaceAccess is read-only.",
advanced: true,
},
timeoutSeconds: {
label: "Command Timeout Seconds",
help: "Timeout for openshell CLI operations such as create/upload/download.",
advanced: true,
},
},
},
},
{
dirName: "perplexity",
idHint: "perplexity",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/perplexity-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Perplexity plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "perplexity",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
baseUrl: {
type: "string",
},
model: {
type: "string",
},
},
},
},
},
providerAuthEnvVars: {
perplexity: ["PERPLEXITY_API_KEY", "OPENROUTER_API_KEY"],
},
uiHints: {
"webSearch.apiKey": {
label: "Perplexity API Key",
help: "Perplexity or OpenRouter API key for web search.",
sensitive: true,
placeholder: "pplx-...",
},
"webSearch.baseUrl": {
label: "Perplexity Base URL",
help: "Optional Perplexity/OpenRouter chat-completions base URL override.",
},
"webSearch.model": {
label: "Perplexity Model",
help: "Optional Sonar/OpenRouter model override.",
},
},
contracts: {
webSearchProviders: ["perplexity"],
},
},
},
{
dirName: "qianfan",
idHint: "qianfan",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/qianfan-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Qianfan provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "qianfan",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["qianfan"],
providerAuthEnvVars: {
qianfan: ["QIANFAN_API_KEY"],
},
providerAuthChoices: [
{
provider: "qianfan",
method: "api-key",
choiceId: "qianfan-api-key",
choiceLabel: "Qianfan API key",
groupId: "qianfan",
groupLabel: "Qianfan",
groupHint: "API key",
optionKey: "qianfanApiKey",
cliFlag: "--qianfan-api-key",
cliOption: "--qianfan-api-key <key>",
cliDescription: "QIANFAN API key",
},
],
},
},
{
dirName: "sglang",
idHint: "sglang",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/sglang-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw SGLang provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "sglang",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["sglang"],
providerAuthEnvVars: {
sglang: ["SGLANG_API_KEY"],
},
providerAuthChoices: [
{
provider: "sglang",
method: "custom",
choiceId: "sglang",
choiceLabel: "SGLang",
choiceHint: "Fast self-hosted OpenAI-compatible server",
groupId: "sglang",
groupLabel: "SGLang",
groupHint: "Fast self-hosted server",
},
],
},
},
{
dirName: "signal",
idHint: "signal",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/signal",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Signal channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "signal",
label: "Signal",
selectionLabel: "Signal (signal-cli)",
detailLabel: "Signal REST",
docsPath: "/channels/signal",
docsLabel: "signal",
blurb: 'signal-cli linked device; more setup (David Reagans: "Hop on Discord.").',
systemImage: "antenna.radiowaves.left.and.right",
},
},
manifest: {
id: "signal",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["signal"],
channelConfigs: {
signal: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
account: {
type: "string",
},
accountUuid: {
type: "string",
},
httpUrl: {
type: "string",
},
httpHost: {
type: "string",
},
httpPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
cliPath: {
type: "string",
},
autoStart: {
type: "boolean",
},
startupTimeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
receiveMode: {
anyOf: [
{
type: "string",
const: "on-start",
},
{
type: "string",
const: "manual",
},
],
},
ignoreAttachments: {
type: "boolean",
},
ignoreStories: {
type: "boolean",
},
sendReadReceipts: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
reactionAllowlist: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
reactionLevel: {
type: "string",
enum: ["off", "ack", "minimal", "extensive"],
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
configWrites: {
type: "boolean",
},
account: {
type: "string",
},
accountUuid: {
type: "string",
},
httpUrl: {
type: "string",
},
httpHost: {
type: "string",
},
httpPort: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
cliPath: {
type: "string",
},
autoStart: {
type: "boolean",
},
startupTimeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
receiveMode: {
anyOf: [
{
type: "string",
const: "on-start",
},
{
type: "string",
const: "manual",
},
],
},
ignoreAttachments: {
type: "boolean",
},
ignoreStories: {
type: "boolean",
},
sendReadReceipts: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
reactionAllowlist: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
},
additionalProperties: false,
},
reactionLevel: {
type: "string",
enum: ["off", "ack", "minimal", "extensive"],
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "Signal",
help: "Signal channel provider configuration including account identity and DM policy behavior. Keep account mapping explicit so routing remains stable across multi-device setups.",
},
dmPolicy: {
label: "Signal DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.signal.allowFrom=["*"].',
},
configWrites: {
label: "Signal Config Writes",
help: "Allow Signal to write config in response to channel events/commands (default: true).",
},
account: {
label: "Signal Account",
help: "Signal account identifier (phone/number handle) used to bind this channel config to a specific Signal identity. Keep this aligned with your linked device/session state.",
},
},
label: "Signal",
description: 'signal-cli linked device; more setup (David Reagans: "Hop on Discord.").',
},
},
},
},
{
dirName: "slack",
idHint: "slack",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/slack",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Slack channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "slack",
label: "Slack",
selectionLabel: "Slack (Socket Mode)",
detailLabel: "Slack Bot",
docsPath: "/channels/slack",
docsLabel: "slack",
blurb: "supported (Socket Mode).",
systemImage: "number",
},
},
manifest: {
id: "slack",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["slack"],
channelConfigs: {
slack: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
mode: {
default: "socket",
type: "string",
enum: ["socket", "http"],
},
signingSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
default: "/slack/events",
type: "string",
},
capabilities: {
anyOf: [
{
type: "array",
items: {
type: "string",
},
},
{
type: "object",
properties: {
interactiveReplies: {
type: "boolean",
},
},
additionalProperties: false,
},
],
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
appToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
userToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
userTokenReadOnly: {
default: true,
type: "boolean",
},
allowBots: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
nativeStreaming: {
type: "boolean",
},
streamMode: {
type: "string",
enum: ["replace", "status_final", "append"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
reactionAllowlist: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
replyToModeByChatType: {
type: "object",
properties: {
direct: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
group: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
channel: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
},
additionalProperties: false,
},
thread: {
type: "object",
properties: {
historyScope: {
type: "string",
enum: ["thread", "channel"],
},
inheritParent: {
type: "boolean",
},
initialHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
messages: {
type: "boolean",
},
pins: {
type: "boolean",
},
search: {
type: "boolean",
},
permissions: {
type: "boolean",
},
memberInfo: {
type: "boolean",
},
channelInfo: {
type: "boolean",
},
emojiList: {
type: "boolean",
},
},
additionalProperties: false,
},
slashCommand: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
name: {
type: "string",
},
sessionPrefix: {
type: "string",
},
ephemeral: {
type: "boolean",
},
},
additionalProperties: false,
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupEnabled: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
},
additionalProperties: false,
},
channels: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
allowBots: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
typingReaction: {
type: "string",
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
mode: {
type: "string",
enum: ["socket", "http"],
},
signingSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
type: "string",
},
capabilities: {
anyOf: [
{
type: "array",
items: {
type: "string",
},
},
{
type: "object",
properties: {
interactiveReplies: {
type: "boolean",
},
},
additionalProperties: false,
},
],
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
appToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
userToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
userTokenReadOnly: {
default: true,
type: "boolean",
},
allowBots: {
type: "boolean",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
nativeStreaming: {
type: "boolean",
},
streamMode: {
type: "string",
enum: ["replace", "status_final", "append"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all", "allowlist"],
},
reactionAllowlist: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
replyToModeByChatType: {
type: "object",
properties: {
direct: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
group: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
channel: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
},
additionalProperties: false,
},
thread: {
type: "object",
properties: {
historyScope: {
type: "string",
enum: ["thread", "channel"],
},
inheritParent: {
type: "boolean",
},
initialHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
messages: {
type: "boolean",
},
pins: {
type: "boolean",
},
search: {
type: "boolean",
},
permissions: {
type: "boolean",
},
memberInfo: {
type: "boolean",
},
channelInfo: {
type: "boolean",
},
emojiList: {
type: "boolean",
},
},
additionalProperties: false,
},
slashCommand: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
name: {
type: "string",
},
sessionPrefix: {
type: "string",
},
ephemeral: {
type: "boolean",
},
},
additionalProperties: false,
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
type: "string",
},
dm: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
policy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupEnabled: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
},
additionalProperties: false,
},
channels: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
allow: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
allowBots: {
type: "boolean",
},
users: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
systemPrompt: {
type: "string",
},
},
additionalProperties: false,
},
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
typingReaction: {
type: "string",
},
},
required: ["userTokenReadOnly"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["mode", "webhookPath", "userTokenReadOnly", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "Slack",
help: "Slack channel provider configuration for bot/app tokens, streaming behavior, and DM policy controls. Keep token handling and thread behavior explicit to avoid noisy workspace interactions.",
},
"dm.policy": {
label: "Slack DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"] (legacy: channels.slack.dm.allowFrom).',
},
dmPolicy: {
label: "Slack DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.slack.allowFrom=["*"].',
},
configWrites: {
label: "Slack Config Writes",
help: "Allow Slack to write config in response to channel events/commands (default: true).",
},
"commands.native": {
label: "Slack Native Commands",
help: 'Override native commands for Slack (bool or "auto").',
},
"commands.nativeSkills": {
label: "Slack Native Skill Commands",
help: 'Override native skill commands for Slack (bool or "auto").',
},
allowBots: {
label: "Slack Allow Bot Messages",
help: "Allow bot-authored messages to trigger Slack replies (default: false).",
},
botToken: {
label: "Slack Bot Token",
help: "Slack bot token used for standard chat actions in the configured workspace. Keep this credential scoped and rotate if workspace app permissions change.",
},
appToken: {
label: "Slack App Token",
help: "Slack app-level token used for Socket Mode connections and event transport when enabled. Use least-privilege app scopes and store this token as a secret.",
},
userToken: {
label: "Slack User Token",
help: "Optional Slack user token for workflows requiring user-context API access beyond bot permissions. Use sparingly and audit scopes because this token can carry broader authority.",
},
userTokenReadOnly: {
label: "Slack User Token Read Only",
help: "When true, treat configured Slack user token usage as read-only helper behavior where possible. Keep enabled if you only need supplemental reads without user-context writes.",
},
"capabilities.interactiveReplies": {
label: "Slack Interactive Replies",
help: "Enable agent-authored Slack interactive reply directives (`[[slack_buttons: ...]]`, `[[slack_select: ...]]`). Default: false.",
},
streaming: {
label: "Slack Streaming Mode",
help: 'Unified Slack stream preview mode: "off" | "partial" | "block" | "progress". Legacy boolean/streamMode keys are auto-mapped.',
},
nativeStreaming: {
label: "Slack Native Streaming",
help: "Enable native Slack text streaming (chat.startStream/chat.appendStream/chat.stopStream) when channels.slack.streaming is partial (default: true).",
},
streamMode: {
label: "Slack Stream Mode (Legacy)",
help: "Legacy Slack preview mode alias (replace | status_final | append); auto-migrated to channels.slack.streaming.",
},
"thread.historyScope": {
label: "Slack Thread History Scope",
help: 'Scope for Slack thread history context ("thread" isolates per thread; "channel" reuses channel history).',
},
"thread.inheritParent": {
label: "Slack Thread Parent Inheritance",
help: "If true, Slack thread sessions inherit the parent channel transcript (default: false).",
},
"thread.initialHistoryLimit": {
label: "Slack Thread Initial History Limit",
help: "Maximum number of existing Slack thread messages to fetch when starting a new thread session (default: 20, set to 0 to disable).",
},
},
label: "Slack",
description: "supported (Socket Mode).",
},
},
},
},
{
dirName: "synology-chat",
idHint: "synology-chat",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/synology-chat",
packageVersion: "2026.3.26",
packageDescription: "Synology Chat channel plugin for OpenClaw",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "synology-chat",
label: "Synology Chat",
selectionLabel: "Synology Chat (Webhook)",
docsPath: "/channels/synology-chat",
docsLabel: "synology-chat",
blurb: "Connect your Synology NAS Chat to OpenClaw with full agent capabilities.",
order: 90,
},
install: {
npmSpec: "@openclaw/synology-chat",
localPath: "extensions/synology-chat",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "synology-chat",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["synology-chat"],
channelConfigs: {
"synology-chat": {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
dangerouslyAllowNameMatching: {
type: "boolean",
},
dangerouslyAllowInheritedWebhookPath: {
type: "boolean",
},
},
additionalProperties: {},
},
label: "Synology Chat",
description: "Connect your Synology NAS Chat to OpenClaw with full agent capabilities.",
},
},
},
},
{
dirName: "synthetic",
idHint: "synthetic",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/synthetic-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Synthetic provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "synthetic",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["synthetic"],
providerAuthEnvVars: {
synthetic: ["SYNTHETIC_API_KEY"],
},
providerAuthChoices: [
{
provider: "synthetic",
method: "api-key",
choiceId: "synthetic-api-key",
choiceLabel: "Synthetic API key",
groupId: "synthetic",
groupLabel: "Synthetic",
groupHint: "Anthropic-compatible (multi-model)",
optionKey: "syntheticApiKey",
cliFlag: "--synthetic-api-key",
cliOption: "--synthetic-api-key <key>",
cliDescription: "Synthetic API key",
},
],
},
},
{
dirName: "tavily",
idHint: "tavily",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/tavily-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Tavily plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "tavily",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
baseUrl: {
type: "string",
},
},
},
},
},
providerAuthEnvVars: {
tavily: ["TAVILY_API_KEY"],
},
skills: ["./skills"],
uiHints: {
"webSearch.apiKey": {
label: "Tavily API Key",
help: "Tavily API key for web search and extraction (fallback: TAVILY_API_KEY env var).",
sensitive: true,
placeholder: "tvly-...",
},
"webSearch.baseUrl": {
label: "Tavily Base URL",
help: "Tavily API base URL override.",
},
},
contracts: {
webSearchProviders: ["tavily"],
tools: ["tavily_search", "tavily_extract"],
},
},
},
{
dirName: "telegram",
idHint: "telegram",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/telegram",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Telegram channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "telegram",
label: "Telegram",
selectionLabel: "Telegram (Bot API)",
detailLabel: "Telegram Bot",
docsPath: "/channels/telegram",
docsLabel: "telegram",
blurb: "simplest way to get started — register a bot with @BotFather and get going.",
systemImage: "paperplane",
},
},
manifest: {
id: "telegram",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["telegram"],
channelConfigs: {
telegram: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
anyOf: [
{
type: "array",
items: {
type: "string",
},
},
{
type: "object",
properties: {
inlineButtons: {
type: "string",
enum: ["off", "dm", "group", "all", "allowlist"],
},
},
additionalProperties: false,
},
],
},
execApprovals: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
approvers: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
agentFilter: {
type: "array",
items: {
type: "string",
},
},
sessionFilter: {
type: "array",
items: {
type: "string",
},
},
target: {
type: "string",
enum: ["dm", "channel", "both"],
},
},
additionalProperties: false,
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
customCommands: {
type: "array",
items: {
type: "object",
properties: {
command: {
type: "string",
},
description: {
type: "string",
},
},
required: ["command", "description"],
additionalProperties: false,
},
},
configWrites: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
tokenFile: {
type: "string",
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
topics: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
agentId: {
type: "string",
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
direct: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
topics: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
agentId: {
type: "string",
},
},
additionalProperties: false,
},
},
requireTopic: {
type: "boolean",
},
autoTopicLabel: {
anyOf: [
{
type: "boolean",
},
{
type: "object",
properties: {
enabled: {
type: "boolean",
},
prompt: {
type: "string",
},
},
additionalProperties: false,
},
],
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
blockStreaming: {
type: "boolean",
},
draftChunk: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
breakPreference: {
anyOf: [
{
type: "string",
const: "paragraph",
},
{
type: "string",
const: "newline",
},
{
type: "string",
const: "sentence",
},
],
},
},
additionalProperties: false,
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streamMode: {
type: "string",
enum: ["off", "partial", "block"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
timeoutSeconds: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
retry: {
type: "object",
properties: {
attempts: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
minDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
jitter: {
type: "number",
minimum: 0,
maximum: 1,
},
},
additionalProperties: false,
},
network: {
type: "object",
properties: {
autoSelectFamily: {
type: "boolean",
},
dnsResultOrder: {
type: "string",
enum: ["ipv4first", "verbatim"],
},
},
additionalProperties: false,
},
proxy: {
type: "string",
},
webhookUrl: {
description:
"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.",
type: "string",
},
webhookSecret: {
description:
"Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.",
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
description:
"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.",
type: "string",
},
webhookHost: {
description:
"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.",
type: "string",
},
webhookPort: {
description:
"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.",
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
webhookCertPath: {
description:
"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).",
type: "string",
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
sendMessage: {
type: "boolean",
},
poll: {
type: "boolean",
},
deleteMessage: {
type: "boolean",
},
editMessage: {
type: "boolean",
},
sticker: {
type: "boolean",
},
createForumTopic: {
type: "boolean",
},
editForumTopic: {
type: "boolean",
},
},
additionalProperties: false,
},
threadBindings: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
idleHours: {
type: "number",
minimum: 0,
},
maxAgeHours: {
type: "number",
minimum: 0,
},
spawnSubagentSessions: {
type: "boolean",
},
spawnAcpSessions: {
type: "boolean",
},
},
additionalProperties: false,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all"],
},
reactionLevel: {
type: "string",
enum: ["off", "ack", "minimal", "extensive"],
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
linkPreview: {
type: "boolean",
},
silentErrorReplies: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
apiRoot: {
type: "string",
format: "uri",
},
autoTopicLabel: {
anyOf: [
{
type: "boolean",
},
{
type: "object",
properties: {
enabled: {
type: "boolean",
},
prompt: {
type: "string",
},
},
additionalProperties: false,
},
],
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
capabilities: {
anyOf: [
{
type: "array",
items: {
type: "string",
},
},
{
type: "object",
properties: {
inlineButtons: {
type: "string",
enum: ["off", "dm", "group", "all", "allowlist"],
},
},
additionalProperties: false,
},
],
},
execApprovals: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
approvers: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
agentFilter: {
type: "array",
items: {
type: "string",
},
},
sessionFilter: {
type: "array",
items: {
type: "string",
},
},
target: {
type: "string",
enum: ["dm", "channel", "both"],
},
},
additionalProperties: false,
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
enabled: {
type: "boolean",
},
commands: {
type: "object",
properties: {
native: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
nativeSkills: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
const: "auto",
},
],
},
},
additionalProperties: false,
},
customCommands: {
type: "array",
items: {
type: "object",
properties: {
command: {
type: "string",
},
description: {
type: "string",
},
},
required: ["command", "description"],
additionalProperties: false,
},
},
configWrites: {
type: "boolean",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
tokenFile: {
type: "string",
},
replyToMode: {
anyOf: [
{
type: "string",
const: "off",
},
{
type: "string",
const: "first",
},
{
type: "string",
const: "all",
},
],
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
topics: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
agentId: {
type: "string",
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
defaultTo: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
direct: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
topics: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
disableAudioPreflight: {
type: "boolean",
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
skills: {
type: "array",
items: {
type: "string",
},
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
systemPrompt: {
type: "string",
},
agentId: {
type: "string",
},
},
additionalProperties: false,
},
},
requireTopic: {
type: "boolean",
},
autoTopicLabel: {
anyOf: [
{
type: "boolean",
},
{
type: "object",
properties: {
enabled: {
type: "boolean",
},
prompt: {
type: "string",
},
},
additionalProperties: false,
},
],
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
streaming: {
anyOf: [
{
type: "boolean",
},
{
type: "string",
enum: ["off", "partial", "block", "progress"],
},
],
},
blockStreaming: {
type: "boolean",
},
draftChunk: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
breakPreference: {
anyOf: [
{
type: "string",
const: "paragraph",
},
{
type: "string",
const: "newline",
},
{
type: "string",
const: "sentence",
},
],
},
},
additionalProperties: false,
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
streamMode: {
type: "string",
enum: ["off", "partial", "block"],
},
mediaMaxMb: {
type: "number",
exclusiveMinimum: 0,
},
timeoutSeconds: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
retry: {
type: "object",
properties: {
attempts: {
type: "integer",
minimum: 1,
maximum: 9007199254740991,
},
minDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
maxDelayMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
jitter: {
type: "number",
minimum: 0,
maximum: 1,
},
},
additionalProperties: false,
},
network: {
type: "object",
properties: {
autoSelectFamily: {
type: "boolean",
},
dnsResultOrder: {
type: "string",
enum: ["ipv4first", "verbatim"],
},
},
additionalProperties: false,
},
proxy: {
type: "string",
},
webhookUrl: {
description:
"Public HTTPS webhook URL registered with Telegram for inbound updates. This must be internet-reachable and requires channels.telegram.webhookSecret.",
type: "string",
},
webhookSecret: {
description:
"Secret token sent to Telegram during webhook registration and verified on inbound webhook requests. Telegram returns this value for verification; this is not the gateway auth token and not the bot token.",
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
description:
"Local webhook route path served by the gateway listener. Defaults to /telegram-webhook.",
type: "string",
},
webhookHost: {
description:
"Local bind host for the webhook listener. Defaults to 127.0.0.1; keep loopback unless you intentionally expose direct ingress.",
type: "string",
},
webhookPort: {
description:
"Local bind port for the webhook listener. Defaults to 8787; set to 0 to let the OS assign an ephemeral port.",
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
webhookCertPath: {
description:
"Path to the self-signed certificate (PEM) to upload to Telegram during webhook registration. Required for self-signed certs (direct IP or no domain).",
type: "string",
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
sendMessage: {
type: "boolean",
},
poll: {
type: "boolean",
},
deleteMessage: {
type: "boolean",
},
editMessage: {
type: "boolean",
},
sticker: {
type: "boolean",
},
createForumTopic: {
type: "boolean",
},
editForumTopic: {
type: "boolean",
},
},
additionalProperties: false,
},
threadBindings: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
idleHours: {
type: "number",
minimum: 0,
},
maxAgeHours: {
type: "number",
minimum: 0,
},
spawnSubagentSessions: {
type: "boolean",
},
spawnAcpSessions: {
type: "boolean",
},
},
additionalProperties: false,
},
reactionNotifications: {
type: "string",
enum: ["off", "own", "all"],
},
reactionLevel: {
type: "string",
enum: ["off", "ack", "minimal", "extensive"],
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
linkPreview: {
type: "boolean",
},
silentErrorReplies: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
ackReaction: {
type: "string",
},
apiRoot: {
type: "string",
format: "uri",
},
autoTopicLabel: {
anyOf: [
{
type: "boolean",
},
{
type: "object",
properties: {
enabled: {
type: "boolean",
},
prompt: {
type: "string",
},
},
additionalProperties: false,
},
],
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["dmPolicy", "groupPolicy"],
additionalProperties: false,
},
uiHints: {
"": {
label: "Telegram",
help: "Telegram channel provider configuration including auth tokens, retry behavior, and message rendering controls. Use this section to tune bot behavior for Telegram-specific API semantics.",
},
customCommands: {
label: "Telegram Custom Commands",
help: "Additional Telegram bot menu commands (merged with native; conflicts ignored).",
},
botToken: {
label: "Telegram Bot Token",
help: "Telegram bot token used to authenticate Bot API requests for this account/provider config. Use secret/env substitution and rotate tokens if exposure is suspected.",
},
dmPolicy: {
label: "Telegram DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.telegram.allowFrom=["*"].',
},
configWrites: {
label: "Telegram Config Writes",
help: "Allow Telegram to write config in response to channel events/commands (default: true).",
},
"commands.native": {
label: "Telegram Native Commands",
help: 'Override native commands for Telegram (bool or "auto").',
},
"commands.nativeSkills": {
label: "Telegram Native Skill Commands",
help: 'Override native skill commands for Telegram (bool or "auto").',
},
streaming: {
label: "Telegram Streaming Mode",
help: 'Unified Telegram stream preview mode: "off" | "partial" | "block" | "progress" (default: "partial"). "progress" maps to "partial" on Telegram. Legacy boolean/streamMode keys are auto-mapped.',
},
"retry.attempts": {
label: "Telegram Retry Attempts",
help: "Max retry attempts for outbound Telegram API calls (default: 3).",
},
"retry.minDelayMs": {
label: "Telegram Retry Min Delay (ms)",
help: "Minimum retry delay in ms for Telegram outbound calls.",
},
"retry.maxDelayMs": {
label: "Telegram Retry Max Delay (ms)",
help: "Maximum retry delay cap in ms for Telegram outbound calls.",
},
"retry.jitter": {
label: "Telegram Retry Jitter",
help: "Jitter factor (0-1) applied to Telegram retry delays.",
},
"network.autoSelectFamily": {
label: "Telegram autoSelectFamily",
help: "Override Node autoSelectFamily for Telegram (true=enable, false=disable).",
},
timeoutSeconds: {
label: "Telegram API Timeout (seconds)",
help: "Max seconds before Telegram API requests are aborted (default: 500 per grammY).",
},
silentErrorReplies: {
label: "Telegram Silent Error Replies",
help: "When true, Telegram bot replies marked as errors are sent silently (no notification sound). Default: false.",
},
apiRoot: {
label: "Telegram API Root URL",
help: "Custom Telegram Bot API root URL. Use for self-hosted Bot API servers (https://github.com/tdlib/telegram-bot-api) or reverse proxies in regions where api.telegram.org is blocked.",
},
autoTopicLabel: {
label: "Telegram Auto Topic Label",
help: "Auto-rename DM forum topics on first message using LLM. Default: true. Set to false to disable, or use object form { enabled: true, prompt: '...' } for custom prompt.",
},
"autoTopicLabel.enabled": {
label: "Telegram Auto Topic Label Enabled",
help: "Whether auto topic labeling is enabled. Default: true.",
},
"autoTopicLabel.prompt": {
label: "Telegram Auto Topic Label Prompt",
help: "Custom prompt for LLM-based topic naming. The user message is appended after the prompt.",
},
"capabilities.inlineButtons": {
label: "Telegram Inline Buttons",
help: "Enable Telegram inline button components for supported command and interaction surfaces. Disable if your deployment needs plain-text-only compatibility behavior.",
},
execApprovals: {
label: "Telegram Exec Approvals",
help: "Telegram-native exec approval routing and approver authorization. Enable this only when Telegram should act as an explicit exec-approval client for the selected bot account.",
},
"execApprovals.enabled": {
label: "Telegram Exec Approvals Enabled",
help: "Enable Telegram exec approvals for this account. When false or unset, Telegram messages/buttons cannot approve exec requests.",
},
"execApprovals.approvers": {
label: "Telegram Exec Approval Approvers",
help: "Telegram user IDs allowed to approve exec requests for this bot account. Use numeric Telegram user IDs; prompts are only delivered to these approvers when target includes dm.",
},
"execApprovals.agentFilter": {
label: "Telegram Exec Approval Agent Filter",
help: 'Optional allowlist of agent IDs eligible for Telegram exec approvals, for example `["main", "ops-agent"]`. Use this to keep approval prompts scoped to the agents you actually operate from Telegram.',
},
"execApprovals.sessionFilter": {
label: "Telegram Exec Approval Session Filter",
help: "Optional session-key filters matched as substring or regex-style patterns before Telegram approval routing is used. Use narrow patterns so Telegram approvals only appear for intended sessions.",
},
"execApprovals.target": {
label: "Telegram Exec Approval Target",
help: 'Controls where Telegram approval prompts are sent: "dm" sends to approver DMs (default), "channel" sends to the originating Telegram chat/topic, and "both" sends to both. Channel delivery exposes the command text to the chat, so only use it in trusted groups/topics.',
},
"threadBindings.enabled": {
label: "Telegram Thread Binding Enabled",
help: "Enable Telegram conversation binding features (/focus, /unfocus, /agents, and /session idle|max-age). Overrides session.threadBindings.enabled when set.",
},
"threadBindings.idleHours": {
label: "Telegram Thread Binding Idle Timeout (hours)",
help: "Inactivity window in hours for Telegram bound sessions. Set 0 to disable idle auto-unfocus (default: 24). Overrides session.threadBindings.idleHours when set.",
},
"threadBindings.maxAgeHours": {
label: "Telegram Thread Binding Max Age (hours)",
help: "Optional hard max age in hours for Telegram bound sessions. Set 0 to disable hard cap (default: 0). Overrides session.threadBindings.maxAgeHours when set.",
},
"threadBindings.spawnSubagentSessions": {
label: "Telegram Thread-Bound Subagent Spawn",
help: "Allow subagent spawns with thread=true to auto-bind Telegram current conversations when supported.",
},
"threadBindings.spawnAcpSessions": {
label: "Telegram Thread-Bound ACP Spawn",
help: "Allow ACP spawns with thread=true to auto-bind Telegram current conversations when supported.",
},
},
label: "Telegram",
description:
"simplest way to get started — register a bot with @BotFather and get going.",
},
},
},
},
{
dirName: "tlon",
idHint: "tlon",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/tlon",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Tlon/Urbit channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "tlon",
label: "Tlon",
selectionLabel: "Tlon (Urbit)",
docsPath: "/channels/tlon",
docsLabel: "tlon",
blurb: "decentralized messaging on Urbit; install the plugin to enable.",
order: 90,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/tlon",
localPath: "extensions/tlon",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "tlon",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["tlon"],
skills: ["node_modules/@tloncorp/tlon-skill"],
channelConfigs: {
tlon: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
ship: {
type: "string",
minLength: 1,
},
url: {
type: "string",
},
code: {
type: "string",
},
allowPrivateNetwork: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
dmAllowlist: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
autoDiscoverChannels: {
type: "boolean",
},
showModelSignature: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
autoAcceptDmInvites: {
type: "boolean",
},
autoAcceptGroupInvites: {
type: "boolean",
},
ownerShip: {
type: "string",
minLength: 1,
},
authorization: {
type: "object",
properties: {
channelRules: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
mode: {
type: "string",
enum: ["restricted", "open"],
},
allowedShips: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
defaultAuthorizedShips: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
ship: {
type: "string",
minLength: 1,
},
url: {
type: "string",
},
code: {
type: "string",
},
allowPrivateNetwork: {
type: "boolean",
},
groupChannels: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
dmAllowlist: {
type: "array",
items: {
type: "string",
minLength: 1,
},
},
autoDiscoverChannels: {
type: "boolean",
},
showModelSignature: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
autoAcceptDmInvites: {
type: "boolean",
},
autoAcceptGroupInvites: {
type: "boolean",
},
ownerShip: {
type: "string",
minLength: 1,
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
label: "Tlon",
description: "decentralized messaging on Urbit; install the plugin to enable.",
},
},
},
},
{
dirName: "together",
idHint: "together",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/together-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Together provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "together",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["together"],
providerAuthEnvVars: {
together: ["TOGETHER_API_KEY"],
},
providerAuthChoices: [
{
provider: "together",
method: "api-key",
choiceId: "together-api-key",
choiceLabel: "Together AI API key",
groupId: "together",
groupLabel: "Together AI",
groupHint: "API key",
optionKey: "togetherApiKey",
cliFlag: "--together-api-key",
cliOption: "--together-api-key <key>",
cliDescription: "Together AI API key",
},
],
},
},
{
dirName: "twitch",
idHint: "twitch",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/twitch",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Twitch channel plugin",
packageManifest: {
extensions: ["./index.ts"],
channel: {
id: "twitch",
label: "Twitch",
selectionLabel: "Twitch (Chat)",
docsPath: "/channels/twitch",
blurb: "Twitch chat integration",
aliases: ["twitch-chat"],
},
install: {
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "twitch",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["twitch"],
channelConfigs: {
twitch: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
anyOf: [
{
allOf: [
{
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
{
type: "object",
properties: {
username: {
type: "string",
},
accessToken: {
type: "string",
},
clientId: {
type: "string",
},
channel: {
type: "string",
minLength: 1,
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
allowedRoles: {
type: "array",
items: {
type: "string",
enum: ["moderator", "owner", "vip", "subscriber", "all"],
},
},
requireMention: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
clientSecret: {
type: "string",
},
refreshToken: {
type: "string",
},
expiresIn: {
anyOf: [
{
type: "number",
},
{
type: "null",
},
],
},
obtainmentTimestamp: {
type: "number",
},
},
required: ["username", "accessToken", "channel"],
additionalProperties: false,
},
],
},
{
allOf: [
{
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
{
type: "object",
properties: {
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
username: {
type: "string",
},
accessToken: {
type: "string",
},
clientId: {
type: "string",
},
channel: {
type: "string",
minLength: 1,
},
enabled: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
allowedRoles: {
type: "array",
items: {
type: "string",
enum: ["moderator", "owner", "vip", "subscriber", "all"],
},
},
requireMention: {
type: "boolean",
},
responsePrefix: {
type: "string",
},
clientSecret: {
type: "string",
},
refreshToken: {
type: "string",
},
expiresIn: {
anyOf: [
{
type: "number",
},
{
type: "null",
},
],
},
obtainmentTimestamp: {
type: "number",
},
},
required: ["username", "accessToken", "channel"],
additionalProperties: false,
},
},
},
required: ["accounts"],
additionalProperties: false,
},
],
},
],
},
label: "Twitch",
description: "Twitch chat integration",
},
},
},
},
{
dirName: "venice",
idHint: "venice",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/venice-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Venice provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "venice",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["venice"],
providerAuthEnvVars: {
venice: ["VENICE_API_KEY"],
},
providerAuthChoices: [
{
provider: "venice",
method: "api-key",
choiceId: "venice-api-key",
choiceLabel: "Venice AI API key",
groupId: "venice",
groupLabel: "Venice AI",
groupHint: "Privacy-focused (uncensored models)",
optionKey: "veniceApiKey",
cliFlag: "--venice-api-key",
cliOption: "--venice-api-key <key>",
cliDescription: "Venice API key",
},
],
},
},
{
dirName: "vercel-ai-gateway",
idHint: "vercel-ai-gateway",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/vercel-ai-gateway-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Vercel AI Gateway provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "vercel-ai-gateway",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["vercel-ai-gateway"],
providerAuthEnvVars: {
"vercel-ai-gateway": ["AI_GATEWAY_API_KEY"],
},
providerAuthChoices: [
{
provider: "vercel-ai-gateway",
method: "api-key",
choiceId: "ai-gateway-api-key",
choiceLabel: "Vercel AI Gateway API key",
groupId: "ai-gateway",
groupLabel: "Vercel AI Gateway",
groupHint: "API key",
optionKey: "aiGatewayApiKey",
cliFlag: "--ai-gateway-api-key",
cliOption: "--ai-gateway-api-key <key>",
cliDescription: "Vercel AI Gateway API key",
},
],
},
},
{
dirName: "vllm",
idHint: "vllm",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/vllm-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw vLLM provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "vllm",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["vllm"],
providerAuthEnvVars: {
vllm: ["VLLM_API_KEY"],
},
providerAuthChoices: [
{
provider: "vllm",
method: "custom",
choiceId: "vllm",
choiceLabel: "vLLM",
choiceHint: "Local/self-hosted OpenAI-compatible server",
groupId: "vllm",
groupLabel: "vLLM",
groupHint: "Local/self-hosted OpenAI-compatible",
},
],
},
},
{
dirName: "voice-call",
idHint: "voice-call",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/voice-call",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw voice-call plugin",
packageManifest: {
extensions: ["./index.ts"],
install: {
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "voice-call",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
enabled: {
type: "boolean",
},
provider: {
type: "string",
enum: ["telnyx", "twilio", "plivo", "mock"],
},
telnyx: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: "string",
},
connectionId: {
type: "string",
},
publicKey: {
type: "string",
},
},
},
twilio: {
type: "object",
additionalProperties: false,
properties: {
accountSid: {
type: "string",
},
authToken: {
type: "string",
},
},
},
plivo: {
type: "object",
additionalProperties: false,
properties: {
authId: {
type: "string",
},
authToken: {
type: "string",
},
},
},
fromNumber: {
type: "string",
pattern: "^\\+[1-9]\\d{1,14}$",
},
toNumber: {
type: "string",
pattern: "^\\+[1-9]\\d{1,14}$",
},
inboundPolicy: {
type: "string",
enum: ["disabled", "allowlist", "pairing", "open"],
},
allowFrom: {
type: "array",
items: {
type: "string",
pattern: "^\\+[1-9]\\d{1,14}$",
},
},
inboundGreeting: {
type: "string",
},
outbound: {
type: "object",
additionalProperties: false,
properties: {
defaultMode: {
type: "string",
enum: ["notify", "conversation"],
},
notifyHangupDelaySec: {
type: "integer",
minimum: 0,
},
},
},
maxDurationSeconds: {
type: "integer",
minimum: 1,
},
staleCallReaperSeconds: {
type: "integer",
minimum: 0,
},
silenceTimeoutMs: {
type: "integer",
minimum: 1,
},
transcriptTimeoutMs: {
type: "integer",
minimum: 1,
},
ringTimeoutMs: {
type: "integer",
minimum: 1,
},
maxConcurrentCalls: {
type: "integer",
minimum: 1,
},
serve: {
type: "object",
additionalProperties: false,
properties: {
port: {
type: "integer",
minimum: 1,
},
bind: {
type: "string",
},
path: {
type: "string",
},
},
},
tailscale: {
type: "object",
additionalProperties: false,
properties: {
mode: {
type: "string",
enum: ["off", "serve", "funnel"],
},
path: {
type: "string",
},
},
},
tunnel: {
type: "object",
additionalProperties: false,
properties: {
provider: {
type: "string",
enum: ["none", "ngrok", "tailscale-serve", "tailscale-funnel"],
},
ngrokAuthToken: {
type: "string",
},
ngrokDomain: {
type: "string",
},
allowNgrokFreeTierLoopbackBypass: {
type: "boolean",
},
},
},
webhookSecurity: {
type: "object",
additionalProperties: false,
properties: {
allowedHosts: {
type: "array",
items: {
type: "string",
},
},
trustForwardingHeaders: {
type: "boolean",
},
trustedProxyIPs: {
type: "array",
items: {
type: "string",
},
},
},
},
streaming: {
type: "object",
additionalProperties: false,
properties: {
enabled: {
type: "boolean",
},
sttProvider: {
type: "string",
enum: ["openai-realtime"],
},
openaiApiKey: {
type: "string",
},
sttModel: {
type: "string",
},
silenceDurationMs: {
type: "integer",
minimum: 1,
},
vadThreshold: {
type: "number",
minimum: 0,
maximum: 1,
},
streamPath: {
type: "string",
},
preStartTimeoutMs: {
type: "integer",
minimum: 1,
},
maxPendingConnections: {
type: "integer",
minimum: 1,
},
maxPendingConnectionsPerIp: {
type: "integer",
minimum: 1,
},
maxConnections: {
type: "integer",
minimum: 1,
},
},
},
publicUrl: {
type: "string",
},
skipSignatureVerification: {
type: "boolean",
},
stt: {
type: "object",
additionalProperties: false,
properties: {
provider: {
type: "string",
enum: ["openai"],
},
model: {
type: "string",
},
},
},
tts: {
type: "object",
additionalProperties: false,
properties: {
auto: {
type: "string",
enum: ["off", "always", "inbound", "tagged"],
},
enabled: {
type: "boolean",
},
mode: {
type: "string",
enum: ["final", "all"],
},
provider: {
type: "string",
},
summaryModel: {
type: "string",
},
modelOverrides: {
type: "object",
additionalProperties: false,
properties: {
enabled: {
type: "boolean",
},
allowText: {
type: "boolean",
},
allowProvider: {
type: "boolean",
},
allowVoice: {
type: "boolean",
},
allowModelId: {
type: "boolean",
},
allowVoiceSettings: {
type: "boolean",
},
allowNormalization: {
type: "boolean",
},
allowSeed: {
type: "boolean",
},
},
},
elevenlabs: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: "string",
},
baseUrl: {
type: "string",
},
voiceId: {
type: "string",
},
modelId: {
type: "string",
},
seed: {
type: "integer",
minimum: 0,
maximum: 4294967295,
},
applyTextNormalization: {
type: "string",
enum: ["auto", "on", "off"],
},
languageCode: {
type: "string",
},
voiceSettings: {
type: "object",
additionalProperties: false,
properties: {
stability: {
type: "number",
minimum: 0,
maximum: 1,
},
similarityBoost: {
type: "number",
minimum: 0,
maximum: 1,
},
style: {
type: "number",
minimum: 0,
maximum: 1,
},
useSpeakerBoost: {
type: "boolean",
},
speed: {
type: "number",
minimum: 0.5,
maximum: 2,
},
},
},
},
},
openai: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: "string",
},
baseUrl: {
type: "string",
},
model: {
type: "string",
},
voice: {
type: "string",
},
speed: {
type: "number",
minimum: 0.25,
maximum: 4,
},
instructions: {
type: "string",
},
},
},
edge: {
type: "object",
additionalProperties: false,
properties: {
enabled: {
type: "boolean",
},
voice: {
type: "string",
},
lang: {
type: "string",
},
outputFormat: {
type: "string",
},
pitch: {
type: "string",
},
rate: {
type: "string",
},
volume: {
type: "string",
},
saveSubtitles: {
type: "boolean",
},
proxy: {
type: "string",
},
timeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
},
},
prefsPath: {
type: "string",
},
maxTextLength: {
type: "integer",
minimum: 1,
},
timeoutMs: {
type: "integer",
minimum: 1000,
maximum: 120000,
},
},
},
store: {
type: "string",
},
responseModel: {
type: "string",
},
responseSystemPrompt: {
type: "string",
},
responseTimeoutMs: {
type: "integer",
minimum: 1,
},
},
},
uiHints: {
provider: {
label: "Provider",
help: "Use twilio, telnyx, or mock for dev/no-network.",
},
fromNumber: {
label: "From Number",
placeholder: "+15550001234",
},
toNumber: {
label: "Default To Number",
placeholder: "+15550001234",
},
inboundPolicy: {
label: "Inbound Policy",
},
allowFrom: {
label: "Inbound Allowlist",
},
inboundGreeting: {
label: "Inbound Greeting",
advanced: true,
},
"telnyx.apiKey": {
label: "Telnyx API Key",
sensitive: true,
},
"telnyx.connectionId": {
label: "Telnyx Connection ID",
},
"telnyx.publicKey": {
label: "Telnyx Public Key",
sensitive: true,
},
"twilio.accountSid": {
label: "Twilio Account SID",
},
"twilio.authToken": {
label: "Twilio Auth Token",
sensitive: true,
},
"outbound.defaultMode": {
label: "Default Call Mode",
},
"outbound.notifyHangupDelaySec": {
label: "Notify Hangup Delay (sec)",
advanced: true,
},
"serve.port": {
label: "Webhook Port",
},
"serve.bind": {
label: "Webhook Bind",
},
"serve.path": {
label: "Webhook Path",
},
"tailscale.mode": {
label: "Tailscale Mode",
advanced: true,
},
"tailscale.path": {
label: "Tailscale Path",
advanced: true,
},
"tunnel.provider": {
label: "Tunnel Provider",
advanced: true,
},
"tunnel.ngrokAuthToken": {
label: "ngrok Auth Token",
sensitive: true,
advanced: true,
},
"tunnel.ngrokDomain": {
label: "ngrok Domain",
advanced: true,
},
"tunnel.allowNgrokFreeTierLoopbackBypass": {
label: "Allow ngrok Free Tier (Loopback Bypass)",
advanced: true,
},
"streaming.enabled": {
label: "Enable Streaming",
advanced: true,
},
"streaming.openaiApiKey": {
label: "OpenAI Realtime API Key",
sensitive: true,
advanced: true,
},
"streaming.sttModel": {
label: "Realtime STT Model",
advanced: true,
},
"streaming.streamPath": {
label: "Media Stream Path",
advanced: true,
},
"tts.provider": {
label: "TTS Provider Override",
help: "Deep-merges with messages.tts (Microsoft is ignored for calls).",
advanced: true,
},
"tts.openai.model": {
label: "OpenAI TTS Model",
advanced: true,
},
"tts.openai.voice": {
label: "OpenAI TTS Voice",
advanced: true,
},
"tts.openai.apiKey": {
label: "OpenAI API Key",
sensitive: true,
advanced: true,
},
"tts.elevenlabs.modelId": {
label: "ElevenLabs Model ID",
advanced: true,
},
"tts.elevenlabs.voiceId": {
label: "ElevenLabs Voice ID",
advanced: true,
},
"tts.elevenlabs.apiKey": {
label: "ElevenLabs API Key",
sensitive: true,
advanced: true,
},
"tts.elevenlabs.baseUrl": {
label: "ElevenLabs Base URL",
advanced: true,
},
publicUrl: {
label: "Public Webhook URL",
advanced: true,
},
skipSignatureVerification: {
label: "Skip Signature Verification",
advanced: true,
},
store: {
label: "Call Log Store Path",
advanced: true,
},
responseModel: {
label: "Response Model",
advanced: true,
},
responseSystemPrompt: {
label: "Response System Prompt",
advanced: true,
},
responseTimeoutMs: {
label: "Response Timeout (ms)",
advanced: true,
},
},
},
},
{
dirName: "volcengine",
idHint: "volcengine",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/volcengine-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Volcengine provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "volcengine",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["volcengine", "volcengine-plan"],
providerAuthEnvVars: {
volcengine: ["VOLCANO_ENGINE_API_KEY"],
},
providerAuthChoices: [
{
provider: "volcengine",
method: "api-key",
choiceId: "volcengine-api-key",
choiceLabel: "Volcano Engine API key",
groupId: "volcengine",
groupLabel: "Volcano Engine",
groupHint: "API key",
optionKey: "volcengineApiKey",
cliFlag: "--volcengine-api-key",
cliOption: "--volcengine-api-key <key>",
cliDescription: "Volcano Engine API key",
},
],
},
},
{
dirName: "whatsapp",
idHint: "whatsapp",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/whatsapp",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw WhatsApp channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "whatsapp",
label: "WhatsApp",
selectionLabel: "WhatsApp (QR link)",
detailLabel: "WhatsApp Web",
docsPath: "/channels/whatsapp",
docsLabel: "whatsapp",
blurb: "works with your own number; recommend a separate phone + eSIM.",
systemImage: "message",
},
install: {
npmSpec: "@openclaw/whatsapp",
localPath: "extensions/whatsapp",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "whatsapp",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["whatsapp"],
channelConfigs: {
whatsapp: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
enabled: {
type: "boolean",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
sendReadReceipts: {
type: "boolean",
},
messagePrefix: {
type: "string",
},
responsePrefix: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
selfChatMode: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
type: "string",
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
ackReaction: {
type: "object",
properties: {
emoji: {
type: "string",
},
direct: {
default: true,
type: "boolean",
},
group: {
default: "mentions",
type: "string",
enum: ["always", "mentions", "never"],
},
},
required: ["direct", "group"],
additionalProperties: false,
},
debounceMs: {
default: 0,
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
accounts: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
capabilities: {
type: "array",
items: {
type: "string",
},
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
configWrites: {
type: "boolean",
},
sendReadReceipts: {
type: "boolean",
},
messagePrefix: {
type: "string",
},
responsePrefix: {
type: "string",
},
dmPolicy: {
default: "pairing",
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
selfChatMode: {
type: "boolean",
},
allowFrom: {
type: "array",
items: {
type: "string",
},
},
defaultTo: {
type: "string",
},
groupAllowFrom: {
type: "array",
items: {
type: "string",
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dmHistoryLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
dms: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
},
textChunkLimit: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
chunkMode: {
type: "string",
enum: ["length", "newline"],
},
blockStreaming: {
type: "boolean",
},
blockStreamingCoalesce: {
type: "object",
properties: {
minChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
maxChars: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
idleMs: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
},
additionalProperties: false,
},
groups: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
toolsBySender: {
type: "object",
propertyNames: {
type: "string",
},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
},
additionalProperties: false,
},
},
ackReaction: {
type: "object",
properties: {
emoji: {
type: "string",
},
direct: {
default: true,
type: "boolean",
},
group: {
default: "mentions",
type: "string",
enum: ["always", "mentions", "never"],
},
},
required: ["direct", "group"],
additionalProperties: false,
},
debounceMs: {
default: 0,
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
heartbeat: {
type: "object",
properties: {
showOk: {
type: "boolean",
},
showAlerts: {
type: "boolean",
},
useIndicator: {
type: "boolean",
},
},
additionalProperties: false,
},
healthMonitor: {
type: "object",
properties: {
enabled: {
type: "boolean",
},
},
additionalProperties: false,
},
name: {
type: "string",
},
authDir: {
type: "string",
},
mediaMaxMb: {
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
},
required: ["dmPolicy", "groupPolicy", "debounceMs"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
mediaMaxMb: {
default: 50,
type: "integer",
exclusiveMinimum: 0,
maximum: 9007199254740991,
},
actions: {
type: "object",
properties: {
reactions: {
type: "boolean",
},
sendMessage: {
type: "boolean",
},
polls: {
type: "boolean",
},
},
additionalProperties: false,
},
},
required: ["dmPolicy", "groupPolicy", "debounceMs", "mediaMaxMb"],
additionalProperties: false,
},
uiHints: {
"": {
label: "WhatsApp",
help: "WhatsApp channel provider configuration for access policy and message batching behavior. Use this section to tune responsiveness and direct-message routing safety for WhatsApp chats.",
},
dmPolicy: {
label: "WhatsApp DM Policy",
help: 'Direct message access control ("pairing" recommended). "open" requires channels.whatsapp.allowFrom=["*"].',
},
selfChatMode: {
label: "WhatsApp Self-Phone Mode",
help: "Same-phone setup (bot uses your personal WhatsApp number).",
},
debounceMs: {
label: "WhatsApp Message Debounce (ms)",
help: "Debounce window (ms) for batching rapid consecutive messages from the same sender (0 to disable).",
},
configWrites: {
label: "WhatsApp Config Writes",
help: "Allow WhatsApp to write config in response to channel events/commands (default: true).",
},
},
label: "WhatsApp",
description: "works with your own number; recommend a separate phone + eSIM.",
},
},
},
},
{
dirName: "xai",
idHint: "xai",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/xai-plugin",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw xAI plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "xai",
configSchema: {
type: "object",
additionalProperties: false,
properties: {
webSearch: {
type: "object",
additionalProperties: false,
properties: {
apiKey: {
type: ["string", "object"],
},
model: {
type: "string",
},
inlineCitations: {
type: "boolean",
},
},
},
},
},
providers: ["xai"],
providerAuthEnvVars: {
xai: ["XAI_API_KEY"],
},
providerAuthChoices: [
{
provider: "xai",
method: "api-key",
choiceId: "xai-api-key",
choiceLabel: "xAI API key",
groupId: "xai",
groupLabel: "xAI (Grok)",
groupHint: "API key",
optionKey: "xaiApiKey",
cliFlag: "--xai-api-key",
cliOption: "--xai-api-key <key>",
cliDescription: "xAI API key",
},
],
uiHints: {
"webSearch.apiKey": {
label: "Grok Search API Key",
help: "xAI API key for Grok web search (fallback: XAI_API_KEY env var).",
sensitive: true,
},
"webSearch.model": {
label: "Grok Search Model",
help: "Grok model override for web search.",
},
"webSearch.inlineCitations": {
label: "Inline Citations",
help: "Include inline markdown citations in Grok responses.",
},
},
contracts: {
webSearchProviders: ["grok"],
},
},
},
{
dirName: "xiaomi",
idHint: "xiaomi",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/xiaomi-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Xiaomi provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "xiaomi",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["xiaomi"],
providerAuthEnvVars: {
xiaomi: ["XIAOMI_API_KEY"],
},
providerAuthChoices: [
{
provider: "xiaomi",
method: "api-key",
choiceId: "xiaomi-api-key",
choiceLabel: "Xiaomi API key",
groupId: "xiaomi",
groupLabel: "Xiaomi",
groupHint: "API key",
optionKey: "xiaomiApiKey",
cliFlag: "--xiaomi-api-key",
cliOption: "--xiaomi-api-key <key>",
cliDescription: "Xiaomi API key",
},
],
},
},
{
dirName: "zai",
idHint: "zai",
source: {
source: "./index.ts",
built: "index.js",
},
packageName: "@openclaw/zai-provider",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Z.AI provider plugin",
packageManifest: {
extensions: ["./index.ts"],
},
manifest: {
id: "zai",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
providers: ["zai"],
providerAuthEnvVars: {
zai: ["ZAI_API_KEY", "Z_AI_API_KEY"],
},
providerAuthChoices: [
{
provider: "zai",
method: "api-key",
choiceId: "zai-api-key",
choiceLabel: "Z.AI API key",
groupId: "zai",
groupLabel: "Z.AI",
groupHint: "GLM Coding Plan / Global / CN",
optionKey: "zaiApiKey",
cliFlag: "--zai-api-key",
cliOption: "--zai-api-key <key>",
cliDescription: "Z.AI API key",
},
{
provider: "zai",
method: "coding-global",
choiceId: "zai-coding-global",
choiceLabel: "Coding-Plan-Global",
choiceHint: "GLM Coding Plan Global (api.z.ai)",
groupId: "zai",
groupLabel: "Z.AI",
groupHint: "GLM Coding Plan / Global / CN",
optionKey: "zaiApiKey",
cliFlag: "--zai-api-key",
cliOption: "--zai-api-key <key>",
cliDescription: "Z.AI API key",
},
{
provider: "zai",
method: "coding-cn",
choiceId: "zai-coding-cn",
choiceLabel: "Coding-Plan-CN",
choiceHint: "GLM Coding Plan CN (open.bigmodel.cn)",
groupId: "zai",
groupLabel: "Z.AI",
groupHint: "GLM Coding Plan / Global / CN",
optionKey: "zaiApiKey",
cliFlag: "--zai-api-key",
cliOption: "--zai-api-key <key>",
cliDescription: "Z.AI API key",
},
{
provider: "zai",
method: "global",
choiceId: "zai-global",
choiceLabel: "Global",
choiceHint: "Z.AI Global (api.z.ai)",
groupId: "zai",
groupLabel: "Z.AI",
groupHint: "GLM Coding Plan / Global / CN",
optionKey: "zaiApiKey",
cliFlag: "--zai-api-key",
cliOption: "--zai-api-key <key>",
cliDescription: "Z.AI API key",
},
{
provider: "zai",
method: "cn",
choiceId: "zai-cn",
choiceLabel: "CN",
choiceHint: "Z.AI CN (open.bigmodel.cn)",
groupId: "zai",
groupLabel: "Z.AI",
groupHint: "GLM Coding Plan / Global / CN",
optionKey: "zaiApiKey",
cliFlag: "--zai-api-key",
cliOption: "--zai-api-key <key>",
cliDescription: "Z.AI API key",
},
],
contracts: {
mediaUnderstandingProviders: ["zai"],
},
},
},
{
dirName: "zalo",
idHint: "zalo",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/zalo",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Zalo channel plugin",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "zalo",
label: "Zalo",
selectionLabel: "Zalo (Bot API)",
docsPath: "/channels/zalo",
docsLabel: "zalo",
blurb: "Vietnam-focused messaging platform with Bot API.",
aliases: ["zl"],
order: 80,
quickstartAllowFrom: true,
},
install: {
npmSpec: "@openclaw/zalo",
localPath: "extensions/zalo",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "zalo",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["zalo"],
channelConfigs: {
zalo: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
tokenFile: {
type: "string",
},
webhookUrl: {
type: "string",
},
webhookSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
type: "string",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
mediaMaxMb: {
type: "number",
},
proxy: {
type: "string",
},
responsePrefix: {
type: "string",
},
accounts: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
botToken: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
tokenFile: {
type: "string",
},
webhookUrl: {
type: "string",
},
webhookSecret: {
anyOf: [
{
type: "string",
},
{
oneOf: [
{
type: "object",
properties: {
source: {
type: "string",
const: "env",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
pattern: "^[A-Z][A-Z0-9_]{0,127}$",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "file",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
{
type: "object",
properties: {
source: {
type: "string",
const: "exec",
},
provider: {
type: "string",
pattern: "^[a-z][a-z0-9_-]{0,63}$",
},
id: {
type: "string",
},
},
required: ["source", "provider", "id"],
additionalProperties: false,
},
],
},
],
},
webhookPath: {
type: "string",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
mediaMaxMb: {
type: "number",
},
proxy: {
type: "string",
},
responsePrefix: {
type: "string",
},
},
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
additionalProperties: false,
},
label: "Zalo",
description: "Vietnam-focused messaging platform with Bot API.",
},
},
},
},
{
dirName: "zalouser",
idHint: "zalouser",
source: {
source: "./index.ts",
built: "index.js",
},
setupSource: {
source: "./setup-entry.ts",
built: "setup-entry.js",
},
packageName: "@openclaw/zalouser",
packageVersion: "2026.3.26",
packageDescription: "OpenClaw Zalo Personal Account plugin via native zca-js integration",
packageManifest: {
extensions: ["./index.ts"],
setupEntry: "./setup-entry.ts",
channel: {
id: "zalouser",
label: "Zalo Personal",
selectionLabel: "Zalo (Personal Account)",
docsPath: "/channels/zalouser",
docsLabel: "zalouser",
blurb: "Zalo personal account via QR code login.",
aliases: ["zlu"],
order: 85,
quickstartAllowFrom: false,
},
install: {
npmSpec: "@openclaw/zalouser",
localPath: "extensions/zalouser",
defaultChoice: "npm",
minHostVersion: ">=2026.3.26",
},
},
manifest: {
id: "zalouser",
configSchema: {
type: "object",
additionalProperties: false,
properties: {},
},
channels: ["zalouser"],
channelConfigs: {
zalouser: {
schema: {
$schema: "http://json-schema.org/draft-07/schema#",
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
profile: {
type: "string",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groups: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "boolean",
},
enabled: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
},
messagePrefix: {
type: "string",
},
responsePrefix: {
type: "string",
},
accounts: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
name: {
type: "string",
},
enabled: {
type: "boolean",
},
markdown: {
type: "object",
properties: {
tables: {
type: "string",
enum: ["off", "bullets", "code"],
},
},
additionalProperties: false,
},
profile: {
type: "string",
},
dangerouslyAllowNameMatching: {
type: "boolean",
},
dmPolicy: {
type: "string",
enum: ["pairing", "allowlist", "open", "disabled"],
},
allowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
historyLimit: {
type: "integer",
minimum: 0,
maximum: 9007199254740991,
},
groupAllowFrom: {
type: "array",
items: {
anyOf: [
{
type: "string",
},
{
type: "number",
},
],
},
},
groupPolicy: {
default: "allowlist",
type: "string",
enum: ["open", "disabled", "allowlist"],
},
groups: {
type: "object",
properties: {},
additionalProperties: {
type: "object",
properties: {
allow: {
type: "boolean",
},
enabled: {
type: "boolean",
},
requireMention: {
type: "boolean",
},
tools: {
type: "object",
properties: {
allow: {
type: "array",
items: {
type: "string",
},
},
alsoAllow: {
type: "array",
items: {
type: "string",
},
},
deny: {
type: "array",
items: {
type: "string",
},
},
},
additionalProperties: false,
},
},
additionalProperties: false,
},
},
messagePrefix: {
type: "string",
},
responsePrefix: {
type: "string",
},
},
required: ["groupPolicy"],
additionalProperties: false,
},
},
defaultAccount: {
type: "string",
},
},
required: ["groupPolicy"],
additionalProperties: false,
},
label: "Zalo Personal",
description: "Zalo personal account via QR code login.",
},
},
},
},
] as const;