diff --git a/extensions/tsconfig.package-boundary.paths.json b/extensions/tsconfig.package-boundary.paths.json index f76218230c6..8c29de08caf 100644 --- a/extensions/tsconfig.package-boundary.paths.json +++ b/extensions/tsconfig.package-boundary.paths.json @@ -3,11 +3,17 @@ "compilerOptions": { "paths": { "openclaw/extension-api": ["../src/extensionAPI.ts"], - "openclaw/plugin-sdk": ["../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], - "openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], + "openclaw/plugin-sdk": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts" + ], + "openclaw/plugin-sdk/*": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" + ], "openclaw/plugin-sdk/account-id": ["../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], - "@openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"] + "@openclaw/plugin-sdk/*": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" + ] } } } diff --git a/extensions/xai/tsconfig.json b/extensions/xai/tsconfig.json index b237dac1b3f..2e159bc4e59 100644 --- a/extensions/xai/tsconfig.json +++ b/extensions/xai/tsconfig.json @@ -4,14 +4,17 @@ "rootDir": ".", "paths": { "openclaw/extension-api": ["../../src/extensionAPI.ts"], - "openclaw/plugin-sdk": ["../../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], + "openclaw/plugin-sdk": [ + "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts" + ], "openclaw/plugin-sdk/*": [ - "../../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts", - "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/*.d.ts" + "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" ], "openclaw/plugin-sdk/account-id": ["../../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../*"], - "@openclaw/plugin-sdk/*": ["../../packages/plugin-sdk/dist/packages/plugin-sdk/src/*.d.ts"], + "@openclaw/plugin-sdk/*": [ + "../../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts" + ], "@openclaw/anthropic-vertex/api.js": ["./.boundary-stubs/anthropic-vertex-api.d.ts"], "@openclaw/ollama/api.js": ["./.boundary-stubs/ollama-api.d.ts"], "@openclaw/ollama/runtime-api.js": ["./.boundary-stubs/ollama-runtime-api.d.ts"], diff --git a/packages/plugin-sdk/package.json b/packages/plugin-sdk/package.json index 6767213125e..1608fee5ffe 100644 --- a/packages/plugin-sdk/package.json +++ b/packages/plugin-sdk/package.json @@ -5,63 +5,63 @@ "type": "module", "exports": { "./config-runtime": { - "types": "./dist/src/plugin-sdk/config-runtime.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/config-runtime.d.ts", "default": "./src/config-runtime.ts" }, "./plugin-entry": { - "types": "./dist/src/plugin-sdk/plugin-entry.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/plugin-entry.d.ts", "default": "./src/plugin-entry.ts" }, "./provider-auth": { - "types": "./dist/src/plugin-sdk/provider-auth.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-auth.d.ts", "default": "./src/provider-auth.ts" }, "./provider-auth-runtime": { - "types": "./dist/src/plugin-sdk/provider-auth-runtime.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-auth-runtime.d.ts", "default": "./src/provider-auth-runtime.ts" }, "./provider-entry": { - "types": "./dist/src/plugin-sdk/provider-entry.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-entry.d.ts", "default": "./src/provider-entry.ts" }, "./provider-http": { - "types": "./dist/src/plugin-sdk/provider-http.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-http.d.ts", "default": "./src/provider-http.ts" }, "./provider-model-shared": { - "types": "./dist/src/plugin-sdk/provider-model-shared.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-model-shared.d.ts", "default": "./src/provider-model-shared.ts" }, "./provider-onboard": { - "types": "./dist/src/plugin-sdk/provider-onboard.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-onboard.d.ts", "default": "./src/provider-onboard.ts" }, "./provider-stream-shared": { - "types": "./dist/src/plugin-sdk/provider-stream-shared.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-stream-shared.d.ts", "default": "./src/provider-stream-shared.ts" }, "./provider-tools": { - "types": "./dist/src/plugin-sdk/provider-tools.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-tools.d.ts", "default": "./src/provider-tools.ts" }, "./provider-web-search": { - "types": "./dist/src/plugin-sdk/provider-web-search.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-web-search.d.ts", "default": "./src/provider-web-search.ts" }, "./runtime-env": { - "types": "./dist/src/plugin-sdk/runtime-env.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/runtime-env.d.ts", "default": "./src/runtime-env.ts" }, "./secret-input": { - "types": "./dist/src/plugin-sdk/secret-input.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/secret-input.d.ts", "default": "./src/secret-input.ts" }, "./testing": { - "types": "./dist/src/plugin-sdk/testing.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/testing.d.ts", "default": "./src/testing.ts" }, "./video-generation": { - "types": "./dist/src/plugin-sdk/video-generation.d.ts", + "types": "./dist/packages/plugin-sdk/src/src/plugin-sdk/video-generation.d.ts", "default": "./src/video-generation.ts" } } diff --git a/packages/plugin-sdk/tsconfig.json b/packages/plugin-sdk/tsconfig.json index 1cb8649f72a..7f291529b22 100644 --- a/packages/plugin-sdk/tsconfig.json +++ b/packages/plugin-sdk/tsconfig.json @@ -12,6 +12,7 @@ }, "include": [ "../../src/plugin-sdk/config-runtime.ts", + "../../src/plugin-sdk/index.ts", "../../src/plugin-sdk/lazy-value.ts", "../../src/plugin-sdk/oauth-utils.ts", "../../src/plugin-sdk/plugin-entry.ts", diff --git a/src/plugin-sdk/video-generation.ts b/src/plugin-sdk/video-generation.ts index 62cfdc9297a..ccf273eec08 100644 --- a/src/plugin-sdk/video-generation.ts +++ b/src/plugin-sdk/video-generation.ts @@ -1,19 +1,143 @@ // Public video-generation helpers and types for provider plugins. +// +// Keep these public type declarations local to the plugin-sdk entrypoint so the +// emitted declaration surface stays stable for package-boundary consumers. -export type { - GeneratedVideoAsset, - VideoGenerationMode, - VideoGenerationModeCapabilities, - VideoGenerationProvider, - VideoGenerationProviderCapabilities, - VideoGenerationProviderConfiguredContext, - VideoGenerationRequest, - VideoGenerationResolution, - VideoGenerationResult, - VideoGenerationSourceAsset, - VideoGenerationTransformCapabilities, +import type { AuthProfileStore } from "../agents/auth-profiles.js"; +import type { OpenClawConfig } from "../config/config.js"; +import type { + GeneratedVideoAsset as CoreGeneratedVideoAsset, + VideoGenerationMode as CoreVideoGenerationMode, + VideoGenerationModeCapabilities as CoreVideoGenerationModeCapabilities, + VideoGenerationProvider as CoreVideoGenerationProvider, + VideoGenerationProviderCapabilities as CoreVideoGenerationProviderCapabilities, + VideoGenerationProviderConfiguredContext as CoreVideoGenerationProviderConfiguredContext, + VideoGenerationRequest as CoreVideoGenerationRequest, + VideoGenerationResolution as CoreVideoGenerationResolution, + VideoGenerationResult as CoreVideoGenerationResult, + VideoGenerationSourceAsset as CoreVideoGenerationSourceAsset, + VideoGenerationTransformCapabilities as CoreVideoGenerationTransformCapabilities, } from "../video-generation/types.js"; +export type GeneratedVideoAsset = { + buffer: Buffer; + mimeType: string; + fileName?: string; + metadata?: Record; +}; + +export type VideoGenerationResolution = "480P" | "720P" | "768P" | "1080P"; + +export type VideoGenerationSourceAsset = { + url?: string; + buffer?: Buffer; + mimeType?: string; + fileName?: string; + metadata?: Record; +}; + +export type VideoGenerationProviderConfiguredContext = { + cfg?: OpenClawConfig; + agentDir?: string; +}; + +export type VideoGenerationRequest = { + provider: string; + model: string; + prompt: string; + cfg: OpenClawConfig; + agentDir?: string; + authStore?: AuthProfileStore; + timeoutMs?: number; + size?: string; + aspectRatio?: string; + resolution?: VideoGenerationResolution; + durationSeconds?: number; + audio?: boolean; + watermark?: boolean; + inputImages?: VideoGenerationSourceAsset[]; + inputVideos?: VideoGenerationSourceAsset[]; +}; + +export type VideoGenerationResult = { + videos: GeneratedVideoAsset[]; + model?: string; + metadata?: Record; +}; + +export type VideoGenerationMode = "generate" | "imageToVideo" | "videoToVideo"; + +export type VideoGenerationModeCapabilities = { + maxVideos?: number; + maxInputImages?: number; + maxInputVideos?: number; + maxDurationSeconds?: number; + supportedDurationSeconds?: readonly number[]; + supportedDurationSecondsByModel?: Readonly>; + sizes?: readonly string[]; + aspectRatios?: readonly string[]; + resolutions?: readonly VideoGenerationResolution[]; + supportsSize?: boolean; + supportsAspectRatio?: boolean; + supportsResolution?: boolean; + supportsAudio?: boolean; + supportsWatermark?: boolean; +}; + +export type VideoGenerationTransformCapabilities = VideoGenerationModeCapabilities & { + enabled: boolean; +}; + +export type VideoGenerationProviderCapabilities = VideoGenerationModeCapabilities & { + generate?: VideoGenerationModeCapabilities; + imageToVideo?: VideoGenerationTransformCapabilities; + videoToVideo?: VideoGenerationTransformCapabilities; +}; + +export type VideoGenerationProvider = { + id: string; + aliases?: string[]; + label?: string; + defaultModel?: string; + models?: string[]; + capabilities: VideoGenerationProviderCapabilities; + isConfigured?: (ctx: VideoGenerationProviderConfiguredContext) => boolean; + generateVideo: (req: VideoGenerationRequest) => Promise; +}; + +type AssertAssignable<_Left extends _Right, _Right> = true; + +type _VideoGenerationSdkCompat = [ + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable< + VideoGenerationProviderConfiguredContext, + CoreVideoGenerationProviderConfiguredContext + >, + AssertAssignable< + CoreVideoGenerationProviderConfiguredContext, + VideoGenerationProviderConfiguredContext + >, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, + AssertAssignable, +]; + export { DEFAULT_VIDEO_GENERATION_DURATION_SECONDS, DEFAULT_VIDEO_GENERATION_TIMEOUT_MS, diff --git a/src/plugins/contracts/extension-package-project-boundaries.test.ts b/src/plugins/contracts/extension-package-project-boundaries.test.ts index dd9ac8e2c3e..4e8521ef9f0 100644 --- a/src/plugins/contracts/extension-package-project-boundaries.test.ts +++ b/src/plugins/contracts/extension-package-project-boundaries.test.ts @@ -37,11 +37,17 @@ describe("opt-in extension package boundaries", () => { expect(pathsConfig.extends).toBe("../tsconfig.json"); expect(pathsConfig.compilerOptions?.paths).toEqual({ "openclaw/extension-api": ["../src/extensionAPI.ts"], - "openclaw/plugin-sdk": ["../packages/plugin-sdk/dist/src/plugin-sdk/index.d.ts"], - "openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], + "openclaw/plugin-sdk": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/index.d.ts", + ], + "openclaw/plugin-sdk/*": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts", + ], "openclaw/plugin-sdk/account-id": ["../src/plugin-sdk/account-id.ts"], "@openclaw/*": ["../packages/plugin-sdk/dist/extensions/*", "../extensions/*"], - "@openclaw/plugin-sdk/*": ["../packages/plugin-sdk/dist/src/plugin-sdk/*.d.ts"], + "@openclaw/plugin-sdk/*": [ + "../packages/plugin-sdk/dist/packages/plugin-sdk/src/src/plugin-sdk/*.d.ts", + ], }); const baseConfig = readJsonFile(EXTENSION_PACKAGE_BOUNDARY_BASE_CONFIG); @@ -88,6 +94,7 @@ describe("opt-in extension package boundaries", () => { expect(tsconfig.compilerOptions?.rootDir).toBe("../.."); expect(tsconfig.include).toEqual([ "../../src/plugin-sdk/config-runtime.ts", + "../../src/plugin-sdk/index.ts", "../../src/plugin-sdk/lazy-value.ts", "../../src/plugin-sdk/oauth-utils.ts", "../../src/plugin-sdk/plugin-entry.ts", @@ -117,13 +124,13 @@ describe("opt-in extension package boundaries", () => { expect(packageJson.name).toBe("@openclaw/plugin-sdk"); expect(packageJson.exports?.["./core"]).toBeUndefined(); expect(packageJson.exports?.["./plugin-entry"]?.types).toBe( - "./dist/src/plugin-sdk/plugin-entry.d.ts", + "./dist/packages/plugin-sdk/src/src/plugin-sdk/plugin-entry.d.ts", ); expect(packageJson.exports?.["./provider-http"]?.types).toBe( - "./dist/src/plugin-sdk/provider-http.d.ts", + "./dist/packages/plugin-sdk/src/src/plugin-sdk/provider-http.d.ts", ); expect(packageJson.exports?.["./video-generation"]?.types).toBe( - "./dist/src/plugin-sdk/video-generation.d.ts", + "./dist/packages/plugin-sdk/src/src/plugin-sdk/video-generation.d.ts", ); expect(existsSync(resolve(REPO_ROOT, "packages/plugin-sdk/types/plugin-entry.d.ts"))).toBe( false,