vilvona 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/CHANGELOG.md +12331 -0
  2. package/LICENSE +24 -0
  3. package/README.md +314 -0
  4. package/THIRD_PARTY_NOTICES.md +37 -0
  5. package/docs/.i18n/README.md +81 -0
  6. package/docs/.i18n/ar-navigation.json +18 -0
  7. package/docs/.i18n/de-navigation.json +18 -0
  8. package/docs/.i18n/es-navigation.json +18 -0
  9. package/docs/.i18n/fr-navigation.json +18 -0
  10. package/docs/.i18n/glossary.ar.json +82 -0
  11. package/docs/.i18n/glossary.de.json +82 -0
  12. package/docs/.i18n/glossary.es.json +82 -0
  13. package/docs/.i18n/glossary.fa.json +82 -0
  14. package/docs/.i18n/glossary.fr.json +82 -0
  15. package/docs/.i18n/glossary.id.json +82 -0
  16. package/docs/.i18n/glossary.it.json +82 -0
  17. package/docs/.i18n/glossary.ja-JP.json +102 -0
  18. package/docs/.i18n/glossary.ko.json +82 -0
  19. package/docs/.i18n/glossary.nl.json +82 -0
  20. package/docs/.i18n/glossary.pl.json +82 -0
  21. package/docs/.i18n/glossary.pt-BR.json +82 -0
  22. package/docs/.i18n/glossary.th.json +82 -0
  23. package/docs/.i18n/glossary.tr.json +82 -0
  24. package/docs/.i18n/glossary.uk.json +82 -0
  25. package/docs/.i18n/glossary.vi.json +82 -0
  26. package/docs/.i18n/glossary.zh-CN.json +1182 -0
  27. package/docs/.i18n/glossary.zh-TW.json +162 -0
  28. package/docs/.i18n/id-navigation.json +18 -0
  29. package/docs/.i18n/it-navigation.json +18 -0
  30. package/docs/.i18n/ja-navigation.json +18 -0
  31. package/docs/.i18n/ko-navigation.json +18 -0
  32. package/docs/.i18n/pl-navigation.json +18 -0
  33. package/docs/.i18n/pt-BR-navigation.json +18 -0
  34. package/docs/.i18n/tr-navigation.json +18 -0
  35. package/docs/.i18n/translation-workflow.md +111 -0
  36. package/docs/.i18n/zh-Hans-navigation.json +552 -0
  37. package/docs/AGENTS.md +36 -0
  38. package/docs/agent-runtime-architecture.md +48 -0
  39. package/docs/announcements/bluebubbles-imessage.md +79 -0
  40. package/docs/auth-credential-semantics.md +124 -0
  41. package/docs/automation/auth-monitoring.md +11 -0
  42. package/docs/automation/clawflow.md +12 -0
  43. package/docs/automation/cron-jobs.md +569 -0
  44. package/docs/automation/cron-vs-heartbeat.md +11 -0
  45. package/docs/automation/gmail-pubsub.md +11 -0
  46. package/docs/automation/hooks.md +387 -0
  47. package/docs/automation/index.md +135 -0
  48. package/docs/automation/poll.md +12 -0
  49. package/docs/automation/standing-orders.md +250 -0
  50. package/docs/automation/taskflow.md +155 -0
  51. package/docs/automation/tasks.md +374 -0
  52. package/docs/automation/troubleshooting.md +12 -0
  53. package/docs/automation/webhook.md +12 -0
  54. package/docs/brave-search.md +11 -0
  55. package/docs/channels/access-groups.md +201 -0
  56. package/docs/channels/ambient-room-events.md +214 -0
  57. package/docs/channels/bot-loop-protection.md +131 -0
  58. package/docs/channels/broadcast-groups.md +472 -0
  59. package/docs/channels/channel-routing.md +162 -0
  60. package/docs/channels/clickclack.md +146 -0
  61. package/docs/channels/discord.md +1758 -0
  62. package/docs/channels/feishu.md +654 -0
  63. package/docs/channels/googlechat.md +286 -0
  64. package/docs/channels/group-messages.md +95 -0
  65. package/docs/channels/groups.md +610 -0
  66. package/docs/channels/imessage-from-bluebubbles.md +259 -0
  67. package/docs/channels/imessage.md +864 -0
  68. package/docs/channels/index.md +65 -0
  69. package/docs/channels/irc.md +253 -0
  70. package/docs/channels/line.md +243 -0
  71. package/docs/channels/location.md +71 -0
  72. package/docs/channels/matrix-migration.md +375 -0
  73. package/docs/channels/matrix-presentation.md +77 -0
  74. package/docs/channels/matrix-push-rules.md +150 -0
  75. package/docs/channels/matrix.md +935 -0
  76. package/docs/channels/mattermost.md +542 -0
  77. package/docs/channels/msteams.md +1097 -0
  78. package/docs/channels/nextcloud-talk.md +176 -0
  79. package/docs/channels/nostr.md +253 -0
  80. package/docs/channels/pairing.md +214 -0
  81. package/docs/channels/qqbot.md +317 -0
  82. package/docs/channels/signal.md +417 -0
  83. package/docs/channels/slack.md +1623 -0
  84. package/docs/channels/sms.md +380 -0
  85. package/docs/channels/synology-chat.md +187 -0
  86. package/docs/channels/telegram.md +1121 -0
  87. package/docs/channels/tlon.md +296 -0
  88. package/docs/channels/troubleshooting.md +162 -0
  89. package/docs/channels/twitch.md +431 -0
  90. package/docs/channels/wechat.md +171 -0
  91. package/docs/channels/whatsapp.md +796 -0
  92. package/docs/channels/yuanbao.md +416 -0
  93. package/docs/channels/zalo.md +253 -0
  94. package/docs/channels/zalouser.md +217 -0
  95. package/docs/ci.md +665 -0
  96. package/docs/clawhub/cli.md +82 -0
  97. package/docs/clawhub/publishing.md +96 -0
  98. package/docs/cli/acp.md +370 -0
  99. package/docs/cli/agent.md +109 -0
  100. package/docs/cli/agents.md +253 -0
  101. package/docs/cli/approvals.md +193 -0
  102. package/docs/cli/backup.md +98 -0
  103. package/docs/cli/browser.md +322 -0
  104. package/docs/cli/channels.md +154 -0
  105. package/docs/cli/clawbot.md +25 -0
  106. package/docs/cli/commitments.md +90 -0
  107. package/docs/cli/completion.md +39 -0
  108. package/docs/cli/config.md +504 -0
  109. package/docs/cli/configure.md +77 -0
  110. package/docs/cli/crestodian.md +337 -0
  111. package/docs/cli/cron.md +344 -0
  112. package/docs/cli/daemon.md +67 -0
  113. package/docs/cli/dashboard.md +33 -0
  114. package/docs/cli/devices.md +240 -0
  115. package/docs/cli/directory.md +68 -0
  116. package/docs/cli/dns.md +53 -0
  117. package/docs/cli/docs.md +63 -0
  118. package/docs/cli/doctor.md +254 -0
  119. package/docs/cli/flows.md +52 -0
  120. package/docs/cli/gateway.md +572 -0
  121. package/docs/cli/health.md +43 -0
  122. package/docs/cli/hooks.md +345 -0
  123. package/docs/cli/index.md +406 -0
  124. package/docs/cli/infer.md +364 -0
  125. package/docs/cli/logs.md +68 -0
  126. package/docs/cli/mcp.md +851 -0
  127. package/docs/cli/memory.md +183 -0
  128. package/docs/cli/message.md +317 -0
  129. package/docs/cli/migrate.md +334 -0
  130. package/docs/cli/models.md +239 -0
  131. package/docs/cli/node.md +178 -0
  132. package/docs/cli/nodes.md +76 -0
  133. package/docs/cli/onboard.md +251 -0
  134. package/docs/cli/pairing.md +77 -0
  135. package/docs/cli/path.md +511 -0
  136. package/docs/cli/plugins.md +480 -0
  137. package/docs/cli/policy.md +929 -0
  138. package/docs/cli/proxy.md +89 -0
  139. package/docs/cli/qr.md +56 -0
  140. package/docs/cli/reset.md +39 -0
  141. package/docs/cli/sandbox.md +208 -0
  142. package/docs/cli/secrets.md +202 -0
  143. package/docs/cli/security.md +135 -0
  144. package/docs/cli/sessions.md +178 -0
  145. package/docs/cli/setup.md +60 -0
  146. package/docs/cli/skills.md +156 -0
  147. package/docs/cli/status.md +45 -0
  148. package/docs/cli/system.md +89 -0
  149. package/docs/cli/tasks.md +111 -0
  150. package/docs/cli/transcripts.md +151 -0
  151. package/docs/cli/tui.md +92 -0
  152. package/docs/cli/uninstall.md +45 -0
  153. package/docs/cli/update.md +283 -0
  154. package/docs/cli/voicecall.md +204 -0
  155. package/docs/cli/webhooks.md +117 -0
  156. package/docs/cli/wiki.md +256 -0
  157. package/docs/cli/workboard.md +228 -0
  158. package/docs/concepts/active-memory.md +856 -0
  159. package/docs/concepts/agent-loop.md +185 -0
  160. package/docs/concepts/agent-runtimes.md +276 -0
  161. package/docs/concepts/agent-workspace.md +230 -0
  162. package/docs/concepts/agent.md +142 -0
  163. package/docs/concepts/architecture.md +154 -0
  164. package/docs/concepts/channel-docking.md +145 -0
  165. package/docs/concepts/commitments.md +150 -0
  166. package/docs/concepts/compaction.md +203 -0
  167. package/docs/concepts/context-engine.md +347 -0
  168. package/docs/concepts/context.md +199 -0
  169. package/docs/concepts/delegate-architecture.md +319 -0
  170. package/docs/concepts/dreaming.md +279 -0
  171. package/docs/concepts/experimental-features.md +111 -0
  172. package/docs/concepts/features.md +91 -0
  173. package/docs/concepts/mantis-slack-desktop-runbook.md +231 -0
  174. package/docs/concepts/mantis.md +744 -0
  175. package/docs/concepts/markdown-formatting.md +139 -0
  176. package/docs/concepts/memory-builtin.md +151 -0
  177. package/docs/concepts/memory-honcho.md +144 -0
  178. package/docs/concepts/memory-qmd.md +277 -0
  179. package/docs/concepts/memory-search.md +175 -0
  180. package/docs/concepts/memory.md +299 -0
  181. package/docs/concepts/message-lifecycle-refactor.md +1126 -0
  182. package/docs/concepts/messages.md +216 -0
  183. package/docs/concepts/model-failover.md +405 -0
  184. package/docs/concepts/model-providers.md +719 -0
  185. package/docs/concepts/models.md +371 -0
  186. package/docs/concepts/multi-agent.md +625 -0
  187. package/docs/concepts/oauth.md +218 -0
  188. package/docs/concepts/parallel-specialist-lanes.md +127 -0
  189. package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
  190. package/docs/concepts/presence.md +117 -0
  191. package/docs/concepts/progress-drafts.md +406 -0
  192. package/docs/concepts/qa-e2e-automation.md +979 -0
  193. package/docs/concepts/qa-matrix.md +139 -0
  194. package/docs/concepts/queue-steering.md +90 -0
  195. package/docs/concepts/queue.md +136 -0
  196. package/docs/concepts/retry.md +86 -0
  197. package/docs/concepts/session-pruning.md +104 -0
  198. package/docs/concepts/session-tool.md +201 -0
  199. package/docs/concepts/session.md +164 -0
  200. package/docs/concepts/soul.md +116 -0
  201. package/docs/concepts/streaming.md +258 -0
  202. package/docs/concepts/system-prompt.md +330 -0
  203. package/docs/concepts/timezone.md +47 -0
  204. package/docs/concepts/typebox.md +309 -0
  205. package/docs/concepts/typing-indicators.md +88 -0
  206. package/docs/concepts/usage-tracking.md +72 -0
  207. package/docs/date-time.md +126 -0
  208. package/docs/debug/node-issue.md +90 -0
  209. package/docs/diagnostics/flags.md +182 -0
  210. package/docs/docs.json +1885 -0
  211. package/docs/gateway/authentication.md +286 -0
  212. package/docs/gateway/background-process.md +147 -0
  213. package/docs/gateway/bonjour.md +303 -0
  214. package/docs/gateway/bridge-protocol.md +97 -0
  215. package/docs/gateway/cli-backends.md +463 -0
  216. package/docs/gateway/config-agents.md +1525 -0
  217. package/docs/gateway/config-channels.md +942 -0
  218. package/docs/gateway/config-tools.md +806 -0
  219. package/docs/gateway/configuration-examples.md +706 -0
  220. package/docs/gateway/configuration-reference.md +1449 -0
  221. package/docs/gateway/configuration.md +748 -0
  222. package/docs/gateway/diagnostics.md +213 -0
  223. package/docs/gateway/discovery.md +154 -0
  224. package/docs/gateway/doctor.md +576 -0
  225. package/docs/gateway/external-apps.md +86 -0
  226. package/docs/gateway/gateway-lock.md +37 -0
  227. package/docs/gateway/health.md +73 -0
  228. package/docs/gateway/heartbeat.md +498 -0
  229. package/docs/gateway/index.md +385 -0
  230. package/docs/gateway/local-model-services.md +205 -0
  231. package/docs/gateway/local-models.md +355 -0
  232. package/docs/gateway/logging.md +149 -0
  233. package/docs/gateway/multiple-gateways.md +178 -0
  234. package/docs/gateway/network-model.md +15 -0
  235. package/docs/gateway/openai-http-api.md +379 -0
  236. package/docs/gateway/openresponses-http-api.md +349 -0
  237. package/docs/gateway/openshell.md +316 -0
  238. package/docs/gateway/opentelemetry.md +440 -0
  239. package/docs/gateway/operator-scopes.md +119 -0
  240. package/docs/gateway/pairing.md +207 -0
  241. package/docs/gateway/prometheus.md +249 -0
  242. package/docs/gateway/protocol.md +839 -0
  243. package/docs/gateway/remote-gateway-readme.md +169 -0
  244. package/docs/gateway/remote.md +280 -0
  245. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +148 -0
  246. package/docs/gateway/sandboxing.md +546 -0
  247. package/docs/gateway/secrets-plan-contract.md +159 -0
  248. package/docs/gateway/secrets.md +805 -0
  249. package/docs/gateway/security/audit-checks.md +127 -0
  250. package/docs/gateway/security/exposure-runbook.md +212 -0
  251. package/docs/gateway/security/index.md +1344 -0
  252. package/docs/gateway/security/secure-file-operations.md +76 -0
  253. package/docs/gateway/security/shrinkwrap.md +111 -0
  254. package/docs/gateway/tailscale.md +180 -0
  255. package/docs/gateway/tools-invoke-http-api.md +175 -0
  256. package/docs/gateway/troubleshooting.md +881 -0
  257. package/docs/gateway/trusted-proxy-auth.md +483 -0
  258. package/docs/help/debugging.md +341 -0
  259. package/docs/help/environment.md +240 -0
  260. package/docs/help/faq-first-run.md +872 -0
  261. package/docs/help/faq-models.md +557 -0
  262. package/docs/help/faq.md +2115 -0
  263. package/docs/help/index.md +39 -0
  264. package/docs/help/scripts.md +56 -0
  265. package/docs/help/testing-live.md +592 -0
  266. package/docs/help/testing-updates-plugins.md +299 -0
  267. package/docs/help/testing.md +977 -0
  268. package/docs/help/troubleshooting.md +500 -0
  269. package/docs/index.md +196 -0
  270. package/docs/install/ansible.md +233 -0
  271. package/docs/install/azure.md +315 -0
  272. package/docs/install/bun.md +59 -0
  273. package/docs/install/clawdock.md +112 -0
  274. package/docs/install/development-channels.md +148 -0
  275. package/docs/install/digitalocean.md +174 -0
  276. package/docs/install/docker-vm-runtime.md +154 -0
  277. package/docs/install/docker.md +564 -0
  278. package/docs/install/exe-dev.md +201 -0
  279. package/docs/install/fly.md +524 -0
  280. package/docs/install/gcp.md +418 -0
  281. package/docs/install/hetzner.md +285 -0
  282. package/docs/install/hostinger.md +98 -0
  283. package/docs/install/index.md +236 -0
  284. package/docs/install/installer.md +447 -0
  285. package/docs/install/kubernetes.md +196 -0
  286. package/docs/install/macos-vm.md +281 -0
  287. package/docs/install/migrating-claude.md +165 -0
  288. package/docs/install/migrating-hermes.md +178 -0
  289. package/docs/install/migrating.md +137 -0
  290. package/docs/install/nix.md +112 -0
  291. package/docs/install/node.md +142 -0
  292. package/docs/install/northflank.mdx +44 -0
  293. package/docs/install/oracle.md +218 -0
  294. package/docs/install/podman.md +216 -0
  295. package/docs/install/railway.mdx +92 -0
  296. package/docs/install/raspberry-pi.md +234 -0
  297. package/docs/install/render.mdx +167 -0
  298. package/docs/install/uninstall.md +140 -0
  299. package/docs/install/updating.md +284 -0
  300. package/docs/install/upstash.md +96 -0
  301. package/docs/logging.md +322 -0
  302. package/docs/maturity-scores.yaml +5361 -0
  303. package/docs/nav-tabs-underline.js +104 -0
  304. package/docs/network.md +72 -0
  305. package/docs/nodes/audio.md +216 -0
  306. package/docs/nodes/camera.md +166 -0
  307. package/docs/nodes/images.md +77 -0
  308. package/docs/nodes/index.md +444 -0
  309. package/docs/nodes/location-command.md +102 -0
  310. package/docs/nodes/media-understanding.md +495 -0
  311. package/docs/nodes/talk.md +160 -0
  312. package/docs/nodes/troubleshooting.md +123 -0
  313. package/docs/nodes/voicewake.md +93 -0
  314. package/docs/openclaw-agent-runtime.md +82 -0
  315. package/docs/perplexity.md +11 -0
  316. package/docs/plan/codex-context-engine-harness.md +624 -0
  317. package/docs/plan/ui-channels.md +284 -0
  318. package/docs/platforms/android.md +286 -0
  319. package/docs/platforms/digitalocean.md +12 -0
  320. package/docs/platforms/easyrunner.md +109 -0
  321. package/docs/platforms/index.md +65 -0
  322. package/docs/platforms/ios.md +287 -0
  323. package/docs/platforms/linux.md +141 -0
  324. package/docs/platforms/mac/bundled-gateway.md +79 -0
  325. package/docs/platforms/mac/canvas.md +128 -0
  326. package/docs/platforms/mac/child-process.md +72 -0
  327. package/docs/platforms/mac/dev-setup.md +112 -0
  328. package/docs/platforms/mac/health.md +39 -0
  329. package/docs/platforms/mac/icon.md +36 -0
  330. package/docs/platforms/mac/logging.md +62 -0
  331. package/docs/platforms/mac/menu-bar.md +93 -0
  332. package/docs/platforms/mac/peekaboo.md +96 -0
  333. package/docs/platforms/mac/permissions.md +73 -0
  334. package/docs/platforms/mac/remote.md +123 -0
  335. package/docs/platforms/mac/signing.md +52 -0
  336. package/docs/platforms/mac/skills.md +45 -0
  337. package/docs/platforms/mac/voice-overlay.md +66 -0
  338. package/docs/platforms/mac/voicewake.md +79 -0
  339. package/docs/platforms/mac/webchat.md +54 -0
  340. package/docs/platforms/mac/xpc.md +66 -0
  341. package/docs/platforms/macos.md +228 -0
  342. package/docs/platforms/oracle.md +12 -0
  343. package/docs/platforms/raspberry-pi.md +13 -0
  344. package/docs/platforms/windows.md +304 -0
  345. package/docs/plugins/adding-capabilities.md +146 -0
  346. package/docs/plugins/admin-http-rpc.md +216 -0
  347. package/docs/plugins/agent-tools.md +13 -0
  348. package/docs/plugins/architecture-internals.md +1203 -0
  349. package/docs/plugins/architecture.md +483 -0
  350. package/docs/plugins/building-extensions.md +13 -0
  351. package/docs/plugins/building-plugins.md +343 -0
  352. package/docs/plugins/bundles.md +310 -0
  353. package/docs/plugins/cli-backend-plugins.md +328 -0
  354. package/docs/plugins/codex-computer-use.md +297 -0
  355. package/docs/plugins/codex-harness-reference.md +480 -0
  356. package/docs/plugins/codex-harness-runtime.md +268 -0
  357. package/docs/plugins/codex-harness.md +800 -0
  358. package/docs/plugins/codex-native-plugins.md +280 -0
  359. package/docs/plugins/community.md +77 -0
  360. package/docs/plugins/compatibility.md +198 -0
  361. package/docs/plugins/copilot.md +355 -0
  362. package/docs/plugins/dependency-resolution.md +176 -0
  363. package/docs/plugins/google-meet.md +1737 -0
  364. package/docs/plugins/hooks.md +525 -0
  365. package/docs/plugins/install-overrides.md +80 -0
  366. package/docs/plugins/llama-cpp.md +58 -0
  367. package/docs/plugins/manage-plugins.md +214 -0
  368. package/docs/plugins/manifest.md +1468 -0
  369. package/docs/plugins/memory-lancedb.md +385 -0
  370. package/docs/plugins/memory-wiki.md +529 -0
  371. package/docs/plugins/message-presentation.md +487 -0
  372. package/docs/plugins/oc-path.md +166 -0
  373. package/docs/plugins/plugin-inventory.md +318 -0
  374. package/docs/plugins/plugin-permission-requests.md +193 -0
  375. package/docs/plugins/reference/acpx.md +23 -0
  376. package/docs/plugins/reference/admin-http-rpc.md +23 -0
  377. package/docs/plugins/reference/alibaba.md +23 -0
  378. package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
  379. package/docs/plugins/reference/amazon-bedrock.md +23 -0
  380. package/docs/plugins/reference/anthropic-vertex.md +29 -0
  381. package/docs/plugins/reference/anthropic.md +23 -0
  382. package/docs/plugins/reference/arcee.md +23 -0
  383. package/docs/plugins/reference/azure-speech.md +23 -0
  384. package/docs/plugins/reference/bonjour.md +19 -0
  385. package/docs/plugins/reference/brave.md +23 -0
  386. package/docs/plugins/reference/browser.md +23 -0
  387. package/docs/plugins/reference/byteplus.md +19 -0
  388. package/docs/plugins/reference/canvas.md +19 -0
  389. package/docs/plugins/reference/cerebras.md +23 -0
  390. package/docs/plugins/reference/chutes.md +23 -0
  391. package/docs/plugins/reference/clickclack.md +23 -0
  392. package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
  393. package/docs/plugins/reference/codex-supervisor.md +27 -0
  394. package/docs/plugins/reference/codex.md +23 -0
  395. package/docs/plugins/reference/comfy.md +23 -0
  396. package/docs/plugins/reference/copilot-proxy.md +19 -0
  397. package/docs/plugins/reference/copilot.md +23 -0
  398. package/docs/plugins/reference/deepgram.md +23 -0
  399. package/docs/plugins/reference/deepinfra.md +23 -0
  400. package/docs/plugins/reference/deepseek.md +23 -0
  401. package/docs/plugins/reference/diagnostics-otel.md +19 -0
  402. package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
  403. package/docs/plugins/reference/diffs-language-pack.md +31 -0
  404. package/docs/plugins/reference/diffs.md +19 -0
  405. package/docs/plugins/reference/discord.md +23 -0
  406. package/docs/plugins/reference/document-extract.md +23 -0
  407. package/docs/plugins/reference/duckduckgo.md +23 -0
  408. package/docs/plugins/reference/elevenlabs.md +23 -0
  409. package/docs/plugins/reference/exa.md +23 -0
  410. package/docs/plugins/reference/fal.md +23 -0
  411. package/docs/plugins/reference/feishu.md +23 -0
  412. package/docs/plugins/reference/file-transfer.md +19 -0
  413. package/docs/plugins/reference/firecrawl.md +23 -0
  414. package/docs/plugins/reference/fireworks.md +23 -0
  415. package/docs/plugins/reference/github-copilot.md +23 -0
  416. package/docs/plugins/reference/gmi.md +23 -0
  417. package/docs/plugins/reference/google-meet.md +23 -0
  418. package/docs/plugins/reference/google.md +23 -0
  419. package/docs/plugins/reference/googlechat.md +23 -0
  420. package/docs/plugins/reference/gradium.md +23 -0
  421. package/docs/plugins/reference/groq.md +23 -0
  422. package/docs/plugins/reference/huggingface.md +23 -0
  423. package/docs/plugins/reference/imessage.md +23 -0
  424. package/docs/plugins/reference/inworld.md +23 -0
  425. package/docs/plugins/reference/irc.md +23 -0
  426. package/docs/plugins/reference/kilocode.md +23 -0
  427. package/docs/plugins/reference/kimi.md +23 -0
  428. package/docs/plugins/reference/line.md +23 -0
  429. package/docs/plugins/reference/litellm.md +23 -0
  430. package/docs/plugins/reference/llama-cpp.md +23 -0
  431. package/docs/plugins/reference/llm-task.md +19 -0
  432. package/docs/plugins/reference/lmstudio.md +23 -0
  433. package/docs/plugins/reference/lobster.md +19 -0
  434. package/docs/plugins/reference/matrix.md +23 -0
  435. package/docs/plugins/reference/mattermost.md +23 -0
  436. package/docs/plugins/reference/memory-core.md +19 -0
  437. package/docs/plugins/reference/memory-lancedb.md +23 -0
  438. package/docs/plugins/reference/memory-wiki.md +23 -0
  439. package/docs/plugins/reference/microsoft-foundry.md +113 -0
  440. package/docs/plugins/reference/microsoft.md +19 -0
  441. package/docs/plugins/reference/migrate-claude.md +19 -0
  442. package/docs/plugins/reference/migrate-hermes.md +19 -0
  443. package/docs/plugins/reference/minimax.md +23 -0
  444. package/docs/plugins/reference/mistral.md +23 -0
  445. package/docs/plugins/reference/moonshot.md +23 -0
  446. package/docs/plugins/reference/msteams.md +23 -0
  447. package/docs/plugins/reference/nextcloud-talk.md +23 -0
  448. package/docs/plugins/reference/nostr.md +23 -0
  449. package/docs/plugins/reference/novita.md +23 -0
  450. package/docs/plugins/reference/nvidia.md +23 -0
  451. package/docs/plugins/reference/oc-path.md +23 -0
  452. package/docs/plugins/reference/ollama.md +24 -0
  453. package/docs/plugins/reference/open-prose.md +19 -0
  454. package/docs/plugins/reference/openai.md +23 -0
  455. package/docs/plugins/reference/opencode-go.md +23 -0
  456. package/docs/plugins/reference/opencode.md +23 -0
  457. package/docs/plugins/reference/openrouter.md +23 -0
  458. package/docs/plugins/reference/openshell.md +19 -0
  459. package/docs/plugins/reference/perplexity.md +23 -0
  460. package/docs/plugins/reference/pixverse.md +23 -0
  461. package/docs/plugins/reference/policy.md +79 -0
  462. package/docs/plugins/reference/qa-channel.md +23 -0
  463. package/docs/plugins/reference/qa-lab.md +19 -0
  464. package/docs/plugins/reference/qa-matrix.md +19 -0
  465. package/docs/plugins/reference/qianfan.md +23 -0
  466. package/docs/plugins/reference/qqbot.md +23 -0
  467. package/docs/plugins/reference/qwen.md +24 -0
  468. package/docs/plugins/reference/runway.md +23 -0
  469. package/docs/plugins/reference/searxng.md +19 -0
  470. package/docs/plugins/reference/senseaudio.md +23 -0
  471. package/docs/plugins/reference/sglang.md +23 -0
  472. package/docs/plugins/reference/signal.md +23 -0
  473. package/docs/plugins/reference/slack.md +23 -0
  474. package/docs/plugins/reference/sms.md +23 -0
  475. package/docs/plugins/reference/stepfun.md +23 -0
  476. package/docs/plugins/reference/synology-chat.md +23 -0
  477. package/docs/plugins/reference/synthetic.md +23 -0
  478. package/docs/plugins/reference/tavily.md +23 -0
  479. package/docs/plugins/reference/telegram.md +23 -0
  480. package/docs/plugins/reference/tencent.md +23 -0
  481. package/docs/plugins/reference/tlon.md +23 -0
  482. package/docs/plugins/reference/together.md +23 -0
  483. package/docs/plugins/reference/tokenjuice.md +23 -0
  484. package/docs/plugins/reference/tts-local-cli.md +19 -0
  485. package/docs/plugins/reference/twitch.md +23 -0
  486. package/docs/plugins/reference/venice.md +23 -0
  487. package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
  488. package/docs/plugins/reference/vllm.md +23 -0
  489. package/docs/plugins/reference/voice-call.md +23 -0
  490. package/docs/plugins/reference/volcengine.md +23 -0
  491. package/docs/plugins/reference/voyage.md +19 -0
  492. package/docs/plugins/reference/vydra.md +23 -0
  493. package/docs/plugins/reference/web-readability.md +19 -0
  494. package/docs/plugins/reference/webhooks.md +23 -0
  495. package/docs/plugins/reference/whatsapp.md +23 -0
  496. package/docs/plugins/reference/workboard.md +23 -0
  497. package/docs/plugins/reference/xai.md +23 -0
  498. package/docs/plugins/reference/xiaomi.md +23 -0
  499. package/docs/plugins/reference/zai.md +23 -0
  500. package/docs/plugins/reference/zalo.md +23 -0
  501. package/docs/plugins/reference/zalouser.md +24 -0
  502. package/docs/plugins/reference.md +19 -0
  503. package/docs/plugins/sdk-agent-harness.md +339 -0
  504. package/docs/plugins/sdk-channel-inbound.md +70 -0
  505. package/docs/plugins/sdk-channel-ingress.md +137 -0
  506. package/docs/plugins/sdk-channel-message.md +18 -0
  507. package/docs/plugins/sdk-channel-outbound.md +113 -0
  508. package/docs/plugins/sdk-channel-plugins.md +770 -0
  509. package/docs/plugins/sdk-channel-turn.md +9 -0
  510. package/docs/plugins/sdk-entrypoints.md +344 -0
  511. package/docs/plugins/sdk-migration.md +1011 -0
  512. package/docs/plugins/sdk-overview.md +525 -0
  513. package/docs/plugins/sdk-provider-plugins.md +1019 -0
  514. package/docs/plugins/sdk-runtime.md +683 -0
  515. package/docs/plugins/sdk-setup.md +550 -0
  516. package/docs/plugins/sdk-subpaths.md +401 -0
  517. package/docs/plugins/sdk-testing.md +403 -0
  518. package/docs/plugins/tool-plugins.md +411 -0
  519. package/docs/plugins/voice-call.md +942 -0
  520. package/docs/plugins/webhooks.md +192 -0
  521. package/docs/plugins/workboard.md +402 -0
  522. package/docs/plugins/zalouser.md +86 -0
  523. package/docs/prose.md +191 -0
  524. package/docs/providers/alibaba.md +158 -0
  525. package/docs/providers/anthropic.md +386 -0
  526. package/docs/providers/arcee.md +144 -0
  527. package/docs/providers/azure-speech.md +119 -0
  528. package/docs/providers/bedrock-mantle.md +224 -0
  529. package/docs/providers/bedrock.md +433 -0
  530. package/docs/providers/cerebras.md +130 -0
  531. package/docs/providers/chutes.md +153 -0
  532. package/docs/providers/claude-max-api-proxy.md +191 -0
  533. package/docs/providers/cloudflare-ai-gateway.md +119 -0
  534. package/docs/providers/comfy.md +362 -0
  535. package/docs/providers/deepgram.md +184 -0
  536. package/docs/providers/deepinfra.md +92 -0
  537. package/docs/providers/deepseek.md +146 -0
  538. package/docs/providers/ds4.md +309 -0
  539. package/docs/providers/elevenlabs.md +130 -0
  540. package/docs/providers/fal.md +240 -0
  541. package/docs/providers/fireworks.md +144 -0
  542. package/docs/providers/github-copilot.md +257 -0
  543. package/docs/providers/gmi.md +92 -0
  544. package/docs/providers/google.md +472 -0
  545. package/docs/providers/gradium.md +123 -0
  546. package/docs/providers/groq.md +171 -0
  547. package/docs/providers/huggingface.md +235 -0
  548. package/docs/providers/index.md +105 -0
  549. package/docs/providers/inferrs.md +272 -0
  550. package/docs/providers/inworld.md +120 -0
  551. package/docs/providers/kilocode.md +135 -0
  552. package/docs/providers/litellm.md +234 -0
  553. package/docs/providers/lmstudio.md +224 -0
  554. package/docs/providers/minimax.md +518 -0
  555. package/docs/providers/mistral.md +235 -0
  556. package/docs/providers/models.md +64 -0
  557. package/docs/providers/moonshot.md +413 -0
  558. package/docs/providers/novita.md +92 -0
  559. package/docs/providers/nvidia.md +208 -0
  560. package/docs/providers/ollama-cloud.md +115 -0
  561. package/docs/providers/ollama.md +1225 -0
  562. package/docs/providers/openai.md +1091 -0
  563. package/docs/providers/opencode-go.md +123 -0
  564. package/docs/providers/opencode.md +149 -0
  565. package/docs/providers/openrouter.md +390 -0
  566. package/docs/providers/perplexity-provider.md +123 -0
  567. package/docs/providers/pixverse.md +165 -0
  568. package/docs/providers/qianfan.md +132 -0
  569. package/docs/providers/qwen-oauth.md +115 -0
  570. package/docs/providers/qwen.md +364 -0
  571. package/docs/providers/runway.md +103 -0
  572. package/docs/providers/senseaudio.md +68 -0
  573. package/docs/providers/sglang.md +161 -0
  574. package/docs/providers/stepfun.md +229 -0
  575. package/docs/providers/synthetic.md +154 -0
  576. package/docs/providers/tencent.md +130 -0
  577. package/docs/providers/together.md +140 -0
  578. package/docs/providers/venice.md +312 -0
  579. package/docs/providers/vercel-ai-gateway.md +128 -0
  580. package/docs/providers/vllm.md +407 -0
  581. package/docs/providers/volcengine.md +199 -0
  582. package/docs/providers/vydra.md +180 -0
  583. package/docs/providers/xai.md +571 -0
  584. package/docs/providers/xiaomi.md +286 -0
  585. package/docs/providers/zai.md +224 -0
  586. package/docs/refactor/access.md +9 -0
  587. package/docs/refactor/acp.md +298 -0
  588. package/docs/refactor/canvas.md +131 -0
  589. package/docs/refactor/database-first.md +2263 -0
  590. package/docs/refactor/ingress-core.md +341 -0
  591. package/docs/reference/AGENTS.default.md +131 -0
  592. package/docs/reference/RELEASING.md +844 -0
  593. package/docs/reference/api-usage-costs.md +208 -0
  594. package/docs/reference/application-modernization-plan.md +208 -0
  595. package/docs/reference/code-mode.md +1058 -0
  596. package/docs/reference/credits.md +33 -0
  597. package/docs/reference/device-models.md +50 -0
  598. package/docs/reference/full-release-validation.md +206 -0
  599. package/docs/reference/memory-config.md +630 -0
  600. package/docs/reference/prompt-caching.md +358 -0
  601. package/docs/reference/release-performance-sweep.md +347 -0
  602. package/docs/reference/rich-output-protocol.md +93 -0
  603. package/docs/reference/rpc.md +43 -0
  604. package/docs/reference/secret-placeholder-conventions.md +33 -0
  605. package/docs/reference/secretref-credential-surface.md +163 -0
  606. package/docs/reference/secretref-user-supplied-credentials-matrix.json +691 -0
  607. package/docs/reference/session-management-compaction.md +474 -0
  608. package/docs/reference/templates/AGENTS.dev.md +90 -0
  609. package/docs/reference/templates/AGENTS.md +227 -0
  610. package/docs/reference/templates/BOOT.md +16 -0
  611. package/docs/reference/templates/BOOTSTRAP.md +66 -0
  612. package/docs/reference/templates/HEARTBEAT.md +24 -0
  613. package/docs/reference/templates/IDENTITY.dev.md +52 -0
  614. package/docs/reference/templates/IDENTITY.md +34 -0
  615. package/docs/reference/templates/SOUL.dev.md +82 -0
  616. package/docs/reference/templates/SOUL.md +49 -0
  617. package/docs/reference/templates/TOOLS.dev.md +29 -0
  618. package/docs/reference/templates/TOOLS.md +51 -0
  619. package/docs/reference/templates/USER.dev.md +23 -0
  620. package/docs/reference/templates/USER.md +28 -0
  621. package/docs/reference/test.md +248 -0
  622. package/docs/reference/token-use.md +246 -0
  623. package/docs/reference/transcript-hygiene.md +226 -0
  624. package/docs/reference/wizard.md +252 -0
  625. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
  626. package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
  627. package/docs/security/formal-verification.md +170 -0
  628. package/docs/security/incident-response.md +59 -0
  629. package/docs/security/network-proxy.md +268 -0
  630. package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
  631. package/docs/snippets/plugin-publish/minimal-package.json +16 -0
  632. package/docs/specs/claw-supervisor.md +247 -0
  633. package/docs/start/bootstrapping.md +49 -0
  634. package/docs/start/docs-directory.md +69 -0
  635. package/docs/start/getting-started.md +152 -0
  636. package/docs/start/hubs.md +201 -0
  637. package/docs/start/lore.md +223 -0
  638. package/docs/start/onboarding-overview.md +72 -0
  639. package/docs/start/onboarding.md +98 -0
  640. package/docs/start/openclaw.md +246 -0
  641. package/docs/start/quickstart.md +25 -0
  642. package/docs/start/setup.md +178 -0
  643. package/docs/start/showcase.md +371 -0
  644. package/docs/start/wizard-cli-automation.md +232 -0
  645. package/docs/start/wizard-cli-reference.md +331 -0
  646. package/docs/start/wizard.md +142 -0
  647. package/docs/style.css +137 -0
  648. package/docs/tools/acp-agents-setup.md +356 -0
  649. package/docs/tools/acp-agents.md +865 -0
  650. package/docs/tools/agent-send.md +130 -0
  651. package/docs/tools/apply-patch.md +64 -0
  652. package/docs/tools/brave-search.md +139 -0
  653. package/docs/tools/browser-control.md +405 -0
  654. package/docs/tools/browser-linux-troubleshooting.md +173 -0
  655. package/docs/tools/browser-login.md +77 -0
  656. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
  657. package/docs/tools/browser.md +866 -0
  658. package/docs/tools/btw.md +159 -0
  659. package/docs/tools/capability-cookbook.md +12 -0
  660. package/docs/tools/clawhub.md +5 -0
  661. package/docs/tools/code-execution.md +173 -0
  662. package/docs/tools/creating-skills.md +271 -0
  663. package/docs/tools/diffs.md +527 -0
  664. package/docs/tools/duckduckgo-search.md +109 -0
  665. package/docs/tools/elevated.md +128 -0
  666. package/docs/tools/exa-search.md +152 -0
  667. package/docs/tools/exec-approvals-advanced.md +457 -0
  668. package/docs/tools/exec-approvals.md +520 -0
  669. package/docs/tools/exec.md +294 -0
  670. package/docs/tools/firecrawl.md +155 -0
  671. package/docs/tools/gemini-search.md +114 -0
  672. package/docs/tools/goal.md +217 -0
  673. package/docs/tools/grok-search.md +129 -0
  674. package/docs/tools/image-generation.md +538 -0
  675. package/docs/tools/index.md +176 -0
  676. package/docs/tools/kimi-search.md +105 -0
  677. package/docs/tools/llm-task.md +137 -0
  678. package/docs/tools/lobster.md +365 -0
  679. package/docs/tools/loop-detection.md +154 -0
  680. package/docs/tools/media-overview.md +161 -0
  681. package/docs/tools/minimax-search.md +102 -0
  682. package/docs/tools/multi-agent-sandbox-tools.md +409 -0
  683. package/docs/tools/music-generation.md +372 -0
  684. package/docs/tools/ollama-search.md +153 -0
  685. package/docs/tools/parallel-search.md +154 -0
  686. package/docs/tools/pdf.md +213 -0
  687. package/docs/tools/permission-modes.md +111 -0
  688. package/docs/tools/perplexity-search.md +220 -0
  689. package/docs/tools/plugin.md +378 -0
  690. package/docs/tools/reactions.md +100 -0
  691. package/docs/tools/searxng-search.md +141 -0
  692. package/docs/tools/skill-workshop.md +283 -0
  693. package/docs/tools/skills-config.md +457 -0
  694. package/docs/tools/skills.md +591 -0
  695. package/docs/tools/slash-commands.md +518 -0
  696. package/docs/tools/steer.md +77 -0
  697. package/docs/tools/subagents.md +652 -0
  698. package/docs/tools/tavily.md +162 -0
  699. package/docs/tools/thinking.md +142 -0
  700. package/docs/tools/tokenjuice.md +84 -0
  701. package/docs/tools/tool-search.md +269 -0
  702. package/docs/tools/trajectory.md +229 -0
  703. package/docs/tools/tts.md +1013 -0
  704. package/docs/tools/video-generation.md +555 -0
  705. package/docs/tools/web-fetch.md +210 -0
  706. package/docs/tools/web.md +476 -0
  707. package/docs/tts.md +11 -0
  708. package/docs/vps.md +139 -0
  709. package/docs/web/control-ui.md +530 -0
  710. package/docs/web/dashboard.md +107 -0
  711. package/docs/web/index.md +133 -0
  712. package/docs/web/tui.md +258 -0
  713. package/docs/web/webchat.md +102 -0
  714. package/npm-shrinkwrap.json +3485 -0
  715. package/openclaw.mjs +661 -0
  716. package/package.json +1971 -0
  717. package/patches/.gitkeep +0 -0
  718. package/patches/@agentclientprotocol__claude-agent-acp@0.39.0.patch +40 -0
  719. package/pnpm-workspace.yaml +124 -0
  720. package/scripts/crabbox-wrapper.mjs +2470 -0
  721. package/scripts/lib/official-external-channel-catalog.json +570 -0
  722. package/scripts/lib/official-external-plugin-catalog.json +284 -0
  723. package/scripts/lib/official-external-provider-catalog.json +158 -0
  724. package/scripts/lib/package-dist-imports.mjs +174 -0
  725. package/scripts/npm-runner.mjs +95 -0
  726. package/scripts/postinstall-bundled-plugins.mjs +978 -0
  727. package/scripts/preinstall-package-manager-warning.mjs +74 -0
  728. package/scripts/prepare-git-hooks.mjs +73 -0
  729. package/scripts/windows-cmd-helpers.mjs +29 -0
  730. package/skills/1password/SKILL.md +70 -0
  731. package/skills/1password/references/cli-examples.md +29 -0
  732. package/skills/1password/references/get-started.md +17 -0
  733. package/skills/apple-notes/SKILL.md +77 -0
  734. package/skills/apple-reminders/SKILL.md +118 -0
  735. package/skills/bear-notes/SKILL.md +107 -0
  736. package/skills/blogwatcher/SKILL.md +69 -0
  737. package/skills/blucli/SKILL.md +47 -0
  738. package/skills/camsnap/SKILL.md +45 -0
  739. package/skills/canvas/SKILL.md +78 -0
  740. package/skills/clawhub/SKILL.md +77 -0
  741. package/skills/coding-agent/SKILL.md +143 -0
  742. package/skills/diagram-maker/SKILL.md +53 -0
  743. package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
  744. package/skills/diagram-maker/references/svg-template.md +112 -0
  745. package/skills/discord/SKILL.md +136 -0
  746. package/skills/eightctl/SKILL.md +50 -0
  747. package/skills/gemini/SKILL.md +47 -0
  748. package/skills/gh-issues/SKILL.md +213 -0
  749. package/skills/gifgrep/SKILL.md +85 -0
  750. package/skills/github/SKILL.md +84 -0
  751. package/skills/gog/SKILL.md +116 -0
  752. package/skills/goplaces/SKILL.md +52 -0
  753. package/skills/healthcheck/SKILL.md +105 -0
  754. package/skills/himalaya/SKILL.md +80 -0
  755. package/skills/himalaya/references/configuration.md +184 -0
  756. package/skills/himalaya/references/message-composition.md +199 -0
  757. package/skills/imsg/SKILL.md +122 -0
  758. package/skills/mcporter/SKILL.md +61 -0
  759. package/skills/meme-maker/SKILL.md +42 -0
  760. package/skills/meme-maker/references/templates.json +358 -0
  761. package/skills/meme-maker/scripts/meme.mjs +398 -0
  762. package/skills/model-usage/SKILL.md +71 -0
  763. package/skills/model-usage/references/codexbar-cli.md +33 -0
  764. package/skills/model-usage/scripts/model_usage.py +319 -0
  765. package/skills/model-usage/scripts/test_model_usage.py +40 -0
  766. package/skills/nano-pdf/SKILL.md +38 -0
  767. package/skills/node-connect/SKILL.md +143 -0
  768. package/skills/node-inspect-debugger/SKILL.md +85 -0
  769. package/skills/notion/SKILL.md +150 -0
  770. package/skills/obsidian/SKILL.md +119 -0
  771. package/skills/openai-whisper/SKILL.md +38 -0
  772. package/skills/openai-whisper-api/SKILL.md +71 -0
  773. package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
  774. package/skills/openhue/SKILL.md +112 -0
  775. package/skills/oracle/SKILL.md +126 -0
  776. package/skills/ordercli/SKILL.md +78 -0
  777. package/skills/peekaboo/SKILL.md +198 -0
  778. package/skills/pyproject.toml +10 -0
  779. package/skills/python-debugpy/SKILL.md +73 -0
  780. package/skills/sag/SKILL.md +87 -0
  781. package/skills/session-logs/SKILL.md +151 -0
  782. package/skills/sherpa-onnx-tts/SKILL.md +109 -0
  783. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  784. package/skills/skill-creator/SKILL.md +78 -0
  785. package/skills/skill-creator/license.txt +202 -0
  786. package/skills/skill-creator/scripts/init_skill.py +378 -0
  787. package/skills/skill-creator/scripts/package_skill.py +144 -0
  788. package/skills/skill-creator/scripts/quick_validate.py +169 -0
  789. package/skills/skill-creator/scripts/test_package_skill.py +199 -0
  790. package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
  791. package/skills/slack/SKILL.md +78 -0
  792. package/skills/songsee/SKILL.md +49 -0
  793. package/skills/sonoscli/SKILL.md +65 -0
  794. package/skills/spike/SKILL.md +51 -0
  795. package/skills/spotify-player/SKILL.md +64 -0
  796. package/skills/summarize/SKILL.md +87 -0
  797. package/skills/taskflow/SKILL.md +149 -0
  798. package/skills/taskflow/examples/inbox-triage.lobster +33 -0
  799. package/skills/taskflow/examples/pr-intake.lobster +32 -0
  800. package/skills/taskflow-inbox-triage/SKILL.md +119 -0
  801. package/skills/things-mac/SKILL.md +86 -0
  802. package/skills/tmux/SKILL.md +91 -0
  803. package/skills/tmux/scripts/find-sessions.sh +112 -0
  804. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  805. package/skills/trello/SKILL.md +108 -0
  806. package/skills/video-frames/SKILL.md +46 -0
  807. package/skills/video-frames/scripts/frame.sh +81 -0
  808. package/skills/voice-call/SKILL.md +45 -0
  809. package/skills/wacli/SKILL.md +72 -0
  810. package/skills/weather/SKILL.md +87 -0
  811. package/skills/xurl/SKILL.md +120 -0
  812. package/src/agents/templates/HEARTBEAT.md +5 -0
@@ -0,0 +1,1468 @@
1
+ ---
2
+ summary: "Plugin manifest + JSON schema requirements (strict config validation)"
3
+ read_when:
4
+ - You are building an OpenClaw plugin
5
+ - You need to ship a plugin config schema or debug plugin validation errors
6
+ title: "Plugin manifest"
7
+ ---
8
+
9
+ This page is for the **native OpenClaw plugin manifest** only.
10
+
11
+ For compatible bundle layouts, see [Plugin bundles](/plugins/bundles).
12
+
13
+ Compatible bundle formats use different manifest files:
14
+
15
+ - Codex bundle: `.codex-plugin/plugin.json`
16
+ - Claude bundle: `.claude-plugin/plugin.json` or the default Claude component
17
+ layout without a manifest
18
+ - Cursor bundle: `.cursor-plugin/plugin.json`
19
+
20
+ OpenClaw auto-detects those bundle layouts too, but they are not validated
21
+ against the `openclaw.plugin.json` schema described here.
22
+
23
+ For compatible bundles, OpenClaw currently reads bundle metadata plus declared
24
+ skill roots, Claude command roots, Claude bundle `settings.json` defaults,
25
+ Claude bundle LSP defaults, and supported hook packs when the layout matches
26
+ OpenClaw runtime expectations.
27
+
28
+ Every native OpenClaw plugin **must** ship a `openclaw.plugin.json` file in the
29
+ **plugin root**. OpenClaw uses this manifest to validate configuration
30
+ **without executing plugin code**. Missing or invalid manifests are treated as
31
+ plugin errors and block config validation.
32
+
33
+ See the full plugin system guide: [Plugins](/tools/plugin).
34
+ For the native capability model and current external-compatibility guidance:
35
+ [Capability model](/plugins/architecture#public-capability-model).
36
+
37
+ ## What this file does
38
+
39
+ `openclaw.plugin.json` is the metadata OpenClaw reads **before it loads your
40
+ plugin code**. Everything below must be cheap enough to inspect without booting
41
+ plugin runtime.
42
+
43
+ **Use it for:**
44
+
45
+ - plugin identity, config validation, and config UI hints
46
+ - auth, onboarding, and setup metadata (alias, auto-enable, provider env vars, auth choices)
47
+ - activation hints for control-plane surfaces
48
+ - shorthand model-family ownership
49
+ - static capability-ownership snapshots (`contracts`)
50
+ - QA runner metadata the shared `openclaw qa` host can inspect
51
+ - channel-specific config metadata merged into catalog and validation surfaces
52
+
53
+ **Do not use it for:** registering runtime behavior, declaring code entrypoints,
54
+ or npm install metadata. Those belong in your plugin code and `package.json`.
55
+
56
+ ## Minimal example
57
+
58
+ ```json
59
+ {
60
+ "id": "voice-call",
61
+ "configSchema": {
62
+ "type": "object",
63
+ "additionalProperties": false,
64
+ "properties": {}
65
+ }
66
+ }
67
+ ```
68
+
69
+ ## Rich example
70
+
71
+ ```json
72
+ {
73
+ "id": "openrouter",
74
+ "name": "OpenRouter",
75
+ "description": "OpenRouter provider plugin",
76
+ "version": "1.0.0",
77
+ "providers": ["openrouter"],
78
+ "modelSupport": {
79
+ "modelPrefixes": ["router-"]
80
+ },
81
+ "modelIdNormalization": {
82
+ "providers": {
83
+ "openrouter": {
84
+ "prefixWhenBare": "openrouter"
85
+ }
86
+ }
87
+ },
88
+ "providerEndpoints": [
89
+ {
90
+ "endpointClass": "openrouter",
91
+ "hostSuffixes": ["openrouter.ai"]
92
+ }
93
+ ],
94
+ "providerRequest": {
95
+ "providers": {
96
+ "openrouter": {
97
+ "family": "openrouter"
98
+ }
99
+ }
100
+ },
101
+ "cliBackends": ["openrouter-cli"],
102
+ "syntheticAuthRefs": ["openrouter-cli"],
103
+ "setup": {
104
+ "providers": [
105
+ {
106
+ "id": "openrouter",
107
+ "envVars": ["OPENROUTER_API_KEY"]
108
+ }
109
+ ]
110
+ },
111
+ "providerAuthAliases": {
112
+ "openrouter-coding": "openrouter"
113
+ },
114
+ "channelEnvVars": {
115
+ "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"]
116
+ },
117
+ "providerAuthChoices": [
118
+ {
119
+ "provider": "openrouter",
120
+ "method": "api-key",
121
+ "choiceId": "openrouter-api-key",
122
+ "choiceLabel": "OpenRouter API key",
123
+ "groupId": "openrouter",
124
+ "groupLabel": "OpenRouter",
125
+ "optionKey": "openrouterApiKey",
126
+ "cliFlag": "--openrouter-api-key",
127
+ "cliOption": "--openrouter-api-key <key>",
128
+ "cliDescription": "OpenRouter API key",
129
+ "onboardingScopes": ["text-inference"]
130
+ }
131
+ ],
132
+ "uiHints": {
133
+ "apiKey": {
134
+ "label": "API key",
135
+ "placeholder": "sk-or-v1-...",
136
+ "sensitive": true
137
+ }
138
+ },
139
+ "configSchema": {
140
+ "type": "object",
141
+ "additionalProperties": false,
142
+ "properties": {
143
+ "apiKey": {
144
+ "type": "string"
145
+ }
146
+ }
147
+ }
148
+ }
149
+ ```
150
+
151
+ ## Top-level field reference
152
+
153
+ | Field | Required | Type | What it means |
154
+ | ------------------------------------ | -------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
155
+ | `id` | Yes | `string` | Canonical plugin id. This is the id used in `plugins.entries.<id>`. |
156
+ | `configSchema` | Yes | `object` | Inline JSON Schema for this plugin's config. |
157
+ | `requiresPlugins` | No | `string[]` | Plugin ids that must also be installed for this plugin to have an effect. Discovery keeps the plugin loadable but warns when any required plugin is missing. |
158
+ | `enabledByDefault` | No | `true` | Marks a bundled plugin as enabled by default. Omit it, or set any non-`true` value, to leave the plugin disabled by default. |
159
+ | `enabledByDefaultOnPlatforms` | No | `string[]` | Marks a bundled plugin as enabled by default only on the listed Node.js platforms, for example `["darwin"]`. Explicit config still wins. |
160
+ | `legacyPluginIds` | No | `string[]` | Legacy ids that normalize to this canonical plugin id. |
161
+ | `autoEnableWhenConfiguredProviders` | No | `string[]` | Provider ids that should auto-enable this plugin when auth, config, or model refs mention them. |
162
+ | `kind` | No | `"memory"` \| `"context-engine"` | Declares an exclusive plugin kind used by `plugins.slots.*`. |
163
+ | `channels` | No | `string[]` | Channel ids owned by this plugin. Used for discovery and config validation. |
164
+ | `providers` | No | `string[]` | Provider ids owned by this plugin. |
165
+ | `providerCatalogEntry` | No | `string` | Lightweight provider-catalog module path, relative to the plugin root, for manifest-scoped provider catalog metadata that can be loaded without activating the full plugin runtime. |
166
+ | `modelSupport` | No | `object` | Manifest-owned shorthand model-family metadata used to auto-load the plugin before runtime. |
167
+ | `modelCatalog` | No | `object` | Declarative model catalog metadata for providers owned by this plugin. This is the control-plane contract for future read-only listing, onboarding, model pickers, aliases, and suppression without loading plugin runtime. |
168
+ | `modelPricing` | No | `object` | Provider-owned external pricing lookup policy. Use it to opt local/self-hosted providers out of remote pricing catalogs or map provider refs to OpenRouter/LiteLLM catalog ids without hardcoding provider ids in core. |
169
+ | `modelIdNormalization` | No | `object` | Provider-owned model-id alias/prefix cleanup that must run before provider runtime loads. |
170
+ | `providerEndpoints` | No | `object[]` | Manifest-owned endpoint host/baseUrl metadata for provider routes that core must classify before provider runtime loads. |
171
+ | `providerRequest` | No | `object` | Cheap provider-family and request-compatibility metadata used by generic request policy before provider runtime loads. |
172
+ | `secretProviderIntegrations` | No | `Record<string, object>` | Declarative SecretRef exec provider presets that setup or install surfaces can offer without hardcoding provider-specific integrations in core. |
173
+ | `cliBackends` | No | `string[]` | CLI inference backend ids owned by this plugin. Used for startup auto-activation from explicit config refs. |
174
+ | `syntheticAuthRefs` | No | `string[]` | Provider or CLI backend refs whose plugin-owned synthetic auth hook should be probed during cold model discovery before runtime loads. |
175
+ | `nonSecretAuthMarkers` | No | `string[]` | Bundled-plugin-owned placeholder API key values that represent non-secret local, OAuth, or ambient credential state. |
176
+ | `commandAliases` | No | `object[]` | Command names owned by this plugin that should produce plugin-aware config and CLI diagnostics before runtime loads. |
177
+ | `providerAuthEnvVars` | No | `Record<string, string[]>` | Deprecated compatibility env metadata for provider auth/status lookup. Prefer `setup.providers[].envVars` for new plugins; OpenClaw still reads this during the deprecation window. |
178
+ | `providerAuthAliases` | No | `Record<string, string>` | Provider ids that should reuse another provider id for auth lookup, for example a coding provider that shares the base provider API key and auth profiles. |
179
+ | `channelEnvVars` | No | `Record<string, string[]>` | Cheap channel env metadata that OpenClaw can inspect without loading plugin code. Use this for env-driven channel setup or auth surfaces that generic startup/config helpers should see. |
180
+ | `providerAuthChoices` | No | `object[]` | Cheap auth-choice metadata for onboarding pickers, preferred-provider resolution, and simple CLI flag wiring. |
181
+ | `activation` | No | `object` | Cheap activation planner metadata for startup, provider, command, channel, route, and capability-triggered loading. Metadata only; plugin runtime still owns actual behavior. |
182
+ | `setup` | No | `object` | Cheap setup/onboarding descriptors that discovery and setup surfaces can inspect without loading plugin runtime. |
183
+ | `qaRunners` | No | `object[]` | Cheap QA runner descriptors used by the shared `openclaw qa` host before plugin runtime loads. |
184
+ | `contracts` | No | `object` | Static capability ownership snapshot for external auth hooks, embeddings, speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search, and tool ownership. |
185
+ | `mediaUnderstandingProviderMetadata` | No | `Record<string, object>` | Cheap media-understanding defaults for provider ids declared in `contracts.mediaUnderstandingProviders`. |
186
+ | `imageGenerationProviderMetadata` | No | `Record<string, object>` | Cheap image-generation auth metadata for provider ids declared in `contracts.imageGenerationProviders`, including provider-owned auth aliases and base-url guards. |
187
+ | `videoGenerationProviderMetadata` | No | `Record<string, object>` | Cheap video-generation auth metadata for provider ids declared in `contracts.videoGenerationProviders`, including provider-owned auth aliases and base-url guards. |
188
+ | `musicGenerationProviderMetadata` | No | `Record<string, object>` | Cheap music-generation auth metadata for provider ids declared in `contracts.musicGenerationProviders`, including provider-owned auth aliases and base-url guards. |
189
+ | `toolMetadata` | No | `Record<string, object>` | Cheap availability metadata for plugin-owned tools declared in `contracts.tools`. Use it when a tool should not load runtime unless config, env, or auth evidence exists. |
190
+ | `channelConfigs` | No | `Record<string, object>` | Manifest-owned channel config metadata merged into discovery and validation surfaces before runtime loads. |
191
+ | `skills` | No | `string[]` | Skill directories to load, relative to the plugin root. |
192
+ | `name` | No | `string` | Human-readable plugin name. |
193
+ | `description` | No | `string` | Short summary shown in plugin surfaces. |
194
+ | `version` | No | `string` | Informational plugin version. |
195
+ | `uiHints` | No | `Record<string, object>` | UI labels, placeholders, and sensitivity hints for config fields. |
196
+
197
+ ## Generation provider metadata reference
198
+
199
+ The generation provider metadata fields describe static auth signals for
200
+ providers declared in the matching `contracts.*GenerationProviders` list.
201
+ OpenClaw reads these fields before provider runtime loads so core tools can
202
+ decide whether a generation provider is available without importing every
203
+ provider plugin.
204
+
205
+ Use these fields only for cheap, declarative facts. Transport, request
206
+ transforms, token refresh, credential validation, and actual generation behavior
207
+ stay in the plugin runtime.
208
+
209
+ ```json
210
+ {
211
+ "contracts": {
212
+ "imageGenerationProviders": ["example-image"]
213
+ },
214
+ "imageGenerationProviderMetadata": {
215
+ "example-image": {
216
+ "aliases": ["example-image-oauth"],
217
+ "authProviders": ["example-image"],
218
+ "configSignals": [
219
+ {
220
+ "rootPath": "plugins.entries.example-image.config",
221
+ "overlayPath": "image",
222
+ "mode": {
223
+ "path": "mode",
224
+ "default": "local",
225
+ "allowed": ["local"]
226
+ },
227
+ "requiredAny": ["workflow", "workflowPath"],
228
+ "required": ["promptNodeId"]
229
+ }
230
+ ],
231
+ "authSignals": [
232
+ {
233
+ "provider": "example-image"
234
+ },
235
+ {
236
+ "provider": "example-image-oauth",
237
+ "providerBaseUrl": {
238
+ "provider": "example-image",
239
+ "defaultBaseUrl": "https://api.example.com/v1",
240
+ "allowedBaseUrls": ["https://api.example.com/v1"]
241
+ }
242
+ }
243
+ ]
244
+ }
245
+ }
246
+ }
247
+ ```
248
+
249
+ Each metadata entry supports:
250
+
251
+ | Field | Required | Type | What it means |
252
+ | ---------------------- | -------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
253
+ | `aliases` | No | `string[]` | Additional provider ids that should count as static auth aliases for the generation provider. |
254
+ | `authProviders` | No | `string[]` | Provider ids whose configured auth profiles should count as auth for this generation provider. |
255
+ | `configSignals` | No | `object[]` | Cheap config-only availability signals for local or self-hosted providers that can be configured without auth profiles or env vars. |
256
+ | `authSignals` | No | `object[]` | Explicit auth signals. When present, these replace the default signal set from the provider id, `aliases`, and `authProviders`. |
257
+ | `referenceAudioInputs` | No | `boolean` | Video-generation only. Set to `true` when the provider accepts reference audio assets; otherwise `video_generate` hides audio reference parameters. |
258
+
259
+ Each `configSignals` entry supports:
260
+
261
+ | Field | Required | Type | What it means |
262
+ | ---------------- | -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
263
+ | `rootPath` | Yes | `string` | Dot path to the plugin-owned config object to inspect, for example `plugins.entries.example.config`. |
264
+ | `overlayPath` | No | `string` | Dot path inside the root config whose object should overlay the root object before evaluating the signal. Use this for capability-specific config such as `image`, `video`, or `music`. |
265
+ | `overlayMapPath` | No | `string` | Dot path inside the root config whose object values should each overlay the root object. Use this for named account maps such as `accounts`, where any configured account should qualify. |
266
+ | `required` | No | `string[]` | Dot paths inside the effective config that must have configured values. Strings must be non-empty; objects and arrays must not be empty. |
267
+ | `requiredAny` | No | `string[]` | Dot paths inside the effective config where at least one must have a configured value. |
268
+ | `mode` | No | `object` | Optional string mode guard inside the effective config. Use this when config-only availability applies only to one mode. |
269
+
270
+ Each `mode` guard supports:
271
+
272
+ | Field | Required | Type | What it means |
273
+ | ------------ | -------- | ---------- | ---------------------------------------------------------------------------------- |
274
+ | `path` | No | `string` | Dot path inside the effective config. Defaults to `mode`. |
275
+ | `default` | No | `string` | Mode value to use when the config omits the path. |
276
+ | `allowed` | No | `string[]` | If present, the signal passes only when the effective mode is one of these values. |
277
+ | `disallowed` | No | `string[]` | If present, the signal fails when the effective mode is one of these values. |
278
+
279
+ Each `authSignals` entry supports:
280
+
281
+ | Field | Required | Type | What it means |
282
+ | ----------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
283
+ | `provider` | Yes | `string` | Provider id to check in configured auth profiles. |
284
+ | `providerBaseUrl` | No | `object` | Optional guard that makes the signal count only when the referenced configured provider uses an allowed base URL. Use this when an auth alias is valid only for certain APIs. |
285
+
286
+ Each `providerBaseUrl` guard supports:
287
+
288
+ | Field | Required | Type | What it means |
289
+ | ----------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
290
+ | `provider` | Yes | `string` | Provider config id whose `baseUrl` should be checked. |
291
+ | `defaultBaseUrl` | No | `string` | Base URL to assume when the provider config omits `baseUrl`. |
292
+ | `allowedBaseUrls` | Yes | `string[]` | Allowed base URLs for this auth signal. The signal is ignored when the configured or default base URL does not match one of these normalized values. |
293
+
294
+ ## Tool metadata reference
295
+
296
+ `toolMetadata` uses the same `configSignals` and `authSignals` shapes as
297
+ generation provider metadata, keyed by tool name. `contracts.tools` declares
298
+ ownership. `toolMetadata` declares cheap availability evidence so OpenClaw can
299
+ avoid importing a plugin runtime just to have its tool factory return `null`.
300
+
301
+ ```json
302
+ {
303
+ "setup": {
304
+ "providers": [
305
+ {
306
+ "id": "example",
307
+ "envVars": ["EXAMPLE_API_KEY"]
308
+ }
309
+ ]
310
+ },
311
+ "contracts": {
312
+ "tools": ["example_search"]
313
+ },
314
+ "toolMetadata": {
315
+ "example_search": {
316
+ "authSignals": [
317
+ {
318
+ "provider": "example"
319
+ }
320
+ ],
321
+ "configSignals": [
322
+ {
323
+ "rootPath": "plugins.entries.example.config",
324
+ "overlayPath": "search",
325
+ "required": ["apiKey"]
326
+ }
327
+ ]
328
+ }
329
+ }
330
+ }
331
+ ```
332
+
333
+ If a tool has no `toolMetadata`, OpenClaw preserves the existing behavior and
334
+ loads the owning plugin when the tool contract matches policy. For hot-path
335
+ tools whose factory depends on auth/config, plugin authors should declare
336
+ `toolMetadata` instead of making core import runtime to ask.
337
+
338
+ ## providerAuthChoices reference
339
+
340
+ Each `providerAuthChoices` entry describes one onboarding or auth choice.
341
+ OpenClaw reads this before provider runtime loads.
342
+ Provider setup lists use these manifest choices, descriptor-derived setup
343
+ choices, and install-catalog metadata without loading provider runtime.
344
+
345
+ | Field | Required | Type | What it means |
346
+ | --------------------- | -------- | --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
347
+ | `provider` | Yes | `string` | Provider id this choice belongs to. |
348
+ | `method` | Yes | `string` | Auth method id to dispatch to. |
349
+ | `choiceId` | Yes | `string` | Stable auth-choice id used by onboarding and CLI flows. |
350
+ | `choiceLabel` | No | `string` | User-facing label. If omitted, OpenClaw falls back to `choiceId`. |
351
+ | `choiceHint` | No | `string` | Short helper text for the picker. |
352
+ | `assistantPriority` | No | `number` | Lower values sort earlier in assistant-driven interactive pickers. |
353
+ | `assistantVisibility` | No | `"visible"` \| `"manual-only"` | Hide the choice from assistant pickers while still allowing manual CLI selection. |
354
+ | `deprecatedChoiceIds` | No | `string[]` | Legacy choice ids that should redirect users to this replacement choice. |
355
+ | `groupId` | No | `string` | Optional group id for grouping related choices. |
356
+ | `groupLabel` | No | `string` | User-facing label for that group. |
357
+ | `groupHint` | No | `string` | Short helper text for the group. |
358
+ | `optionKey` | No | `string` | Internal option key for simple one-flag auth flows. |
359
+ | `cliFlag` | No | `string` | CLI flag name, such as `--openrouter-api-key`. |
360
+ | `cliOption` | No | `string` | Full CLI option shape, such as `--openrouter-api-key <key>`. |
361
+ | `cliDescription` | No | `string` | Description used in CLI help. |
362
+ | `onboardingScopes` | No | `Array<"text-inference" \| "image-generation" \| "music-generation">` | Which onboarding surfaces this choice should appear in. If omitted, it defaults to `["text-inference"]`. |
363
+
364
+ ## commandAliases reference
365
+
366
+ Use `commandAliases` when a plugin owns a runtime command name that users may
367
+ mistakenly put in `plugins.allow` or try to run as a root CLI command. OpenClaw
368
+ uses this metadata for diagnostics without importing plugin runtime code.
369
+
370
+ ```json
371
+ {
372
+ "commandAliases": [
373
+ {
374
+ "name": "dreaming",
375
+ "kind": "runtime-slash",
376
+ "cliCommand": "memory"
377
+ }
378
+ ]
379
+ }
380
+ ```
381
+
382
+ | Field | Required | Type | What it means |
383
+ | ------------ | -------- | ----------------- | ----------------------------------------------------------------------- |
384
+ | `name` | Yes | `string` | Command name that belongs to this plugin. |
385
+ | `kind` | No | `"runtime-slash"` | Marks the alias as a chat slash command rather than a root CLI command. |
386
+ | `cliCommand` | No | `string` | Related root CLI command to suggest for CLI operations, if one exists. |
387
+
388
+ ## activation reference
389
+
390
+ Use `activation` when the plugin can cheaply declare which control-plane events
391
+ should include it in an activation/load plan.
392
+
393
+ This block is planner metadata, not a lifecycle API. It does not register
394
+ runtime behavior, does not replace `register(...)`, and does not promise that
395
+ plugin code has already executed. The activation planner uses these fields to
396
+ narrow candidate plugins before falling back to existing manifest ownership
397
+ metadata such as `providers`, `channels`, `commandAliases`, `setup.providers`,
398
+ `contracts.tools`, and hooks.
399
+
400
+ Prefer the narrowest metadata that already describes ownership. Use
401
+ `providers`, `channels`, `commandAliases`, setup descriptors, or `contracts`
402
+ when those fields express the relationship. Use `activation` for extra planner
403
+ hints that cannot be represented by those ownership fields.
404
+ Use top-level `cliBackends` for CLI runtime aliases such as `claude-cli`,
405
+ `my-cli`, or `google-gemini-cli`; `activation.onAgentHarnesses` is only for
406
+ embedded agent harness ids that do not already have an ownership field.
407
+
408
+ This block is metadata only. It does not register runtime behavior, and it does
409
+ not replace `register(...)`, `setupEntry`, or other runtime/plugin entrypoints.
410
+ Current consumers use it as a narrowing hint before broader plugin loading, so
411
+ missing non-startup activation metadata usually only costs performance; it
412
+ should not change correctness while manifest ownership fallbacks still exist.
413
+
414
+ Every plugin should set `activation.onStartup` intentionally. Set it to `true`
415
+ only when the plugin must run during Gateway startup. Set it to `false` when
416
+ the plugin is inert at startup and should load only from narrower triggers.
417
+ Omitting `onStartup` no longer startup-loads the plugin implicitly; use explicit
418
+ activation metadata for startup, channel, config, agent-harness, memory, or
419
+ other narrower activation triggers.
420
+
421
+ ```json
422
+ {
423
+ "activation": {
424
+ "onStartup": false,
425
+ "onProviders": ["openai"],
426
+ "onCommands": ["models"],
427
+ "onChannels": ["web"],
428
+ "onRoutes": ["gateway-webhook"],
429
+ "onConfigPaths": ["browser"],
430
+ "onCapabilities": ["provider", "tool"]
431
+ }
432
+ }
433
+ ```
434
+
435
+ | Field | Required | Type | What it means |
436
+ | ------------------ | -------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
437
+ | `onStartup` | No | `boolean` | Explicit Gateway startup activation. Every plugin should set this. `true` imports the plugin during startup; `false` keeps it startup-lazy unless another matched trigger requires loading. |
438
+ | `onProviders` | No | `string[]` | Provider ids that should include this plugin in activation/load plans. |
439
+ | `onAgentHarnesses` | No | `string[]` | Embedded agent harness runtime ids that should include this plugin in activation/load plans. Use top-level `cliBackends` for CLI backend aliases. |
440
+ | `onCommands` | No | `string[]` | Command ids that should include this plugin in activation/load plans. |
441
+ | `onChannels` | No | `string[]` | Channel ids that should include this plugin in activation/load plans. |
442
+ | `onRoutes` | No | `string[]` | Route kinds that should include this plugin in activation/load plans. |
443
+ | `onConfigPaths` | No | `string[]` | Root-relative config paths that should include this plugin in startup/load plans when the path is present and not explicitly disabled. |
444
+ | `onCapabilities` | No | `Array<"provider" \| "channel" \| "tool" \| "hook">` | Broad capability hints used by control-plane activation planning. Prefer narrower fields when possible. |
445
+
446
+ Current live consumers:
447
+
448
+ - Gateway startup planning uses `activation.onStartup` for explicit startup
449
+ import
450
+ - command-triggered CLI planning falls back to legacy
451
+ `commandAliases[].cliCommand` or `commandAliases[].name`
452
+ - agent-runtime startup planning uses `activation.onAgentHarnesses` for
453
+ embedded harnesses and top-level `cliBackends[]` for CLI runtime aliases
454
+ - channel-triggered setup/channel planning falls back to legacy `channels[]`
455
+ ownership when explicit channel activation metadata is missing
456
+ - startup plugin planning uses `activation.onConfigPaths` for non-channel root
457
+ config surfaces such as the bundled browser plugin's `browser` block
458
+ - provider-triggered setup/runtime planning falls back to legacy
459
+ `providers[]` and top-level `cliBackends[]` ownership when explicit provider
460
+ activation metadata is missing
461
+
462
+ Planner diagnostics can distinguish explicit activation hints from manifest
463
+ ownership fallback. For example, `activation-command-hint` means
464
+ `activation.onCommands` matched, while `manifest-command-alias` means the
465
+ planner used `commandAliases` ownership instead. These reason labels are for
466
+ host diagnostics and tests; plugin authors should keep declaring the metadata
467
+ that best describes ownership.
468
+
469
+ ## qaRunners reference
470
+
471
+ Use `qaRunners` when a plugin contributes one or more transport runners beneath
472
+ the shared `openclaw qa` root. Keep this metadata cheap and static; the plugin
473
+ runtime still owns actual CLI registration through a lightweight
474
+ `runtime-api.ts` surface that exports `qaRunnerCliRegistrations`.
475
+
476
+ ```json
477
+ {
478
+ "qaRunners": [
479
+ {
480
+ "commandName": "matrix",
481
+ "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver"
482
+ }
483
+ ]
484
+ }
485
+ ```
486
+
487
+ | Field | Required | Type | What it means |
488
+ | ------------- | -------- | -------- | ------------------------------------------------------------------ |
489
+ | `commandName` | Yes | `string` | Subcommand mounted beneath `openclaw qa`, for example `matrix`. |
490
+ | `description` | No | `string` | Fallback help text used when the shared host needs a stub command. |
491
+
492
+ ## setup reference
493
+
494
+ Use `setup` when setup and onboarding surfaces need cheap plugin-owned metadata
495
+ before runtime loads.
496
+
497
+ ```json
498
+ {
499
+ "setup": {
500
+ "providers": [
501
+ {
502
+ "id": "openai",
503
+ "authMethods": ["api-key"],
504
+ "envVars": ["OPENAI_API_KEY"],
505
+ "authEvidence": [
506
+ {
507
+ "type": "local-file-with-env",
508
+ "fileEnvVar": "OPENAI_CREDENTIALS_FILE",
509
+ "requiresAllEnv": ["OPENAI_PROJECT"],
510
+ "credentialMarker": "openai-local-credentials",
511
+ "source": "openai local credentials"
512
+ }
513
+ ]
514
+ }
515
+ ],
516
+ "cliBackends": ["openai-cli"],
517
+ "configMigrations": ["legacy-openai-auth"],
518
+ "requiresRuntime": false
519
+ }
520
+ }
521
+ ```
522
+
523
+ Top-level `cliBackends` stays valid and continues to describe CLI inference
524
+ backends. `setup.cliBackends` is the setup-specific descriptor surface for
525
+ control-plane/setup flows that should stay metadata-only.
526
+
527
+ When present, `setup.providers` and `setup.cliBackends` are the preferred
528
+ descriptor-first lookup surface for setup discovery. If the descriptor only
529
+ narrows the candidate plugin and setup still needs richer setup-time runtime
530
+ hooks, set `requiresRuntime: true` and keep `setup-api` in place as the
531
+ fallback execution path.
532
+
533
+ OpenClaw also includes `setup.providers[].envVars` in generic provider auth and
534
+ env-var lookups. `providerAuthEnvVars` remains supported through a compatibility
535
+ adapter during the deprecation window, but non-bundled plugins that still use it
536
+ receive a manifest diagnostic. New plugins should put setup/status env metadata
537
+ on `setup.providers[].envVars`.
538
+
539
+ OpenClaw can also derive simple setup choices from `setup.providers[].authMethods`
540
+ when no setup entry is available, or when `setup.requiresRuntime: false`
541
+ declares setup runtime unnecessary. Explicit `providerAuthChoices` entries stay
542
+ preferred for custom labels, CLI flags, onboarding scope, and assistant metadata.
543
+
544
+ Set `requiresRuntime: false` only when those descriptors are sufficient for the
545
+ setup surface. OpenClaw treats explicit `false` as a descriptor-only contract
546
+ and will not execute `setup-api` or `openclaw.setupEntry` for setup lookup. If
547
+ a descriptor-only plugin still ships one of those setup runtime entries,
548
+ OpenClaw reports an additive diagnostic and continues ignoring it. Omitted
549
+ `requiresRuntime` keeps legacy fallback behavior so existing plugins that added
550
+ descriptors without the flag do not break.
551
+
552
+ Because setup lookup can execute plugin-owned `setup-api` code, normalized
553
+ `setup.providers[].id` and `setup.cliBackends[]` values must stay unique across
554
+ discovered plugins. Ambiguous ownership fails closed instead of picking a
555
+ winner from discovery order.
556
+
557
+ When setup runtime does execute, setup registry diagnostics report descriptor
558
+ drift if `setup-api` registers a provider or CLI backend that the manifest
559
+ descriptors do not declare, or if a descriptor has no matching runtime
560
+ registration. These diagnostics are additive and do not reject legacy plugins.
561
+
562
+ ### setup.providers reference
563
+
564
+ | Field | Required | Type | What it means |
565
+ | -------------- | -------- | ---------- | ------------------------------------------------------------------------------------------------ |
566
+ | `id` | Yes | `string` | Provider id exposed during setup or onboarding. Keep normalized ids globally unique. |
567
+ | `authMethods` | No | `string[]` | Setup/auth method ids this provider supports without loading full runtime. |
568
+ | `envVars` | No | `string[]` | Env vars that generic setup/status surfaces can check before plugin runtime loads. |
569
+ | `authEvidence` | No | `object[]` | Cheap local auth evidence checks for providers that can authenticate through non-secret markers. |
570
+
571
+ `authEvidence` is for provider-owned local credential markers that can be
572
+ verified without loading runtime code. These checks must stay cheap and local:
573
+ no network calls, no keychain or secret-manager reads, no shell commands, and no
574
+ provider API probes.
575
+
576
+ Supported evidence entries:
577
+
578
+ | Field | Required | Type | What it means |
579
+ | ------------------ | -------- | ---------- | -------------------------------------------------------------------------------------------------------------- |
580
+ | `type` | Yes | `string` | Currently `local-file-with-env`. |
581
+ | `fileEnvVar` | No | `string` | Env var containing an explicit credential file path. |
582
+ | `fallbackPaths` | No | `string[]` | Local credential file paths checked when `fileEnvVar` is absent or empty. Supports `${HOME}` and `${APPDATA}`. |
583
+ | `requiresAnyEnv` | No | `string[]` | At least one listed env var must be non-empty before the evidence is valid. |
584
+ | `requiresAllEnv` | No | `string[]` | Every listed env var must be non-empty before the evidence is valid. |
585
+ | `credentialMarker` | Yes | `string` | Non-secret marker returned when the evidence is present. |
586
+ | `source` | No | `string` | User-facing source label for auth/status output. |
587
+
588
+ ### setup fields
589
+
590
+ | Field | Required | Type | What it means |
591
+ | ------------------ | -------- | ---------- | --------------------------------------------------------------------------------------------------- |
592
+ | `providers` | No | `object[]` | Provider setup descriptors exposed during setup and onboarding. |
593
+ | `cliBackends` | No | `string[]` | Setup-time backend ids used for descriptor-first setup lookup. Keep normalized ids globally unique. |
594
+ | `configMigrations` | No | `string[]` | Config migration ids owned by this plugin's setup surface. |
595
+ | `requiresRuntime` | No | `boolean` | Whether setup still needs `setup-api` execution after descriptor lookup. |
596
+
597
+ ## uiHints reference
598
+
599
+ `uiHints` is a map from config field names to small rendering hints.
600
+
601
+ ```json
602
+ {
603
+ "uiHints": {
604
+ "apiKey": {
605
+ "label": "API key",
606
+ "help": "Used for OpenRouter requests",
607
+ "placeholder": "sk-or-v1-...",
608
+ "sensitive": true
609
+ }
610
+ }
611
+ }
612
+ ```
613
+
614
+ Each field hint can include:
615
+
616
+ | Field | Type | What it means |
617
+ | ------------- | ---------- | --------------------------------------- |
618
+ | `label` | `string` | User-facing field label. |
619
+ | `help` | `string` | Short helper text. |
620
+ | `tags` | `string[]` | Optional UI tags. |
621
+ | `advanced` | `boolean` | Marks the field as advanced. |
622
+ | `sensitive` | `boolean` | Marks the field as secret or sensitive. |
623
+ | `placeholder` | `string` | Placeholder text for form inputs. |
624
+
625
+ ## contracts reference
626
+
627
+ Use `contracts` only for static capability ownership metadata that OpenClaw can
628
+ read without importing the plugin runtime.
629
+
630
+ ```json
631
+ {
632
+ "contracts": {
633
+ "agentToolResultMiddleware": ["openclaw", "codex"],
634
+ "trustedToolPolicies": ["workflow-budget"],
635
+ "externalAuthProviders": ["acme-ai"],
636
+ "embeddingProviders": ["openai-compatible"],
637
+ "speechProviders": ["openai"],
638
+ "realtimeTranscriptionProviders": ["openai"],
639
+ "realtimeVoiceProviders": ["openai"],
640
+ "memoryEmbeddingProviders": ["local"],
641
+ "mediaUnderstandingProviders": ["openai"],
642
+ "imageGenerationProviders": ["openai"],
643
+ "videoGenerationProviders": ["qwen"],
644
+ "webFetchProviders": ["firecrawl"],
645
+ "webSearchProviders": ["gemini"],
646
+ "migrationProviders": ["hermes"],
647
+ "gatewayMethodDispatch": ["authenticated-request"],
648
+ "tools": ["firecrawl_search", "firecrawl_scrape"]
649
+ }
650
+ }
651
+ ```
652
+
653
+ Each list is optional:
654
+
655
+ | Field | Type | What it means |
656
+ | -------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ |
657
+ | `embeddedExtensionFactories` | `string[]` | Codex app-server extension factory ids, currently `codex-app-server`. |
658
+ | `agentToolResultMiddleware` | `string[]` | Runtime ids this plugin may register tool-result middleware for. |
659
+ | `trustedToolPolicies` | `string[]` | Plugin-local trusted pre-tool policy ids an installed plugin may register. Bundled plugins may register policies without this field. |
660
+ | `externalAuthProviders` | `string[]` | Provider ids whose external auth profile hook this plugin owns. |
661
+ | `embeddingProviders` | `string[]` | General embedding provider ids this plugin owns for reusable vector embedding use, including memory. |
662
+ | `speechProviders` | `string[]` | Speech provider ids this plugin owns. |
663
+ | `realtimeTranscriptionProviders` | `string[]` | Realtime-transcription provider ids this plugin owns. |
664
+ | `realtimeVoiceProviders` | `string[]` | Realtime-voice provider ids this plugin owns. |
665
+ | `memoryEmbeddingProviders` | `string[]` | Deprecated memory-specific embedding provider ids this plugin owns. |
666
+ | `mediaUnderstandingProviders` | `string[]` | Media-understanding provider ids this plugin owns. |
667
+ | `transcriptSourceProviders` | `string[]` | Transcript source provider ids this plugin owns. |
668
+ | `imageGenerationProviders` | `string[]` | Image-generation provider ids this plugin owns. |
669
+ | `videoGenerationProviders` | `string[]` | Video-generation provider ids this plugin owns. |
670
+ | `webFetchProviders` | `string[]` | Web-fetch provider ids this plugin owns. |
671
+ | `webSearchProviders` | `string[]` | Web-search provider ids this plugin owns. |
672
+ | `migrationProviders` | `string[]` | Import provider ids this plugin owns for `openclaw migrate`. |
673
+ | `gatewayMethodDispatch` | `string[]` | Reserved entitlement for authenticated plugin HTTP routes that dispatch Gateway methods in-process. |
674
+ | `tools` | `string[]` | Agent tool names this plugin owns. |
675
+
676
+ `contracts.embeddedExtensionFactories` is retained for bundled Codex
677
+ app-server-only extension factories. Bundled tool-result transforms should
678
+ declare `contracts.agentToolResultMiddleware` and register with
679
+ `api.registerAgentToolResultMiddleware(...)` instead. Installed plugins may use
680
+ the same middleware seam only when explicitly enabled and only for runtimes they
681
+ declare in `contracts.agentToolResultMiddleware`.
682
+
683
+ Installed plugins that need the host-trusted pre-tool policy tier must declare
684
+ each registered local id in `contracts.trustedToolPolicies` and be explicitly
685
+ enabled. Bundled plugins keep the existing trusted-policy path, but installed
686
+ plugins with undeclared policy ids are rejected before registration. Policy ids
687
+ are scoped to the registering plugin, so two plugins may both declare and
688
+ register `workflow-budget`; a single plugin may not register the same local id
689
+ twice.
690
+
691
+ Runtime `api.registerTool(...)` registrations must match `contracts.tools`.
692
+ Tool discovery uses this list to load only the plugin runtimes that can own the
693
+ requested tools.
694
+
695
+ Provider plugins that implement `resolveExternalAuthProfiles` should declare
696
+ `contracts.externalAuthProviders`; undeclared external-auth hooks are ignored.
697
+
698
+ General embedding providers should declare `contracts.embeddingProviders` for
699
+ each adapter registered with `api.registerEmbeddingProvider(...)`. Use the
700
+ general contract for reusable vector generation, including providers consumed by
701
+ memory search. `contracts.memoryEmbeddingProviders` is deprecated
702
+ memory-specific compatibility and remains only while existing providers migrate
703
+ to the generic embedding provider seam.
704
+
705
+ `contracts.gatewayMethodDispatch` currently accepts
706
+ `"authenticated-request"`. It is an API hygiene gate for native plugin HTTP
707
+ routes that intentionally dispatch Gateway control-plane methods in-process, not
708
+ a sandbox against malicious native plugins. Use it only for tightly reviewed
709
+ bundled/operator surfaces that already require Gateway HTTP auth.
710
+
711
+ ## mediaUnderstandingProviderMetadata reference
712
+
713
+ Use `mediaUnderstandingProviderMetadata` when a media-understanding provider has
714
+ default models, auto-auth fallback priority, or native document support that
715
+ generic core helpers need before runtime loads. Keys must also be declared in
716
+ `contracts.mediaUnderstandingProviders`.
717
+
718
+ ```json
719
+ {
720
+ "contracts": {
721
+ "mediaUnderstandingProviders": ["example"]
722
+ },
723
+ "mediaUnderstandingProviderMetadata": {
724
+ "example": {
725
+ "capabilities": ["image", "audio"],
726
+ "defaultModels": {
727
+ "image": "example-vision-latest",
728
+ "audio": "example-transcribe-latest"
729
+ },
730
+ "autoPriority": {
731
+ "image": 40
732
+ },
733
+ "nativeDocumentInputs": ["pdf"]
734
+ }
735
+ }
736
+ }
737
+ ```
738
+
739
+ Each provider entry can include:
740
+
741
+ | Field | Type | What it means |
742
+ | ---------------------- | ----------------------------------- | ---------------------------------------------------------------------------- |
743
+ | `capabilities` | `("image" \| "audio" \| "video")[]` | Media capabilities exposed by this provider. |
744
+ | `defaultModels` | `Record<string, string>` | Capability-to-model defaults used when config does not specify a model. |
745
+ | `autoPriority` | `Record<string, number>` | Lower numbers sort earlier for automatic credential-based provider fallback. |
746
+ | `nativeDocumentInputs` | `"pdf"[]` | Native document inputs supported by the provider. |
747
+
748
+ ## channelConfigs reference
749
+
750
+ Use `channelConfigs` when a channel plugin needs cheap config metadata before
751
+ runtime loads. Read-only channel setup/status discovery can use this metadata
752
+ directly for configured external channels when no setup entry is available, or
753
+ when `setup.requiresRuntime: false` declares setup runtime unnecessary.
754
+
755
+ `channelConfigs` is plugin manifest metadata, not a new top-level user config
756
+ section. Users still configure channel instances under `channels.<channel-id>`.
757
+ OpenClaw reads manifest metadata to decide which plugin owns that configured
758
+ channel before plugin runtime code executes.
759
+
760
+ For a channel plugin, `configSchema` and `channelConfigs` describe different
761
+ paths:
762
+
763
+ - `configSchema` validates `plugins.entries.<plugin-id>.config`
764
+ - `channelConfigs.<channel-id>.schema` validates `channels.<channel-id>`
765
+
766
+ Non-bundled plugins that declare `channels[]` should also declare matching
767
+ `channelConfigs` entries. Without them, OpenClaw can still load the plugin, but
768
+ cold-path config schema, setup, and Control UI surfaces cannot know the
769
+ channel-owned option shape until plugin runtime executes.
770
+
771
+ `channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled` and
772
+ `nativeSkillsAutoEnabled` can declare static `auto` defaults for command config
773
+ checks that run before channel runtime loads. Bundled channels can also publish
774
+ the same defaults through `package.json#openclaw.channel.commands` alongside
775
+ their other package-owned channel catalog metadata.
776
+
777
+ ```json
778
+ {
779
+ "channelConfigs": {
780
+ "matrix": {
781
+ "schema": {
782
+ "type": "object",
783
+ "additionalProperties": false,
784
+ "properties": {
785
+ "homeserverUrl": { "type": "string" }
786
+ }
787
+ },
788
+ "uiHints": {
789
+ "homeserverUrl": {
790
+ "label": "Homeserver URL",
791
+ "placeholder": "https://matrix.example.com"
792
+ }
793
+ },
794
+ "label": "Matrix",
795
+ "description": "Matrix homeserver connection",
796
+ "commands": {
797
+ "nativeCommandsAutoEnabled": true,
798
+ "nativeSkillsAutoEnabled": true
799
+ },
800
+ "preferOver": ["matrix-legacy"]
801
+ }
802
+ }
803
+ }
804
+ ```
805
+
806
+ Each channel entry can include:
807
+
808
+ | Field | Type | What it means |
809
+ | ------------- | ------------------------ | ----------------------------------------------------------------------------------------- |
810
+ | `schema` | `object` | JSON Schema for `channels.<id>`. Required for each declared channel config entry. |
811
+ | `uiHints` | `Record<string, object>` | Optional UI labels/placeholders/sensitive hints for that channel config section. |
812
+ | `label` | `string` | Channel label merged into picker and inspect surfaces when runtime metadata is not ready. |
813
+ | `description` | `string` | Short channel description for inspect and catalog surfaces. |
814
+ | `commands` | `object` | Static native command and native skill auto-defaults for pre-runtime config checks. |
815
+ | `preferOver` | `string[]` | Legacy or lower-priority plugin ids this channel should outrank in selection surfaces. |
816
+
817
+ ### Replacing another channel plugin
818
+
819
+ Use `preferOver` when your plugin is the preferred owner for a channel id that
820
+ another plugin can also provide. Common cases are a renamed plugin id, a
821
+ standalone plugin that supersedes a bundled plugin, or a maintained fork that
822
+ keeps the same channel id for config compatibility.
823
+
824
+ ```json
825
+ {
826
+ "id": "acme-chat",
827
+ "channels": ["chat"],
828
+ "channelConfigs": {
829
+ "chat": {
830
+ "schema": {
831
+ "type": "object",
832
+ "additionalProperties": false,
833
+ "properties": {
834
+ "webhookUrl": { "type": "string" }
835
+ }
836
+ },
837
+ "preferOver": ["chat"]
838
+ }
839
+ }
840
+ }
841
+ ```
842
+
843
+ When `channels.chat` is configured, OpenClaw considers both the channel id and
844
+ the preferred plugin id. If the lower-priority plugin was only selected because
845
+ it is bundled or enabled by default, OpenClaw disables it in the effective
846
+ runtime config so one plugin owns the channel and its tools. Explicit user
847
+ selection still wins: if the user explicitly enables both plugins, OpenClaw
848
+ preserves that choice and reports duplicate channel/tool diagnostics instead of
849
+ silently changing the requested plugin set.
850
+
851
+ Keep `preferOver` scoped to plugin ids that can really provide the same channel.
852
+ It is not a general priority field and it does not rename user config keys.
853
+
854
+ ## modelSupport reference
855
+
856
+ Use `modelSupport` when OpenClaw should infer your provider plugin from
857
+ shorthand model ids like `gpt-5.5` or `claude-sonnet-4.6` before plugin runtime
858
+ loads.
859
+
860
+ ```json
861
+ {
862
+ "modelSupport": {
863
+ "modelPrefixes": ["gpt-", "o1", "o3", "o4"],
864
+ "modelPatterns": ["^computer-use-preview"]
865
+ }
866
+ }
867
+ ```
868
+
869
+ OpenClaw applies this precedence:
870
+
871
+ - explicit `provider/model` refs use the owning `providers` manifest metadata
872
+ - `modelPatterns` beat `modelPrefixes`
873
+ - if one non-bundled plugin and one bundled plugin both match, the non-bundled
874
+ plugin wins
875
+ - remaining ambiguity is ignored until the user or config specifies a provider
876
+
877
+ Fields:
878
+
879
+ | Field | Type | What it means |
880
+ | --------------- | ---------- | ------------------------------------------------------------------------------- |
881
+ | `modelPrefixes` | `string[]` | Prefixes matched with `startsWith` against shorthand model ids. |
882
+ | `modelPatterns` | `string[]` | Regex sources matched against shorthand model ids after profile suffix removal. |
883
+
884
+ `modelPatterns` entries are compiled through `compileSafeRegex`, which rejects
885
+ patterns containing nested repetition (for example `(a+)+$`). Patterns that fail
886
+ the safety check are silently skipped, the same as syntactically invalid regex.
887
+ Keep patterns simple and avoid nested quantifiers.
888
+
889
+ ## modelCatalog reference
890
+
891
+ Use `modelCatalog` when OpenClaw should know provider model metadata before
892
+ loading plugin runtime. This is the manifest-owned source for fixed catalog
893
+ rows, provider aliases, suppression rules, and discovery mode. Runtime refresh
894
+ still belongs in provider runtime code, but the manifest tells core when runtime
895
+ is required.
896
+
897
+ ```json
898
+ {
899
+ "providers": ["openai"],
900
+ "modelCatalog": {
901
+ "providers": {
902
+ "openai": {
903
+ "baseUrl": "https://api.openai.com/v1",
904
+ "api": "openai-responses",
905
+ "models": [
906
+ {
907
+ "id": "gpt-5.4",
908
+ "name": "GPT-5.4",
909
+ "input": ["text", "image"],
910
+ "reasoning": true,
911
+ "contextWindow": 256000,
912
+ "maxTokens": 128000,
913
+ "cost": {
914
+ "input": 1.25,
915
+ "output": 10,
916
+ "cacheRead": 0.125
917
+ },
918
+ "status": "available",
919
+ "tags": ["default"]
920
+ }
921
+ ]
922
+ }
923
+ },
924
+ "aliases": {
925
+ "azure-openai-responses": {
926
+ "provider": "openai",
927
+ "api": "azure-openai-responses"
928
+ }
929
+ },
930
+ "suppressions": [
931
+ {
932
+ "provider": "azure-openai-responses",
933
+ "model": "gpt-5.3-codex-spark",
934
+ "reason": "not available on Azure OpenAI Responses"
935
+ }
936
+ ],
937
+ "discovery": {
938
+ "openai": "static"
939
+ }
940
+ }
941
+ }
942
+ ```
943
+
944
+ Top-level fields:
945
+
946
+ | Field | Type | What it means |
947
+ | ---------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
948
+ | `providers` | `Record<string, object>` | Catalog rows for provider ids owned by this plugin. Keys should also appear in top-level `providers`. |
949
+ | `aliases` | `Record<string, object>` | Provider aliases that should resolve to an owned provider for catalog or suppression planning. |
950
+ | `suppressions` | `object[]` | Model rows from another source that this plugin suppresses for a provider-specific reason. |
951
+ | `discovery` | `Record<string, "static" \| "refreshable" \| "runtime">` | Whether the provider catalog can be read from manifest metadata, refreshed into cache, or requires runtime. |
952
+ | `runtimeAugment` | `boolean` | Set to `true` only when the provider runtime must append catalog rows after manifest/config planning. |
953
+
954
+ `aliases` participates in provider ownership lookup for model-catalog planning.
955
+ Alias targets must be top-level providers owned by the same plugin. When a
956
+ provider-filtered list uses an alias, OpenClaw can read the owning manifest and
957
+ apply alias API/base URL overrides without loading provider runtime.
958
+ Aliases do not expand unfiltered catalog listings; broad lists emit the owning
959
+ canonical provider rows only.
960
+
961
+ `suppressions` replaces the old provider runtime `suppressBuiltInModel` hook.
962
+ Suppression entries are honored only when the provider is owned by the plugin or
963
+ declared as a `modelCatalog.aliases` key that targets an owned provider. Runtime
964
+ suppression hooks are no longer called during model resolution.
965
+
966
+ Provider fields:
967
+
968
+ | Field | Type | What it means |
969
+ | --------- | ------------------------ | ----------------------------------------------------------------- |
970
+ | `baseUrl` | `string` | Optional default base URL for models in this provider catalog. |
971
+ | `api` | `ModelApi` | Optional default API adapter for models in this provider catalog. |
972
+ | `headers` | `Record<string, string>` | Optional static headers that apply to this provider catalog. |
973
+ | `models` | `object[]` | Required model rows. Rows without an `id` are ignored. |
974
+
975
+ Model fields:
976
+
977
+ | Field | Type | What it means |
978
+ | --------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------- |
979
+ | `id` | `string` | Provider-local model id, without the `provider/` prefix. |
980
+ | `name` | `string` | Optional display name. |
981
+ | `api` | `ModelApi` | Optional per-model API override. |
982
+ | `baseUrl` | `string` | Optional per-model base URL override. |
983
+ | `headers` | `Record<string, string>` | Optional per-model static headers. |
984
+ | `input` | `Array<"text" \| "image" \| "document" \| "audio" \| "video">` | Modalities the model accepts. |
985
+ | `reasoning` | `boolean` | Whether the model exposes reasoning behavior. |
986
+ | `contextWindow` | `number` | Native provider context window. |
987
+ | `contextTokens` | `number` | Optional effective runtime context cap when different from `contextWindow`. |
988
+ | `maxTokens` | `number` | Maximum output tokens when known. |
989
+ | `cost` | `object` | Optional USD per million token pricing, including optional `tieredPricing`. |
990
+ | `compat` | `object` | Optional compatibility flags matching OpenClaw model config compatibility. |
991
+ | `status` | `"available"` \| `"preview"` \| `"deprecated"` \| `"disabled"` | Listing status. Suppress only when the row must not appear at all. |
992
+ | `statusReason` | `string` | Optional reason shown with non-available status. |
993
+ | `replaces` | `string[]` | Older provider-local model ids this model supersedes. |
994
+ | `replacedBy` | `string` | Replacement provider-local model id for deprecated rows. |
995
+ | `tags` | `string[]` | Stable tags used by pickers and filters. |
996
+
997
+ Suppression fields:
998
+
999
+ | Field | Type | What it means |
1000
+ | -------------------------- | ---------- | --------------------------------------------------------------------------------------------------------- |
1001
+ | `provider` | `string` | Provider id for the upstream row to suppress. Must be owned by this plugin or declared as an owned alias. |
1002
+ | `model` | `string` | Provider-local model id to suppress. |
1003
+ | `reason` | `string` | Optional message shown when the suppressed row is requested directly. |
1004
+ | `when.baseUrlHosts` | `string[]` | Optional list of effective provider base URL hosts required before the suppression applies. |
1005
+ | `when.providerConfigApiIn` | `string[]` | Optional list of exact provider-config `api` values required before the suppression applies. |
1006
+
1007
+ Do not put runtime-only data in `modelCatalog`. Use `static` only when manifest
1008
+ rows are complete enough for provider-filtered list and picker surfaces to skip
1009
+ registry/runtime discovery. Use `refreshable` when manifest rows are useful
1010
+ listable seeds or supplements but a refresh/cache can add more rows later;
1011
+ refreshable rows are not authoritative by themselves. Use `runtime` when OpenClaw
1012
+ must load provider runtime to know the list.
1013
+
1014
+ ## modelIdNormalization reference
1015
+
1016
+ Use `modelIdNormalization` for cheap provider-owned model-id cleanup that must
1017
+ happen before provider runtime loads. This keeps aliases such as short model
1018
+ names, provider-local legacy ids, and proxy prefix rules in the owning plugin
1019
+ manifest instead of in core model-selection tables.
1020
+
1021
+ ```json
1022
+ {
1023
+ "providers": ["anthropic", "openrouter"],
1024
+ "modelIdNormalization": {
1025
+ "providers": {
1026
+ "anthropic": {
1027
+ "aliases": {
1028
+ "sonnet-4.6": "claude-sonnet-4-6"
1029
+ }
1030
+ },
1031
+ "openrouter": {
1032
+ "prefixWhenBare": "openrouter"
1033
+ }
1034
+ }
1035
+ }
1036
+ }
1037
+ ```
1038
+
1039
+ Provider fields:
1040
+
1041
+ | Field | Type | What it means |
1042
+ | ------------------------------------ | ----------------------- | ----------------------------------------------------------------------------------------- |
1043
+ | `aliases` | `Record<string,string>` | Case-insensitive exact model-id aliases. Values are returned as written. |
1044
+ | `stripPrefixes` | `string[]` | Prefixes to remove before alias lookup, useful for legacy provider/model duplication. |
1045
+ | `prefixWhenBare` | `string` | Prefix to add when the normalized model id does not already contain `/`. |
1046
+ | `prefixWhenBareAfterAliasStartsWith` | `object[]` | Conditional bare-id prefix rules after alias lookup, keyed by `modelPrefix` and `prefix`. |
1047
+
1048
+ ## providerEndpoints reference
1049
+
1050
+ Use `providerEndpoints` for endpoint classification that generic request policy
1051
+ must know before provider runtime loads. Core still owns the meaning of each
1052
+ `endpointClass`; plugin manifests own the host and base URL metadata.
1053
+
1054
+ Endpoint fields:
1055
+
1056
+ | Field | Type | What it means |
1057
+ | ------------------------------ | ---------- | ---------------------------------------------------------------------------------------------- |
1058
+ | `endpointClass` | `string` | Known core endpoint class, such as `openrouter`, `moonshot-native`, or `google-vertex`. |
1059
+ | `hosts` | `string[]` | Exact hostnames that map to the endpoint class. |
1060
+ | `hostSuffixes` | `string[]` | Host suffixes that map to the endpoint class. Prefix with `.` for domain suffix-only matching. |
1061
+ | `baseUrls` | `string[]` | Exact normalized HTTP(S) base URLs that map to the endpoint class. |
1062
+ | `googleVertexRegion` | `string` | Static Google Vertex region for exact global hosts. |
1063
+ | `googleVertexRegionHostSuffix` | `string` | Suffix to strip from matching hosts to expose the Google Vertex region prefix. |
1064
+
1065
+ ## providerRequest reference
1066
+
1067
+ Use `providerRequest` for cheap request-compatibility metadata that generic
1068
+ request policy needs without loading provider runtime. Keep behavior-specific
1069
+ payload rewriting in provider runtime hooks or shared provider-family helpers.
1070
+
1071
+ ```json
1072
+ {
1073
+ "providers": ["vllm"],
1074
+ "providerRequest": {
1075
+ "providers": {
1076
+ "vllm": {
1077
+ "family": "vllm",
1078
+ "openAICompletions": {
1079
+ "supportsStreamingUsage": true
1080
+ }
1081
+ }
1082
+ }
1083
+ }
1084
+ }
1085
+ ```
1086
+
1087
+ Provider fields:
1088
+
1089
+ | Field | Type | What it means |
1090
+ | --------------------- | ------------ | -------------------------------------------------------------------------------------- |
1091
+ | `family` | `string` | Provider family label used by generic request compatibility decisions and diagnostics. |
1092
+ | `compatibilityFamily` | `"moonshot"` | Optional provider-family compatibility bucket for shared request helpers. |
1093
+ | `openAICompletions` | `object` | OpenAI-compatible completions request flags, currently `supportsStreamingUsage`. |
1094
+
1095
+ ## secretProviderIntegrations reference
1096
+
1097
+ Use `secretProviderIntegrations` when a plugin can publish a reusable SecretRef
1098
+ exec provider preset. OpenClaw reads this metadata before plugin runtime loads,
1099
+ stores plugin ownership in `secrets.providers.<alias>.pluginIntegration`, and
1100
+ leaves actual secret resolution to the SecretRef runtime.
1101
+ Presets are exposed only for bundled plugins and installed plugins discovered
1102
+ from the managed plugin install roots, such as git and ClawHub installs.
1103
+
1104
+ ```json
1105
+ {
1106
+ "secretProviderIntegrations": {
1107
+ "secret-store": {
1108
+ "providerAlias": "team-secrets",
1109
+ "displayName": "Team secrets",
1110
+ "source": "exec",
1111
+ "command": "${node}",
1112
+ "args": ["./bin/resolve-secrets.mjs"]
1113
+ }
1114
+ }
1115
+ }
1116
+ ```
1117
+
1118
+ The map key is the integration id. If `providerAlias` is omitted, OpenClaw uses
1119
+ the integration id as the SecretRef provider alias. Provider aliases must match
1120
+ the normal SecretRef provider alias pattern, for example `team-secrets` or
1121
+ `onepassword-work`.
1122
+
1123
+ When an operator selects the preset, OpenClaw writes a provider reference like:
1124
+
1125
+ ```json
1126
+ {
1127
+ "secrets": {
1128
+ "providers": {
1129
+ "team-secrets": {
1130
+ "source": "exec",
1131
+ "pluginIntegration": {
1132
+ "pluginId": "acme-secrets",
1133
+ "integrationId": "secret-store"
1134
+ }
1135
+ }
1136
+ }
1137
+ }
1138
+ }
1139
+ ```
1140
+
1141
+ At startup/reload, OpenClaw resolves that provider by loading current plugin
1142
+ manifest metadata, checking that the owning plugin is installed and active, and
1143
+ materializing the exec command from the manifest. Disabling or removing the
1144
+ plugin revokes the provider for active SecretRefs. Operators who want standalone
1145
+ exec configuration can still write manual `command`/`args` providers directly.
1146
+
1147
+ Only `source: "exec"` presets are currently supported. `command` must be
1148
+ `${node}`, and `args[0]` must be a `./` plugin-root-relative resolver script.
1149
+ OpenClaw materializes it at startup/reload to the current Node executable and
1150
+ the absolute in-plugin script path. Node options such as `--require`, `--import`,
1151
+ `--loader`, `--env-file`, `--eval`, and `--print` are not part of the manifest
1152
+ preset contract. Operators who need non-Node commands can configure standalone
1153
+ manual exec providers directly.
1154
+
1155
+ OpenClaw derives `trustedDirs` for manifest presets from the plugin root and,
1156
+ for `${node}` presets, the current Node executable directory. Manifest-authored
1157
+ `trustedDirs` are ignored. Other exec provider options such as `timeoutMs`,
1158
+ `maxOutputBytes`, `jsonOnly`, `env`, `passEnv`, and `allowInsecurePath` pass
1159
+ through to the normal SecretRef exec provider config.
1160
+
1161
+ ## modelPricing reference
1162
+
1163
+ Use `modelPricing` when a provider needs control-plane pricing behavior before
1164
+ runtime loads. The Gateway pricing cache reads this metadata without importing
1165
+ provider runtime code.
1166
+
1167
+ ```json
1168
+ {
1169
+ "providers": ["ollama", "openrouter"],
1170
+ "modelPricing": {
1171
+ "providers": {
1172
+ "ollama": {
1173
+ "external": false
1174
+ },
1175
+ "openrouter": {
1176
+ "openRouter": {
1177
+ "passthroughProviderModel": true
1178
+ },
1179
+ "liteLLM": false
1180
+ }
1181
+ }
1182
+ }
1183
+ }
1184
+ ```
1185
+
1186
+ Provider fields:
1187
+
1188
+ | Field | Type | What it means |
1189
+ | ------------ | ----------------- | -------------------------------------------------------------------------------------------------- |
1190
+ | `external` | `boolean` | Set `false` for local/self-hosted providers that should never fetch OpenRouter or LiteLLM pricing. |
1191
+ | `openRouter` | `false \| object` | OpenRouter pricing lookup mapping. `false` disables OpenRouter lookup for this provider. |
1192
+ | `liteLLM` | `false \| object` | LiteLLM pricing lookup mapping. `false` disables LiteLLM lookup for this provider. |
1193
+
1194
+ Source fields:
1195
+
1196
+ | Field | Type | What it means |
1197
+ | -------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------- |
1198
+ | `provider` | `string` | External catalog provider id when it differs from the OpenClaw provider id, for example `z-ai` for a `zai` provider. |
1199
+ | `passthroughProviderModel` | `boolean` | Treat slash-containing model ids as nested provider/model refs, useful for proxy providers such as OpenRouter. |
1200
+ | `modelIdTransforms` | `"version-dots"[]` | Extra external catalog model-id variants. `version-dots` tries dotted version ids like `claude-opus-4.6`. |
1201
+
1202
+ ### OpenClaw Provider Index
1203
+
1204
+ The OpenClaw Provider Index is OpenClaw-owned preview metadata for providers
1205
+ whose plugins may not be installed yet. It is not part of a plugin manifest.
1206
+ Plugin manifests remain the installed-plugin authority. The Provider Index is
1207
+ the internal fallback contract that future installable-provider and pre-install
1208
+ model picker surfaces will consume when a provider plugin is not installed.
1209
+
1210
+ Catalog authority order:
1211
+
1212
+ 1. User config.
1213
+ 2. Installed plugin manifest `modelCatalog`.
1214
+ 3. Model catalog cache from explicit refresh.
1215
+ 4. OpenClaw Provider Index preview rows.
1216
+
1217
+ The Provider Index must not contain secrets, enabled state, runtime hooks, or
1218
+ live account-specific model data. Its preview catalogs use the same
1219
+ `modelCatalog` provider row shape as plugin manifests, but should stay limited
1220
+ to stable display metadata unless runtime adapter fields such as `api`,
1221
+ `baseUrl`, pricing, or compatibility flags are intentionally kept aligned with
1222
+ the installed plugin manifest. Providers with live `/models` discovery should
1223
+ write refreshed rows through the explicit model catalog cache path instead of
1224
+ making normal listing or onboarding call provider APIs.
1225
+
1226
+ Provider Index entries may also carry installable-plugin metadata for providers
1227
+ whose plugin has moved out of core or is otherwise not installed yet. This
1228
+ metadata mirrors the channel catalog pattern: package name, npm install spec,
1229
+ expected integrity, and cheap auth-choice labels are enough to show an
1230
+ installable setup option. Once the plugin is installed, its manifest wins and
1231
+ the Provider Index entry is ignored for that provider.
1232
+
1233
+ Legacy top-level capability keys are deprecated. Use `openclaw doctor --fix` to
1234
+ move `speechProviders`, `realtimeTranscriptionProviders`,
1235
+ `realtimeVoiceProviders`, `mediaUnderstandingProviders`,
1236
+ `imageGenerationProviders`, `videoGenerationProviders`,
1237
+ `webFetchProviders`, and `webSearchProviders` under `contracts`; normal
1238
+ manifest loading no longer treats those top-level fields as capability
1239
+ ownership.
1240
+
1241
+ ## Manifest versus package.json
1242
+
1243
+ The two files serve different jobs:
1244
+
1245
+ | File | Use it for |
1246
+ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
1247
+ | `openclaw.plugin.json` | Discovery, config validation, auth-choice metadata, and UI hints that must exist before plugin code runs |
1248
+ | `package.json` | npm metadata, dependency installation, and the `openclaw` block used for entrypoints, install gating, setup, or catalog metadata |
1249
+
1250
+ If you are unsure where a piece of metadata belongs, use this rule:
1251
+
1252
+ - if OpenClaw must know it before loading plugin code, put it in `openclaw.plugin.json`
1253
+ - if it is about packaging, entry files, or npm install behavior, put it in `package.json`
1254
+
1255
+ ### package.json fields that affect discovery
1256
+
1257
+ Some pre-runtime plugin metadata intentionally lives in `package.json` under the
1258
+ `openclaw` block instead of `openclaw.plugin.json`.
1259
+ `openclaw.bundle` and `openclaw.bundle.json` are not OpenClaw plugin contracts;
1260
+ native plugins must use `openclaw.plugin.json` plus the supported
1261
+ `package.json#openclaw` fields below.
1262
+
1263
+ Important examples:
1264
+
1265
+ | Field | What it means |
1266
+ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1267
+ | `openclaw.extensions` | Declares native plugin entrypoints. Must stay inside the plugin package directory. |
1268
+ | `openclaw.runtimeExtensions` | Declares built JavaScript runtime entrypoints for installed packages. Must stay inside the plugin package directory. |
1269
+ | `openclaw.setupEntry` | Lightweight setup-only entrypoint used during onboarding, deferred channel startup, and read-only channel status/SecretRef discovery. Must stay inside the plugin package directory. |
1270
+ | `openclaw.runtimeSetupEntry` | Declares the built JavaScript setup entrypoint for installed packages. Requires `setupEntry`, must exist, and must stay inside the plugin package directory. |
1271
+ | `openclaw.channel` | Cheap channel catalog metadata like labels, docs paths, aliases, and selection copy. |
1272
+ | `openclaw.channel.commands` | Static native command and native skill auto-default metadata used by config, audit, and command-list surfaces before channel runtime loads. |
1273
+ | `openclaw.channel.configuredState` | Lightweight configured-state checker metadata that can answer "does env-only setup already exist?" without loading the full channel runtime. |
1274
+ | `openclaw.channel.persistedAuthState` | Lightweight persisted-auth checker metadata that can answer "is anything already signed in?" without loading the full channel runtime. |
1275
+ | `openclaw.install.clawhubSpec` / `openclaw.install.npmSpec` / `openclaw.install.localPath` | Install/update hints for bundled and externally published plugins. |
1276
+ | `openclaw.install.defaultChoice` | Preferred install path when multiple install sources are available. |
1277
+ | `openclaw.install.minHostVersion` | Minimum supported OpenClaw host version, using a semver floor like `>=2026.3.22` or `>=2026.5.1-beta.1`. |
1278
+ | `openclaw.compat.pluginApi` | Minimum OpenClaw plugin API range required by this package, using a semver floor like `>=2026.5.27`. |
1279
+ | `openclaw.install.expectedIntegrity` | Expected npm dist integrity string such as `sha512-...`; install and update flows verify the fetched artifact against it. |
1280
+ | `openclaw.install.allowInvalidConfigRecovery` | Allows a narrow bundled-plugin reinstall recovery path when config is invalid. |
1281
+ | `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Lets setup-runtime channel surfaces load before listen, then defers the full configured channel plugin until post-listen activation. |
1282
+
1283
+ Manifest metadata decides which provider/channel/setup choices appear in
1284
+ onboarding before runtime loads. `package.json#openclaw.install` tells
1285
+ onboarding how to fetch or enable that plugin when the user picks one of those
1286
+ choices. Do not move install hints into `openclaw.plugin.json`.
1287
+
1288
+ `openclaw.install.minHostVersion` is enforced during install and manifest
1289
+ registry loading for non-bundled plugin sources. Invalid values are rejected;
1290
+ newer-but-valid values skip external plugins on older hosts. Bundled source
1291
+ plugins are assumed to be co-versioned with the host checkout.
1292
+
1293
+ `openclaw.compat.pluginApi` is enforced during package install for non-bundled
1294
+ plugin sources. Use it for the OpenClaw plugin SDK/runtime API floor that the
1295
+ package was built against. It can be stricter than `minHostVersion` when a
1296
+ plugin package needs a newer API but still keeps a lower install hint for other
1297
+ flows. Official OpenClaw release sync bumps existing official plugin API floors
1298
+ to the OpenClaw release version by default, but plugin-only releases can keep a
1299
+ lower floor when the package intentionally supports older hosts. Do not use the
1300
+ package version alone as the compatibility contract. `peerDependencies.openclaw`
1301
+ remains npm package metadata; OpenClaw uses the `openclaw.compat.pluginApi`
1302
+ contract for install compatibility decisions.
1303
+
1304
+ Official install-on-demand metadata should use `clawhubSpec` when the plugin is
1305
+ published on ClawHub; onboarding treats that as the preferred remote source and
1306
+ records ClawHub artifact facts after install. `npmSpec` remains the compatibility
1307
+ fallback for packages that have not moved to ClawHub yet.
1308
+
1309
+ Exact npm version pinning already lives in `npmSpec`, for example
1310
+ `"npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3"`. Official external catalog
1311
+ entries should pair exact specs with `expectedIntegrity` so update flows fail
1312
+ closed if the fetched npm artifact no longer matches the pinned release.
1313
+ Interactive onboarding still offers trusted registry npm specs, including bare
1314
+ package names and dist-tags, for compatibility. Catalog diagnostics can
1315
+ distinguish exact, floating, integrity-pinned, missing-integrity, package-name
1316
+ mismatch, and invalid default-choice sources. They also warn when
1317
+ `expectedIntegrity` is present but there is no valid npm source it can pin.
1318
+ When `expectedIntegrity` is present,
1319
+ install/update flows enforce it; when it is omitted, the registry resolution is
1320
+ recorded without an integrity pin.
1321
+
1322
+ Channel plugins should provide `openclaw.setupEntry` when status, channel list,
1323
+ or SecretRef scans need to identify configured accounts without loading the full
1324
+ runtime. The setup entry should expose channel metadata plus setup-safe config,
1325
+ status, and secrets adapters; keep network clients, gateway listeners, and
1326
+ transport runtimes in the main extension entrypoint.
1327
+
1328
+ Runtime entrypoint fields do not override package-boundary checks for source
1329
+ entrypoint fields. For example, `openclaw.runtimeExtensions` cannot make an
1330
+ escaping `openclaw.extensions` path loadable.
1331
+
1332
+ `openclaw.install.allowInvalidConfigRecovery` is intentionally narrow. It does
1333
+ not make arbitrary broken configs installable. Today it only allows install
1334
+ flows to recover from specific stale bundled-plugin upgrade failures, such as a
1335
+ missing bundled plugin path or a stale `channels.<id>` entry for that same
1336
+ bundled plugin. Unrelated config errors still block install and send operators
1337
+ to `openclaw doctor --fix`.
1338
+
1339
+ `openclaw.channel.persistedAuthState` is package metadata for a tiny checker
1340
+ module:
1341
+
1342
+ ```json
1343
+ {
1344
+ "openclaw": {
1345
+ "channel": {
1346
+ "id": "whatsapp",
1347
+ "persistedAuthState": {
1348
+ "specifier": "./auth-presence",
1349
+ "exportName": "hasAnyWhatsAppAuth"
1350
+ }
1351
+ }
1352
+ }
1353
+ }
1354
+ ```
1355
+
1356
+ Use it when setup, doctor, status, or read-only presence flows need a cheap
1357
+ yes/no auth probe before the full channel plugin loads. Persisted auth state is
1358
+ not configured channel state: do not use this metadata to auto-enable plugins,
1359
+ repair runtime dependencies, or decide whether a channel runtime should load.
1360
+ The target export should be a small function that reads persisted state only; do
1361
+ not route it through the full channel runtime barrel.
1362
+
1363
+ `openclaw.channel.configuredState` follows the same shape for cheap env-only
1364
+ configured checks:
1365
+
1366
+ ```json
1367
+ {
1368
+ "openclaw": {
1369
+ "channel": {
1370
+ "id": "telegram",
1371
+ "configuredState": {
1372
+ "specifier": "./configured-state",
1373
+ "exportName": "hasTelegramConfiguredState"
1374
+ }
1375
+ }
1376
+ }
1377
+ }
1378
+ ```
1379
+
1380
+ Use it when a channel can answer configured-state from env or other tiny
1381
+ non-runtime inputs. If the check needs full config resolution or the real
1382
+ channel runtime, keep that logic in the plugin `config.hasConfiguredState`
1383
+ hook instead.
1384
+
1385
+ ## Discovery precedence (duplicate plugin ids)
1386
+
1387
+ OpenClaw discovers plugins from several roots. For the raw filesystem scan
1388
+ order, see [Plugin scan
1389
+ order](/gateway/configuration-reference#plugin-scan-order). If two discoveries
1390
+ share the same `id`, only the **highest-precedence** manifest is kept;
1391
+ lower-precedence duplicates are dropped instead of loading beside it.
1392
+
1393
+ Precedence, highest to lowest:
1394
+
1395
+ 1. **Config-selected** — a path explicitly pinned in `plugins.entries.<id>`
1396
+ 2. **Bundled** — plugins shipped with OpenClaw
1397
+ 3. **Global install** — plugins installed into the global OpenClaw plugin root
1398
+ 4. **Workspace** — plugins discovered relative to the current workspace
1399
+
1400
+ Implications:
1401
+
1402
+ - A forked or stale copy of a bundled plugin sitting in the workspace will not shadow the bundled build.
1403
+ - To actually override a bundled plugin with a local one, pin it via `plugins.entries.<id>` so it wins by precedence rather than relying on workspace discovery.
1404
+ - Duplicate drops are logged so Doctor and startup diagnostics can point at the discarded copy.
1405
+ - Config-selected duplicate overrides are worded as explicit overrides in diagnostics, but still warn so stale forks and accidental shadows stay visible.
1406
+
1407
+ ## JSON Schema requirements
1408
+
1409
+ - **Every plugin must ship a JSON Schema**, even if it accepts no config.
1410
+ - An empty schema is acceptable (for example, `{ "type": "object", "additionalProperties": false }`).
1411
+ - Schemas are validated at config read/write time, not at runtime.
1412
+ - When extending or forking a bundled plugin with new config keys, update that plugin's `openclaw.plugin.json` `configSchema` at the same time. Bundled plugin schemas are strict, so adding `plugins.entries.<id>.config.myNewKey` in user config without adding `myNewKey` to `configSchema.properties` will be rejected before the plugin runtime loads.
1413
+
1414
+ Example schema extension:
1415
+
1416
+ ```json
1417
+ {
1418
+ "configSchema": {
1419
+ "type": "object",
1420
+ "additionalProperties": false,
1421
+ "properties": {
1422
+ "myNewKey": {
1423
+ "type": "string"
1424
+ }
1425
+ }
1426
+ }
1427
+ }
1428
+ ```
1429
+
1430
+ ## Validation behavior
1431
+
1432
+ - Unknown `channels.*` keys are **errors**, unless the channel id is declared by
1433
+ a plugin manifest.
1434
+ - `plugins.entries.<id>`, `plugins.allow`, `plugins.deny`, and `plugins.slots.*`
1435
+ must reference **discoverable** plugin ids. Unknown ids are **errors**.
1436
+ - If a plugin is installed but has a broken or missing manifest or schema,
1437
+ validation fails and Doctor reports the plugin error.
1438
+ - If plugin config exists but the plugin is **disabled**, the config is kept and
1439
+ a **warning** is surfaced in Doctor + logs.
1440
+
1441
+ See [Configuration reference](/gateway/configuration) for the full `plugins.*` schema.
1442
+
1443
+ ## Notes
1444
+
1445
+ - The manifest is **required for native OpenClaw plugins**, including local filesystem loads. Runtime still loads the plugin module separately; the manifest is only for discovery + validation.
1446
+ - Native manifests are parsed with JSON5, so comments, trailing commas, and unquoted keys are accepted as long as the final value is still an object.
1447
+ - Only documented manifest fields are read by the manifest loader. Avoid custom top-level keys.
1448
+ - `channels`, `providers`, `cliBackends`, and `skills` can all be omitted when a plugin does not need them.
1449
+ - `providerCatalogEntry` must stay lightweight and should not import broad runtime code; use it for static provider catalog metadata or narrow discovery descriptors, not request-time execution.
1450
+ - Exclusive plugin kinds are selected through `plugins.slots.*`: `kind: "memory"` via `plugins.slots.memory`, `kind: "context-engine"` via `plugins.slots.contextEngine` (default `legacy`).
1451
+ - Declare exclusive plugin kind in this manifest. Runtime-entry `OpenClawPluginDefinition.kind` is deprecated and remains only as a compatibility fallback for older plugins.
1452
+ - Env-var metadata (`setup.providers[].envVars`, deprecated `providerAuthEnvVars`, and `channelEnvVars`) is declarative only. Status, audit, cron delivery validation, and other read-only surfaces still apply plugin trust and effective activation policy before treating an env var as configured.
1453
+ - For runtime wizard metadata that requires provider code, see [Provider runtime hooks](/plugins/architecture-internals#provider-runtime-hooks).
1454
+ - If your plugin depends on native modules, document the build steps and any package-manager allowlist requirements (for example, pnpm `allow-build-scripts` + `pnpm rebuild <package>`).
1455
+
1456
+ ## Related
1457
+
1458
+ <CardGroup cols={3}>
1459
+ <Card title="Building plugins" href="/plugins/building-plugins" icon="rocket">
1460
+ Getting started with plugins.
1461
+ </Card>
1462
+ <Card title="Plugin architecture" href="/plugins/architecture" icon="diagram-project">
1463
+ Internal architecture and capability model.
1464
+ </Card>
1465
+ <Card title="SDK overview" href="/plugins/sdk-overview" icon="book">
1466
+ Plugin SDK reference and subpath imports.
1467
+ </Card>
1468
+ </CardGroup>