diff --git a/.github/workflows/workflow-sanity.yml b/.github/workflows/workflow-sanity.yml index 1fa663d877a6..affef8ad7955 100644 --- a/.github/workflows/workflow-sanity.yml +++ b/.github/workflows/workflow-sanity.yml @@ -231,7 +231,7 @@ jobs: - name: Check config docs drift statefile run: pnpm config:docs:check - - name: Check plugin SDK API baseline drift + - name: Check plugin SDK API contract manifest run: pnpm plugin-sdk:api:check - name: Check SQLite sessions/transcripts schema baseline drift diff --git a/docs/.generated/README.md b/docs/.generated/README.md index c3294495f876..31493ab0df64 100644 --- a/docs/.generated/README.md +++ b/docs/.generated/README.md @@ -1,12 +1,12 @@ # Generated Docs Artifacts -SHA-256 hash files are the tracked drift-detection artifacts. Full baselines are -generated locally for inspection only. +SHA-256 files are tracked drift-detection artifacts. Full generated snapshots +remain local inspection artifacts. **Tracked (committed to git):** - `config-baseline.sha256` — hashes of config baseline JSON artifacts. -- `plugin-sdk-api-baseline.sha256` — hashes of Plugin SDK API baseline artifacts. +- `plugin-sdk-api-baseline.sha256` — one hash per Plugin SDK entrypoint. - `sqlite-session-transcript-schema-baseline.sha256` — hash of the sessions/transcripts SQLite schema baseline. **Local only (gitignored):** @@ -20,6 +20,12 @@ Do not edit any of these files by hand. - Regenerate config baseline: `pnpm config:docs:gen` - Validate config baseline: `pnpm config:docs:check` - Regenerate Plugin SDK API baseline: `pnpm plugin-sdk:api:gen` -- Validate Plugin SDK API baseline: `pnpm plugin-sdk:api:check` +- Validate Plugin SDK API contract manifest: `pnpm plugin-sdk:api:check` + +The Plugin SDK manifest hashes each entrypoint independently. PRs changing +separate public modules therefore update separate records instead of racing to +overwrite one whole-surface checksum. Concurrent changes to the same entrypoint +remain a real merge conflict and require regeneration against combined source. + - Regenerate SQLite sessions/transcripts schema baseline: `pnpm sqlite:sessions-schema:gen` - Validate SQLite sessions/transcripts schema baseline: `pnpm sqlite:sessions-schema:check` diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index 4b73746bb929..e8fe4947cde5 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,331 @@ -5e2ce14f9b24efbaa43886bc2f82226f6ca83ba1e02520dc8812da839fa20e2f plugin-sdk-api-baseline.json -62a3c8c10295440d956d257b4e8cb981b0ed37a16f9976b9417ac3227fed9242 plugin-sdk-api-baseline.jsonl +1ab1c0c13b0ee6dc1ef34bb8f7688107a3f3a36dbbf5c0de8aed1c4c002ce773 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 +1a89aff5b4fe0775a776e934a99df462589cf346542acd52fe7ea4a1279ce35d module/agent-harness-runtime +ec22d7a039fb58d0b8343ad149322960d3d8ca58b3f4c70f2fa8a099f8186d0c module/agent-harness-task-runtime +5f63bf587bf3547d59d0dc5d0dc2fee54745aa6edaab4aa3ae700dba03443edb module/agent-harness-tool-runtime +5168648cd946abad8a92822889f13ceacc87ed502314a66190d0b1eb8ebe76ea module/agent-media-payload +7e43370bef8d69479f958ee5f8c72d2c227b8d638e04857018439f7b34d4b116 module/agent-runtime +df9ef9807f5b7563885c2a77a621103a817f6c0690d2204ab10a1e42a049c060 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 +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 +ad60ccc4fe9084d47f0477e02d9296bacad32f26d7456e2a84be8d25a53a25c2 module/boolean-param +333a906d4ad9d3e89102ab7eb9059a7f9c7277328041223ee3b0713442f56a29 module/browser-config +1fcdba7e1d79400bf585f3e0278633c52d4b2d5d1ef8f9ecab5745bfef63c486 module/bundled-channel-config-schema +b6e53fb9c69840d71785325cd9a244809ffd6d3f0dd08ed0cccf816dd993f210 module/channel-actions +fcfd76dbfe818e8e8574a425f340fee935acf53d4484e961f54c3ec760fb15fe module/channel-activity-runtime +24c53c9cefacd8c1bec2aa91ba2b01e606f8b8477bc5cb2f99567225a4dcf67c module/channel-config-helpers +a82cc04b1cda7a647850a13c3de552ab638550c7042f887f32bb0ced7227d143 module/channel-config-primitives +929b3f55b60e3885e33644ed3e1757b82349e1beeeede02eda80f7bf7eea4631 module/channel-config-schema +d73888857348fc8ccc21d6e7113a6c2594a2c1b70dc80763987199a718d17a9e module/channel-config-schema-legacy +8740f7cc786a380043e41aaf710ac47931b3587c122bb152d5f0231f98fd5351 module/channel-config-writes +2dd98659d9600e755f09ef00dd91c36692b8562ed3700461937e94f6cd1e640a module/channel-contract +2a5b6694afc08c18248cacaa2af6bf4d448a646799684c7f7be825c4159fc7cb module/channel-core +fbf353eb38ae68d8ded3f2a60b432c7bb2c245d2ec7e7c9f53c6da19a0db0938 module/channel-entry-contract +264a002a036aa66f87008971130c0264b15e62b00a35f473149aa846e3bcddad module/channel-envelope +982f29a18e07228e3da82cae67d06ff38249592a29c2fd28f01f0d2016ff80d9 module/channel-feedback +59f68a7b5dd6014a73c2324635fedc47acb4b8346f532d7f50ed3dd95e3271d1 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 +62a966de72374a7112a644e966dc7c2583ed5f524b3c0171f779ec6bf693f21d module/channel-message +b153eacc1581f1a9ad866adf4b6e06347094af23511cd5b72e75bd0d07ab9c22 module/channel-message-runtime +349caf4f7c85c74ce61e58fc349c8162aa984a6ae533f6812e7ebd6fd7faec50 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 +54cdfc60ea96f55453fdccdb1241d8c988aeafe033b9e0cea0f3ecaa13d2e08a module/channel-secret-basic-runtime +c78711a2466fca83ae2e68725e61e3a1a4e7dd25abce74d30a943c1be364f704 module/channel-secret-runtime +96e38ca99edb7d39839a7675939d5b8c199f8625502cae15e66b4bc7885922a7 module/channel-secret-tts-runtime +3bb07813120d0d73248991cb4a753434eec0fb8a1ec247ec9f4bb00ef8d1b199 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 +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 +965428a4ea5cb85a6cdebbf2a976123c1f8056298b75134589d701dfd3adb29d module/compat +2cf2f7732af5491a14466fc984f833ddce2b0f6a20b1c82796c3ee856e2966ce module/concurrency-runtime +a821f9cc4e6f9339399d99e73f58c3b00baf139aa9d85c22d73c89d8be5702d2 module/config-contracts +20f3f8042de53e4eee61b64de9102c8c202b9299e6a29235647a4729f70145f2 module/config-mutation +316949815affe623ac63951a5db580527f02663576dffa084f02768f612c0c1c module/config-runtime +0468278d29417b56a187fdc8af8c7e29cd5363f90d0fc98352747bc2dccd68b1 module/config-schema +bfe6eec12f45bc2fda6df28699681b22dfd819a2261aabe8e0c789a20a017058 module/config-types +42d15153981cfe3adc1d5f91621434c56f07a9bd48c15ce34742f72dd040c142 module/context-visibility-runtime +03636897fb99cb73e4d8620c8a0e0d72b4d52fc32bf94f525af2aa88c489c6c2 module/conversation-binding-runtime +c1ea9510dfda047609a99d5d2cd1f1560f5d469a36e6b695766213d695c25b0f module/conversation-runtime +5dd9d423f43dc332073f5b37ef087425da046d639a518af7e0354ebaff561dd0 module/core +93b61bc7893ed37047c97c10360588c0acf5df72cf49c54678ce68ed8d07f65c module/cron-store-runtime +e6fc74e18435cd4639801d9bd1f224154d1cd9405cdb3ba91a24b67c0792e9d2 module/dangerous-name-runtime +4af19d59c2f18674e7d7f7dc1b358b644dc707e6bd601dc47168bd9e4a669940 module/dedupe-runtime +feb743a5f25297abc7bb47d22ef060e0ed54b0cff69ac50885681dfade970f8e module/delivery-queue-runtime +9f87be19881a070787f650740d84551cc5fe0ffc2b073330cf4c55eb8e31c991 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 +e324635b9484d58d1fc0ddf210a817ef0738b31bac58ad4762a8cd9cf1440981 module/discord +f41f9b34ab771c894293453bcdf072860c7cd509dd4e0172156634a816b8d727 module/document-extractor +3ac20ebba52de5a2f18807c0c8ade6e61f59e260a35fc1d077c9dedb9960dabd module/embedding-providers +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 +50c1d8bd7662eede9f74791f7f09cdeeb5337258229d12307c96efd3c6dcc59a 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 +d3102bd433eea32ca2a761030788fe18294aa34266f2fb2d01d74268cbf8fb54 module/inbound-reply-dispatch +2516e4aadbf9d40191b944a473bec6995f91e862998cc21aaf4c30fa4ede84fb module/infra-runtime +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 +15af70a301d18c36aef7dc3cd75350308f7a020738cc8fe1e118cfc90172729d 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 +927014fec9d2e9384c696db06138a2e0f6a9cb1e33b9ec4bb1a8dba84adf3520 module/meeting-runtime +f6e428d474a1c7c9354068d4fc8391b4231a9e99d15ee5ea5fdf4180a7b28159 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 +b3255578cdf355d224d840a57e4ee7e190e60c02cbed1bfff2a222c08c3df3a8 module/memory-core-host-events +fe87e7d794bbbdaed3c834b218a787e98c0e69b26b0fac582b0668b8effab9b4 module/memory-core-host-multimodal +746e155bb06b398749a6a1bfdc1b435b1ec1941dca3854554a912577731218dd module/memory-core-host-query +e2377479799d52d8f67dcccf8f499f28a63948b0c03fa6043fc67e476a22ec0d module/memory-core-host-runtime-cli +deb9953dbae4323348197f7aa90de855446d89db6abaac8434104464b16341f5 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 +0f911f63448af365031f92f0c90c3e852ad047e60a85ac42a41d3b90bc320cd4 module/memory-host-core +7d68cbdfa0d5fad1ab32ba3792787daf386bc4ff7975fd5e25117e92563a2897 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 +6666ce5b823e49a37ab486996674db4e47dec1505a5ec709de20837af34464a8 module/persistent-dedupe +987648ebe317cc4d6c0505a52d344b12ce9c3a8261a5bd969cee3423c0c53529 module/plugin-config-runtime +4f40506eda3a3a54156ec63e43c946cfc11197cf5ef7639c4c1ee9b549ea821d module/plugin-entry +b41a69c03c3a671a120963bebec65f379261220b72a4636242223d8bb15b830c module/plugin-runtime +109f2b3b0984552e620adfb33c2d5dea6f70b4b440677e77d4fd89679e286683 module/plugin-state-runtime +1a5be86c0c661469b3ba07bb1c3c0db4d893cbe3042040c298a412bfffc10b5b module/poll-runtime +c305e43d9cc43cd699759f36212527a1fc1f1c8d26cfa96425b0dae4a98e91b2 module/process-runtime +d1e5fc198e340e2cf547090454008a53533b61bb2709a49edbef79f5644a5505 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 +2b689b3714421f408a1d4eae36837bd557aa52744e7d323e6f72004f8efa0af0 module/provider-catalog-runtime +ee5184ab251bcbe49a4cb9c845eee31975733bce1dc2300854cff14e99cf6db7 module/provider-catalog-shared +ca5d408937bc0ff92021673320aeba6ae6fce705711b251f15797887b8f34d3a module/provider-entry +52085bfaa917f4fd262508a93af923e5e834901b5f0f017c93b02a0798073344 module/provider-env-vars +404840e551472a1debea4e7ff26c6df99e219bfcfdaf7491553eed0e843f77bf 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 +cdcc81cbd0aff7e341cd7edeec77b02b55d0d27af03278d13ef07487aa8eeae7 module/provider-stream-shared +4a30f74ae2706ec08d26ed37c86c3fb07ca03bba9ae3bff3a1e4375f8cfa0fbb 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 +99f8046623351bb03bf54f45691d437604ba27c4418d05b6c7d4da91f30a6179 module/question-gateway-runtime +5e6ac90d11f2f6ed764f5c53ef98110551ff4beaa0d5dcc343a3e7d97e41844d module/realtime-bootstrap-context +6f551c1da49e6652f4af775798f45d3f3d5949c884c2e1967fc6254d34e9867e module/realtime-transcription +5f63f3b22b2a88f05da90e99b0c474dd450b6ea3e5d4145cbf50517bff8466cf 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 +fcf103d18c1d64ffa9719f1d5a1ca349df3a6125d00c9d54a1b76c195ba8691b module/runtime-config-snapshot +0a3bf57216f33847fd556950a63c83ac71baa11a77a5b46a7f60739e482d51bf 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 +64bc581fc2792f3f8180fc51fa0a75f2d454a8c15c3370d32d4c355bf554d429 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 +2866ff45859edc6a299cd36eaaf0b9ef32181cc6f0370b7e71eb9deddea5989c module/session-catalog +f07839f5b8929a179857a0b4b89f8448864078cd5972dd53f9a30e50bf55408d module/session-key-runtime +f59099aa2d536246d4b1297f01bcea66796351a9259debdd45909afeb7a42d86 module/session-store-runtime +b1d0a76337122cb9dbb0c89fbb8bfacc1a88ce689270d3d684019c9a03ce669a module/session-transcript-hit +480e6b526b788bee458ef6e023a8bb53dd3b5a09c11278f8e3424629e43852f5 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 +91e261cfc2a847bb6adc7147027b2f7a83acd6207b51b225b4452742104312da module/speech +08d11b92b5947cf43636fa58c0b1505d1f656106d22653f6b0fd14020ca839f2 module/speech-core +ae469f32799380e6b045abaefefee6eb3f00d714ffbf36b6eeef5025dc529472 module/speech-settings +ba7bd1528069e8d1dc6a6fc3626aebb0cd8f8d3f7715dba0916d315ea3787b2a 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 +f2fffad58593eff358c47937ec90c34953be64ed0138010cf6c82c55b1fda3c7 module/system-event-runtime +65361dc9a23578787c1ccf98f7df99e443574614e7ce95889f9a295725e12fae module/talk-config-runtime +9efd666b8c2cc8a9abf816751fd9420f3c048d158e48570cae8b7a4cbc52a83f module/target-resolver-runtime +cb77f0dcdd4f360cbc5efbb657f57f8ed5840e66adc903a23385ba6d42ca0101 module/telegram-account +7729f9f201c08f114925da75ee86a5a8deb6677e5d1b5ee86bc60aacaa01f63b module/telegram-command-config +110944726884fca94f38c9c329b5950629438b9a719f4782c4beeade8bd67746 module/temp-path +a65f17db3d04c2ca1b34f9a4ebe8748952bbcb00318b741adbe3f227d2e2de20 module/text-autolink-runtime +e24c49c1c7b35e8b4403d45eb76bb0f33ec2f23f714bda322e1363251737d6cd module/text-chunking +948694f6da0f85fb2e9af0d66cd49b8ff0648b6dc96ed4165b03736a3e8f2439 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 +7626acd98e981a1fd00f1df3dd4ea6b1e21f4b18107d06efac7ee697c3538c99 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 +9f2739dfe035d9a053fcd678aa76be79980832495041b770c326ed973a979bee module/webhook-request-guards +8ea24940688b1bf82f0f46e3b9ead88afcd0bc39d2871722cd71a9b9311bd61a module/webhook-targets +1cc469eacda2818a116ab7b63847b9ddf86225e8d02e62fac48e618ba41a9852 module/widget-html +1a6449dbd48d2b9a60d5377a8c3b119df5f6aa2606ca5d61de1d04828125ac93 module/windows-spawn +76e3a7b6eb10921d5c18eeaa2eb22654b5412162eb85810109b333ba5b3e9d18 module/zalouser +9161b36ec0ab062ea41b363c894fcd672a7727f21cb726739f99f9c184fce69d module/zod diff --git a/docs/help/testing-updates-plugins.md b/docs/help/testing-updates-plugins.md index 20805696a7b3..9edeb5981b1e 100644 --- a/docs/help/testing-updates-plugins.md +++ b/docs/help/testing-updates-plugins.md @@ -57,7 +57,7 @@ pnpm release:check ``` `release:check` runs config/docs/API drift checks (config schema, config docs -baseline, plugin SDK API baseline and exports, plugin versions/inventory), +baseline, plugin SDK API contract manifest and exports, plugin versions/inventory), writes the package dist inventory, runs `npm pack --dry-run`, rejects forbidden packed files, installs the tarball into a temp prefix, runs postinstall, and smokes bundled channel entrypoints. diff --git a/docs/refactor/canvas.md b/docs/refactor/canvas.md index 084a65ec69cb..9abbb6483a4d 100644 --- a/docs/refactor/canvas.md +++ b/docs/refactor/canvas.md @@ -109,7 +109,7 @@ Before calling the refactor complete: - `rg "createCanvasHostHandler|handleA2uiHttpRequest" src/gateway` returns no gateway runtime ownership. - `rg "apps/shared/OpenClawKit/Tools/CanvasA2UI|canvas-a2ui-copy|extensions/canvas/src/host/a2ui" scripts .github package.json` finds only compatibility wrappers or plugin-owned paths. - `pnpm plugins:inventory:check` passes. -- `pnpm plugin-sdk:api:check` passes, or generated API baselines are intentionally updated and reviewed. +- `pnpm plugin-sdk:api:check` passes, or generated API contract records are intentionally updated and reviewed. - Targeted Canvas tests pass. - Changed-lanes tests pass for Canvas host/A2UI paths. - PR body explicitly says Canvas is experimental and plugin-backed. diff --git a/docs/reference/RELEASING.md b/docs/reference/RELEASING.md index 5b0113056c1a..e4a198b20294 100644 --- a/docs/reference/RELEASING.md +++ b/docs/reference/RELEASING.md @@ -212,7 +212,7 @@ A legacy fallback correction tag may reuse base-package evidence only when the c - Run `pnpm check:test-types` before release preflight so test TypeScript stays covered outside the faster local `pnpm check` gate. - Run `pnpm check:architecture` before release preflight so the broader import cycle and architecture boundary checks are green outside the faster local gate. - Run `pnpm build && pnpm ui:build` before `pnpm release:check` so the expected `dist/*` release artifacts and Control UI bundle exist for the pack validation step. -- Run `pnpm release:prep` after the root version bump and before tagging. It runs every deterministic release generator that commonly drifts after a version/config/API change: plugin versions, npm shrinkwraps, plugin inventory, base config schema, bundled channel config metadata, config docs baseline, plugin SDK exports, plugin SDK API baseline, and Control UI locale bundles. `pnpm release:check` re-runs those guards in check mode (including the strict zero-fallback locale gate plus the plugin SDK surface budget) and reports every generated drift failure in one pass before running package release checks. +- Run `pnpm release:prep` after the root version bump and before tagging. It runs every deterministic release generator that commonly drifts after a version/config/API change: plugin versions, npm shrinkwraps, plugin inventory, base config schema, bundled channel config metadata, config docs baseline, plugin SDK exports, the Plugin SDK API contract manifest, and Control UI locale bundles. `pnpm release:check` re-runs those guards in check mode (including the strict zero-fallback locale gate plus the plugin SDK surface budget) and reports every generated drift failure in one pass before running package release checks. - Plugin version sync updates the publishable `@openclaw/ai` runtime package, official plugin package versions, and existing `openclaw.compat.pluginApi` floors to the OpenClaw release version by default. Treat that field as the plugin SDK/runtime API floor, not just a copy of the package version: for plugin-only releases that intentionally remain compatible with older OpenClaw hosts, keep the floor at the oldest supported host API and document that choice in the plugin release proof. - Run the manual `Full Release Validation` workflow before release approval to kick off all pre-release test boxes from one entrypoint. It accepts a branch, tag, or full commit SHA, dispatches manual `CI`, and dispatches `OpenClaw Release Checks` for install smoke, package acceptance, cross-OS package checks, QA Lab parity, Matrix, and Telegram lanes. Stable and full runs always include exhaustive live/E2E and Docker release-path soak; `run_release_soak=true` is retained for an explicit beta soak. Package Acceptance provides the canonical package Telegram E2E during candidate validation, avoiding a second concurrent live poller. diff --git a/scripts/check-changed.mjs b/scripts/check-changed.mjs index c084624f8560..a62e21590431 100644 --- a/scripts/check-changed.mjs +++ b/scripts/check-changed.mjs @@ -465,7 +465,7 @@ export function createChangedCheckPlan(result, options = {}) { add("SQLite sessions/transcripts schema baseline", ["sqlite:sessions-schema:check"]); } if (shouldRunPluginSdkApiBaselineCheck(result.paths)) { - add("Plugin SDK API baseline", ["plugin-sdk:api:check"]); + add("Plugin SDK API contract manifest", ["plugin-sdk:api:check"]); } if (!result.lanes.releaseMetadata && shouldRunPluginSdkSurfaceChecks(result.paths)) { add("Plugin SDK package exports", ["plugin-sdk:check-exports"]); diff --git a/scripts/generate-plugin-sdk-api-baseline.ts b/scripts/generate-plugin-sdk-api-baseline.ts index 93d6b6819fa0..62f846dcea6f 100644 --- a/scripts/generate-plugin-sdk-api-baseline.ts +++ b/scripts/generate-plugin-sdk-api-baseline.ts @@ -1,7 +1,7 @@ #!/usr/bin/env node // Generate Plugin Sdk Api Baseline script supports OpenClaw repository automation. import path from "node:path"; -import { writePluginSdkApiBaselineStatefile } from "../src/plugin-sdk/api-baseline.ts"; +import { writePluginSdkApiBaselineArtifacts } from "../src/plugin-sdk/api-baseline.ts"; const args = new Set(process.argv.slice(2)); const checkOnly = args.has("--check"); @@ -15,19 +15,15 @@ if (checkOnly === writeMode) { const repoRoot = process.cwd(); async function main(): Promise { - const result = await writePluginSdkApiBaselineStatefile({ - repoRoot, - check: checkOnly, - }); - + const result = await writePluginSdkApiBaselineArtifacts({ repoRoot, check: checkOnly }); if (checkOnly) { if (result.changed) { console.error( [ - "Plugin SDK API baseline drift detected.", - `Hash mismatch: ${path.relative(repoRoot, result.hashPath)}`, - "If this Plugin SDK surface change is intentional, run `pnpm plugin-sdk:api:gen` and commit the updated hash file.", - "If not intentional, treat this as API drift and fix the plugin-sdk exports or metadata first.", + "Plugin SDK API contract drift detected.", + `Manifest mismatch: ${path.relative(repoRoot, result.hashPath)}`, + "If this Plugin SDK surface change is intentional, run `pnpm plugin-sdk:api:gen` and commit the updated manifest.", + "If not intentional, fix the plugin-sdk exports or metadata first.", ].join("\n"), ); process.exit(1); diff --git a/scripts/release-preflight.mjs b/scripts/release-preflight.mjs index f6d804605f42..de42b05cccf6 100644 --- a/scripts/release-preflight.mjs +++ b/scripts/release-preflight.mjs @@ -72,7 +72,7 @@ const releaseTasks = [ }, { id: "plugin-sdk-api", - name: "plugin SDK API baseline", + name: "plugin SDK API contract manifest", scopes: ["plugin-sdk"], fix: pnpmCommand("plugin-sdk:api:gen"), fixAfter: ["plugin-sdk-exports"], diff --git a/src/plugin-sdk/api-baseline.test.ts b/src/plugin-sdk/api-baseline.test.ts index cc59721f4372..95e68d5bea32 100644 --- a/src/plugin-sdk/api-baseline.test.ts +++ b/src/plugin-sdk/api-baseline.test.ts @@ -5,10 +5,12 @@ import path from "node:path"; import { describe, expect, it } from "vitest"; import { publicPluginSdkEntrypoints } from "../../scripts/lib/plugin-sdk-entries.mjs"; import { + computePluginSdkApiBaselineHashFileContent, listPluginSdkApiBaselineEntrypoints, normalizePluginSdkApiDeclarationText, normalizePluginSdkApiSourcePath, renderPluginSdkApiBaseline, + type PluginSdkApiBaselineRender, } from "./api-baseline.js"; describe("Plugin SDK API baseline", () => { @@ -118,4 +120,43 @@ describe("Plugin SDK API baseline", () => { expect(rendered.json).not.toContain('"line":'); expect(rendered.jsonl).not.toContain('"sourceLine":'); }); + + it("renders snapshots independently of entrypoint discovery order", async () => { + const entrypoints = ["core", "provider-auth", "channel-policy"]; + const forward = await renderPluginSdkApiBaseline({ entrypoints }); + const reverse = await renderPluginSdkApiBaseline({ entrypoints: entrypoints.toReversed() }); + + expect(reverse.json).toBe(forward.json); + expect(reverse.jsonl).toBe(forward.jsonl); + }); + + it("hashes entrypoints independently so unrelated API changes merge", () => { + const moduleSurface = (entrypoint: string, declaration: string) => ({ + category: null, + entrypoint, + exports: [ + { + declaration, + exportName: `${entrypoint}Export`, + kind: "function" as const, + source: { path: `src/plugin-sdk/${entrypoint}.ts` }, + }, + ], + importSpecifier: `openclaw/plugin-sdk/${entrypoint}`, + source: { path: `src/plugin-sdk/${entrypoint}.ts` }, + }); + const render = (declaration: string): PluginSdkApiBaselineRender => ({ + baseline: { + generatedBy: "scripts/generate-plugin-sdk-api-baseline.ts", + modules: [moduleSurface("alpha", declaration), moduleSurface("beta", "stable")], + }, + json: "", + jsonl: "", + }); + const before = computePluginSdkApiBaselineHashFileContent(render("before")).split("\n"); + const after = computePluginSdkApiBaselineHashFileContent(render("after")).split("\n"); + + expect(after[0]).not.toBe(before[0]); + expect(after[1]).toBe(before[1]); + }); }); diff --git a/src/plugin-sdk/api-baseline.ts b/src/plugin-sdk/api-baseline.ts index 87f60dd896bf..c127446ebd35 100644 --- a/src/plugin-sdk/api-baseline.ts +++ b/src/plugin-sdk/api-baseline.ts @@ -75,15 +75,15 @@ export type PluginSdkApiBaselineRender = { /** Result returned when writing SDK API baseline artifacts. */ export type PluginSdkApiBaselineWriteResult = { - /** True when any generated artifact content differs from disk. */ + /** True when the generated contract manifest differs from disk. */ changed: boolean; - /** True when changed artifacts were actually written. */ + /** True when generated artifacts were actually written. */ wrote: boolean; /** JSON baseline artifact path. */ jsonPath: string; /** JSONL statefile artifact path. */ statefilePath: string; - /** SHA-256 hash artifact path. */ + /** Per-record SHA-256 contract manifest path. */ hashPath: string; }; @@ -722,15 +722,16 @@ function sha256(content: string): string { return createHash("sha256").update(content, "utf8").digest("hex"); } -/** Build the sha256 hash file content for plugin SDK API baseline artifacts. */ +/** Build a mergeable per-entrypoint sha256 manifest for the Plugin SDK API contract. */ export function computePluginSdkApiBaselineHashFileContent( rendered: PluginSdkApiBaselineRender, ): string { - const lines = [ - `${sha256(rendered.json)} plugin-sdk-api-baseline.json`, - `${sha256(rendered.jsonl)} plugin-sdk-api-baseline.jsonl`, - ]; - return `${lines.join("\n")}\n`; + return `${rendered.baseline.modules + .map((moduleSurface) => { + const label = `module/${encodeURIComponent(moduleSurface.entrypoint)}`; + return `${sha256(JSON.stringify(moduleSurface))} ${label}`; + }) + .join("\n")}\n`; } function validateMetadata(): void { @@ -745,8 +746,8 @@ function validateMetadata(): void { } } -/** Write or check SDK API baseline artifacts used by docs and contract tests. */ -export async function writePluginSdkApiBaselineStatefile(params?: { +/** Write or check SDK API contract artifacts used by CI and release checks. */ +export async function writePluginSdkApiBaselineArtifacts(params?: { repoRoot?: string; check?: boolean; jsonPath?: string; @@ -758,7 +759,6 @@ export async function writePluginSdkApiBaselineStatefile(params?: { const statefilePath = path.resolve(repoRoot, params?.statefilePath ?? DEFAULT_STATEFILE_OUTPUT); const hashPath = path.resolve(repoRoot, params?.hashPath ?? DEFAULT_HASH_OUTPUT); const rendered = await renderPluginSdkApiBaseline({ repoRoot }); - const nextHashContent = computePluginSdkApiBaselineHashFileContent(rendered); const currentHashContent = await loadCurrentFile(hashPath); const changed = currentHashContent !== nextHashContent; @@ -773,11 +773,8 @@ export async function writePluginSdkApiBaselineStatefile(params?: { }; } - // Write the hash file (tracked in git) await fs.mkdir(path.dirname(hashPath), { recursive: true }); await fs.writeFile(hashPath, nextHashContent, "utf8"); - - // Write full JSON/JSONL artifacts locally (gitignored, useful for inspection) await fs.mkdir(path.dirname(jsonPath), { recursive: true }); await fs.writeFile(jsonPath, rendered.json, "utf8"); await fs.writeFile(statefilePath, rendered.jsonl, "utf8"); diff --git a/test/scripts/changed-lanes.test.ts b/test/scripts/changed-lanes.test.ts index 1b975a746623..375585ffe187 100644 --- a/test/scripts/changed-lanes.test.ts +++ b/test/scripts/changed-lanes.test.ts @@ -1885,7 +1885,7 @@ describe("scripts/changed-lanes", () => { const plan = createChangedCheckPlan(result); expect(plan.commands).toContainEqual({ - name: "Plugin SDK API baseline", + name: "Plugin SDK API contract manifest", args: ["plugin-sdk:api:check"], }); expect(plan.commands.map((command) => command.args[0])).not.toContain( @@ -1911,7 +1911,7 @@ describe("scripts/changed-lanes", () => { const plan = createChangedCheckPlan(result); expect(plan.commands).toContainEqual({ - name: "Plugin SDK API baseline", + name: "Plugin SDK API contract manifest", args: ["plugin-sdk:api:check"], }); expect(plan.commands).toContainEqual({ diff --git a/test/scripts/ci-workflow-guards.test.ts b/test/scripts/ci-workflow-guards.test.ts index e3103fbb35d8..9192a65ed4f0 100644 --- a/test/scripts/ci-workflow-guards.test.ts +++ b/test/scripts/ci-workflow-guards.test.ts @@ -2893,10 +2893,10 @@ describe("ci workflow guards", () => { const steps = workflow.jobs["generated-doc-baselines"].steps; const stepNames = steps.map((step: WorkflowStep) => step.name); - expect(stepNames).toContain("Check plugin SDK API baseline drift"); + expect(stepNames).toContain("Check plugin SDK API contract manifest"); expect(stepNames).toContain("Check SQLite sessions/transcripts schema baseline drift"); expect(stepNames).toContain("Check plugin SDK surface budget"); - expect(stepNames.indexOf("Check plugin SDK API baseline drift")).toBeLessThan( + expect(stepNames.indexOf("Check plugin SDK API contract manifest")).toBeLessThan( stepNames.indexOf("Check SQLite sessions/transcripts schema baseline drift"), ); expect(