// 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", }, publicSurfaceArtifacts: ["runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/acpx", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "discovery.js"], packageName: "@openclaw/amazon-bedrock-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Amazon Bedrock provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "amazon-bedrock", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["amazon-bedrock"], }, }, { dirName: "anthropic", idHint: "anthropic", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "cli-backend.js", "cli-migration.js", "cli-shared.js", "media-understanding-provider.js", ], packageName: "@openclaw/anthropic-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Anthropic provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "anthropic", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["anthropic"], cliBackends: ["claude-cli"], providerAuthEnvVars: { anthropic: ["ANTHROPIC_OAUTH_TOKEN", "ANTHROPIC_API_KEY"], }, providerAuthChoices: [ { provider: "anthropic", method: "cli", choiceId: "anthropic-cli", deprecatedChoiceIds: ["claude-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 ", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/bluebubbles", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/brave-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["browser-runtime-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/browser-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "provider-catalog.js"], packageName: "@openclaw/byteplus-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw BytePlus provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "byteplus", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "BytePlus API key", }, ], }, }, { dirName: "chutes", idHint: "chutes", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/chutes-provider", packageVersion: "2026.3.27", 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 ", cliDescription: "Chutes API key", }, ], }, }, { dirName: "cloudflare-ai-gateway", idHint: "cloudflare-ai-gateway", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js"], packageName: "@openclaw/cloudflare-ai-gateway-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Cloudflare AI Gateway provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "cloudflare-ai-gateway", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Cloudflare AI Gateway API key", }, ], }, }, { dirName: "copilot-proxy", idHint: "copilot-proxy", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/copilot-proxy", packageVersion: "2026.3.27", packageDescription: "OpenClaw Copilot Proxy provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "copilot-proxy", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["copilot-proxy"], autoEnableWhenConfiguredProviders: ["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", }, publicSurfaceArtifacts: ["audio.js", "media-understanding-provider.js"], packageName: "@openclaw/deepgram-provider", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/deepseek-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw DeepSeek provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "deepseek", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "DeepSeek API key", }, ], }, }, { dirName: "diagnostics-otel", idHint: "diagnostics-otel", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js"], packageName: "@openclaw/diagnostics-otel", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js"], packageName: "@openclaw/diffs", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "action-runtime-api.js", "api.js", "channel-config-api.js", "runtime-api.js", "session-key-api.js", "timeouts.js", ], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/discord", packageVersion: "2026.3.27", 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.27", }, }, 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..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..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..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..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..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..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", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/duckduckgo-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["speech-provider.js", "tts.js"], packageName: "@openclaw/elevenlabs-speech", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/exa-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["image-generation-provider.js", "onboard.js"], packageName: "@openclaw/fal-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw fal provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "fal", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/feishu", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/firecrawl-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "api.js", "login.js", "models-defaults.js", "models.js", "token.js", "usage.js", ], packageName: "@openclaw/github-copilot-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw GitHub Copilot provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "github-copilot", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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", }, publicSurfaceArtifacts: [ "api.js", "cli-backend.js", "gemini-cli-provider.js", "image-generation-provider.js", "media-understanding-provider.js", "model-id.js", "oauth.credentials.js", "oauth.flow.js", "oauth.http.js", "oauth.js", "oauth.project.js", "oauth.runtime.js", "oauth.shared.js", "oauth.token.js", "provider-models.js", "runtime-api.js", "web-search-provider.js", ], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/google-plugin", packageVersion: "2026.3.27", 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", }, }, }, }, }, enabledByDefault: true, providers: ["google", "google-gemini-cli"], autoEnableWhenConfiguredProviders: ["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 ", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/googlechat", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["media-understanding-provider.js"], packageName: "@openclaw/groq-provider", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/huggingface-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Hugging Face provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "huggingface", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/imessage", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js"], packageName: "@openclaw/irc", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: [ "api.js", "onboard.js", "provider-catalog.js", "provider-models.js", "shared.js", ], packageName: "@openclaw/kilocode-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Kilo Gateway provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "kilocode", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Kilo Gateway API key", }, ], }, }, { dirName: "kimi-coding", idHint: "kimi", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/kimi-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Kimi provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "kimi", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/line", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/litellm-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw LiteLLM provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "litellm", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "LiteLLM API key", }, ], }, }, { dirName: "llm-task", idHint: "llm-task", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js"], packageName: "@openclaw/llm-task", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/lobster", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "api.js", "helper-api.js", "legacy-crypto-inspector.js", "runtime-api.js", "thread-bindings-runtime.js", ], runtimeSidecarArtifacts: ["helper-api.js", "runtime-api.js", "thread-bindings-runtime.js"], packageName: "@openclaw/matrix", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/mattermost", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/memory-core", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "config.js", "lancedb-runtime.js"], packageName: "@openclaw/memory-lancedb", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["speech-provider.js", "tts.js"], packageName: "@openclaw/microsoft-speech", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "auth.js", "cli.js", "onboard.js", "provider.js", "runtime.js", "shared-runtime.js", "shared.js", ], packageName: "@openclaw/microsoft-foundry", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "api.js", "image-generation-provider.js", "media-understanding-provider.js", "model-definitions.js", "oauth.js", "oauth.runtime.js", "onboard.js", "provider-catalog.js", "provider-models.js", ], packageName: "@openclaw/minimax-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw MiniMax provider and OAuth plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "minimax", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["minimax", "minimax-portal"], autoEnableWhenConfiguredProviders: ["minimax-portal"], legacyPluginIds: ["minimax-portal-auth"], 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", deprecatedChoiceIds: ["minimax", "minimax-api", "minimax-cloud", "minimax-api-lightning"], 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 ", 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", deprecatedChoiceIds: ["minimax-api-key-cn"], 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 ", cliDescription: "MiniMax API key", }, ], contracts: { mediaUnderstandingProviders: ["minimax", "minimax-portal"], imageGenerationProviders: ["minimax", "minimax-portal"], }, }, }, { dirName: "mistral", idHint: "mistral", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "media-understanding-provider.js", "model-definitions.js", "onboard.js", "provider-catalog.js", ], packageName: "@openclaw/mistral-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Mistral provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "mistral", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Mistral API key", }, ], contracts: { mediaUnderstandingProviders: ["mistral"], }, }, }, { dirName: "modelstudio", idHint: "modelstudio", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "model-definitions.js", "models.js", "onboard.js", "provider-catalog.js", ], packageName: "@openclaw/modelstudio-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Model Studio provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "modelstudio", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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 ", 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 ", 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 ", cliDescription: "Alibaba Cloud Model Studio Coding Plan API key (Global/Intl)", }, ], }, }, { dirName: "moonshot", idHint: "moonshot", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "media-understanding-provider.js", "onboard.js", "provider-catalog.js", "web-search-provider.js", ], packageName: "@openclaw/moonshot-provider", packageVersion: "2026.3.27", 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", }, }, }, }, }, enabledByDefault: true, 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 ", 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/msteams", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/nextcloud-talk", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/nostr", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "provider-catalog.js"], packageName: "@openclaw/nvidia-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw NVIDIA provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "nvidia", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["nvidia"], providerAuthEnvVars: { nvidia: ["NVIDIA_API_KEY"], }, }, }, { dirName: "ollama", idHint: "ollama", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/ollama-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Ollama provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "ollama", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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", }, publicSurfaceArtifacts: ["runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/open-prose", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "api.js", "cli-backend.js", "default-models.js", "image-generation-provider.js", "media-understanding-provider.js", "openai-codex-auth-identity.js", "openai-codex-catalog.js", "openai-codex-provider.js", "openai-codex-provider.runtime.js", "openai-provider.js", "shared.js", "speech-provider.js", "tts.js", ], packageName: "@openclaw/openai-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw OpenAI provider plugins", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "openai", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, providers: ["openai", "openai-codex"], cliBackends: ["codex-cli"], providerAuthEnvVars: { openai: ["OPENAI_API_KEY"], }, providerAuthChoices: [ { provider: "openai-codex", method: "oauth", choiceId: "openai-codex", deprecatedChoiceIds: ["codex-cli"], 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 ", cliDescription: "OpenAI API key", }, ], contracts: { speechProviders: ["openai"], mediaUnderstandingProviders: ["openai", "openai-codex"], imageGenerationProviders: ["openai"], }, }, }, { dirName: "opencode", idHint: "opencode", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "onboard.js"], packageName: "@openclaw/opencode-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw OpenCode Zen provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "opencode", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "OpenCode API key (Zen catalog)", }, ], }, }, { dirName: "opencode-go", idHint: "opencode-go", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "onboard.js"], packageName: "@openclaw/opencode-go-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw OpenCode Go provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "opencode-go", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "OpenCode API key (Go catalog)", }, ], }, }, { dirName: "openrouter", idHint: "openrouter", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "media-understanding-provider.js", "onboard.js", "provider-catalog.js", ], packageName: "@openclaw/openrouter-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw OpenRouter provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "openrouter", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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.27", 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", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/perplexity-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/qianfan-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Qianfan provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "qianfan", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "QIANFAN API key", }, ], }, }, { dirName: "sglang", idHint: "sglang", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "defaults.js", "models.js"], packageName: "@openclaw/sglang-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw SGLang provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "sglang", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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", }, publicSurfaceArtifacts: [ "api.js", "channel-config-api.js", "reaction-runtime-api.js", "runtime-api.js", ], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/signal", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "channel-config-api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/slack", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["setup-api.js"], packageName: "@openclaw/synology-chat", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/synthetic-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Synthetic provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "synthetic", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Synthetic API key", }, ], }, }, { dirName: "tavily", idHint: "tavily", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["web-search-provider.js"], packageName: "@openclaw/tavily-plugin", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: [ "allow-from.js", "api.js", "channel-config-api.js", "runtime-api.js", "update-offset-runtime-api.js", ], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/telegram", packageVersion: "2026.3.27", 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js", "setup-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/tlon", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/together-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Together provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "together", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Together AI API key", }, ], }, }, { dirName: "twitch", idHint: "twitch", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/twitch", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/venice-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Venice provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "venice", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Venice API key", }, ], }, }, { dirName: "vercel-ai-gateway", idHint: "vercel-ai-gateway", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "models.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/vercel-ai-gateway-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Vercel AI Gateway provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "vercel-ai-gateway", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Vercel AI Gateway API key", }, ], }, }, { dirName: "vllm", idHint: "vllm", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: ["api.js", "defaults.js", "models.js"], packageName: "@openclaw/vllm-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw vLLM provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "vllm", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js", "runtime-entry.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/voice-call", packageVersion: "2026.3.27", packageDescription: "OpenClaw voice-call plugin", packageManifest: { extensions: ["./index.ts"], install: { minHostVersion: ">=2026.3.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "models.js", "provider-catalog.js"], packageName: "@openclaw/volcengine-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Volcengine provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "volcengine", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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", }, publicSurfaceArtifacts: [ "action-runtime-api.js", "action-runtime.runtime.js", "api.js", "auth-presence.js", "channel-config-api.js", "light-runtime-api.js", "login-qr-api.js", "runtime-api.js", ], runtimeSidecarArtifacts: ["light-runtime-api.js", "runtime-api.js"], packageName: "@openclaw/whatsapp", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: [ "api.js", "model-definitions.js", "model-id.js", "onboard.js", "provider-catalog.js", "provider-models.js", "stream.js", "web-search.js", ], packageName: "@openclaw/xai-plugin", packageVersion: "2026.3.27", 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", }, }, }, }, }, enabledByDefault: true, 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "onboard.js", "provider-catalog.js"], packageName: "@openclaw/xiaomi-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Xiaomi provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "xiaomi", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", cliDescription: "Xiaomi API key", }, ], }, }, { dirName: "zai", idHint: "zai", source: { source: "./index.ts", built: "index.js", }, publicSurfaceArtifacts: [ "api.js", "detect.js", "media-understanding-provider.js", "model-definitions.js", "onboard.js", "runtime-api.js", ], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/zai-provider", packageVersion: "2026.3.27", packageDescription: "OpenClaw Z.AI provider plugin", packageManifest: { extensions: ["./index.ts"], }, manifest: { id: "zai", configSchema: { type: "object", additionalProperties: false, properties: {}, }, enabledByDefault: true, 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 ", 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 ", 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 ", 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 ", 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 ", 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/zalo", packageVersion: "2026.3.27", 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.27", }, }, 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", }, publicSurfaceArtifacts: ["api.js", "runtime-api.js"], runtimeSidecarArtifacts: ["runtime-api.js"], packageName: "@openclaw/zalouser", packageVersion: "2026.3.27", 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.27", }, }, 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;