refactor: add retry runtime sdk seam

This commit is contained in:
Peter Steinberger 2026-03-28 05:56:41 +00:00
parent d42c2f6a17
commit c222a44e6f
16 changed files with 185 additions and 155 deletions

View File

@ -253,7 +253,7 @@
"exportName": "CliBackendPlugin",
"kind": "type",
"source": {
"line": 1490,
"line": 1508,
"path": "src/plugins/types.ts"
}
},
@ -397,7 +397,7 @@
"exportName": "MediaUnderstandingProviderPlugin",
"kind": "type",
"source": {
"line": 1141,
"line": 1159,
"path": "src/plugins/types.ts"
}
},
@ -415,7 +415,7 @@
"exportName": "OpenClawPluginApi",
"kind": "type",
"source": {
"line": 1534,
"line": 1552,
"path": "src/plugins/types.ts"
}
},
@ -523,7 +523,7 @@
"exportName": "SpeechProviderPlugin",
"kind": "type",
"source": {
"line": 1116,
"line": 1134,
"path": "src/plugins/types.ts"
}
},
@ -1015,7 +1015,7 @@
"exportName": "BlockStreamingCoalesceSchema",
"kind": "const",
"source": {
"line": 339,
"line": 340,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1033,7 +1033,7 @@
"exportName": "DmConfigSchema",
"kind": "const",
"source": {
"line": 293,
"line": 294,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1042,7 +1042,7 @@
"exportName": "DmPolicySchema",
"kind": "const",
"source": {
"line": 337,
"line": 338,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1060,7 +1060,7 @@
"exportName": "GroupPolicySchema",
"kind": "const",
"source": {
"line": 335,
"line": 336,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1078,7 +1078,7 @@
"exportName": "MarkdownConfigSchema",
"kind": "const",
"source": {
"line": 371,
"line": 372,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1096,7 +1096,7 @@
"exportName": "ReplyRuntimeConfigSchemaShape",
"kind": "const",
"source": {
"line": 347,
"line": 348,
"path": "src/config/zod-schema.core.ts"
}
},
@ -1105,7 +1105,7 @@
"exportName": "requireOpenAllowFrom",
"kind": "const",
"source": {
"line": 486,
"line": 487,
"path": "src/config/zod-schema.core.ts"
}
},
@ -3378,7 +3378,7 @@
"exportName": "definePluginEntry",
"kind": "function",
"source": {
"line": 129,
"line": 131,
"path": "src/plugin-sdk/plugin-entry.ts"
}
},
@ -3738,7 +3738,7 @@
"exportName": "MediaUnderstandingProviderPlugin",
"kind": "type",
"source": {
"line": 1141,
"line": 1159,
"path": "src/plugins/types.ts"
}
},
@ -3756,7 +3756,7 @@
"exportName": "OpenClawPluginApi",
"kind": "type",
"source": {
"line": 1534,
"line": 1552,
"path": "src/plugins/types.ts"
}
},
@ -3765,7 +3765,7 @@
"exportName": "OpenClawPluginCommandDefinition",
"kind": "type",
"source": {
"line": 1260,
"line": 1278,
"path": "src/plugins/types.ts"
}
},
@ -3783,7 +3783,7 @@
"exportName": "OpenClawPluginDefinition",
"kind": "type",
"source": {
"line": 1516,
"line": 1534,
"path": "src/plugins/types.ts"
}
},
@ -3792,7 +3792,7 @@
"exportName": "OpenClawPluginService",
"kind": "type",
"source": {
"line": 1483,
"line": 1501,
"path": "src/plugins/types.ts"
}
},
@ -3801,7 +3801,7 @@
"exportName": "OpenClawPluginServiceContext",
"kind": "type",
"source": {
"line": 1475,
"line": 1493,
"path": "src/plugins/types.ts"
}
},
@ -3828,7 +3828,7 @@
"exportName": "PluginCommandContext",
"kind": "type",
"source": {
"line": 1156,
"line": 1174,
"path": "src/plugins/types.ts"
}
},
@ -3837,7 +3837,7 @@
"exportName": "PluginInteractiveTelegramHandlerContext",
"kind": "type",
"source": {
"line": 1289,
"line": 1307,
"path": "src/plugins/types.ts"
}
},
@ -3864,7 +3864,7 @@
"exportName": "ProviderAugmentModelCatalogContext",
"kind": "type",
"source": {
"line": 661,
"line": 672,
"path": "src/plugins/types.ts"
}
},
@ -3882,7 +3882,7 @@
"exportName": "ProviderAuthDoctorHintContext",
"kind": "type",
"source": {
"line": 465,
"line": 476,
"path": "src/plugins/types.ts"
}
},
@ -3918,7 +3918,7 @@
"exportName": "ProviderBuildMissingAuthMessageContext",
"kind": "type",
"source": {
"line": 573,
"line": 584,
"path": "src/plugins/types.ts"
}
},
@ -3927,7 +3927,7 @@
"exportName": "ProviderBuildUnknownModelHintContext",
"kind": "type",
"source": {
"line": 589,
"line": 600,
"path": "src/plugins/types.ts"
}
},
@ -3936,7 +3936,7 @@
"exportName": "ProviderBuiltInModelSuppressionContext",
"kind": "type",
"source": {
"line": 605,
"line": 616,
"path": "src/plugins/types.ts"
}
},
@ -3945,7 +3945,7 @@
"exportName": "ProviderBuiltInModelSuppressionResult",
"kind": "type",
"source": {
"line": 614,
"line": 625,
"path": "src/plugins/types.ts"
}
},
@ -3954,7 +3954,7 @@
"exportName": "ProviderCacheTtlEligibilityContext",
"kind": "type",
"source": {
"line": 561,
"line": 572,
"path": "src/plugins/types.ts"
}
},
@ -3981,7 +3981,7 @@
"exportName": "ProviderDefaultThinkingPolicyContext",
"kind": "type",
"source": {
"line": 638,
"line": 649,
"path": "src/plugins/types.ts"
}
},
@ -3990,7 +3990,7 @@
"exportName": "ProviderDiscoveryContext",
"kind": "type",
"source": {
"line": 677,
"line": 688,
"path": "src/plugins/types.ts"
}
},
@ -3999,7 +3999,7 @@
"exportName": "ProviderFetchUsageSnapshotContext",
"kind": "type",
"source": {
"line": 446,
"line": 457,
"path": "src/plugins/types.ts"
}
},
@ -4008,7 +4008,7 @@
"exportName": "ProviderModernModelPolicyContext",
"kind": "type",
"source": {
"line": 648,
"line": 659,
"path": "src/plugins/types.ts"
}
},
@ -4026,7 +4026,7 @@
"exportName": "ProviderPreparedRuntimeAuth",
"kind": "type",
"source": {
"line": 393,
"line": 404,
"path": "src/plugins/types.ts"
}
},
@ -4044,7 +4044,7 @@
"exportName": "ProviderPrepareExtraParamsContext",
"kind": "type",
"source": {
"line": 479,
"line": 490,
"path": "src/plugins/types.ts"
}
},
@ -4053,7 +4053,7 @@
"exportName": "ProviderPrepareRuntimeAuthContext",
"kind": "type",
"source": {
"line": 372,
"line": 383,
"path": "src/plugins/types.ts"
}
},
@ -4062,7 +4062,7 @@
"exportName": "ProviderResolvedUsageAuth",
"kind": "type",
"source": {
"line": 433,
"line": 444,
"path": "src/plugins/types.ts"
}
},
@ -4080,7 +4080,7 @@
"exportName": "ProviderResolveUsageAuthContext",
"kind": "type",
"source": {
"line": 414,
"line": 425,
"path": "src/plugins/types.ts"
}
},
@ -4098,7 +4098,7 @@
"exportName": "ProviderThinkingPolicyContext",
"kind": "type",
"source": {
"line": 626,
"line": 637,
"path": "src/plugins/types.ts"
}
},
@ -4116,7 +4116,7 @@
"exportName": "ProviderWrapStreamFnContext",
"kind": "type",
"source": {
"line": 512,
"line": 523,
"path": "src/plugins/types.ts"
}
},
@ -4161,7 +4161,7 @@
"exportName": "SpeechProviderPlugin",
"kind": "type",
"source": {
"line": 1116,
"line": 1134,
"path": "src/plugins/types.ts"
}
},
@ -4226,7 +4226,7 @@
"exportName": "definePluginEntry",
"kind": "function",
"source": {
"line": 129,
"line": 131,
"path": "src/plugin-sdk/plugin-entry.ts"
}
},
@ -4253,7 +4253,7 @@
"exportName": "MediaUnderstandingProviderPlugin",
"kind": "type",
"source": {
"line": 1141,
"line": 1159,
"path": "src/plugins/types.ts"
}
},
@ -4271,7 +4271,7 @@
"exportName": "OpenClawPluginApi",
"kind": "type",
"source": {
"line": 1534,
"line": 1552,
"path": "src/plugins/types.ts"
}
},
@ -4280,7 +4280,7 @@
"exportName": "OpenClawPluginCommandDefinition",
"kind": "type",
"source": {
"line": 1260,
"line": 1278,
"path": "src/plugins/types.ts"
}
},
@ -4298,7 +4298,7 @@
"exportName": "OpenClawPluginDefinition",
"kind": "type",
"source": {
"line": 1516,
"line": 1534,
"path": "src/plugins/types.ts"
}
},
@ -4307,7 +4307,7 @@
"exportName": "OpenClawPluginService",
"kind": "type",
"source": {
"line": 1483,
"line": 1501,
"path": "src/plugins/types.ts"
}
},
@ -4316,7 +4316,7 @@
"exportName": "OpenClawPluginServiceContext",
"kind": "type",
"source": {
"line": 1475,
"line": 1493,
"path": "src/plugins/types.ts"
}
},
@ -4343,7 +4343,7 @@
"exportName": "PluginCommandContext",
"kind": "type",
"source": {
"line": 1156,
"line": 1174,
"path": "src/plugins/types.ts"
}
},
@ -4352,7 +4352,7 @@
"exportName": "PluginInteractiveTelegramHandlerContext",
"kind": "type",
"source": {
"line": 1289,
"line": 1307,
"path": "src/plugins/types.ts"
}
},
@ -4370,7 +4370,7 @@
"exportName": "ProviderAugmentModelCatalogContext",
"kind": "type",
"source": {
"line": 661,
"line": 672,
"path": "src/plugins/types.ts"
}
},
@ -4388,7 +4388,7 @@
"exportName": "ProviderAuthDoctorHintContext",
"kind": "type",
"source": {
"line": 465,
"line": 476,
"path": "src/plugins/types.ts"
}
},
@ -4424,7 +4424,7 @@
"exportName": "ProviderBuildMissingAuthMessageContext",
"kind": "type",
"source": {
"line": 573,
"line": 584,
"path": "src/plugins/types.ts"
}
},
@ -4433,7 +4433,7 @@
"exportName": "ProviderBuildUnknownModelHintContext",
"kind": "type",
"source": {
"line": 589,
"line": 600,
"path": "src/plugins/types.ts"
}
},
@ -4442,7 +4442,7 @@
"exportName": "ProviderBuiltInModelSuppressionContext",
"kind": "type",
"source": {
"line": 605,
"line": 616,
"path": "src/plugins/types.ts"
}
},
@ -4451,7 +4451,7 @@
"exportName": "ProviderBuiltInModelSuppressionResult",
"kind": "type",
"source": {
"line": 614,
"line": 625,
"path": "src/plugins/types.ts"
}
},
@ -4460,7 +4460,7 @@
"exportName": "ProviderCacheTtlEligibilityContext",
"kind": "type",
"source": {
"line": 561,
"line": 572,
"path": "src/plugins/types.ts"
}
},
@ -4487,7 +4487,7 @@
"exportName": "ProviderDefaultThinkingPolicyContext",
"kind": "type",
"source": {
"line": 638,
"line": 649,
"path": "src/plugins/types.ts"
}
},
@ -4496,7 +4496,7 @@
"exportName": "ProviderDiscoveryContext",
"kind": "type",
"source": {
"line": 677,
"line": 688,
"path": "src/plugins/types.ts"
}
},
@ -4505,7 +4505,7 @@
"exportName": "ProviderFetchUsageSnapshotContext",
"kind": "type",
"source": {
"line": 446,
"line": 457,
"path": "src/plugins/types.ts"
}
},
@ -4514,7 +4514,16 @@
"exportName": "ProviderModernModelPolicyContext",
"kind": "type",
"source": {
"line": 648,
"line": 659,
"path": "src/plugins/types.ts"
}
},
{
"declaration": "export type ProviderNormalizeModelIdContext = ProviderNormalizeModelIdContext;",
"exportName": "ProviderNormalizeModelIdContext",
"kind": "type",
"source": {
"line": 372,
"path": "src/plugins/types.ts"
}
},
@ -4532,7 +4541,7 @@
"exportName": "ProviderPreparedRuntimeAuth",
"kind": "type",
"source": {
"line": 393,
"line": 404,
"path": "src/plugins/types.ts"
}
},
@ -4550,7 +4559,7 @@
"exportName": "ProviderPrepareExtraParamsContext",
"kind": "type",
"source": {
"line": 479,
"line": 490,
"path": "src/plugins/types.ts"
}
},
@ -4559,7 +4568,7 @@
"exportName": "ProviderPrepareRuntimeAuthContext",
"kind": "type",
"source": {
"line": 372,
"line": 383,
"path": "src/plugins/types.ts"
}
},
@ -4568,7 +4577,7 @@
"exportName": "ProviderResolvedUsageAuth",
"kind": "type",
"source": {
"line": 433,
"line": 444,
"path": "src/plugins/types.ts"
}
},
@ -4586,7 +4595,7 @@
"exportName": "ProviderResolveUsageAuthContext",
"kind": "type",
"source": {
"line": 414,
"line": 425,
"path": "src/plugins/types.ts"
}
},
@ -4604,7 +4613,7 @@
"exportName": "ProviderThinkingPolicyContext",
"kind": "type",
"source": {
"line": 626,
"line": 637,
"path": "src/plugins/types.ts"
}
},
@ -4613,7 +4622,7 @@
"exportName": "ProviderWrapStreamFnContext",
"kind": "type",
"source": {
"line": 512,
"line": 523,
"path": "src/plugins/types.ts"
}
},
@ -4622,7 +4631,7 @@
"exportName": "SpeechProviderPlugin",
"kind": "type",
"source": {
"line": 1116,
"line": 1134,
"path": "src/plugins/types.ts"
}
}
@ -4777,7 +4786,7 @@
"exportName": "ModelDefinitionConfig",
"kind": "type",
"source": {
"line": 47,
"line": 48,
"path": "src/config/types.models.ts"
}
},
@ -4786,7 +4795,7 @@
"exportName": "ModelProviderConfig",
"kind": "type",
"source": {
"line": 65,
"line": 66,
"path": "src/config/types.models.ts"
}
},

File diff suppressed because one or more lines are too long

View File

@ -128,6 +128,7 @@ is a small, self-contained module with a clear purpose and documented contract.
| `plugin-sdk/channel-send-result` | Send result types | Reply result types |
| `plugin-sdk/runtime-store` | Persistent plugin storage | `createPluginRuntimeStore` |
| `plugin-sdk/fetch-runtime` | Wrapped fetch/proxy helpers | `resolveFetch`, proxy helpers |
| `plugin-sdk/retry-runtime` | Retry helpers | `RetryConfig`, `retryAsync`, policy runners |
| `plugin-sdk/allow-from` | Allowlist formatting | `formatAllowFromLowercase` |
| `plugin-sdk/allowlist-resolution` | Allowlist input mapping | `mapAllowlistResolutionInputs` |
| `plugin-sdk/command-auth` | Command gating | `resolveControlCommandGate` |

View File

@ -95,6 +95,7 @@ subpaths is in `scripts/lib/plugin-sdk-entrypoints.json`.
| `plugin-sdk/config-runtime` | Config load/write helpers |
| `plugin-sdk/infra-runtime` | System event/heartbeat helpers |
| `plugin-sdk/fetch-runtime` | Wrapped fetch, proxy, and pinned lookup helpers |
| `plugin-sdk/retry-runtime` | Retry config and retry runner helpers |
| `plugin-sdk/agent-runtime` | Agent dir/identity/workspace helpers |
| `plugin-sdk/directory-runtime` | Config-backed directory query/dedup |
| `plugin-sdk/keyed-async-queue` | `KeyedAsyncQueue` |

View File

@ -1,9 +1,9 @@
import { resolveFetch } from "openclaw/plugin-sdk/infra-runtime";
import { resolveFetch } from "openclaw/plugin-sdk/fetch-runtime";
import {
resolveRetryConfig,
retryAsync,
type RetryConfig,
} from "openclaw/plugin-sdk/infra-runtime";
} from "openclaw/plugin-sdk/retry-runtime";
const DISCORD_API_BASE = "https://discord.com/api/v10";
const DISCORD_API_RETRY_DEFAULTS = {

View File

@ -1,7 +1,6 @@
import { RequestClient } from "@buape/carbon";
import { loadConfig } from "openclaw/plugin-sdk/config-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/infra-runtime";
import type { RetryRunner } from "openclaw/plugin-sdk/infra-runtime";
import type { RetryConfig, RetryRunner } from "openclaw/plugin-sdk/retry-runtime";
import { normalizeAccountId } from "openclaw/plugin-sdk/routing";
import {
mergeDiscordAccountConfig,

View File

@ -2,12 +2,6 @@ import type { RequestClient } from "@buape/carbon";
import { resolveAgentAvatar } from "openclaw/plugin-sdk/agent-runtime";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import type { MarkdownTableMode, ReplyToMode } from "openclaw/plugin-sdk/config-runtime";
import {
resolveRetryConfig,
retryAsync,
type RetryConfig,
type RetryRunner,
} from "openclaw/plugin-sdk/infra-runtime";
import {
resolveSendableOutboundReplyParts,
resolveTextChunksWithFallback,
@ -15,6 +9,12 @@ import {
} from "openclaw/plugin-sdk/reply-payload";
import type { ChunkMode } from "openclaw/plugin-sdk/reply-runtime";
import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime";
import {
resolveRetryConfig,
retryAsync,
type RetryConfig,
type RetryRunner,
} from "openclaw/plugin-sdk/retry-runtime";
import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env";
import { convertMarkdownTables } from "openclaw/plugin-sdk/text-runtime";
import { resolveDiscordAccount } from "../accounts.js";

View File

@ -3,7 +3,7 @@ import {
createRateLimitRetryRunner,
type RetryConfig,
type RetryRunner,
} from "openclaw/plugin-sdk/infra-runtime";
} from "openclaw/plugin-sdk/retry-runtime";
export const DISCORD_RETRY_DEFAULTS = {
attempts: 3,

View File

@ -6,12 +6,12 @@ import { ChannelType, Routes } from "discord-api-types/v10";
import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime";
import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/config-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/infra-runtime";
import { maxBytesForKind } from "openclaw/plugin-sdk/media-runtime";
import { extensionForMime } from "openclaw/plugin-sdk/media-runtime";
import { unlinkIfExists } from "openclaw/plugin-sdk/media-runtime";
import type { PollInput } from "openclaw/plugin-sdk/media-runtime";
import { resolveChunkMode } from "openclaw/plugin-sdk/reply-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/retry-runtime";
import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path";
import { convertMarkdownTables } from "openclaw/plugin-sdk/text-runtime";
import { loadWebMediaRaw } from "openclaw/plugin-sdk/web-media";

View File

@ -10,7 +10,6 @@ import { PollLayoutType } from "discord-api-types/payloads/v10";
import type { RESTAPIPoll } from "discord-api-types/rest/v10";
import { Routes, type APIChannel, type APIEmbed } from "discord-api-types/v10";
import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import type { RetryRunner } from "openclaw/plugin-sdk/infra-runtime";
import { buildOutboundMediaLoadOptions } from "openclaw/plugin-sdk/media-runtime";
import { extensionForMime } from "openclaw/plugin-sdk/media-runtime";
import {
@ -20,6 +19,7 @@ import {
} from "openclaw/plugin-sdk/media-runtime";
import { resolveTextChunksWithFallback } from "openclaw/plugin-sdk/reply-payload";
import type { ChunkMode } from "openclaw/plugin-sdk/reply-runtime";
import type { RetryRunner } from "openclaw/plugin-sdk/retry-runtime";
import { loadWebMedia } from "openclaw/plugin-sdk/web-media";
import { resolveDiscordAccount } from "./accounts.js";
import { chunkDiscordTextWithMode } from "./chunk.js";

View File

@ -1,6 +1,6 @@
import type { RequestClient } from "@buape/carbon";
import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/infra-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/retry-runtime";
export class DiscordSendError extends Error {
kind?: "missing-permissions" | "dm-blocked";

View File

@ -14,7 +14,6 @@ import crypto from "node:crypto";
import fs from "node:fs/promises";
import path from "node:path";
import { RateLimitError, type RequestClient } from "@buape/carbon";
import type { RetryRunner } from "openclaw/plugin-sdk/infra-runtime";
import {
parseFfprobeCodecAndSampleRate,
runFfmpeg,
@ -22,6 +21,7 @@ import {
} from "openclaw/plugin-sdk/media-runtime";
import { MEDIA_FFMPEG_MAX_AUDIO_DURATION_SECS } from "openclaw/plugin-sdk/media-runtime";
import { unlinkIfExists } from "openclaw/plugin-sdk/media-runtime";
import type { RetryRunner } from "openclaw/plugin-sdk/retry-runtime";
import { resolvePreferredOpenClawTmpDir } from "openclaw/plugin-sdk/temp-path";
const DISCORD_VOICE_MESSAGE_FLAG = 1 << 13;

View File

@ -11,13 +11,12 @@ import { loadConfig } from "openclaw/plugin-sdk/config-runtime";
import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/config-runtime";
import { isDiagnosticFlagEnabled } from "openclaw/plugin-sdk/infra-runtime";
import { formatUncaughtError } from "openclaw/plugin-sdk/infra-runtime";
import { createTelegramRetryRunner } from "openclaw/plugin-sdk/infra-runtime";
import type { RetryConfig } from "openclaw/plugin-sdk/infra-runtime";
import type { MediaKind } from "openclaw/plugin-sdk/media-runtime";
import { buildOutboundMediaLoadOptions } from "openclaw/plugin-sdk/media-runtime";
import { getImageMetadata } from "openclaw/plugin-sdk/media-runtime";
import { isGifMedia, kindFromMime } from "openclaw/plugin-sdk/media-runtime";
import { normalizePollInput, type PollInput } from "openclaw/plugin-sdk/media-runtime";
import { createTelegramRetryRunner, type RetryConfig } from "openclaw/plugin-sdk/retry-runtime";
import { logVerbose } from "openclaw/plugin-sdk/runtime-env";
import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env";
import { formatErrorMessage } from "openclaw/plugin-sdk/ssrf-runtime";

View File

@ -768,6 +768,10 @@
"types": "./dist/plugin-sdk/provider-web-search.d.ts",
"default": "./dist/plugin-sdk/provider-web-search.js"
},
"./plugin-sdk/retry-runtime": {
"types": "./dist/plugin-sdk/retry-runtime.d.ts",
"default": "./dist/plugin-sdk/retry-runtime.js"
},
"./plugin-sdk/param-readers": {
"types": "./dist/plugin-sdk/param-readers.d.ts",
"default": "./dist/plugin-sdk/param-readers.js"

View File

@ -182,6 +182,7 @@
"provider-tools",
"provider-usage",
"provider-web-search",
"retry-runtime",
"param-readers",
"provider-zai-endpoint",
"secret-input",

View File

@ -0,0 +1,15 @@
// Public retry helpers for plugins that need retry config or policy runners.
export {
resolveRetryConfig,
retryAsync,
type RetryConfig,
type RetryInfo,
type RetryOptions,
} from "../infra/retry.js";
export {
createRateLimitRetryRunner,
createTelegramRetryRunner,
TELEGRAM_RETRY_DEFAULTS,
type RetryRunner,
} from "../infra/retry-policy.js";