diff --git a/packages/plugin-sdk/tsconfig.json b/packages/plugin-sdk/tsconfig.json index 38d5997dbfc..396b68022a5 100644 --- a/packages/plugin-sdk/tsconfig.json +++ b/packages/plugin-sdk/tsconfig.json @@ -27,6 +27,7 @@ "../../src/plugin-sdk/provider-onboard.ts", "../../src/plugin-sdk/provider-stream-shared.ts", "../../src/plugin-sdk/provider-tools.ts", + "../../src/plugin-sdk/provider-web-search-contract.ts", "../../src/plugin-sdk/provider-web-search.ts", "../../src/plugin-sdk/runtime-doctor.ts", "../../src/plugin-sdk/runtime-env.ts", diff --git a/src/config/schema.base.generated.ts b/src/config/schema.base.generated.ts index 90c06e2c8a2..a36c6698dbd 100644 --- a/src/config/schema.base.generated.ts +++ b/src/config/schema.base.generated.ts @@ -3175,6 +3175,9 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = { description: "Optional repository root shown in the system prompt runtime line (overrides auto-detect).", }, + systemPromptOverride: { + type: "string", + }, skipBootstrap: { type: "boolean", }, @@ -5376,6 +5379,9 @@ export const GENERATED_BASE_CONFIG_SCHEMA: BaseConfigSchemaResponse = { agentDir: { type: "string", }, + systemPromptOverride: { + type: "string", + }, model: { anyOf: [ { diff --git a/src/media-generation/provider-capabilities.contract.test.ts b/src/media-generation/provider-capabilities.contract.test.ts index dda97f85694..cbf2c6e9753 100644 --- a/src/media-generation/provider-capabilities.contract.test.ts +++ b/src/media-generation/provider-capabilities.contract.test.ts @@ -1,98 +1,31 @@ import { describe, expect, it } from "vitest"; +import { + loadBundledMusicGenerationProviders, + loadBundledVideoGenerationProviders, +} from "../../test/helpers/media-generation/bundled-provider-builders.js"; import { listSupportedMusicGenerationModes } from "../music-generation/capabilities.js"; -import type { MusicGenerationProvider } from "../music-generation/types.js"; import { BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS } from "../plugins/contracts/inventory/bundled-capability-metadata.js"; import { listSupportedVideoGenerationModes } from "../video-generation/capabilities.js"; -import type { VideoGenerationProvider } from "../video-generation/types.js"; - -type VideoProviderEntry = { - pluginId: string; - provider: VideoGenerationProvider; -}; - -type MusicProviderEntry = { - pluginId: string; - provider: MusicGenerationProvider; -}; function expectedBundledVideoProviderPluginIds(): string[] { - return BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.filter((entry) => entry.videoGenerationProviderIds.length > 0) + return BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.filter( + (entry) => entry.videoGenerationProviderIds.length > 0, + ) .map((entry) => entry.pluginId) .toSorted((left, right) => left.localeCompare(right)); } function expectedBundledMusicProviderPluginIds(): string[] { - return BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.filter((entry) => entry.musicGenerationProviderIds.length > 0) + return BUNDLED_PLUGIN_CONTRACT_SNAPSHOTS.filter( + (entry) => entry.musicGenerationProviderIds.length > 0, + ) .map((entry) => entry.pluginId) .toSorted((left, right) => left.localeCompare(right)); } -async function loadBundledVideoGenerationProviders(): Promise { - const [ - { buildAlibabaVideoGenerationProvider }, - { buildBytePlusVideoGenerationProvider }, - { buildComfyVideoGenerationProvider }, - { buildFalVideoGenerationProvider }, - { buildGoogleVideoGenerationProvider }, - { buildMinimaxVideoGenerationProvider }, - { buildOpenAIVideoGenerationProvider }, - { buildQwenVideoGenerationProvider }, - { buildRunwayVideoGenerationProvider }, - { buildTogetherVideoGenerationProvider }, - { buildVydraVideoGenerationProvider }, - { buildXaiVideoGenerationProvider }, - ] = await Promise.all([ - import("../../extensions/alibaba/video-generation-provider.js"), - import("../../extensions/byteplus/video-generation-provider.js"), - import("../../extensions/comfy/video-generation-provider.js"), - import("../../extensions/fal/video-generation-provider.js"), - import("../../extensions/google/video-generation-provider.js"), - import("../../extensions/minimax/video-generation-provider.js"), - import("../../extensions/openai/video-generation-provider.js"), - import("../../extensions/qwen/video-generation-provider.js"), - import("../../extensions/runway/video-generation-provider.js"), - import("../../extensions/together/video-generation-provider.js"), - import("../../extensions/vydra/video-generation-provider.js"), - import("../../extensions/xai/video-generation-provider.js"), - ]); - - return [ - { pluginId: "alibaba", provider: buildAlibabaVideoGenerationProvider() }, - { pluginId: "byteplus", provider: buildBytePlusVideoGenerationProvider() }, - { pluginId: "comfy", provider: buildComfyVideoGenerationProvider() }, - { pluginId: "fal", provider: buildFalVideoGenerationProvider() }, - { pluginId: "google", provider: buildGoogleVideoGenerationProvider() }, - { pluginId: "minimax", provider: buildMinimaxVideoGenerationProvider() }, - { pluginId: "openai", provider: buildOpenAIVideoGenerationProvider() }, - { pluginId: "qwen", provider: buildQwenVideoGenerationProvider() }, - { pluginId: "runway", provider: buildRunwayVideoGenerationProvider() }, - { pluginId: "together", provider: buildTogetherVideoGenerationProvider() }, - { pluginId: "vydra", provider: buildVydraVideoGenerationProvider() }, - { pluginId: "xai", provider: buildXaiVideoGenerationProvider() }, - ]; -} - -async function loadBundledMusicGenerationProviders(): Promise { - const [ - { buildComfyMusicGenerationProvider }, - { buildGoogleMusicGenerationProvider }, - { buildMinimaxMusicGenerationProvider }, - ] = await Promise.all([ - import("../../extensions/comfy/music-generation-provider.js"), - import("../../extensions/google/music-generation-provider.js"), - import("../../extensions/minimax/music-generation-provider.js"), - ]); - - return [ - { pluginId: "comfy", provider: buildComfyMusicGenerationProvider() }, - { pluginId: "google", provider: buildGoogleMusicGenerationProvider() }, - { pluginId: "minimax", provider: buildMinimaxMusicGenerationProvider() }, - ]; -} - describe("bundled media-generation provider capabilities", () => { - it("declares explicit mode support for every bundled video-generation provider", async () => { - const entries = await loadBundledVideoGenerationProviders(); + it("declares explicit mode support for every bundled video-generation provider", () => { + const entries = loadBundledVideoGenerationProviders(); expect(entries.map((entry) => entry.pluginId).toSorted()).toEqual( expectedBundledVideoProviderPluginIds(), ); @@ -133,8 +66,8 @@ describe("bundled media-generation provider capabilities", () => { } }); - it("declares explicit generate/edit support for every bundled music-generation provider", async () => { - const entries = await loadBundledMusicGenerationProviders(); + it("declares explicit generate/edit support for every bundled music-generation provider", () => { + const entries = loadBundledMusicGenerationProviders(); expect(entries.map((entry) => entry.pluginId).toSorted()).toEqual( expectedBundledMusicProviderPluginIds(), ); diff --git a/src/plugin-sdk/provider-web-search-contract.ts b/src/plugin-sdk/provider-web-search-contract.ts index 2ab09acef52..17c09ea8778 100644 --- a/src/plugin-sdk/provider-web-search-contract.ts +++ b/src/plugin-sdk/provider-web-search-contract.ts @@ -1,12 +1,24 @@ -// Narrow shared exports for web-search contract surfaces. - -import type { WebSearchProviderPlugin } from "../plugins/types.js"; +// Public contract-safe web-search registration helpers for provider plugins. +import type { + WebSearchCredentialResolutionSource, + WebSearchProviderSetupContext, + WebSearchProviderPlugin, + WebSearchProviderToolDefinition, +} from "../plugins/types.js"; export { getScopedCredentialValue, + getTopLevelCredentialValue, + mergeScopedSearchConfig, resolveProviderWebSearchPluginConfig, setScopedCredentialValue, setProviderWebSearchPluginConfigValue, + setTopLevelCredentialValue, } from "../agents/tools/web-search-provider-config.js"; export { enablePluginInConfig } from "../plugins/enable.js"; -export type { WebSearchProviderPlugin }; +export type { + WebSearchCredentialResolutionSource, + WebSearchProviderSetupContext, + WebSearchProviderPlugin, + WebSearchProviderToolDefinition, +}; diff --git a/test/helpers/media-generation/bundled-provider-builders.ts b/test/helpers/media-generation/bundled-provider-builders.ts new file mode 100644 index 00000000000..88acbb38548 --- /dev/null +++ b/test/helpers/media-generation/bundled-provider-builders.ts @@ -0,0 +1,52 @@ +import { buildAlibabaVideoGenerationProvider } from "../../../extensions/alibaba/video-generation-provider.js"; +import { buildBytePlusVideoGenerationProvider } from "../../../extensions/byteplus/video-generation-provider.js"; +import { buildComfyMusicGenerationProvider } from "../../../extensions/comfy/music-generation-provider.js"; +import { buildComfyVideoGenerationProvider } from "../../../extensions/comfy/video-generation-provider.js"; +import { buildFalVideoGenerationProvider } from "../../../extensions/fal/video-generation-provider.js"; +import { buildGoogleMusicGenerationProvider } from "../../../extensions/google/music-generation-provider.js"; +import { buildGoogleVideoGenerationProvider } from "../../../extensions/google/video-generation-provider.js"; +import { buildMinimaxMusicGenerationProvider } from "../../../extensions/minimax/music-generation-provider.js"; +import { buildMinimaxVideoGenerationProvider } from "../../../extensions/minimax/video-generation-provider.js"; +import { buildOpenAIVideoGenerationProvider } from "../../../extensions/openai/video-generation-provider.js"; +import { buildQwenVideoGenerationProvider } from "../../../extensions/qwen/video-generation-provider.js"; +import { buildRunwayVideoGenerationProvider } from "../../../extensions/runway/video-generation-provider.js"; +import { buildTogetherVideoGenerationProvider } from "../../../extensions/together/video-generation-provider.js"; +import { buildVydraVideoGenerationProvider } from "../../../extensions/vydra/video-generation-provider.js"; +import { buildXaiVideoGenerationProvider } from "../../../extensions/xai/video-generation-provider.js"; +import type { MusicGenerationProvider } from "../../../src/music-generation/types.js"; +import type { VideoGenerationProvider } from "../../../src/video-generation/types.js"; + +export type BundledVideoProviderEntry = { + pluginId: string; + provider: VideoGenerationProvider; +}; + +export type BundledMusicProviderEntry = { + pluginId: string; + provider: MusicGenerationProvider; +}; + +export function loadBundledVideoGenerationProviders(): BundledVideoProviderEntry[] { + return [ + { pluginId: "alibaba", provider: buildAlibabaVideoGenerationProvider() }, + { pluginId: "byteplus", provider: buildBytePlusVideoGenerationProvider() }, + { pluginId: "comfy", provider: buildComfyVideoGenerationProvider() }, + { pluginId: "fal", provider: buildFalVideoGenerationProvider() }, + { pluginId: "google", provider: buildGoogleVideoGenerationProvider() }, + { pluginId: "minimax", provider: buildMinimaxVideoGenerationProvider() }, + { pluginId: "openai", provider: buildOpenAIVideoGenerationProvider() }, + { pluginId: "qwen", provider: buildQwenVideoGenerationProvider() }, + { pluginId: "runway", provider: buildRunwayVideoGenerationProvider() }, + { pluginId: "together", provider: buildTogetherVideoGenerationProvider() }, + { pluginId: "vydra", provider: buildVydraVideoGenerationProvider() }, + { pluginId: "xai", provider: buildXaiVideoGenerationProvider() }, + ]; +} + +export function loadBundledMusicGenerationProviders(): BundledMusicProviderEntry[] { + return [ + { pluginId: "comfy", provider: buildComfyMusicGenerationProvider() }, + { pluginId: "google", provider: buildGoogleMusicGenerationProvider() }, + { pluginId: "minimax", provider: buildMinimaxMusicGenerationProvider() }, + ]; +}