From eb9051cc7c07b87eb841d83ff509be3219bf0cba Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 4 Apr 2026 04:25:36 +0100 Subject: [PATCH] refactor(openai): move native transport policy into extension --- CHANGELOG.md | 2 +- docs/.generated/plugin-sdk-api-baseline.json | 349 +++++++++++------- docs/.generated/plugin-sdk-api-baseline.jsonl | 261 ++++++------- docs/plugins/sdk-provider-plugins.md | 60 ++- docs/providers/openai.md | 10 + extensions/openai/openai-codex-provider.ts | 6 + extensions/openai/openai-provider.ts | 6 + extensions/openai/transport-policy.test.ts | 107 ++++++ extensions/openai/transport-policy.ts | 118 ++++++ src/agents/openai-transport-stream.test.ts | 62 ++++ src/agents/openai-transport-stream.ts | 82 +++- src/agents/openai-ws-connection.test.ts | 21 ++ src/agents/openai-ws-connection.ts | 12 +- src/agents/openai-ws-request.ts | 4 + src/agents/openai-ws-stream.test.ts | 118 +++++- src/agents/openai-ws-stream.ts | 266 +++++++++++-- src/agents/transport-stream-shared.ts | 20 + src/plugin-sdk/core.ts | 4 + src/plugin-sdk/plugin-entry.ts | 8 + src/plugins/provider-runtime.ts | 28 ++ src/plugins/types.ts | 71 ++++ 21 files changed, 1310 insertions(+), 305 deletions(-) create mode 100644 extensions/openai/transport-policy.test.ts create mode 100644 extensions/openai/transport-policy.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a79cc6d55c4..4e9c778707d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,7 +24,7 @@ Docs: https://docs.openclaw.ai ### Fixes -- Providers/OpenAI: preserve native `reasoning.effort: "none"` and strict tool schemas on direct OpenAI-family endpoints, keep OpenAI-compatible proxies on the older compat shim path, fix Responses WebSocket warm-up payloads, and retry one early retryable WebSocket failure before HTTP fallback while keeping forced WebSocket errors explicit. +- Providers/OpenAI: preserve native `reasoning.effort: "none"` and strict tool schemas on direct OpenAI-family endpoints, keep OpenAI-compatible proxies on the older compat shim path, fix Responses WebSocket warm-up payloads, keep native OpenAI/Codex/Azure turns on stable session and turn identity headers/metadata, and hold auto-mode WebSocket sessions on SSE during a short cool-down after early WebSocket failure while keeping forced WebSocket errors explicit. - Providers/OpenAI Codex: split native `contextWindow` from runtime `contextTokens` for `openai-codex/gpt-5.4`, keep the default effective cap at `272000`, and expose a per-model config override via `models.providers.*.models[].contextTokens`. - Android/Talk Mode: restore spoken assistant replies on node-scoped sessions by keeping reply routing synced to the resolved node session key and pausing mic capture during reply playback. (#60306) Thanks @MKV21. - Agents/fallback: persist selected fallback overrides before retry attempts start, prefer persisted overrides during live-session reconciliation, and keep provider-scoped auth-profile failover from snapping retries back to stale primary selections. diff --git a/docs/.generated/plugin-sdk-api-baseline.json b/docs/.generated/plugin-sdk-api-baseline.json index 629e02ecaea..2e9552496f6 100644 --- a/docs/.generated/plugin-sdk-api-baseline.json +++ b/docs/.generated/plugin-sdk-api-baseline.json @@ -271,7 +271,7 @@ "exportName": "CliBackendPlugin", "kind": "type", "source": { - "line": 1752, + "line": 1871, "path": "src/plugins/types.ts" } }, @@ -415,7 +415,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 1529, + "line": 1648, "path": "src/plugins/types.ts" } }, @@ -433,7 +433,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1796, + "line": 1915, "path": "src/plugins/types.ts" } }, @@ -442,7 +442,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 100, + "line": 116, "path": "src/plugins/types.ts" } }, @@ -451,7 +451,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 71, + "line": 87, "path": "src/plugins/types.ts" } }, @@ -496,7 +496,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 175, + "line": 191, "path": "src/plugins/types.ts" } }, @@ -505,7 +505,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 160, + "line": 176, "path": "src/plugins/types.ts" } }, @@ -514,7 +514,16 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 316, + "line": 332, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;", + "exportName": "RealtimeTranscriptionProviderPlugin", + "kind": "type", + "source": { + "line": 1617, "path": "src/plugins/types.ts" } }, @@ -568,7 +577,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 1504, + "line": 1591, "path": "src/plugins/types.ts" } }, @@ -4163,7 +4172,7 @@ "exportName": "buildChannelOutboundSessionRoute", "kind": "function", "source": { - "line": 224, + "line": 229, "path": "src/plugin-sdk/core.ts" } }, @@ -4217,7 +4226,7 @@ "exportName": "createChannelPluginBase", "kind": "function", "source": { - "line": 589, + "line": 594, "path": "src/plugin-sdk/core.ts" } }, @@ -4226,7 +4235,7 @@ "exportName": "createChatChannelPlugin", "kind": "function", "source": { - "line": 562, + "line": 567, "path": "src/plugin-sdk/core.ts" } }, @@ -4253,7 +4262,7 @@ "exportName": "defineChannelPluginEntry", "kind": "function", "source": { - "line": 322, + "line": 327, "path": "src/plugin-sdk/core.ts" } }, @@ -4262,7 +4271,7 @@ "exportName": "definePluginEntry", "kind": "function", "source": { - "line": 157, + "line": 167, "path": "src/plugin-sdk/plugin-entry.ts" } }, @@ -4271,7 +4280,7 @@ "exportName": "defineSetupPluginEntry", "kind": "function", "source": { - "line": 365, + "line": 370, "path": "src/plugin-sdk/core.ts" } }, @@ -4595,7 +4604,7 @@ "exportName": "stripChannelTargetPrefix", "kind": "function", "source": { - "line": 204, + "line": 209, "path": "src/plugin-sdk/core.ts" } }, @@ -4604,7 +4613,7 @@ "exportName": "stripTargetKindPrefix", "kind": "function", "source": { - "line": 216, + "line": 221, "path": "src/plugin-sdk/core.ts" } }, @@ -4757,7 +4766,7 @@ "exportName": "ChannelOutboundSessionRouteParams", "kind": "type", "source": { - "line": 199, + "line": 204, "path": "src/plugin-sdk/core.ts" } }, @@ -4820,7 +4829,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 1529, + "line": 1648, "path": "src/plugins/types.ts" } }, @@ -4847,7 +4856,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1796, + "line": 1915, "path": "src/plugins/types.ts" } }, @@ -4856,7 +4865,7 @@ "exportName": "OpenClawPluginCommandDefinition", "kind": "type", "source": { - "line": 1652, + "line": 1771, "path": "src/plugins/types.ts" } }, @@ -4865,7 +4874,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 100, + "line": 116, "path": "src/plugins/types.ts" } }, @@ -4874,7 +4883,7 @@ "exportName": "OpenClawPluginDefinition", "kind": "type", "source": { - "line": 1778, + "line": 1897, "path": "src/plugins/types.ts" } }, @@ -4883,7 +4892,7 @@ "exportName": "OpenClawPluginService", "kind": "type", "source": { - "line": 1745, + "line": 1864, "path": "src/plugins/types.ts" } }, @@ -4892,7 +4901,7 @@ "exportName": "OpenClawPluginServiceContext", "kind": "type", "source": { - "line": 1737, + "line": 1856, "path": "src/plugins/types.ts" } }, @@ -4901,7 +4910,7 @@ "exportName": "OpenClawPluginToolContext", "kind": "type", "source": { - "line": 115, + "line": 131, "path": "src/plugins/types.ts" } }, @@ -4910,7 +4919,7 @@ "exportName": "OpenClawPluginToolFactory", "kind": "type", "source": { - "line": 140, + "line": 156, "path": "src/plugins/types.ts" } }, @@ -4928,7 +4937,7 @@ "exportName": "PluginCommandContext", "kind": "type", "source": { - "line": 1544, + "line": 1663, "path": "src/plugins/types.ts" } }, @@ -4937,7 +4946,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 71, + "line": 87, "path": "src/plugins/types.ts" } }, @@ -4964,7 +4973,7 @@ "exportName": "ProviderAugmentModelCatalogContext", "kind": "type", "source": { - "line": 829, + "line": 896, "path": "src/plugins/types.ts" } }, @@ -4973,7 +4982,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 175, + "line": 191, "path": "src/plugins/types.ts" } }, @@ -4982,7 +4991,7 @@ "exportName": "ProviderAuthDoctorHintContext", "kind": "type", "source": { - "line": 516, + "line": 532, "path": "src/plugins/types.ts" } }, @@ -4991,7 +5000,7 @@ "exportName": "ProviderAuthMethod", "kind": "type", "source": { - "line": 254, + "line": 270, "path": "src/plugins/types.ts" } }, @@ -5000,7 +5009,7 @@ "exportName": "ProviderAuthMethodNonInteractiveContext", "kind": "type", "source": { - "line": 238, + "line": 254, "path": "src/plugins/types.ts" } }, @@ -5009,7 +5018,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 160, + "line": 176, "path": "src/plugins/types.ts" } }, @@ -5018,7 +5027,7 @@ "exportName": "ProviderBuildMissingAuthMessageContext", "kind": "type", "source": { - "line": 741, + "line": 808, "path": "src/plugins/types.ts" } }, @@ -5027,7 +5036,7 @@ "exportName": "ProviderBuildUnknownModelHintContext", "kind": "type", "source": { - "line": 757, + "line": 824, "path": "src/plugins/types.ts" } }, @@ -5036,7 +5045,7 @@ "exportName": "ProviderBuiltInModelSuppressionContext", "kind": "type", "source": { - "line": 773, + "line": 840, "path": "src/plugins/types.ts" } }, @@ -5045,7 +5054,7 @@ "exportName": "ProviderBuiltInModelSuppressionResult", "kind": "type", "source": { - "line": 782, + "line": 849, "path": "src/plugins/types.ts" } }, @@ -5054,7 +5063,7 @@ "exportName": "ProviderCacheTtlEligibilityContext", "kind": "type", "source": { - "line": 728, + "line": 795, "path": "src/plugins/types.ts" } }, @@ -5063,7 +5072,7 @@ "exportName": "ProviderCatalogContext", "kind": "type", "source": { - "line": 275, + "line": 291, "path": "src/plugins/types.ts" } }, @@ -5072,7 +5081,7 @@ "exportName": "ProviderCatalogResult", "kind": "type", "source": { - "line": 298, + "line": 314, "path": "src/plugins/types.ts" } }, @@ -5081,7 +5090,7 @@ "exportName": "ProviderDefaultThinkingPolicyContext", "kind": "type", "source": { - "line": 806, + "line": 873, "path": "src/plugins/types.ts" } }, @@ -5090,7 +5099,7 @@ "exportName": "ProviderDiscoveryContext", "kind": "type", "source": { - "line": 845, + "line": 912, "path": "src/plugins/types.ts" } }, @@ -5099,7 +5108,7 @@ "exportName": "ProviderFetchUsageSnapshotContext", "kind": "type", "source": { - "line": 497, + "line": 513, "path": "src/plugins/types.ts" } }, @@ -5108,7 +5117,7 @@ "exportName": "ProviderModernModelPolicyContext", "kind": "type", "source": { - "line": 816, + "line": 883, "path": "src/plugins/types.ts" } }, @@ -5117,7 +5126,7 @@ "exportName": "ProviderNormalizeResolvedModelContext", "kind": "type", "source": { - "line": 361, + "line": 377, "path": "src/plugins/types.ts" } }, @@ -5126,7 +5135,7 @@ "exportName": "ProviderNormalizeToolSchemasContext", "kind": "type", "source": { - "line": 638, + "line": 654, "path": "src/plugins/types.ts" } }, @@ -5135,7 +5144,7 @@ "exportName": "ProviderPreparedRuntimeAuth", "kind": "type", "source": { - "line": 443, + "line": 459, "path": "src/plugins/types.ts" } }, @@ -5144,7 +5153,7 @@ "exportName": "ProviderPrepareDynamicModelContext", "kind": "type", "source": { - "line": 352, + "line": 368, "path": "src/plugins/types.ts" } }, @@ -5153,7 +5162,7 @@ "exportName": "ProviderPrepareExtraParamsContext", "kind": "type", "source": { - "line": 530, + "line": 546, "path": "src/plugins/types.ts" } }, @@ -5162,7 +5171,7 @@ "exportName": "ProviderPrepareRuntimeAuthContext", "kind": "type", "source": { - "line": 422, + "line": 438, "path": "src/plugins/types.ts" } }, @@ -5171,7 +5180,7 @@ "exportName": "ProviderReasoningOutputMode", "kind": "type", "source": { - "line": 544, + "line": 560, "path": "src/plugins/types.ts" } }, @@ -5180,7 +5189,7 @@ "exportName": "ProviderReasoningOutputModeContext", "kind": "type", "source": { - "line": 654, + "line": 670, "path": "src/plugins/types.ts" } }, @@ -5189,7 +5198,7 @@ "exportName": "ProviderReplayPolicy", "kind": "type", "source": { - "line": 563, + "line": 579, "path": "src/plugins/types.ts" } }, @@ -5198,7 +5207,7 @@ "exportName": "ProviderReplayPolicyContext", "kind": "type", "source": { - "line": 586, + "line": 602, "path": "src/plugins/types.ts" } }, @@ -5207,7 +5216,7 @@ "exportName": "ProviderReplaySessionEntry", "kind": "type", "source": { - "line": 597, + "line": 613, "path": "src/plugins/types.ts" } }, @@ -5216,7 +5225,7 @@ "exportName": "ProviderReplaySessionState", "kind": "type", "source": { - "line": 602, + "line": 618, "path": "src/plugins/types.ts" } }, @@ -5225,7 +5234,7 @@ "exportName": "ProviderResolvedUsageAuth", "kind": "type", "source": { - "line": 484, + "line": 500, "path": "src/plugins/types.ts" } }, @@ -5234,7 +5243,16 @@ "exportName": "ProviderResolveDynamicModelContext", "kind": "type", "source": { - "line": 335, + "line": 351, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderResolveTransportTurnStateContext = ProviderResolveTransportTurnStateContext;", + "exportName": "ProviderResolveTransportTurnStateContext", + "kind": "type", + "source": { + "line": 717, "path": "src/plugins/types.ts" } }, @@ -5243,7 +5261,16 @@ "exportName": "ProviderResolveUsageAuthContext", "kind": "type", "source": { - "line": 465, + "line": 481, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderResolveWebSocketSessionPolicyContext = ProviderResolveWebSocketSessionPolicyContext;", + "exportName": "ProviderResolveWebSocketSessionPolicyContext", + "kind": "type", + "source": { + "line": 744, "path": "src/plugins/types.ts" } }, @@ -5252,7 +5279,7 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 316, + "line": 332, "path": "src/plugins/types.ts" } }, @@ -5261,7 +5288,7 @@ "exportName": "ProviderSanitizeReplayHistoryContext", "kind": "type", "source": { - "line": 613, + "line": 629, "path": "src/plugins/types.ts" } }, @@ -5270,7 +5297,7 @@ "exportName": "ProviderThinkingPolicyContext", "kind": "type", "source": { - "line": 794, + "line": 861, "path": "src/plugins/types.ts" } }, @@ -5279,7 +5306,16 @@ "exportName": "ProviderToolSchemaDiagnostic", "kind": "type", "source": { - "line": 642, + "line": 658, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderTransportTurnState = ProviderTransportTurnState;", + "exportName": "ProviderTransportTurnState", + "kind": "type", + "source": { + "line": 706, "path": "src/plugins/types.ts" } }, @@ -5297,7 +5333,16 @@ "exportName": "ProviderValidateReplayTurnsContext", "kind": "type", "source": { - "line": 626, + "line": 642, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderWebSocketSessionPolicy = ProviderWebSocketSessionPolicy;", + "exportName": "ProviderWebSocketSessionPolicy", + "kind": "type", + "source": { + "line": 733, "path": "src/plugins/types.ts" } }, @@ -5306,7 +5351,16 @@ "exportName": "ProviderWrapStreamFnContext", "kind": "type", "source": { - "line": 679, + "line": 695, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;", + "exportName": "RealtimeTranscriptionProviderPlugin", + "kind": "type", + "source": { + "line": 1617, "path": "src/plugins/types.ts" } }, @@ -5369,7 +5423,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 1504, + "line": 1591, "path": "src/plugins/types.ts" } }, @@ -5443,7 +5497,7 @@ "exportName": "definePluginEntry", "kind": "function", "source": { - "line": 157, + "line": 167, "path": "src/plugin-sdk/plugin-entry.ts" } }, @@ -5470,7 +5524,7 @@ "exportName": "MediaUnderstandingProviderPlugin", "kind": "type", "source": { - "line": 1529, + "line": 1648, "path": "src/plugins/types.ts" } }, @@ -5488,7 +5542,7 @@ "exportName": "OpenClawPluginApi", "kind": "type", "source": { - "line": 1796, + "line": 1915, "path": "src/plugins/types.ts" } }, @@ -5497,7 +5551,7 @@ "exportName": "OpenClawPluginCommandDefinition", "kind": "type", "source": { - "line": 1652, + "line": 1771, "path": "src/plugins/types.ts" } }, @@ -5506,7 +5560,7 @@ "exportName": "OpenClawPluginConfigSchema", "kind": "type", "source": { - "line": 100, + "line": 116, "path": "src/plugins/types.ts" } }, @@ -5515,7 +5569,7 @@ "exportName": "OpenClawPluginDefinition", "kind": "type", "source": { - "line": 1778, + "line": 1897, "path": "src/plugins/types.ts" } }, @@ -5524,7 +5578,7 @@ "exportName": "OpenClawPluginService", "kind": "type", "source": { - "line": 1745, + "line": 1864, "path": "src/plugins/types.ts" } }, @@ -5533,7 +5587,7 @@ "exportName": "OpenClawPluginServiceContext", "kind": "type", "source": { - "line": 1737, + "line": 1856, "path": "src/plugins/types.ts" } }, @@ -5542,7 +5596,7 @@ "exportName": "OpenClawPluginToolContext", "kind": "type", "source": { - "line": 115, + "line": 131, "path": "src/plugins/types.ts" } }, @@ -5551,7 +5605,7 @@ "exportName": "OpenClawPluginToolFactory", "kind": "type", "source": { - "line": 140, + "line": 156, "path": "src/plugins/types.ts" } }, @@ -5560,7 +5614,7 @@ "exportName": "PluginCommandContext", "kind": "type", "source": { - "line": 1544, + "line": 1663, "path": "src/plugins/types.ts" } }, @@ -5569,7 +5623,7 @@ "exportName": "PluginLogger", "kind": "type", "source": { - "line": 71, + "line": 87, "path": "src/plugins/types.ts" } }, @@ -5578,7 +5632,7 @@ "exportName": "ProviderAugmentModelCatalogContext", "kind": "type", "source": { - "line": 829, + "line": 896, "path": "src/plugins/types.ts" } }, @@ -5587,7 +5641,7 @@ "exportName": "ProviderAuthContext", "kind": "type", "source": { - "line": 175, + "line": 191, "path": "src/plugins/types.ts" } }, @@ -5596,7 +5650,7 @@ "exportName": "ProviderAuthDoctorHintContext", "kind": "type", "source": { - "line": 516, + "line": 532, "path": "src/plugins/types.ts" } }, @@ -5605,7 +5659,7 @@ "exportName": "ProviderAuthMethod", "kind": "type", "source": { - "line": 254, + "line": 270, "path": "src/plugins/types.ts" } }, @@ -5614,7 +5668,7 @@ "exportName": "ProviderAuthMethodNonInteractiveContext", "kind": "type", "source": { - "line": 238, + "line": 254, "path": "src/plugins/types.ts" } }, @@ -5623,7 +5677,7 @@ "exportName": "ProviderAuthResult", "kind": "type", "source": { - "line": 160, + "line": 176, "path": "src/plugins/types.ts" } }, @@ -5632,7 +5686,7 @@ "exportName": "ProviderBuildMissingAuthMessageContext", "kind": "type", "source": { - "line": 741, + "line": 808, "path": "src/plugins/types.ts" } }, @@ -5641,7 +5695,7 @@ "exportName": "ProviderBuildUnknownModelHintContext", "kind": "type", "source": { - "line": 757, + "line": 824, "path": "src/plugins/types.ts" } }, @@ -5650,7 +5704,7 @@ "exportName": "ProviderBuiltInModelSuppressionContext", "kind": "type", "source": { - "line": 773, + "line": 840, "path": "src/plugins/types.ts" } }, @@ -5659,7 +5713,7 @@ "exportName": "ProviderBuiltInModelSuppressionResult", "kind": "type", "source": { - "line": 782, + "line": 849, "path": "src/plugins/types.ts" } }, @@ -5668,7 +5722,7 @@ "exportName": "ProviderCacheTtlEligibilityContext", "kind": "type", "source": { - "line": 728, + "line": 795, "path": "src/plugins/types.ts" } }, @@ -5677,7 +5731,7 @@ "exportName": "ProviderCatalogContext", "kind": "type", "source": { - "line": 275, + "line": 291, "path": "src/plugins/types.ts" } }, @@ -5686,7 +5740,7 @@ "exportName": "ProviderCatalogResult", "kind": "type", "source": { - "line": 298, + "line": 314, "path": "src/plugins/types.ts" } }, @@ -5695,7 +5749,7 @@ "exportName": "ProviderDefaultThinkingPolicyContext", "kind": "type", "source": { - "line": 806, + "line": 873, "path": "src/plugins/types.ts" } }, @@ -5704,7 +5758,7 @@ "exportName": "ProviderDeferSyntheticProfileAuthContext", "kind": "type", "source": { - "line": 943, + "line": 1010, "path": "src/plugins/types.ts" } }, @@ -5713,7 +5767,7 @@ "exportName": "ProviderDiscoveryContext", "kind": "type", "source": { - "line": 845, + "line": 912, "path": "src/plugins/types.ts" } }, @@ -5722,7 +5776,7 @@ "exportName": "ProviderFetchUsageSnapshotContext", "kind": "type", "source": { - "line": 497, + "line": 513, "path": "src/plugins/types.ts" } }, @@ -5731,7 +5785,7 @@ "exportName": "ProviderModernModelPolicyContext", "kind": "type", "source": { - "line": 816, + "line": 883, "path": "src/plugins/types.ts" } }, @@ -5740,7 +5794,7 @@ "exportName": "ProviderNormalizeConfigContext", "kind": "type", "source": { - "line": 387, + "line": 403, "path": "src/plugins/types.ts" } }, @@ -5749,7 +5803,7 @@ "exportName": "ProviderNormalizeModelIdContext", "kind": "type", "source": { - "line": 376, + "line": 392, "path": "src/plugins/types.ts" } }, @@ -5758,7 +5812,7 @@ "exportName": "ProviderNormalizeResolvedModelContext", "kind": "type", "source": { - "line": 361, + "line": 377, "path": "src/plugins/types.ts" } }, @@ -5767,7 +5821,7 @@ "exportName": "ProviderNormalizeToolSchemasContext", "kind": "type", "source": { - "line": 638, + "line": 654, "path": "src/plugins/types.ts" } }, @@ -5776,7 +5830,7 @@ "exportName": "ProviderNormalizeTransportContext", "kind": "type", "source": { - "line": 399, + "line": 415, "path": "src/plugins/types.ts" } }, @@ -5785,7 +5839,7 @@ "exportName": "ProviderPreparedRuntimeAuth", "kind": "type", "source": { - "line": 443, + "line": 459, "path": "src/plugins/types.ts" } }, @@ -5794,7 +5848,7 @@ "exportName": "ProviderPrepareDynamicModelContext", "kind": "type", "source": { - "line": 352, + "line": 368, "path": "src/plugins/types.ts" } }, @@ -5803,7 +5857,7 @@ "exportName": "ProviderPrepareExtraParamsContext", "kind": "type", "source": { - "line": 530, + "line": 546, "path": "src/plugins/types.ts" } }, @@ -5812,7 +5866,7 @@ "exportName": "ProviderPrepareRuntimeAuthContext", "kind": "type", "source": { - "line": 422, + "line": 438, "path": "src/plugins/types.ts" } }, @@ -5821,7 +5875,7 @@ "exportName": "ProviderReasoningOutputMode", "kind": "type", "source": { - "line": 544, + "line": 560, "path": "src/plugins/types.ts" } }, @@ -5830,7 +5884,7 @@ "exportName": "ProviderReasoningOutputModeContext", "kind": "type", "source": { - "line": 654, + "line": 670, "path": "src/plugins/types.ts" } }, @@ -5839,7 +5893,7 @@ "exportName": "ProviderReplayPolicy", "kind": "type", "source": { - "line": 563, + "line": 579, "path": "src/plugins/types.ts" } }, @@ -5848,7 +5902,7 @@ "exportName": "ProviderReplayPolicyContext", "kind": "type", "source": { - "line": 586, + "line": 602, "path": "src/plugins/types.ts" } }, @@ -5857,7 +5911,7 @@ "exportName": "ProviderReplaySessionEntry", "kind": "type", "source": { - "line": 597, + "line": 613, "path": "src/plugins/types.ts" } }, @@ -5866,7 +5920,7 @@ "exportName": "ProviderReplaySessionState", "kind": "type", "source": { - "line": 602, + "line": 618, "path": "src/plugins/types.ts" } }, @@ -5875,7 +5929,7 @@ "exportName": "ProviderResolveConfigApiKeyContext", "kind": "type", "source": { - "line": 411, + "line": 427, "path": "src/plugins/types.ts" } }, @@ -5884,7 +5938,7 @@ "exportName": "ProviderResolvedUsageAuth", "kind": "type", "source": { - "line": 484, + "line": 500, "path": "src/plugins/types.ts" } }, @@ -5893,7 +5947,16 @@ "exportName": "ProviderResolveDynamicModelContext", "kind": "type", "source": { - "line": 335, + "line": 351, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderResolveTransportTurnStateContext = ProviderResolveTransportTurnStateContext;", + "exportName": "ProviderResolveTransportTurnStateContext", + "kind": "type", + "source": { + "line": 717, "path": "src/plugins/types.ts" } }, @@ -5902,7 +5965,16 @@ "exportName": "ProviderResolveUsageAuthContext", "kind": "type", "source": { - "line": 465, + "line": 481, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderResolveWebSocketSessionPolicyContext = ProviderResolveWebSocketSessionPolicyContext;", + "exportName": "ProviderResolveWebSocketSessionPolicyContext", + "kind": "type", + "source": { + "line": 744, "path": "src/plugins/types.ts" } }, @@ -5911,7 +5983,7 @@ "exportName": "ProviderRuntimeModel", "kind": "type", "source": { - "line": 316, + "line": 332, "path": "src/plugins/types.ts" } }, @@ -5920,7 +5992,7 @@ "exportName": "ProviderSanitizeReplayHistoryContext", "kind": "type", "source": { - "line": 613, + "line": 629, "path": "src/plugins/types.ts" } }, @@ -5929,7 +6001,7 @@ "exportName": "ProviderThinkingPolicyContext", "kind": "type", "source": { - "line": 794, + "line": 861, "path": "src/plugins/types.ts" } }, @@ -5938,7 +6010,16 @@ "exportName": "ProviderToolSchemaDiagnostic", "kind": "type", "source": { - "line": 642, + "line": 658, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderTransportTurnState = ProviderTransportTurnState;", + "exportName": "ProviderTransportTurnState", + "kind": "type", + "source": { + "line": 706, "path": "src/plugins/types.ts" } }, @@ -5947,7 +6028,16 @@ "exportName": "ProviderValidateReplayTurnsContext", "kind": "type", "source": { - "line": 626, + "line": 642, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type ProviderWebSocketSessionPolicy = ProviderWebSocketSessionPolicy;", + "exportName": "ProviderWebSocketSessionPolicy", + "kind": "type", + "source": { + "line": 733, "path": "src/plugins/types.ts" } }, @@ -5956,7 +6046,16 @@ "exportName": "ProviderWrapStreamFnContext", "kind": "type", "source": { - "line": 679, + "line": 695, + "path": "src/plugins/types.ts" + } + }, + { + "declaration": "export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;", + "exportName": "RealtimeTranscriptionProviderPlugin", + "kind": "type", + "source": { + "line": 1617, "path": "src/plugins/types.ts" } }, @@ -5965,7 +6064,7 @@ "exportName": "SpeechProviderPlugin", "kind": "type", "source": { - "line": 1504, + "line": 1591, "path": "src/plugins/types.ts" } } @@ -6569,7 +6668,7 @@ "exportName": "capturePluginRegistration", "kind": "function", "source": { - "line": 131, + "line": 145, "path": "src/plugins/captured-registration.ts" } }, diff --git a/docs/.generated/plugin-sdk-api-baseline.jsonl b/docs/.generated/plugin-sdk-api-baseline.jsonl index 40cd98ae9d8..94d06cf4b4c 100644 --- a/docs/.generated/plugin-sdk-api-baseline.jsonl +++ b/docs/.generated/plugin-sdk-api-baseline.jsonl @@ -28,7 +28,7 @@ {"declaration":"export type ChannelStatusIssue = ChannelStatusIssue;","entrypoint":"index","exportName":"ChannelStatusIssue","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":102,"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":1752,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type CliBackendPlugin = CliBackendPlugin;","entrypoint":"index","exportName":"CliBackendPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1871,"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"} @@ -44,24 +44,25 @@ {"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":1529,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"index","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1648,"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":1796,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"index","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":100,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"index","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":71,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"index","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1915,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"index","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":116,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"index","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":87,"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 PluginRuntimeTaskFlows = PluginRuntimeTaskFlows;","entrypoint":"index","exportName":"PluginRuntimeTaskFlows","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":84,"sourcePath":"src/plugins/runtime/runtime-tasks.ts"} {"declaration":"export type PluginRuntimeTaskRuns = PluginRuntimeTaskRuns;","entrypoint":"index","exportName":"PluginRuntimeTaskRuns","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":64,"sourcePath":"src/plugins/runtime/runtime-tasks.ts"} {"declaration":"export type PluginRuntimeTasks = PluginRuntimeTasks;","entrypoint":"index","exportName":"PluginRuntimeTasks","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":94,"sourcePath":"src/plugins/runtime/runtime-tasks.ts"} -{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"index","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":175,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"index","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":160,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"index","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":316,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"index","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":191,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"index","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":176,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"index","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":332,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;","entrypoint":"index","exportName":"RealtimeTranscriptionProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1617,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type ReplyPayload = ReplyPayload;","entrypoint":"index","exportName":"ReplyPayload","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":85,"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":1504,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"index","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk","kind":"type","recordType":"export","sourceLine":1591,"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"} @@ -458,19 +459,19 @@ {"declaration":"export function applyAccountNameToChannelSection(params: { cfg: OpenClawConfig; channelKey: string; accountId: string; name?: string | undefined; alwaysUseAccounts?: boolean | undefined; }): OpenClawConfig;","entrypoint":"core","exportName":"applyAccountNameToChannelSection","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":35,"sourcePath":"src/channels/plugins/setup-helpers.ts"} {"declaration":"export function buildAgentSessionKey(params: { agentId: string; channel: string; accountId?: string | null | undefined; peer?: RoutePeer | null | undefined; dmScope?: \"main\" | \"per-peer\" | \"per-channel-peer\" | \"per-account-channel-peer\" | undefined; identityLinks?: Record<...> | undefined; }): string;","entrypoint":"core","exportName":"buildAgentSessionKey","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":92,"sourcePath":"src/routing/resolve-route.ts"} {"declaration":"export function buildChannelConfigSchema(schema: ZodType>, options?: BuildChannelConfigSchemaOptions | undefined): ChannelConfigSchema;","entrypoint":"core","exportName":"buildChannelConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":76,"sourcePath":"src/channels/plugins/config-schema.ts"} -{"declaration":"export function buildChannelOutboundSessionRoute(params: { cfg: OpenClawConfig; agentId: string; channel: string; accountId?: string | null | undefined; peer: { kind: \"direct\" | \"group\" | \"channel\"; id: string; }; chatType: \"direct\" | \"group\" | \"channel\"; from: string; to: string; threadId?: string | ... 1 more ... | undefined; }): ChannelOutboundSessionRoute;","entrypoint":"core","exportName":"buildChannelOutboundSessionRoute","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":224,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export function buildChannelOutboundSessionRoute(params: { cfg: OpenClawConfig; agentId: string; channel: string; accountId?: string | null | undefined; peer: { kind: \"direct\" | \"group\" | \"channel\"; id: string; }; chatType: \"direct\" | \"group\" | \"channel\"; from: string; to: string; threadId?: string | ... 1 more ... | undefined; }): ChannelOutboundSessionRoute;","entrypoint":"core","exportName":"buildChannelOutboundSessionRoute","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":229,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function buildPluginConfigSchema(schema: ZodType>, options?: BuildPluginConfigSchemaOptions | undefined): OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"buildPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":78,"sourcePath":"src/plugins/config-schema.ts"} {"declaration":"export function channelTargetSchema(options?: { description?: string | undefined; } | undefined): TString;","entrypoint":"core","exportName":"channelTargetSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":38,"sourcePath":"src/agents/schema/typebox.ts"} {"declaration":"export function channelTargetsSchema(options?: { description?: string | undefined; } | undefined): TArray;","entrypoint":"core","exportName":"channelTargetsSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":44,"sourcePath":"src/agents/schema/typebox.ts"} {"declaration":"export function clearAccountEntryFields(params: { accounts?: Record | undefined; accountId: string; fields: string[]; isValueSet?: ((value: unknown) => boolean) | undefined; markClearedOnFieldPresence?: boolean | undefined; }): { ...; };","entrypoint":"core","exportName":"clearAccountEntryFields","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":122,"sourcePath":"src/channels/plugins/config-helpers.ts"} {"declaration":"export function createActionGate>(actions: T | undefined): ActionGate;","entrypoint":"core","exportName":"createActionGate","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":46,"sourcePath":"src/agents/tools/common.ts"} -{"declaration":"export function createChannelPluginBase(params: CreateChannelPluginBaseOptions): CreatedChannelPluginBase;","entrypoint":"core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":589,"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":562,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export function createChannelPluginBase(params: CreateChannelPluginBaseOptions): CreatedChannelPluginBase;","entrypoint":"core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":594,"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":567,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function createDedupeCache(options: DedupeCacheOptions): DedupeCache;","entrypoint":"core","exportName":"createDedupeCache","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":17,"sourcePath":"src/infra/dedupe.ts"} {"declaration":"export function createSubsystemLogger(subsystem: string): SubsystemLogger;","entrypoint":"core","exportName":"createSubsystemLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":302,"sourcePath":"src/logging/subsystem.ts"} -{"declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":322,"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":157,"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":365,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":327,"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":167,"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":370,"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"} {"declaration":"export function emptyPluginConfigSchema(): OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"emptyPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":108,"sourcePath":"src/plugins/config-schema.ts"} @@ -506,8 +507,8 @@ {"declaration":"export function resolveThreadSessionKeys(params: { baseSessionKey: string; threadId?: string | null | undefined; parentSessionKey?: string | undefined; useSuffix?: boolean | undefined; normalizeThreadId?: ((threadId: string) => string) | undefined; }): { ...; };","entrypoint":"core","exportName":"resolveThreadSessionKeys","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":234,"sourcePath":"src/routing/session-key.ts"} {"declaration":"export function setAccountEnabledInConfigSection(params: { cfg: OpenClawConfig; sectionKey: string; accountId: string; enabled: boolean; allowTopLevel?: boolean | undefined; }): OpenClawConfig;","entrypoint":"core","exportName":"setAccountEnabledInConfigSection","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":16,"sourcePath":"src/channels/plugins/config-helpers.ts"} {"declaration":"export function stringEnum(values: T, options?: StringEnumOptions): TUnsafe;","entrypoint":"core","exportName":"stringEnum","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":15,"sourcePath":"src/agents/schema/typebox.ts"} -{"declaration":"export function stripChannelTargetPrefix(raw: string, ...providers: string[]): string;","entrypoint":"core","exportName":"stripChannelTargetPrefix","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":204,"sourcePath":"src/plugin-sdk/core.ts"} -{"declaration":"export function stripTargetKindPrefix(raw: string): string;","entrypoint":"core","exportName":"stripTargetKindPrefix","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":216,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export function stripChannelTargetPrefix(raw: string, ...providers: string[]): string;","entrypoint":"core","exportName":"stripChannelTargetPrefix","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":209,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export function stripTargetKindPrefix(raw: string): string;","entrypoint":"core","exportName":"stripTargetKindPrefix","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":221,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export function tryReadSecretFileSync(filePath: string | undefined, label: string, options?: SecretFileReadOptions): string | undefined;","entrypoint":"core","exportName":"tryReadSecretFileSync","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export","sourceLine":130,"sourcePath":"src/infra/secret-file.ts"} {"declaration":"export const DEFAULT_ACCOUNT_ID: \"default\";","entrypoint":"core","exportName":"DEFAULT_ACCOUNT_ID","importSpecifier":"openclaw/plugin-sdk/core","kind":"const","recordType":"export","sourceLine":3,"sourcePath":"src/routing/account-id.ts"} {"declaration":"export const DEFAULT_SECRET_FILE_MAX_BYTES: number;","entrypoint":"core","exportName":"DEFAULT_SECRET_FILE_MAX_BYTES","importSpecifier":"openclaw/plugin-sdk/core","kind":"const","recordType":"export","sourceLine":5,"sourcePath":"src/infra/secret-file.ts"} @@ -524,75 +525,80 @@ {"declaration":"export type ChannelMeta = ChannelMeta;","entrypoint":"core","exportName":"ChannelMeta","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":131,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"core","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":178,"sourcePath":"src/channels/plugins/types.adapters.ts"} {"declaration":"export type ChannelOutboundSessionRoute = ChannelOutboundSessionRoute;","entrypoint":"core","exportName":"ChannelOutboundSessionRoute","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":319,"sourcePath":"src/channels/plugins/types.core.ts"} -{"declaration":"export type ChannelOutboundSessionRouteParams = { cfg: OpenClawConfig; agentId: string; accountId?: string | null; target: string; resolvedTarget?: { to: string; kind: import(\"../channels/plugins/types.core.js\").ChannelDirectoryEntryKind | \"channel\"; display?: string; source: \"normalized\" | \"directory\"; }; replyToId?: string | null; threadId?: string | number | null;};","entrypoint":"core","exportName":"ChannelOutboundSessionRouteParams","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":199,"sourcePath":"src/plugin-sdk/core.ts"} +{"declaration":"export type ChannelOutboundSessionRouteParams = { cfg: OpenClawConfig; agentId: string; accountId?: string | null; target: string; resolvedTarget?: { to: string; kind: import(\"../channels/plugins/types.core.js\").ChannelDirectoryEntryKind | \"channel\"; display?: string; source: \"normalized\" | \"directory\"; }; replyToId?: string | null; threadId?: string | number | null;};","entrypoint":"core","exportName":"ChannelOutboundSessionRouteParams","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":204,"sourcePath":"src/plugin-sdk/core.ts"} {"declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"core","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":82,"sourcePath":"src/channels/plugins/types.plugin.ts"} {"declaration":"export type ChannelSetupInput = ChannelSetupInput;","entrypoint":"core","exportName":"ChannelSetupInput","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":64,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type ChatType = ChatType;","entrypoint":"core","exportName":"ChatType","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1,"sourcePath":"src/channels/chat-type.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":116,"sourcePath":"src/gateway/server-methods/types.ts"} {"declaration":"export type HistoryEntry = HistoryEntry;","entrypoint":"core","exportName":"HistoryEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":30,"sourcePath":"src/auto-reply/reply/history.ts"} -{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"core","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1529,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type MediaUnderstandingProviderPlugin = MediaUnderstandingProvider;","entrypoint":"core","exportName":"MediaUnderstandingProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1648,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type NormalizedLocation = NormalizedLocation;","entrypoint":"core","exportName":"NormalizedLocation","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":3,"sourcePath":"src/channels/location.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":1796,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"core","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1652,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":100,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1778,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"core","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1745,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"core","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1737,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginToolContext = OpenClawPluginToolContext;","entrypoint":"core","exportName":"OpenClawPluginToolContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":115,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;","entrypoint":"core","exportName":"OpenClawPluginToolFactory","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":140,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1915,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"core","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1771,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":116,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1897,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"core","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1864,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginServiceContext = OpenClawPluginServiceContext;","entrypoint":"core","exportName":"OpenClawPluginServiceContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1856,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolContext = OpenClawPluginToolContext;","entrypoint":"core","exportName":"OpenClawPluginToolContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":131,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type OpenClawPluginToolFactory = OpenClawPluginToolFactory;","entrypoint":"core","exportName":"OpenClawPluginToolFactory","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":156,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type OutboundIdentity = OutboundIdentity;","entrypoint":"core","exportName":"OutboundIdentity","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":5,"sourcePath":"src/infra/outbound/identity.ts"} -{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1544,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"core","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":71,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1663,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type PluginLogger = PluginLogger;","entrypoint":"core","exportName":"PluginLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":87,"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 PollInput = PollInput;","entrypoint":"core","exportName":"PollInput","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1,"sourcePath":"src/polls.ts"} -{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"core","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":829,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"core","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":175,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"core","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":516,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"core","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":254,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"core","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":238,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"core","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":160,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"core","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":741,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuildUnknownModelHintContext = ProviderBuildUnknownModelHintContext;","entrypoint":"core","exportName":"ProviderBuildUnknownModelHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":757,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":773,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":782,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"core","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":728,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":275,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"core","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":298,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":806,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":845,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"core","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":497,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"core","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":816,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"core","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":361,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeToolSchemasContext = ProviderNormalizeToolSchemasContext;","entrypoint":"core","exportName":"ProviderNormalizeToolSchemasContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":638,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"core","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":443,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":352,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"core","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":530,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"core","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":422,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReasoningOutputMode = ProviderReasoningOutputMode;","entrypoint":"core","exportName":"ProviderReasoningOutputMode","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":544,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReasoningOutputModeContext = ProviderReplayPolicyContext;","entrypoint":"core","exportName":"ProviderReasoningOutputModeContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":654,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplayPolicy = ProviderReplayPolicy;","entrypoint":"core","exportName":"ProviderReplayPolicy","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":563,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplayPolicyContext = ProviderReplayPolicyContext;","entrypoint":"core","exportName":"ProviderReplayPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":586,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplaySessionEntry = ProviderReplaySessionEntry;","entrypoint":"core","exportName":"ProviderReplaySessionEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":597,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplaySessionState = ProviderReplaySessionState;","entrypoint":"core","exportName":"ProviderReplaySessionState","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":602,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"core","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":484,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":335,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"core","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":465,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"core","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":316,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderSanitizeReplayHistoryContext = ProviderSanitizeReplayHistoryContext;","entrypoint":"core","exportName":"ProviderSanitizeReplayHistoryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":613,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":794,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderToolSchemaDiagnostic = ProviderToolSchemaDiagnostic;","entrypoint":"core","exportName":"ProviderToolSchemaDiagnostic","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":642,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAugmentModelCatalogContext = ProviderAugmentModelCatalogContext;","entrypoint":"core","exportName":"ProviderAugmentModelCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":896,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthContext = ProviderAuthContext;","entrypoint":"core","exportName":"ProviderAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":191,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthDoctorHintContext = ProviderAuthDoctorHintContext;","entrypoint":"core","exportName":"ProviderAuthDoctorHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":532,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethod = ProviderAuthMethod;","entrypoint":"core","exportName":"ProviderAuthMethod","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":270,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthMethodNonInteractiveContext = ProviderAuthMethodNonInteractiveContext;","entrypoint":"core","exportName":"ProviderAuthMethodNonInteractiveContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":254,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderAuthResult = ProviderAuthResult;","entrypoint":"core","exportName":"ProviderAuthResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":176,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuildMissingAuthMessageContext = ProviderBuildMissingAuthMessageContext;","entrypoint":"core","exportName":"ProviderBuildMissingAuthMessageContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":808,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuildUnknownModelHintContext = ProviderBuildUnknownModelHintContext;","entrypoint":"core","exportName":"ProviderBuildUnknownModelHintContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":824,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionContext = ProviderBuiltInModelSuppressionContext;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":840,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuiltInModelSuppressionResult = ProviderBuiltInModelSuppressionResult;","entrypoint":"core","exportName":"ProviderBuiltInModelSuppressionResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":849,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCacheTtlEligibilityContext = ProviderCacheTtlEligibilityContext;","entrypoint":"core","exportName":"ProviderCacheTtlEligibilityContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":795,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderCatalogContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":291,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderCatalogResult = ProviderCatalogResult;","entrypoint":"core","exportName":"ProviderCatalogResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":314,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDefaultThinkingPolicyContext = ProviderDefaultThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderDefaultThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":873,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDiscoveryContext = ProviderCatalogContext;","entrypoint":"core","exportName":"ProviderDiscoveryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":912,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderFetchUsageSnapshotContext = ProviderFetchUsageSnapshotContext;","entrypoint":"core","exportName":"ProviderFetchUsageSnapshotContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":513,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderModernModelPolicyContext = ProviderModernModelPolicyContext;","entrypoint":"core","exportName":"ProviderModernModelPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":883,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeResolvedModelContext = ProviderNormalizeResolvedModelContext;","entrypoint":"core","exportName":"ProviderNormalizeResolvedModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":377,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeToolSchemasContext = ProviderNormalizeToolSchemasContext;","entrypoint":"core","exportName":"ProviderNormalizeToolSchemasContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":654,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPreparedRuntimeAuth = ProviderPreparedRuntimeAuth;","entrypoint":"core","exportName":"ProviderPreparedRuntimeAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":459,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderPrepareDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":368,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareExtraParamsContext = ProviderPrepareExtraParamsContext;","entrypoint":"core","exportName":"ProviderPrepareExtraParamsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":546,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderPrepareRuntimeAuthContext = ProviderPrepareRuntimeAuthContext;","entrypoint":"core","exportName":"ProviderPrepareRuntimeAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":438,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReasoningOutputMode = ProviderReasoningOutputMode;","entrypoint":"core","exportName":"ProviderReasoningOutputMode","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":560,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReasoningOutputModeContext = ProviderReplayPolicyContext;","entrypoint":"core","exportName":"ProviderReasoningOutputModeContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":670,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplayPolicy = ProviderReplayPolicy;","entrypoint":"core","exportName":"ProviderReplayPolicy","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":579,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplayPolicyContext = ProviderReplayPolicyContext;","entrypoint":"core","exportName":"ProviderReplayPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":602,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplaySessionEntry = ProviderReplaySessionEntry;","entrypoint":"core","exportName":"ProviderReplaySessionEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":613,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplaySessionState = ProviderReplaySessionState;","entrypoint":"core","exportName":"ProviderReplaySessionState","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":618,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolvedUsageAuth = ProviderResolvedUsageAuth;","entrypoint":"core","exportName":"ProviderResolvedUsageAuth","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":500,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveDynamicModelContext = ProviderResolveDynamicModelContext;","entrypoint":"core","exportName":"ProviderResolveDynamicModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":351,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveTransportTurnStateContext = ProviderResolveTransportTurnStateContext;","entrypoint":"core","exportName":"ProviderResolveTransportTurnStateContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":717,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveUsageAuthContext = ProviderResolveUsageAuthContext;","entrypoint":"core","exportName":"ProviderResolveUsageAuthContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":481,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveWebSocketSessionPolicyContext = ProviderResolveWebSocketSessionPolicyContext;","entrypoint":"core","exportName":"ProviderResolveWebSocketSessionPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":744,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderRuntimeModel = ProviderRuntimeModel;","entrypoint":"core","exportName":"ProviderRuntimeModel","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":332,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderSanitizeReplayHistoryContext = ProviderSanitizeReplayHistoryContext;","entrypoint":"core","exportName":"ProviderSanitizeReplayHistoryContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":629,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderThinkingPolicyContext = ProviderThinkingPolicyContext;","entrypoint":"core","exportName":"ProviderThinkingPolicyContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":861,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderToolSchemaDiagnostic = ProviderToolSchemaDiagnostic;","entrypoint":"core","exportName":"ProviderToolSchemaDiagnostic","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":658,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderTransportTurnState = ProviderTransportTurnState;","entrypoint":"core","exportName":"ProviderTransportTurnState","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":706,"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 ProviderValidateReplayTurnsContext = ProviderValidateReplayTurnsContext;","entrypoint":"core","exportName":"ProviderValidateReplayTurnsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":626,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"core","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":679,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderValidateReplayTurnsContext = ProviderValidateReplayTurnsContext;","entrypoint":"core","exportName":"ProviderValidateReplayTurnsContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":642,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderWebSocketSessionPolicy = ProviderWebSocketSessionPolicy;","entrypoint":"core","exportName":"ProviderWebSocketSessionPolicy","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":733,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderWrapStreamFnContext = ProviderWrapStreamFnContext;","entrypoint":"core","exportName":"ProviderWrapStreamFnContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":695,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;","entrypoint":"core","exportName":"RealtimeTranscriptionProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1617,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type ReplyPayload = ReplyPayload;","entrypoint":"core","exportName":"ReplyPayload","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":85,"sourcePath":"src/auto-reply/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 RuntimeLogger = RuntimeLogger;","entrypoint":"core","exportName":"RuntimeLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":7,"sourcePath":"src/plugins/runtime/types-core.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":1504,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type SpeechProviderPlugin = SpeechProviderPlugin;","entrypoint":"core","exportName":"SpeechProviderPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":1591,"sourcePath":"src/plugins/types.ts"} {"declaration":"export type TailscaleStatusCommandResult = TailscaleStatusCommandResult;","entrypoint":"core","exportName":"TailscaleStatusCommandResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":4,"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":9,"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"} @@ -600,65 +606,70 @@ {"declaration":"export type WizardPrompter = WizardPrompter;","entrypoint":"core","exportName":"WizardPrompter","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export","sourceLine":37,"sourcePath":"src/wizard/prompts.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":157,"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":167,"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":108,"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":1529,"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":1648,"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":1796,"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":1652,"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":100,"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":1778,"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":1745,"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":1737,"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":115,"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":140,"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":1544,"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":71,"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":829,"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":175,"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":516,"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":254,"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":238,"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":160,"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":741,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderBuildUnknownModelHintContext = ProviderBuildUnknownModelHintContext;","entrypoint":"plugin-entry","exportName":"ProviderBuildUnknownModelHintContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":757,"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":773,"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":782,"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":728,"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":275,"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":298,"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":806,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderDeferSyntheticProfileAuthContext = ProviderDeferSyntheticProfileAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderDeferSyntheticProfileAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":943,"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":845,"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":497,"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":816,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeConfigContext = ProviderNormalizeConfigContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeConfigContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":387,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeModelIdContext = ProviderNormalizeModelIdContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeModelIdContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":376,"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":361,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeToolSchemasContext = ProviderNormalizeToolSchemasContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeToolSchemasContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":638,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderNormalizeTransportContext = ProviderNormalizeTransportContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeTransportContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":399,"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":443,"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":352,"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":530,"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":422,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReasoningOutputMode = ProviderReasoningOutputMode;","entrypoint":"plugin-entry","exportName":"ProviderReasoningOutputMode","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":544,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReasoningOutputModeContext = ProviderReplayPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderReasoningOutputModeContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":654,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplayPolicy = ProviderReplayPolicy;","entrypoint":"plugin-entry","exportName":"ProviderReplayPolicy","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":563,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplayPolicyContext = ProviderReplayPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderReplayPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":586,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplaySessionEntry = ProviderReplaySessionEntry;","entrypoint":"plugin-entry","exportName":"ProviderReplaySessionEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":597,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderReplaySessionState = ProviderReplaySessionState;","entrypoint":"plugin-entry","exportName":"ProviderReplaySessionState","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":602,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderResolveConfigApiKeyContext = ProviderResolveConfigApiKeyContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveConfigApiKeyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":411,"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":484,"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":335,"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":465,"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":316,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderSanitizeReplayHistoryContext = ProviderSanitizeReplayHistoryContext;","entrypoint":"plugin-entry","exportName":"ProviderSanitizeReplayHistoryContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":613,"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":794,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderToolSchemaDiagnostic = ProviderToolSchemaDiagnostic;","entrypoint":"plugin-entry","exportName":"ProviderToolSchemaDiagnostic","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":642,"sourcePath":"src/plugins/types.ts"} -{"declaration":"export type ProviderValidateReplayTurnsContext = ProviderValidateReplayTurnsContext;","entrypoint":"plugin-entry","exportName":"ProviderValidateReplayTurnsContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":626,"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":679,"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":1504,"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":1915,"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":1771,"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":116,"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":1897,"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":1864,"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":1856,"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":131,"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":156,"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":1663,"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":87,"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":896,"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":191,"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":532,"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":270,"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":254,"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":176,"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":808,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderBuildUnknownModelHintContext = ProviderBuildUnknownModelHintContext;","entrypoint":"plugin-entry","exportName":"ProviderBuildUnknownModelHintContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":824,"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":840,"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":849,"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":795,"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":291,"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":314,"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":873,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderDeferSyntheticProfileAuthContext = ProviderDeferSyntheticProfileAuthContext;","entrypoint":"plugin-entry","exportName":"ProviderDeferSyntheticProfileAuthContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1010,"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":912,"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":513,"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":883,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeConfigContext = ProviderNormalizeConfigContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeConfigContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":403,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeModelIdContext = ProviderNormalizeModelIdContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeModelIdContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":392,"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":377,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeToolSchemasContext = ProviderNormalizeToolSchemasContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeToolSchemasContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":654,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderNormalizeTransportContext = ProviderNormalizeTransportContext;","entrypoint":"plugin-entry","exportName":"ProviderNormalizeTransportContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":415,"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":459,"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":368,"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":546,"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":438,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReasoningOutputMode = ProviderReasoningOutputMode;","entrypoint":"plugin-entry","exportName":"ProviderReasoningOutputMode","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":560,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReasoningOutputModeContext = ProviderReplayPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderReasoningOutputModeContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":670,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplayPolicy = ProviderReplayPolicy;","entrypoint":"plugin-entry","exportName":"ProviderReplayPolicy","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":579,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplayPolicyContext = ProviderReplayPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderReplayPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":602,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplaySessionEntry = ProviderReplaySessionEntry;","entrypoint":"plugin-entry","exportName":"ProviderReplaySessionEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":613,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderReplaySessionState = ProviderReplaySessionState;","entrypoint":"plugin-entry","exportName":"ProviderReplaySessionState","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":618,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveConfigApiKeyContext = ProviderResolveConfigApiKeyContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveConfigApiKeyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":427,"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":500,"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":351,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveTransportTurnStateContext = ProviderResolveTransportTurnStateContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveTransportTurnStateContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":717,"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":481,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderResolveWebSocketSessionPolicyContext = ProviderResolveWebSocketSessionPolicyContext;","entrypoint":"plugin-entry","exportName":"ProviderResolveWebSocketSessionPolicyContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":744,"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":332,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderSanitizeReplayHistoryContext = ProviderSanitizeReplayHistoryContext;","entrypoint":"plugin-entry","exportName":"ProviderSanitizeReplayHistoryContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":629,"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":861,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderToolSchemaDiagnostic = ProviderToolSchemaDiagnostic;","entrypoint":"plugin-entry","exportName":"ProviderToolSchemaDiagnostic","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":658,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderTransportTurnState = ProviderTransportTurnState;","entrypoint":"plugin-entry","exportName":"ProviderTransportTurnState","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":706,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderValidateReplayTurnsContext = ProviderValidateReplayTurnsContext;","entrypoint":"plugin-entry","exportName":"ProviderValidateReplayTurnsContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":642,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type ProviderWebSocketSessionPolicy = ProviderWebSocketSessionPolicy;","entrypoint":"plugin-entry","exportName":"ProviderWebSocketSessionPolicy","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":733,"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":695,"sourcePath":"src/plugins/types.ts"} +{"declaration":"export type RealtimeTranscriptionProviderPlugin = RealtimeTranscriptionProviderPlugin;","entrypoint":"plugin-entry","exportName":"RealtimeTranscriptionProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export","sourceLine":1617,"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":1591,"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":271,"sourcePath":"src/plugin-sdk/provider-onboard.ts"} {"declaration":"export function applyOnboardAuthAgentModelsAndProviders(cfg: OpenClawConfig, params: { agentModels: Record; providers: Record; }): OpenClawConfig;","entrypoint":"provider-onboard","exportName":"applyOnboardAuthAgentModelsAndProviders","importSpecifier":"openclaw/plugin-sdk/provider-onboard","kind":"function","recordType":"export","sourceLine":248,"sourcePath":"src/plugin-sdk/provider-onboard.ts"} @@ -724,7 +735,7 @@ {"declaration":"export function buildDispatchInboundCaptureMock>(actual: T, setCtx: (ctx: unknown) => void): T & { dispatchInboundMessage: Mock<(params: { ctx: unknown; }) => Promise<{ queuedFinal: boolean; counts: { tool: number; block: number; final: number; }; }>>; dispatchInboundMessageWithDispatcher: Mock<...>; dispatchInboundMessageWithBufferedDispatcher: Mock<...>; };","entrypoint":"testing","exportName":"buildDispatchInboundCaptureMock","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":12,"sourcePath":"src/channels/plugins/contracts/inbound-testkit.ts"} {"declaration":"export function callGateway>(opts: CallGatewayOptions): Promise;","entrypoint":"testing","exportName":"callGateway","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":938,"sourcePath":"src/gateway/call.ts"} {"declaration":"export function captureEnv(keys: string[]): { restore(): void; };","entrypoint":"testing","exportName":"captureEnv","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":3,"sourcePath":"src/test-utils/env.ts"} -{"declaration":"export function capturePluginRegistration(params: { register(api: OpenClawPluginApi): void; }): CapturedPluginRegistration;","entrypoint":"testing","exportName":"capturePluginRegistration","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":131,"sourcePath":"src/plugins/captured-registration.ts"} +{"declaration":"export function capturePluginRegistration(params: { register(api: OpenClawPluginApi): void; }): CapturedPluginRegistration;","entrypoint":"testing","exportName":"capturePluginRegistration","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":145,"sourcePath":"src/plugins/captured-registration.ts"} {"declaration":"export function countLines(text: string): number;","entrypoint":"testing","exportName":"countLines","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":1,"sourcePath":"src/test-utils/chunk-test-helpers.ts"} {"declaration":"export function createAuthCaptureJsonFetch(responseBody: unknown): { fetchFn: ((_input: RequestInfo | URL, init?: RequestInit | undefined) => Promise) & FetchWithPreconnect; getAuthHeader: () => string | null; };","entrypoint":"testing","exportName":"createAuthCaptureJsonFetch","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":45,"sourcePath":"src/media-understanding/audio.test-helpers.ts"} {"declaration":"export function createCliRuntimeCapture(): CliRuntimeCapture;","entrypoint":"testing","exportName":"createCliRuntimeCapture","importSpecifier":"openclaw/plugin-sdk/testing","kind":"function","recordType":"export","sourceLine":34,"sourcePath":"src/cli/test-runtime-capture.ts"} diff --git a/docs/plugins/sdk-provider-plugins.md b/docs/plugins/sdk-provider-plugins.md index a1133c940c9..24692684390 100644 --- a/docs/plugins/sdk-provider-plugins.md +++ b/docs/plugins/sdk-provider-plugins.md @@ -270,6 +270,28 @@ API key auth, and dynamic model resolution. }, ``` + + For providers that need native request/session headers or metadata on + generic HTTP or WebSocket transports: + + ```typescript + resolveTransportTurnState: (ctx) => ({ + headers: { + "x-request-id": ctx.turnId, + }, + metadata: { + session_id: ctx.sessionId ?? "", + turn_id: ctx.turnId, + }, + }), + resolveWebSocketSessionPolicy: (ctx) => ({ + headers: { + "x-session-id": ctx.sessionId ?? "", + }, + degradeCooldownMs: 60_000, + }), + ``` + For providers that expose usage/billing data: @@ -297,24 +319,26 @@ API key auth, and dynamic model resolution. | 5 | `capabilities` | Transcript/tooling metadata (data, not callable) | | 6 | `prepareExtraParams` | Default request params | | 7 | `wrapStreamFn` | Custom headers/body wrappers | - | 8 | `formatApiKey` | Custom runtime token shape | - | 9 | `refreshOAuth` | Custom OAuth refresh | - | 10 | `buildAuthDoctorHint` | Auth repair guidance | - | 11 | `isCacheTtlEligible` | Prompt cache TTL gating | - | 12 | `buildMissingAuthMessage` | Custom missing-auth hint | - | 13 | `suppressBuiltInModel` | Hide stale upstream rows | - | 14 | `augmentModelCatalog` | Synthetic forward-compat rows | - | 15 | `isBinaryThinking` | Binary thinking on/off | - | 16 | `supportsXHighThinking` | `xhigh` reasoning support | - | 17 | `resolveDefaultThinkingLevel` | Default `/think` policy | - | 18 | `isModernModelRef` | Live/smoke model matching | - | 19 | `prepareRuntimeAuth` | Token exchange before inference | - | 20 | `resolveUsageAuth` | Custom usage credential parsing | - | 21 | `fetchUsageSnapshot` | Custom usage endpoint | - | 22 | `onModelSelected` | Post-selection callback (e.g. telemetry) | - | 23 | `buildReplayPolicy` | Custom transcript policy (e.g. thinking-block stripping) | - | 24 | `sanitizeReplayHistory` | Provider-specific replay rewrites after generic cleanup | - | 25 | `validateReplayTurns` | Strict replay-turn validation before the embedded runner | + | 8 | `resolveTransportTurnState` | Native per-turn headers/metadata | + | 9 | `resolveWebSocketSessionPolicy` | Native WS session headers/cool-down | + | 10 | `formatApiKey` | Custom runtime token shape | + | 11 | `refreshOAuth` | Custom OAuth refresh | + | 12 | `buildAuthDoctorHint` | Auth repair guidance | + | 13 | `isCacheTtlEligible` | Prompt cache TTL gating | + | 14 | `buildMissingAuthMessage` | Custom missing-auth hint | + | 15 | `suppressBuiltInModel` | Hide stale upstream rows | + | 16 | `augmentModelCatalog` | Synthetic forward-compat rows | + | 17 | `isBinaryThinking` | Binary thinking on/off | + | 18 | `supportsXHighThinking` | `xhigh` reasoning support | + | 19 | `resolveDefaultThinkingLevel` | Default `/think` policy | + | 20 | `isModernModelRef` | Live/smoke model matching | + | 21 | `prepareRuntimeAuth` | Token exchange before inference | + | 22 | `resolveUsageAuth` | Custom usage credential parsing | + | 23 | `fetchUsageSnapshot` | Custom usage endpoint | + | 24 | `onModelSelected` | Post-selection callback (e.g. telemetry) | + | 25 | `buildReplayPolicy` | Custom transcript policy (e.g. thinking-block stripping) | + | 26 | `sanitizeReplayHistory` | Provider-specific replay rewrites after generic cleanup | + | 27 | `validateReplayTurns` | Strict replay-turn validation before the embedded runner | For detailed descriptions and real-world examples, see [Internals: Provider Runtime Hooks](/plugins/architecture#provider-runtime-hooks). diff --git a/docs/providers/openai.md b/docs/providers/openai.md index 35b1cea7f1c..bdcb3bd75c5 100644 --- a/docs/providers/openai.md +++ b/docs/providers/openai.md @@ -188,6 +188,16 @@ In `"auto"` mode, OpenClaw also retries one early, retryable WebSocket failure before it falls back to SSE. Forced `"websocket"` mode still surfaces transport errors directly instead of hiding them behind fallback. +After a connect or early-turn WebSocket failure in `"auto"` mode, OpenClaw marks +that session's WebSocket path as degraded for about 60 seconds and sends +subsequent turns over SSE during the cool-down instead of thrashing between +transports. + +For native OpenAI-family endpoints (`openai/*`, `openai-codex/*`, and Azure +OpenAI Responses), OpenClaw also attaches stable session and turn identity state +to requests so retries, reconnects, and SSE fallback stay aligned to the same +conversation identity. + You can set `agents.defaults.models..params.transport`: - `"sse"`: force SSE diff --git a/extensions/openai/openai-codex-provider.ts b/extensions/openai/openai-codex-provider.ts index 22bc7c2ce32..c477d8b3784 100644 --- a/extensions/openai/openai-codex-provider.ts +++ b/extensions/openai/openai-codex-provider.ts @@ -29,6 +29,10 @@ import { matchesExactOrPrefix, } from "./shared.js"; import { wrapOpenAICodexProviderStream } from "./stream-hooks.js"; +import { + resolveOpenAITransportTurnState, + resolveOpenAIWebSocketSessionPolicy, +} from "./transport-policy.js"; const PROVIDER_ID = "openai-codex"; const OPENAI_CODEX_BASE_URL = "https://chatgpt.com/backend-api"; @@ -313,6 +317,8 @@ export function buildOpenAICodexProviderPlugin(): ProviderPlugin { }; }, wrapStreamFn: (ctx) => wrapOpenAICodexProviderStream(ctx), + resolveTransportTurnState: (ctx) => resolveOpenAITransportTurnState(ctx), + resolveWebSocketSessionPolicy: (ctx) => resolveOpenAIWebSocketSessionPolicy(ctx), normalizeResolvedModel: (ctx) => { if (normalizeProviderId(ctx.provider) !== PROVIDER_ID) { return undefined; diff --git a/extensions/openai/openai-provider.ts b/extensions/openai/openai-provider.ts index a85a994f928..bb61d773da4 100644 --- a/extensions/openai/openai-provider.ts +++ b/extensions/openai/openai-provider.ts @@ -18,6 +18,10 @@ import { matchesExactOrPrefix, } from "./shared.js"; import { wrapAzureOpenAIProviderStream, wrapOpenAIProviderStream } from "./stream-hooks.js"; +import { + resolveOpenAITransportTurnState, + resolveOpenAIWebSocketSessionPolicy, +} from "./transport-policy.js"; const PROVIDER_ID = "openai"; const OPENAI_GPT_54_MODEL_ID = "gpt-5.4"; @@ -255,6 +259,8 @@ export function buildOpenAIProvider(): ProviderPlugin { normalizeProviderId(ctx.provider) === PROVIDER_ID ? wrapOpenAIProviderStream(ctx) : wrapAzureOpenAIProviderStream(ctx), + resolveTransportTurnState: (ctx) => resolveOpenAITransportTurnState(ctx), + resolveWebSocketSessionPolicy: (ctx) => resolveOpenAIWebSocketSessionPolicy(ctx), supportsXHighThinking: ({ modelId }) => matchesExactOrPrefix(modelId, OPENAI_XHIGH_MODEL_IDS), isModernModelRef: ({ modelId }) => matchesExactOrPrefix(modelId, OPENAI_MODERN_MODEL_IDS), buildMissingAuthMessage: (ctx) => { diff --git a/extensions/openai/transport-policy.test.ts b/extensions/openai/transport-policy.test.ts new file mode 100644 index 00000000000..71eaf312359 --- /dev/null +++ b/extensions/openai/transport-policy.test.ts @@ -0,0 +1,107 @@ +import type { ProviderRuntimeModel } from "openclaw/plugin-sdk/plugin-entry"; +import { describe, expect, it } from "vitest"; +import { + resolveOpenAITransportTurnState, + resolveOpenAIWebSocketSessionPolicy, +} from "./transport-policy.js"; + +describe("openai transport policy", () => { + const nativeModel = { + id: "gpt-5.4", + name: "GPT-5.4", + api: "openai-responses", + provider: "openai", + baseUrl: "https://api.openai.com/v1", + reasoning: true, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 200000, + maxTokens: 8192, + } satisfies ProviderRuntimeModel; + + const proxyModel = { + ...nativeModel, + id: "proxy-model", + name: "Proxy Model", + baseUrl: "https://proxy.example.com/v1", + } satisfies ProviderRuntimeModel; + + it("builds native turn state for direct OpenAI routes", () => { + expect( + resolveOpenAITransportTurnState({ + provider: "openai", + modelId: nativeModel.id, + model: nativeModel, + sessionId: "session-123", + turnId: "turn-123", + attempt: 2, + transport: "websocket", + }), + ).toMatchObject({ + headers: { + "x-client-request-id": "session-123", + "x-openclaw-session-id": "session-123", + "x-openclaw-turn-id": "turn-123", + "x-openclaw-turn-attempt": "2", + }, + metadata: { + openclaw_session_id: "session-123", + openclaw_turn_id: "turn-123", + openclaw_turn_attempt: "2", + openclaw_transport: "websocket", + }, + }); + }); + + it("skips turn state for proxy-like OpenAI routes", () => { + expect( + resolveOpenAITransportTurnState({ + provider: "openai", + modelId: proxyModel.id, + model: proxyModel, + sessionId: "session-123", + turnId: "turn-123", + attempt: 1, + transport: "stream", + }), + ).toBeUndefined(); + }); + + it("returns websocket session headers and cooldown for native routes", () => { + expect( + resolveOpenAIWebSocketSessionPolicy({ + provider: "openai", + modelId: nativeModel.id, + model: nativeModel, + sessionId: "session-123", + }), + ).toMatchObject({ + headers: { + "x-client-request-id": "session-123", + "x-openclaw-session-id": "session-123", + }, + degradeCooldownMs: 60_000, + }); + }); + + it("treats Azure routes as native OpenAI-family transports", () => { + expect( + resolveOpenAIWebSocketSessionPolicy({ + provider: "azure-openai-responses", + modelId: "gpt-5.4", + model: { + ...nativeModel, + provider: "azure-openai-responses", + baseUrl: "https://demo.openai.azure.com/openai/v1", + }, + sessionId: "session-123", + }), + ).toMatchObject({ + headers: { + "x-client-request-id": "session-123", + "x-openclaw-session-id": "session-123", + }, + degradeCooldownMs: 60_000, + }); + }); +}); diff --git a/extensions/openai/transport-policy.ts b/extensions/openai/transport-policy.ts new file mode 100644 index 00000000000..a87aaf9daa3 --- /dev/null +++ b/extensions/openai/transport-policy.ts @@ -0,0 +1,118 @@ +import type { + ProviderResolveTransportTurnStateContext, + ProviderResolveWebSocketSessionPolicyContext, + ProviderTransportTurnState, + ProviderWebSocketSessionPolicy, +} from "openclaw/plugin-sdk/plugin-entry"; +import { normalizeProviderId } from "openclaw/plugin-sdk/provider-model-shared"; +import { isOpenAIApiBaseUrl } from "./shared.js"; + +const DEFAULT_OPENAI_WS_DEGRADE_COOLDOWN_MS = 60_000; +const AZURE_PROVIDER_IDS = new Set(["azure-openai", "azure-openai-responses"]); +const OPENAI_CODEX_PROVIDER_ID = "openai-codex"; + +function isOpenAICodexBaseUrl(baseUrl?: string): boolean { + const trimmed = baseUrl?.trim(); + if (!trimmed) { + return false; + } + return /^https?:\/\/chatgpt\.com\/backend-api\/?$/i.test(trimmed); +} + +function isAzureOpenAIBaseUrl(baseUrl?: string): boolean { + const trimmed = baseUrl?.trim(); + if (!trimmed) { + return false; + } + try { + return new URL(trimmed).hostname.toLowerCase().endsWith(".openai.azure.com"); + } catch { + return false; + } +} + +function normalizeIdentityValue(value: string, maxLength = 160): string { + const trimmed = value.trim().replace(/[\r\n]+/g, " "); + return trimmed.length > maxLength ? trimmed.slice(0, maxLength) : trimmed; +} + +function usesKnownNativeOpenAIRoute(provider: string, baseUrl?: string): boolean { + const normalizedProvider = normalizeProviderId(provider); + if (!normalizedProvider) { + return false; + } + if (normalizedProvider === "openai") { + return !baseUrl || isOpenAIApiBaseUrl(baseUrl); + } + if (AZURE_PROVIDER_IDS.has(normalizedProvider)) { + return !baseUrl || isAzureOpenAIBaseUrl(baseUrl); + } + if (normalizedProvider === OPENAI_CODEX_PROVIDER_ID) { + return !baseUrl || isOpenAIApiBaseUrl(baseUrl) || isOpenAICodexBaseUrl(baseUrl); + } + return false; +} + +function resolveSessionHeaders(params: { + provider: string; + baseUrl?: string; + sessionId?: string; +}): Record | undefined { + if (!params.sessionId || !usesKnownNativeOpenAIRoute(params.provider, params.baseUrl)) { + return undefined; + } + const sessionId = normalizeIdentityValue(params.sessionId); + if (!sessionId) { + return undefined; + } + return { + "x-client-request-id": sessionId, + "x-openclaw-session-id": sessionId, + }; +} + +export function resolveOpenAITransportTurnState( + ctx: ProviderResolveTransportTurnStateContext, +): ProviderTransportTurnState | undefined { + const sessionHeaders = resolveSessionHeaders({ + provider: ctx.provider, + baseUrl: ctx.model?.baseUrl, + sessionId: ctx.sessionId, + }); + if (!sessionHeaders) { + return undefined; + } + + const turnId = normalizeIdentityValue(ctx.turnId); + const attempt = String(Math.max(1, ctx.attempt)); + + return { + headers: { + ...sessionHeaders, + "x-openclaw-turn-id": turnId, + "x-openclaw-turn-attempt": attempt, + }, + metadata: { + openclaw_session_id: sessionHeaders["x-openclaw-session-id"] ?? "", + openclaw_turn_id: turnId, + openclaw_turn_attempt: attempt, + openclaw_transport: ctx.transport, + }, + }; +} + +export function resolveOpenAIWebSocketSessionPolicy( + ctx: ProviderResolveWebSocketSessionPolicyContext, +): ProviderWebSocketSessionPolicy | undefined { + if (!usesKnownNativeOpenAIRoute(ctx.provider, ctx.model?.baseUrl)) { + return undefined; + } + return { + headers: resolveSessionHeaders({ + provider: ctx.provider, + baseUrl: ctx.model?.baseUrl, + sessionId: ctx.sessionId, + }), + degradeCooldownMs: DEFAULT_OPENAI_WS_DEGRADE_COOLDOWN_MS, + }; +} diff --git a/src/agents/openai-transport-stream.test.ts b/src/agents/openai-transport-stream.test.ts index 489b4466487..39be59ae336 100644 --- a/src/agents/openai-transport-stream.test.ts +++ b/src/agents/openai-transport-stream.test.ts @@ -501,6 +501,68 @@ describe("openai transport stream", () => { expect(params.tools?.[0]).not.toHaveProperty("strict"); }); + it("adds native OpenAI turn metadata on direct Responses routes", () => { + const params = buildOpenAIResponsesParams( + { + id: "gpt-5.4", + name: "GPT-5.4", + api: "openai-responses", + provider: "openai", + baseUrl: "https://api.openai.com/v1", + reasoning: true, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 200000, + maxTokens: 8192, + } satisfies Model<"openai-responses">, + { + systemPrompt: "system", + messages: [], + tools: [], + } as never, + { sessionId: "session-123" } as never, + { + openclaw_session_id: "session-123", + openclaw_turn_id: "turn-123", + openclaw_turn_attempt: "1", + openclaw_transport: "stream", + }, + ) as { metadata?: Record }; + + expect(params.metadata).toMatchObject({ + openclaw_session_id: "session-123", + openclaw_turn_id: "turn-123", + openclaw_turn_attempt: "1", + openclaw_transport: "stream", + }); + }); + + it("leaves proxy-like OpenAI Responses routes without native turn metadata by default", () => { + const params = buildOpenAIResponsesParams( + { + id: "custom-model", + name: "Custom Model", + api: "openai-responses", + provider: "openai", + baseUrl: "https://proxy.example.com/v1", + reasoning: true, + input: ["text"], + cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 }, + contextWindow: 200000, + maxTokens: 8192, + } satisfies Model<"openai-responses">, + { + systemPrompt: "system", + messages: [], + tools: [], + } as never, + { sessionId: "session-123" } as never, + undefined, + ) as { metadata?: Record }; + + expect(params).not.toHaveProperty("metadata"); + }); + it("gates responses service_tier to native OpenAI endpoints", () => { const nativeParams = buildOpenAIResponsesParams( { diff --git a/src/agents/openai-transport-stream.ts b/src/agents/openai-transport-stream.ts index f590cc98699..55eb53ef7f6 100644 --- a/src/agents/openai-transport-stream.ts +++ b/src/agents/openai-transport-stream.ts @@ -1,3 +1,4 @@ +import { randomUUID } from "node:crypto"; import type { StreamFn } from "@mariozechner/pi-agent-core"; import { calculateCost, @@ -18,6 +19,8 @@ import type { ResponseInput, ResponseInputMessageContentList, } from "openai/resources/responses/responses.js"; +import { resolveProviderTransportTurnStateWithPlugin } from "../plugins/provider-runtime.js"; +import type { ProviderRuntimeModel } from "../plugins/types.js"; import { buildCopilotDynamicHeaders, hasCopilotVisionInput } from "./copilot-dynamic-headers.js"; import { resolveOpenAICompletionsCompatDefaultsFromCapabilities } from "./openai-completions-compat.js"; import { @@ -27,7 +30,7 @@ import { import { resolveProviderRequestCapabilities } from "./provider-attribution.js"; import { buildGuardedModelFetch } from "./provider-transport-fetch.js"; import { transformTransportMessages } from "./transport-message-transform.js"; -import { sanitizeTransportPayloadText } from "./transport-stream-shared.js"; +import { mergeTransportMetadata, sanitizeTransportPayloadText } from "./transport-stream-shared.js"; const DEFAULT_AZURE_OPENAI_API_VERSION = "2024-12-01-preview"; @@ -561,6 +564,7 @@ function buildOpenAIClientHeaders( model: Model, context: Context, optionHeaders?: Record, + turnHeaders?: Record, ): Record { const headers = { ...model.headers }; if (model.provider === "github-copilot") { @@ -575,20 +579,47 @@ function buildOpenAIClientHeaders( if (optionHeaders) { Object.assign(headers, optionHeaders); } + if (turnHeaders) { + Object.assign(headers, turnHeaders); + } return headers; } +function resolveProviderTransportTurnState( + model: Model, + params: { + sessionId?: string; + turnId: string; + attempt: number; + transport: "stream" | "websocket"; + }, +) { + return resolveProviderTransportTurnStateWithPlugin({ + provider: model.provider, + context: { + provider: model.provider, + modelId: model.id, + model: model as ProviderRuntimeModel, + sessionId: params.sessionId, + turnId: params.turnId, + attempt: params.attempt, + transport: params.transport, + }, + }); +} + function createOpenAIResponsesClient( model: Model, context: Context, apiKey: string, optionHeaders?: Record, + turnHeaders?: Record, ) { return new OpenAI({ apiKey, baseURL: model.baseUrl, dangerouslyAllowBrowser: true, - defaultHeaders: buildOpenAIClientHeaders(model, context, optionHeaders), + defaultHeaders: buildOpenAIClientHeaders(model, context, optionHeaders, turnHeaders), fetch: buildGuardedModelFetch(model), }); } @@ -617,12 +648,30 @@ export function createOpenAIResponsesTransportStreamFn(): StreamFn { }; try { const apiKey = options?.apiKey || getEnvApiKey(model.provider) || ""; - const client = createOpenAIResponsesClient(model, context, apiKey, options?.headers); - let params = buildOpenAIResponsesParams(model, context, options as OpenAIResponsesOptions); + const turnState = resolveProviderTransportTurnState(model, { + sessionId: options?.sessionId, + turnId: randomUUID(), + attempt: 1, + transport: "stream", + }); + const client = createOpenAIResponsesClient( + model, + context, + apiKey, + options?.headers, + turnState?.headers, + ); + let params = buildOpenAIResponsesParams( + model, + context, + options as OpenAIResponsesOptions, + turnState?.metadata, + ); const nextParams = await options?.onPayload?.(params, model); if (nextParams !== undefined) { params = nextParams as typeof params; } + params = mergeTransportMetadata(params, turnState?.metadata); const responseStream = (await client.responses.create( params as never, options?.signal ? { signal: options.signal } : undefined, @@ -675,6 +724,7 @@ export function buildOpenAIResponsesParams( model: Model, context: Context, options: OpenAIResponsesOptions | undefined, + metadata?: Record, ) { const compat = getCompat(model as OpenAIModeModel); const supportsDeveloperRole = @@ -695,6 +745,7 @@ export function buildOpenAIResponsesParams( stream: true, prompt_cache_key: cacheRetention === "none" ? undefined : options?.sessionId, prompt_cache_retention: getPromptCacheRetention(model.baseUrl, cacheRetention), + ...(metadata ? { metadata } : {}), }; if (options?.maxTokens) { params.max_output_tokens = options.maxTokens; @@ -749,18 +800,32 @@ export function createAzureOpenAIResponsesTransportStreamFn(): StreamFn { }; try { const apiKey = options?.apiKey || getEnvApiKey(model.provider) || ""; - const client = createAzureOpenAIClient(model, context, apiKey, options?.headers); + const turnState = resolveProviderTransportTurnState(model, { + sessionId: options?.sessionId, + turnId: randomUUID(), + attempt: 1, + transport: "stream", + }); + const client = createAzureOpenAIClient( + model, + context, + apiKey, + options?.headers, + turnState?.headers, + ); const deploymentName = resolveAzureDeploymentName(model); let params = buildAzureOpenAIResponsesParams( model, context, options as OpenAIResponsesOptions | undefined, deploymentName, + turnState?.metadata, ); const nextParams = await options?.onPayload?.(params, model); if (nextParams !== undefined) { params = nextParams as typeof params; } + params = mergeTransportMetadata(params, turnState?.metadata); const responseStream = (await client.responses.create( params as never, options?.signal ? { signal: options.signal } : undefined, @@ -808,12 +873,13 @@ function createAzureOpenAIClient( context: Context, apiKey: string, optionHeaders?: Record, + turnHeaders?: Record, ) { return new AzureOpenAI({ apiKey, apiVersion: resolveAzureOpenAIApiVersion(), dangerouslyAllowBrowser: true, - defaultHeaders: buildOpenAIClientHeaders(model, context, optionHeaders), + defaultHeaders: buildOpenAIClientHeaders(model, context, optionHeaders, turnHeaders), baseURL: normalizeAzureBaseUrl(model.baseUrl), fetch: buildGuardedModelFetch(model), }); @@ -824,8 +890,9 @@ function buildAzureOpenAIResponsesParams( context: Context, options: OpenAIResponsesOptions | undefined, deploymentName: string, + metadata?: Record, ) { - const params = buildOpenAIResponsesParams(model, context, options); + const params = buildOpenAIResponsesParams(model, context, options, metadata); params.model = deploymentName; delete params.store; return params; @@ -1148,6 +1215,7 @@ type OpenAIResponsesRequestParams = { stream: true; prompt_cache_key?: string; prompt_cache_retention?: "24h"; + metadata?: Record; store?: boolean; max_output_tokens?: number; temperature?: number; diff --git a/src/agents/openai-ws-connection.test.ts b/src/agents/openai-ws-connection.test.ts index e698f3173c1..ca393691698 100644 --- a/src/agents/openai-ws-connection.test.ts +++ b/src/agents/openai-ws-connection.test.ts @@ -252,6 +252,27 @@ describe("OpenAIWebSocketManager", () => { await connectPromise; }); + it("merges native session headers into the websocket handshake", async () => { + const manager = buildManager({ + headers: { + "x-client-request-id": "session-123", + "x-openclaw-session-id": "session-123", + }, + }); + const connectPromise = manager.connect("sk-test-key"); + + const sock = lastSocket(); + expect(sock.options).toMatchObject({ + headers: expect.objectContaining({ + "x-client-request-id": "session-123", + "x-openclaw-session-id": "session-123", + }), + }); + + sock.simulateOpen(); + await connectPromise; + }); + it("does not add hidden attribution headers on custom websocket endpoints", async () => { const manager = buildManager({ url: "wss://proxy.example.com/v1/responses", diff --git a/src/agents/openai-ws-connection.ts b/src/agents/openai-ws-connection.ts index 6c982da8d42..baef88c8ecd 100644 --- a/src/agents/openai-ws-connection.ts +++ b/src/agents/openai-ws-connection.ts @@ -281,6 +281,8 @@ export interface OpenAIWebSocketManagerOptions { backoffDelaysMs?: readonly number[]; /** Custom socket factory for tests. */ socketFactory?: (url: string, options: ClientOptions) => WebSocket; + /** Extra headers merged into the initial WebSocket handshake request. */ + headers?: Record; /** Optional transport overrides for provider-owned auth or TLS wiring. */ request?: ProviderRequestTransportOverrides; } @@ -338,6 +340,7 @@ export class OpenAIWebSocketManager extends EventEmitter { private readonly maxRetries: number; private readonly backoffDelaysMs: readonly number[]; private readonly socketFactory: (url: string, options: ClientOptions) => WebSocket; + private readonly headers?: Record; private readonly request?: ProviderRequestTransportOverrides; constructor(options: OpenAIWebSocketManagerOptions = {}) { @@ -347,6 +350,7 @@ export class OpenAIWebSocketManager extends EventEmitter { this.backoffDelaysMs = options.backoffDelaysMs ?? BACKOFF_DELAYS_MS; this.socketFactory = options.socketFactory ?? ((url, socketOptions) => new WebSocket(url, socketOptions)); + this.headers = options.headers; this.request = options.request; } @@ -454,6 +458,7 @@ export class OpenAIWebSocketManager extends EventEmitter { providerHeaders: { Authorization: `Bearer ${this.apiKey}`, "OpenAI-Beta": "responses-websocket=v1", + ...this.headers, }, precedence: "defaults-win", request: this.request, @@ -607,7 +612,12 @@ export class OpenAIWebSocketManager extends EventEmitter { * Sends a warm-up event to pre-load the connection and model without generating output. * Pass tools/instructions to prime the connection for the upcoming session. */ - warmUp(params: { model: string; tools?: FunctionToolDefinition[]; instructions?: string }): void { + warmUp(params: { + model: string; + tools?: FunctionToolDefinition[]; + instructions?: string; + metadata?: Record; + }): void { const event = buildOpenAIWebSocketWarmUpPayload(params); this.send(event); } diff --git a/src/agents/openai-ws-request.ts b/src/agents/openai-ws-request.ts index fb3fb0e2816..f0772239ee2 100644 --- a/src/agents/openai-ws-request.ts +++ b/src/agents/openai-ws-request.ts @@ -30,6 +30,7 @@ export function buildOpenAIWebSocketWarmUpPayload(params: { model: string; tools?: FunctionToolDefinition[]; instructions?: string; + metadata?: Record; }): WarmUpEvent { return { type: "response.create", @@ -38,6 +39,7 @@ export function buildOpenAIWebSocketWarmUpPayload(params: { input: [], ...(params.tools?.length ? { tools: params.tools } : {}), ...(params.instructions ? { instructions: params.instructions } : {}), + ...(params.metadata ? { metadata: params.metadata } : {}), }; } @@ -47,6 +49,7 @@ export function buildOpenAIWebSocketResponseCreatePayload(params: { options?: WsOptions; turnInput: PlannedWsTurnInput; tools: FunctionToolDefinition[]; + metadata?: Record; }): ResponseCreateEvent { const extraParams: Record = {}; const streamOpts = params.options; @@ -108,6 +111,7 @@ export function buildOpenAIWebSocketResponseCreatePayload(params: { ...(params.turnInput.previousResponseId ? { previous_response_id: params.turnInput.previousResponseId } : {}), + ...(params.metadata ? { metadata: params.metadata } : {}), ...extraParams, }; } diff --git a/src/agents/openai-ws-stream.test.ts b/src/agents/openai-ws-stream.test.ts index a55b753a6fd..5740dbd0cbb 100644 --- a/src/agents/openai-ws-stream.test.ts +++ b/src/agents/openai-ws-stream.test.ts @@ -47,11 +47,17 @@ const { MockManager } = vi.hoisted(() => { sentEvents: unknown[] = []; connectCallCount = 0; closeCallCount = 0; + options: unknown; // Allow tests to override connect/send behaviour connectShouldFail = false; sendShouldFail = false; + constructor(options?: unknown) { + super(); + this.options = options; + } + get previousResponseId(): string | null { return this._previousResponseId; } @@ -201,9 +207,9 @@ const { MockManager } = vi.hoisted(() => { }); // Track if streamSimple (HTTP fallback) was called -const streamSimpleCalls: Array<{ model: unknown; context: unknown }> = []; -const mockStreamSimple = vi.fn((model: unknown, context: unknown) => { - streamSimpleCalls.push({ model, context }); +const streamSimpleCalls: Array<{ model: unknown; context: unknown; options?: unknown }> = []; +const mockStreamSimple = vi.fn((model: unknown, context: unknown, options?: unknown) => { + streamSimpleCalls.push({ model, context, options }); const stream = createAssistantMessageEventStream(); queueMicrotask(() => { const msg = makeFakeAssistantMessage("http fallback response"); @@ -1174,7 +1180,7 @@ describe("createOpenAIWebSocketStreamFn", () => { MockManager.reset(); streamSimpleCalls.length = 0; openAIWsStreamTesting.setDepsForTest({ - createManager: (() => new MockManager()) as never, + createManager: ((options?: unknown) => new MockManager(options)) as never, streamSimple: mockStreamSimple, }); }); @@ -1196,7 +1202,10 @@ describe("createOpenAIWebSocketStreamFn", () => { releaseWsSession("sess-store-compat"); releaseWsSession("sess-max-tokens-zero"); releaseWsSession("sess-runtime-fallback"); + releaseWsSession("sess-turn-metadata-retry"); + releaseWsSession("sess-degraded-cooldown"); releaseWsSession("sess-drop"); + openAIWsStreamTesting.setWsDegradeCooldownMsForTest(); openAIWsStreamTesting.setDepsForTest(); }); @@ -1447,8 +1456,8 @@ describe("createOpenAIWebSocketStreamFn", () => { // streamSimple was called as part of HTTP fallback expect(streamSimpleCalls.length).toBeGreaterThanOrEqual(1); - // manager.close() must be called to cancel background reconnect attempts - expect(MockManager.lastInstance!.closeCallCount).toBeGreaterThanOrEqual(1); + // The failed manager is closed before the replacement session manager is installed. + expect(MockManager.instances.some((instance) => instance.closeCallCount >= 1)).toBe(true); } finally { MockManager.globalConnectShouldFail = false; } @@ -1550,6 +1559,103 @@ describe("createOpenAIWebSocketStreamFn", () => { const doneEvent = events.find((event) => event.type === "done"); expect(doneEvent?.message?.content?.[0]?.text).toBe("retry succeeded"); }); + + it("keeps native turn metadata stable across websocket retries and increments attempt", async () => { + const streamFn = createOpenAIWebSocketStreamFn("sk-test", "sess-turn-metadata-retry"); + const stream = streamFn( + modelStub as Parameters[0], + contextStub as Parameters[1], + { transport: "auto" } as Parameters[2], + ); + + await new Promise((r) => setImmediate(r)); + const firstManager = MockManager.lastInstance!; + firstManager.simulateClose(1006, "connection lost"); + + await new Promise((r) => setImmediate(r)); + const secondManager = MockManager.lastInstance!; + secondManager.simulateEvent({ + type: "response.completed", + response: makeResponseObject("resp-retried-meta", "retry succeeded"), + }); + + for await (const _ of await resolveStream(stream)) { + // consume + } + + const firstPayload = firstManager.sentEvents[0] as { metadata?: Record }; + const secondPayload = secondManager.sentEvents[0] as { metadata?: Record }; + expect(firstPayload.metadata?.openclaw_session_id).toBe("sess-turn-metadata-retry"); + expect(firstPayload.metadata?.openclaw_transport).toBe("websocket"); + expect(firstPayload.metadata?.openclaw_turn_id).toBeTruthy(); + expect(secondPayload.metadata?.openclaw_turn_id).toBe(firstPayload.metadata?.openclaw_turn_id); + expect(firstPayload.metadata?.openclaw_turn_attempt).toBe("1"); + expect(secondPayload.metadata?.openclaw_turn_attempt).toBe("2"); + }); + + it("keeps websocket degraded for the session until the cool-down expires", async () => { + openAIWsStreamTesting.setWsDegradeCooldownMsForTest(50); + MockManager.globalConnectShouldFail = true; + + try { + const sessionId = "sess-degraded-cooldown"; + const streamFn = createOpenAIWebSocketStreamFn("sk-test", sessionId); + + const firstStream = streamFn( + modelStub as Parameters[0], + contextStub as Parameters[1], + { transport: "auto" } as Parameters[2], + ); + void firstStream; + await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => setImmediate(resolve)); + + expect(streamSimpleCalls.length).toBe(1); + expect(MockManager.instances).toHaveLength(2); + const cooledManager = MockManager.lastInstance!; + expect(cooledManager.connectCallCount).toBe(0); + + MockManager.globalConnectShouldFail = false; + + const secondStream = streamFn( + modelStub as Parameters[0], + contextStub as Parameters[1], + { transport: "auto" } as Parameters[2], + ); + void secondStream; + await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => setImmediate(resolve)); + + expect(streamSimpleCalls.length).toBe(2); + expect(MockManager.instances).toHaveLength(2); + expect(cooledManager.connectCallCount).toBe(0); + + await new Promise((resolve) => setTimeout(resolve, 60)); + + const thirdStream = streamFn( + modelStub as Parameters[0], + contextStub as Parameters[1], + { transport: "auto" } as Parameters[2], + ); + + void thirdStream; + await new Promise((resolve) => setImmediate(resolve)); + await new Promise((resolve) => setImmediate(resolve)); + expect(cooledManager.connectCallCount).toBe(1); + expect(streamSimpleCalls.length).toBe(2); + cooledManager.simulateEvent({ + type: "response.completed", + response: makeResponseObject("resp-after-cooldown", "ws recovered"), + }); + await new Promise((resolve) => setImmediate(resolve)); + } finally { + MockManager.globalConnectShouldFail = false; + openAIWsStreamTesting.setWsDegradeCooldownMsForTest(); + releaseWsSession("sess-degraded-cooldown"); + releaseWsSession("sess-turn-metadata-retry"); + } + }); + it("tracks previous_response_id across turns (incremental send)", async () => { const sessionId = "sess-incremental"; const streamFn = createOpenAIWebSocketStreamFn("sk-test", sessionId); diff --git a/src/agents/openai-ws-stream.ts b/src/agents/openai-ws-stream.ts index 710b559c9ac..b247f44151c 100644 --- a/src/agents/openai-ws-stream.ts +++ b/src/agents/openai-ws-stream.ts @@ -21,6 +21,7 @@ * @see src/agents/openai-ws-connection.ts for the connection manager */ +import { randomUUID } from "node:crypto"; import type { StreamFn } from "@mariozechner/pi-agent-core"; import type { AssistantMessage, @@ -29,6 +30,11 @@ import type { StopReason, } from "@mariozechner/pi-ai"; import * as piAi from "@mariozechner/pi-ai"; +import { + resolveProviderTransportTurnStateWithPlugin, + resolveProviderWebSocketSessionPolicyWithPlugin, +} from "../plugins/provider-runtime.js"; +import type { ProviderRuntimeModel, ProviderTransportTurnState } from "../plugins/types.js"; import { getOpenAIWebSocketErrorDetails, OpenAIWebSocketManager, @@ -47,6 +53,7 @@ import { buildAssistantMessageWithZeroUsage, buildStreamErrorAssistantMessage, } from "./stream-message-shared.js"; +import { mergeTransportMetadata } from "./transport-stream-shared.js"; // ───────────────────────────────────────────────────────────────────────────── // Per-session state @@ -62,6 +69,9 @@ interface WsSession { warmUpAttempted: boolean; /** True if the session is permanently broken (no more reconnect). */ broken: boolean; + /** Session-scoped cool-down after repeated websocket failures. */ + degradedUntil: number | null; + degradeCooldownMs: number; } /** Module-level registry: sessionId → WsSession */ @@ -208,6 +218,8 @@ export interface OpenAIWebSocketStreamOptions { type WsTransport = "sse" | "websocket" | "auto"; const WARM_UP_TIMEOUT_MS = 8_000; const MAX_AUTO_WS_RUNTIME_RETRIES = 1; +const DEFAULT_WS_DEGRADE_COOLDOWN_MS = 60_000; +let wsDegradeCooldownMsOverride: number | undefined; class OpenAIWebSocketRuntimeError extends Error { readonly kind: "disconnect" | "send" | "server"; @@ -247,13 +259,100 @@ function resolveWsWarmup(options: Parameters[2]): boolean { return warmup === true; } -function resetWsSession(params: { sessionId: string; session: WsSession }): void { +function resetWsSession(params: { + session: WsSession; + createManager: () => OpenAIWebSocketManager; + preserveDegradeUntil?: boolean; +}): void { try { params.session.manager.close(); } catch { /* ignore */ } - wsRegistry.delete(params.sessionId); + params.session.manager = params.createManager(); + params.session.everConnected = false; + params.session.warmUpAttempted = false; + params.session.broken = false; + if (!params.preserveDegradeUntil) { + params.session.degradedUntil = null; + } +} + +function markWsSessionDegraded(session: WsSession): void { + session.degradedUntil = Date.now() + session.degradeCooldownMs; +} + +function isWsSessionDegraded(session: WsSession): boolean { + if (!session.degradedUntil) { + return false; + } + if (session.degradedUntil <= Date.now()) { + session.degradedUntil = null; + return false; + } + return true; +} + +function createWsManager( + managerOptions: OpenAIWebSocketManagerOptions | undefined, + sessionHeaders?: Record, +): OpenAIWebSocketManager { + return openAIWsStreamDeps.createManager({ + ...managerOptions, + ...(sessionHeaders + ? { + headers: { + ...managerOptions?.headers, + ...sessionHeaders, + }, + } + : {}), + }); +} + +function resolveProviderTransportTurnState( + model: Parameters[0], + params: { + sessionId?: string; + turnId: string; + attempt: number; + transport: "stream" | "websocket"; + }, +): ProviderTransportTurnState | undefined { + return resolveProviderTransportTurnStateWithPlugin({ + provider: model.provider, + context: { + provider: model.provider, + modelId: model.id, + model: model as ProviderRuntimeModel, + sessionId: params.sessionId, + turnId: params.turnId, + attempt: params.attempt, + transport: params.transport, + }, + }); +} + +function resolveWebSocketSessionPolicy( + model: Parameters[0], + sessionId: string, +): { headers?: Record; degradeCooldownMs: number } { + const policy = resolveProviderWebSocketSessionPolicyWithPlugin({ + provider: model.provider, + context: { + provider: model.provider, + modelId: model.id, + model: model as ProviderRuntimeModel, + sessionId, + }, + }); + return { + headers: policy?.headers, + degradeCooldownMs: Math.max( + 0, + wsDegradeCooldownMsOverride ?? policy?.degradeCooldownMs ?? DEFAULT_WS_DEGRADE_COOLDOWN_MS, + ), + }; } function formatOpenAIWebSocketError( @@ -311,6 +410,7 @@ async function runWarmUp(params: { modelId: string; tools: FunctionToolDefinition[]; instructions?: string; + metadata?: Record; signal?: AbortSignal; }): Promise { if (params.signal?.aborted) { @@ -358,6 +458,7 @@ async function runWarmUp(params: { model: params.modelId, tools: params.tools.length > 0 ? params.tools : undefined, instructions: params.instructions, + ...(params.metadata ? { metadata: params.metadata } : {}), }); }); } @@ -392,34 +493,55 @@ export function createOpenAIWebSocketStreamFn( const signal = opts.signal ?? (options as WsOptions | undefined)?.signal; let emittedStart = false; let runtimeRetries = 0; + const turnId = randomUUID(); + let turnAttempt = 0; + const wsSessionPolicy = resolveWebSocketSessionPolicy(model, sessionId); + const sessionHeaders = wsSessionPolicy.headers; while (true) { let session = wsRegistry.get(sessionId); if (!session) { - const manager = openAIWsStreamDeps.createManager(opts.managerOptions); + const manager = createWsManager(opts.managerOptions, sessionHeaders); session = { manager, lastContextLength: 0, everConnected: false, warmUpAttempted: false, broken: false, + degradedUntil: null, + degradeCooldownMs: wsSessionPolicy.degradeCooldownMs, }; wsRegistry.set(sessionId, session); } + if (transport !== "websocket" && isWsSessionDegraded(session)) { + log.debug( + `[ws-stream] session=${sessionId} in websocket cool-down; using HTTP fallback until ${new Date(session.degradedUntil!).toISOString()}`, + ); + return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { + suppressStart: emittedStart, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: Math.max(1, turnAttempt), + transport: "stream", + }), + }); + } + if (!session.manager.isConnected() && !session.broken) { try { await session.manager.connect(apiKey); session.everConnected = true; + session.degradedUntil = null; log.debug(`[ws-stream] connected for session=${sessionId}`); } catch (connErr) { - try { - session.manager.close(); - } catch { - /* ignore */ - } - session.broken = true; - wsRegistry.delete(sessionId); + markWsSessionDegraded(session); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + preserveDegradeUntil: true, + }); if (transport === "websocket") { throw connErr instanceof Error ? connErr : new Error(String(connErr)); } @@ -428,6 +550,12 @@ export function createOpenAIWebSocketStreamFn( ); return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { suppressStart: emittedStart, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: Math.max(1, turnAttempt), + transport: "stream", + }), }); } } @@ -437,9 +565,20 @@ export function createOpenAIWebSocketStreamFn( throw new Error("WebSocket session disconnected"); } log.warn(`[ws-stream] session=${sessionId} broken/disconnected; falling back to HTTP`); - resetWsSession({ sessionId, session }); + markWsSessionDegraded(session); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + preserveDegradeUntil: true, + }); return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { suppressStart: emittedStart, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: Math.max(1, turnAttempt), + transport: "stream", + }), }); } @@ -452,6 +591,12 @@ export function createOpenAIWebSocketStreamFn( modelId: model.id, tools: convertTools(context.tools), instructions: context.systemPrompt ?? undefined, + metadata: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: Math.max(1, turnAttempt), + transport: "websocket", + })?.metadata, signal, }); log.debug(`[ws-stream] warm-up completed for session=${sessionId}`); @@ -471,12 +616,18 @@ export function createOpenAIWebSocketStreamFn( /* ignore */ } try { + session.manager = createWsManager(opts.managerOptions, sessionHeaders); await session.manager.connect(apiKey); session.everConnected = true; + session.degradedUntil = null; log.debug(`[ws-stream] reconnected after warm-up failure for session=${sessionId}`); } catch (reconnectErr) { - session.broken = true; - wsRegistry.delete(sessionId); + markWsSessionDegraded(session); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + preserveDegradeUntil: true, + }); if (transport === "websocket") { throw reconnectErr instanceof Error ? reconnectErr @@ -487,6 +638,12 @@ export function createOpenAIWebSocketStreamFn( ); return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { suppressStart: emittedStart, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: Math.max(1, turnAttempt), + transport: "stream", + }), }); } } @@ -513,17 +670,27 @@ export function createOpenAIWebSocketStreamFn( ); } - const payload = buildOpenAIWebSocketResponseCreatePayload({ + turnAttempt++; + const turnState = resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: turnAttempt, + transport: "websocket", + }); + let payload = buildOpenAIWebSocketResponseCreatePayload({ model, context, options: options as WsOptions | undefined, turnInput, tools: convertTools(context.tools), + metadata: turnState?.metadata, }) as Record; const nextPayload = options?.onPayload?.(payload, model); - const requestPayload = (nextPayload ?? payload) as Parameters< - OpenAIWebSocketManager["send"] - >[0]; + payload = mergeTransportMetadata( + (nextPayload ?? payload) as Record, + turnState?.metadata, + ); + const requestPayload = payload as Parameters[0]; try { session.manager.send(requestPayload); @@ -538,16 +705,30 @@ export function createOpenAIWebSocketStreamFn( log.warn( `[ws-stream] retrying websocket turn after send failure for session=${sessionId} (${runtimeRetries}/${MAX_AUTO_WS_RUNTIME_RETRIES}). error=${normalizedErr.message}`, ); - resetWsSession({ sessionId, session }); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + }); continue; } if (transport !== "websocket") { log.warn( `[ws-stream] send failed for session=${sessionId}; falling back to HTTP. error=${normalizedErr.message}`, ); - resetWsSession({ sessionId, session }); + markWsSessionDegraded(session); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + preserveDegradeUntil: true, + }); return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { suppressStart: emittedStart, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: turnAttempt, + transport: "stream", + }), }); } throw normalizedErr; @@ -680,16 +861,30 @@ export function createOpenAIWebSocketStreamFn( log.warn( `[ws-stream] retrying websocket turn after retryable runtime failure for session=${sessionId} (${runtimeRetries}/${MAX_AUTO_WS_RUNTIME_RETRIES}). error=${normalizedErr.message}`, ); - resetWsSession({ sessionId, session }); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + }); continue; } if (transport !== "websocket" && !signal?.aborted && !sawWsOutput) { log.warn( `[ws-stream] session=${sessionId} runtime failure before output; falling back to HTTP. error=${normalizedErr.message}`, ); - resetWsSession({ sessionId, session }); + markWsSessionDegraded(session); + resetWsSession({ + session, + createManager: () => createWsManager(opts.managerOptions, sessionHeaders), + preserveDegradeUntil: true, + }); return fallbackToHttp(model, context, options, apiKey, eventStream, opts.signal, { suppressStart: true, + turnState: resolveProviderTransportTurnState(model, { + sessionId, + turnId, + attempt: turnAttempt, + transport: "stream", + }), }); } throw normalizedErr; @@ -728,11 +923,35 @@ async function fallbackToHttp( apiKey: string, eventStream: AssistantMessageEventStreamLike, signal?: AbortSignal, - fallbackOptions?: { suppressStart?: boolean }, + fallbackOptions?: { + suppressStart?: boolean; + turnState?: ProviderTransportTurnState; + }, ): Promise { + const baseOnPayload = streamOptions?.onPayload; const mergedOptions = { ...streamOptions, apiKey, + ...(fallbackOptions?.turnState?.headers + ? { + headers: { + ...streamOptions?.headers, + ...fallbackOptions.turnState.headers, + }, + } + : {}), + ...(fallbackOptions?.turnState?.metadata + ? { + onPayload: async ( + payload: unknown, + payloadModel: Parameters>[1], + ) => { + const nextPayload = await baseOnPayload?.(payload, payloadModel); + const resolvedPayload = (nextPayload ?? payload) as Record; + return mergeTransportMetadata(resolvedPayload, fallbackOptions.turnState?.metadata); + }, + } + : {}), ...(signal ? { signal } : {}), }; const httpStream = openAIWsStreamDeps.streamSimple(model, context, mergedOptions); @@ -753,4 +972,7 @@ export const __testing = { } : defaultOpenAIWsStreamDeps; }, + setWsDegradeCooldownMsForTest(nextMs?: number) { + wsDegradeCooldownMsOverride = nextMs; + }, }; diff --git a/src/agents/transport-stream-shared.ts b/src/agents/transport-stream-shared.ts index 4a88065d9b1..1e328bbb0de 100644 --- a/src/agents/transport-stream-shared.ts +++ b/src/agents/transport-stream-shared.ts @@ -38,6 +38,26 @@ export function mergeTransportHeaders( return Object.keys(merged).length > 0 ? merged : undefined; } +export function mergeTransportMetadata>( + payload: T, + metadata?: Record, +): T { + if (!metadata || Object.keys(metadata).length === 0) { + return payload; + } + const existingMetadata = + payload.metadata && typeof payload.metadata === "object" && !Array.isArray(payload.metadata) + ? (payload.metadata as Record) + : undefined; + return { + ...payload, + metadata: { + ...existingMetadata, + ...metadata, + }, + }; +} + export function createEmptyTransportUsage(): TransportUsage { return { input: 0, diff --git a/src/plugin-sdk/core.ts b/src/plugin-sdk/core.ts index 1f3e3172d0d..291664c6936 100644 --- a/src/plugin-sdk/core.ts +++ b/src/plugin-sdk/core.ts @@ -65,14 +65,18 @@ export type { ProviderReplaySessionEntry, ProviderReplaySessionState, ProviderResolveDynamicModelContext, + ProviderResolveTransportTurnStateContext, + ProviderResolveWebSocketSessionPolicyContext, ProviderResolvedUsageAuth, RealtimeTranscriptionProviderPlugin, ProviderSanitizeReplayHistoryContext, + ProviderTransportTurnState, ProviderToolSchemaDiagnostic, ProviderResolveUsageAuthContext, ProviderRuntimeModel, ProviderThinkingPolicyContext, ProviderValidateReplayTurnsContext, + ProviderWebSocketSessionPolicy, ProviderWrapStreamFnContext, SpeechProviderPlugin, } from "./plugin-entry.js"; diff --git a/src/plugin-sdk/plugin-entry.ts b/src/plugin-sdk/plugin-entry.ts index f24e2be6a27..7a4102fb615 100644 --- a/src/plugin-sdk/plugin-entry.ts +++ b/src/plugin-sdk/plugin-entry.ts @@ -49,12 +49,16 @@ import type { RealtimeTranscriptionProviderPlugin, ProviderResolvedUsageAuth, ProviderResolveDynamicModelContext, + ProviderResolveTransportTurnStateContext, + ProviderResolveWebSocketSessionPolicyContext, ProviderSanitizeReplayHistoryContext, + ProviderTransportTurnState, ProviderToolSchemaDiagnostic, ProviderResolveUsageAuthContext, ProviderRuntimeModel, ProviderThinkingPolicyContext, ProviderValidateReplayTurnsContext, + ProviderWebSocketSessionPolicy, ProviderWrapStreamFnContext, SpeechProviderPlugin, PluginCommandContext, @@ -101,12 +105,16 @@ export type { ProviderSanitizeReplayHistoryContext, ProviderResolveUsageAuthContext, ProviderResolveDynamicModelContext, + ProviderResolveTransportTurnStateContext, + ProviderResolveWebSocketSessionPolicyContext, ProviderNormalizeResolvedModelContext, ProviderRuntimeModel, RealtimeTranscriptionProviderPlugin, + ProviderTransportTurnState, SpeechProviderPlugin, ProviderThinkingPolicyContext, ProviderValidateReplayTurnsContext, + ProviderWebSocketSessionPolicy, ProviderWrapStreamFnContext, OpenClawPluginService, OpenClawPluginServiceContext, diff --git a/src/plugins/provider-runtime.ts b/src/plugins/provider-runtime.ts index afd95c79c0d..e51ed7432c6 100644 --- a/src/plugins/provider-runtime.ts +++ b/src/plugins/provider-runtime.ts @@ -39,9 +39,13 @@ import type { ProviderResolveUsageAuthContext, ProviderPlugin, ProviderResolveDynamicModelContext, + ProviderResolveTransportTurnStateContext, + ProviderResolveWebSocketSessionPolicyContext, ProviderRuntimeModel, ProviderThinkingPolicyContext, + ProviderTransportTurnState, ProviderValidateReplayTurnsContext, + ProviderWebSocketSessionPolicy, ProviderWrapStreamFnContext, } from "./types.js"; @@ -525,6 +529,30 @@ export function wrapProviderStreamFn(params: { return resolveProviderHookPlugin(params)?.wrapStreamFn?.(params.context) ?? undefined; } +export function resolveProviderTransportTurnStateWithPlugin(params: { + provider: string; + config?: OpenClawConfig; + workspaceDir?: string; + env?: NodeJS.ProcessEnv; + context: ProviderResolveTransportTurnStateContext; +}): ProviderTransportTurnState | undefined { + return ( + resolveProviderHookPlugin(params)?.resolveTransportTurnState?.(params.context) ?? undefined + ); +} + +export function resolveProviderWebSocketSessionPolicyWithPlugin(params: { + provider: string; + config?: OpenClawConfig; + workspaceDir?: string; + env?: NodeJS.ProcessEnv; + context: ProviderResolveWebSocketSessionPolicyContext; +}): ProviderWebSocketSessionPolicy | undefined { + return ( + resolveProviderHookPlugin(params)?.resolveWebSocketSessionPolicy?.(params.context) ?? undefined + ); +} + export async function createProviderEmbeddingProvider(params: { provider: string; config?: OpenClawConfig; diff --git a/src/plugins/types.ts b/src/plugins/types.ts index a8d7561f3b2..b7776c92c0c 100644 --- a/src/plugins/types.ts +++ b/src/plugins/types.ts @@ -697,6 +697,57 @@ export type ProviderWrapStreamFnContext = ProviderPrepareExtraParamsContext & { streamFn?: StreamFn; }; +/** + * Provider-owned transport turn state. + * + * Use this for provider-native request headers or metadata that should stay + * stable across retries while still being attached by generic core transports. + */ +export type ProviderTransportTurnState = { + headers?: Record; + metadata?: Record; +}; + +/** + * Provider-owned request identity for transport turns. + * + * Use this when the provider exposes native request/session metadata that must + * be attached by both HTTP and WebSocket transports. + */ +export type ProviderResolveTransportTurnStateContext = { + provider: string; + modelId: string; + model?: ProviderRuntimeModel; + sessionId?: string; + turnId: string; + attempt: number; + transport: "stream" | "websocket"; +}; + +/** + * Provider-owned WebSocket session policy. + * + * Use this for session-scoped headers or cool-down behavior that should apply + * before a generic WebSocket transport decides to retry or fall back. + */ +export type ProviderWebSocketSessionPolicy = { + headers?: Record; + degradeCooldownMs?: number; +}; + +/** + * Provider-owned WebSocket session policy input. + * + * Use this when the provider wants to control native session handshake headers + * or the post-failure cool-down window for a generic WebSocket transport. + */ +export type ProviderResolveWebSocketSessionPolicyContext = { + provider: string; + modelId: string; + model?: ProviderRuntimeModel; + sessionId?: string; +}; + /** * Generic embedding provider shape returned by provider plugins. * @@ -1166,6 +1217,26 @@ export type ProviderPlugin = { * transport implementation. */ wrapStreamFn?: (ctx: ProviderWrapStreamFnContext) => StreamFn | null | undefined; + /** + * Provider-owned native transport turn identity. + * + * Use this when a provider wants generic transports to attach provider-native + * request headers or metadata on each turn without hardcoding vendor logic in + * core. + */ + resolveTransportTurnState?: ( + ctx: ProviderResolveTransportTurnStateContext, + ) => ProviderTransportTurnState | null | undefined; + /** + * Provider-owned WebSocket session policy. + * + * Use this when a provider wants generic WebSocket transports to attach + * native session headers or tune the session-scoped cool-down before HTTP + * fallback. + */ + resolveWebSocketSessionPolicy?: ( + ctx: ProviderResolveWebSocketSessionPolicyContext, + ) => ProviderWebSocketSessionPolicy | null | undefined; /** * Provider-owned embedding provider factory. *