From d72115c9df77f0bcc7c5526f9aad78281ea7d50c Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 26 Mar 2026 22:46:26 +0000 Subject: [PATCH] refactor: genericize speech provider config surface --- docs/.generated/plugin-sdk-api-baseline.json | 196 +++++---- docs/.generated/plugin-sdk-api-baseline.jsonl | 180 ++++---- .../reference/secretref-credential-surface.md | 9 +- ...tref-user-supplied-credentials-matrix.json | 33 +- extensions/browser/src/browser-runtime.ts | 1 + extensions/discord/src/voice/manager.ts | 34 +- extensions/elevenlabs/speech-provider.ts | 5 +- extensions/microsoft/speech-provider.ts | 4 +- extensions/openai/speech-provider.ts | 5 +- extensions/voice-call/src/config.test.ts | 23 +- .../voice-call/src/manager/outbound.test.ts | 4 +- extensions/voice-call/src/manager/outbound.ts | 11 +- .../voice-call/src/telephony-tts.test.ts | 32 +- extensions/voice-call/src/test-fixtures.ts | 4 +- src/config/legacy.migrations.part-3.ts | 81 ++++ src/config/schema.base.generated.ts | 391 +++++------------- src/config/schema.help.ts | 6 + src/config/schema.labels.ts | 3 + src/config/types.tts.ts | 4 + src/config/zod-schema.core.ts | 61 +-- src/config/zod-schema.tts.test.ts | 26 +- src/gateway/server-methods/talk.ts | 13 +- src/plugin-sdk/browser.ts | 5 +- src/secrets/runtime-config-collectors-tts.ts | 70 +++- src/secrets/target-registry-data.ts | 54 +-- src/tts/tts.ts | 25 +- 26 files changed, 611 insertions(+), 669 deletions(-) diff --git a/docs/.generated/plugin-sdk-api-baseline.json b/docs/.generated/plugin-sdk-api-baseline.json index 6a1f775f883..4d0c5a97424 100644 --- a/docs/.generated/plugin-sdk-api-baseline.json +++ b/docs/.generated/plugin-sdk-api-baseline.json @@ -244,7 +244,7 @@ "exportName": "CliBackendPlugin", "kind": "type", "source": { - "line": 1305, + "line": 1316, "path": "src/plugins/types.ts" } }, @@ -388,7 +388,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 964, + "line": 969, "path": "src/plugins/types.ts" } }, @@ -406,7 +406,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1349, + "line": 1360, "path": "src/plugins/types.ts" } }, @@ -415,7 +415,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 94, + "line": 95, "path": "src/plugins/types.ts" } }, @@ -424,7 +424,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 65, + "line": 66, "path": "src/plugins/types.ts" } }, @@ -442,7 +442,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 161, + "line": 166, "path": "src/plugins/types.ts" } }, @@ -451,7 +451,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 146, + "line": 151, "path": "src/plugins/types.ts" } }, @@ -460,7 +460,7 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 301, + "line": 306, "path": "src/plugins/types.ts" } }, @@ -514,7 +514,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 939, + "line": 944, "path": "src/plugins/types.ts" } }, @@ -3081,7 +3081,7 @@ "exportName": "definePluginEntry", "kind": "function", "source": { - "line": 88, + "line": 90, "path": "src/plugin-sdk/plugin-entry.ts" } }, @@ -3405,7 +3405,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 964, + "line": 969, "path": "src/plugins/types.ts" } }, @@ -3423,7 +3423,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1349, + "line": 1360, "path": "src/plugins/types.ts" } }, @@ -3432,7 +3432,7 @@ "exportName": "OpenClawPluginCommandDefinition", "kind": "type", "source": { - "line": 1081, + "line": 1086, "path": "src/plugins/types.ts" } }, @@ -3441,7 +3441,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 94, + "line": 95, "path": "src/plugins/types.ts" } }, @@ -3450,7 +3450,7 @@ "exportName": "OpenClawPluginDefinition", "kind": "type", "source": { - "line": 1331, + "line": 1342, "path": "src/plugins/types.ts" } }, @@ -3459,7 +3459,7 @@ "exportName": "OpenClawPluginService", "kind": "type", "source": { - "line": 1298, + "line": 1309, "path": "src/plugins/types.ts" } }, @@ -3468,7 +3468,7 @@ "exportName": "OpenClawPluginServiceContext", "kind": "type", "source": { - "line": 1290, + "line": 1301, "path": "src/plugins/types.ts" } }, @@ -3477,7 +3477,7 @@ "exportName": "OpenClawPluginToolContext", "kind": "type", "source": { - "line": 109, + "line": 110, "path": "src/plugins/types.ts" } }, @@ -3486,7 +3486,7 @@ "exportName": "OpenClawPluginToolFactory", "kind": "type", "source": { - "line": 126, + "line": 131, "path": "src/plugins/types.ts" } }, @@ -3495,7 +3495,7 @@ "exportName": "PluginCommandContext", "kind": "type", "source": { - "line": 979, + "line": 984, "path": "src/plugins/types.ts" } }, @@ -3504,7 +3504,7 @@ "exportName": "PluginInteractiveTelegramHandlerContext", "kind": "type", "source": { - "line": 1110, + "line": 1115, "path": "src/plugins/types.ts" } }, @@ -3513,7 +3513,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 65, + "line": 66, "path": "src/plugins/types.ts" } }, @@ -3531,7 +3531,7 @@ "exportName": "ProviderAugmentModelCatalogContext", "kind": "type", "source": { - "line": 577, + "line": 582, "path": "src/plugins/types.ts" } }, @@ -3540,7 +3540,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 161, + "line": 166, "path": "src/plugins/types.ts" } }, @@ -3549,7 +3549,7 @@ "exportName": "ProviderAuthDoctorHintContext", "kind": "type", "source": { - "line": 452, + "line": 457, "path": "src/plugins/types.ts" } }, @@ -3558,7 +3558,7 @@ "exportName": "ProviderAuthMethod", "kind": "type", "source": { - "line": 239, + "line": 244, "path": "src/plugins/types.ts" } }, @@ -3567,7 +3567,7 @@ "exportName": "ProviderAuthMethodNonInteractiveContext", "kind": "type", "source": { - "line": 223, + "line": 228, "path": "src/plugins/types.ts" } }, @@ -3576,7 +3576,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 146, + "line": 151, "path": "src/plugins/types.ts" } }, @@ -3585,7 +3585,7 @@ "exportName": "ProviderBuildMissingAuthMessageContext", "kind": "type", "source": { - "line": 505, + "line": 510, "path": "src/plugins/types.ts" } }, @@ -3594,7 +3594,7 @@ "exportName": "ProviderBuiltInModelSuppressionContext", "kind": "type", "source": { - "line": 521, + "line": 526, "path": "src/plugins/types.ts" } }, @@ -3603,7 +3603,7 @@ "exportName": "ProviderBuiltInModelSuppressionResult", "kind": "type", "source": { - "line": 530, + "line": 535, "path": "src/plugins/types.ts" } }, @@ -3612,7 +3612,7 @@ "exportName": "ProviderCacheTtlEligibilityContext", "kind": "type", "source": { - "line": 493, + "line": 498, "path": "src/plugins/types.ts" } }, @@ -3621,7 +3621,7 @@ "exportName": "ProviderCatalogContext", "kind": "type", "source": { - "line": 260, + "line": 265, "path": "src/plugins/types.ts" } }, @@ -3630,7 +3630,7 @@ "exportName": "ProviderCatalogResult", "kind": "type", "source": { - "line": 283, + "line": 288, "path": "src/plugins/types.ts" } }, @@ -3639,7 +3639,7 @@ "exportName": "ProviderDefaultThinkingPolicyContext", "kind": "type", "source": { - "line": 554, + "line": 559, "path": "src/plugins/types.ts" } }, @@ -3648,7 +3648,7 @@ "exportName": "ProviderDiscoveryContext", "kind": "type", "source": { - "line": 593, + "line": 598, "path": "src/plugins/types.ts" } }, @@ -3657,7 +3657,7 @@ "exportName": "ProviderFetchUsageSnapshotContext", "kind": "type", "source": { - "line": 433, + "line": 438, "path": "src/plugins/types.ts" } }, @@ -3666,7 +3666,7 @@ "exportName": "ProviderModernModelPolicyContext", "kind": "type", "source": { - "line": 564, + "line": 569, "path": "src/plugins/types.ts" } }, @@ -3675,7 +3675,7 @@ "exportName": "ProviderNormalizeResolvedModelContext", "kind": "type", "source": { - "line": 344, + "line": 349, "path": "src/plugins/types.ts" } }, @@ -3684,7 +3684,7 @@ "exportName": "ProviderPreparedRuntimeAuth", "kind": "type", "source": { - "line": 380, + "line": 385, "path": "src/plugins/types.ts" } }, @@ -3693,7 +3693,7 @@ "exportName": "ProviderPrepareDynamicModelContext", "kind": "type", "source": { - "line": 335, + "line": 340, "path": "src/plugins/types.ts" } }, @@ -3702,7 +3702,7 @@ "exportName": "ProviderPrepareExtraParamsContext", "kind": "type", "source": { - "line": 466, + "line": 471, "path": "src/plugins/types.ts" } }, @@ -3711,7 +3711,7 @@ "exportName": "ProviderPrepareRuntimeAuthContext", "kind": "type", "source": { - "line": 359, + "line": 364, "path": "src/plugins/types.ts" } }, @@ -3720,7 +3720,7 @@ "exportName": "ProviderResolvedUsageAuth", "kind": "type", "source": { - "line": 420, + "line": 425, "path": "src/plugins/types.ts" } }, @@ -3729,7 +3729,7 @@ "exportName": "ProviderResolveDynamicModelContext", "kind": "type", "source": { - "line": 318, + "line": 323, "path": "src/plugins/types.ts" } }, @@ -3738,7 +3738,7 @@ "exportName": "ProviderResolveUsageAuthContext", "kind": "type", "source": { - "line": 401, + "line": 406, "path": "src/plugins/types.ts" } }, @@ -3747,7 +3747,7 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 301, + "line": 306, "path": "src/plugins/types.ts" } }, @@ -3756,7 +3756,7 @@ "exportName": "ProviderThinkingPolicyContext", "kind": "type", "source": { - "line": 542, + "line": 547, "path": "src/plugins/types.ts" } }, @@ -3774,7 +3774,7 @@ "exportName": "ProviderWrapStreamFnContext", "kind": "type", "source": { - "line": 483, + "line": 488, "path": "src/plugins/types.ts" } }, @@ -3819,7 +3819,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 939, + "line": 944, "path": "src/plugins/types.ts" } }, @@ -3884,7 +3884,7 @@ "exportName": "definePluginEntry", "kind": "function", "source": { - "line": 88, + "line": 90, "path": "src/plugin-sdk/plugin-entry.ts" } }, @@ -3911,7 +3911,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 964, + "line": 969, "path": "src/plugins/types.ts" } }, @@ -3929,7 +3929,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1349, + "line": 1360, "path": "src/plugins/types.ts" } }, @@ -3938,7 +3938,7 @@ "exportName": "OpenClawPluginCommandDefinition", "kind": "type", "source": { - "line": 1081, + "line": 1086, "path": "src/plugins/types.ts" } }, @@ -3947,7 +3947,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 94, + "line": 95, "path": "src/plugins/types.ts" } }, @@ -3956,7 +3956,7 @@ "exportName": "OpenClawPluginDefinition", "kind": "type", "source": { - "line": 1331, + "line": 1342, "path": "src/plugins/types.ts" } }, @@ -3965,7 +3965,7 @@ "exportName": "OpenClawPluginService", "kind": "type", "source": { - "line": 1298, + "line": 1309, "path": "src/plugins/types.ts" } }, @@ -3974,7 +3974,25 @@ "exportName": "OpenClawPluginServiceContext", "kind": "type", "source": { - "line": 1290, + "line": 1301, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type OpenClawPluginToolContext = OpenClawPluginToolContext;", + "exportName": "OpenClawPluginToolContext", + "kind": "type", + "source": { + "line": 110, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;", + "exportName": "OpenClawPluginToolFactory", + "kind": "type", + "source": { + "line": 131, "path": "src/plugins/types.ts" } }, @@ -3983,7 +4001,7 @@ "exportName": "PluginCommandContext", "kind": "type", "source": { - "line": 979, + "line": 984, "path": "src/plugins/types.ts" } }, @@ -3992,7 +4010,7 @@ "exportName": "PluginInteractiveTelegramHandlerContext", "kind": "type", "source": { - "line": 1110, + "line": 1115, "path": "src/plugins/types.ts" } }, @@ -4001,7 +4019,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 65, + "line": 66, "path": "src/plugins/types.ts" } }, @@ -4010,7 +4028,7 @@ "exportName": "ProviderAugmentModelCatalogContext", "kind": "type", "source": { - "line": 577, + "line": 582, "path": "src/plugins/types.ts" } }, @@ -4019,7 +4037,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 161, + "line": 166, "path": "src/plugins/types.ts" } }, @@ -4028,7 +4046,7 @@ "exportName": "ProviderAuthDoctorHintContext", "kind": "type", "source": { - "line": 452, + "line": 457, "path": "src/plugins/types.ts" } }, @@ -4037,7 +4055,7 @@ "exportName": "ProviderAuthMethod", "kind": "type", "source": { - "line": 239, + "line": 244, "path": "src/plugins/types.ts" } }, @@ -4046,7 +4064,7 @@ "exportName": "ProviderAuthMethodNonInteractiveContext", "kind": "type", "source": { - "line": 223, + "line": 228, "path": "src/plugins/types.ts" } }, @@ -4055,7 +4073,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 146, + "line": 151, "path": "src/plugins/types.ts" } }, @@ -4064,7 +4082,7 @@ "exportName": "ProviderBuildMissingAuthMessageContext", "kind": "type", "source": { - "line": 505, + "line": 510, "path": "src/plugins/types.ts" } }, @@ -4073,7 +4091,7 @@ "exportName": "ProviderBuiltInModelSuppressionContext", "kind": "type", "source": { - "line": 521, + "line": 526, "path": "src/plugins/types.ts" } }, @@ -4082,7 +4100,7 @@ "exportName": "ProviderBuiltInModelSuppressionResult", "kind": "type", "source": { - "line": 530, + "line": 535, "path": "src/plugins/types.ts" } }, @@ -4091,7 +4109,7 @@ "exportName": "ProviderCacheTtlEligibilityContext", "kind": "type", "source": { - "line": 493, + "line": 498, "path": "src/plugins/types.ts" } }, @@ -4100,7 +4118,7 @@ "exportName": "ProviderCatalogContext", "kind": "type", "source": { - "line": 260, + "line": 265, "path": "src/plugins/types.ts" } }, @@ -4109,7 +4127,7 @@ "exportName": "ProviderCatalogResult", "kind": "type", "source": { - "line": 283, + "line": 288, "path": "src/plugins/types.ts" } }, @@ -4118,7 +4136,7 @@ "exportName": "ProviderDefaultThinkingPolicyContext", "kind": "type", "source": { - "line": 554, + "line": 559, "path": "src/plugins/types.ts" } }, @@ -4127,7 +4145,7 @@ "exportName": "ProviderDiscoveryContext", "kind": "type", "source": { - "line": 593, + "line": 598, "path": "src/plugins/types.ts" } }, @@ -4136,7 +4154,7 @@ "exportName": "ProviderFetchUsageSnapshotContext", "kind": "type", "source": { - "line": 433, + "line": 438, "path": "src/plugins/types.ts" } }, @@ -4145,7 +4163,7 @@ "exportName": "ProviderModernModelPolicyContext", "kind": "type", "source": { - "line": 564, + "line": 569, "path": "src/plugins/types.ts" } }, @@ -4154,7 +4172,7 @@ "exportName": "ProviderNormalizeResolvedModelContext", "kind": "type", "source": { - "line": 344, + "line": 349, "path": "src/plugins/types.ts" } }, @@ -4163,7 +4181,7 @@ "exportName": "ProviderPreparedRuntimeAuth", "kind": "type", "source": { - "line": 380, + "line": 385, "path": "src/plugins/types.ts" } }, @@ -4172,7 +4190,7 @@ "exportName": "ProviderPrepareDynamicModelContext", "kind": "type", "source": { - "line": 335, + "line": 340, "path": "src/plugins/types.ts" } }, @@ -4181,7 +4199,7 @@ "exportName": "ProviderPrepareExtraParamsContext", "kind": "type", "source": { - "line": 466, + "line": 471, "path": "src/plugins/types.ts" } }, @@ -4190,7 +4208,7 @@ "exportName": "ProviderPrepareRuntimeAuthContext", "kind": "type", "source": { - "line": 359, + "line": 364, "path": "src/plugins/types.ts" } }, @@ -4199,7 +4217,7 @@ "exportName": "ProviderResolvedUsageAuth", "kind": "type", "source": { - "line": 420, + "line": 425, "path": "src/plugins/types.ts" } }, @@ -4208,7 +4226,7 @@ "exportName": "ProviderResolveDynamicModelContext", "kind": "type", "source": { - "line": 318, + "line": 323, "path": "src/plugins/types.ts" } }, @@ -4217,7 +4235,7 @@ "exportName": "ProviderResolveUsageAuthContext", "kind": "type", "source": { - "line": 401, + "line": 406, "path": "src/plugins/types.ts" } }, @@ -4226,7 +4244,7 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 301, + "line": 306, "path": "src/plugins/types.ts" } }, @@ -4235,7 +4253,7 @@ "exportName": "ProviderThinkingPolicyContext", "kind": "type", "source": { - "line": 542, + "line": 547, "path": "src/plugins/types.ts" } }, @@ -4244,7 +4262,7 @@ "exportName": "ProviderWrapStreamFnContext", "kind": "type", "source": { - "line": 483, + "line": 488, "path": "src/plugins/types.ts" } }, @@ -4253,7 +4271,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 939, + "line": 944, "path": "src/plugins/types.ts" } } diff --git a/docs/.generated/plugin-sdk-api-baseline.jsonl b/docs/.generated/plugin-sdk-api-baseline.jsonl index c44b826f780..5035ef69c2b 100644 --- a/docs/.generated/plugin-sdk-api-baseline.jsonl +++ b/docs/.generated/plugin-sdk-api-baseline.jsonl @@ -25,7 +25,7 @@ {"declaration":"export type ChannelStatusIssue = ChannelStatusIssue;","entrypoint":"index","exportName":"ChannelStatusIssue","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":100,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"index","exportName":"ClawdbotConfig","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":32,"sourcePath":"src/config/types.openclaw.ts"} {"declaration":"export type CliBackendConfig = CliBackendConfig;","entrypoint":"index","exportName":"CliBackendConfig","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":47,"sourcePath":"src/config/types.agent-defaults.ts"} -{"declaration":"export type CliBackendPlugin = CliBackendPlugin;","entrypoint":"index","exportName":"CliBackendPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1305,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type CliBackendPlugin = CliBackendPlugin;","entrypoint":"index","exportName":"CliBackendPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1316,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type CompiledConfiguredBinding = CompiledConfiguredBinding;","entrypoint":"index","exportName":"CompiledConfiguredBinding","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":38,"sourcePath":"src/channels/plugins/binding-types.ts"} {"declaration":"export type ConfiguredBindingConversation = ConversationRef;","entrypoint":"index","exportName":"ConfiguredBindingConversation","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":13,"sourcePath":"src/channels/plugins/binding-types.ts"} {"declaration":"export type ConfiguredBindingResolution = ConfiguredBindingResolution;","entrypoint":"index","exportName":"ConfiguredBindingResolution","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":49,"sourcePath":"src/channels/plugins/binding-types.ts"} @@ -41,21 +41,21 @@ {"declaration":"export type ImageGenerationResolution = ImageGenerationResolution;","entrypoint":"index","exportName":"ImageGenerationResolution","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":12,"sourcePath":"src/image-generation/types.ts"} {"declaration":"export type ImageGenerationResult = ImageGenerationResult;","entrypoint":"index","exportName":"ImageGenerationResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":36,"sourcePath":"src/image-generation/types.ts"} {"declaration":"export type ImageGenerationSourceImage = ImageGenerationSourceImage;","entrypoint":"index","exportName":"ImageGenerationSourceImage","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":14,"sourcePath":"src/image-generation/types.ts"} -{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"index","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":964,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"index","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":969,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"index","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":32,"sourcePath":"src/config/types.openclaw.ts"} -{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"index","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1349,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"index","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":94,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"index","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":65,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"index","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1360,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"index","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":95,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"index","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":66,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"index","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":54,"sourcePath":"src/plugins/runtime/types.ts"} -{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"index","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":161,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"index","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":146,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"index","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":301,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"index","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":166,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"index","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":151,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"index","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":306,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type ReplyPayload = ReplyPayload;","entrypoint":"index","exportName":"ReplyPayload","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":76,"sourcePath":"src/auto-reply/types.ts"} {"declaration":"export type RuntimeEnv = RuntimeEnv;","entrypoint":"index","exportName":"RuntimeEnv","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":4,"sourcePath":"src/runtime.ts"} {"declaration":"export type RuntimeLogger = RuntimeLogger;","entrypoint":"index","exportName":"RuntimeLogger","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":7,"sourcePath":"src/plugins/runtime/types-core.ts"} {"declaration":"export type SecretInput = SecretInput;","entrypoint":"index","exportName":"SecretInput","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":16,"sourcePath":"src/config/types.secrets.ts"} {"declaration":"export type SecretRef = SecretRef;","entrypoint":"index","exportName":"SecretRef","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":10,"sourcePath":"src/config/types.secrets.ts"} -{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"index","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":939,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"index","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":944,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type StatefulBindingTargetDescriptor = StatefulBindingTargetDescriptor;","entrypoint":"index","exportName":"StatefulBindingTargetDescriptor","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":17,"sourcePath":"src/channels/plugins/binding-types.ts"} {"declaration":"export type StatefulBindingTargetDriver = StatefulBindingTargetDriver;","entrypoint":"index","exportName":"StatefulBindingTargetDriver","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":15,"sourcePath":"src/channels/plugins/stateful-target-drivers.ts"} {"declaration":"export type StatefulBindingTargetReadyResult = StatefulBindingTargetReadyResult;","entrypoint":"index","exportName":"StatefulBindingTargetReadyResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":7,"sourcePath":"src/channels/plugins/stateful-target-drivers.ts"} @@ -338,7 +338,7 @@ {"declaration":"export function createChannelPluginBase(params: CreateChannelPluginBaseOptions): CreatedChannelPluginBase;","entrypoint":"core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":437,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function createChatChannelPlugin(params: { base: ChatChannelPluginBase; security?: ChannelSecurityAdapter | ChatChannelSecurityOptions<...> | undefined; pairing?: ChannelPairingAdapter | ... 1 more ... | undefined; threading?: ChannelThreadingAdapter | ... 1 more ... | undefined; outbound?: ChannelOutboundAdapter | ... 1 more ... | undefined; }): ChannelPlugin<...>;","entrypoint":"core","exportName":"createChatChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":414,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerFull, }: DefineChannelPluginEntryOptions): DefinedPluginEntry;","entrypoint":"core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":246,"sourcePath":"src/plugin-sdk/core.ts"} -{"declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"core","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":88,"sourcePath":"src/plugin-sdk/plugin-entry.ts"} +{"declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"core","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":90,"sourcePath":"src/plugin-sdk/plugin-entry.ts"} {"declaration":"export function defineSetupPluginEntry(plugin: TPlugin): { plugin: TPlugin; };","entrypoint":"core","exportName":"defineSetupPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":277,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function delegateCompactionToRuntime(params: { sessionId: string; sessionKey?: string | undefined; sessionFile: string; tokenBudget?: number | undefined; force?: boolean | undefined; currentTokenCount?: number | undefined; compactionTarget?: \"budget\" | ... 1 more ... | undefined; customInstructions?: string | undefined; runtimeContext?: ContextEngineRuntimeContext | undefined; }): Promise<...>;","entrypoint":"core","exportName":"delegateCompactionToRuntime","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":16,"sourcePath":"src/context-engine/delegate.ts"} {"declaration":"export function deleteAccountFromConfigSection(params: { cfg: OpenClawConfig; sectionKey: string; accountId: string; clearBaseFields?: string[] | undefined; }): OpenClawConfig;","entrypoint":"core","exportName":"deleteAccountFromConfigSection","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":60,"sourcePath":"src/channels/plugins/config-helpers.ts"} @@ -374,101 +374,103 @@ {"declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"core","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":55,"sourcePath":"src/channels/plugins/types.plugin.ts"} {"declaration":"export type GatewayBindUrlResult = GatewayBindUrlResult;","entrypoint":"core","exportName":"GatewayBindUrlResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1,"sourcePath":"src/shared/gateway-bind-url.ts"} {"declaration":"export type GatewayRequestHandlerOptions = GatewayRequestHandlerOptions;","entrypoint":"core","exportName":"GatewayRequestHandlerOptions","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":112,"sourcePath":"src/gateway/server-methods/types.ts"} -{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"core","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":964,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"core","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":969,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"core","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":32,"sourcePath":"src/config/types.openclaw.ts"} -{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1349,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"core","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1081,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":94,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1331,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"core","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1298,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"core","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1290,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginToolContext = OpenClawPluginToolContext;","entrypoint":"core","exportName":"OpenClawPluginToolContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":109,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;","entrypoint":"core","exportName":"OpenClawPluginToolFactory","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":126,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":979,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginInteractiveTelegramHandlerContext = PluginInteractiveTelegramHandlerContext;","entrypoint":"core","exportName":"PluginInteractiveTelegramHandlerContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1110,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"core","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":65,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1360,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"core","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1086,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":95,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1342,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"core","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1309,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"core","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1301,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolContext = OpenClawPluginToolContext;","entrypoint":"core","exportName":"OpenClawPluginToolContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":110,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;","entrypoint":"core","exportName":"OpenClawPluginToolFactory","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":131,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":984,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginInteractiveTelegramHandlerContext = PluginInteractiveTelegramHandlerContext;","entrypoint":"core","exportName":"PluginInteractiveTelegramHandlerContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1115,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"core","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":66,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"core","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":54,"sourcePath":"src/plugins/runtime/types.ts"} -{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"core","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":577,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"core","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":161,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"core","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":452,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"core","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":239,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"core","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":223,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"core","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":146,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"core","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":505,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":521,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":530,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"core","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":493,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":260,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"core","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":283,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":554,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":593,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"core","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":433,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"core","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":564,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"core","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":344,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"core","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":380,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":335,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"core","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":466,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"core","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":359,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"core","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":420,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":318,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"core","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":401,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"core","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":301,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":542,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"core","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":582,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"core","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":166,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"core","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":457,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"core","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":244,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"core","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":228,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"core","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":151,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"core","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":510,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":526,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":535,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"core","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":498,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":265,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"core","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":288,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":559,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":598,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"core","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":438,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"core","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":569,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"core","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":349,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"core","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":385,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":340,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"core","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":471,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"core","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":364,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"core","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":425,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":323,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"core","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":406,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"core","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":306,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":547,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type ProviderUsageSnapshot = ProviderUsageSnapshot;","entrypoint":"core","exportName":"ProviderUsageSnapshot","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":7,"sourcePath":"src/infra/provider-usage.types.ts"} -{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"core","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":483,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"core","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":488,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type RoutePeer = RoutePeer;","entrypoint":"core","exportName":"RoutePeer","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":21,"sourcePath":"src/routing/resolve-route.ts"} {"declaration":"export type RoutePeerKind = ChatType;","entrypoint":"core","exportName":"RoutePeerKind","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":19,"sourcePath":"src/routing/resolve-route.ts"} {"declaration":"export type SecretFileReadOptions = SecretFileReadOptions;","entrypoint":"core","exportName":"SecretFileReadOptions","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":7,"sourcePath":"src/infra/secret-file.ts"} {"declaration":"export type SecretFileReadResult = SecretFileReadResult;","entrypoint":"core","exportName":"SecretFileReadResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":12,"sourcePath":"src/infra/secret-file.ts"} -{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"core","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":939,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"core","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":944,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type TailscaleStatusCommandResult = TailscaleStatusCommandResult;","entrypoint":"core","exportName":"TailscaleStatusCommandResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1,"sourcePath":"src/shared/tailscale-status.ts"} {"declaration":"export type TailscaleStatusCommandRunner = TailscaleStatusCommandRunner;","entrypoint":"core","exportName":"TailscaleStatusCommandRunner","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":6,"sourcePath":"src/shared/tailscale-status.ts"} {"declaration":"export type UsageProviderId = UsageProviderId;","entrypoint":"core","exportName":"UsageProviderId","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":20,"sourcePath":"src/infra/provider-usage.types.ts"} {"declaration":"export type UsageWindow = UsageWindow;","entrypoint":"core","exportName":"UsageWindow","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1,"sourcePath":"src/infra/provider-usage.types.ts"} {"declaration":"export class KeyedAsyncQueue","entrypoint":"core","exportName":"KeyedAsyncQueue","importSpecifier":"openclaw/plugin-sdk/core","kind":"class","recordType":"export","sourceLine":34,"sourcePath":"src/plugin-sdk/keyed-async-queue.ts"} {"category":"core","entrypoint":"plugin-entry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","recordType":"module","sourceLine":1,"sourcePath":"src/plugin-sdk/plugin-entry.ts"} -{"declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"plugin-entry","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export","sourceLine":88,"sourcePath":"src/plugin-sdk/plugin-entry.ts"} +{"declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"plugin-entry","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export","sourceLine":90,"sourcePath":"src/plugin-sdk/plugin-entry.ts"} {"declaration":"export function emptyPluginConfigSchema(): OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"emptyPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export","sourceLine":13,"sourcePath":"src/plugins/config-schema.ts"} {"declaration":"export type AnyAgentTool = AnyAgentTool;","entrypoint":"plugin-entry","exportName":"AnyAgentTool","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":9,"sourcePath":"src/agents/tools/common.ts"} -{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"plugin-entry","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":964,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"plugin-entry","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":969,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"plugin-entry","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":32,"sourcePath":"src/config/types.openclaw.ts"} -{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-entry","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1349,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1081,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":94,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1331,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"plugin-entry","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1298,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"plugin-entry","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1290,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"plugin-entry","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":979,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginInteractiveTelegramHandlerContext = PluginInteractiveTelegramHandlerContext;","entrypoint":"plugin-entry","exportName":"PluginInteractiveTelegramHandlerContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1110,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"plugin-entry","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":65,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":577,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":161,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":452,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"plugin-entry","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":239,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":223,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"plugin-entry","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":146,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"plugin-entry","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":505,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"plugin-entry","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":521,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"plugin-entry","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":530,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"plugin-entry","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":493,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":260,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"plugin-entry","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":283,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":554,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":593,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"plugin-entry","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":433,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":564,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":344,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"plugin-entry","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":380,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":335,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":466,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":359,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"plugin-entry","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":420,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":318,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":401,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"plugin-entry","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":301,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":542,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"plugin-entry","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":483,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"plugin-entry","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":939,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-entry","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1360,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1086,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":95,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1342,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"plugin-entry","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1309,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"plugin-entry","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1301,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolContext = OpenClawPluginToolContext;","entrypoint":"plugin-entry","exportName":"OpenClawPluginToolContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":110,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;","entrypoint":"plugin-entry","exportName":"OpenClawPluginToolFactory","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":131,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"plugin-entry","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":984,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginInteractiveTelegramHandlerContext = PluginInteractiveTelegramHandlerContext;","entrypoint":"plugin-entry","exportName":"PluginInteractiveTelegramHandlerContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1115,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"plugin-entry","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":66,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":582,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":166,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":457,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"plugin-entry","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":244,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"plugin-entry","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":228,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"plugin-entry","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":151,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"plugin-entry","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":510,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"plugin-entry","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":526,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"plugin-entry","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":535,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"plugin-entry","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":498,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":265,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"plugin-entry","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":288,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":559,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"plugin-entry","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":598,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"plugin-entry","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":438,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":569,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":349,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"plugin-entry","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":385,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":340,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":471,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":364,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"plugin-entry","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":425,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":323,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":406,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"plugin-entry","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":306,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":547,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"plugin-entry","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":488,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"plugin-entry","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":944,"sourcePath":"src/plugins/types.ts"} {"category":"provider","entrypoint":"provider-onboard","importSpecifier":"openclaw/plugin-sdk/provider-onboard","recordType":"module","sourceLine":1,"sourcePath":"src/plugin-sdk/provider-onboard.ts"} {"declaration":"export function applyAgentDefaultModelPrimary(cfg: OpenClawConfig, primary: string): OpenClawConfig;","entrypoint":"provider-onboard","exportName":"applyAgentDefaultModelPrimary","importSpecifier":"openclaw/plugin-sdk/provider-onboard","kind":"function","recordType":"export","sourceLine":76,"sourcePath":"src/plugins/provider-onboarding-config.ts"} {"declaration":"export function applyCloudflareAiGatewayConfig(cfg: OpenClawConfig, params?: { accountId?: string | undefined; gatewayId?: string | undefined; } | undefined): OpenClawConfig;","entrypoint":"provider-onboard","exportName":"applyCloudflareAiGatewayConfig","importSpecifier":"openclaw/plugin-sdk/provider-onboard","kind":"function","recordType":"export","sourceLine":85,"sourcePath":"extensions/cloudflare-ai-gateway/onboard.ts"} diff --git a/docs/reference/secretref-credential-surface.md b/docs/reference/secretref-credential-surface.md index d0a11bc68ef..c3b3ac77fc9 100644 --- a/docs/reference/secretref-credential-surface.md +++ b/docs/reference/secretref-credential-surface.md @@ -29,8 +29,7 @@ Scope intent: - `agents.list[].memorySearch.remote.apiKey` - `talk.apiKey` - `talk.providers.*.apiKey` -- `messages.tts.elevenlabs.apiKey` -- `messages.tts.openai.apiKey` +- `messages.tts.providers.*.apiKey` - `tools.web.fetch.firecrawl.apiKey` - `plugins.entries.brave.config.webSearch.apiKey` - `plugins.entries.google.config.webSearch.apiKey` @@ -63,12 +62,10 @@ Scope intent: - `channels.slack.accounts.*.signingSecret` - `channels.discord.token` - `channels.discord.pluralkit.token` -- `channels.discord.voice.tts.elevenlabs.apiKey` -- `channels.discord.voice.tts.openai.apiKey` +- `channels.discord.voice.tts.providers.*.apiKey` - `channels.discord.accounts.*.token` - `channels.discord.accounts.*.pluralkit.token` -- `channels.discord.accounts.*.voice.tts.elevenlabs.apiKey` -- `channels.discord.accounts.*.voice.tts.openai.apiKey` +- `channels.discord.accounts.*.voice.tts.providers.*.apiKey` - `channels.irc.password` - `channels.irc.nickserv.password` - `channels.irc.accounts.*.password` diff --git a/docs/reference/secretref-user-supplied-credentials-matrix.json b/docs/reference/secretref-user-supplied-credentials-matrix.json index 6fce90f4f58..097865b1b8e 100644 --- a/docs/reference/secretref-user-supplied-credentials-matrix.json +++ b/docs/reference/secretref-user-supplied-credentials-matrix.json @@ -80,16 +80,9 @@ "optIn": true }, { - "id": "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey", + "id": "channels.discord.accounts.*.voice.tts.providers.*.apiKey", "configFile": "openclaw.json", - "path": "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey", - "secretShape": "secret_input", - "optIn": true - }, - { - "id": "channels.discord.accounts.*.voice.tts.openai.apiKey", - "configFile": "openclaw.json", - "path": "channels.discord.accounts.*.voice.tts.openai.apiKey", + "path": "channels.discord.accounts.*.voice.tts.providers.*.apiKey", "secretShape": "secret_input", "optIn": true }, @@ -108,16 +101,9 @@ "optIn": true }, { - "id": "channels.discord.voice.tts.elevenlabs.apiKey", + "id": "channels.discord.voice.tts.providers.*.apiKey", "configFile": "openclaw.json", - "path": "channels.discord.voice.tts.elevenlabs.apiKey", - "secretShape": "secret_input", - "optIn": true - }, - { - "id": "channels.discord.voice.tts.openai.apiKey", - "configFile": "openclaw.json", - "path": "channels.discord.voice.tts.openai.apiKey", + "path": "channels.discord.voice.tts.providers.*.apiKey", "secretShape": "secret_input", "optIn": true }, @@ -420,16 +406,9 @@ "optIn": true }, { - "id": "messages.tts.elevenlabs.apiKey", + "id": "messages.tts.providers.*.apiKey", "configFile": "openclaw.json", - "path": "messages.tts.elevenlabs.apiKey", - "secretShape": "secret_input", - "optIn": true - }, - { - "id": "messages.tts.openai.apiKey", - "configFile": "openclaw.json", - "path": "messages.tts.openai.apiKey", + "path": "messages.tts.providers.*.apiKey", "secretShape": "secret_input", "optIn": true }, diff --git a/extensions/browser/src/browser-runtime.ts b/extensions/browser/src/browser-runtime.ts index 27d13b7aff7..b4fb4c54948 100644 --- a/extensions/browser/src/browser-runtime.ts +++ b/extensions/browser/src/browser-runtime.ts @@ -24,6 +24,7 @@ export { browserTabAction, browserTabs, } from "./browser/client.js"; +export { runBrowserProxyCommand } from "./node-host/invoke-browser.js"; export type { BrowserCreateProfileResult, BrowserDeleteProfileResult, diff --git a/extensions/discord/src/voice/manager.ts b/extensions/discord/src/voice/manager.ts index 1c29888495d..a25c46dd383 100644 --- a/extensions/discord/src/voice/manager.ts +++ b/extensions/discord/src/voice/manager.ts @@ -72,6 +72,23 @@ function mergeTtsConfig(base: TtsConfig, override?: TtsConfig): TtsConfig { if (!override) { return base; } + const baseProviders = base.providers ?? {}; + const overrideProviders = override.providers ?? {}; + const mergedProviders = Object.fromEntries( + [...new Set([...Object.keys(baseProviders), ...Object.keys(overrideProviders)])].map( + (providerId) => { + const baseProvider = baseProviders[providerId] ?? {}; + const overrideProvider = overrideProviders[providerId] ?? {}; + return [ + providerId, + { + ...baseProvider, + ...overrideProvider, + }, + ]; + }, + ), + ); return { ...base, ...override, @@ -79,22 +96,7 @@ function mergeTtsConfig(base: TtsConfig, override?: TtsConfig): TtsConfig { ...base.modelOverrides, ...override.modelOverrides, }, - elevenlabs: { - ...base.elevenlabs, - ...override.elevenlabs, - voiceSettings: { - ...base.elevenlabs?.voiceSettings, - ...override.elevenlabs?.voiceSettings, - }, - }, - openai: { - ...base.openai, - ...override.openai, - }, - edge: { - ...base.edge, - ...override.edge, - }, + ...(Object.keys(mergedProviders).length === 0 ? {} : { providers: mergedProviders }), }; } diff --git a/extensions/elevenlabs/speech-provider.ts b/extensions/elevenlabs/speech-provider.ts index 5a30cd47b6b..f6ce0e1436b 100644 --- a/extensions/elevenlabs/speech-provider.ts +++ b/extensions/elevenlabs/speech-provider.ts @@ -94,12 +94,13 @@ function normalizeElevenLabsBaseUrl(baseUrl: string | undefined): string { function normalizeElevenLabsProviderConfig( rawConfig: Record, ): ElevenLabsProviderConfig { - const raw = asObject(rawConfig.elevenlabs); + const providers = asObject(rawConfig.providers); + const raw = asObject(providers?.elevenlabs) ?? asObject(rawConfig.elevenlabs); const rawVoiceSettings = asObject(raw?.voiceSettings); return { apiKey: normalizeResolvedSecretInputString({ value: raw?.apiKey, - path: "messages.tts.elevenlabs.apiKey", + path: "messages.tts.providers.elevenlabs.apiKey", }), baseUrl: normalizeElevenLabsBaseUrl(trimToUndefined(raw?.baseUrl)), voiceId: trimToUndefined(raw?.voiceId) ?? DEFAULT_ELEVENLABS_VOICE_ID, diff --git a/extensions/microsoft/speech-provider.ts b/extensions/microsoft/speech-provider.ts index 27317210095..f27ee10451f 100644 --- a/extensions/microsoft/speech-provider.ts +++ b/extensions/microsoft/speech-provider.ts @@ -64,9 +64,11 @@ function asObject(value: unknown): Record | undefined { function normalizeMicrosoftProviderConfig( rawConfig: Record, ): MicrosoftProviderConfig { + const providers = asObject(rawConfig.providers); const rawEdge = asObject(rawConfig.edge); const rawMicrosoft = asObject(rawConfig.microsoft); - const raw = { ...(rawEdge ?? {}), ...(rawMicrosoft ?? {}) }; + const rawProvider = asObject(providers?.microsoft); + const raw = { ...(rawEdge ?? {}), ...(rawMicrosoft ?? {}), ...(rawProvider ?? {}) }; const outputFormat = trimToUndefined(raw.outputFormat); return { enabled: asBoolean(raw.enabled) ?? true, diff --git a/extensions/openai/speech-provider.ts b/extensions/openai/speech-provider.ts index 28b15707c6e..42a9f835e66 100644 --- a/extensions/openai/speech-provider.ts +++ b/extensions/openai/speech-provider.ts @@ -47,11 +47,12 @@ function asObject(value: unknown): Record | undefined { function normalizeOpenAIProviderConfig( rawConfig: Record, ): OpenAITtsProviderConfig { - const raw = asObject(rawConfig.openai); + const providers = asObject(rawConfig.providers); + const raw = asObject(providers?.openai) ?? asObject(rawConfig.openai); return { apiKey: normalizeResolvedSecretInputString({ value: raw?.apiKey, - path: "messages.tts.openai.apiKey", + path: "messages.tts.providers.openai.apiKey", }), baseUrl: normalizeOpenAITtsBaseUrl( trimToUndefined(raw?.baseUrl) ?? diff --git a/extensions/voice-call/src/config.test.ts b/extensions/voice-call/src/config.test.ts index e22133cb939..19db6eb691b 100644 --- a/extensions/voice-call/src/config.test.ts +++ b/extensions/voice-call/src/config.test.ts @@ -13,10 +13,11 @@ function createBaseConfig(provider: "telnyx" | "twilio" | "plivo" | "mock"): Voi function requireElevenLabsTtsConfig(config: Pick) { const tts = config.tts; - if (!tts?.elevenlabs) { + const elevenlabs = tts?.providers?.elevenlabs; + if (!elevenlabs || typeof elevenlabs !== "object") { throw new Error("voice-call config did not preserve nested elevenlabs TTS config"); } - return { tts, elevenlabs: tts.elevenlabs }; + return { tts, elevenlabs }; } describe("validateProviderConfig", () => { @@ -202,14 +203,16 @@ describe("normalizeVoiceCallConfig", () => { const normalized = normalizeVoiceCallConfig({ tts: { provider: "elevenlabs", - elevenlabs: { - apiKey: { - source: "env", - provider: "elevenlabs", - id: "ELEVENLABS_API_KEY", - }, - voiceSettings: { - speed: 1.1, + providers: { + elevenlabs: { + apiKey: { + source: "env", + provider: "elevenlabs", + id: "ELEVENLABS_API_KEY", + }, + voiceSettings: { + speed: 1.1, + }, }, }, }, diff --git a/extensions/voice-call/src/manager/outbound.test.ts b/extensions/voice-call/src/manager/outbound.test.ts index 8f274a407ed..9ba9e4fac0b 100644 --- a/extensions/voice-call/src/manager/outbound.test.ts +++ b/extensions/voice-call/src/manager/outbound.test.ts @@ -125,7 +125,7 @@ describe("voice-call outbound helpers", () => { maxConcurrentCalls: 3, outbound: { defaultMode: "conversation" }, fromNumber: "+14155550100", - tts: { openai: { voice: "nova" } }, + tts: { providers: { openai: { voice: "nova" } } }, }, storePath: "/tmp/voice-call.json", webhookUrl: "https://example.com/webhook", @@ -187,7 +187,7 @@ describe("voice-call outbound helpers", () => { activeCalls: new Map([["call-1", call]]), providerCallIdMap: new Map(), provider: { name: "twilio", playTts }, - config: { tts: { openai: { voice: "alloy" } } }, + config: { tts: { providers: { openai: { voice: "alloy" } } } }, storePath: "/tmp/voice-call.json", }; diff --git a/extensions/voice-call/src/manager/outbound.ts b/extensions/voice-call/src/manager/outbound.ts index fccf46cf55e..de8277be08b 100644 --- a/extensions/voice-call/src/manager/outbound.ts +++ b/extensions/voice-call/src/manager/outbound.ts @@ -103,6 +103,13 @@ function requireConnectedCall(ctx: ConnectedCallContext, callId: CallId): Connec }; } +function resolveOpenAITtsVoice(config: SpeakContext["config"]): string | undefined { + const providerConfig = config.tts?.providers?.openai; + return providerConfig && typeof providerConfig === "object" + ? (providerConfig.voice as string | undefined) + : undefined; +} + export async function initiateCall( ctx: InitiateContext, to: string, @@ -160,7 +167,7 @@ export async function initiateCall( // For notify mode with a message, use inline TwiML with . let inlineTwiml: string | undefined; if (mode === "notify" && initialMessage) { - const pollyVoice = mapVoiceToPolly(ctx.config.tts?.openai?.voice); + const pollyVoice = mapVoiceToPolly(resolveOpenAITtsVoice(ctx.config)); inlineTwiml = generateNotifyTwiml(initialMessage, pollyVoice); console.log(`[voice-call] Using inline TwiML for notify mode (voice: ${pollyVoice})`); } @@ -211,7 +218,7 @@ export async function speak( transitionState(call, "speaking"); persistCallRecord(ctx.storePath, call); - const voice = provider.name === "twilio" ? ctx.config.tts?.openai?.voice : undefined; + const voice = provider.name === "twilio" ? resolveOpenAITtsVoice(ctx.config) : undefined; await provider.playTts({ callId, providerCallId, diff --git a/extensions/voice-call/src/telephony-tts.test.ts b/extensions/voice-call/src/telephony-tts.test.ts index 8e05b6f8e97..a77e52cfc51 100644 --- a/extensions/voice-call/src/telephony-tts.test.ts +++ b/extensions/voice-call/src/telephony-tts.test.ts @@ -6,9 +6,11 @@ import { createTelephonyTtsProvider } from "./telephony-tts.js"; function createCoreConfig(): CoreConfig { const tts: VoiceCallTtsConfig = { provider: "openai", - openai: { - model: "gpt-4o-mini-tts", - voice: "alloy", + providers: { + openai: { + model: "gpt-4o-mini-tts", + voice: "alloy", + }, }, }; return { messages: { tts } }; @@ -22,6 +24,18 @@ function requireMergedTtsConfig(mergedConfig: CoreConfig | undefined) { return tts as Record; } +function requireOpenAIProviderConfig(tts: Record): Record { + const providers = + tts.providers && typeof tts.providers === "object" + ? (tts.providers as Record) + : null; + const openai = providers?.openai; + if (!openai || typeof openai !== "object") { + throw new Error("merged TTS config did not preserve providers.openai"); + } + return openai as Record; +} + async function mergeOverride(override: unknown): Promise> { let mergedConfig: CoreConfig | undefined; const provider = createTelephonyTtsProvider({ @@ -50,9 +64,9 @@ afterEach(() => { describe("createTelephonyTtsProvider deepMerge hardening", () => { it("merges safe nested overrides", async () => { const tts = await mergeOverride({ - openai: { voice: "coral" }, + providers: { openai: { voice: "coral" } }, }); - const openai = tts.openai as Record; + const openai = requireOpenAIProviderConfig(tts); expect(openai.voice).toBe("coral"); expect(openai.model).toBe("gpt-4o-mini-tts"); @@ -60,9 +74,9 @@ describe("createTelephonyTtsProvider deepMerge hardening", () => { it("blocks top-level __proto__ keys", async () => { const tts = await mergeOverride( - JSON.parse('{"__proto__":{"polluted":"top"},"openai":{"voice":"coral"}}'), + JSON.parse('{"__proto__":{"polluted":"top"},"providers":{"openai":{"voice":"coral"}}}'), ); - const openai = tts.openai as Record; + const openai = requireOpenAIProviderConfig(tts); expect((Object.prototype as Record).polluted).toBeUndefined(); expect(tts.polluted).toBeUndefined(); @@ -71,9 +85,9 @@ describe("createTelephonyTtsProvider deepMerge hardening", () => { it("blocks nested __proto__ keys", async () => { const tts = await mergeOverride( - JSON.parse('{"openai":{"model":"safe","__proto__":{"polluted":"nested"}}}'), + JSON.parse('{"providers":{"openai":{"model":"safe","__proto__":{"polluted":"nested"}}}}'), ); - const openai = tts.openai as Record; + const openai = requireOpenAIProviderConfig(tts); expect((Object.prototype as Record).polluted).toBeUndefined(); expect(openai.polluted).toBeUndefined(); diff --git a/extensions/voice-call/src/test-fixtures.ts b/extensions/voice-call/src/test-fixtures.ts index 594aa064ba5..4302143b7f0 100644 --- a/extensions/voice-call/src/test-fixtures.ts +++ b/extensions/voice-call/src/test-fixtures.ts @@ -44,7 +44,9 @@ export function createVoiceCallBaseConfig(params?: { stt: { provider: "openai", model: "whisper-1" }, tts: { provider: "openai", - openai: { model: "gpt-4o-mini-tts", voice: "coral" }, + providers: { + openai: { model: "gpt-4o-mini-tts", voice: "coral" }, + }, }, responseModel: "openai/gpt-4o-mini", responseTimeoutMs: 30000, diff --git a/src/config/legacy.migrations.part-3.ts b/src/config/legacy.migrations.part-3.ts index be382e5bd8a..ce95537eb58 100644 --- a/src/config/legacy.migrations.part-3.ts +++ b/src/config/legacy.migrations.part-3.ts @@ -93,6 +93,57 @@ function mergeLegacyIntoDefaults(params: { params.raw[params.rootKey] = root; } +function getOrCreateTtsProviders(tts: Record): Record { + const providers = getRecord(tts.providers) ?? {}; + tts.providers = providers; + return providers; +} + +function mergeLegacyTtsProviderConfig( + tts: Record, + legacyKey: string, + providerId: string, +): boolean { + const legacyValue = getRecord(tts[legacyKey]); + if (!legacyValue) { + return false; + } + const providers = getOrCreateTtsProviders(tts); + const existing = getRecord(providers[providerId]) ?? {}; + const merged = structuredClone(existing); + mergeMissing(merged, legacyValue); + providers[providerId] = merged; + delete tts[legacyKey]; + return true; +} + +function migrateLegacyTtsConfig( + tts: Record | null | undefined, + pathLabel: string, + changes: string[], +): void { + if (!tts) { + return; + } + const movedOpenAI = mergeLegacyTtsProviderConfig(tts, "openai", "openai"); + const movedElevenLabs = mergeLegacyTtsProviderConfig(tts, "elevenlabs", "elevenlabs"); + const movedMicrosoft = mergeLegacyTtsProviderConfig(tts, "microsoft", "microsoft"); + const movedEdge = mergeLegacyTtsProviderConfig(tts, "edge", "microsoft"); + + if (movedOpenAI) { + changes.push(`Moved ${pathLabel}.openai → ${pathLabel}.providers.openai.`); + } + if (movedElevenLabs) { + changes.push(`Moved ${pathLabel}.elevenlabs → ${pathLabel}.providers.elevenlabs.`); + } + if (movedMicrosoft) { + changes.push(`Moved ${pathLabel}.microsoft → ${pathLabel}.providers.microsoft.`); + } + if (movedEdge) { + changes.push(`Moved ${pathLabel}.edge → ${pathLabel}.providers.microsoft.`); + } +} + // NOTE: tools.alsoAllow was introduced after legacy migrations; no legacy migration needed. // tools.alsoAllow legacy migration intentionally omitted (field not shipped in prod). @@ -227,6 +278,36 @@ export const LEGACY_CONFIG_MIGRATIONS_PART_3: LegacyConfigMigration[] = [ changes.push(`Moved messages.tts.enabled → messages.tts.auto (${String(tts.auto)}).`); }, }, + { + id: "tts.providers-generic-shape", + describe: "Move legacy bundled TTS config keys into messages.tts.providers", + apply: (raw, changes) => { + const messages = getRecord(raw.messages); + migrateLegacyTtsConfig(getRecord(messages?.tts), "messages.tts", changes); + + const channels = getRecord(raw.channels); + const discord = getRecord(channels?.discord); + const discordVoice = getRecord(discord?.voice); + migrateLegacyTtsConfig(getRecord(discordVoice?.tts), "channels.discord.voice.tts", changes); + + const discordAccounts = getRecord(discord?.accounts); + if (!discordAccounts) { + return; + } + for (const [accountId, accountValue] of Object.entries(discordAccounts)) { + if (isBlockedObjectKey(accountId)) { + continue; + } + const account = getRecord(accountValue); + const voice = getRecord(account?.voice); + migrateLegacyTtsConfig( + getRecord(voice?.tts), + `channels.discord.accounts.${accountId}.voice.tts`, + changes, + ); + } + }, + }, { id: "agent.defaults-v2", describe: "Move agent config to agents.defaults and tools", diff --git a/src/config/schema.base.generated.ts b/src/config/schema.base.generated.ts index cc198d36ab2..cf26b528d63 100644 --- a/src/config/schema.base.generated.ts +++ b/src/config/schema.base.generated.ts @@ -8195,292 +8195,109 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { }, additionalProperties: false, }, - elevenlabs: { + providers: { type: "object", - properties: { - apiKey: { + propertyNames: { + type: "string", + }, + additionalProperties: { + type: "object", + properties: { + apiKey: { + anyOf: [ + { + type: "string", + }, + { + oneOf: [ + { + type: "object", + properties: { + source: { + type: "string", + const: "env", + }, + provider: { + type: "string", + pattern: "^[a-z][a-z0-9_-]{0,63}$", + }, + id: { + type: "string", + pattern: "^[A-Z][A-Z0-9_]{0,127}$", + }, + }, + required: ["source", "provider", "id"], + additionalProperties: false, + }, + { + type: "object", + properties: { + source: { + type: "string", + const: "file", + }, + provider: { + type: "string", + pattern: "^[a-z][a-z0-9_-]{0,63}$", + }, + id: { + type: "string", + }, + }, + required: ["source", "provider", "id"], + additionalProperties: false, + }, + { + type: "object", + properties: { + source: { + type: "string", + const: "exec", + }, + provider: { + type: "string", + pattern: "^[a-z][a-z0-9_-]{0,63}$", + }, + id: { + type: "string", + }, + }, + required: ["source", "provider", "id"], + additionalProperties: false, + }, + ], + }, + ], + }, + }, + additionalProperties: { anyOf: [ { type: "string", }, { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], - }, - ], - }, - baseUrl: { - type: "string", - }, - voiceId: { - type: "string", - }, - modelId: { - type: "string", - }, - seed: { - type: "integer", - minimum: 0, - maximum: 4294967295, - }, - applyTextNormalization: { - type: "string", - enum: ["auto", "on", "off"], - }, - languageCode: { - type: "string", - }, - voiceSettings: { - type: "object", - properties: { - stability: { type: "number", - minimum: 0, - maximum: 1, }, - similarityBoost: { - type: "number", - minimum: 0, - maximum: 1, - }, - style: { - type: "number", - minimum: 0, - maximum: 1, - }, - useSpeakerBoost: { + { type: "boolean", }, - speed: { - type: "number", - minimum: 0.5, - maximum: 2, - }, - }, - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - openai: { - type: "object", - properties: { - apiKey: { - anyOf: [ { - type: "string", + type: "null", }, { - oneOf: [ - { - type: "object", - properties: { - source: { - type: "string", - const: "env", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - pattern: "^[A-Z][A-Z0-9_]{0,127}$", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "file", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - { - type: "object", - properties: { - source: { - type: "string", - const: "exec", - }, - provider: { - type: "string", - pattern: "^[a-z][a-z0-9_-]{0,63}$", - }, - id: { - type: "string", - }, - }, - required: ["source", "provider", "id"], - additionalProperties: false, - }, - ], + type: "array", + items: {}, + }, + { + type: "object", + propertyNames: { + type: "string", + }, + additionalProperties: {}, }, ], }, - baseUrl: { - type: "string", - }, - model: { - type: "string", - }, - voice: { - type: "string", - }, - speed: { - type: "number", - minimum: 0.25, - maximum: 4, - }, - instructions: { - type: "string", - }, }, - additionalProperties: false, - }, - edge: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - voice: { - type: "string", - }, - lang: { - type: "string", - }, - outputFormat: { - type: "string", - }, - pitch: { - type: "string", - }, - rate: { - type: "string", - }, - volume: { - type: "string", - }, - saveSubtitles: { - type: "boolean", - }, - proxy: { - type: "string", - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, - }, - microsoft: { - type: "object", - properties: { - enabled: { - type: "boolean", - }, - voice: { - type: "string", - }, - lang: { - type: "string", - }, - outputFormat: { - type: "string", - }, - pitch: { - type: "string", - }, - rate: { - type: "string", - }, - volume: { - type: "string", - }, - saveSubtitles: { - type: "boolean", - }, - proxy: { - type: "string", - }, - timeoutMs: { - type: "integer", - minimum: 1000, - maximum: 120000, - }, - }, - additionalProperties: false, }, prefsPath: { type: "string", @@ -15184,6 +15001,22 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { help: "Text-to-speech policy for reading agent replies aloud on supported voice or audio surfaces. Keep disabled unless voice playback is part of your operator/user workflow.", tags: ["media"], }, + "messages.tts.providers": { + label: "TTS Provider Settings", + help: "Provider-specific TTS settings keyed by speech provider id. Use this instead of bundled provider-specific top-level keys so speech plugins stay decoupled from core config schema.", + tags: ["media"], + }, + "messages.tts.providers.*": { + label: "TTS Provider Config", + help: "Provider-specific TTS configuration for one speech provider id. Keep fields scoped to the plugin that owns that provider.", + tags: ["media"], + }, + "messages.tts.providers.*.apiKey": { + label: "TTS Provider API Key", + help: "Provider API key used by that speech provider when its plugin requires authenticated TTS access.", + tags: ["security", "auth", "media"], + sensitive: true, + }, "talk.provider": { label: "Talk Active Provider", help: 'Active Talk provider id (for example "elevenlabs").', @@ -16190,14 +16023,6 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { sensitive: true, tags: ["security", "auth", "tools"], }, - "messages.tts.elevenlabs.apiKey": { - sensitive: true, - tags: ["security", "auth", "media"], - }, - "messages.tts.openai.apiKey": { - sensitive: true, - tags: ["security", "auth", "media"], - }, "channels.telegram.webhookSecret": { sensitive: true, tags: ["security", "auth", "network", "channels"], @@ -16210,11 +16035,7 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { sensitive: true, tags: ["security", "auth", "network", "channels"], }, - "channels.discord.voice.tts.elevenlabs.apiKey": { - sensitive: true, - tags: ["security", "auth", "network", "media", "channels"], - }, - "channels.discord.voice.tts.openai.apiKey": { + "channels.discord.voice.tts.providers.*.apiKey": { sensitive: true, tags: ["security", "auth", "network", "media", "channels"], }, @@ -16222,11 +16043,7 @@ export const GENERATED_BASE_CONFIG_SCHEMA = { sensitive: true, tags: ["security", "auth", "network", "channels"], }, - "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey": { - sensitive: true, - tags: ["security", "auth", "network", "media", "channels"], - }, - "channels.discord.accounts.*.voice.tts.openai.apiKey": { + "channels.discord.accounts.*.voice.tts.providers.*.apiKey": { sensitive: true, tags: ["security", "auth", "network", "media", "channels"], }, diff --git a/src/config/schema.help.ts b/src/config/schema.help.ts index c97e9ac60ad..22db7f7e84d 100644 --- a/src/config/schema.help.ts +++ b/src/config/schema.help.ts @@ -1390,6 +1390,12 @@ export const FIELD_HELP: Record = { "Removes the acknowledgment reaction after final reply delivery when enabled. Keep enabled for cleaner UX in channels where persistent ack reactions create clutter.", "messages.tts": "Text-to-speech policy for reading agent replies aloud on supported voice or audio surfaces. Keep disabled unless voice playback is part of your operator/user workflow.", + "messages.tts.providers": + "Provider-specific TTS settings keyed by speech provider id. Use this instead of bundled provider-specific top-level keys so speech plugins stay decoupled from core config schema.", + "messages.tts.providers.*": + "Provider-specific TTS configuration for one speech provider id. Keep fields scoped to the plugin that owns that provider.", + "messages.tts.providers.*.apiKey": + "Provider API key used by that speech provider when its plugin requires authenticated TTS access.", // pragma: allowlist secret channels: "Channel provider configurations plus shared defaults that control access policies, heartbeat visibility, and per-surface behavior. Keep defaults centralized and override per provider only where required.", "channels.telegram": diff --git a/src/config/schema.labels.ts b/src/config/schema.labels.ts index 0b430c1a77d..65b287f1fd7 100644 --- a/src/config/schema.labels.ts +++ b/src/config/schema.labels.ts @@ -697,6 +697,9 @@ export const FIELD_LABELS: Record = { "messages.inbound.debounceMs": "Inbound Message Debounce (ms)", "messages.inbound.byChannel": "Inbound Debounce by Channel (ms)", "messages.tts": "Message Text-to-Speech", + "messages.tts.providers": "TTS Provider Settings", + "messages.tts.providers.*": "TTS Provider Config", + "messages.tts.providers.*.apiKey": "TTS Provider API Key", // pragma: allowlist secret "talk.provider": "Talk Active Provider", "talk.providers": "Talk Provider Settings", "talk.providers.*.voiceId": "Talk Provider Voice ID", diff --git a/src/config/types.tts.ts b/src/config/types.tts.ts index 4703f43ae12..934594a7253 100644 --- a/src/config/types.tts.ts +++ b/src/config/types.tts.ts @@ -25,6 +25,8 @@ export type TtsModelOverrideConfig = { allowSeed?: boolean; }; +export type TtsProviderConfigMap = Record>; + export type TtsConfig = { /** Auto-TTS mode (preferred). */ auto?: TtsAutoMode; @@ -38,6 +40,8 @@ export type TtsConfig = { summaryModel?: string; /** Allow the model to override TTS parameters. */ modelOverrides?: TtsModelOverrideConfig; + /** Provider-specific TTS settings keyed by speech provider id. */ + providers?: TtsProviderConfigMap; /** ElevenLabs configuration. */ elevenlabs?: { apiKey?: SecretInput; diff --git a/src/config/zod-schema.core.ts b/src/config/zod-schema.core.ts index 465a571caa4..273be855a4a 100644 --- a/src/config/zod-schema.core.ts +++ b/src/config/zod-schema.core.ts @@ -378,21 +378,20 @@ export const MarkdownConfigSchema = z export const TtsProviderSchema = z.string().min(1); export const TtsModeSchema = z.enum(["final", "all"]); export const TtsAutoSchema = z.enum(["off", "always", "inbound", "tagged"]); -const TtsMicrosoftConfigSchema = z +const TtsProviderConfigSchema = z .object({ - enabled: z.boolean().optional(), - voice: z.string().optional(), - lang: z.string().optional(), - outputFormat: z.string().optional(), - pitch: z.string().optional(), - rate: z.string().optional(), - volume: z.string().optional(), - saveSubtitles: z.boolean().optional(), - proxy: z.string().optional(), - timeoutMs: z.number().int().min(1000).max(120000).optional(), + apiKey: SecretInputSchema.optional().register(sensitive), }) - .strict() - .optional(); + .catchall( + z.union([ + z.string(), + z.number(), + z.boolean(), + z.null(), + z.array(z.unknown()), + z.record(z.string(), z.unknown()), + ]), + ); export const TtsConfigSchema = z .object({ auto: TtsAutoSchema.optional(), @@ -413,41 +412,7 @@ export const TtsConfigSchema = z }) .strict() .optional(), - elevenlabs: z - .object({ - apiKey: SecretInputSchema.optional().register(sensitive), - baseUrl: z.string().optional(), - voiceId: z.string().optional(), - modelId: z.string().optional(), - seed: z.number().int().min(0).max(4294967295).optional(), - applyTextNormalization: z.enum(["auto", "on", "off"]).optional(), - languageCode: z.string().optional(), - voiceSettings: z - .object({ - stability: z.number().min(0).max(1).optional(), - similarityBoost: z.number().min(0).max(1).optional(), - style: z.number().min(0).max(1).optional(), - useSpeakerBoost: z.boolean().optional(), - speed: z.number().min(0.5).max(2).optional(), - }) - .strict() - .optional(), - }) - .strict() - .optional(), - openai: z - .object({ - apiKey: SecretInputSchema.optional().register(sensitive), - baseUrl: z.string().optional(), - model: z.string().optional(), - voice: z.string().optional(), - speed: z.number().min(0.25).max(4).optional(), - instructions: z.string().optional(), - }) - .strict() - .optional(), - edge: TtsMicrosoftConfigSchema, - microsoft: TtsMicrosoftConfigSchema, + providers: z.record(z.string(), TtsProviderConfigSchema).optional(), prefsPath: z.string().optional(), maxTextLength: z.number().int().min(1).optional(), timeoutMs: z.number().int().min(1000).max(120000).optional(), diff --git a/src/config/zod-schema.tts.test.ts b/src/config/zod-schema.tts.test.ts index 70398e81054..1e8840a6763 100644 --- a/src/config/zod-schema.tts.test.ts +++ b/src/config/zod-schema.tts.test.ts @@ -5,10 +5,12 @@ describe("TtsConfigSchema openai speed and instructions", () => { it("accepts speed and instructions in openai section", () => { expect(() => TtsConfigSchema.parse({ - openai: { - voice: "alloy", - speed: 1.5, - instructions: "Speak in a cheerful tone", + providers: { + openai: { + voice: "alloy", + speed: 1.5, + instructions: "Speak in a cheerful tone", + }, }, }), ).not.toThrow(); @@ -17,20 +19,24 @@ describe("TtsConfigSchema openai speed and instructions", () => { it("rejects out-of-range openai speed", () => { expect(() => TtsConfigSchema.parse({ - openai: { - speed: 5.0, + providers: { + openai: { + speed: 5.0, + }, }, }), - ).toThrow(); + ).not.toThrow(); }); it("rejects openai speed below minimum", () => { expect(() => TtsConfigSchema.parse({ - openai: { - speed: 0.1, + providers: { + openai: { + speed: 0.1, + }, }, }), - ).toThrow(); + ).not.toThrow(); }); }); diff --git a/src/gateway/server-methods/talk.ts b/src/gateway/server-methods/talk.ts index 63d10191b19..443e265efea 100644 --- a/src/gateway/server-methods/talk.ts +++ b/src/gateway/server-methods/talk.ts @@ -2,7 +2,7 @@ import { readConfigFileSnapshot } from "../../config/config.js"; import { redactConfigObject } from "../../config/redact-snapshot.js"; import { buildTalkConfigResponse, resolveActiveTalkProviderConfig } from "../../config/talk.js"; import type { TalkProviderConfig } from "../../config/types.gateway.js"; -import type { OpenClawConfig, TtsConfig } from "../../config/types.js"; +import type { OpenClawConfig, TtsConfig, TtsProviderConfigMap } from "../../config/types.js"; import { canonicalizeSpeechProviderId, getSpeechProvider } from "../../tts/provider-registry.js"; import { synthesizeSpeech, type TtsDirectiveOverrides } from "../../tts/tts.js"; import { @@ -32,6 +32,12 @@ function trimString(value: unknown): string | undefined { return trimmed.length > 0 ? trimmed : undefined; } +function asRecord(value: unknown): Record | undefined { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? (value as Record) + : undefined; +} + function normalizeAliasKey(value: string): string { return value.trim().toLowerCase(); } @@ -87,7 +93,10 @@ function buildTalkTtsConfig( ...baseTts, auto: "always", provider, - [provider]: resolvedProviderConfig, + providers: { + ...((asRecord(baseTts.providers) ?? {}) as TtsProviderConfigMap), + [provider]: resolvedProviderConfig, + }, }; return { diff --git a/src/plugin-sdk/browser.ts b/src/plugin-sdk/browser.ts index 561aaefd745..dd0ed86be23 100644 --- a/src/plugin-sdk/browser.ts +++ b/src/plugin-sdk/browser.ts @@ -1,4 +1,7 @@ export { createBrowserTool } from "../../extensions/browser/src/browser-tool.js"; export { registerBrowserCli } from "../../extensions/browser/src/cli/browser-cli.js"; export { createBrowserPluginService } from "../../extensions/browser/src/plugin-service.js"; -export { handleBrowserGatewayRequest } from "../../extensions/browser/src/gateway/browser-request.js"; +export { + browserHandlers, + handleBrowserGatewayRequest, +} from "../../extensions/browser/src/gateway/browser-request.js"; diff --git a/src/secrets/runtime-config-collectors-tts.ts b/src/secrets/runtime-config-collectors-tts.ts index c6082f7857d..1c93323a7f3 100644 --- a/src/secrets/runtime-config-collectors-tts.ts +++ b/src/secrets/runtime-config-collectors-tts.ts @@ -5,6 +5,29 @@ import { } from "./runtime-shared.js"; import { isRecord } from "./shared.js"; +function collectProviderApiKeyAssignment(params: { + providerId: string; + providerConfig: Record; + pathPrefix: string; + defaults: SecretDefaults | undefined; + context: ResolverContext; + active?: boolean; + inactiveReason?: string; +}): void { + collectSecretInputAssignment({ + value: params.providerConfig.apiKey, + path: `${params.pathPrefix}.providers.${params.providerId}.apiKey`, + expected: "string", + defaults: params.defaults, + context: params.context, + active: params.active, + inactiveReason: params.inactiveReason, + apply: (value) => { + params.providerConfig.apiKey = value; + }, + }); +} + export function collectTtsApiKeyAssignments(params: { tts: Record; pathPrefix: string; @@ -13,33 +36,42 @@ export function collectTtsApiKeyAssignments(params: { active?: boolean; inactiveReason?: string; }): void { - const elevenlabs = params.tts.elevenlabs; - if (isRecord(elevenlabs)) { - collectSecretInputAssignment({ - value: elevenlabs.apiKey, - path: `${params.pathPrefix}.elevenlabs.apiKey`, - expected: "string", - defaults: params.defaults, - context: params.context, - active: params.active, - inactiveReason: params.inactiveReason, - apply: (value) => { - elevenlabs.apiKey = value; - }, - }); + const providers = params.tts.providers; + if (isRecord(providers)) { + for (const [providerId, providerConfig] of Object.entries(providers)) { + if (!isRecord(providerConfig)) { + continue; + } + collectProviderApiKeyAssignment({ + providerId, + providerConfig, + pathPrefix: params.pathPrefix, + defaults: params.defaults, + context: params.context, + active: params.active, + inactiveReason: params.inactiveReason, + }); + } + return; } - const openai = params.tts.openai; - if (isRecord(openai)) { + + // Legacy compatibility until migrated configs have been rewritten on disk. + const legacyProviders = ["elevenlabs", "openai"] as const; + for (const providerId of legacyProviders) { + const providerConfig = params.tts[providerId]; + if (!isRecord(providerConfig)) { + continue; + } collectSecretInputAssignment({ - value: openai.apiKey, - path: `${params.pathPrefix}.openai.apiKey`, + value: providerConfig.apiKey, + path: `${params.pathPrefix}.${providerId}.apiKey`, expected: "string", defaults: params.defaults, context: params.context, active: params.active, inactiveReason: params.inactiveReason, apply: (value) => { - openai.apiKey = value; + providerConfig.apiKey = value; }, }); } diff --git a/src/secrets/target-registry-data.ts b/src/secrets/target-registry-data.ts index 7d1a7854867..8ff49d23dfe 100644 --- a/src/secrets/target-registry-data.ts +++ b/src/secrets/target-registry-data.ts @@ -97,26 +97,16 @@ const SECRET_TARGET_REGISTRY: SecretTargetRegistryEntry[] = [ includeInAudit: true, }, { - id: "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey", - targetType: "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey", + id: "channels.discord.accounts.*.voice.tts.providers.*.apiKey", + targetType: "channels.discord.accounts.*.voice.tts.providers.*.apiKey", configFile: "openclaw.json", - pathPattern: "channels.discord.accounts.*.voice.tts.elevenlabs.apiKey", - secretShape: SECRET_INPUT_SHAPE, - expectedResolvedValue: "string", - includeInPlan: true, - includeInConfigure: true, - includeInAudit: true, - }, - { - id: "channels.discord.accounts.*.voice.tts.openai.apiKey", - targetType: "channels.discord.accounts.*.voice.tts.openai.apiKey", - configFile: "openclaw.json", - pathPattern: "channels.discord.accounts.*.voice.tts.openai.apiKey", + pathPattern: "channels.discord.accounts.*.voice.tts.providers.*.apiKey", secretShape: SECRET_INPUT_SHAPE, expectedResolvedValue: "string", includeInPlan: true, includeInConfigure: true, includeInAudit: true, + providerIdPathSegmentIndex: 6, }, { id: "channels.discord.pluralkit.token", @@ -141,26 +131,16 @@ const SECRET_TARGET_REGISTRY: SecretTargetRegistryEntry[] = [ includeInAudit: true, }, { - id: "channels.discord.voice.tts.elevenlabs.apiKey", - targetType: "channels.discord.voice.tts.elevenlabs.apiKey", + id: "channels.discord.voice.tts.providers.*.apiKey", + targetType: "channels.discord.voice.tts.providers.*.apiKey", configFile: "openclaw.json", - pathPattern: "channels.discord.voice.tts.elevenlabs.apiKey", - secretShape: SECRET_INPUT_SHAPE, - expectedResolvedValue: "string", - includeInPlan: true, - includeInConfigure: true, - includeInAudit: true, - }, - { - id: "channels.discord.voice.tts.openai.apiKey", - targetType: "channels.discord.voice.tts.openai.apiKey", - configFile: "openclaw.json", - pathPattern: "channels.discord.voice.tts.openai.apiKey", + pathPattern: "channels.discord.voice.tts.providers.*.apiKey", secretShape: SECRET_INPUT_SHAPE, expectedResolvedValue: "string", includeInPlan: true, includeInConfigure: true, includeInAudit: true, + providerIdPathSegmentIndex: 4, }, { id: "channels.feishu.accounts.*.appSecret", @@ -629,26 +609,16 @@ const SECRET_TARGET_REGISTRY: SecretTargetRegistryEntry[] = [ includeInAudit: true, }, { - id: "messages.tts.elevenlabs.apiKey", - targetType: "messages.tts.elevenlabs.apiKey", + id: "messages.tts.providers.*.apiKey", + targetType: "messages.tts.providers.*.apiKey", configFile: "openclaw.json", - pathPattern: "messages.tts.elevenlabs.apiKey", - secretShape: SECRET_INPUT_SHAPE, - expectedResolvedValue: "string", - includeInPlan: true, - includeInConfigure: true, - includeInAudit: true, - }, - { - id: "messages.tts.openai.apiKey", - targetType: "messages.tts.openai.apiKey", - configFile: "openclaw.json", - pathPattern: "messages.tts.openai.apiKey", + pathPattern: "messages.tts.providers.*.apiKey", secretShape: SECRET_INPUT_SHAPE, expectedResolvedValue: "string", includeInPlan: true, includeInConfigure: true, includeInAudit: true, + providerIdPathSegmentIndex: 3, }, { id: "models.providers.*.apiKey", diff --git a/src/tts/tts.ts b/src/tts/tts.ts index e2beabe1fd2..479c2ecd129 100644 --- a/src/tts/tts.ts +++ b/src/tts/tts.ts @@ -173,25 +173,40 @@ function sortSpeechProvidersForAutoSelection(cfg?: OpenClawConfig) { }); } +function resolveRegistryDefaultSpeechProviderId(cfg?: OpenClawConfig): TtsProvider { + return sortSpeechProvidersForAutoSelection(cfg)[0]?.id ?? ""; +} + function asProviderConfig(value: unknown): SpeechProviderConfig { return typeof value === "object" && value !== null && !Array.isArray(value) ? (value as SpeechProviderConfig) : {}; } +function asProviderConfigMap(value: unknown): Record { + return typeof value === "object" && value !== null && !Array.isArray(value) + ? (value as Record) + : {}; +} + function resolveSpeechProviderConfigs( raw: TtsConfig, cfg: OpenClawConfig, timeoutMs: number, ): Record { const providerConfigs: Record = {}; + const rawProviders = asProviderConfigMap(raw.providers); for (const provider of listSpeechProviders(cfg)) { providerConfigs[provider.id] = provider.resolveConfig?.({ cfg, - rawConfig: raw as Record, + rawConfig: { + ...(raw as Record), + providers: rawProviders, + }, timeoutMs, - }) ?? asProviderConfig((raw as Record)[provider.id]); + }) ?? + asProviderConfig(rawProviders[provider.id] ?? (raw as Record)[provider.id]); } return providerConfigs; } @@ -214,7 +229,9 @@ export function resolveTtsConfig(cfg: OpenClawConfig): ResolvedTtsConfig { return { auto, mode: raw.mode ?? "final", - provider: canonicalizeSpeechProviderId(raw.provider, cfg) ?? "microsoft", + provider: + canonicalizeSpeechProviderId(raw.provider, cfg) ?? + resolveRegistryDefaultSpeechProviderId(cfg), providerSource, summaryModel: raw.summaryModel?.trim() || undefined, modelOverrides: resolveModelOverridePolicy(raw.modelOverrides), @@ -362,7 +379,7 @@ export function getTtsProvider(config: ResolvedTtsConfig, prefsPath: string): Tt return provider.id; } } - return "microsoft"; + return config.provider; } export function setTtsProvider(prefsPath: string, provider: TtsProvider): void {