refactor: remove expired plugin compatibility surfaces (#111451)

* docs(secrets): remove retired web credential paths

* refactor(web): remove retired provider compatibility paths

* refactor(providers): delete retired compatibility routes

* refactor(secrets): remove retired credential aliases

* refactor(plugin-sdk): delete retired compatibility surfaces

* docs(plugin-sdk): remove retired migration guidance

* chore(plugin-sdk): refresh rebased surface budgets

* chore(plugin-sdk): refresh API removal baseline

* refactor(compat): migrate retired internal callers

* chore(plugin-sdk): refresh current-main baselines

* test(config): migrate plugin-owned secret assertions

* test(gateway): narrow plugin secret refs

* fix(plugin-sdk): preserve private boundary type identity

* chore(compat): remove stale sweep references

* chore(lint): lower max-lines budget

* refactor(secrets): remove unused web helper

* build(plugin-sdk): drop removed compat entries

* chore(plugin-sdk): refresh rebased API baseline

* chore(plugin-sdk): use Linux API baseline hash

* fix(plugin-sdk): preserve private bundled build entries

* fix(plugin-sdk): package private runtime facades

* fix(plugins): preserve external credential contracts
This commit is contained in:
Peter Steinberger
2026-07-19 11:04:48 -07:00
committed by GitHub
parent e6d7aee41d
commit c7e7ac2728
526 changed files with 4009 additions and 13992 deletions
-2
View File
@@ -631,7 +631,6 @@ src/channels/turn/kernel.test.ts
src/cli/capability-cli.test.ts
src/cli/command-secret-gateway.test.ts
src/cli/command-secret-gateway.ts
src/cli/command-secret-targets.test.ts
src/cli/command-secret-targets.ts
src/cli/config-cli.test.ts
src/cli/config-cli.ts
@@ -1007,7 +1006,6 @@ src/plugins/marketplace.test.ts
src/plugins/marketplace.ts
src/plugins/official-external-plugin-catalog.test.ts
src/plugins/official-external-plugin-catalog.ts
src/plugins/plugin-metadata-snapshot.ts
src/plugins/plugin-registry-snapshot.test.ts
src/plugins/provider-runtime.test.ts
src/plugins/provider-runtime.ts
+18 -211
View File
@@ -1,333 +1,140 @@
4f222069c2ba0c355b72e48a27da2294484dcce0a9b4b3fd3a7ea90a134130c7 module/index
f8baddc86ac0e924c7806957f90a6ebdd5916a362ad24b665824503ee77fc6a9 module/access-groups
7a8753532854ff6f6d2a0c8e6386653adce285f9f6a9b5e56e88c9ea49e79cc2 module/account-core
e7519fd1b7ff7003a6c8b9b640ffedd443a3754a10efc82877d48cd98cc6ba28 module/account-helpers
cbf4e2c3088f8886a7c9ea91325a66e0f0846cea21f0b2891f36399b4811306c module/account-id
6b674e7aa4006240227c16eb5c74360f1d67639e8f5580ad72499d6ed28283c4 module/account-resolution
820af87fab6f24d5aafe5f264fff8f3c4324edab10761022c28b6926f359e6e0 module/account-resolution-runtime
822ddd0df21c641ba0b198da30d60d8cddd38c0d740b005232287ffcb0bf5171 module/acp-binding-resolve-runtime
35395a46410738203c1b9621e4263e8214955af77a3011d45668f777c55cd4a1 module/acp-binding-runtime
2a7a3321dbad3e78e6d6ce2898666674f9cab6adeae9190e47c277079d32ae36 module/acp-runtime
ed5dd7c56969decc47a2528cf1115b781ee7b368f72b9f47e12c3bacd65d95d2 module/acp-runtime-backend
e5e67ddf3cab38fcbf9220bc3160715897e2709d9a9ff6ff36f1ecc9453c2367 module/agent-config-primitives
30452bae2a689fb75dcb6dba9ef11e5b95f9cbe0c62eb190a0fcb82d0a19ae52 module/agent-core
74daa746deb548379d3f0d6eac3c4d082df1034c4360cc03bf51fee0f10a2e4d module/agent-harness
e09226afd443cee02ed648f032f53bfeb60585617bb523a649995764d3c38da9 module/agent-harness-exec-review-runtime
ffacec9f51060b81c597a9d169e7ee0fa463fcbd18daffdce129d144897b2c5b module/agent-harness-runtime
ec22d7a039fb58d0b8343ad149322960d3d8ca58b3f4c70f2fa8a099f8186d0c module/agent-harness-task-runtime
5f63bf587bf3547d59d0dc5d0dc2fee54745aa6edaab4aa3ae700dba03443edb module/agent-harness-tool-runtime
c67e52e5bc6d6917f9a13f4133e7b18e111dbd33b66b6a5eae79623d9ff6e918 module/agent-harness-runtime
5168648cd946abad8a92822889f13ceacc87ed502314a66190d0b1eb8ebe76ea module/agent-media-payload
2c60564ae141dc249234e409994498f4143943d36c7860fa5759a63e4375e377 module/agent-runtime
d5191546cfd0b2dde39f6d9f5077ab1539aa359a90cf9a2ab13c5c19b7c948b9 module/agent-sessions
dd9282f1eeadf44db2887599b52d80db7f5fb99c6d9eac720dbf1b77065f2145 module/allow-from
55cea5390d68839ca7768b4a0cc570b17b65fa0fa3bc4d76130ef0f16cb79ede module/allowlist-config-edit
7ddd81bd5f55de9adf64bf4d92d012f24b37b6da0a72805a3a220d8feff24ca3 module/approval-auth-runtime
a973b03d88f2aa71d3b6c39241527c18d9b1b75f5639bf39cc9b080efbe7b6c6 module/approval-client-runtime
49cd817c2a01f9ba581f24d932dc04a65d79399746df862b3c3947cab659dda4 module/approval-delivery-runtime
2fd995aaf62ce912b97ac01f60260707c5e91b4e40d62167e6704acd5b533527 module/approval-gateway-runtime
37346f8621e2a12ca819f44075882aec1e4a7ebf12dbcd9ba772aeb8413404db module/approval-delivery-runtime
1ad8a27933d4092fb26c7ca1be389a0e463023004735d9e992656f81a4e2956f module/approval-gateway-runtime
aceab327f18983cfa074384b4510648be2156dfdd30415a2d7a48fd1f38da1c6 module/approval-handler-adapter-runtime
a453261fc6c0d45ad652992bfa3139a1295b6e6296878ee5fde2cf12b995516e module/approval-handler-runtime
1cb17e85297fa4419f7beb7fe7e03747bb6841277ec49fd0fb8794695b0a31f8 module/approval-native-runtime
f7564f1ac34e77d31a38fbd913089799ff459ca8d4500850f4bf35c22cabaa27 module/approval-reaction-runtime
0796ab79f6edbe0c5d6f8393224cc0069358e0a3b4d35d89364ec3dff6ddcc49 module/approval-reference-runtime
0426247e235b793bf13307439a2499ccc9359dab45c5fe05f9a2541240700651 module/approval-reply-runtime
a5e9215460bc99fb6e6cdd4bc67eb6466a5e99f28279e13d1769599c18dfe0b3 module/approval-runtime
6c81b9122ab0a5c3190700c0a234047274a8d48edddcc8f26d3859b886696068 module/async-lock-runtime
b8cfc79901397a7b6ec8b3df9ecccbc36b125ebda23be794deb1e9109acff628 module/approval-runtime
ad60ccc4fe9084d47f0477e02d9296bacad32f26d7456e2a84be8d25a53a25c2 module/boolean-param
333a906d4ad9d3e89102ab7eb9059a7f9c7277328041223ee3b0713442f56a29 module/browser-config
c117222faacb1c68bf6df6594fbf47c3ea0240fd1403f913ecb72e08730d32cf module/bundled-channel-config-schema
b6e53fb9c69840d71785325cd9a244809ffd6d3f0dd08ed0cccf816dd993f210 module/channel-actions
fcfd76dbfe818e8e8574a425f340fee935acf53d4484e961f54c3ec760fb15fe module/channel-activity-runtime
24c53c9cefacd8c1bec2aa91ba2b01e606f8b8477bc5cb2f99567225a4dcf67c module/channel-config-helpers
6e3b8ccee738f8eddde5d813b6e204d6f7c8541fda4cb279a3be3ead27f47e7d module/channel-actions
00d326fdff396dfcc657d1fd16a4015b81d60ae8bf7dad09ac1010b376814de6 module/channel-config-helpers
16dc9d32e8ca3ef78fc63e0fc4b20e6b943633e9572de1a49d24a880b6ffc66c module/channel-config-primitives
5da2caccf30780a4cf86ac710e2ca42cc9576cb1c49291c0929889fec0cc2257 module/channel-config-schema
e6c20ca52397a90297c49928e9b8d98a48059ed107d21f8cec6a7ec9c9e2d1ab module/channel-config-schema-legacy
8740f7cc786a380043e41aaf710ac47931b3587c122bb152d5f0231f98fd5351 module/channel-config-writes
2dd98659d9600e755f09ef00dd91c36692b8562ed3700461937e94f6cd1e640a module/channel-contract
3db1a968e5b8aa97623a48a9ee76393d578d4bb90634fa59f499a2fd87b9da72 module/channel-core
a6bc51efd3ce23e65432c9a6790670e2a0acb96ae7263fedbaed52ea353228be module/channel-core
fbf353eb38ae68d8ded3f2a60b432c7bb2c245d2ec7e7c9f53c6da19a0db0938 module/channel-entry-contract
264a002a036aa66f87008971130c0264b15e62b00a35f473149aa846e3bcddad module/channel-envelope
982f29a18e07228e3da82cae67d06ff38249592a29c2fd28f01f0d2016ff80d9 module/channel-feedback
19d42de92c4f27a6d785638d6118a2e1302f0cb64cc71a12d6c1875e1e9e1e9a module/channel-inbound
31b33966c8b55f5055066182cf05b3fc68390c26026ce09fe9fb9e176f794925 module/channel-inbound
2940039d5ebdb16c1d745914390db01c0f5f1e9cff33f95ea36c9e77d97c2bae module/channel-inbound-debounce
c84239139c3ce21cc8ca7c01ae9f2a653197afdc7be95a7598616e112e743f4f module/channel-inbound-roots
91425ad75ddb58a3796f7bc88570cb2c81b3db0dd6521a7ce0e55f9148880a47 module/channel-ingress-runtime
c97dd36cdf8f83c2893c33e9430a93cd131a03d855725783ca5b545de0cf84f8 module/channel-lifecycle
25230ecd4db8a49f94e29fffce985d40017227a778b1dd59b9c426b9ca627194 module/channel-location
159d034b431d113f3a6dc41ec0bcadba2d6664051f158330b0e3dd3da8b5d42f module/channel-logging
a693996a92b387ec26146daa7ba73b6b026cd8fc5e6d72874a6856d9c38b3f53 module/channel-mention-gating
5eccd03e85c032753e0d8931dace4cd952b83e4975d0acae272849fdabfbfe90 module/channel-message
1eeb53fdc4f526945c2cad5783e3b3184491d14c5286a5cca8145b5c97345e1d module/channel-message-runtime
e2b4d1923a19b927e912622576d43d20a6e188c124a7bc588fe567cd3c1c924e module/channel-outbound
50c61de5d522abadcae79841335aeac25e3791e6dbb0cfc3d64b2720a8c514ce module/channel-pairing
e3f8f0d0aaa3ea3a773ce2011d7af30f18b40c27cbbad0df2d53cd582a56b631 module/channel-pairing-paths
ee4292b069d4d48cce4fc2dc26df5b5c87eb1fa4769f1f6be9a10c3e1221e1a9 module/channel-plugin-common
bb82ca1819308189c4ba7b1e83e0c39fb0fb8b5a7081ee874480d64426778454 module/channel-policy
9c8c877ab0c28ac2d9a84ad33a60e09eecfd68ce0080989ac033df14a8e9bff5 module/channel-reply-options-runtime
cc0a77137b304b27a313791aa30e43efb4acc254da7590bd47493d81e7104fba module/channel-reply-pipeline
7521b7b935944c2ca5fdd8171ba921f134b68e6f29e2c9409e4e6290ce667de1 module/channel-route
a676d58af7bc732dbee41157d4e5c9efba4d429ae6502224de0d8ee2d4c23220 module/channel-runtime
bba5540be7cf9613a163663decdb2affe2af9bbd3ad7914989ab186f9c2abec1 module/channel-runtime-context
17cec26bc71fc43a066049ef63f95bf29737113c26ab13689ceff602b9aa11d6 module/channel-secret-basic-runtime
0ceb4378709eb2d92a62a275f87fa04e18f77df8f942a9a0acef81019ebc1e24 module/channel-secret-runtime
96e38ca99edb7d39839a7675939d5b8c199f8625502cae15e66b4bc7885922a7 module/channel-secret-tts-runtime
7c90157a95bc0523fc66b1f78ce140f7ec7dbf809dfa3a480244efc01f972754 module/channel-send-result
e705b97daac4fbd7f6aeb2e515b1cdaa1db342684644eaef8197767b2595826e module/channel-setup
47719805c7a1d2623dcecafad50abb6cc674262b250e1f0d7020a79ad41cfd42 module/channel-status
a4918b82b795f086ae71acb43e2b725fda01f6c8bf2333c155a52581bd4cf8aa module/channel-streaming
dce2e08fdc6794298b93d8ace5dbcbf9dc9981ed43e41b9e894c6c9f656501c6 module/channel-targets
a8afdbd6b36b7e94b64ada56a579a5be72179e9b5e6d2b67542f084f5f7a29c4 module/chat-channel-ids
f687dbadcf1c63d09c03c09d1999bb37e8d49593a311b1c0fa42bcc035477146 module/cli-backend
1ed3823c895332a492eccac1bbf7214d63faa57e64de77f1e33004da7e394e8b module/cli-runtime
5f4c67188a022b1c9ad57799df82d2cef6e5744f3ddc29698de4e8e70a30f143 module/codex-mcp-projection
c89ec1b194b76f67a6f4dd108dccf460da6065646cba31374c8aa748f23a39e4 module/collection-runtime
ff4173b17c0140965b08ddf93d4b32c47cd50b65a52ff9ac43db2921658d3a30 module/command-auth
391e6f0c77da2e17a058fc5aea87fd193830b2a14e12fae77c7f63b0226f0bb5 module/command-auth
7dede491d22f7226d955210befca09b32e955c59436c27500f0c7d1971ba07d5 module/command-auth-native
fa2df02bede6ed8843e5c2bd605c6ea5cd20313c305593fbd371dba6f1b931c3 module/command-detection
a224ce0381a32ed7a9d2261669c444f7f46701c15bf2f6121e9b057d9910da78 module/command-gating
28a0cae8dee664aef14b1a64c86a46d0fb5637cf9f671790d4fc9ba205e42820 module/command-primitives-runtime
eb4c757fe0086c1dbfa4c3f3caf3dcff0d3cab3924c608237f08f740a6ee5f59 module/command-status
10f073c8c7c7384843cb89548e01cf66241e23ebabea01ccc1f9ac7e774f563e module/command-status-runtime
d340686cf814326b5a554a32cc5ca324a9e1254a933c4d9d8d1ada5ac7109a10 module/command-surface
e26e0f75b43c5bbadd34401b21d8c76406ca0b87cc997be5abd100462d318f1a module/compat
2cf2f7732af5491a14466fc984f833ddce2b0f6a20b1c82796c3ee856e2966ce module/concurrency-runtime
235a9e4d983042c3db156efcab0e333984cbbf13ebdfcc44a3a5ab40cf3edb4f module/config-contracts
20f3f8042de53e4eee61b64de9102c8c202b9299e6a29235647a4729f70145f2 module/config-mutation
316949815affe623ac63951a5db580527f02663576dffa084f02768f612c0c1c module/config-runtime
a8ce8d7a8df9d427956a3d6f2daf00b0234be473e8cec2d01b84f34c6d7c78bb module/config-schema
b317e9810e57d07ddd720d68c1ce93172e5bc331d9c095a332edc52f565d5ce4 module/config-types
42d15153981cfe3adc1d5f91621434c56f07a9bd48c15ce34742f72dd040c142 module/context-visibility-runtime
03636897fb99cb73e4d8620c8a0e0d72b4d52fc32bf94f525af2aa88c489c6c2 module/conversation-binding-runtime
0c0bb80f81d0c769f343e3be95f01b3d734077c12e831367440952052aafbeb7 module/config-runtime
c1ea9510dfda047609a99d5d2cd1f1560f5d469a36e6b695766213d695c25b0f module/conversation-runtime
d4ade9c9530585638e57602fcbe3ba1caa21a8d1ce88d87019d2d7048e3988b4 module/core
93b61bc7893ed37047c97c10360588c0acf5df72cf49c54678ce68ed8d07f65c module/cron-store-runtime
e6fc74e18435cd4639801d9bd1f224154d1cd9405cdb3ba91a24b67c0792e9d2 module/dangerous-name-runtime
d9267aacc65aeebf0046d4eef691e5a510764063e6c7942b1d6bc7a282ca67a1 module/core
4af19d59c2f18674e7d7f7dc1b358b644dc707e6bd601dc47168bd9e4a669940 module/dedupe-runtime
feb743a5f25297abc7bb47d22ef060e0ed54b0cff69ac50885681dfade970f8e module/delivery-queue-runtime
f70c93d28053ca2e8353e45e6515ce7acef188097c6117d1545965d0699c8004 module/device-bootstrap
6215d3af5923bf5a616d73062534968b69f448e3e30adc64ae9caebdd1a46d71 module/diagnostic-runtime
9885951a437128dd3ebea5a54dcd59e6e9f4a1ba78b166c2c4aa0a286f108fe5 module/direct-dm
9cdf7fbc6551e0373d6ab007128a266b200b5c8916fc4f73ffa77192cb0c3e9b module/direct-dm-access
371ee1fd78810526745c93c24c4b85562c981676adcc33aaa0c627f5d2d45810 module/direct-dm-guard-policy
91278c800e0f87d7111f226e1cfcb6f29552936fec7215b3b69be4da7e2ee8fb module/directory-config-runtime
ea81ef06956c1bc0853fa00afbbc2b5a4019116aaf8a436e1b27d06f7a2c9e88 module/directory-runtime
7e953d227d71e4e07c412b21f6db0604279cb6360eb6e025aceb79576212afd0 module/discord
f41f9b34ab771c894293453bcdf072860c7cd509dd4e0172156634a816b8d727 module/document-extractor
3ac20ebba52de5a2f18807c0c8ade6e61f59e260a35fc1d077c9dedb9960dabd module/embedding-providers
c7c9119cd43e2ed2eed4fe8bd57a6b75d2ee9a1f7926c432634c49b54ff7f9a6 module/discord
46c05a90b66032d1d7ad08445840a4bf81aa2bd325348f87710ad4538daf38f6 module/error-runtime
64060c2042b1cb587c6180b5fc09b3be29f0defee9770e1ae46592d5666e8362 module/exec-approvals-runtime
8a60bf4ab024c45a6ebb45a88ddd346c75325a579b8e3abea0efd0a2d46bc88f module/expect-runtime
b013053a61e7d9be3d0c683c02baf57fa7e4393ec54e0df6a46ab0f2fe2348fd module/extension-shared
733faa5d260108da26d39aa0ada4105085719b26ff19f84b89b7cb9980e948f7 module/fetch-runtime
e2d4a336857b4bdc98137162d16a683d8aa39b46028b74deb731b9f939efc62b module/file-access-runtime
d13708bc224297df10a7f91e244f87e822fef9d71e2ca799442a49e42b6868c5 module/file-lock
ceacad83db01c66e7be6aa21a291597020f13f737b697690eae7d47098e6499a module/gateway-method-runtime
1b8eea4bad785031864822f0f07dc03cbe8670e76e0c3ee8fa51c7a2ee5c5e15 module/gateway-runtime
4611de9835515711d641f0f3e48d3c4e528afc343d5e5934fe3ed62072955511 module/global-singleton
6062869202e3d7fdaa1f6801d6c1df7bf7406b8118cc4c7167ed409f5257b05c module/group-access
5e672df8c679d90e2e61b30d08cc9de8f1a1cac439e7020869b088ee9ab4e5ce module/group-activation
412aa303344407c046ee26c83306db0f8a6cccbdd6e7835437711d4dd8d26522 module/health
e1b72e4c2d926d39d216df80775e0a5f44705d04f5040c01fe1043ad7a2c2fe4 module/heartbeat-runtime
182dc685f2103ff66c1a4839a48f4f40d2eeb0070cd74e449b47aacc4e6f1c22 module/hook-runtime
580b0f80fe6d6fe1700d993a8a07e5f7a718fe9128e7767dcacf6ad14bbc3f8f module/host-runtime
1e1dd2480c0fb57a46c6f7a88b51071b44e411b02cbd9051943e00513526e7be module/html-entity-runtime
319df2c4a8637db38c9f115f9fe3d9b8ecbac6520c5e9c44254f2c00d5c9842e module/image-generation
284bda4aca2e435885ec10f1847bce57695168d1416b418e0326251125a656c8 module/image-generation-core
21a233e9008f0701df1efbefe521a9ced45c61da6e297e788bdd86895d793128 module/image-generation-runtime
f6e3c44e7d1090a97aca554a3c247219b8de78b3cb4399cac5efde8a0a6c1156 module/inbound-envelope
67142e8e63ea860a03b0cbb5660f63405a83ec575f2ef7a96f9b87f1be362808 module/inbound-reply-dispatch
c1826ee55763f9c1f86e873cda221bdf32122fce5f5a5a46c384521a8ec8bf6c module/infra-runtime
841de925321fbc69c8dcc1beed2468dfcd5f28cc38a8aad6fcde20d85158a985 module/infra-runtime
2e717cccb3db127aed0287d4ea14c41a8e64e46d60c728638153e31e2fb0d296 module/ingress-effect-once
3d0431e2575abf67c7fd9e9763b08b7a46018e01c290ffea8d4af9874d3c3fc4 module/inline-image-data-url-runtime
74fee62a94618d830a5282a7816a73b85570b2e4ce17b90078078734510511d7 module/interactive-runtime
9353103e334009222e5ae4fe4a2992a1d00552735013a69f93f17f74f14eb9ee module/json-schema-runtime
9dd66baf2def46386ad4706380e57f9068fa9bb3878be2d9ba961ec2f46d3d87 module/json-store
ee34dd840075bd687624ead228d3aa906fc52965e1708a5a335bb3ad3b671949 module/json-unsafe-integers
8f37bca66178f4d77303fdd3ded0d445c9358b4f094c07a2f8e32b1721e953e4 module/keyed-async-queue
d8ca27a737f235e09f1a9f8cd4b82ac0cde96f10c662347b6ac82e27b70b4a40 module/lazy-runtime
bedaf7b615a4acc66ca4897f2d99da883df638cc427ed3963e974b69bf8b0a32 module/llm
6ae9b0f1f55ec50fa3e0ebc02052bfd04eca5f34c4a936692634b36a4cfa2035 module/lmstudio
dd166527916dc5b9694512e3526e774da0b2427ba7fc8316d2fd799c06238e80 module/lmstudio-runtime
fd00374a91ab5b393152bbbaf90010f9140cf15827bde360d0c6c8724ed34e2e module/logging-core
d0d01050ec5c0401fca65e482a183643b40a53ebc95b2a0fa4982e5bba6d93da module/markdown-table-runtime
7670808d8c6227a52b2cddb72121aed9767313dd674f294a1f426dc185c13046 module/matrix
08c4cb46f218c303356c203dac30722cc6c609b6b34604a8846259f684bed2bf module/mattermost
149b66a9e1ce771567495164a7c1680759a4d589f0af87caa72c58cc90bbf163 module/media-generation-runtime
28f843eb592e3f376713f2743acf26087885cd30eba666af98eaea63fd15ecae module/media-generation-runtime-shared
a5f59c9acbcaa3f82247bf806eb5ba08032373fb853719f0ec9457690f16fc70 module/media-mime
7b30827ec2f616ae9de0c1d81348a2112a41e9b4a8aeb8f072cfb1480d2eb864 module/media-runtime
7a5a1de743fff9d5a86515b501ffd88e7fa49970c9f46a5153816e2ebaef7bb0 module/media-store
c5e3eb1a584f4b8126d9d6c177a840ec9103671e8d1242634ee67db9b5b9e573 module/media-understanding
c0ffaed532578cf33493992e1ff806b2268b8e3774a92edbaede5cf5bda162a6 module/media-understanding-runtime
075b7a2783cf22c3210cfce630b815c2e3b7e85c1f5606f0dde4730d47242365 module/meeting-runtime
bdcdb7db74523c557b6bcaa98a47210ad90f16bc97f9143227d03108c7fd8c23 module/memory-core
6ae3c62fd51b36439cd3f22286f2e52c6bb27bc85de648650b805c3b7603a487 module/memory-core-engine-runtime
2bc363010e81c6990c30fd6743e3ffa37320ec39b91abfc222302dc812d8bd33 module/memory-core-host-embedding-registry
ae67c256150b14f1a58738dce0a703071035b86ec26fc344ab03e942253aa72c module/memory-core-host-engine-embeddings
4205ab767b79e740c7c7137079b19b315c85f7f8c748592840f00bbf70a71709 module/memory-core-host-engine-foundation
cb8dcef652580ca82242d6e9506eda094006c85848f9b16b8b1c1aadff1706a8 module/memory-core-host-engine-qmd
bbc06f2bb23d9e4a3445744711f691de9f902270e61c9740fd746f222d10fccb module/memory-core-host-engine-storage
39e86819441281365dedb3d7d59979672bb90196f49206edb50b879bd747c9f0 module/memory-core-host-events
fe87e7d794bbbdaed3c834b218a787e98c0e69b26b0fac582b0668b8effab9b4 module/memory-core-host-multimodal
746e155bb06b398749a6a1bfdc1b435b1ec1941dca3854554a912577731218dd module/memory-core-host-query
e2377479799d52d8f67dcccf8f499f28a63948b0c03fa6043fc67e476a22ec0d module/memory-core-host-runtime-cli
813b7f8b864e3e0497970f03a543801ff3f69cda2f80aecb26e947ef0e22534e module/memory-core-host-runtime-core
f8eb835f0769eba8324033141ecddb9f45bdb3d3241d2a5959fe8426ba6a2280 module/memory-core-host-runtime-files
ebbf937b2258487f773b8a6fbd6c648feea96399cae5fbea18ec7d29e027523d module/memory-core-host-secret
16bdd82751898ffa98157fd27c86fa0eb9ea415fb8ed703eb4e9b170f0a9501b module/memory-core-host-status
646773d8282a2ac6a89101685c406200935ddb3459a2830e820da132fa433b3c module/memory-host-core
f7bde3a0231ac75c128d6ae367d5020de886715fe9edbb2faaf673c6bd168398 module/memory-host-events
059856bc3671ccba7a2191f47c0295e0a91a374f7048cc2bc22784b389d15182 module/memory-host-files
ba07f497aa5469915ebb5b6787148ff1f0f267d7e48c48f0c95d32b7dda8d91a module/memory-host-markdown
896d315fb78af09effd0af467e2b6e84331272b0123d4132e5b1f2254e80108e module/memory-host-search
fa72e6a00014824db9a40c25b404b548feb125c500005ca3b9670c79ffb96fb1 module/memory-host-status
2343c1092d2d6dbfe215052711d273c8d39cfc8a67056d80831ca157958d51d1 module/message-tool-delivery-hints
87b7a3206346c0d4b294fb3a2395cbaabc3e73ff8b1b9ea925bc3aade3e52687 module/messaging-targets
fd79467013bf189fc6cdd5698a3b970fd370542e2f4aaed70a1f3cac9a8dad4a module/migration
90c0578b615d0938a9c1d4bf5cc2e169813176620b57a1ebc3949b8aaeeeb8ff module/migration-runtime
09f842a2787b87117d88ba6545aa0441ff8afdb85e2e66ae4d1838ebecb16148 module/model-session-runtime
44655a08ce111a036c837b8d2e796cf0036941379ab317e5764c6c01e73b39f3 module/models-provider-runtime
4096b2c64b074c651f9e5b0d0e2310082f1002dd5793c6b8a81c268467cef438 module/music-generation
f1167c6fc033405b98c88e55f20e80061dc932acf627b42526e2bc345544145d module/music-generation-core
55a7e1e57345726b2b54a4c71c66744d5559dd40a164ca552808b689306f53f8 module/native-command-config-runtime
1892da4151de02907448430a4661b8578295bb91638fa6c8d940d858d902876f module/native-command-registry
0532bafd9f77262d6e41b95d42e6b841383a790ea1710ba9e65eccf270fad41c module/node-host
ebd0c2fd5ac9a42d9922deed139ec47184d71e32d7ab5141d86490a3c9d3b114 module/number-runtime
ac2114469f321477a1e11133ea629fa672afe1aa9118fd165054009987aec2bb module/outbound-media
1d3fb77912c0fba61487b0ae0c1c6e6e513130808d808335582b3f48136e12d5 module/outbound-runtime
4a7fb40ea1a45e5727ac2adc8ba64204fa1beb4caeec4de1f9ebd5b56bedff5e module/outbound-send-deps
50c4a8ebc6777f422e39a708d01a34b15f42264709da8bd44e1802246d3bbbcd module/pair-loop-guard-runtime
9470d8e08f7e1d2fe144a81da1b4a331b31a0c74d0c9a5f7cfaa15814e953ea2 module/param-readers
8d8c0c4ebfc6e0c6125df3ae64ec66c10cd797a325de5ea7869fcd84068ab290 module/persistent-dedupe
987648ebe317cc4d6c0505a52d344b12ce9c3a8261a5bd969cee3423c0c53529 module/plugin-config-runtime
4f40506eda3a3a54156ec63e43c946cfc11197cf5ef7639c4c1ee9b549ea821d module/plugin-entry
a5e4304b8b5878d5b7b7732939e1c91d009b4d3e9ee1c41d2f6ccde81c10eb99 module/plugin-entry
b41a69c03c3a671a120963bebec65f379261220b72a4636242223d8bb15b830c module/plugin-runtime
109f2b3b0984552e620adfb33c2d5dea6f70b4b440677e77d4fd89679e286683 module/plugin-state-runtime
1a5be86c0c661469b3ba07bb1c3c0db4d893cbe3042040c298a412bfffc10b5b module/poll-runtime
c305e43d9cc43cd699759f36212527a1fc1f1c8d26cfa96425b0dae4a98e91b2 module/process-runtime
f9717249bb66c5fff4fce145c260c5b8ac1d6063a03de6025afe19f90efd1ab6 module/provider-auth
a5d3fbf94ef6b3186861c9db8510e749e6caf95a16f87a439c395fd8466ef45d module/provider-auth-api-key
fbe62044a65a728bc6a89fabd80a2ecbc4f8199b4ca6ab15282035db0f76b0b3 module/provider-auth-login
b20eeddd6af4ad509dc0802591180843873a9c6b337edab142a63869d270ebc1 module/provider-auth-login-flow-runtime
b32f041136217c510e559e5fcf7ed4361cf51ebfad0fa15799d69fe539780feb module/provider-auth-result
3381bf9416f0fad6509b43cdf24cf32547f9fa18632ddb5755e3dd7212bd65a3 module/provider-auth-runtime
7a0adc27e12f90f5ab95f36d75fb208029ffc83c29af167ea3fa992273561023 module/provider-catalog-live-runtime
83df49f1fcb2fc4ac1bd2406a87a10be71bbcdb0967f61e9a6ccaa23c534149f module/provider-auth
71bebeac51e701cd7c8e63d22754b9bcbd82b024aced303aa055d229781129d7 module/provider-catalog-runtime
ee5184ab251bcbe49a4cb9c845eee31975733bce1dc2300854cff14e99cf6db7 module/provider-catalog-shared
ca5d408937bc0ff92021673320aeba6ae6fce705711b251f15797887b8f34d3a module/provider-entry
52085bfaa917f4fd262508a93af923e5e834901b5f0f017c93b02a0798073344 module/provider-env-vars
3b311719eae8dbb061ac2e79f0a58f8540f7a416ec281f3ee0c1cc3cfa6b401f module/provider-http
47564e55d5ae9174fc402d6a1ef7120a799a92bb3625106327b642d4d9eb3bd9 module/provider-model-shared
966830793fccc5e5a7e6ae2f7df84f5f39120ac9a6af8c10be1e070eaf257f32 module/provider-model-types
f1452aec01b1bc1d8764b666131b6237bce5b78477ce1137d622c4aa0b691a8e module/provider-oauth-runtime
c543747f32aebde42508e31606db325739f0c54fcc7cf683f68ac941c835f737 module/provider-onboard
3e4187704f3c12b3a058864ef474036f63285dabe687c70461713f869aafbd9d module/provider-selection-runtime
096f53f25cde2c3428b6ff042f1687c5a7c1b161a375ba97aefcdf2f1c38887f module/provider-setup
413af0d4597c1bab45e2f1a260b520445a25b9d11abd46a98fdfb74c60ddd601 module/provider-stream
ea8bd63655e983dacfd306fe77d0793097166228a2dabd9b7fc8e33252eb359f module/provider-stream-family
2285e2c23d64af94ff6b9bd6108e854343f1ec55eca6212fc4fd22138253363b module/provider-stream-shared
5a907292055c941ec7420163ea50e8bc90ead816b3c5867d94a23024d3b579e8 module/provider-tools
8236935f56423a26aeb7219173c0c8c8c7aacb4a13d0d851f05bdf2d35790cd4 module/provider-transport-runtime
009a594b19aa9f0d0c0c28f54968f807cad4b3ee40ec13c685367116d63aafdc module/provider-usage
b6c43bdb895139e6bbdb30f861b7e0e66bd2e8960e4129cc2bdb562c575c5f2f module/provider-web-fetch
8ef7d8c1cef0b23b73b3ec1e8dc8974a4b98ea622a3ad2659ce38e9aec03d499 module/provider-web-fetch-contract
fdcde43943f9bbd4dba4e4b45b396e380708dd3a7314bef141d13a6c8a1fc19e module/provider-web-search
fffda485ad0492168b0b58671a5fe232de028c64cd1c0e36ab710ba7d58bf9d3 module/provider-web-search-config-contract
17c2bf31435cc29125e2115142c780447cefc967fd5ca26f363668f01008dc66 module/provider-web-search-contract
69e205f87efbee176778ef5810c104dc0528e2545cafcf31b6cc8ea360e06020 module/provider-zai-endpoint
56151035047a69e6163d5578023d00f51a2413b777f3784af88e06261c039345 module/proxy-capture
08f9f6abbe7f01fab7f96d611058f0de55996026a0e90cfd014fd2fdbe62ba0a module/qa-runner-runtime
aa2a56b4448c8ebdec9d06aac95d809995f533093d42fa32cd75e1d852967245 module/question-gateway-runtime
5e6ac90d11f2f6ed764f5c53ef98110551ff4beaa0d5dcc343a3e7d97e41844d module/realtime-bootstrap-context
6f551c1da49e6652f4af775798f45d3f3d5949c884c2e1967fc6254d34e9867e module/realtime-transcription
4c42bf622e25f5896194512aee7698ae8fbf8a2844657aea7a54bef767602368 module/realtime-voice
2e09c3181e79e157ed5366b144d116ef8cc06023256ace3fa59b35c43cab513a module/reply-chunking
b673d50862d0c5fd00723252a541ab3baeac196b75f689f56439fdb63a68fda0 module/reply-dedupe
bd2355e94248d21c252148085e5afa5db9a2f3f48f665a8b3e0fcf77326d9b6c module/reply-dispatch-runtime
b215c812a6be8565a25439f52b528fb951f922d2e37900c89a32decddc643ee8 module/reply-history
f394fe4d5a7ed9e4d574063ae44e8d6af85c9a0e7d8b329f750ca16b0664325f module/reply-payload
82fcb700b918f0776008e198c72c087ce8c387a9bc982e1e255e67fc5b43cc00 module/reply-reference
4e886f327f912688c338a1eccb208298987613f81325d4f999852b6925487eb2 module/reply-runtime
132c734e81f821ba2dfeac1266d4c946d1d89aa834231eb3312087f458360294 module/request-url
04c04da4ee8dd042787076c759e650941c458d16e725f0d3f9997ff1bfccb213 module/response-limit-runtime
dba5987236821b24a3cfe2767841b99cb4ecfd9c567abc6f9cc2cd675ce503ca module/retry-runtime
f7cf5c4b7be10345ac34e5f88990985f418ab855d4c0f25042b7b8cc933176f2 module/routing
ff6cca86f54f94f238205f5b122af36666314e0a380f3ec7f0ccb9ed9208df31 module/run-command
af338ca9fbd0dc5701ad085e17937471953241369a0c961f8894ca7df467b72d module/runtime
53b0295cec105696a1664c5c7f5576a7b55d197eb95dcd9185486f010bd53750 module/runtime
fcf103d18c1d64ffa9719f1d5a1ca349df3a6125d00c9d54a1b76c195ba8691b module/runtime-config-snapshot
1392e45b8e8ef50b72a9d012a6abe5a73d00b74b6eccc53c817096dfe7a8f591 module/runtime-doctor
b6b8edc50ecab8386c9acd8f374a207212b5a99c8f518538bbcf0c458dda3881 module/runtime-env
841bee5465fd523116f8739eb36f79fd9efc8139dff9d98d32e35002c1614fe7 module/runtime-fetch
1b223b31f6f78d9eca4a07b92802e59684f24d7a1d040b83856ad165d0dd70fd module/runtime-group-policy
99ca5432af104f82cea78a632d3fd14c924a859f268063b48bfdf3f080bb1c0c module/runtime-logger
edaa91de9edc92d684c5b5410a86c9a6c072877a43ea699965807c565e2d6a1f module/runtime-secret-resolution
0d8f2c5f3a3325d7d190d2c395835f58ac57f1bea9b6fa516c6942b96d9bf605 module/runtime-store
e9c4398b04d04fead0e46ec618589d8f597a0b6087805ab132138e941b76e190 module/sandbox
79bba48c5fcb578a86149c99c26745ac00cb1b5c2be7d48e982e826b37e2ea26 module/secret-file-runtime
9e34f73592f9df1c01f2df10b6aecbbb2494938e8cc1a6198ef4d56eacedc7c1 module/secret-input
57dcb1462d4c4f9a98d934c4ca975b163d704758af9821a64001ff3ac05637c3 module/secret-input-runtime
3718c15f255d6f315f863a100ae28a578277f07f45034d8403e254e7cb90be49 module/secret-provider-integration
17a6a199714ba8308e62928c0491bcf9fd214c923c3879aa99a047a30138253d module/secret-ref-runtime
7af94d4b67b9d39a80b154ad84987bf4d63b008a63c3cc807baea5b36fbd4138 module/secure-random-runtime
596a315d426121c9620b314e3a9a7f523840b46e007d94d0d5e83cdedf789d15 module/security-runtime
50beebb77e461deaccdbff038f6a461dff1d5773426322dc6d7991f6e05a7c37 module/self-hosted-provider-setup
250476d121ffa4ed67d497c59d9c7bb1886973e92ebed39325a02609217bade0 module/session-binding-runtime
ed35a448c8f7650acb34739a591334267371f1ffe352505fc2808330d78580bd module/session-catalog
31b785e74f1f8f56241b7756ef6a5d86199c5ce177cbb1c234a261866972f270 module/session-discussion
f07839f5b8929a179857a0b4b89f8448864078cd5972dd53f9a30e50bf55408d module/session-key-runtime
f59099aa2d536246d4b1297f01bcea66796351a9259debdd45909afeb7a42d86 module/session-store-runtime
b1d0a76337122cb9dbb0c89fbb8bfacc1a88ce689270d3d684019c9a03ce669a module/session-transcript-hit
04c19558a5f27380ea13cadee1e3238729788c18a919fb078b24d2d67d006ecf module/session-transcript-runtime
a8fb87c7c39ec6e874926a311d2306b49843767ee5659e006024c59af822466e module/session-visibility
695971d31b3e16f0bf9b643acc30df312fe94b3c0dfb27a2e6156c8a00b5e261 module/setup
575fe05081bf9edd1c6d886143e4835c218fb8d0641ce148a4a69d3cefcea2ef module/setup-adapter-runtime
9129c17df1523903f34beffd348ce177fcaa2983e155a8c854a50cf1bd7e99c4 module/setup-runtime
cd431f6ba8327b81438b7a63b1963120f200f5abd145fb6aa7c5c561339cb0b1 module/setup-tools
f2095165f836537aa6c145aecfff32543c9cc7b3935d33d107869b5f975475ee module/simple-completion-runtime
18e384ec43d9eaee52c8e286e127bda2048370e2337964a754d94b236724ca9e module/skill-commands-runtime
7eaea43619ee15e8b0d2d17c81c63b057576b251fecebcb5034d4e06e5940aea module/skills-runtime
6639d26ccc022ee5c55e23aa52071e30dbbddb17e7c4ecf62b152358380e087f module/speech
5c228af0457bf14b2833c2d0994c98212f6a7451abec7d5fe5cad0632115bb84 module/speech-core
ae469f32799380e6b045abaefefee6eb3f00d714ffbf36b6eeef5025dc529472 module/speech-settings
59f8e58aea2ba7870b0bb758d597360241901b8c5165b695df1f4a62912e41d9 module/sqlite-runtime
e1379adab6398cdeda7671a4e6cc268508d21270815b53fef793249698a8d601 module/ssrf-dispatcher
9e521fe9073dfd1a6a6855f909fa6befe8613e18403f0a65faaba973a8b630c1 module/ssrf-policy
c564f2f5d1e6cf7a9fb1d3f1a7fa3ccb42c61306a8497524fcab5d4d785d108d module/ssrf-runtime
ff35f9f74d35d37a2eb6126b57f3dc5a4d580b6222fe3a34c9368779ad32eab7 module/state-paths
c5ff317bb7957d0870cb806e7989c1d48877e3bed583c173ce2f8e9cfe57ee36 module/status-helpers
537047854c21ad20ea0572f8019503cbda3bbafece8194a28c30b0639bde2fde module/string-coerce-runtime
eb9a25321eaa2bbea1721f7d4b8b218bed398379494e09a21a621f264435b39a module/string-normalization-runtime
32f031eb75c887b24b8eaa693cd0aa1a4648dca85eab7bfdfb3d08136861c274 module/system-event-runtime
65361dc9a23578787c1ccf98f7df99e443574614e7ce95889f9a295725e12fae module/talk-config-runtime
9efd666b8c2cc8a9abf816751fd9420f3c048d158e48570cae8b7a4cbc52a83f module/target-resolver-runtime
ec6df323a2dbd1f837df25c0290289031bf60e0b0250f47172f3eaa316667c90 module/telegram-account
7729f9f201c08f114925da75ee86a5a8deb6677e5d1b5ee86bc60aacaa01f63b module/telegram-command-config
1b5b9a4532db991fce807ba736b550de27aa5f9de2e1f508a8f4f09cae76ea29 module/telegram-account
110944726884fca94f38c9c329b5950629438b9a719f4782c4beeade8bd67746 module/temp-path
a65f17db3d04c2ca1b34f9a4ebe8748952bbcb00318b741adbe3f227d2e2de20 module/text-autolink-runtime
e24c49c1c7b35e8b4403d45eb76bb0f33ec2f23f714bda322e1363251737d6cd module/text-chunking
1df5a33be5dbf611e301c01c6b8bcf502c3101aae10cd14a79f1bbb58b116497 module/text-runtime
4bdc79e3b42814a30c3c84401f1f0e4620706092787a1f5d2b6c4148b202fe02 module/text-utility-runtime
dac9afb3833e237e3edcc9d687240caceb8288abd0c6b757dcc3c16a819eb029 module/thread-bindings-runtime
65c9b0b77c0c19140765ec282f9a6424f6ce8a55d0e318b30485d52fd41968e9 module/thread-bindings-session-runtime
360458567c29e4b577b7cd3ded81ed3fff6977221f4bd607662690f502a7f620 module/time-runtime
de34bdf5b05937a1dc6b7bd6a06a0372a8017702d5f5fb998b1f065fa46a5570 module/tool-payload
a94c9ff59cc361b04f8731a47d722c4bc88cfabf942221369a8cb67bdcda7249 module/tool-plugin
c3c90ba2b012732413c5275d65a1c0ff07a937cd67d04d1acbd6207243544d43 module/tool-results
9d6ab352913a573b226e054e1dc8c6d088493aea9954950c65585923b5b6895a module/tool-send
5d02a59fe9a44a4aaaf027427238874d5ff883688b22b213e05c9f171edfbff5 module/transcripts
14ec8a05b813027a5afb9b92eab79995e0d61768545783081ff1515a84383b2c module/transport-ready-runtime
eb92e9bf85a08cf263e61b5b3497010b1de73f19bdcc5e826b0b9416ad053b90 module/tts-runtime
bf0ffa969b46486f52201900956ed266107f062b22e9be73e5b81356a32185f1 module/types
20946e039f15f52023735836f5d48c72a51c4ace80c019edcb0301571cc79101 module/video-generation
37c7c8e392583c905c4ad6546dfe4f76e52771ef0272b41a57fd4418d70f638e module/video-generation-core
70965c7827aabf85fccedfbba9b1050af476b6772cad2f8ed65e1bee470371a5 module/video-generation-runtime
c1688367f51f96507230782f9eb68b9ba2a4eb2b952a074b8f28e05ac57b36cb module/web-content-extractor
541df9dea799f25e83ea483d481ecebc5b91c016effab593c54d3efe3ee6517b module/web-media
2e59dcb46af00a4a1a1c9c240013c9445d1d938e29e7689db0c450561d49581d module/webhook-ingress
30a1d4dd8c540a1320b7775dc7dbe4464df8c33d0dbfe03f3fc9610b3221a322 module/webhook-path
c1fe90c8d833e82aa6a94885b4ec5cb54d0463ce5a3bee25ad24124ff8cc2d20 module/webhook-ingress
9f2739dfe035d9a053fcd678aa76be79980832495041b770c326ed973a979bee module/webhook-request-guards
8ea24940688b1bf82f0f46e3b9ead88afcd0bc39d2871722cd71a9b9311bd61a module/webhook-targets
1cc469eacda2818a116ab7b63847b9ddf86225e8d02e62fac48e618ba41a9852 module/widget-html
1a6449dbd48d2b9a60d5377a8c3b119df5f6aa2606ca5d61de1d04828125ac93 module/windows-spawn
76e3a7b6eb10921d5c18eeaa2eb22654b5412162eb85810109b333ba5b3e9d18 module/zalouser
9161b36ec0ab062ea41b363c894fcd672a7727f21cb726739f99f9c184fce69d module/zod
+1 -5
View File
@@ -405,7 +405,7 @@ For runtime hook debugging:
Plugin install metadata is machine-managed state, not user config. Installs and updates write it to the shared SQLite state database under the active OpenClaw state directory. The `installed_plugin_index` row stores durable `installRecords` metadata, including records for broken or missing plugin manifests, plus a manifest-derived cold registry cache used by `openclaw plugins update`, uninstall, diagnostics, and the cold plugin registry.
When OpenClaw sees shipped legacy `plugins.installs` records in config, runtime reads treat them as compatibility input without rewriting `openclaw.json`. Explicit plugin writes and `openclaw doctor --fix` move those records into the plugin index and remove the config key when config writes are allowed; if either write fails, the config records are kept so the install metadata is not lost.
`plugins.installs` is a retired authored-config surface. Runtime and update commands read only the SQLite installed-plugin index. Run `openclaw doctor --fix` to import legacy config records into the index and remove the retired key before normal runtime use.
## Uninstall
@@ -525,10 +525,6 @@ Use `plugins registry` to inspect whether the persisted registry is present, cur
`openclaw doctor --fix` also repairs registry-adjacent managed npm drift: if an orphaned or recovered `@openclaw/*` package under a managed plugin npm project or the legacy flat managed npm root shadows a bundled plugin, doctor removes that stale package and rebuilds the registry so startup validates against the bundled manifest. Doctor also relinks the host `openclaw` package into managed npm plugins that declare `peerDependencies.openclaw`, so package-local runtime imports such as `openclaw/plugin-sdk/*` resolve after updates or npm repairs.
<Warning>
`OPENCLAW_DISABLE_PERSISTED_PLUGIN_REGISTRY=1` is a deprecated break-glass compatibility switch for registry read failures. Prefer `plugins registry --refresh` or `openclaw doctor --fix`; the env fallback is only for emergency startup recovery while the migration rolls out.
</Warning>
## Marketplace
```bash
-1
View File
@@ -64,7 +64,6 @@ These run inside the agent loop or gateway pipeline:
| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `before_model_resolve` | Pre-session (no `messages`), to deterministically override provider/model before resolution. |
| `before_prompt_build` | After session load (with `messages`), to inject `prependContext`, `systemPrompt`, `prependSystemContext`, or `appendSystemContext` before submission. Use `prependContext` for per-turn dynamic text and the system-context fields for stable guidance that belongs in system prompt space. |
| `before_agent_start` | Legacy compatibility hook that may run in either phase; prefer the explicit hooks above. |
| `before_agent_reply` | After inline actions, before the LLM call. Lets a plugin claim the turn and return a synthetic reply or silence it entirely. |
| `agent_end` | After completion, with the final message list and run metadata. |
| `before_compaction` / `after_compaction` | Observe or annotate compaction cycles. |
+1 -1
View File
@@ -151,7 +151,7 @@ a restart.
The refactor absorbed or deprecated: `reply-runtime`, `reply-dispatch-runtime`,
`reply-reference`, `reply-chunking`, `reply-payload` helpers exposed as public
API, `inbound-reply-dispatch`, `channel-reply-pipeline`, and most public uses
of `outbound-runtime`. `src/plugin-sdk/channel-message.ts` is now a
of the old outbound facade. `src/plugin-sdk/channel-message.ts` is now a
`@deprecated` re-export barrel pointing at `channel-outbound` /
`channel-inbound`; `channel.turn` runtime aliases were removed and the old
`/plugins/sdk-channel-turn` doc page redirects to
+3 -4
View File
@@ -5599,7 +5599,6 @@ Do not edit it by hand; run `pnpm docs:map:gen`.
- H2: Public capability model
- H3: External compatibility stance
- H3: Plugin shapes
- H3: Legacy hooks
- H3: Compatibility signals
- H2: Architecture overview
- H3: Plugin metadata snapshot and lookup table
@@ -7502,7 +7501,7 @@ Do not edit it by hand; run `pnpm docs:map:gen`.
- H2: Removed compatibility surfaces
- H3: Process-global API-provider publication
- H3: Private testing barrel
- H2: Active deprecations
- H2: Migration reference
- H2: Talk and realtime voice migration
- H2: Removal timeline
- H2: Suppressing the warnings temporarily
@@ -7579,8 +7578,8 @@ Do not edit it by hand; run `pnpm docs:map:gen`.
- Route: /plugins/sdk-subpaths
- Headings:
- H2: Plugin entry
- H3: Deprecated compatibility and test helpers
- H3: Reserved bundled plugin helper subpaths
- H3: Compatibility and private-local helpers
- H3: Bundled plugin helper subpaths
- H2: Related
## plugins/sdk-testing.md
+2 -2
View File
@@ -251,7 +251,7 @@ See [MCP](/cli/mcp#openclaw-as-an-mcp-client-registry) and
- `allow`: optional allowlist (only listed plugins load). `deny` wins.
- `plugins.entries.<id>.apiKey`: plugin-level API key convenience field (when supported by the plugin).
- `plugins.entries.<id>.env`: plugin-scoped env var map.
- `plugins.entries.<id>.hooks.allowPromptInjection`: when `false`, core blocks `before_prompt_build` and ignores prompt-mutating fields from legacy `before_agent_start`, while preserving legacy `modelOverride` and `providerOverride`. Applies to native plugin hooks and supported bundle-provided hook directories.
- `plugins.entries.<id>.hooks.allowPromptInjection`: when `false`, core blocks prompt-mutating hooks such as `before_prompt_build`. Applies to native plugin hooks and supported bundle-provided hook directories.
- `plugins.entries.<id>.hooks.allowConversationAccess`: when `true`, trusted non-bundled plugins may read raw conversation content from typed hooks such as `llm_input`, `llm_output`, `before_model_resolve`, `before_agent_reply`, `before_agent_run`, `before_agent_finalize`, and `agent_end`.
- `plugins.entries.<id>.subagent.allowModelOverride`: explicitly trust this plugin to request per-run `provider` and `model` overrides for background subagent runs.
- `plugins.entries.<id>.subagent.allowedModels`: optional allowlist of canonical `provider/model` targets for trusted subagent overrides. Use `"*"` only when you intentionally want to allow any model.
@@ -360,7 +360,7 @@ precedence when the same app is present in both paths. If `app/list` cannot be
read, account-wide exposure fails closed.
- `plugins.entries.firecrawl.config.webFetch`: Firecrawl web-fetch provider settings.
- `apiKey`: Optional Firecrawl API key for higher limits (accepts SecretRef). Falls back to `plugins.entries.firecrawl.config.webSearch.apiKey`, legacy `tools.web.fetch.firecrawl.apiKey`, or `FIRECRAWL_API_KEY` env var.
- `apiKey`: Optional Firecrawl API key for higher limits (accepts SecretRef). Falls back to `plugins.entries.firecrawl.config.webSearch.apiKey` or `FIRECRAWL_API_KEY` env var.
- `baseUrl`: Firecrawl API base URL (default: `https://api.firecrawl.dev`; self-hosted overrides must target private/internal endpoints).
- `onlyMainContent`: extract only the main content from pages (default: `true`).
- `maxAgeMs`: maximum cache age in milliseconds (default: `172800000` / 2 days).
+15 -27
View File
@@ -27,10 +27,6 @@ At startup, OpenClaw does roughly this:
7. call native `register(api)` hooks and collect registrations into the plugin registry
8. expose the registry to commands/runtime surfaces
<Note>
`activate` is a legacy alias for `register` — the loader resolves whichever is present (`def.register ?? def.activate`) and calls it at the same point. All bundled plugins use `register`; prefer `register` for new plugins.
</Note>
Safety gates run **before** runtime execution. Discovery blocks a candidate
when:
@@ -228,10 +224,9 @@ conversation, and it runs after core approval handling finishes.
Provider plugins have three layers:
- **Manifest metadata** for cheap pre-runtime lookup:
`setup.providers[].envVars`, deprecated compatibility `providerAuthEnvVars`,
`providerAuthAliases`, `providerAuthChoices`, and `channelEnvVars`.
- **Config-time hooks**: `catalog` (legacy `discovery`) plus
`applyConfigDefaults`.
`setup.providers[].envVars`, `providerAuthAliases`, `providerAuthChoices`,
and `channelConfigs`.
- **Config-time hooks**: `catalog` plus `applyConfigDefaults`.
- **Runtime hooks**: 40+ optional hooks covering auth, model resolution,
stream wrapping, thinking levels, replay policy, and usage endpoints. See
[Hook order and usage](#hook-order-and-usage).
@@ -242,9 +237,7 @@ behavior without needing a whole custom inference transport.
Use manifest `setup.providers[].envVars` when the provider has env-based
credentials that generic auth/status/model-picker paths should see without
loading plugin runtime. Deprecated `providerAuthEnvVars` is still read by the
compatibility adapter during the deprecation window, and non-bundled plugins
that use it receive a manifest diagnostic. Use manifest `providerAuthAliases`
loading plugin runtime. Use manifest `providerAuthAliases`
when one provider id should reuse another provider id's env vars, auth profiles,
config-backed auth, and API-key onboarding choice. Use manifest
`providerAuthChoices` when onboarding/auth-choice CLI surfaces should know the
@@ -253,9 +246,8 @@ loading provider runtime. Keep provider runtime
`envVars` for operator-facing hints such as onboarding labels or OAuth
client-id/client-secret setup vars.
Use manifest `channelEnvVars` when a channel has env-driven auth or setup that
generic shell-env fallback, config/status checks, or setup prompts should see
without loading channel runtime.
Describe env-driven channel setup and auth through the owning
`channelConfigs.<id>.schema` and setup descriptors.
### Hook order and usage
@@ -571,7 +563,6 @@ Notes:
schemas while OpenClaw owns the provider/runtime boundary.
- Uses core media-understanding audio configuration (`tools.media.audio`) and provider fallback order.
- Returns `{ text: undefined }` when no transcription output is produced (for example skipped/unsupported input).
- `api.runtime.stt.transcribeAudioFile(...)` remains as a compatibility alias.
Plugins can also launch background subagent runs through `api.runtime.subagent`:
@@ -686,12 +677,11 @@ Notes:
Use narrow SDK subpaths instead of the monolithic `openclaw/plugin-sdk` root
barrel when authoring new plugins. Core subpaths:
| Subpath | Purpose |
| ----------------------------------- | -------------------------------------------------- |
| `openclaw/plugin-sdk/plugin-entry` | Plugin registration primitives |
| `openclaw/plugin-sdk/channel-core` | Channel entry/build helpers |
| `openclaw/plugin-sdk/core` | Generic shared helpers and umbrella contract |
| `openclaw/plugin-sdk/config-schema` | Root `openclaw.json` Zod schema (`OpenClawSchema`) |
| Subpath | Purpose |
| ---------------------------------- | -------------------------------------------- |
| `openclaw/plugin-sdk/plugin-entry` | Plugin registration primitives |
| `openclaw/plugin-sdk/channel-core` | Channel entry/build helpers |
| `openclaw/plugin-sdk/core` | Generic shared helpers and umbrella contract |
Channel plugins pick from a family of narrow seams — `channel-setup`,
`setup-runtime`, `setup-tools`, `channel-pairing`,
@@ -709,11 +699,10 @@ Runtime and config helpers live under matching focused `*-runtime` subpaths
instead of the broad `config-runtime` compatibility barrel.
<Info>
`openclaw/plugin-sdk/channel-runtime`, `openclaw/plugin-sdk/channel-lifecycle`,
small channel helper facades, `openclaw/plugin-sdk/outbound-runtime`,
`openclaw/plugin-sdk/outbound-send-deps`, `openclaw/plugin-sdk/config-runtime`,
and `openclaw/plugin-sdk/infra-runtime` are deprecated compatibility shims for
older plugins. New code should import narrower generic primitives instead.
`openclaw/plugin-sdk/channel-lifecycle`, small channel helper facades,
`openclaw/plugin-sdk/config-runtime`, and `openclaw/plugin-sdk/infra-runtime`
are deprecated compatibility shims for older plugins. New code should import
narrower generic primitives instead.
</Info>
Repo-internal entry points (per bundled plugin package root):
@@ -1014,7 +1003,6 @@ Useful `openclaw.channel` fields beyond the minimal example:
- `exposure.configured`: hide the channel from configured-channel listing surfaces when set to `false`
- `exposure.setup`: hide the channel from interactive setup/configure pickers when set to `false`
- `exposure.docs`: mark the channel as internal/private for docs navigation surfaces
- `showConfigured` / `showInSetup`: legacy aliases still accepted for compatibility; prefer `exposure`
- `quickstartAllowFrom`: opt the channel into the standard quickstart `allowFrom` flow
- `forceAccountBinding`: require explicit account binding even when only one account exists
- `preferSessionLookupForAnnounceTarget`: prefer session lookup when resolving announce targets
+6 -20
View File
@@ -88,18 +88,6 @@ OpenClaw classifies every loaded plugin into a shape based on its actual registr
Use `openclaw plugins inspect <id>` to see a plugin's shape and capability breakdown. See [CLI reference](/cli/plugins#inspect) for details.
### Legacy hooks
The `before_agent_start` hook remains supported as a compatibility path for hook-only plugins. Legacy real-world plugins still depend on it.
Direction:
- keep it working
- document it as legacy
- prefer `before_model_resolve` for model/provider override work
- prefer `before_prompt_build` for prompt mutation work
- remove only after real usage drops and fixture coverage proves migration safety
### Compatibility signals
`openclaw doctor`, `openclaw plugins inspect <id>`, `openclaw status --all`, and `openclaw plugins doctor` surface these compatibility notices:
@@ -108,7 +96,6 @@ Direction:
| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------- |
| **config valid** | Config parses fine and plugins resolve |
| **hook-only** (info) | Plugin registers only hooks; a supported path, but not migrated to capability registration yet |
| **legacy `before_agent_start`** (warn) | Plugin uses the deprecated `before_agent_start` hook instead of `before_model_resolve`/`before_prompt_build` |
| **deprecated memory-embedding API** (warn) | Non-bundled plugin uses the old memory-specific embedding provider API instead of `registerEmbeddingProvider` |
| **hard error** | Config is invalid or plugin failed to load |
@@ -322,7 +309,6 @@ import {
describeImageWithModel,
transcribeOpenAiCompatibleAudio,
} from "openclaw/plugin-sdk/media-understanding";
import { createPluginBackedWebSearchProvider } from "openclaw/plugin-sdk/provider-web-search";
const plugin: OpenClawPluginDefinition = {
id: "exampleai",
@@ -355,12 +341,12 @@ const plugin: OpenClawPluginDefinition = {
},
});
api.registerWebSearchProvider(
createPluginBackedWebSearchProvider({
id: "exampleai-search",
// credential + fetch logic
}),
);
api.registerWebSearchProvider({
id: "exampleai-search",
createTool() {
// Return the vendor-owned web search tool.
},
});
},
};
-6
View File
@@ -333,12 +333,6 @@ import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
import { createPluginRuntimeStore } from "openclaw/plugin-sdk/runtime-store";
```
Do not import from the deprecated root barrel:
```typescript
import { definePluginEntry } from "openclaw/plugin-sdk";
```
Within your plugin package, use local barrel files such as `api.ts` and
`runtime-api.ts` for internal imports. Do not import your own plugin through an
SDK path. Provider-specific helpers should stay in the provider package unless
+17 -51
View File
@@ -62,58 +62,24 @@ compatibility and mark it `active` instead.
## Current compatibility areas
The registry currently tracks around 70 compatibility codes across these
areas. New plugin code should use the replacement in each area and in the
specific migration guide; existing plugins can keep using a compatibility
path until docs, diagnostics, and release notes announce a removal window.
The July 2026 sweep removed the expired root SDK, manifest, provider, runtime,
registry-flag, and plugin-owned web-config aliases. Doctor migrations remain
separately tracked so supported upgrade paths can still repair old config.
- legacy broad SDK imports such as `openclaw/plugin-sdk/compat`
- legacy hook-only plugin shapes and `before_agent_start`
- legacy `api.on("deactivate", ...)` cleanup hook names while plugins
migrate to `gateway_stop`
- legacy `activate(api)` plugin entrypoints while plugins migrate to
`register(api)`
- legacy SDK aliases such as `openclaw/extension-api`,
`openclaw/plugin-sdk/channel-runtime`, `openclaw/plugin-sdk/command-auth`
status builders, `openclaw/plugin-sdk/test-utils` (replaced by focused
`openclaw/plugin-sdk/*` test subpaths), and the `ClawdbotConfig` /
`OpenClawSchemaType` type aliases
- bundled plugin allowlist and enablement behavior
- legacy provider/channel env-var manifest metadata
- legacy provider plugin hooks and type aliases while providers move to
explicit catalog, auth, thinking, replay, and transport hooks
- legacy runtime aliases such as `api.runtime.taskFlow`,
`api.runtime.subagent.getSession`, `api.runtime.stt`, and deprecated
`api.runtime.config.loadConfig()` / `api.runtime.config.writeConfigFile(...)`
- WhatsApp `WebInboundMessage` flat callback fields (see below)
- WhatsApp `WebInboundMessage` top-level admission fields (see below)
- legacy memory-plugin split registration while memory plugins move to
`registerMemoryCapability`
- legacy memory-specific embedding provider registration while embedding
providers move to `api.registerEmbeddingProvider(...)` and
`contracts.embeddingProviders`
- legacy channel SDK helpers for native message schemas, mention gating,
inbound envelope formatting, and approval capability nesting
- legacy channel route key and comparable-target helper aliases while
plugins move to `openclaw/plugin-sdk/channel-route`
- activation hints being replaced by manifest contribution ownership
- `setup-api` runtime fallback while setup descriptors move to cold
`setup.requiresRuntime: false` metadata
- provider `discovery` hooks while provider catalog hooks move to
`catalog.run(...)`
- channel `showConfigured` / `showInSetup` metadata while channel packages
move to `openclaw.channel.exposure`
- legacy runtime-policy config keys while doctor migrates operators to
`agentRuntime`
- generated bundled channel config metadata fallback while registry-first
`channelConfigs` metadata lands
- persisted plugin registry disable and install-migration env flags while
repair flows migrate operators to `openclaw plugins registry --refresh`
and `openclaw doctor --fix`
- legacy plugin-owned web search, web fetch, and x_search config paths
while doctor migrates them to `plugins.entries.<plugin>.config`
- legacy `plugins.installs` authored config and bundled plugin load-path
aliases while install metadata moves into the state-managed plugin ledger
The remaining dated compatibility areas are:
- the August and September SDK subpath windows listed in the migration guide
- `api.on("deactivate", ...)` and `api.on("subagent_spawning", ...)` hook aliases
- memory-specific embedding registration and the beta.5 session-store bridge
- WhatsApp inbound callback aliases described below
- explicit channel target parsing and `openclaw/plugin-sdk/messaging-targets`
- embedded Pi agent aliases
- the shipped agent-harness SDK aliases, whose removal is pending a new
externally documented migration decision
Active, undated registry records cover supported behavior rather than removal
debt, including activation hints, plugin capture, bundled plugin enablement,
and the generated channel-config fallback.
### WhatsApp inbound callback flat aliases
+1 -2
View File
@@ -209,8 +209,7 @@ plus a small set of env defaults inside `extensions/copilot/src/`:
| `enableSessionTelemetry` | Optional SDK session telemetry flag. |
OpenClaw plugin hooks need no Copilot-specific attempt configuration. The
harness runs `before_prompt_build` (and the legacy `before_agent_start`
compatibility hook), `llm_input`, `llm_output`, and `agent_end` through the
harness runs `before_prompt_build`, `llm_input`, `llm_output`, and `agent_end` through the
standard harness helpers. Successful SDK compactions also run
`before_compaction` and `after_compaction`. Bridged OpenClaw tools run
`before_tool_call` and report `after_tool_call`; `hooksConfig` remains for
+1 -8
View File
@@ -121,7 +121,6 @@ observation-only.
| `before_model_resolve` | Override provider or model before session messages load |
| `agent_turn_prepare` | Consume queued plugin turn injections and add same-turn context before prompt hooks |
| `before_prompt_build` | Add dynamic context or system-prompt text before the model call |
| `before_agent_start` | Compatibility-only combined phase; prefer the two hooks above |
| **`before_agent_run`** | Inspect the final prompt and session messages before model submission; can block the run |
| **`before_agent_reply`** | Short-circuit the model turn with a synthetic reply or silence |
| **`before_agent_finalize`** | Inspect the natural final answer and request one more model pass |
@@ -478,9 +477,6 @@ Use the phase-specific hooks for new plugins:
`prependContext` or `appendContext`. Intended for background monitors that
need to summarize current state without changing user-initiated turns.
`before_agent_start` remains for compatibility. Prefer the explicit hooks
above so the plugin does not depend on a legacy combined phase.
`before_agent_run` runs after prompt construction and before any model input,
including prompt-local image loading and `llm_input` observation. It receives
the current user input as `prompt`, plus loaded session history in `messages`
@@ -497,7 +493,7 @@ excluded from transcript, history, broadcast, log, and diagnostics payloads.
Observability should use sanitized fields such as blocker id, outcome,
timestamp, or a safe category.
`before_agent_start` and `agent_end` include `event.runId` when OpenClaw can
Agent-turn hooks including `agent_end` include `event.runId` when OpenClaw can
identify the active run; the same value is also on `ctx.runId`. Cron-driven
runs also expose `ctx.jobId` (the originating cron job id) on the agent-turn
context so hooks can scope metrics, side effects, or state to a specific
@@ -927,9 +923,6 @@ before the next major release:
handlers. Read `BodyForAgent` and the structured user-context blocks
instead of parsing flat envelope text. See
[Plaintext channel envelopes → BodyForAgent](/plugins/sdk-migration#active-deprecations).
- **`before_agent_start`** remains for compatibility. New plugins should use
`before_model_resolve` and `before_prompt_build` instead of the combined
phase.
- **`subagent_spawning`** remains for compatibility with older plugins, but
new plugins should not return thread routing from it. Core prepares
`thread: true` subagent bindings through channel session-binding adapters
+2 -7
View File
@@ -94,9 +94,6 @@ See [Plugins](/tools/plugin) for the full plugin system guide, and [Capability m
"providerAuthAliases": {
"openrouter-coding": "openrouter"
},
"channelEnvVars": {
"openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"]
},
"providerAuthChoices": [
{
"provider": "openrouter",
@@ -157,10 +154,8 @@ See [Plugins](/tools/plugin) for the full plugin system guide, and [Capability m
| `syntheticAuthRefs` | No | `string[]` | Provider or CLI backend refs whose plugin-owned synthetic auth hook should be probed during cold model discovery before runtime loads. |
| `nonSecretAuthMarkers` | No | `string[]` | Bundled-plugin-owned placeholder API key values that represent non-secret local, OAuth, or ambient credential state. |
| `commandAliases` | No | `object[]` | Command names owned by this plugin that should produce plugin-aware config and CLI diagnostics before runtime loads. |
| `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. |
| `providerUsageAuthEnvVars` | No | `Record<string, string[]>` | Usage/billing-only provider credentials. OpenClaw uses these names for usage discovery and secret scrubbing but never for inference auth. |
| `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. |
| `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. |
| `providerAuthChoices` | No | `object[]` | Cheap auth-choice metadata for onboarding pickers, preferred-provider resolution, and simple CLI flag wiring. |
| `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. |
| `setup` | No | `object` | Cheap setup/onboarding descriptors that discovery and setup surfaces can inspect without loading plugin runtime. |
@@ -495,7 +490,7 @@ Top-level `cliBackends` stays valid and continues to describe CLI inference back
When present, `setup.providers` and `setup.cliBackends` are the preferred descriptor-first lookup surface for setup discovery. If the descriptor only narrows the candidate plugin and setup still needs richer setup-time runtime hooks, set `requiresRuntime: true` and keep `setup-api` in place as the fallback execution path.
OpenClaw also includes `setup.providers[].envVars` in generic provider auth and env-var lookups. `providerAuthEnvVars` remains supported through a compatibility adapter during the deprecation window, but non-bundled plugins that still use it receive a manifest diagnostic. New plugins should put setup/status env metadata on `setup.providers[].envVars`.
OpenClaw includes `setup.providers[].envVars` in generic provider auth and env-var lookups. Put setup and status env metadata there.
Use `providerUsageAuthEnvVars` when a billing or organization-level credential must activate `resolveUsageAuth` without becoming an inference credential. These names join workspace dotenv blocking, ACP child-process stripping, sandbox secret filtering, and broad secret scrubbing. The provider runtime still reads and classifies the value inside `resolveUsageAuth`.
@@ -1291,7 +1286,7 @@ See [Configuration reference](/gateway/configuration) for the full `plugins.*` s
- `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.
- Exclusive plugin kinds are selected through `plugins.slots.*`: `kind: "memory"` via `plugins.slots.memory` (default `memory-core`), `kind: "context-engine"` via `plugins.slots.contextEngine` (default `legacy`).
- Declare exclusive plugin kind in this manifest. Runtime-entry `OpenClawPluginDefinition.kind` is deprecated and remains only as a compatibility fallback for older plugins.
- 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.
- Env-var metadata in `setup.providers[].envVars` 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.
- For runtime wizard metadata that requires provider code, see [Provider runtime hooks](/plugins/architecture-internals#provider-runtime-hooks).
- 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>`).
+3 -5
View File
@@ -5,13 +5,11 @@ title: "Channel message API"
This page moved to [Channel outbound API](/plugins/sdk-channel-outbound).
`openclaw/plugin-sdk/channel-message` and
`openclaw/plugin-sdk/channel-message-runtime` remain deprecated compatibility
subpaths for older plugins; both are thin aliases over the shared channel
message core. New channel plugins should use
`openclaw/plugin-sdk/channel-message` remains a deprecated compatibility
subpath for older plugins. New channel plugins should use
`openclaw/plugin-sdk/channel-outbound` for message lifecycle, receipt,
durable send, and live preview helpers instead of adding new helpers to the
deprecated subpaths.
deprecated subpath.
Removal plan: keep these aliases through the external plugin migration
window, then remove them in the next major SDK cleanup after callers have
+1 -1
View File
@@ -4,7 +4,7 @@ title: "Channel outbound API"
read_when:
- You are building or refactoring a messaging channel plugin send path
- You need durable final reply delivery, receipts, live preview finalization, or receive acknowledgement policy
- You are migrating from channel-message, channel-message-runtime, or legacy reply dispatch helpers
- You are migrating from channel-message or legacy reply dispatch helpers
---
Channel plugins expose outbound message behavior from
+3 -8
View File
@@ -480,10 +480,9 @@ adapter/wizard fail closed on config writes and finalization, and they reuse
the same install-required message across validation, finalize, and docs-link
copy.
If your channel supports env-driven setup or auth and generic startup/config
flows should know those env names before runtime loads, declare them in the
plugin manifest with `channelEnvVars`. Keep channel runtime `envVars` or local
constants for operator-facing copy only.
If your channel supports env-driven setup or auth, expose it through the
channel config schema and setup descriptors. Keep channel runtime `envVars` or
local constants for operator-facing copy only.
If your channel can appear in `status`, `channels list`, `channels status`, or
SecretRef scans before the plugin runtime starts, add `openclaw.setupEntry` in
@@ -527,10 +526,6 @@ surfaces:
and adapter registration
- `openclaw/plugin-sdk/agent-media-payload` only when a legacy agent/media
payload field layout is still required
- `openclaw/plugin-sdk/telegram-command-config` (deprecated: no bundled
plugin uses it in production) for Telegram custom-command normalization,
duplicate/conflict validation, and a fallback-stable command config
contract; prefer plugin-local command config handling for new plugin code
Auth-only channels can usually stop at the default path: core handles
approvals and the plugin just exposes outbound/auth capabilities. Native
+56 -231
View File
@@ -16,31 +16,32 @@ change, this guide gets it onto the current contracts.
## What changed
Two wide-open import surfaces used to let plugins reach almost anything from a
single entry point:
Several wide-open import surfaces used to let plugins reach almost anything
from a single entry point:
- **`openclaw/plugin-sdk/compat`** - re-exported dozens of helpers to keep
older hook-based plugins working while the new architecture was built.
- **`openclaw/plugin-sdk`** and **`openclaw/plugin-sdk/compat`** - re-exported
dozens of helpers while the focused SDK was being built. Both roots are now
removed; import a documented subpath instead.
- **`openclaw/plugin-sdk/infra-runtime`** - a broad barrel mixing system
events, heartbeat state, delivery queues, fetch/proxy helpers, file helpers,
approval types, and unrelated utilities.
- **`openclaw/plugin-sdk/config-runtime`** - a broad config barrel still
carrying deprecated direct load/write helpers during the migration window.
- **`openclaw/extension-api`** - a bridge giving plugins direct access to
host-side helpers like the embedded agent runner.
- **`openclaw/plugin-sdk/config-runtime`** - a broad config barrel retained
only for its later compatibility window; direct runtime load/write helpers
have been removed.
- **`openclaw/extension-api`** - a removed bridge that gave plugins direct
access to host-side helpers like the embedded agent runner.
- **`api.registerEmbeddedExtensionFactory(...)`** - a removed embedded-runner-only
hook that observed embedded-runner events such as `tool_result`. Use agent
tool-result middleware instead (see [Migrate embedded tool-result extensions
to middleware](#how-to-migrate)).
These surfaces are **deprecated**: they still work, but new plugins must not
use them, and existing plugins should migrate before the next major release
removes them. `registerEmbeddedExtensionFactory` has already been removed;
legacy registrations no longer load.
The root SDK, compat barrel, extension bridge, and embedded extension factory
have been removed. `infra-runtime` and `config-runtime` remain only for their
separately recorded later windows; new plugins should use focused subpaths.
<Warning>
The backwards-compatibility layer will be removed in a future major release.
Plugins still importing from these surfaces will break when that happens.
Plugins importing the removed root, compat, or extension surfaces no longer
load. Follow the mappings below before upgrading.
</Warning>
OpenClaw does not remove or reinterpret documented plugin behavior in the same
@@ -137,10 +138,9 @@ SDK.
tests and logging; the gateway remains responsible for applying or
scheduling the restart.
`loadConfig` and `writeConfigFile` remain as deprecated compatibility
helpers for external plugins and warn once with the
`runtime-config-load-write` compatibility code. Bundled plugins and repo
runtime code are guarded by `pnpm check:deprecated-api-usage` and
`loadConfig` and `writeConfigFile` have been removed from the plugin
runtime. Bundled plugins and repo runtime code are guarded by
`pnpm check:deprecated-api-usage` and
`pnpm check:no-runtime-action-load-config`: new production plugin usage
fails outright, direct config writes fail, gateway server methods must use
the request runtime snapshot, runtime channel send/action/client helpers
@@ -372,181 +372,11 @@ SDK.
## Import path reference
<Accordion title="Common import path table">
| Import path | Purpose | Key exports |
| --- | --- | --- |
| `plugin-sdk/plugin-entry` | Canonical plugin entry helper | `definePluginEntry` |
| `plugin-sdk/core` | Legacy umbrella re-export for channel entry definitions/builders | `defineChannelPluginEntry`, `createChatChannelPlugin` |
| `plugin-sdk/config-schema` | Root config schema export | `OpenClawSchema` |
| `plugin-sdk/provider-entry` | Single-provider entry helper | `defineSingleProviderPluginEntry` |
| `plugin-sdk/channel-core` | Focused channel entry definitions and builders | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `createChannelConfigUiHints` |
| `plugin-sdk/setup` | Shared setup wizard helpers | Setup translator, allowlist prompts, setup status builders |
| `plugin-sdk/setup-runtime` | Setup-time runtime helpers | `createSetupTranslator`, import-safe setup patch adapters, lookup-note helpers, `promptResolvedAllowFrom`, `splitSetupEntries`, delegated setup proxies |
| `plugin-sdk/setup-adapter-runtime` | Deprecated setup adapter alias | Use `plugin-sdk/setup-runtime` |
| `plugin-sdk/setup-tools` | Setup tooling helpers | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Multi-account helpers | Account list/config/action-gate helpers |
| `plugin-sdk/account-id` | Account-id helpers | `DEFAULT_ACCOUNT_ID`, account-id normalization |
| `plugin-sdk/account-resolution` | Account lookup helpers | Account lookup + default-fallback helpers |
| `plugin-sdk/account-helpers` | Narrow account helpers | Account list/account-action helpers |
| `plugin-sdk/channel-setup` | Setup wizard adapters | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/channel-pairing` | DM pairing primitives | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | Reply prefix, typing, and source-delivery wiring | `createChannelReplyPipeline`, `resolveChannelSourceReplyDeliveryMode` |
| `plugin-sdk/channel-config-helpers` | Config adapter factories and DM access helpers | `createHybridChannelConfigAdapter`, `resolveChannelDmAccess`, `resolveChannelDmAllowFrom`, `resolveChannelDmPolicy`, `normalizeChannelDmPolicy`, `normalizeLegacyDmAliases` |
| `plugin-sdk/channel-config-schema` | Config schema builders | Shared channel config schema primitives and the generic builder only |
| `plugin-sdk/bundled-channel-config-schema` | Bundled config schemas | OpenClaw-maintained bundled plugins only; new plugins must define plugin-local schemas |
| `plugin-sdk/channel-config-schema-legacy` | Deprecated bundled config schemas | Compatibility alias only; use `plugin-sdk/bundled-channel-config-schema` for maintained bundled plugins |
| `plugin-sdk/telegram-command-config` | Telegram command config helpers | Command-name normalization, description trimming, duplicate/conflict validation |
| `plugin-sdk/channel-policy` | Group/DM policy resolution | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-lifecycle` | Deprecated compatibility facade | Use `plugin-sdk/channel-outbound` |
| `plugin-sdk/inbound-envelope` | Inbound envelope helpers | Shared route + envelope builder helpers |
| `plugin-sdk/channel-inbound` | Inbound receive helpers | Context building, formatting, roots, runners, prepared reply dispatch, and dispatch predicates |
| `plugin-sdk/messaging-targets` | Deprecated target parsing import path | Use `plugin-sdk/channel-targets` for generic target parsing helpers, `plugin-sdk/channel-route` for route comparison, and plugin-owned `messaging.targetResolver` / `messaging.resolveOutboundSessionRoute` for provider-specific target resolution |
| `plugin-sdk/outbound-media` | Outbound media helpers | Shared outbound media loading |
| `plugin-sdk/outbound-send-deps` | Deprecated compatibility facade | Use `plugin-sdk/channel-outbound` |
| `plugin-sdk/channel-outbound` | Outbound message lifecycle helpers | Message adapters, receipts, durable send helpers, live preview/streaming helpers, reply options, lifecycle helpers, outbound identity, and payload planning |
| `plugin-sdk/channel-streaming` | Deprecated compatibility facade | Use `plugin-sdk/channel-outbound` |
| `plugin-sdk/outbound-runtime` | Deprecated compatibility facade | Use `plugin-sdk/channel-outbound` |
| `plugin-sdk/thread-bindings-runtime` | Thread-binding helpers | Thread-binding lifecycle and adapter helpers |
| `plugin-sdk/agent-media-payload` | Legacy media payload helpers | Agent media payload builder for legacy field layouts |
| `plugin-sdk/channel-runtime` | Deprecated compatibility shim | Legacy channel runtime utilities only |
| `plugin-sdk/channel-send-result` | Send result types | Reply result types |
| `plugin-sdk/runtime-store` | Persistent plugin storage | `createPluginRuntimeStore` |
| `plugin-sdk/runtime` | Broad runtime helpers | Runtime/logging/backup/plugin-install helpers |
| `plugin-sdk/runtime-env` | Narrow runtime env helpers | Logger/runtime env, timeout, retry, and backoff helpers |
| `plugin-sdk/plugin-runtime` | Shared plugin runtime helpers | Plugin commands/hooks/http/interactive helpers |
| `plugin-sdk/hook-runtime` | Hook pipeline helpers | Shared webhook/internal hook pipeline helpers |
| `plugin-sdk/lazy-runtime` | Lazy runtime helpers | `createLazyRuntimeModule`, `createLazyRuntimeMethod`, `createLazyRuntimeMethodBinder`, `createLazyRuntimeNamedExport`, `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Process helpers | Shared exec helpers |
| `plugin-sdk/cli-runtime` | CLI runtime helpers | Command formatting, waits, version helpers |
| `plugin-sdk/gateway-runtime` | Gateway helpers | Gateway client, event-loop-ready start helper, advertised LAN host resolution, and channel-status patch helpers |
| `plugin-sdk/config-runtime` | Deprecated config compatibility shim | Prefer `config-contracts`, `plugin-config-runtime`, `runtime-config-snapshot`, and `config-mutation` |
| `plugin-sdk/telegram-command-config` | Telegram command helpers | Fallback-stable Telegram command validation helpers when the bundled Telegram contract surface is unavailable |
| `plugin-sdk/approval-runtime` | Approval prompt helpers | Exec/plugin approval payload, approval capability/profile helpers, native approval routing/runtime helpers, and structured approval display path formatting |
| `plugin-sdk/approval-auth-runtime` | Approval auth helpers | Approver resolution, same-chat action auth |
| `plugin-sdk/approval-client-runtime` | Approval client helpers | Native exec approval profile/filter helpers |
| `plugin-sdk/approval-delivery-runtime` | Approval delivery helpers | Native approval capability/delivery adapters |
| `plugin-sdk/approval-gateway-runtime` | Approval gateway helpers | Shared approval gateway resolver |
| `plugin-sdk/approval-reference-runtime` | Approval transport references | Deterministic durable-locator helper for transport-limited callbacks |
| `plugin-sdk/approval-handler-adapter-runtime` | Approval adapter helpers | Lightweight native approval adapter loading helpers for hot channel entrypoints |
| `plugin-sdk/approval-handler-runtime` | Approval handler helpers | Broader approval handler runtime helpers; prefer the narrower adapter/gateway seams when they are enough |
| `plugin-sdk/approval-native-runtime` | Approval target helpers | Native approval target/account binding helpers |
| `plugin-sdk/approval-reply-runtime` | Approval reply helpers | Exec/plugin approval reply payload helpers |
| `plugin-sdk/channel-runtime-context` | Channel runtime-context helpers | Generic channel runtime-context register/get/watch helpers |
| `plugin-sdk/security-runtime` | Security helpers | Shared trust, DM gating, root-bounded file/path helpers, external-content, and secret-collection helpers |
| `plugin-sdk/ssrf-policy` | SSRF policy helpers | Host allowlist and private-network policy helpers |
| `plugin-sdk/ssrf-runtime` | SSRF runtime helpers | Pinned-dispatcher, guarded fetch, SSRF policy helpers |
| `plugin-sdk/system-event-runtime` | System event helpers | `enqueueSystemEvent` (including keyed replacement), `peekSystemEventEntries` |
| `plugin-sdk/heartbeat-runtime` | Heartbeat helpers | Heartbeat wake, event, and visibility helpers |
| `plugin-sdk/delivery-queue-runtime` | Delivery queue helpers | `drainPendingDeliveries` |
| `plugin-sdk/channel-activity-runtime` | Channel activity helpers | `recordChannelActivity` |
| `plugin-sdk/dedupe-runtime` | Dedupe helpers | In-memory and persistent-backed dedupe caches |
| `plugin-sdk/file-access-runtime` | File access helpers | Safe local-file/media path helpers |
| `plugin-sdk/transport-ready-runtime` | Transport readiness helpers | `waitForTransportReady` |
| `plugin-sdk/exec-approvals-runtime` | Exec approval policy helpers | `loadExecApprovals`, `resolveExecApprovalsFromFile`, `ExecApprovalsFile` |
| `plugin-sdk/collection-runtime` | Bounded cache helpers | `pruneMapToMaxSize` |
| `plugin-sdk/diagnostic-runtime` | Diagnostic gating helpers | `isDiagnosticFlagEnabled`, `isDiagnosticsEnabled` |
| `plugin-sdk/error-runtime` | Error helpers | `formatUncaughtError`, `isApprovalNotFoundError`, error graph helpers, `PlatformMessageNotDispatchedError` |
| `plugin-sdk/fetch-runtime` | Wrapped fetch/proxy helpers | `resolveFetch`, proxy helpers, EnvHttpProxyAgent option helpers |
| `plugin-sdk/host-runtime` | Host normalization helpers | `normalizeHostname`, `normalizeScpRemoteHost` |
| `plugin-sdk/retry-runtime` | Retry helpers | `RetryConfig`, `retryAsync`, policy runners |
| `plugin-sdk/allow-from` | Allowlist formatting and input mapping | `formatAllowFromLowercase`, `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Command gating and command-surface helpers | `resolveControlCommandGate`, sender-authorization helpers, command registry helpers including dynamic argument menu formatting |
| `plugin-sdk/command-status` | Command status/help renderers | `buildCommandsMessage`, `buildCommandsMessagePaginated`, `buildHelpMessage` |
| `plugin-sdk/secret-input` | Secret input parsing | Secret input helpers |
| `plugin-sdk/webhook-ingress` | Webhook request helpers | Webhook target utilities |
| `plugin-sdk/webhook-request-guards` | Webhook body guard helpers | Request body read/limit helpers |
| `plugin-sdk/reply-runtime` | Shared reply runtime | Inbound dispatch, heartbeat, reply planner, chunking |
| `plugin-sdk/reply-dispatch-runtime` | Narrow reply dispatch helpers | Finalize, provider dispatch, and conversation-label helpers |
| `plugin-sdk/reply-history` | Reply-history helpers | `createChannelHistoryWindow`; deprecated map-helper compatibility exports such as `buildPendingHistoryContextFromMap`, `recordPendingHistoryEntry`, and `clearHistoryEntriesIfEnabled` |
| `plugin-sdk/reply-reference` | Reply reference planning | `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Reply chunk helpers | Text/markdown chunking helpers |
| `plugin-sdk/session-store-runtime` | Session store helpers | Scoped session row helpers, store path helpers, and updated-at reads |
| `plugin-sdk/state-paths` | State path helpers | State and OAuth dir helpers |
| `plugin-sdk/routing` | Routing/session-key helpers | `resolveAgentRoute`, `buildAgentSessionKey`, `resolveDefaultAgentBoundAccountId`, session-key normalization helpers |
| `plugin-sdk/status-helpers` | Channel status helpers | Channel/account status summary builders, runtime-state defaults, issue metadata helpers |
| `plugin-sdk/target-resolver-runtime` | Target resolver helpers | Shared target resolver helpers |
| `plugin-sdk/string-normalization-runtime` | String normalization helpers | Slug/string normalization helpers |
| `plugin-sdk/request-url` | Request URL helpers | Extract string URLs from request-like inputs |
| `plugin-sdk/run-command` | Timed command helpers | Timed command runner with normalized stdout/stderr |
| `plugin-sdk/param-readers` | Param readers | Common tool/CLI param readers |
| `plugin-sdk/tool-payload` | Tool payload extraction | Extract normalized payloads from tool result objects |
| `plugin-sdk/tool-send` | Tool send extraction | Extract canonical send target fields from tool args |
| `plugin-sdk/temp-path` | Temp path helpers | Shared temp-download path helpers |
| `plugin-sdk/logging-core` | Logging helpers | Subsystem logger and redaction helpers |
| `plugin-sdk/markdown-table-runtime` | Markdown-table helpers | Markdown table mode helpers |
| `plugin-sdk/reply-payload` | Message reply types | Reply payload types |
| `plugin-sdk/provider-setup` | Curated local/self-hosted provider setup helpers | Self-hosted provider discovery/config helpers |
| `plugin-sdk/self-hosted-provider-setup` | Focused OpenAI-compatible self-hosted provider setup helpers | Same self-hosted provider discovery/config helpers |
| `plugin-sdk/provider-auth-runtime` | Provider runtime auth helpers | Runtime API-key resolution helpers |
| `plugin-sdk/provider-auth-api-key` | Provider API-key setup helpers | API-key onboarding/profile-write helpers |
| `plugin-sdk/provider-auth-result` | Provider auth-result helpers | Standard OAuth auth-result builder |
| `plugin-sdk/provider-selection-runtime` | Provider selection helpers | Configured-or-auto provider selection and raw provider config merging |
| `plugin-sdk/provider-env-vars` | Provider env-var helpers | Provider auth env-var lookup helpers |
| `plugin-sdk/provider-model-shared` | Shared provider model/replay helpers | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `normalizeModelCompat`, shared replay-policy builders, provider-endpoint helpers, and model-id normalization helpers |
| `plugin-sdk/provider-catalog-shared` | Shared provider catalog helpers | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `buildManifestModelProviderConfig`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-onboard` | Provider onboarding patches | Onboarding config helpers |
| `plugin-sdk/provider-http` | Provider HTTP helpers | Generic provider HTTP/endpoint capability helpers, including audio transcription multipart form helpers |
| `plugin-sdk/provider-web-fetch` | Provider web-fetch helpers | Web-fetch provider registration/cache helpers |
| `plugin-sdk/provider-web-search-config-contract` | Provider web-search config helpers | Narrow web-search config/credential helpers for providers that do not need plugin-enable wiring |
| `plugin-sdk/provider-web-search-contract` | Provider web-search contract helpers | Narrow web-search config/credential contract helpers such as `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, and scoped credential setters/getters |
| `plugin-sdk/provider-web-search` | Provider web-search helpers | Web-search provider registration/cache/runtime helpers |
| `plugin-sdk/provider-tools` | Provider tool/schema compat helpers | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, and DeepSeek/Gemini/OpenAI schema cleanup + diagnostics |
| `plugin-sdk/provider-usage` | Provider usage helpers | `fetchClaudeUsage`, `fetchGeminiUsage`, `fetchGithubCopilotUsage`, and other provider usage helpers |
| `plugin-sdk/provider-stream` | Provider stream wrapper helpers | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, stream wrapper types, and shared Anthropic/Bedrock/DeepSeek V4/Google/Kilocode/Moonshot/OpenAI/OpenRouter/Z.A.I/MiniMax/Copilot wrapper helpers |
| `plugin-sdk/provider-transport-runtime` | Provider transport helpers | Native provider transport helpers such as guarded fetch, tool-result text extraction, transport message transforms, and writable transport event streams |
| `plugin-sdk/keyed-async-queue` | Ordered async queue | `KeyedAsyncQueue` |
| `plugin-sdk/media-runtime` | Shared media helpers | Media fetch/transform/store helpers, ffprobe-backed video dimension probing, and media payload builders |
| `plugin-sdk/media-generation-runtime` | Shared media-generation helpers | Shared failover helpers, candidate selection, and missing-model messaging for image/video/music generation |
| `plugin-sdk/media-understanding` | Media-understanding helpers | Media understanding provider types plus provider-facing image/audio helper exports |
| `plugin-sdk/text-runtime` | Deprecated broad text compatibility export | Use `string-coerce-runtime`, `text-chunking`, `text-utility-runtime`, and `logging-core` |
| `plugin-sdk/text-chunking` | Text chunking helpers | Outbound text and offset-preserving range chunking helpers |
| `plugin-sdk/speech` | Speech helpers | Speech provider types plus provider-facing directive, registry, validation helpers, and OpenAI-compatible TTS builder |
| `plugin-sdk/speech-core` | Shared speech core | Speech provider types, registry, directives, normalization |
| `plugin-sdk/speech-settings` | Speech settings | Lightweight TTS config resolution and normalization primitives without provider registries or synthesis runtime |
| `plugin-sdk/realtime-transcription` | Realtime transcription helpers | Provider types, registry helpers, and shared WebSocket session helper |
| `plugin-sdk/realtime-voice` | Realtime voice helpers | Provider types, registry/resolution helpers, bridge session helpers, the transport-independent session harness, audio-energy/speech-onset gates, shared agent talk-back queues, active-run voice control, transcript/event health, echo suppression, consult question matching, forced-consult coordination, turn-context tracking, output activity tracking, and fast context consult helpers |
| `plugin-sdk/image-generation` | Image-generation helpers | Image generation provider types plus image asset/data URL helpers and the OpenAI-compatible image provider builder |
| `plugin-sdk/image-generation-core` | Shared image-generation core | Image-generation types, failover, auth, and registry helpers |
| `plugin-sdk/music-generation` | Music-generation helpers | Music-generation provider/request/result types |
| `plugin-sdk/music-generation-core` | Shared music-generation core | Music-generation types, failover helpers, provider lookup, and model-ref parsing |
| `plugin-sdk/video-generation` | Video-generation helpers | Video-generation provider/request/result types |
| `plugin-sdk/video-generation-core` | Shared video-generation core | Video-generation types, failover helpers, provider lookup, and model-ref parsing |
| `plugin-sdk/interactive-runtime` | Interactive reply helpers | Interactive reply payload normalization/reduction |
| `plugin-sdk/channel-config-primitives` | Channel config primitives | Narrow channel config-schema primitives |
| `plugin-sdk/channel-config-writes` | Channel config-write helpers | Channel config-write authorization helpers |
| `plugin-sdk/channel-plugin-common` | Shared channel prelude | Shared channel plugin prelude exports |
| `plugin-sdk/channel-status` | Channel status helpers | Shared channel status snapshot/summary helpers |
| `plugin-sdk/allowlist-config-edit` | Allowlist config helpers | Allowlist config edit/read helpers |
| `plugin-sdk/group-access` | Group access helpers | Shared group-access decision helpers |
| `plugin-sdk/direct-dm`, `plugin-sdk/direct-dm-access` | Deprecated compatibility facades | Use `plugin-sdk/channel-inbound` |
| `plugin-sdk/direct-dm-guard-policy` | Direct-DM guard helpers | Narrow pre-crypto guard policy helpers |
| `plugin-sdk/extension-shared` | Shared extension helpers | Passive-channel/status and ambient proxy helper primitives |
| `plugin-sdk/webhook-targets` | Webhook target helpers | Webhook target registry and route-install helpers |
| `plugin-sdk/webhook-path` | Deprecated webhook path alias | Use `plugin-sdk/webhook-ingress` |
| `plugin-sdk/web-media` | Shared web media helpers | Remote/local media loading helpers |
| `plugin-sdk/zod` | Deprecated Zod compatibility re-export | Import `zod` from `zod` directly |
| `plugin-sdk/memory-core` | Bundled memory-core helpers | Memory manager/config/file/CLI helper surface |
| `plugin-sdk/memory-core-engine-runtime` | Memory engine runtime facade | Memory index/search runtime facade |
| `plugin-sdk/memory-core-host-embedding-registry` | Memory embedding registry | Lightweight memory embedding provider registry helpers |
| `plugin-sdk/memory-core-host-engine-foundation` | Memory host foundation engine | Memory host foundation engine exports |
| `plugin-sdk/memory-core-host-engine-embeddings` | Memory host embedding engine | Memory embedding contracts, registry access, local provider, and generic batch/remote helpers; concrete remote providers live in their owning plugins |
| `plugin-sdk/memory-core-host-engine-qmd` | Memory host QMD engine | Memory host QMD engine exports |
| `plugin-sdk/memory-core-host-engine-storage` | Memory host storage engine | Memory host storage engine exports |
| `plugin-sdk/memory-core-host-multimodal` | Memory host multimodal helpers | Memory host multimodal helpers |
| `plugin-sdk/memory-core-host-query` | Memory host query helpers | Memory host query helpers |
| `plugin-sdk/memory-core-host-secret` | Memory host secret helpers | Memory host secret helpers |
| `plugin-sdk/memory-core-host-events` | Deprecated memory event alias | Use `plugin-sdk/memory-host-events` |
| `plugin-sdk/memory-core-host-status` | Memory host status helpers | Memory host status helpers |
| `plugin-sdk/memory-core-host-runtime-cli` | Memory host CLI runtime | Memory host CLI runtime helpers |
| `plugin-sdk/memory-core-host-runtime-core` | Memory host core runtime | Memory host core runtime helpers |
| `plugin-sdk/memory-core-host-runtime-files` | Memory host file/runtime helpers | Memory host file/runtime helpers |
| `plugin-sdk/memory-host-core` | Memory host core runtime alias | Vendor-neutral alias for memory host core runtime helpers |
| `plugin-sdk/memory-host-events` | Memory host event journal alias | Vendor-neutral alias for memory host event journal helpers |
| `plugin-sdk/memory-host-files` | Deprecated memory file/runtime alias | Use `plugin-sdk/memory-core-host-runtime-files` |
| `plugin-sdk/memory-host-markdown` | Managed markdown helpers | Shared managed-markdown helpers for memory-adjacent plugins |
| `plugin-sdk/memory-host-search` | Active memory search facade | Lazy active-memory search-manager runtime facade |
| `plugin-sdk/memory-host-status` | Deprecated memory host status alias | Use `plugin-sdk/memory-core-host-status` |
</Accordion>
The public package export map is the source of truth for importable SDK
subpaths. Use the topical SDK guides linked from [SDK overview](/plugins/sdk-overview)
and prefer the narrowest documented public subpath. The compiler inventory in
`scripts/lib/plugin-sdk-entrypoints.json` also contains private-local entries used
to build bundled plugins; their presence there does not make them public package exports.
This table is the common migration subset, not the full SDK surface. The
compiler entrypoint inventory lives in `scripts/lib/plugin-sdk-entrypoints.json`;
@@ -566,6 +396,12 @@ contract should own it.
## Removed compatibility surfaces
The July 2026 sweep removed the root SDK and compat barrels, the extension API
bridge, the expired SDK subpath aliases, unused SDK subpaths, and the public
exports for bundled-only SDK modules. Bundled-only modules remain available to
their repository owners through private-local build mappings; they are not
importable from the published package.
### Process-global API-provider publication
`registerApiProvider(...)` and `unregisterApiProviders(...)` were removed from
@@ -586,20 +422,21 @@ tests use focused subpaths such as `plugin-sdk/plugin-test-runtime`,
`plugin-sdk/channel-test-helpers`, `plugin-sdk/channel-target-testing`,
`plugin-sdk/test-env`, and `plugin-sdk/test-fixtures`.
## Active deprecations
## Migration reference
Narrower deprecations across the plugin SDK, provider contract, runtime
surface, and manifest. Each still works today but will be removed in a future
major release. Every entry maps the old API to its canonical replacement.
These mappings cover both removed July 2026 surfaces and later-window active
deprecations. A mapping is migration guidance, not evidence that the old
surface remains available; consult the compatibility registry and removal
timeline for current status.
<AccordionGroup>
<Accordion title="command-auth help builders -> command-status">
**Old (`openclaw/plugin-sdk/command-auth`)**: `buildCommandsMessage`,
`buildCommandsMessagePaginated`, `buildHelpMessage`.
**New (`openclaw/plugin-sdk/command-status`)**: same signatures, same
exports - just imported from the narrower subpath. `command-auth`
re-exports them as compat stubs.
**New (`openclaw/plugin-sdk/command-status`)**: same signatures, imported
from the narrower subpath. The `command-auth` compatibility re-exports
have been removed.
```typescript
// Before
@@ -627,13 +464,12 @@ major release. Every entry maps the old API to its canonical replacement.
</Accordion>
<Accordion title="Channel runtime shim and channel actions helpers">
`openclaw/plugin-sdk/channel-runtime` is a compatibility shim for older
channel plugins. Do not import it from new code; use
`openclaw/plugin-sdk/channel-runtime` has been removed. Use
`openclaw/plugin-sdk/channel-runtime-context` for registering runtime
objects.
`channelActions*` helpers in `openclaw/plugin-sdk/channel-actions` are
deprecated alongside raw "actions" channel exports. Expose capabilities
The native message schema helpers in `openclaw/plugin-sdk/channel-actions`
were removed alongside raw "actions" channel exports. Expose capabilities
through the semantic `presentation` surface instead - channel plugins
declare what they render (cards, buttons, selects) rather than which raw
action names they accept.
@@ -729,7 +565,8 @@ major release. Every entry maps the old API to its canonical replacement.
| `ProviderDiscoveryResult` | `ProviderCatalogResult` |
| `ProviderPluginDiscovery` | `ProviderPluginCatalog` |
Plus the legacy `ProviderCapabilities` static bag - provider plugins
The aliases and legacy `ProviderCapabilities` static bag have been
removed. Provider plugins
should use explicit provider hooks such as `buildReplayPolicy`,
`normalizeToolSchemas`, and `wrapStreamFn` rather than a static object.
@@ -750,8 +587,7 @@ major release. Every entry maps the old API to its canonical replacement.
catalog facts to expose a model-specific profile only when the configured
request contract supports it.
Implement one hook instead of three. The legacy hooks keep working during
the deprecation window but are not composed with the profile result.
Implement one hook instead of three. The legacy hooks have been removed.
</Accordion>
@@ -779,8 +615,7 @@ major release. Every entry maps the old API to its canonical replacement.
on the manifest. This consolidates setup/status env metadata in one place
and avoids booting the plugin runtime just to answer env-var lookups.
`providerAuthEnvVars` remains supported through a compatibility adapter
until the deprecation window closes.
`providerAuthEnvVars` is no longer accepted.
</Accordion>
@@ -890,7 +725,7 @@ major release. Every entry maps the old API to its canonical replacement.
const flow = api.runtime.tasks.managedFlows.fromToolContext(ctx);
```
Removed after 2026-07-26.
The legacy aliases were removed in July 2026.
</Accordion>
@@ -903,14 +738,14 @@ major release. Every entry maps the old API to its canonical replacement.
</Accordion>
<Accordion title="OpenClawSchemaType alias -> OpenClawConfig">
`OpenClawSchemaType` re-exported from `openclaw/plugin-sdk` is now a
one-line alias for `OpenClawConfig`. Prefer the canonical name.
The `OpenClawSchemaType` root-SDK alias was removed. Use the canonical
`OpenClawConfig` name.
```typescript
// Before
import type { OpenClawSchemaType } from "openclaw/plugin-sdk";
// After
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-schema";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-contracts";
```
</Accordion>
@@ -1055,25 +890,15 @@ apps own device capture/playback UX.
| **Each compat record's `removeAfter` date** | That specific surface is eligible for removal; `pnpm plugins:boundary-report --fail-on-eligible-compat` fails CI once the date passes. |
| **Next major release** | Any surfaces still not migrated are removed; plugins still using them will fail. |
The public SDK subpaths below have registry-backed removal or demotion windows.
They do not currently emit a runtime warning when an external plugin imports
them. The repository deprecated-usage guard applies only to the fully unused
θ1 tier and the earlier compatibility tier; θ2 remains available to bundled
plugins during the window.
The remaining public SDK subpaths below have registry-backed removal windows.
The July 30 rows were removed after their early maintainer-authorized sweep:
unused subpaths were deleted, earlier compatibility aliases were deleted, and
bundled-only modules were demoted to private-local build mappings.
For the window introduced on 2026-07-15, θ1 has no known external or bundled
consumers and will be deleted after the window. θ2 has bundled consumers but no
known external consumers; only its public package export will be retired. Its
module will remain available to bundled plugins as a private-local-only
subpath.
| `removeAfter` | Tier | SDK subpaths |
| ------------- | -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `2026-07-30` | Earlier compatibility deprecations | `agent-dir-compat`, `channel-envelope`, `channel-inbound-roots`, `channel-location`, `channel-message-runtime`, `channel-pairing-paths`, `channel-reply-options-runtime`, `config-schema`, `config-types`, `direct-dm`, `direct-dm-access`, `mattermost`, `media-generation-runtime-shared`, `memory-core`, `memory-core-engine-runtime`, `memory-core-host-events`, `memory-core-host-multimodal`, `memory-core-host-query`, `memory-host-files`, `memory-host-status`, `music-generation-core`, `outbound-runtime`, `outbound-send-deps`, `provider-auth-login`, `provider-zai-endpoint`, `reply-dedupe`, `runtime-logger`, `runtime-secret-resolution`, `self-hosted-provider-setup`, `setup-adapter-runtime`, `telegram-command-config`, `webhook-path`, `zalouser` |
| `2026-07-30` | θ1: fully unused; remove subpath | `command-gating`, `lmstudio`, `lmstudio-runtime`, `secret-provider-integration`, `skills-runtime` |
| `2026-07-30` | θ2: bundled-only; retire public export | `access-groups`, `account-resolution-runtime`, `acp-binding-resolve-runtime`, `acp-binding-runtime`, `acp-runtime`, `acp-runtime-backend`, `agent-core`, `agent-harness-exec-review-runtime`, `agent-harness-task-runtime`, `agent-harness-tool-runtime`, `agent-media-payload`, `agent-sessions`, `approval-reaction-runtime`, `approval-reference-runtime`, `async-lock-runtime`, `browser-config`, `bundled-channel-config-schema`, `channel-activity-runtime`, `channel-config-writes`, `channel-mention-gating`, `channel-route`, `channel-secret-tts-runtime`, `channel-targets`, `chat-channel-ids`, `cli-backend`, `cli-runtime`, `codex-mcp-projection`, `command-status-runtime`, `command-surface`, `concurrency-runtime`, `context-visibility-runtime`, `conversation-binding-runtime`, `cron-store-runtime`, `dangerous-name-runtime`, `delivery-queue-runtime`, `direct-dm-guard-policy`, `directory-config-runtime`, `document-extractor`, `embedding-providers`, `exec-approvals-runtime`, `expect-runtime`, `fetch-runtime`, `file-access-runtime`, `file-lock`, `global-singleton`, `group-activation`, `heartbeat-runtime`, `host-runtime`, `html-entity-runtime`, `image-generation`, `image-generation-core`, `image-generation-runtime`, `inline-image-data-url-runtime`, `json-schema-runtime`, `json-unsafe-integers`, `keyed-async-queue`, `llm`, `markdown-table-runtime`, `media-generation-runtime`, `media-understanding`, `memory-core-host-embedding-registry`, `memory-core-host-engine-embeddings`, `memory-core-host-engine-qmd`, `memory-core-host-engine-storage`, `memory-core-host-runtime-cli`, `memory-core-host-runtime-core`, `memory-core-host-runtime-files`, `memory-core-host-secret`, `memory-core-host-status`, `memory-host-core`, `memory-host-events`, `memory-host-markdown`, `memory-host-search`, `message-tool-delivery-hints`, `migration`, `migration-runtime`, `music-generation`, `node-host`, `number-runtime`, `outbound-media`, `pair-loop-guard-runtime`, `plugin-config-runtime`, `plugin-state-runtime`, `poll-runtime`, `process-runtime`, `provider-auth-api-key`, `provider-auth-login-flow-runtime`, `provider-auth-result`, `provider-auth-runtime`, `provider-catalog-live-runtime`, `provider-catalog-shared`, `provider-entry`, `provider-env-vars`, `provider-http`, `provider-model-shared`, `provider-model-types`, `provider-oauth-runtime`, `provider-onboard`, `provider-selection-runtime`, `provider-setup`, `provider-stream`, `provider-stream-family`, `provider-stream-shared`, `provider-tools`, `provider-transport-runtime`, `provider-usage`, `provider-web-fetch`, `provider-web-fetch-contract`, `provider-web-search`, `provider-web-search-config-contract`, `provider-web-search-contract`, `qa-runner-runtime`, `realtime-bootstrap-context`, `realtime-transcription`, `realtime-voice`, `reply-reference`, `request-url`, `response-limit-runtime`, `retry-runtime`, `runtime-doctor`, `runtime-fetch`, `sandbox`, `secret-file-runtime`, `secure-random-runtime`, `session-binding-runtime`, `session-catalog`, `session-key-runtime`, `session-transcript-hit`, `session-transcript-runtime`, `session-visibility`, `simple-completion-runtime`, `speech`, `speech-core`, `sqlite-runtime`, `ssrf-dispatcher`, `string-normalization-runtime`, `system-event-runtime`, `talk-config-runtime`, `target-resolver-runtime`, `text-autolink-runtime`, `text-utility-runtime`, `thread-bindings-runtime`, `thread-bindings-session-runtime`, `time-runtime`, `tool-payload`, `tool-plugin`, `tool-results`, `transcripts`, `transport-ready-runtime`, `tts-runtime`, `types`, `video-generation`, `video-generation-core`, `video-generation-runtime`, `web-content-extractor`, `webhook-targets`, `windows-spawn` |
| `2026-08-15` | Earlier compatibility deprecations | `agent-config-primitives`, `channel-logging`, `channel-secret-runtime`, `channel-streaming`, `group-access`, `inbound-reply-dispatch`, `matrix`, `text-runtime`, `zod` |
| `2026-09-01` | Earlier compatibility deprecations | `channel-lifecycle`, `channel-message`, `channel-reply-pipeline`, `config-runtime`, `infra-runtime` |
| `removeAfter` | Tier | SDK subpaths |
| ------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `2026-08-15` | Earlier compatibility deprecations | `agent-config-primitives`, `channel-logging`, `channel-secret-runtime`, `channel-streaming`, `group-access`, `inbound-reply-dispatch`, `matrix`, `text-runtime`, `zod` |
| `2026-09-01` | Earlier compatibility deprecations | `channel-lifecycle`, `channel-message`, `channel-reply-pipeline`, `config-runtime`, `infra-runtime` |
All core plugins have already migrated. External plugins should migrate
before the next major release. Run `pnpm plugins:boundary-report` to see which
+4 -11
View File
@@ -41,9 +41,8 @@ For channel config, publish the channel-owned JSON Schema through
`openclaw.plugin.json#channelConfigs`. The `plugin-sdk/channel-config-schema`
subpath is for shared schema primitives and the generic builder. OpenClaw's
bundled plugins use `plugin-sdk/bundled-channel-config-schema` for retained
bundled-channel schemas. Deprecated compatibility exports remain on
`plugin-sdk/channel-config-schema-legacy`; neither bundled schema subpath is a
pattern for new plugins.
bundled-channel schemas. That bundled schema subpath is not a pattern for new
plugins.
<Warning>
Do not import provider- or channel-branded convenience seams (for example
@@ -445,8 +444,7 @@ The contracts intentionally split authority:
own command names or aliases.
- `allowPromptInjection=false` disables prompt-mutating hooks including
`agent_turn_prepare`, `before_prompt_build`, `heartbeat_prompt_contribution`,
prompt fields from legacy `before_agent_start`, and
`enqueueNextTurnInjection`.
and `enqueueNextTurnInjection`.
Examples of non-Plan consumers:
@@ -603,9 +601,6 @@ For an end-to-end authoring guide, see
| ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `api.registerContextEngine(id, factory)` | Context engine (one active at a time). Lifecycle callbacks receive `runtimeSettings` when the host can provide model/provider/mode diagnostics; older strict engines are retried without that key. |
| `api.registerMemoryCapability(capability)` | Unified memory capability |
| `api.registerMemoryPromptSection(builder)` | Memory prompt section builder |
| `api.registerMemoryFlushPlan(resolver)` | Memory flush plan resolver |
| `api.registerMemoryRuntime(runtime)` | Memory runtime adapter |
### Deprecated memory embedding adapters
@@ -613,13 +608,11 @@ For an end-to-end authoring guide, see
| ---------------------------------------------- | ---------------------------------------------- |
| `api.registerMemoryEmbeddingProvider(adapter)` | Memory embedding adapter for the active plugin |
- `registerMemoryCapability` is the preferred exclusive memory-plugin API.
- `registerMemoryCapability` is the exclusive memory-plugin API.
- `registerMemoryCapability` may also expose `publicArtifacts.listArtifacts(...)`
so companion plugins can consume exported memory artifacts through
`openclaw/plugin-sdk/memory-host-core` instead of reaching into a specific
memory plugin's private layout.
- `registerMemoryPromptSection`, `registerMemoryFlushPlan`, and
`registerMemoryRuntime` are legacy-compatible exclusive memory-plugin APIs.
- `MemoryFlushPlan.model` can pin the flush turn to an exact `provider/model`
reference, such as `ollama/qwen3:8b`, without inheriting the active fallback
chain.
+3 -9
View File
@@ -43,9 +43,8 @@ Persist changes with `api.runtime.config.mutateConfigFile(...)` or `api.runtime.
The mutation helpers return `afterWrite` plus a typed `followUp` summary so callers can log or test whether they requested a restart. The gateway still owns when that restart actually happens.
<Warning>
`api.runtime.config.loadConfig()` and `api.runtime.config.writeConfigFile(...)` are deprecated. They warn once per plugin at runtime and remain available only for old external plugins during the migration window. Bundled plugins must not use them: an internal config boundary guard fails the build if plugin code calls them or imports those helpers from plugin SDK subpaths. Use `current()`, a passed-in `cfg`, `mutateConfigFile(...)`, or `replaceConfigFile(...)` instead.
</Warning>
Use `current()`, a passed-in `cfg`, `mutateConfigFile(...)`, or
`replaceConfigFile(...)` for runtime config access and writes.
For direct SDK imports, prefer the focused config subpaths over the broad `openclaw/plugin-sdk/config-runtime` compatibility barrel: `config-contracts` for types, `plugin-config-runtime` for already-loaded config assertions, plugin entry lookup, and canonical config merging, `runtime-config-snapshot` for current process snapshots, and `config-mutation` for writes. Bundled plugin tests should mock these focused subpaths directly instead of mocking the broad compatibility barrel.
@@ -409,7 +408,6 @@ two-party event loops that do not go through the shared inbound reply runner.
- `api.runtime.tasks.managedFlows` is mutation-capable: create, advance, and cancel Task Flows.
- `api.runtime.tasks.flows` and `api.runtime.tasks.runs` are read-only DTO views for listing and status lookups; both expose `bindSession(...)` / `fromToolContext(...)` plus `get`, `list`, `findLatest`, and `resolve`.
- `api.runtime.tasks.flow` is a deprecated alias for `managedFlows`.
Task Flow tracks durable multi-step workflow state. It is not a scheduler:
use Cron or `api.session.workflow.scheduleSessionTurn(...)` for future
@@ -533,10 +531,6 @@ two-party event loops that do not go through the shared inbound reply runner.
`describeImageFileWithModel(...)` describes an already-known image through a specific provider/model, bypassing the default active-model resolution that `describeImageFile(...)` uses.
<Info>
`api.runtime.stt.transcribeAudioFile(...)` remains as a compatibility alias for `api.runtime.mediaUnderstanding.transcribeAudioFile(...)`.
</Info>
</Accordion>
<Accordion title="api.runtime.imageGeneration">
Image generation.
@@ -836,7 +830,7 @@ two-party event loops that do not go through the shared inbound reply runner.
- `implicitMentionKindWhen`
- `resolveInboundMentionDecision`
`api.runtime.channel.mentions` intentionally does not expose the older `resolveMentionGating*` compatibility helpers. Prefer the normalized `{ facts, policy }` path.
Use the normalized `{ facts, policy }` path for mention decisions.
Several fields under `reply`, `session`, and `inbound` carry per-field `@deprecated` notes pointing at the current channel-turn kernel or channel-outbound adapters; check the inline JSDoc on the specific helper before building new code on it.
+4 -9
View File
@@ -165,10 +165,6 @@ Example:
- `setup`: include the channel in interactive setup/configure pickers
- `docs`: mark the channel as public-facing in docs/navigation surfaces
<Note>
`showConfigured` and `showInSetup` remain supported as legacy aliases. Prefer `exposure`.
</Note>
### `openclaw.install`
`openclaw.install` is package metadata, not manifest metadata.
@@ -343,11 +339,10 @@ Bundled workspace channels that keep setup-safe exports in sidecar modules can u
For hot setup-only paths, prefer the narrow setup helper seams over the broader `plugin-sdk/setup` umbrella when you only need part of the setup surface:
| Import path | Use it for | Key exports |
| ---------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | setup-time runtime helpers that stay available in `setupEntry` / deferred channel startup | `createSetupTranslator`, `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | deprecated compatibility alias; use `plugin-sdk/setup-runtime` | `createEnvPatchedAccountSetupAdapter` |
| `plugin-sdk/setup-tools` | setup/install CLI/archive/docs helpers | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| Import path | Use it for | Key exports |
| -------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/setup-runtime` | setup-time runtime helpers that stay available in `setupEntry` / deferred channel startup | `createSetupTranslator`, `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-tools` | setup/install CLI/archive/docs helpers | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
Use the broader `plugin-sdk/setup` seam when you want the full shared setup toolbox, including config-patch helpers such as `moveSingleAccountChannelSectionToDefaultAccount(...)`.
+139 -184
View File
@@ -6,9 +6,9 @@ read_when:
title: "Plugin SDK subpaths"
---
The plugin SDK is exposed as a set of narrow public subpaths under
`openclaw/plugin-sdk/`. This page catalogs the commonly used subpaths grouped by
purpose. Three files define the surface:
The plugin SDK contains narrow public subpaths and repository-only bundled
helpers under `openclaw/plugin-sdk/`. This page catalogs both and labels
private-local entries explicitly. Three files define the boundary:
- `scripts/lib/plugin-sdk-entrypoints.json`: the maintained entrypoint inventory
the build compiles.
@@ -31,23 +31,20 @@ For the plugin authoring guide, see [Plugin SDK overview](/plugins/sdk-overview)
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `plugin-sdk/plugin-entry` | `definePluginEntry` |
| `plugin-sdk/core` | `defineChannelPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `defineSetupPluginEntry`, `buildChannelConfigSchema`, `buildJsonChannelConfigSchema`, `resolveTailscalePublishedHost` |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/migration` | Migration provider item helpers such as `createMigrationItem`, reason constants, item status markers, redaction helpers, and `summarizeMigrationItems` |
| `plugin-sdk/migration-runtime` | Runtime migration helpers such as `copyMigrationFileItem`, `resolvePlannedMigrationTargets`, `withCachedMigrationConfigRuntime`, and `writeMigrationReport` |
| `plugin-sdk/provider-entry` | Private-local after July 2026; `defineSingleProviderPluginEntry` |
| `plugin-sdk/migration` | Private-local after July 2026; Migration provider item helpers such as `createMigrationItem`, reason constants, item status markers, redaction helpers, and `summarizeMigrationItems` |
| `plugin-sdk/migration-runtime` | Private-local after July 2026; Runtime migration helpers such as `copyMigrationFileItem`, `resolvePlannedMigrationTargets`, `withCachedMigrationConfigRuntime`, and `writeMigrationReport` |
| `plugin-sdk/health` | Doctor health-check registration, detection, repair, selection, severity, and finding types for bundled health consumers |
| `plugin-sdk/config-schema` | Deprecated. Root `openclaw.json` Zod schema (`OpenClawSchema`); define plugin-local schemas instead and validate with `plugin-sdk/json-schema-runtime` |
### Deprecated compatibility and test helpers
### Compatibility and private-local helpers
Deprecated subpaths stay exported for older plugins, but new code should use the
focused SDK subpaths below. The maintained list is
Only the later-window deprecated subpaths remain exported. July 2026 aliases and
unused subpaths were deleted, while bundled-only helpers were removed from the
public package and are labeled private-local below. The maintained list is
`scripts/lib/plugin-sdk-deprecated-public-subpaths.json`; CI rejects bundled
production imports from it. Broad barrels such as `plugin-sdk/compat`,
`plugin-sdk/config-types`, `plugin-sdk/infra-runtime`, and
`plugin-sdk/text-runtime` are compatibility only, and `plugin-sdk/zod` is a
compatibility re-export: import `zod` directly from `zod`. The broad domain
barrels `plugin-sdk/agent-runtime`, `plugin-sdk/channel-lifecycle`,
`plugin-sdk/channel-runtime`, `plugin-sdk/cli-runtime`,
`plugin-sdk/conversation-runtime`, `plugin-sdk/hook-runtime`,
`plugin-sdk/media-runtime`, `plugin-sdk/plugin-runtime`, and
`plugin-sdk/security-runtime` are likewise deprecated in favor of focused
@@ -64,22 +61,11 @@ longer package exports: `agent-runtime-test-contracts`,
`ssrf-runtime-internal` and `codex-native-task-runtime` are also repo-local
only.
### Reserved bundled plugin helper subpaths
### Bundled plugin helper subpaths
`plugin-sdk/codex-mcp-projection` is the only reserved subpath: a plugin-owned
compatibility surface for the bundled Codex plugin, not a general SDK API.
Cross-owner plugin imports are blocked by package contract guardrails, and
CI fails when a reserved subpath stops being imported.
`plugin-sdk/codex-native-task-runtime` is repo-local only and is not a package
export.
`src/plugin-sdk/entrypoints.ts` also tracks supported bundled facades, SDK
Bundled-only helper modules are private-local after the July 2026 sweep. Cross-owner imports are blocked by package contract guardrails. `src/plugin-sdk/entrypoints.ts` separately tracks the supported bundled facades that remain public, SDK
entrypoints backed by their bundled plugin until generic contracts replace
them: `plugin-sdk/discord`, `plugin-sdk/lmstudio`, `plugin-sdk/lmstudio-runtime`,
`plugin-sdk/matrix`, `plugin-sdk/mattermost`,
`plugin-sdk/memory-core-engine-runtime`, `plugin-sdk/provider-zai-endpoint`,
`plugin-sdk/qa-runner-runtime`, `plugin-sdk/telegram-account`,
`plugin-sdk/tts-runtime`, and `plugin-sdk/zalouser`. Several of these are also
deprecated for new code; see the per-row notes below.
<AccordionGroup>
@@ -87,113 +73,95 @@ deprecated for new code; see the per-row notes below.
| Subpath | Key exports |
| --- | --- |
| `plugin-sdk/channel-core` | `defineChannelPluginEntry`, `defineSetupPluginEntry`, `createChatChannelPlugin`, `createChannelPluginBase`, `createChannelConfigUiHints` |
| `plugin-sdk/json-schema-runtime` | Cached JSON Schema validation helper for plugin-owned schemas |
| `plugin-sdk/json-schema-runtime` | Private-local after July 2026; Cached JSON Schema validation helper for plugin-owned schemas |
| `plugin-sdk/channel-setup` | `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`, `createOptionalChannelSetupWizard`, plus `DEFAULT_ACCOUNT_ID`, `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, `splitSetupEntries` |
| `plugin-sdk/setup` | Shared setup wizard helpers, setup translator, allowlist prompts, setup status builders |
| `plugin-sdk/setup-runtime` | `createSetupTranslator`, `createPatchedAccountSetupAdapter`, `createEnvPatchedAccountSetupAdapter`, `createSetupInputPresenceValidator`, `noteChannelLookupFailure`, `noteChannelLookupSummary`, `promptResolvedAllowFrom`, `splitSetupEntries`, `createAllowlistSetupWizardProxy`, `createDelegatedSetupWizardProxy` |
| `plugin-sdk/setup-adapter-runtime` | Deprecated compatibility alias; use `plugin-sdk/setup-runtime` |
| `plugin-sdk/setup-tools` | `formatCliCommand`, `detectBinary`, `extractArchive`, `resolveBrewExecutable`, `formatDocsLink`, `CONFIG_DIR` |
| `plugin-sdk/account-core` | Multi-account config/action-gate helpers, default-account fallback helpers |
| `plugin-sdk/account-id` | `DEFAULT_ACCOUNT_ID`, account-id normalization helpers |
| `plugin-sdk/account-resolution` | Account lookup + default-fallback helpers |
| `plugin-sdk/account-helpers` | Narrow account-list/account-action helpers |
| `plugin-sdk/access-groups` | Access-group allowlist parsing and redacted group diagnostics helpers |
| `plugin-sdk/access-groups` | Private-local after July 2026; Access-group allowlist parsing and redacted group diagnostics helpers |
| `plugin-sdk/channel-pairing` | `createChannelPairingController` |
| `plugin-sdk/channel-reply-pipeline` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-config-helpers` | `createHybridChannelConfigAdapter`, `resolveChannelDmAccess`, `resolveChannelDmAllowFrom`, `resolveChannelDmPolicy`, `normalizeChannelDmPolicy`, `normalizeLegacyDmAliases` |
| `plugin-sdk/channel-config-schema` | Shared channel config schema primitives plus Zod and direct JSON/TypeBox builders |
| `plugin-sdk/bundled-channel-config-schema` | Bundled OpenClaw channel config schemas for maintained bundled plugins only |
| `plugin-sdk/chat-channel-ids` | `BUNDLED_CHAT_CHANNEL_IDS`, `BUNDLED_CHAT_CHANNEL_ENVELOPE_PREFIXES`, `ChatChannelId`. Canonical bundled/official chat channel ids plus formatter labels/aliases for plugins that need to recognize envelope-prefixed text without hardcoding their own table. |
| `plugin-sdk/channel-config-schema-legacy` | Deprecated compatibility alias for bundled-channel config schemas |
| `plugin-sdk/telegram-command-config` | Deprecated Telegram command-name/description normalization and duplicate/conflict checks; use plugin-local command config handling in new plugin code |
| `plugin-sdk/command-gating` | Narrow command authorization gate helpers |
| `plugin-sdk/bundled-channel-config-schema` | Private-local after July 2026; Bundled OpenClaw channel config schemas for maintained bundled plugins only |
| `plugin-sdk/chat-channel-ids` | Private-local after July 2026; `BUNDLED_CHAT_CHANNEL_IDS`, `BUNDLED_CHAT_CHANNEL_ENVELOPE_PREFIXES`, `ChatChannelId`. Canonical bundled/official chat channel ids plus formatter labels/aliases for plugins that need to recognize envelope-prefixed text without hardcoding their own table. |
| `plugin-sdk/channel-policy` | `resolveChannelGroupRequireMention` |
| `plugin-sdk/channel-ingress-runtime` | Experimental high-level channel ingress runtime resolver, implicit-mention policy resolver, and route fact builders for migrated channel receive paths. Prefer this over assembling effective allowlists, command allowlists, and legacy projections in each plugin. See [Channel ingress API](/plugins/sdk-channel-ingress). |
| `plugin-sdk/channel-lifecycle` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-outbound` | Message lifecycle contracts plus reply pipeline options, receipts, live preview/streaming, lifecycle helpers, outbound identity, payload planning, durable sends, and message-send context helpers. See [Channel outbound API](/plugins/sdk-channel-outbound). |
| `plugin-sdk/channel-message` | Deprecated compatibility alias for `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-message-runtime` | Deprecated compatibility alias for `plugin-sdk/channel-outbound`. |
| `plugin-sdk/inbound-envelope` | Shared inbound route + envelope builder helpers |
| `plugin-sdk/inbound-reply-dispatch` | Deprecated compatibility facade. Use `plugin-sdk/channel-inbound` for inbound runners and dispatch predicates, and `plugin-sdk/channel-outbound` for message delivery helpers. |
| `plugin-sdk/messaging-targets` | Deprecated target parsing alias; use `plugin-sdk/channel-targets` |
| `plugin-sdk/outbound-media` | Shared outbound media loading and hosted-media state helpers |
| `plugin-sdk/outbound-send-deps` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/outbound-runtime` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/poll-runtime` | Narrow poll normalization helpers |
| `plugin-sdk/thread-bindings-runtime` | Thread-binding lifecycle and adapter helpers |
| `plugin-sdk/outbound-media` | Private-local after July 2026; Shared outbound media loading and hosted-media state helpers |
| `plugin-sdk/poll-runtime` | Private-local after July 2026; Narrow poll normalization helpers |
| `plugin-sdk/thread-bindings-runtime` | Private-local after July 2026; Thread-binding lifecycle and adapter helpers |
| `plugin-sdk/agent-media-payload` | Agent media payload roots and loaders |
| `plugin-sdk/conversation-runtime` | Deprecated broad barrel for conversation/thread binding, pairing, and configured-binding helpers; prefer focused binding subpaths such as `plugin-sdk/thread-bindings-runtime` and `plugin-sdk/session-binding-runtime` |
| `plugin-sdk/runtime-group-policy` | Runtime group-policy resolution helpers |
| `plugin-sdk/channel-status` | Shared channel status snapshot/summary helpers |
| `plugin-sdk/channel-config-primitives` | Narrow channel config-schema primitives |
| `plugin-sdk/channel-config-writes` | Channel config-write authorization helpers |
| `plugin-sdk/channel-config-writes` | Private-local after July 2026; Channel config-write authorization helpers |
| `plugin-sdk/channel-plugin-common` | Shared channel plugin prelude exports |
| `plugin-sdk/allowlist-config-edit` | Allowlist config edit/read helpers |
| `plugin-sdk/group-access` | Deprecated group-access decision helpers; use `resolveChannelMessageIngress` from `plugin-sdk/channel-ingress-runtime` |
| `plugin-sdk/direct-dm`, `plugin-sdk/direct-dm-access` | Deprecated compatibility facades. Use `plugin-sdk/channel-inbound`. |
| `plugin-sdk/direct-dm-guard-policy` | Narrow direct-DM pre-crypto guard policy helpers |
| `plugin-sdk/direct-dm-guard-policy` | Private-local after July 2026; Narrow direct-DM pre-crypto guard policy helpers |
| `plugin-sdk/discord` | Deprecated Discord compatibility facade for published `@openclaw/discord@2026.3.13` and tracked owner compatibility; new plugins should use generic channel SDK subpaths |
| `plugin-sdk/telegram-account` | Deprecated Telegram account-resolution compatibility facade for tracked owner compatibility; new plugins should use injected runtime helpers or generic channel SDK subpaths |
| `plugin-sdk/zalouser` | Deprecated Zalo Personal compatibility facade for published Lark/Zalo packages that still import sender command authorization; new plugins should use generic channel SDK subpaths |
| `plugin-sdk/interactive-runtime` | Semantic message presentation, delivery, and legacy interactive reply helpers. See [Message Presentation](/plugins/message-presentation) |
| `plugin-sdk/question-gateway-runtime` | Resolve runtime-authored `ask_user` choices through the Gateway from channel interaction handlers |
| `plugin-sdk/channel-inbound` | Shared inbound helpers for event classification, context building, formatting, roots, debounce, mention matching, mention-policy, and inbound logging |
| `plugin-sdk/channel-inbound-debounce` | Narrow inbound debounce helpers |
| `plugin-sdk/channel-mention-gating` | Narrow mention-policy, mention marker, and mention text helpers without the broader inbound runtime surface |
| `plugin-sdk/channel-envelope`, `plugin-sdk/channel-inbound-roots`, `plugin-sdk/channel-location`, `plugin-sdk/channel-logging` | Deprecated compatibility facades. Use `plugin-sdk/channel-inbound` or `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-pairing-paths` | Deprecated compatibility facade. Use `plugin-sdk/channel-pairing`. |
| `plugin-sdk/channel-reply-options-runtime` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-mention-gating` | Private-local after July 2026; Narrow mention-policy, mention marker, and mention text helpers without the broader inbound runtime surface |
| `plugin-sdk/channel-streaming` | Deprecated compatibility facade. Use `plugin-sdk/channel-outbound`. |
| `plugin-sdk/channel-send-result` | Reply result types |
| `plugin-sdk/channel-actions` | Channel message-action helpers, plus deprecated native schema helpers kept for plugin compatibility |
| `plugin-sdk/channel-route` | Shared route normalization, parser-driven target resolution, thread-id stringification, dedupe/compact route keys, parsed-target types, and route/target comparison helpers |
| `plugin-sdk/channel-targets` | Target parsing helpers; route comparison callers should use `plugin-sdk/channel-route` |
| `plugin-sdk/channel-route` | Private-local after July 2026; Shared route normalization, parser-driven target resolution, thread-id stringification, dedupe/compact route keys, parsed-target types, and route/target comparison helpers |
| `plugin-sdk/channel-targets` | Private-local after July 2026; Target parsing helpers; route comparison callers should use `plugin-sdk/channel-route` |
| `plugin-sdk/channel-contract` | Channel contract types |
| `plugin-sdk/channel-feedback` | Feedback/reaction wiring |
</Accordion>
Deprecated channel helper families stay available only for published-plugin
compatibility. The removal plan is: keep them through the external plugin
migration window, keep repo/bundled plugins on `channel-inbound` and
`channel-outbound`, then remove the compatibility subpaths in the next major
SDK cleanup. This applies to the old channel message/runtime, channel
streaming, direct-DM access, inbound helper splinter, reply-options,
and pairing-path families.
Later-window channel compatibility subpaths remain public only through their
registry dates. July aliases such as direct-DM access, reply-options, pairing
paths, and channel runtime splinters have been removed; bundled-only helpers
are private-local.
<Accordion title="Provider subpaths">
| Subpath | Key exports |
| --- | --- |
| `plugin-sdk/provider-entry` | `defineSingleProviderPluginEntry` |
| `plugin-sdk/lmstudio` | Supported LM Studio provider facade for setup, catalog discovery, and runtime model preparation |
| `plugin-sdk/lmstudio-runtime` | Supported LM Studio runtime facade for local server defaults, model discovery, request headers, and loaded-model helpers |
| `plugin-sdk/provider-setup` | Curated local/self-hosted provider setup helpers |
| `plugin-sdk/self-hosted-provider-setup` | Deprecated OpenAI-compatible self-hosted setup helpers; use `plugin-sdk/provider-setup` or plugin-owned setup helpers |
| `plugin-sdk/cli-backend` | CLI backend defaults + watchdog constants |
| `plugin-sdk/provider-auth-runtime` | Provider auth runtime helpers: OAuth loopback flow, token exchange, auth persistence, and API-key resolution |
| `plugin-sdk/provider-oauth-runtime` | Generic provider OAuth callback types, callback-page rendering, PKCE/state helpers, authorization-input parsing, token-expiry helpers, and abort helpers |
| `plugin-sdk/provider-auth-api-key` | API-key onboarding/profile-write helpers such as `upsertApiKeyProfile` |
| `plugin-sdk/provider-auth-result` | Standard OAuth auth-result builder |
| `plugin-sdk/provider-env-vars` | Provider auth env-var lookup helpers |
| `plugin-sdk/provider-entry` | Private-local after July 2026; `defineSingleProviderPluginEntry` |
| `plugin-sdk/provider-setup` | Private-local after July 2026; Curated local/self-hosted provider setup helpers |
| `plugin-sdk/cli-backend` | Private-local after July 2026; CLI backend defaults + watchdog constants |
| `plugin-sdk/provider-auth-runtime` | Private-local after July 2026; Provider auth runtime helpers: OAuth loopback flow, token exchange, auth persistence, and API-key resolution |
| `plugin-sdk/provider-oauth-runtime` | Private-local after July 2026; Generic provider OAuth callback types, callback-page rendering, PKCE/state helpers, authorization-input parsing, token-expiry helpers, and abort helpers |
| `plugin-sdk/provider-auth-api-key` | Private-local after July 2026; API-key onboarding/profile-write helpers such as `upsertApiKeyProfile` |
| `plugin-sdk/provider-auth-result` | Private-local after July 2026; Standard OAuth auth-result builder |
| `plugin-sdk/provider-env-vars` | Private-local after July 2026; Provider auth env-var lookup helpers |
| `plugin-sdk/provider-auth` | `createProviderApiKeyAuthMethod`, `ensureApiKeyFromOptionEnvOrPrompt`, `upsertAuthProfile`, `upsertApiKeyProfile`, `writeOAuthCredentials`, OpenAI Codex auth-import helpers, deprecated `resolveOpenClawAgentDir` compatibility export |
| `plugin-sdk/provider-model-shared` | `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `selectPreferredLocalModelId`, `normalizeModelCompat`, shared replay-policy builders, provider-endpoint helpers, and shared model-id normalization helpers |
| `plugin-sdk/provider-catalog-live-runtime` | Live provider model catalog helpers for guarded `/models`-style discovery: `buildLiveModelProviderConfig`, `fetchLiveProviderModelRows`, `getCachedLiveProviderModelRows`, `fetchLiveProviderModelIds`, `LiveModelCatalogHttpError`, `clearLiveCatalogCacheForTests`, model-id filtering, TTL cache, and static fallback |
| `plugin-sdk/provider-model-shared` | Private-local after July 2026; `ProviderReplayFamily`, `buildProviderReplayFamilyHooks`, `selectPreferredLocalModelId`, `normalizeModelCompat`, shared replay-policy builders, provider-endpoint helpers, and shared model-id normalization helpers |
| `plugin-sdk/provider-catalog-live-runtime` | Private-local after July 2026; Live provider model catalog helpers for guarded `/models`-style discovery: `buildLiveModelProviderConfig`, `fetchLiveProviderModelRows`, `getCachedLiveProviderModelRows`, `fetchLiveProviderModelIds`, `LiveModelCatalogHttpError`, `clearLiveCatalogCacheForTests`, model-id filtering, TTL cache, and static fallback |
| `plugin-sdk/provider-catalog-runtime` | Provider catalog augmentation runtime hook and plugin-provider registry seams for contract tests |
| `plugin-sdk/provider-catalog-shared` | `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `buildManifestModelProviderConfig`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Generic provider HTTP/endpoint capability helpers, provider HTTP errors, and audio transcription multipart form helpers |
| `plugin-sdk/provider-web-fetch-contract` | Narrow web-fetch config/selection contract helpers such as `enablePluginInConfig` and `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Web-fetch provider registration/cache helpers |
| `plugin-sdk/provider-web-search-config-contract` | Narrow web-search config/credential helpers for providers that do not need plugin-enable wiring |
| `plugin-sdk/provider-web-search-contract` | Narrow web-search config/credential contract helpers such as `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, and scoped credential setters/getters |
| `plugin-sdk/provider-web-search` | Web-search provider registration/cache/runtime helpers |
| `plugin-sdk/embedding-providers` | General embedding provider types and read helpers, including `EmbeddingProviderAdapter`, `getEmbeddingProvider(...)`, and `listEmbeddingProviders(...)`; plugins register providers through `api.registerEmbeddingProvider(...)` so manifest ownership is enforced |
| `plugin-sdk/provider-tools` | `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, and DeepSeek/Gemini/OpenAI schema cleanup + diagnostics |
| `plugin-sdk/provider-usage` | Provider usage snapshot types, shared usage fetch helpers, and provider fetchers such as `fetchClaudeUsage` |
| `plugin-sdk/provider-stream` | `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, stream wrapper types, plain-text tool-call compat, and shared Anthropic/Google/Kilocode/MiniMax/Moonshot/OpenAI/OpenRouter/Z.AI wrapper helpers |
| `plugin-sdk/provider-stream-shared` | Public shared provider stream wrapper helpers including `composeProviderStreamWrappers`, `createOpenAICompatibleCompletionsThinkingOffWrapper`, `createPlainTextToolCallCompatWrapper`, `createPayloadPatchStreamWrapper`, `createToolStreamWrapper`, `normalizeOpenAICompatibleReasoningPayload`, `setQwenChatTemplateThinking`, and Anthropic/DeepSeek/OpenAI-compatible stream utilities |
| `plugin-sdk/provider-transport-runtime` | Native provider transport helpers such as guarded fetch, tool-result text extraction, transport message transforms, and writable transport event streams |
| `plugin-sdk/provider-onboard` | Onboarding config patch helpers |
| `plugin-sdk/global-singleton` | Process-local singleton/map/cache helpers |
| `plugin-sdk/group-activation` | Narrow group activation mode and command parsing helpers |
| `plugin-sdk/provider-catalog-shared` | Private-local after July 2026; `findCatalogTemplate`, `buildSingleProviderApiKeyCatalog`, `buildManifestModelProviderConfig`, `supportsNativeStreamingUsageCompat`, `applyProviderNativeStreamingUsageCompat` |
| `plugin-sdk/provider-http` | Private-local after July 2026; Generic provider HTTP/endpoint capability helpers, provider HTTP errors, and audio transcription multipart form helpers |
| `plugin-sdk/provider-web-fetch-contract` | Private-local after July 2026; Narrow web-fetch config/selection contract helpers such as `enablePluginInConfig` and `WebFetchProviderPlugin` |
| `plugin-sdk/provider-web-fetch` | Private-local after July 2026; Web-fetch provider registration/cache helpers |
| `plugin-sdk/provider-web-search-config-contract` | Private-local after July 2026; Narrow web-search config/credential helpers for providers that do not need plugin-enable wiring |
| `plugin-sdk/provider-web-search-contract` | Private-local after July 2026; Narrow web-search config/credential contract helpers such as `createWebSearchProviderContractFields`, `enablePluginInConfig`, `resolveProviderWebSearchPluginConfig`, and scoped credential setters/getters |
| `plugin-sdk/provider-web-search` | Private-local after July 2026; Web-search provider registration/cache/runtime helpers |
| `plugin-sdk/embedding-providers` | Private-local after July 2026; General embedding provider types and read helpers, including `EmbeddingProviderAdapter`, `getEmbeddingProvider(...)`, and `listEmbeddingProviders(...)`; plugins register providers through `api.registerEmbeddingProvider(...)` so manifest ownership is enforced |
| `plugin-sdk/provider-tools` | Private-local after July 2026; `ProviderToolCompatFamily`, `buildProviderToolCompatFamilyHooks`, and DeepSeek/Gemini/OpenAI schema cleanup + diagnostics |
| `plugin-sdk/provider-usage` | Private-local after July 2026; Provider usage snapshot types, shared usage fetch helpers, and provider fetchers such as `fetchClaudeUsage` |
| `plugin-sdk/provider-stream` | Private-local after July 2026; `ProviderStreamFamily`, `buildProviderStreamFamilyHooks`, `composeProviderStreamWrappers`, stream wrapper types, plain-text tool-call compat, and shared Anthropic/Google/Kilocode/MiniMax/Moonshot/OpenAI/OpenRouter/Z.AI wrapper helpers |
| `plugin-sdk/provider-stream-shared` | Private-local after July 2026; Public shared provider stream wrapper helpers including `composeProviderStreamWrappers`, `createOpenAICompatibleCompletionsThinkingOffWrapper`, `createPlainTextToolCallCompatWrapper`, `createPayloadPatchStreamWrapper`, `createToolStreamWrapper`, `normalizeOpenAICompatibleReasoningPayload`, `setQwenChatTemplateThinking`, and Anthropic/DeepSeek/OpenAI-compatible stream utilities |
| `plugin-sdk/provider-transport-runtime` | Private-local after July 2026; Native provider transport helpers such as guarded fetch, tool-result text extraction, transport message transforms, and writable transport event streams |
| `plugin-sdk/provider-onboard` | Private-local after July 2026; Onboarding config patch helpers |
| `plugin-sdk/global-singleton` | Private-local after July 2026; Process-local singleton/map/cache helpers |
| `plugin-sdk/group-activation` | Private-local after July 2026; Narrow group activation mode and command parsing helpers |
</Accordion>
Provider usage snapshots normally report one or more quota `windows`, each with
@@ -212,28 +180,26 @@ usage endpoint failed or returned no usable usage data.
| `plugin-sdk/approval-client-runtime` | Native exec approval profile/filter helpers |
| `plugin-sdk/approval-delivery-runtime` | Native approval capability/delivery adapters |
| `plugin-sdk/approval-gateway-runtime` | Shared approval gateway resolver |
| `plugin-sdk/approval-reference-runtime` | Deterministic durable-locator helper for transport-limited approval callbacks |
| `plugin-sdk/approval-reference-runtime` | Private-local after July 2026; Deterministic durable-locator helper for transport-limited approval callbacks |
| `plugin-sdk/approval-handler-adapter-runtime` | Lightweight native approval adapter loading helpers for hot channel entrypoints |
| `plugin-sdk/approval-handler-runtime` | Broader approval handler runtime helpers; prefer the narrower adapter/gateway seams when they are enough |
| `plugin-sdk/approval-native-runtime` | Native approval target, account-binding, route-gate, forwarding fallback, and local native exec prompt suppression helpers |
| `plugin-sdk/approval-reaction-runtime` | Hardcoded approval reaction bindings, reaction prompt payloads, reaction target stores, reaction hint text helpers, and compatibility export for local native exec prompt suppression |
| `plugin-sdk/approval-reaction-runtime` | Private-local after July 2026; Hardcoded approval reaction bindings, reaction prompt payloads, reaction target stores, reaction hint text helpers, and compatibility export for local native exec prompt suppression |
| `plugin-sdk/approval-reply-runtime` | Exec/plugin approval reply payload helpers |
| `plugin-sdk/approval-runtime` | Exec/plugin approval payload helpers, approval-capability builders, approval auth/profile helpers, native approval routing/runtime helpers, and structured approval display helpers such as `formatApprovalDisplayPath` |
| `plugin-sdk/reply-dedupe` | Deprecated narrow inbound reply dedupe reset helpers |
| `plugin-sdk/command-auth-native` | Native command auth, dynamic argument menu formatting, and native session-target helpers |
| `plugin-sdk/command-detection` | Shared command detection helpers |
| `plugin-sdk/command-primitives-runtime` | Lightweight command text predicates for hot channel paths |
| `plugin-sdk/command-surface` | Command-body normalization and command-surface helpers |
| `plugin-sdk/command-surface` | Private-local after July 2026; Command-body normalization and command-surface helpers |
| `plugin-sdk/allow-from` | `formatAllowFromLowercase` |
| `plugin-sdk/provider-auth-login-flow-runtime` | Lazy provider auth login flow helpers for private channel and Web UI device-code pairing |
| `plugin-sdk/provider-auth-login-flow-runtime` | Private-local after July 2026; Lazy provider auth login flow helpers for private channel and Web UI device-code pairing |
| `plugin-sdk/channel-secret-runtime` | Deprecated broad secret-contract surface (`collectSimpleChannelFieldAssignments`, `getChannelSurface`, `pushAssignment`, secret target types); prefer the focused subpaths below |
| `plugin-sdk/channel-secret-basic-runtime` | Narrow secret-contract exports and target-registry builders for non-TTS channel/plugin secret surfaces |
| `plugin-sdk/channel-secret-tts-runtime` | Narrow nested channel TTS secret assignment helpers |
| `plugin-sdk/channel-secret-tts-runtime` | Private-local after July 2026; Narrow nested channel TTS secret assignment helpers |
| `plugin-sdk/secret-ref-runtime` | Narrow SecretRef typing, resolution, and plan-target path lookup for secret-contract/config parsing |
| `plugin-sdk/secret-provider-integration` | Type-only SecretRef provider integration manifest and preset contracts for plugins that publish external secret provider presets |
| `plugin-sdk/security-runtime` | Deprecated broad barrel for trust, DM gating, root-bounded file/path helpers including create-only writes, sync/async atomic file replacement, sibling temp writes, cross-device move fallback, private file-store helpers, symlink-parent guards, external-content, sensitive text redaction, constant-time secret comparison, and secret-collection helpers; prefer focused security/SSRF/secret subpaths |
| `plugin-sdk/ssrf-policy` | Host allowlist and private-network SSRF policy helpers |
| `plugin-sdk/ssrf-dispatcher` | Narrow pinned-dispatcher helpers without the broad infra runtime surface |
| `plugin-sdk/ssrf-dispatcher` | Private-local after July 2026; Narrow pinned-dispatcher helpers without the broad infra runtime surface |
| `plugin-sdk/ssrf-runtime` | Pinned-dispatcher, SSRF-guarded fetch, SSRF error, and SSRF policy helpers |
| `plugin-sdk/secret-input` | Secret input parsing helpers |
| `plugin-sdk/webhook-ingress` | Webhook request/target helpers and raw websocket/body coercion |
@@ -245,107 +211,105 @@ usage endpoint failed or returned no usable usage data.
| --- | --- |
| `plugin-sdk/runtime` | Runtime/logging/backup helpers, plugin install-path warnings, and process helpers |
| `plugin-sdk/runtime-env` | Narrow runtime env, logger, timeout, retry, and backoff helpers |
| `plugin-sdk/browser-config` | Supported browser config facade for normalized profile/defaults, CDP URL parsing, and browser-control auth helpers |
| `plugin-sdk/agent-harness-task-runtime` | Generic task lifecycle and completion delivery helpers for harness-backed agents using a host-issued task scope |
| `plugin-sdk/codex-mcp-projection` | Reserved bundled Codex helper for projecting user MCP server config into Codex thread config; not for third-party plugins |
| `plugin-sdk/browser-config` | Private-local after July 2026; Supported browser config facade for normalized profile/defaults, CDP URL parsing, and browser-control auth helpers |
| `plugin-sdk/agent-harness-task-runtime` | Private-local after July 2026; Generic task lifecycle and completion delivery helpers for harness-backed agents using a host-issued task scope |
| `plugin-sdk/codex-mcp-projection` | Private-local after July 2026; Reserved bundled Codex helper for projecting user MCP server config into Codex thread config; not for third-party plugins |
| `plugin-sdk/codex-native-task-runtime` | Repo-local bundled Codex helper for native task mirror/runtime wiring; not a package export |
| `plugin-sdk/channel-runtime-context` | Generic channel runtime-context registration and lookup helpers |
| `plugin-sdk/matrix` | Deprecated Matrix compatibility facade for older third-party channel packages; new plugins should import `plugin-sdk/run-command` directly |
| `plugin-sdk/mattermost` | Deprecated Mattermost compatibility facade for older third-party channel packages; new plugins should import generic SDK subpaths directly |
| `plugin-sdk/runtime-store` | `createPluginRuntimeStore` |
| `plugin-sdk/plugin-runtime` | Deprecated broad barrel for plugin command/hook/http/interactive helpers; prefer focused plugin runtime subpaths |
| `plugin-sdk/hook-runtime` | Deprecated broad barrel for webhook/internal hook pipeline helpers; prefer focused hook/plugin runtime subpaths |
| `plugin-sdk/lazy-runtime` | Lazy runtime import/binding helpers such as `createLazyRuntimeModule`, `createLazyRuntimeMethod`, and `createLazyRuntimeSurface` |
| `plugin-sdk/process-runtime` | Process exec helpers |
| `plugin-sdk/node-host` | Node-host executable resolution and PTY resume helpers |
| `plugin-sdk/cli-runtime` | Deprecated broad barrel for CLI formatting, wait, version, argument-invocation, and lazy command-group helpers; prefer focused CLI/runtime subpaths |
| `plugin-sdk/qa-runner-runtime` | Supported facade exposing plugin QA scenarios through the CLI command surface |
| `plugin-sdk/tts-runtime` | Supported facade for text-to-speech config schemas and runtime helpers |
| `plugin-sdk/process-runtime` | Private-local after July 2026; Process exec helpers |
| `plugin-sdk/node-host` | Private-local after July 2026; Node-host executable resolution and PTY resume helpers |
| `plugin-sdk/cli-runtime` | Private-local after July 2026; Deprecated broad barrel for CLI formatting, wait, version, argument-invocation, and lazy command-group helpers; prefer focused CLI/runtime subpaths |
| `plugin-sdk/qa-runner-runtime` | Private-local after July 2026; Supported facade exposing plugin QA scenarios through the CLI command surface |
| `plugin-sdk/tts-runtime` | Private-local after July 2026; Supported facade for text-to-speech config schemas and runtime helpers |
| `plugin-sdk/gateway-method-runtime` | Reserved Gateway method dispatch helper for plugin HTTP routes that declare `contracts.gatewayMethodDispatch: ["authenticated-request"]` |
| `plugin-sdk/gateway-runtime` | Gateway client, event-loop-ready client start helper, gateway CLI RPC, gateway protocol errors, advertised LAN host resolution, and channel-status patch helpers |
| `plugin-sdk/config-contracts` | Focused type-only config surface for plugin config shapes such as `OpenClawConfig` and channel/provider config types |
| `plugin-sdk/plugin-config-runtime` | Runtime plugin-config helpers such as `mergeDeep`, `requireRuntimeConfig`, `resolvePluginConfigObject`, and `resolveLivePluginConfigObject` |
| `plugin-sdk/config-mutation` | Transactional config mutation helpers such as `mutateConfigFile`, `replaceConfigFile`, and `logConfigUpdated` |
| `plugin-sdk/message-tool-delivery-hints` | Shared message-tool delivery metadata hint strings |
| `plugin-sdk/message-tool-delivery-hints` | Private-local after July 2026; Shared message-tool delivery metadata hint strings |
| `plugin-sdk/runtime-config-snapshot` | Current process config snapshot helpers such as `getRuntimeConfig`, `getRuntimeConfigSnapshot`, and test snapshot setters |
| `plugin-sdk/text-autolink-runtime` | File-reference autolink detection without the broad text barrel |
| `plugin-sdk/text-autolink-runtime` | Private-local after July 2026; File-reference autolink detection without the broad text barrel |
| `plugin-sdk/reply-runtime` | Shared inbound/reply runtime helpers, chunking, dispatch, heartbeat, reply planner |
| `plugin-sdk/reply-dispatch-runtime` | Narrow reply dispatch/finalize and conversation-label helpers |
| `plugin-sdk/reply-history` | Shared short-window reply-history helpers. New message-turn code should use `createChannelHistoryWindow`; lower-level map helpers remain deprecated compatibility exports only |
| `plugin-sdk/reply-reference` | `createReplyReferencePlanner` |
| `plugin-sdk/reply-reference` | Private-local after July 2026; `createReplyReferencePlanner` |
| `plugin-sdk/reply-chunking` | Narrow text/markdown chunking helpers |
| `plugin-sdk/session-store-runtime` | Session workflow helpers (`getSessionEntry`, `listSessionEntries`, `patchSessionEntry`, `upsertSessionEntry`), repair/lifecycle helpers (`deleteSessionEntry`, `cleanupSessionLifecycleArtifacts`, `resolveSessionStoreBackupPaths`), marker helpers for transitional `sessionFile` values, bounded recent user/assistant transcript text reads by session identity, session store path/session-key helpers, and updated-at reads, without broad config writes/maintenance imports |
| `plugin-sdk/session-transcript-runtime` | Transcript identity, bounded raw and visible cursors, scoped target/read/write helpers, visible message-entry projection, update publishing, write locks, and transcript memory hit keys |
| `plugin-sdk/sqlite-runtime` | Focused SQLite agent-schema, path, and transaction helpers for first-party runtime, without database lifecycle controls |
| `plugin-sdk/cron-store-runtime` | Cron store path/load/save helpers |
| `plugin-sdk/session-transcript-runtime` | Private-local after July 2026; Transcript identity, bounded raw and visible cursors, scoped target/read/write helpers, visible message-entry projection, update publishing, write locks, and transcript memory hit keys |
| `plugin-sdk/sqlite-runtime` | Private-local after July 2026; Focused SQLite agent-schema, path, and transaction helpers for first-party runtime, without database lifecycle controls |
| `plugin-sdk/cron-store-runtime` | Private-local after July 2026; Cron store path/load/save helpers |
| `plugin-sdk/state-paths` | State/OAuth dir path helpers |
| `plugin-sdk/plugin-state-runtime` | Plugin-scoped keyed-state, BLOB, and cooperative SQLite lease contracts plus connection pragma, verified WAL maintenance, and atomic STRICT-schema migration helpers. Lease callbacks receive an abort signal and typed errors distinguish timeout, cancellation, lost ownership, invalid input, and storage failure |
| `plugin-sdk/plugin-state-runtime` | Private-local after July 2026; Plugin-scoped keyed-state, BLOB, and cooperative SQLite lease contracts plus connection pragma, verified WAL maintenance, and atomic STRICT-schema migration helpers. Lease callbacks receive an abort signal and typed errors distinguish timeout, cancellation, lost ownership, invalid input, and storage failure |
| `plugin-sdk/routing` | Route/session-key/account binding helpers such as `resolveAgentRoute`, `buildAgentSessionKey`, and `resolveDefaultAgentBoundAccountId` |
| `plugin-sdk/status-helpers` | Shared channel/account status summary helpers, runtime-state defaults, and issue metadata helpers |
| `plugin-sdk/target-resolver-runtime` | Shared target resolver helpers |
| `plugin-sdk/string-normalization-runtime` | Slug/string normalization helpers |
| `plugin-sdk/request-url` | Extract string URLs from fetch/request-like inputs |
| `plugin-sdk/target-resolver-runtime` | Private-local after July 2026; Shared target resolver helpers |
| `plugin-sdk/string-normalization-runtime` | Private-local after July 2026; Slug/string normalization helpers |
| `plugin-sdk/request-url` | Private-local after July 2026; Extract string URLs from fetch/request-like inputs |
| `plugin-sdk/run-command` | Timed command runner with normalized stdout/stderr results |
| `plugin-sdk/param-readers` | Common tool/CLI param readers |
| `plugin-sdk/tool-plugin` | Define a simple typed agent-tool plugin and expose static metadata for manifest generation |
| `plugin-sdk/tool-payload` | Extract normalized payloads from tool result objects |
| `plugin-sdk/tool-payload` | Private-local after July 2026; Extract normalized payloads from tool result objects |
| `plugin-sdk/tool-send` | Extract canonical send target fields from tool args |
| `plugin-sdk/sandbox` | Sandbox backend types and SSH/OpenShell command helpers, including fail-fast exec command preflight |
| `plugin-sdk/sandbox` | Private-local after July 2026; Sandbox backend types and SSH/OpenShell command helpers, including fail-fast exec command preflight |
| `plugin-sdk/temp-path` | Shared temp-download path helpers and private secure temp workspaces |
| `plugin-sdk/logging-core` | Subsystem logger and redaction helpers |
| `plugin-sdk/markdown-table-runtime` | Markdown table mode and conversion helpers |
| `plugin-sdk/markdown-table-runtime` | Private-local after July 2026; Markdown table mode and conversion helpers |
| `plugin-sdk/model-session-runtime` | Model/session override helpers such as `applyModelOverrideToSessionEntry` and `resolveAgentMaxConcurrent` |
| `plugin-sdk/talk-config-runtime` | Talk provider config resolution helpers |
| `plugin-sdk/talk-config-runtime` | Private-local after July 2026; Talk provider config resolution helpers |
| `plugin-sdk/json-store` | Small JSON state read/write helpers |
| `plugin-sdk/json-unsafe-integers` | JSON parsing helpers that preserve unsafe integer literals as strings |
| `plugin-sdk/file-lock` | Re-entrant file-lock helpers plus Doctor-safe reclaim of definitely stale, unchanged retired lock sidecars |
| `plugin-sdk/json-unsafe-integers` | Private-local after July 2026; JSON parsing helpers that preserve unsafe integer literals as strings |
| `plugin-sdk/file-lock` | Private-local after July 2026; Re-entrant file-lock helpers plus Doctor-safe reclaim of definitely stale, unchanged retired lock sidecars |
| `plugin-sdk/persistent-dedupe` | Disk-backed dedupe cache helpers |
| `plugin-sdk/ingress-effect-once` | Durable claim/commit guard for non-idempotent ingress side effects |
| `plugin-sdk/acp-runtime` | ACP runtime/session and reply-dispatch helpers |
| `plugin-sdk/acp-runtime-backend` | Lightweight ACP backend registration and reply-dispatch helpers for startup-loaded plugins |
| `plugin-sdk/acp-binding-resolve-runtime` | Read-only ACP binding resolution without lifecycle startup imports |
| `plugin-sdk/acp-runtime` | Private-local after July 2026; ACP runtime/session and reply-dispatch helpers |
| `plugin-sdk/acp-runtime-backend` | Private-local after July 2026; Lightweight ACP backend registration and reply-dispatch helpers for startup-loaded plugins |
| `plugin-sdk/acp-binding-resolve-runtime` | Private-local after July 2026; Read-only ACP binding resolution without lifecycle startup imports |
| `plugin-sdk/agent-config-primitives` | Deprecated agent runtime config-schema primitives; import schema primitives from a maintained plugin-owned surface |
| `plugin-sdk/boolean-param` | Loose boolean param reader |
| `plugin-sdk/dangerous-name-runtime` | Dangerous-name matching resolution helpers |
| `plugin-sdk/dangerous-name-runtime` | Private-local after July 2026; Dangerous-name matching resolution helpers |
| `plugin-sdk/device-bootstrap` | Device bootstrap and pairing token helpers, including `BOOTSTRAP_HANDOFF_OPERATOR_SCOPES` |
| `plugin-sdk/extension-shared` | Shared passive-channel, status, and ambient proxy helper primitives |
| `plugin-sdk/models-provider-runtime` | `/models` command/provider reply helpers |
| `plugin-sdk/skill-commands-runtime` | Skill command listing helpers |
| `plugin-sdk/native-command-registry` | Native command registry/build/serialize helpers |
| `plugin-sdk/agent-harness` | Experimental trusted-plugin surface for low-level agent harnesses: harness types, active-run steer/abort helpers, OpenClaw tool bridge helpers, runtime-plan tool policy helpers, terminal outcome classification, tool progress formatting/detail helpers, and attempt result utilities |
| `plugin-sdk/provider-zai-endpoint` | Deprecated Z.AI provider-owned endpoint detection facade; use the Z.AI plugin public API |
| `plugin-sdk/async-lock-runtime` | Process-local async lock helper for small runtime state files |
| `plugin-sdk/channel-activity-runtime` | Channel activity telemetry helper |
| `plugin-sdk/concurrency-runtime` | Bounded async task concurrency helper |
| `plugin-sdk/async-lock-runtime` | Private-local after July 2026; Process-local async lock helper for small runtime state files |
| `plugin-sdk/channel-activity-runtime` | Private-local after July 2026; Channel activity telemetry helper |
| `plugin-sdk/concurrency-runtime` | Private-local after July 2026; Bounded async task concurrency helper |
| `plugin-sdk/dedupe-runtime` | In-memory and persistent-backed dedupe cache helpers |
| `plugin-sdk/delivery-queue-runtime` | Outbound pending-delivery drain helper |
| `plugin-sdk/file-access-runtime` | Safe local-file and media-source path helpers |
| `plugin-sdk/heartbeat-runtime` | Heartbeat wake, event, and visibility helpers |
| `plugin-sdk/expect-runtime` | Required-value assertion helper for provable runtime invariants |
| `plugin-sdk/number-runtime` | Numeric coercion helper |
| `plugin-sdk/secure-random-runtime` | Secure token/UUID helpers |
| `plugin-sdk/system-event-runtime` | System event queue helpers |
| `plugin-sdk/transport-ready-runtime` | Transport readiness wait helper |
| `plugin-sdk/exec-approvals-runtime` | Exec approval policy file helpers without the broad infra-runtime barrel |
| `plugin-sdk/delivery-queue-runtime` | Private-local after July 2026; Outbound pending-delivery drain helper |
| `plugin-sdk/file-access-runtime` | Private-local after July 2026; Safe local-file and media-source path helpers |
| `plugin-sdk/heartbeat-runtime` | Private-local after July 2026; Heartbeat wake, event, and visibility helpers |
| `plugin-sdk/expect-runtime` | Private-local after July 2026; Required-value assertion helper for provable runtime invariants |
| `plugin-sdk/number-runtime` | Private-local after July 2026; Numeric coercion helper |
| `plugin-sdk/secure-random-runtime` | Private-local after July 2026; Secure token/UUID helpers |
| `plugin-sdk/system-event-runtime` | Private-local after July 2026; System event queue helpers |
| `plugin-sdk/transport-ready-runtime` | Private-local after July 2026; Transport readiness wait helper |
| `plugin-sdk/exec-approvals-runtime` | Private-local after July 2026; Exec approval policy file helpers without the broad infra-runtime barrel |
| `plugin-sdk/infra-runtime` | Deprecated compatibility shim; use the focused runtime subpaths above |
| `plugin-sdk/collection-runtime` | Small bounded cache helpers |
| `plugin-sdk/diagnostic-runtime` | Diagnostic flag, event, and trace-context helpers |
| `plugin-sdk/error-runtime` | Error graph, formatting, shared error classification helpers, `PlatformMessageNotDispatchedError`, `isApprovalNotFoundError` |
| `plugin-sdk/fetch-runtime` | Wrapped fetch, proxy, EnvHttpProxyAgent option, and pinned lookup helpers |
| `plugin-sdk/runtime-fetch` | Dispatcher-aware runtime fetch without proxy/guarded-fetch imports |
| `plugin-sdk/inline-image-data-url-runtime` | Inline image data URL sanitizer and signature sniffing helpers without the broad media runtime surface |
| `plugin-sdk/response-limit-runtime` | Byte-, idle-, and deadline-bounded response-body readers without the broad media runtime surface |
| `plugin-sdk/session-binding-runtime` | Current conversation binding state without configured binding routing or pairing stores |
| `plugin-sdk/context-visibility-runtime` | Context visibility resolution and supplemental context filtering without broad config/security imports |
| `plugin-sdk/fetch-runtime` | Private-local after July 2026; Wrapped fetch, proxy, EnvHttpProxyAgent option, and pinned lookup helpers |
| `plugin-sdk/runtime-fetch` | Private-local after July 2026; Dispatcher-aware runtime fetch without proxy/guarded-fetch imports |
| `plugin-sdk/inline-image-data-url-runtime` | Private-local after July 2026; Inline image data URL sanitizer and signature sniffing helpers without the broad media runtime surface |
| `plugin-sdk/response-limit-runtime` | Private-local after July 2026; Byte-, idle-, and deadline-bounded response-body readers without the broad media runtime surface |
| `plugin-sdk/session-binding-runtime` | Private-local after July 2026; Current conversation binding state without configured binding routing or pairing stores |
| `plugin-sdk/context-visibility-runtime` | Private-local after July 2026; Context visibility resolution and supplemental context filtering without broad config/security imports |
| `plugin-sdk/string-coerce-runtime` | Narrow primitive record/string coercion and normalization helpers without markdown/logging imports |
| `plugin-sdk/html-entity-runtime` | Single-pass semicolon-terminated HTML5 entity decoding without broad text utilities |
| `plugin-sdk/text-utility-runtime` | Low-level text and path helpers, including five-entity HTML escaping |
| `plugin-sdk/html-entity-runtime` | Private-local after July 2026; Single-pass semicolon-terminated HTML5 entity decoding without broad text utilities |
| `plugin-sdk/text-utility-runtime` | Private-local after July 2026; Low-level text and path helpers, including five-entity HTML escaping |
| `plugin-sdk/widget-html` | Complete-document detection, size validation, and tool input errors for self-contained HTML widgets |
| `plugin-sdk/host-runtime` | Hostname and SCP host normalization helpers |
| `plugin-sdk/retry-runtime` | Retry config and retry runner helpers |
| `plugin-sdk/host-runtime` | Private-local after July 2026; Hostname and SCP host normalization helpers |
| `plugin-sdk/retry-runtime` | Private-local after July 2026; Retry config and retry runner helpers |
| `plugin-sdk/agent-runtime` | Deprecated broad barrel for agent dir/identity/workspace helpers, including `resolveAgentDir`, `resolveDefaultAgentDir`, and the deprecated `resolveOpenClawAgentDir` compatibility export; prefer focused agent/runtime subpaths |
| `plugin-sdk/directory-runtime` | Config-backed directory query/dedup |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |
| `plugin-sdk/keyed-async-queue` | Private-local after July 2026; `KeyedAsyncQueue` |
</Accordion>
<Accordion title="Capability and testing subpaths">
@@ -354,25 +318,23 @@ usage endpoint failed or returned no usable usage data.
| `plugin-sdk/media-runtime` | Deprecated broad media barrel including `saveRemoteMedia`, `saveResponseMedia`, `readRemoteMediaBuffer`, and deprecated `fetchRemoteMedia`; prefer `plugin-sdk/media-store`, `plugin-sdk/media-mime`, `plugin-sdk/outbound-media`, and capability runtime subpaths, and prefer store helpers before buffer reads when a URL should become OpenClaw media |
| `plugin-sdk/media-mime` | Narrow MIME normalization, file-extension mapping, MIME detection, and media-kind helpers |
| `plugin-sdk/media-store` | Narrow media store helpers such as `saveMediaBuffer` and `saveMediaStream` |
| `plugin-sdk/media-generation-runtime` | Shared media-generation failover helpers, candidate selection, and missing-model messaging |
| `plugin-sdk/media-generation-runtime` | Private-local after July 2026; Shared media-generation failover helpers, candidate selection, and missing-model messaging |
| `plugin-sdk/media-understanding` | Media understanding provider types plus provider-facing image/audio/structured-extraction helper exports |
| `plugin-sdk/text-chunking` | Outbound text and offset-preserving range chunking, markdown chunking/render helpers, quote-aware HTML tag tokenization, markdown table conversion, directive-tag stripping, and safe-text utilities |
| `plugin-sdk/speech` | Speech provider types plus provider-facing directive, registry, validation, OpenAI-compatible TTS builder, and speech helper exports |
| `plugin-sdk/speech-core` | Shared speech provider types, registry, directive, normalization, and speech helper exports |
| `plugin-sdk/speech` | Private-local after July 2026; Speech provider types plus provider-facing directive, registry, validation, OpenAI-compatible TTS builder, and speech helper exports |
| `plugin-sdk/speech-core` | Private-local after July 2026; Shared speech provider types, registry, directive, normalization, and speech helper exports |
| `plugin-sdk/speech-settings` | Lightweight TTS config resolution and normalization primitives without provider registries or synthesis runtime |
| `plugin-sdk/realtime-transcription` | Realtime transcription provider types, registry helpers, and shared WebSocket session helper |
| `plugin-sdk/realtime-bootstrap-context` | Realtime profile bootstrap helper for bounded `IDENTITY.md`, `USER.md`, and `SOUL.md` context injection |
| `plugin-sdk/realtime-voice` | Realtime voice provider types, registry helpers, shared audio-energy/speech-onset gates, and realtime voice behavior helpers, including the transport-independent session harness and output activity tracking |
| `plugin-sdk/realtime-transcription` | Private-local after July 2026; Realtime transcription provider types, registry helpers, and shared WebSocket session helper |
| `plugin-sdk/realtime-bootstrap-context` | Private-local after July 2026; Realtime profile bootstrap helper for bounded `IDENTITY.md`, `USER.md`, and `SOUL.md` context injection |
| `plugin-sdk/realtime-voice` | Private-local after July 2026; Realtime voice provider types, registry helpers, shared audio-energy/speech-onset gates, and realtime voice behavior helpers, including the transport-independent session harness and output activity tracking |
| `plugin-sdk/meeting-runtime` | Browser-meeting session runtime, realtime audio engines/transports, `MeetingPlatformAdapter`, browser/node control, agent-consult, voice-call delegation, setup checks, and SoX command helpers |
| `plugin-sdk/image-generation` | Image generation provider types plus image asset/data URL helpers and the OpenAI-compatible image provider builder |
| `plugin-sdk/image-generation-core` | Shared image-generation types, failover, auth, and registry helpers |
| `plugin-sdk/music-generation` | Music generation provider/request/result types |
| `plugin-sdk/music-generation-core` | Deprecated shared music-generation types, failover helpers, provider lookup, and model-ref parsing; prefer plugin-owned music provider surfaces |
| `plugin-sdk/video-generation` | Video generation provider/request/result types |
| `plugin-sdk/video-generation-core` | Shared video-generation types, failover helpers, provider lookup, and model-ref parsing |
| `plugin-sdk/transcripts` | Shared transcripts source provider types, registry helpers, session descriptors, and utterance metadata |
| `plugin-sdk/webhook-targets` | Webhook target registry and route-install helpers |
| `plugin-sdk/webhook-path` | Deprecated compatibility alias; use `plugin-sdk/webhook-ingress` |
| `plugin-sdk/image-generation` | Private-local after July 2026; Image generation provider types plus image asset/data URL helpers and the OpenAI-compatible image provider builder |
| `plugin-sdk/image-generation-core` | Private-local after July 2026; Shared image-generation types, failover, auth, and registry helpers |
| `plugin-sdk/music-generation` | Private-local after July 2026; Music generation provider/request/result types |
| `plugin-sdk/video-generation` | Private-local after July 2026; Video generation provider/request/result types |
| `plugin-sdk/video-generation-core` | Private-local after July 2026; Shared video-generation types, failover helpers, provider lookup, and model-ref parsing |
| `plugin-sdk/transcripts` | Private-local after July 2026; Shared transcripts source provider types, registry helpers, session descriptors, and utterance metadata |
| `plugin-sdk/webhook-targets` | Private-local after July 2026; Webhook target registry and route-install helpers |
| `plugin-sdk/web-media` | Shared remote/local media loading helpers |
| `plugin-sdk/zod` | Deprecated compatibility re-export; import `zod` from `zod` directly |
| `plugin-sdk/plugin-test-api` | Repo-local minimal `createTestPluginApi` helper for direct plugin registration unit tests without importing repo test helper bridges |
@@ -383,7 +345,7 @@ usage endpoint failed or returned no usable usage data.
| `plugin-sdk/plugin-test-contracts` | Repo-local plugin package, registration, public artifact, direct import, runtime API, and import side-effect contract helpers |
| `plugin-sdk/plugin-state-test-runtime` | Repo-local plugin state store, ingress queue, and state DB test helpers |
| `plugin-sdk/provider-test-contracts` | Repo-local provider runtime, auth, discovery, onboard, catalog, wizard, media capability, replay policy, realtime STT live-audio, web-search/fetch, and stream contract helpers |
| `plugin-sdk/provider-http-test-mocks` | Repo-local opt-in Vitest HTTP/auth mocks for provider tests that exercise `plugin-sdk/provider-http` |
| `plugin-sdk/provider-http-test-mocks` | Private-local after July 2026; Repo-local opt-in Vitest HTTP/auth mocks for provider tests that exercise `plugin-sdk/provider-http` |
| `plugin-sdk/reply-payload-testing` | Repo-local helpers for attaching metadata to reply payload fixtures |
| `plugin-sdk/sqlite-runtime-testing` | Repo-local SQLite lifecycle helpers for first-party tests |
| `plugin-sdk/test-fixtures` | Repo-local generic CLI runtime capture, sandbox context, skill writer, agent-message, system-event, module reload, bundled plugin path, terminal-text, chunking, auth-token, and typed-case fixtures |
@@ -393,27 +355,20 @@ usage endpoint failed or returned no usable usage data.
<Accordion title="Memory subpaths">
| Subpath | Key exports |
| --- | --- |
| `plugin-sdk/memory-core` | Deprecated compatibility alias; use `plugin-sdk/memory-host-core` |
| `plugin-sdk/memory-core-engine-runtime` | Deprecated memory index/search runtime facade; prefer vendor-neutral memory-host subpaths |
| `plugin-sdk/memory-core-host-embedding-registry` | Lightweight memory embedding provider registry helpers |
| `plugin-sdk/memory-core-host-embedding-registry` | Private-local after July 2026; Lightweight memory embedding provider registry helpers |
| `plugin-sdk/memory-core-host-engine-foundation` | Memory host foundation engine exports |
| `plugin-sdk/memory-core-host-engine-embeddings` | Memory host embedding contracts, registry access, local provider, and generic batch/remote helpers. `registerMemoryEmbeddingProvider` on this surface is deprecated; use the generic embedding provider API for new providers. |
| `plugin-sdk/memory-core-host-engine-qmd` | Memory host QMD engine exports |
| `plugin-sdk/memory-core-host-engine-storage` | Memory host storage engine exports |
| `plugin-sdk/memory-core-host-multimodal` | Deprecated memory host multimodal helpers; prefer vendor-neutral memory-host subpaths |
| `plugin-sdk/memory-core-host-query` | Deprecated memory host query helpers; prefer vendor-neutral memory-host subpaths |
| `plugin-sdk/memory-core-host-secret` | Memory host secret helpers |
| `plugin-sdk/memory-core-host-events` | Deprecated compatibility alias; use `plugin-sdk/memory-host-events` |
| `plugin-sdk/memory-core-host-status` | Memory host status helpers |
| `plugin-sdk/memory-core-host-runtime-cli` | Memory host CLI runtime helpers |
| `plugin-sdk/memory-core-host-runtime-core` | Memory host core runtime helpers |
| `plugin-sdk/memory-core-host-runtime-files` | Memory host file/runtime helpers |
| `plugin-sdk/memory-host-core` | Vendor-neutral alias for memory host core runtime helpers |
| `plugin-sdk/memory-host-events` | Vendor-neutral alias for memory host event journal helpers |
| `plugin-sdk/memory-host-files` | Deprecated compatibility alias; use `plugin-sdk/memory-core-host-runtime-files` |
| `plugin-sdk/memory-host-markdown` | Shared managed-markdown helpers for memory-adjacent plugins |
| `plugin-sdk/memory-host-search` | Active memory runtime facade for search-manager access |
| `plugin-sdk/memory-host-status` | Deprecated compatibility alias; use `plugin-sdk/memory-core-host-status` |
| `plugin-sdk/memory-core-host-engine-embeddings` | Private-local after July 2026; Memory host embedding contracts, registry access, local provider, and generic batch/remote helpers. `registerMemoryEmbeddingProvider` on this surface is deprecated; use the generic embedding provider API for new providers. |
| `plugin-sdk/memory-core-host-engine-qmd` | Private-local after July 2026; Memory host QMD engine exports |
| `plugin-sdk/memory-core-host-engine-storage` | Private-local after July 2026; Memory host storage engine exports |
| `plugin-sdk/memory-core-host-secret` | Private-local after July 2026; Memory host secret helpers |
| `plugin-sdk/memory-core-host-status` | Private-local after July 2026; Memory host status helpers |
| `plugin-sdk/memory-core-host-runtime-cli` | Private-local after July 2026; Memory host CLI runtime helpers |
| `plugin-sdk/memory-core-host-runtime-core` | Private-local after July 2026; Memory host core runtime helpers |
| `plugin-sdk/memory-core-host-runtime-files` | Private-local after July 2026; Memory host file/runtime helpers |
| `plugin-sdk/memory-host-core` | Vendor-neutral memory host core runtime helpers |
| `plugin-sdk/memory-host-events` | Private-local after July 2026; Vendor-neutral alias for memory host event journal helpers |
| `plugin-sdk/memory-host-markdown` | Private-local after July 2026; Shared managed-markdown helpers for memory-adjacent plugins |
| `plugin-sdk/memory-host-search` | Private-local after July 2026; Active memory runtime facade for search-manager access |
</Accordion>
<Accordion title="Reserved bundled-helper subpaths">
@@ -426,7 +381,7 @@ usage endpoint failed or returned no usable usage data.
| Subpath | Owner and purpose |
| --- | --- |
| `plugin-sdk/codex-mcp-projection` | Bundled Codex plugin helper for projecting user MCP server config into Codex app-server thread config (reserved package export) |
| `plugin-sdk/codex-mcp-projection` | Private-local after July 2026; Bundled Codex plugin helper for projecting user MCP server config into Codex app-server thread config (reserved package export) |
| `plugin-sdk/codex-native-task-runtime` | Bundled Codex plugin helper for mirroring Codex app-server native subagents into OpenClaw task state (repo-local only, not a package export) |
</Accordion>
+12 -14
View File
@@ -50,10 +50,10 @@ import { mockNodeBuiltinModule } from "openclaw/plugin-sdk/test-node-mocks";
Use these focused subpaths for bundled plugin tests. The former
`openclaw/plugin-sdk/testing` barrel was repo-local, excluded from shipped
packages, and has been removed. The legacy `openclaw/plugin-sdk/test-utils`
alias remains repo-local; `pnpm run lint:plugins:no-extension-test-core-imports`
(`scripts/check-no-extension-test-core-imports.ts`) rejects new extension-test
imports of that alias.
packages, and has been removed. The former `openclaw/plugin-sdk/test-utils`
alias was removed with it. `pnpm run lint:plugins:no-extension-test-core-imports`
(`scripts/check-no-extension-test-core-imports.ts`) keeps extension tests on
the focused test subpaths above.
### Available exports
@@ -188,11 +188,9 @@ entry to declare `kind: "memory"`.
### Testing runtime config access
Prefer the shared plugin runtime mock from `openclaw/plugin-sdk/plugin-test-runtime`.
Its `runtime.config.loadConfig()` and `runtime.config.writeConfigFile(...)`
mocks throw by default so tests catch new usage of deprecated compatibility
APIs. Override those mocks only when the test is explicitly covering legacy
compatibility behavior.
Prefer the shared plugin runtime mock from
`openclaw/plugin-sdk/plugin-test-runtime`. Its runtime config helpers model the
current snapshot and mutation APIs.
### Unit testing a channel plugin
@@ -340,11 +338,11 @@ pnpm test src/plugins/contracts/runtime-seams.contract.test.ts
`scripts/run-additional-boundary-checks.mjs` runs a set of `lint:plugins:*`
import-boundary checks in CI; each can also be run standalone locally:
| Command | Enforces |
| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports` | Bundled plugins cannot import the monolithic `openclaw/plugin-sdk` root barrel. |
| `pnpm run lint:plugins:no-extension-src-imports` | Production extension files cannot import the repo `src/**` tree directly (`../../src/...`). |
| `pnpm run lint:plugins:no-extension-test-core-imports` | Extension test files cannot import `plugin-sdk/test-utils` or other core-only test helpers. |
| Command | Enforces |
| -------------------------------------------------------------- | -------------------------------------------------------------------------------------------- |
| `pnpm run lint:plugins:no-monolithic-plugin-sdk-entry-imports` | Bundled plugins cannot import the monolithic `openclaw/plugin-sdk` root barrel. |
| `pnpm run lint:plugins:no-extension-src-imports` | Production extension files cannot import the repo `src/**` tree directly (`../../src/...`). |
| `pnpm run lint:plugins:no-extension-test-core-imports` | Extension test files cannot import removed SDK test aliases or other core-only test helpers. |
External plugins are not subject to these lint rules, but following the same
patterns is recommended.
@@ -42,12 +42,12 @@ The lists below are generated from the source target registry and checked agains
- `talk.providers.*.apiKey`
- `talk.realtime.providers.*.apiKey`
- `messages.tts.providers.*.apiKey`
- `tools.web.fetch.firecrawl.apiKey`
- `plugins.entries.acpx.config.mcpServers.*.env.*`
- `plugins.entries.brave.config.webSearch.apiKey`
- `plugins.entries.codex.config.appServer.authToken`
- `plugins.entries.codex.config.appServer.headers.*`
- `plugins.entries.exa.config.webSearch.apiKey`
- `plugins.entries.firecrawl.config.webFetch.apiKey`
- `plugins.entries.google-meet.config.realtime.providers.*.apiKey`
- `plugins.entries.google.config.webSearch.apiKey`
- `plugins.entries.xai.config.webSearch.apiKey`
@@ -62,8 +62,6 @@ The lists below are generated from the source target registry and checked agains
- `plugins.entries.voice-call.config.tts.providers.*.apiKey`
- `plugins.entries.voice-call.config.twilio.authToken`
- `plugins.entries.webhooks.config.routes.*.secret`
- `tools.web.search.*.apiKey`
- `tools.web.search.apiKey`
- `gateway.auth.password`
- `gateway.auth.token`
- `gateway.remote.token`
@@ -137,7 +135,7 @@ Notes:
- OAuth policy guard: `auth.profiles.<id>.mode = "oauth"` cannot be combined with SecretRef inputs for that profile. Startup/reload and auth-profile resolution fail fast when this policy is violated.
- For SecretRef-managed model providers, generated `agents/*/agent/models.json` entries persist non-secret markers (not resolved secret values) for `apiKey`/header surfaces. Marker persistence is source-authoritative: OpenClaw writes markers from the active source config snapshot (pre-resolution), not from resolved runtime secret values.
- Cold Gateway startup can isolate retryable resolution failures for mapped, non-Gateway owners. Current mapped classes include model providers and skills, media/TTS/cron providers, eligible auth profiles, per-agent memory, sandbox SSH, channel accounts, and manifest-declared plugin routes. Startup keeps each failed owner's explicit refs in the runtime snapshot, reports the owner through status and doctor, and rejects requests for that owner without trying lower-precedence credentials. Reload and config-write preflight use the same owner-aware policy: healthy owners refresh; an eligible failed owner stays stale only when its ref identities, provider definitions, and complete non-secret owner contract are unchanged; a new or changed failure becomes cold. Gateway ingress auth, structurally invalid refs or values, fail-closed owners, and currently unmapped owners remain strict.
- For web search: in explicit provider mode (`tools.web.search.provider` set), only the selected provider key is active. In auto mode (`tools.web.search.provider` unset), only the first provider key that resolves by precedence is active, and non-selected provider refs are treated as inactive until selected. Legacy `tools.web.search.*` provider paths still resolve during the compatibility window, but the canonical SecretRef surface is `plugins.entries.<plugin>.config.webSearch.*`.
- For web search: in explicit provider mode (`tools.web.search.provider` set), only the selected provider key is active. In auto mode (`tools.web.search.provider` unset), only the first provider key that resolves by precedence is active, and non-selected provider refs are treated as inactive until selected. Provider credentials use `plugins.entries.<plugin>.config.webSearch.*`.
- Slack `identity: "user"` uses `channels.slack.userToken` with `channels.slack.appToken` for Socket Mode or `channels.slack.signingSecret` for HTTP mode. The same pairing applies under `channels.slack.accounts.*`; no bot token is required for this identity.
## Unsupported credentials
@@ -603,6 +603,13 @@
"secretShape": "secret_input",
"optIn": true
},
{
"id": "plugins.entries.firecrawl.config.webFetch.apiKey",
"configFile": "openclaw.json",
"path": "plugins.entries.firecrawl.config.webFetch.apiKey",
"secretShape": "secret_input",
"optIn": true
},
{
"id": "plugins.entries.firecrawl.config.webSearch.apiKey",
"configFile": "openclaw.json",
@@ -721,27 +728,6 @@
"path": "talk.realtime.providers.*.apiKey",
"secretShape": "secret_input",
"optIn": true
},
{
"id": "tools.web.fetch.firecrawl.apiKey",
"configFile": "openclaw.json",
"path": "tools.web.fetch.firecrawl.apiKey",
"secretShape": "secret_input",
"optIn": true
},
{
"id": "tools.web.search.*.apiKey",
"configFile": "openclaw.json",
"path": "tools.web.search.*.apiKey",
"secretShape": "secret_input",
"optIn": true
},
{
"id": "tools.web.search.apiKey",
"configFile": "openclaw.json",
"path": "tools.web.search.apiKey",
"secretShape": "secret_input",
"optIn": true
}
]
}
+1 -1
View File
@@ -43,7 +43,7 @@ OpenClaw supports Brave Search API as a `web_search` provider.
}
```
Provider-specific Brave search settings live under `plugins.entries.brave.config.webSearch.*`; this is the canonical config path. A shared top-level `tools.web.search.apiKey` and a scoped `tools.web.search.brave.*` still load through a compatibility merge, but new config should use the plugin-scoped path above.
Provider-specific Brave search settings live under `plugins.entries.brave.config.webSearch.*`; this is the canonical config path.
`webSearch.mode` controls the Brave transport:
+2 -2
View File
@@ -63,8 +63,8 @@ also prompts for:
`tools.web.search.provider` is auto-detected from available API keys when omitted;
set it to `kimi` explicitly if multiple search credentials are configured.
Equivalent scoped form under `tools.web.search.kimi` (`apiKey`, `baseUrl`, `model`)
also works; both shapes merge into the same resolved config.
Configure Kimi-specific `apiKey`, `baseUrl`, and `model` values under
`plugins.entries.moonshot.config.webSearch`.
Defaults: `baseUrl` defaults to `https://api.moonshot.ai/v1` when omitted, `model`
defaults to `kimi-k2.6`.
+1 -1
View File
@@ -75,7 +75,7 @@ MiniMax Search uses these endpoints:
If `plugins.entries.minimax.config.webSearch.region` is unset, OpenClaw resolves
the region in this order:
1. `tools.web.search.minimax.region` / plugin-owned `webSearch.region`
1. Plugin-owned `webSearch.region`
2. `MINIMAX_API_HOST`
3. `models.providers.minimax.baseUrl`
4. `models.providers.minimax-portal.baseUrl`
+1 -2
View File
@@ -545,8 +545,7 @@ every provider. xAI credentials are always required.
`x_search` posts to `<baseUrl>/responses` when
`plugins.entries.xai.config.xSearch.baseUrl` is set. If that field is omitted,
it falls back to `plugins.entries.xai.config.webSearch.baseUrl`, then the
legacy `tools.web.search.grok.baseUrl`, and finally the public xAI endpoint
(`https://api.x.ai/v1`).
public xAI endpoint (`https://api.x.ai/v1`).
### x_search parameters
-3
View File
@@ -34,9 +34,6 @@
"contracts": {
"webSearchProviders": ["brave"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -92,8 +92,10 @@ function describeBraveRequestUrl(url: URL): {
function resolveBraveApiKey(searchConfig?: SearchConfigRecord): string | undefined {
return (
readConfiguredSecretString(searchConfig?.apiKey, "tools.web.search.apiKey") ??
readProviderEnvValue(["BRAVE_API_KEY"])
readConfiguredSecretString(
searchConfig?.apiKey,
"plugins.entries.brave.config.webSearch.apiKey",
) ?? readProviderEnvValue(["BRAVE_API_KEY"])
);
}
@@ -122,6 +122,34 @@ function createBodyOnlyErrorResponse(params: { body: string; status: number }):
} as Response;
}
function createBraveTool(
params: {
webSearch?: Record<string, unknown>;
searchConfig?: Record<string, unknown>;
config?: Record<string, unknown>;
} = {},
) {
const tool = createBraveWebSearchProvider().createTool({
config: {
...params.config,
plugins: {
entries: {
brave: {
config: {
webSearch: params.webSearch ?? {},
},
},
},
},
},
searchConfig: params.searchConfig ?? {},
} as never);
if (!tool) {
throw new Error("Expected tool definition");
}
return tool;
}
describe("brave web search provider", () => {
const priorFetch = global.fetch;
@@ -140,41 +168,9 @@ describe("brave web search provider", () => {
);
});
it("exposes legacy top-level apiKey as a Brave-owned compatibility fallback", () => {
const apiKey = { source: "env", provider: "default", id: "BRAVE_API_KEY" } as const;
const config = {
tools: {
web: {
search: {
apiKey,
},
},
},
};
expect(createBraveWebSearchProvider().getConfiguredCredentialValue?.(config)).toEqual(apiKey);
expect(createBraveWebSearchContractProvider().getConfiguredCredentialValue?.(config)).toEqual(
apiKey,
);
expect(createBraveWebSearchProvider().getConfiguredCredentialFallback?.(config)).toEqual({
path: "tools.web.search.apiKey",
value: apiKey,
});
expect(
createBraveWebSearchContractProvider().getConfiguredCredentialFallback?.(config),
).toEqual({
path: "tools.web.search.apiKey",
value: apiKey,
});
});
it("points missing-key users to fetch/browser alternatives", async () => {
vi.stubEnv("BRAVE_API_KEY", "");
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({ config: {}, searchConfig: {} });
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool();
const result = await tool.execute({ query: "OpenClaw docs" });
@@ -274,20 +270,13 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
const tool = createBraveTool({
webSearch: {
apiKey: "brave-test-key",
brave: {
baseUrl: "https://api.search.brave.com/proxy/",
mode: "web",
},
baseUrl: "https://api.search.brave.com/proxy/",
mode: "web",
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "latest ai news" });
@@ -299,20 +288,13 @@ describe("brave web search provider", () => {
it("uses configured Brave baseUrl for llm-context requests", async () => {
vi.stubEnv("BRAVE_API_KEY", "");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
const tool = createBraveTool({
webSearch: {
apiKey: "brave-test-key",
brave: {
baseUrl: "https://api.search.brave.com/proxy",
mode: "llm-context",
},
baseUrl: "https://api.search.brave.com/proxy",
mode: "llm-context",
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "latest ai news" });
@@ -327,17 +309,7 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "web" },
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool({ webSearch: { apiKey: "brave-test-key", mode: "web" } });
await expect(tool.execute({ query: "latest ai news" })).rejects.toThrow(
"Brave Search API error: malformed JSON response",
@@ -351,17 +323,9 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "brave-test-key", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await expect(tool.execute({ query: "latest ai news" })).rejects.toThrow(
"Brave LLM Context API error: malformed JSON response",
@@ -378,17 +342,7 @@ describe("brave web search provider", () => {
);
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "web" },
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool({ webSearch: { apiKey: "brave-test-key", mode: "web" } });
const error = await tool.execute({ query: "latest ai news" }).catch((value: unknown) => value);
expect(error).toBeInstanceOf(Error);
@@ -408,17 +362,9 @@ describe("brave web search provider", () => {
);
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "brave-test-key", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
const error = await tool.execute({ query: "latest ai news" }).catch((value: unknown) => value);
expect(error).toBeInstanceOf(Error);
@@ -435,30 +381,20 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const firstTool = provider.createTool({
config: {},
searchConfig: {
const firstTool = createBraveTool({
webSearch: {
apiKey: "brave-test-key",
brave: {
baseUrl: "https://api.search.brave.com/proxy-one",
mode: "web",
},
baseUrl: "https://api.search.brave.com/proxy-one",
mode: "web",
},
});
const secondTool = provider.createTool({
config: {},
searchConfig: {
const secondTool = createBraveTool({
webSearch: {
apiKey: "brave-test-key",
brave: {
baseUrl: "https://api.search.brave.com/proxy-two",
mode: "web",
},
baseUrl: "https://api.search.brave.com/proxy-two",
mode: "web",
},
});
if (!firstTool || !secondTool) {
throw new Error("Expected tool definitions");
}
await firstTool.execute({ query: "base url cache identity" });
await secondTool.execute({ query: "base url cache identity" });
@@ -523,17 +459,7 @@ describe("brave web search provider", () => {
it("returns validation errors for invalid date ranges", async () => {
vi.stubEnv("BRAVE_API_KEY", "");
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { apiKey: "BSA..." },
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool({ webSearch: { apiKey: "BSA..." } });
const result = await tool.execute({
query: "latest gpu news",
@@ -551,17 +477,9 @@ describe("brave web search provider", () => {
it("passes freshness to Brave llm-context endpoint", async () => {
vi.stubEnv("BRAVE_API_KEY", "test-key");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "BSA...", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "latest ai news", freshness: "week" });
@@ -577,17 +495,7 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "web" },
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool({ webSearch: { apiKey: "brave-test-key", mode: "web" } });
await tool.execute({ query: "latest ai news" });
@@ -600,17 +508,9 @@ describe("brave web search provider", () => {
it("sends Brave llm-context auth in the X-Subscription-Token header", async () => {
vi.stubEnv("BRAVE_API_KEY", "");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "brave-test-key", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "latest ai news" });
@@ -623,17 +523,9 @@ describe("brave web search provider", () => {
it("passes bounded date ranges to Brave llm-context endpoint", async () => {
vi.stubEnv("BRAVE_API_KEY", "test-key");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "BSA...", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({
query: "latest ai news",
@@ -649,17 +541,9 @@ describe("brave web search provider", () => {
it("uses today as the end date for Brave llm-context date_after-only ranges", async () => {
vi.stubEnv("BRAVE_API_KEY", "test-key");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "BSA...", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "latest ai news", date_after: "2025-01-01" });
@@ -672,17 +556,9 @@ describe("brave web search provider", () => {
it("rejects future Brave llm-context date_after-only ranges before fetch", async () => {
vi.stubEnv("BRAVE_API_KEY", "test-key");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "BSA...", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
const result = await tool.execute({
query: "latest ai news",
@@ -700,17 +576,9 @@ describe("brave web search provider", () => {
it("rejects Brave llm-context date_before-only ranges before fetch", async () => {
vi.stubEnv("BRAVE_API_KEY", "test-key");
const mockFetch = installBraveLlmContextFetch();
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { mode: "llm-context" },
},
const tool = createBraveTool({
webSearch: { apiKey: "BSA...", mode: "llm-context" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
const result = await tool.execute({
query: "latest ai news",
@@ -733,17 +601,7 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
config: {},
searchConfig: {
apiKey: "BSA...",
brave: { apiKey: "BSA..." },
},
});
if (!tool) {
throw new Error("Expected tool definition");
}
const tool = createBraveTool({ webSearch: { apiKey: "BSA..." } });
await tool.execute({
query: "latest Vietnam news",
@@ -771,17 +629,10 @@ describe("brave web search provider", () => {
});
global.fetch = mockFetch as typeof global.fetch;
const provider = createBraveWebSearchProvider();
const tool = provider.createTool({
const tool = createBraveTool({
config: { diagnostics: { flags: ["brave.http"] } },
searchConfig: {
apiKey: "brave-test-key",
brave: { mode: "web" },
},
webSearch: { apiKey: "brave-test-key", mode: "web" },
});
if (!tool) {
throw new Error("Expected tool definition");
}
await tool.execute({ query: "unique brave diagnostics query", count: 1 });
await tool.execute({ query: "unique brave diagnostics query", count: 1 });
+2 -22
View File
@@ -11,22 +11,6 @@ import { isRecord } from "openclaw/plugin-sdk/string-coerce-runtime";
/** Canonical config path for the Brave Search API key. */
const BRAVE_CREDENTIAL_PATH = "plugins.entries.brave.config.webSearch.apiKey";
/** Resolve legacy top-level Brave credentials from old web-search config. */
function resolveLegacyTopLevelBraveCredential(
config: unknown,
): { path: string; value: unknown } | undefined {
if (!isRecord(config)) {
return undefined;
}
const tools = isRecord(config.tools) ? config.tools : undefined;
const web = isRecord(tools?.web) ? tools.web : undefined;
const search = isRecord(web?.search) ? web.search : undefined;
if (!search || !("apiKey" in search)) {
return undefined;
}
return { path: "tools.web.search.apiKey", value: search.apiKey };
}
function resolveBraveWebSearchPluginConfig(config: unknown): Record<string, unknown> | undefined {
if (!isRecord(config)) {
return undefined;
@@ -38,12 +22,9 @@ function resolveBraveWebSearchPluginConfig(config: unknown): Record<string, unkn
return isRecord(pluginConfig?.webSearch) ? pluginConfig.webSearch : undefined;
}
/** Resolve Brave credentials from current plugin config or legacy fallback. */
/** Resolve Brave credentials from current plugin config. */
function resolveConfiguredBraveCredential(config: unknown): unknown {
return (
resolveBraveWebSearchPluginConfig(config)?.apiKey ??
resolveLegacyTopLevelBraveCredential(config)?.value
);
return resolveBraveWebSearchPluginConfig(config)?.apiKey;
}
/** Build the common Brave provider metadata without the runtime tool executor. */
@@ -66,6 +47,5 @@ export function buildBraveWebSearchProviderBase(): Omit<WebSearchProviderPlugin,
configuredCredential: { pluginId: "brave" },
}),
getConfiguredCredentialValue: resolveConfiguredBraveCredential,
getConfiguredCredentialFallback: resolveLegacyTopLevelBraveCredential,
};
}
@@ -4,9 +4,6 @@
"onStartup": false
},
"channels": ["clickclack"],
"channelEnvVars": {
"clickclack": ["CLICKCLACK_BOT_TOKEN"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+7
View File
@@ -31,6 +31,13 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "clickclack",
"configuredState": {
"env": {
"anyOf": [
"CLICKCLACK_BOT_TOKEN"
]
}
},
"label": "ClickClack",
"selectionLabel": "ClickClack",
"detailLabel": "ClickClack Bot",
@@ -181,9 +181,6 @@ export async function prepareCodexAttemptPrompt(context: CodexAttemptContext) {
messages: structuredClone(historyState.messages),
ctx: hookContext,
bootstrapContextRunKind: params.bootstrapContextRunKind,
...("beforeAgentStartResult" in params
? { beforeAgentStartResult: params.beforeAgentStartResult }
: {}),
});
const resolveShiftedPromptInputRange = (
prompt: string,
-19
View File
@@ -799,25 +799,6 @@ describe("runCopilotAttempt", () => {
);
});
it("reuses the precomputed legacy before_agent_start result", async () => {
const beforeAgentStart = vi.fn();
initializeGlobalHookRunner(
createMockPluginRegistry([{ hookName: "before_agent_start", handler: beforeAgentStart }]),
);
const sdk = makeFakeSdk();
await runCopilotAttempt(
makeParams({
beforeAgentStartResult: { prependContext: "Use the cached result." },
} as never),
{ pool: makeFakePool(sdk) },
);
expect(beforeAgentStart).not.toHaveBeenCalled();
const messageOptions = sdk.sessions[0]?.sendAndWait.mock.calls[0]?.[0] as { prompt?: string };
expect(messageOptions.prompt).toBe("Use the cached result.\n\nhello");
});
it("preserves native Copilot SDK hooks alongside generic lifecycle hooks", async () => {
const sdk = makeFakeSdk();
const onPreToolUse = vi.fn();
-3
View File
@@ -736,9 +736,6 @@ export async function runCopilotAttempt(
messages,
ctx: hookContext,
bootstrapContextRunKind: input.bootstrapContextRunKind,
...("beforeAgentStartResult" in input
? { beforeAgentStartResult: input.beforeAgentStartResult }
: {}),
});
const attemptInput =
promptBuild.prompt === input.prompt ? input : { ...input, prompt: promptBuild.prompt };
@@ -6,9 +6,6 @@
"enabledByDefault": true,
"providers": ["deepinfra"],
"providerCatalogEntry": "./provider-discovery.ts",
"providerAuthEnvVars": {
"deepinfra": ["DEEPINFRA_API_KEY"]
},
"providerEndpoints": [
{
"endpointClass": "deepinfra-native",
-5
View File
@@ -21,11 +21,6 @@
"discord-voice"
]
},
"channelEnvVars": {
"discord": [
"DISCORD_BOT_TOKEN"
]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+7 -7
View File
@@ -39,6 +39,13 @@
},
"channel": {
"id": "discord",
"configuredState": {
"env": {
"anyOf": [
"DISCORD_BOT_TOKEN"
]
}
},
"approvalFlags": ["native"],
"label": "Discord",
"selectionLabel": "Discord (Bot API)",
@@ -52,13 +59,6 @@
"commands": {
"nativeCommandsAutoEnabled": true,
"nativeSkillsAutoEnabled": true
},
"configuredState": {
"env": {
"allOf": [
"DISCORD_BOT_TOKEN"
]
}
}
},
"install": {
@@ -42,10 +42,7 @@ const resolveConfiguredBindingRouteMock = vi.hoisted(() =>
vi.fn<ResolveConfiguredBindingRoute>(() => createUnboundConfiguredRouteResult()),
);
const providerThinkingMocks = vi.hoisted(() => ({
resolveProviderBinaryThinking: vi.fn(),
resolveProviderDefaultThinkingLevel: vi.fn(),
resolveProviderThinkingProfile: vi.fn(),
resolveProviderXHighThinking: vi.fn(),
}));
const buildModelsProviderDataMock = vi.hoisted(() => vi.fn());
@@ -166,26 +163,11 @@ function installProviderThinkingRegistryForTest(): void {
label: "Discord Test Thinking",
aliases: ["anthropic", "openai"],
auth: [],
isBinaryThinking: (context) =>
providerThinkingMocks.resolveProviderBinaryThinking({
provider: context.provider,
context,
}),
supportsXHighThinking: (context) =>
providerThinkingMocks.resolveProviderXHighThinking({
provider: context.provider,
context,
}),
resolveThinkingProfile: (context) =>
providerThinkingMocks.resolveProviderThinkingProfile({
provider: context.provider,
context,
}),
resolveDefaultThinkingLevel: (context) =>
providerThinkingMocks.resolveProviderDefaultThinkingLevel({
provider: context.provider,
context,
}),
},
});
setActivePluginRegistry(registry);
@@ -204,13 +186,19 @@ async function loadDiscordThinkAutocompleteModulesForTest() {
describe("discord native /think autocomplete", () => {
beforeAll(async () => {
providerThinkingMocks.resolveProviderBinaryThinking.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderDefaultThinkingLevel.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderThinkingProfile.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderXHighThinking.mockImplementation(({ provider, context }) =>
provider === "openai" && ["gpt-5.4", "gpt-5.4-pro"].includes(context.modelId)
? true
: undefined,
providerThinkingMocks.resolveProviderThinkingProfile.mockImplementation(
({ provider, context }) =>
provider === "openai" && ["gpt-5.4", "gpt-5.4-pro"].includes(context.modelId)
? {
levels: [
{ id: "off" },
{ id: "low" },
{ id: "medium" },
{ id: "high" },
{ id: "xhigh" },
],
}
: undefined,
);
buildModelsProviderDataMock.mockResolvedValue({
byProvider: new Map<string, Set<string>>(),
@@ -235,17 +223,20 @@ describe("discord native /think autocomplete", () => {
ensureConfiguredBindingRouteReadyMock.mockResolvedValue({ ok: true });
resolveConfiguredBindingRouteMock.mockReset();
resolveConfiguredBindingRouteMock.mockReturnValue(createUnboundConfiguredRouteResult());
providerThinkingMocks.resolveProviderBinaryThinking.mockReset();
providerThinkingMocks.resolveProviderBinaryThinking.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderDefaultThinkingLevel.mockReset();
providerThinkingMocks.resolveProviderDefaultThinkingLevel.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderThinkingProfile.mockReset();
providerThinkingMocks.resolveProviderThinkingProfile.mockReturnValue(undefined);
providerThinkingMocks.resolveProviderXHighThinking.mockReset();
providerThinkingMocks.resolveProviderXHighThinking.mockImplementation(({ provider, context }) =>
provider === "openai" && ["gpt-5.4", "gpt-5.4-pro"].includes(context.modelId)
? true
: undefined,
providerThinkingMocks.resolveProviderThinkingProfile.mockImplementation(
({ provider, context }) =>
provider === "openai" && ["gpt-5.4", "gpt-5.4-pro"].includes(context.modelId)
? {
levels: [
{ id: "off" },
{ id: "low" },
{ id: "medium" },
{ id: "high" },
{ id: "xhigh" },
],
}
: undefined,
);
installProviderThinkingRegistryForTest();
await saveSessionOverride({
-3
View File
@@ -26,9 +26,6 @@
"contracts": {
"webSearchProviders": ["exa"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -112,7 +112,7 @@ function resolveExaConfig(searchConfig?: SearchConfigRecord): ExaConfig {
function resolveExaApiKey(exa?: ExaConfig): string | undefined {
return (
readConfiguredSecretString(exa?.apiKey, "tools.web.search.exa.apiKey") ??
readConfiguredSecretString(exa?.apiKey, "plugins.entries.exa.config.webSearch.apiKey") ??
readProviderEnvValue(["EXA_API_KEY"])
);
}
@@ -438,7 +438,7 @@ function missingExaKeyPayload() {
return {
error: "missing_exa_api_key",
message:
"web_search (exa) needs an Exa API key. Set EXA_API_KEY in the Gateway environment, or configure tools.web.search.exa.apiKey.",
"web_search (exa) needs an Exa API key. Set EXA_API_KEY in the Gateway environment, or configure plugins.entries.exa.config.webSearch.apiKey.",
docs: "https://docs.openclaw.ai/tools/web",
};
}
-8
View File
@@ -110,14 +110,6 @@
]
}
},
"channelEnvVars": {
"feishu": [
"FEISHU_APP_ID",
"FEISHU_APP_SECRET",
"FEISHU_VERIFICATION_TOKEN",
"FEISHU_ENCRYPT_KEY"
]
},
"skills": ["./skills"],
"configSchema": {
"type": "object",
+10
View File
@@ -34,6 +34,16 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "feishu",
"configuredState": {
"env": {
"anyOf": [
"FEISHU_APP_ID",
"FEISHU_APP_SECRET",
"FEISHU_VERIFICATION_TOKEN",
"FEISHU_ENCRYPT_KEY"
]
}
},
"label": "Feishu",
"selectionLabel": "Feishu/Lark (飞书)",
"docsPath": "/channels/feishu",
@@ -38,9 +38,6 @@
"webSearchProviders": ["firecrawl", "firecrawl-free"],
"tools": ["firecrawl_search", "firecrawl_scrape"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+2 -55
View File
@@ -10,18 +10,6 @@ const DEFAULT_FIRECRAWL_SCRAPE_TIMEOUT_SECONDS = 60;
const DEFAULT_FIRECRAWL_MAX_AGE_MS = 172_800_000;
const FIRECRAWL_API_KEY_ENV_VAR = "FIRECRAWL_API_KEY";
type WebSearchConfig = NonNullable<OpenClawConfig["tools"]>["web"] extends infer Web
? Web extends { search?: infer Search }
? Search
: undefined
: undefined;
type WebFetchConfig = NonNullable<OpenClawConfig["tools"]>["web"] extends infer Web
? Web extends { fetch?: infer Fetch }
? Fetch
: undefined
: undefined;
type FirecrawlSearchConfig =
| {
apiKey?: unknown;
@@ -55,37 +43,13 @@ type FirecrawlFetchConfig =
}
| undefined;
function resolveSearchConfig(cfg?: OpenClawConfig): WebSearchConfig {
const search = cfg?.tools?.web?.search;
if (!search || typeof search !== "object") {
return undefined;
}
return search;
}
function resolveFetchConfig(cfg?: OpenClawConfig): WebFetchConfig {
const fetch = cfg?.tools?.web?.fetch;
if (!fetch || typeof fetch !== "object") {
return undefined;
}
return fetch;
}
function resolveFirecrawlSearchConfig(cfg?: OpenClawConfig): FirecrawlSearchConfig {
const pluginConfig = cfg?.plugins?.entries?.firecrawl?.config as PluginEntryConfig;
const pluginWebSearch = pluginConfig?.webSearch;
if (pluginWebSearch && typeof pluginWebSearch === "object" && !Array.isArray(pluginWebSearch)) {
return pluginWebSearch;
}
const search = resolveSearchConfig(cfg);
if (!search || typeof search !== "object") {
return undefined;
}
const firecrawl = "firecrawl" in search ? search.firecrawl : undefined;
if (!firecrawl || typeof firecrawl !== "object") {
return undefined;
}
return firecrawl as FirecrawlSearchConfig;
return undefined;
}
function resolveFirecrawlFetchConfig(cfg?: OpenClawConfig): FirecrawlFetchConfig {
@@ -94,15 +58,7 @@ function resolveFirecrawlFetchConfig(cfg?: OpenClawConfig): FirecrawlFetchConfig
if (pluginWebFetch && typeof pluginWebFetch === "object" && !Array.isArray(pluginWebFetch)) {
return pluginWebFetch;
}
const fetch = resolveFetchConfig(cfg);
if (!fetch || typeof fetch !== "object") {
return undefined;
}
const firecrawl = "firecrawl" in fetch ? fetch.firecrawl : undefined;
if (!firecrawl || typeof firecrawl !== "object") {
return undefined;
}
return firecrawl as FirecrawlFetchConfig;
return undefined;
}
type ConfiguredSecretResolution =
@@ -151,7 +107,6 @@ function resolveConfiguredSecret(
export function resolveFirecrawlApiKey(cfg?: OpenClawConfig): string | undefined {
const pluginConfig = cfg?.plugins?.entries?.firecrawl?.config as PluginEntryConfig;
const search = resolveFirecrawlSearchConfig(cfg);
const fetch = resolveFirecrawlFetchConfig(cfg);
const configuredCandidates: Array<{ value: unknown; path: string }> = [
{
value: pluginConfig?.webFetch?.apiKey,
@@ -161,14 +116,6 @@ export function resolveFirecrawlApiKey(cfg?: OpenClawConfig): string | undefined
value: search?.apiKey,
path: "plugins.entries.firecrawl.config.webSearch.apiKey",
},
{
value: search?.apiKey,
path: "tools.web.search.firecrawl.apiKey",
},
{
value: fetch?.apiKey,
path: "tools.web.fetch.firecrawl.apiKey",
},
];
let blockedConfiguredSecret = false;
for (const candidate of configuredCandidates) {
@@ -23,10 +23,7 @@ export const FIRECRAWL_WEB_FETCH_PROVIDER_SHARED = {
docsUrl: "https://docs.firecrawl.dev",
autoDetectOrder: 50,
credentialPath: "plugins.entries.firecrawl.config.webFetch.apiKey",
inactiveSecretPaths: [
"plugins.entries.firecrawl.config.webFetch.apiKey",
"tools.web.fetch.firecrawl.apiKey",
],
inactiveSecretPaths: ["plugins.entries.firecrawl.config.webFetch.apiKey"],
getCredentialValue: (fetchConfig) => {
if (!fetchConfig || typeof fetchConfig !== "object") {
return undefined;
-3
View File
@@ -756,9 +756,6 @@
"nativeDocumentInputs": ["pdf"]
}
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -172,7 +172,7 @@ function resolveGeminiTimeRangeFilter(
function resolveGeminiRuntimeApiKey(gemini?: GeminiConfig): string | undefined {
return (
readConfiguredSecretString(gemini?.apiKey, "tools.web.search.gemini.apiKey") ??
readConfiguredSecretString(gemini?.apiKey, "plugins.entries.google.config.webSearch.apiKey") ??
readProviderEnvValue(["GEMINI_API_KEY"]) ??
readConfiguredSecretString(gemini?.providerApiKey, "models.providers.google.apiKey")
);
@@ -7,9 +7,6 @@
"onStartup": false
},
"channels": ["googlechat"],
"channelEnvVars": {
"googlechat": ["GOOGLE_CHAT_SERVICE_ACCOUNT", "GOOGLE_CHAT_SERVICE_ACCOUNT_FILE"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+8
View File
@@ -30,6 +30,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "googlechat",
"configuredState": {
"env": {
"anyOf": [
"GOOGLE_CHAT_SERVICE_ACCOUNT",
"GOOGLE_CHAT_SERVICE_ACCOUNT_FILE"
]
}
},
"approvalFlags": ["native"],
"label": "Google Chat",
"selectionLabel": "Google Chat (Chat API)",
+1 -1
View File
@@ -77,7 +77,7 @@ export function createIMessagePluginBase(params: {
meta: {
...getChatChannelMeta(IMESSAGE_CHANNEL),
aliases: ["imsg"],
showConfigured: false,
exposure: { configured: false },
},
setupWizard: params.setupWizard,
capabilities: {
-14
View File
@@ -4,20 +4,6 @@
"onStartup": false
},
"channels": ["irc"],
"channelEnvVars": {
"irc": [
"IRC_HOST",
"IRC_PORT",
"IRC_TLS",
"IRC_NICK",
"IRC_USERNAME",
"IRC_REALNAME",
"IRC_PASSWORD",
"IRC_CHANNELS",
"IRC_NICKSERV_PASSWORD",
"IRC_NICKSERV_REGISTER_EMAIL"
]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+9 -9
View File
@@ -20,6 +20,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "irc",
"configuredState": {
"env": {
"allOf": [
"IRC_HOST",
"IRC_NICK"
]
}
},
"label": "IRC",
"selectionLabel": "IRC (Server + Nick)",
"detailLabel": "IRC",
@@ -29,15 +37,7 @@
"aliases": [
"internet-relay-chat"
],
"systemImage": "network",
"configuredState": {
"env": {
"allOf": [
"IRC_HOST",
"IRC_NICK"
]
}
}
"systemImage": "network"
},
"compat": {
"pluginApi": ">=2026.7.2"
-3
View File
@@ -7,9 +7,6 @@
"onStartup": false
},
"channels": ["line"],
"channelEnvVars": {
"line": ["LINE_CHANNEL_ACCESS_TOKEN", "LINE_CHANNEL_SECRET"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+8
View File
@@ -30,6 +30,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "line",
"configuredState": {
"env": {
"anyOf": [
"LINE_CHANNEL_ACCESS_TOKEN",
"LINE_CHANNEL_SECRET"
]
}
},
"label": "LINE",
"selectionLabel": "LINE (Messaging API)",
"detailLabel": "LINE Bot",
-14
View File
@@ -9,20 +9,6 @@
"onCommands": ["matrix"]
},
"channels": ["matrix"],
"channelEnvVars": {
"matrix": [
"MATRIX_HOMESERVER",
"MATRIX_USER_ID",
"MATRIX_ACCESS_TOKEN",
"MATRIX_PASSWORD",
"MATRIX_DEVICE_ID",
"MATRIX_DEVICE_NAME",
"MATRIX_OPS_HOMESERVER",
"MATRIX_OPS_ACCESS_TOKEN",
"MATRIX_OPS_DEVICE_ID",
"MATRIX_OPS_DEVICE_NAME"
]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+16
View File
@@ -39,6 +39,22 @@
},
"channel": {
"id": "matrix",
"configuredState": {
"env": {
"anyOf": [
"MATRIX_HOMESERVER",
"MATRIX_USER_ID",
"MATRIX_ACCESS_TOKEN",
"MATRIX_PASSWORD",
"MATRIX_DEVICE_ID",
"MATRIX_DEVICE_NAME",
"MATRIX_OPS_HOMESERVER",
"MATRIX_OPS_ACCESS_TOKEN",
"MATRIX_OPS_DEVICE_ID",
"MATRIX_OPS_DEVICE_NAME"
]
}
},
"approvalFlags": ["native"],
"label": "Matrix",
"selectionLabel": "Matrix (plugin)",
@@ -23,7 +23,7 @@ function normalizeLowercaseStringOrEmpty(value) {
function hasTrustedOpenClawRootIndicator(packageRoot, packageJson) {
const packageExports = packageJson?.exports ?? {};
if (!Object.hasOwn(packageExports, "./plugin-sdk")) {
if (!Object.hasOwn(packageExports, "./plugin-sdk/core")) {
return false;
}
const hasCliEntryExport = Object.hasOwn(packageExports, "./cli-entry");
@@ -40,7 +40,7 @@ function writeOpenClawPackageFixture(fixtureRoot: string) {
name: "openclaw",
type: "module",
exports: {
"./plugin-sdk": "./dist/plugin-sdk/index.js",
"./plugin-sdk/core": "./dist/plugin-sdk/core.js",
},
},
null,
@@ -48,7 +48,7 @@ function writeOpenClawPackageFixture(fixtureRoot: string) {
) + "\n",
);
writeFixtureFile(fixtureRoot, "openclaw.mjs", "export {};\n");
writeFixtureFile(fixtureRoot, "dist/plugin-sdk/index.js", "export {};\n");
writeFixtureFile(fixtureRoot, "dist/plugin-sdk/core.js", "export {};\n");
}
function writeSourceRuntimeWrapperFixture(
@@ -5,9 +5,6 @@
"onStartup": false
},
"channels": ["mattermost"],
"channelEnvVars": {
"mattermost": ["MATTERMOST_BOT_TOKEN", "MATTERMOST_URL"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+8
View File
@@ -30,6 +30,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "mattermost",
"configuredState": {
"env": {
"allOf": [
"MATTERMOST_BOT_TOKEN",
"MATTERMOST_URL"
]
}
},
"label": "Mattermost",
"selectionLabel": "Mattermost (plugin)",
"docsPath": "/channels/mattermost",
-5
View File
@@ -147,10 +147,6 @@ function expectHookRegistered(on: ReturnType<typeof vi.fn>, hookName: string) {
expect(hookHandler(on, hookName)).toBeTypeOf("function");
}
function expectHookNotRegistered(on: ReturnType<typeof vi.fn>, hookName: string) {
expect(on.mock.calls.map(([name]) => name)).not.toContain(hookName);
}
function expectToolExecute(tool: unknown, name?: string) {
const record = tool as { execute?: unknown; name?: unknown };
if (name) {
@@ -409,7 +405,6 @@ describe("memory plugin e2e", () => {
registerTestPlugin(memoryPlugin, mockApi);
expectHookRegistered(on, "before_prompt_build");
expectHookNotRegistered(on, "before_agent_start");
});
test("registers memory public artifact provider for memory-wiki bridge parity", async () => {
-3
View File
@@ -97,9 +97,6 @@
"webSearchProviders": ["minimax"],
"usageProviders": ["minimax"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"mediaUnderstandingProviderMetadata": {
"minimax": {
"capabilities": ["image"],
@@ -57,8 +57,10 @@ type MiniMaxSearchResponse = {
function resolveMiniMaxApiKey(searchConfig?: SearchConfigRecord): string | undefined {
return (
readConfiguredSecretString(searchConfig?.apiKey, "tools.web.search.apiKey") ??
readProviderEnvValue([...MINIMAX_TOKEN_PLAN_ENV_VARS, "MINIMAX_API_KEY"])
readConfiguredSecretString(
searchConfig?.apiKey,
"plugins.entries.minimax.config.webSearch.apiKey",
) ?? readProviderEnvValue([...MINIMAX_TOKEN_PLAN_ENV_VARS, "MINIMAX_API_KEY"])
);
}
-3
View File
@@ -207,9 +207,6 @@
}
}
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -98,7 +98,7 @@ function resolveKimiConfig(searchConfig?: SearchConfigRecord): KimiConfig {
function resolveKimiApiKey(kimi?: KimiConfig): string | undefined {
return (
readConfiguredSecretString(kimi?.apiKey, "tools.web.search.kimi.apiKey") ??
readConfiguredSecretString(kimi?.apiKey, "plugins.entries.moonshot.config.webSearch.apiKey") ??
readProviderEnvValue(["KIMI_API_KEY", "MOONSHOT_API_KEY"])
);
}
@@ -358,7 +358,7 @@ export async function executeKimiWebSearchProviderTool(
return {
error: "missing_kimi_api_key",
message:
"web_search (kimi) needs a Moonshot API key. Set KIMI_API_KEY or MOONSHOT_API_KEY in the Gateway environment, or configure tools.web.search.kimi.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
"web_search (kimi) needs a Moonshot API key. Set KIMI_API_KEY or MOONSHOT_API_KEY in the Gateway environment, or configure plugins.entries.moonshot.config.webSearch.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
docs: "https://docs.openclaw.ai/tools/web",
};
}
-3
View File
@@ -6,9 +6,6 @@
"onStartup": false
},
"channels": ["msteams"],
"channelEnvVars": {
"msteams": ["MSTEAMS_APP_ID", "MSTEAMS_APP_PASSWORD", "MSTEAMS_TENANT_ID"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+9
View File
@@ -36,6 +36,15 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "msteams",
"configuredState": {
"env": {
"anyOf": [
"MSTEAMS_APP_ID",
"MSTEAMS_APP_PASSWORD",
"MSTEAMS_TENANT_ID"
]
}
},
"label": "Microsoft Teams",
"selectionLabel": "Microsoft Teams (Teams SDK)",
"docsPath": "/channels/msteams",
@@ -7,9 +7,6 @@
"onStartup": false
},
"channels": ["nextcloud-talk"],
"channelEnvVars": {
"nextcloud-talk": ["NEXTCLOUD_TALK_BOT_SECRET", "NEXTCLOUD_TALK_API_PASSWORD"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+8
View File
@@ -26,6 +26,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "nextcloud-talk",
"configuredState": {
"env": {
"anyOf": [
"NEXTCLOUD_TALK_BOT_SECRET",
"NEXTCLOUD_TALK_API_PASSWORD"
]
}
},
"label": "Nextcloud Talk",
"selectionLabel": "Nextcloud Talk (self-hosted)",
"docsPath": "/channels/nextcloud-talk",
-3
View File
@@ -6,9 +6,6 @@
"onStartup": false
},
"channels": ["nostr"],
"channelEnvVars": {
"nostr": ["NOSTR_PRIVATE_KEY"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+7
View File
@@ -30,6 +30,13 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "nostr",
"configuredState": {
"env": {
"anyOf": [
"NOSTR_PRIVATE_KEY"
]
}
},
"label": "Nostr",
"selectionLabel": "Nostr (NIP-04 DMs)",
"docsPath": "/channels/nostr",
+1 -4
View File
@@ -5,10 +5,7 @@ import type {
ModelDefinitionConfig,
} from "openclaw/plugin-sdk/provider-model-shared";
/**
* Provider config input type partial config without required `models`.
* Replaces the deprecated `openclaw/plugin-sdk/config-types` import.
*/
/** Provider config input type — partial config without required `models`. */
type OllamaProviderConfigInput = Omit<Partial<ModelProviderConfig>, "models"> & {
models?: ModelDefinitionConfig[];
};
+1 -4
View File
@@ -4,10 +4,7 @@ import type {
ModelDefinitionConfig,
} from "openclaw/plugin-sdk/provider-model-shared";
/**
* Provider config input type partial config without required `models`.
* Replaces the deprecated `openclaw/plugin-sdk/config-types` import.
*/
/** Provider config input type — partial config without required `models`. */
type OllamaProviderConfigInput = Omit<Partial<ModelProviderConfig>, "models"> & {
models?: ModelDefinitionConfig[];
};
-6
View File
@@ -558,12 +558,6 @@ describe("openrouter provider hooks", () => {
modelId: "openrouter/deepseek/deepseek-v4-flash",
} as never)?.defaultLevel,
).toBe("high");
expect(
provider.supportsXHighThinking?.({
provider: "openrouter",
modelId: "openrouter/deepseek/deepseek-v4-pro",
} as never),
).toBe(true);
expect(
provider.resolveThinkingProfile?.({
provider: "openrouter",
+1 -5
View File
@@ -31,10 +31,7 @@ import {
import { resolveOpenRouterExtraParamsForTransport } from "./provider-routing.js";
import { buildOpenRouterSpeechProvider } from "./speech-provider.js";
import { wrapOpenRouterProviderStream } from "./stream.js";
import {
resolveOpenRouterThinkingProfile,
supportsOpenRouterXHighThinking,
} from "./thinking-policy.js";
import { resolveOpenRouterThinkingProfile } from "./thinking-policy.js";
import { fetchOpenRouterUsage } from "./usage.js";
import {
buildOpenRouterVideoGenerationProvider,
@@ -358,7 +355,6 @@ export default definePluginEntry({
...passthroughGeminiReplayHooks,
buildReplayPolicy: buildOpenRouterReplayPolicy,
resolveReasoningOutputMode: () => "native",
supportsXHighThinking: ({ modelId }) => supportsOpenRouterXHighThinking(modelId),
resolveThinkingProfile: ({ modelId }) => resolveOpenRouterThinkingProfile(modelId),
isModernModelRef: () => true,
resolveSystemPromptContribution: resolveOpenRouterFusionPromptContribution,
-4
View File
@@ -22,10 +22,6 @@ const OPENROUTER_DEEPSEEK_V4_THINKING_PROFILE = {
defaultLevel: "high",
} satisfies ProviderThinkingProfile;
export function supportsOpenRouterXHighThinking(modelId: string): boolean {
return isOpenRouterDeepSeekV4ModelId(modelId);
}
export function resolveOpenRouterThinkingProfile(
modelId: string,
): ProviderThinkingProfile | undefined {
-3
View File
@@ -26,9 +26,6 @@
"contracts": {
"webSearchProviders": ["parallel", "parallel-free"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -62,8 +62,10 @@ function resolveParallelConfig(searchConfig?: SearchConfigRecord): ParallelConfi
function resolveParallelApiKey(parallel?: ParallelConfig): string | undefined {
return (
readConfiguredSecretString(parallel?.apiKey, "tools.web.search.parallel.apiKey") ??
readProviderEnvValue(["PARALLEL_API_KEY"])
readConfiguredSecretString(
parallel?.apiKey,
"plugins.entries.parallel.config.webSearch.apiKey",
) ?? readProviderEnvValue(["PARALLEL_API_KEY"])
);
}
@@ -31,9 +31,6 @@
"contracts": {
"webSearchProviders": ["perplexity"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
@@ -81,7 +81,7 @@ function resolvePerplexityApiKey(perplexity?: PerplexityConfig): {
} {
const fromConfig = readConfiguredSecretString(
perplexity?.apiKey,
"tools.web.search.perplexity.apiKey",
"plugins.entries.perplexity.config.webSearch.apiKey",
);
if (fromConfig) {
return { apiKey: fromConfig, source: "config" };
@@ -318,7 +318,7 @@ export async function executePerplexitySearch(
return {
error: "missing_perplexity_api_key",
message:
"web_search (perplexity) needs an API key. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the Gateway environment, or configure tools.web.search.perplexity.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
"web_search (perplexity) needs an API key. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the Gateway environment, or configure plugins.entries.perplexity.config.webSearch.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
docs: "https://docs.openclaw.ai/tools/web",
};
}
@@ -36,7 +36,7 @@ describe("perplexity web search provider", () => {
await expect(tool.execute({ query: "OpenClaw docs" })).resolves.toEqual({
error: "missing_perplexity_api_key",
message:
"web_search (perplexity) needs an API key. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the Gateway environment, or configure tools.web.search.perplexity.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
"web_search (perplexity) needs an API key. Set PERPLEXITY_API_KEY or OPENROUTER_API_KEY in the Gateway environment, or configure plugins.entries.perplexity.config.webSearch.apiKey. If you do not want to configure a search API key, use web_fetch for a specific URL or the browser tool for interactive pages.",
docs: "https://docs.openclaw.ai/tools/web",
});
},
+8 -2
View File
@@ -6,8 +6,14 @@
"onStartup": false
},
"enabledByDefault": true,
"providerAuthEnvVars": {
"pixverse": ["PIXVERSE_API_KEY"]
"setup": {
"providers": [
{
"id": "pixverse",
"authMethods": ["api-key"],
"envVars": ["PIXVERSE_API_KEY"]
}
]
},
"providerAuthChoices": [
{
-3
View File
@@ -10,9 +10,6 @@
"contracts": {
"tools": ["qqbot_channel_api", "qqbot_remind"]
},
"channelEnvVars": {
"qqbot": ["QQBOT_APP_ID", "QQBOT_CLIENT_SECRET"]
},
"enabledByDefault": true,
"skills": ["./skills"],
"configSchema": {
+8
View File
@@ -37,6 +37,14 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "qqbot",
"configuredState": {
"env": {
"anyOf": [
"QQBOT_APP_ID",
"QQBOT_CLIENT_SECRET"
]
}
},
"approvalFlags": ["native"],
"label": "QQ Bot",
"selectionLabel": "QQ Bot (Official API)",
+1 -1
View File
@@ -22,5 +22,5 @@ export { getQQBotRuntime, setQQBotRuntime };
/** Type-narrowed getter for engine/ modules that need GatewayPluginRuntime. */
export function getQQBotRuntimeForEngine(): GatewayPluginRuntime {
return getQQBotRuntime() as GatewayPluginRuntime;
return getQQBotRuntime() as unknown as GatewayPluginRuntime;
}
-3
View File
@@ -34,9 +34,6 @@
}
}
},
"channelEnvVars": {
"raft": ["RAFT_PROFILE"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+7
View File
@@ -40,6 +40,13 @@
},
"channel": {
"id": "raft",
"configuredState": {
"env": {
"anyOf": [
"RAFT_PROFILE"
]
}
},
"label": "Raft",
"selectionLabel": "Raft (CLI wake bridge)",
"docsPath": "/channels/raft",
-3
View File
@@ -17,9 +17,6 @@
}
}
},
"channelEnvVars": {
"slack": ["SLACK_BOT_TOKEN", "SLACK_APP_TOKEN", "SLACK_USER_TOKEN"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+9 -9
View File
@@ -35,6 +35,15 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "slack",
"configuredState": {
"env": {
"anyOf": [
"SLACK_BOT_TOKEN",
"SLACK_APP_TOKEN",
"SLACK_USER_TOKEN"
]
}
},
"approvalFlags": ["native"],
"label": "Slack",
"selectionLabel": "Slack (Socket Mode)",
@@ -47,15 +56,6 @@
"commands": {
"nativeCommandsAutoEnabled": false,
"nativeSkillsAutoEnabled": false
},
"configuredState": {
"env": {
"anyOf": [
"SLACK_APP_TOKEN",
"SLACK_BOT_TOKEN",
"SLACK_USER_TOKEN"
]
}
}
},
"install": {
-12
View File
@@ -6,18 +6,6 @@
"onStartup": false
},
"channels": ["sms"],
"channelEnvVars": {
"sms": [
"TWILIO_ACCOUNT_SID",
"TWILIO_AUTH_TOKEN",
"TWILIO_PHONE_NUMBER",
"TWILIO_SMS_FROM",
"TWILIO_MESSAGING_SERVICE_SID",
"SMS_PUBLIC_WEBHOOK_URL",
"SMS_WEBHOOK_PATH",
"SMS_ALLOWED_USERS"
]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+14
View File
@@ -19,6 +19,20 @@
],
"channel": {
"id": "sms",
"configuredState": {
"env": {
"anyOf": [
"TWILIO_ACCOUNT_SID",
"TWILIO_AUTH_TOKEN",
"TWILIO_PHONE_NUMBER",
"TWILIO_SMS_FROM",
"TWILIO_MESSAGING_SERVICE_SID",
"SMS_PUBLIC_WEBHOOK_URL",
"SMS_WEBHOOK_PATH",
"SMS_ALLOWED_USERS"
]
}
},
"label": "SMS",
"selectionLabel": "SMS (Twilio)",
"detailLabel": "Twilio SMS",
@@ -7,16 +7,6 @@
"onStartup": false
},
"channels": ["synology-chat"],
"channelEnvVars": {
"synology-chat": [
"SYNOLOGY_CHAT_TOKEN",
"SYNOLOGY_CHAT_INCOMING_URL",
"SYNOLOGY_NAS_HOST",
"SYNOLOGY_ALLOWED_USER_IDS",
"SYNOLOGY_RATE_LIMIT",
"OPENCLAW_BOT_NAME"
]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+12
View File
@@ -17,6 +17,18 @@
"setupEntry": "./setup-entry.ts",
"channel": {
"id": "synology-chat",
"configuredState": {
"env": {
"anyOf": [
"SYNOLOGY_CHAT_TOKEN",
"SYNOLOGY_CHAT_INCOMING_URL",
"SYNOLOGY_NAS_HOST",
"SYNOLOGY_ALLOWED_USER_IDS",
"SYNOLOGY_RATE_LIMIT",
"OPENCLAW_BOT_NAME"
]
}
},
"label": "Synology Chat",
"selectionLabel": "Synology Chat (Webhook)",
"docsPath": "/channels/synology-chat",
-3
View File
@@ -28,9 +28,6 @@
"webSearchProviders": ["tavily"],
"tools": ["tavily_search", "tavily_extract"]
},
"configContracts": {
"compatibilityRuntimePaths": ["tools.web.search.apiKey"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
-3
View File
@@ -5,9 +5,6 @@
"onStartup": false
},
"channels": ["telegram"],
"channelEnvVars": {
"telegram": ["TELEGRAM_BOT_TOKEN"]
},
"configSchema": {
"type": "object",
"additionalProperties": false,
+7 -7
View File
@@ -25,6 +25,13 @@
},
"channel": {
"id": "telegram",
"configuredState": {
"env": {
"anyOf": [
"TELEGRAM_BOT_TOKEN"
]
}
},
"approvalFlags": ["native"],
"label": "Telegram",
"selectionLabel": "Telegram (Bot API)",
@@ -42,13 +49,6 @@
"commands": {
"nativeCommandsAutoEnabled": true,
"nativeSkillsAutoEnabled": true
},
"configuredState": {
"env": {
"allOf": [
"TELEGRAM_BOT_TOKEN"
]
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More