From d17b970bb50d8835ee3e8d23e43aec91a08da4e0 Mon Sep 17 00:00:00 2001 From: xydt-tanshanshan <0668000363@xydigit.com> Date: Sun, 28 Jun 2026 17:06:10 +0800 Subject: [PATCH] =?UTF-8?q?[AI]=20fix(plugins):=20recognize=20document-ext?= =?UTF-8?q?ractors=20as=20a=20capability=20kind=E2=80=A6=20(#91597)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [AI] fix(plugins): recognize document-extractors as a capability kind in inspect-shape PluginCapabilityKind did not include "document-extractors", causing plugins that declare contracts.documentExtractors (like document-extract) to show capabilityCount=0 and shape="non-capability" in plugins inspect. Add "document-extractors" to PluginCapabilityKind and read from plugin.contracts.documentExtractors in buildPluginCapabilityEntries(). Related to #91539 * [AI] test(plugins): add document-extractors shape contract coverage Add a test case verifying that plugins declaring contracts.documentExtractors are classified as plain-capability shape with capabilityCount=1 and capabilities including the document-extractors kind. Addresses ClawSweeper P2 review finding on PR #91597. * [AI] chore: rebase on main to refresh CI * test(plugins): fold extractor into shape matrix --------- Co-authored-by: Peter Steinberger --- src/plugins/contracts/shape.contract.test.ts | 22 +++++++++++++++++++- src/plugins/inspect-shape.ts | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/plugins/contracts/shape.contract.test.ts b/src/plugins/contracts/shape.contract.test.ts index 92c54234a61..ee7dce2482c 100644 --- a/src/plugins/contracts/shape.contract.test.ts +++ b/src/plugins/contracts/shape.contract.test.ts @@ -95,6 +95,15 @@ describe("plugin shape compatibility matrix", () => { }, }); + registerVirtualTestPlugin({ + registry, + config, + id: "document-extract-test", + name: "Document Extract Test", + contracts: { documentExtractors: ["pdf"] }, + register() {}, + }); + const report = { workspaceDir: "/virtual-workspace", ...registry.registry, @@ -130,11 +139,22 @@ describe("plugin shape compatibility matrix", () => { shape: "plain-capability", capabilityMode: "plain", }, + { + id: "document-extract-test", + shape: "plain-capability", + capabilityMode: "plain", + }, ]); expect(inspect[0]?.usesLegacyBeforeAgentStart).toBe(true); expect(inspect.map((entry) => entry.capabilities.map((capability) => capability.kind))).toEqual( - [[], ["text-inference"], ["text-inference", "web-search"], ["channel"]], + [ + [], + ["text-inference"], + ["text-inference", "web-search"], + ["channel"], + ["document-extractors"], + ], ); }); }); diff --git a/src/plugins/inspect-shape.ts b/src/plugins/inspect-shape.ts index 17b8f44dac7..6c355b16aa6 100644 --- a/src/plugins/inspect-shape.ts +++ b/src/plugins/inspect-shape.ts @@ -11,6 +11,7 @@ export type PluginCapabilityKind = | "realtime-voice" | "media-understanding" | "transcript-source" + | "document-extractors" | "image-generation" | "video-generation" | "music-generation" @@ -50,6 +51,7 @@ function buildPluginCapabilityEntries( { kind: "realtime-voice" as const, ids: plugin.realtimeVoiceProviderIds }, { kind: "media-understanding" as const, ids: plugin.mediaUnderstandingProviderIds }, { kind: "transcript-source" as const, ids: plugin.transcriptSourceProviderIds }, + { kind: "document-extractors" as const, ids: plugin.contracts?.documentExtractors ?? [] }, { kind: "image-generation" as const, ids: plugin.imageGenerationProviderIds }, { kind: "video-generation" as const, ids: plugin.videoGenerationProviderIds }, { kind: "music-generation" as const, ids: plugin.musicGenerationProviderIds },