diff --git a/docs/.generated/plugin-sdk-api-baseline.jsonl b/docs/.generated/plugin-sdk-api-baseline.jsonl index c32ff4fa6b52..599ce8c6e89c 100644 --- a/docs/.generated/plugin-sdk-api-baseline.jsonl +++ b/docs/.generated/plugin-sdk-api-baseline.jsonl @@ -53,17 +53,17 @@ {"closureHash":"ff3c4616cd6212a6d698831a8b287ad87e3968c8663f4090d095bb30ec40fc1c","declaration":"export function abortAndDrainAgentHarnessRun(params: { sessionId: string; sessionKey?: string; settleMs?: number; forceClear?: boolean; reason?: string; }): Promise;","entrypoint":"agent-harness","exportName":"abortAndDrainAgentHarnessRun","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} {"closureHash":"58989e3fa91eecf2e05202e36548e6e64a3b9219e83154bd99866c851604e34e","declaration":"export function createAgentToolResultMiddlewareRunner(ctx: AgentToolResultMiddlewareContext, handlers?: AgentToolResultMiddleware[]): { applyToolResultMiddleware(event: AgentToolResultMiddlewareEvent): Promise; };","entrypoint":"agent-harness","exportName":"createAgentToolResultMiddlewareRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} {"closureHash":"b8f6355d7ad1700aceecddaa6e9ccf43091a792d5b481a1ee3f55294a881a67d","declaration":"export function createCodexAppServerToolResultExtensionRunner(ctx: CodexAppServerExtensionContext, factories?: CodexAppServerExtensionFactory[]): { applyToolResultExtensions(event: CodexAppServerToolResultEvent): Promise>; };","entrypoint":"agent-harness","exportName":"createCodexAppServerToolResultExtensionRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} -{"closureHash":"0511dbfbe051bdcd4302b9923203989e9222f9ed91209cff658eb41679ca316d","declaration":"export function createOpenClawCodingTools(options?: OpenClawCodingToolsOptions): AnyAgentTool[];","entrypoint":"agent-harness","exportName":"createOpenClawCodingTools","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} +{"closureHash":"c4e5a9433c43e733147472f80b0669afd4521aca58d17aa914ab1615c88aeeeb","declaration":"export function createOpenClawCodingTools(options?: OpenClawCodingToolsOptions): AnyAgentTool[];","entrypoint":"agent-harness","exportName":"createOpenClawCodingTools","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} {"closureHash":"13649ee853485319e7449fda25c106b3f3f53d3090e53cdbb28e220a8529eb80","declaration":"export function disposeRegisteredAgentHarnesses(): Promise;","entrypoint":"agent-harness","exportName":"disposeRegisteredAgentHarnesses","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} {"closureHash":"f255a91162ece4c239bb8fa745efa14a1054bc024a291e9954f75f239b2b87c3","declaration":"export function resolveActiveEmbeddedRunSessionId(sessionKey: string): string | undefined;","entrypoint":"agent-harness","exportName":"resolveActiveEmbeddedRunSessionId","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} {"closureHash":"27d9f61df9ccf68615cb2002a6da891e36ab0c07623bc37c4d07aa980b446881","declaration":"export function resolveWebSearchToolPolicy(params: WebSearchToolPolicyParams): WebSearchToolPolicyResolution;","entrypoint":"agent-harness","exportName":"resolveWebSearchToolPolicy","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} -{"closureHash":"a258a6b4c206e4c8ffffa152bbe499da5e54e3dc5e3880556fb29a887abef00c","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} -{"closureHash":"da7ca74cf7a80b0e17b14ffd80a59005de2629a28b9267a453333236e4ad55ce","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"89d1232faa739ea7bb8b305d5e92ff1057759b833cd9994ef0923634234741e7","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"795de260f25641a5b8da3aebe153b44e06327ee13bf9a05f7e42c3b38f3c2ce3","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} {"closureHash":"4ad0f830bf11a2db48faefb1439b7fbb08d9f22d22083f5e301327e1696f2310","declaration":"export type AgentToolResultMiddleware = AgentToolResultMiddleware;","entrypoint":"agent-harness","exportName":"AgentToolResultMiddleware","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} {"closureHash":"008b6c78d5e44a9d1df1d7e32e6015382ee9ba1cb9b10bd4c2b467619d1c89d4","declaration":"export type AgentToolResultMiddlewareEvent = AgentToolResultMiddlewareEvent;","entrypoint":"agent-harness","exportName":"AgentToolResultMiddlewareEvent","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} {"closureHash":"7414a2a79c2d78c1d52538250c827305bba1a2bb25010448837c8524a9f95b3c","declaration":"export type AnyAgentTool = AnyAgentTool;","entrypoint":"agent-harness","exportName":"AnyAgentTool","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} -{"closureHash":"180c0c99b663e302776c88d60aba63bd2ba0a5f86d2940988d69c83b90687847","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} -{"closureHash":"fb113638929d54843e4535420afaf821e6fcaf4665820d7fa02c9576ffe2a4fa","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"67d52689459e750067ca4d122d5169a1032fa5a806cdc66b0bf189f702ddbf57","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"3c8261189c5490b5f8938dde6c1fd39e05ad9a3156041fcc8b20df8040147986","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} {"closureHash":"25c6985c3bef2c6efc6a96e70af6d66fe073be0b0d311681cfc0dfc186528d9a","declaration":"export type OpenClawAgentToolResult = OpenClawAgentToolResult;","entrypoint":"agent-harness","exportName":"OpenClawAgentToolResult","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} {"category":"runtime","entrypoint":"agent-harness-runtime","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","recordType":"module"} {"closureHash":"fab99dfcb01d475a1bfdbe7a8fac9be10a93dac5f12ac78c2dea673c8ab86abf","declaration":"export function abortAgentHarnessRun(sessionId: string): boolean;\nexport function abortAgentHarnessRun(sessionId: undefined, opts: { mode: \"all\" | \"compacting\"; reason?: \"restart\"; }): boolean;","entrypoint":"agent-harness-runtime","exportName":"abortAgentHarnessRun","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -82,8 +82,8 @@ {"closureHash":"f8ad3d762c9753fdc36b2b9af0980167fdc54090c7bcca2f3dbe7c8951e86821","declaration":"export function buildAgentRuntimePlan(params: BuildAgentRuntimePlanParams): AgentRuntimePlan;","entrypoint":"agent-harness-runtime","exportName":"buildAgentRuntimePlan","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"528d11abf061b0b303722737de5a6406e7e55bffa38c45144c77d896ae1b3b0a","declaration":"export function buildBootstrapContextForFiles(bootstrapFiles: WorkspaceBootstrapFile[], params: { config?: OpenClawConfig; agentId?: string | null; warn?: (message: string) => void; }): EmbeddedContextFile[];","entrypoint":"agent-harness-runtime","exportName":"buildBootstrapContextForFiles","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"44d5a4667d2f3dc3a28e5c9d7b46765b1fb3c62820288e40251f5174911c8a6a","declaration":"export function buildEmbeddedAttemptToolRunContext(params: { trigger?: EmbeddedRunTrigger; jobId?: string; memoryFlushWritePath?: string; toolsAllow?: string[]; conversationToolPolicy?: GroupToolPolicyConfig; trace?: DiagnosticTraceContext; }): { trigger?: EmbeddedRunTrigger; jobId?: string; memoryFlushWritePath?: string; runtimeToolAllowlist?: string[]; conversationToolPolicy?: GroupToolPolicyConfig; trace?: DiagnosticTraceContext; };","entrypoint":"agent-harness-runtime","exportName":"buildEmbeddedAttemptToolRunContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"8752f8452e68f181ae1c264cb2613415575f0d4e75a7f610aac81ff2a92c28cc","declaration":"export function buildHarnessContextEngineRuntimeContext(params: Parameters[0]): ContextEngineRuntimeContext;","entrypoint":"agent-harness-runtime","exportName":"buildHarnessContextEngineRuntimeContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"8dfce6045e9899e7872a85062437555aa81d218c148619f0f613405f723b6477","declaration":"export function buildHarnessContextEngineRuntimeContextFromUsage(params: Parameters[0]): ContextEngineRuntimeContext;","entrypoint":"agent-harness-runtime","exportName":"buildHarnessContextEngineRuntimeContextFromUsage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"b1299f24e1c39c4f7ee73c0fd858e78a72b908e25e4fe8efce18bee53bf0f09b","declaration":"export function buildHarnessContextEngineRuntimeContext(params: Parameters[0]): ContextEngineRuntimeContext;","entrypoint":"agent-harness-runtime","exportName":"buildHarnessContextEngineRuntimeContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"265665427d4b24c4d76c70928a2ccfa363db7ea51e9a9c3279efb30f199290d6","declaration":"export function buildHarnessContextEngineRuntimeContextFromUsage(params: Parameters[0]): ContextEngineRuntimeContext;","entrypoint":"agent-harness-runtime","exportName":"buildHarnessContextEngineRuntimeContextFromUsage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"33a7cd8d63d4ef045ee3a42f806026a8b621e7dd32d8d6fbf4e7b44452d5e0ce","declaration":"export function buildNativeHookRelayCommand(params: { provider: NativeHookRelayProvider; relayId: string; generation?: string; event: NativeHookRelayEvent; preToolUseUnavailable?: \"noop\"; timeoutMs?: number; executable?: string; nice?: number | false; nodeExecutable?: string; }): string;","entrypoint":"agent-harness-runtime","exportName":"buildNativeHookRelayCommand","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"3846647c3c2fb0242f70591cf95c2e02f2a5a3c44447efb4cf7a31b2dc2122fd","declaration":"export function buildSkillWorkshopPromptSection(): string[];","entrypoint":"agent-harness-runtime","exportName":"buildSkillWorkshopPromptSection","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"32e977ece65144a83ae1b0a3c8d1b9b00a2a2506ad9ef1db3b2b9770ce762dbe","declaration":"export function buildWatchedSessionsHarnessContext(params: { config?: OpenClawConfig; sessionKey?: string; sandboxed?: boolean; toolNames: Iterable; capabilityToolNames?: Iterable; }): string | undefined;","entrypoint":"agent-harness-runtime","exportName":"buildWatchedSessionsHarnessContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -100,7 +100,7 @@ {"closureHash":"51f76e9e37b65b358f0313e10152d950b003bc3e50f4bb26fe29a988237772e2","declaration":"export function consumePreExecutionBlockedToolCall(toolCallId: string, runId?: string): boolean;","entrypoint":"agent-harness-runtime","exportName":"consumePreExecutionBlockedToolCall","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"58989e3fa91eecf2e05202e36548e6e64a3b9219e83154bd99866c851604e34e","declaration":"export function createAgentToolResultMiddlewareRunner(ctx: AgentToolResultMiddlewareContext, handlers?: AgentToolResultMiddleware[]): { applyToolResultMiddleware(event: AgentToolResultMiddlewareEvent): Promise; };","entrypoint":"agent-harness-runtime","exportName":"createAgentToolResultMiddlewareRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"b8f6355d7ad1700aceecddaa6e9ccf43091a792d5b481a1ee3f55294a881a67d","declaration":"export function createCodexAppServerToolResultExtensionRunner(ctx: CodexAppServerExtensionContext, factories?: CodexAppServerExtensionFactory[]): { applyToolResultExtensions(event: CodexAppServerToolResultEvent): Promise>; };","entrypoint":"agent-harness-runtime","exportName":"createCodexAppServerToolResultExtensionRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"f3989bb81aef788e708948271ab917d83224011574deae6ef44964429ad6c31e","declaration":"export function deliverAgentHarnessUserInputPrompt(params: PromptDeliveryParams, questions: readonly AgentHarnessUserInputQuestion[], options?: AgentHarnessUserInputPromptOptions): Promise;","entrypoint":"agent-harness-runtime","exportName":"deliverAgentHarnessUserInputPrompt","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"3f09dd665045d4010e22633cc51d48c75484c5d77c96e2b6235042cdfa778d96","declaration":"export function deliverAgentHarnessUserInputPrompt(params: PromptDeliveryParams, questions: readonly AgentHarnessUserInputQuestion[], options?: AgentHarnessUserInputPromptOptions): Promise;","entrypoint":"agent-harness-runtime","exportName":"deliverAgentHarnessUserInputPrompt","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"6f436485257f69fa07a18203b91d4341690522f12aff4f25805c7a1e21326ee3","declaration":"export function detectAndLoadAgentHarnessPromptImages(params: { prompt: string; workspaceDir: string; model: { input?: string[]; }; existingImages?: ImageContent[]; imageOrder?: PromptImageOrderEntry[]; media?: MediaFact[]; config?: OpenClawConfig; workspaceOnly?: boolean; localRoots?: readonly string[]; sandbox?: { root: string; bridge: SandboxFsBridge; }; }): Promise<{ images: ImageContent[]; detectedRefs: Array<{ raw: string; resolved: string; type: \"path\" | \"media-uri\"; }>; loadedCount: number; skippedCount: number; }>;","entrypoint":"agent-harness-runtime","exportName":"detectAndLoadAgentHarnessPromptImages","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"13649ee853485319e7449fda25c106b3f3f53d3090e53cdbb28e220a8529eb80","declaration":"export function disposeRegisteredAgentHarnesses(): Promise;","entrypoint":"agent-harness-runtime","exportName":"disposeRegisteredAgentHarnesses","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c38cd390190bb07ddcd247420d6e0b489a0229bd402ddca0440417217a57251a","declaration":"export function emitAgentEvent(event: Omit): void;","entrypoint":"agent-harness-runtime","exportName":"emitAgentEvent","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -162,7 +162,7 @@ {"closureHash":"40154c3b7b2a7179df33f4a3fbef5e56078be2759d5aab29f39eb0f3c92fc631","declaration":"export function projectRuntimeToolInputSchema(schema: unknown, path?: string): RuntimeToolInputSchemaProjection;","entrypoint":"agent-harness-runtime","exportName":"projectRuntimeToolInputSchema","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"e42e3dc63e8545bb9a6056336fbd6c1dc8f356dce4f0f1c6d9765254c974390e","declaration":"export function projectSettledTurnFinalizationAttemptResult(result: AgentHarnessAttemptResult): AgentHarnessSettledTurnFinalizationResult;","entrypoint":"agent-harness-runtime","exportName":"projectSettledTurnFinalizationAttemptResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"3fbe470f065d2c2f16de538d8347934ec2daee2081d8903db1777b0afd2a8043","declaration":"export function queueAgentHarnessMessage(sessionId: string, text: string, options?: EmbeddedAgentQueueMessageOptions): boolean;","entrypoint":"agent-harness-runtime","exportName":"queueAgentHarnessMessage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"c552c88c8ab80650e1b9323f7ffa45c0aa00a1bb1707243eb8a3b20baf1ff676","declaration":"export function registerNativeHookRelay(params: RegisterNativeHookRelayParams): ActiveNativeHookRelayRegistrationHandle;","entrypoint":"agent-harness-runtime","exportName":"registerNativeHookRelay","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"c1ef32674ceeac32818c97821305d634fbe1b592d6d5bdfa0ed6298c7f842ebc","declaration":"export function registerNativeHookRelay(params: RegisterNativeHookRelayParams): ActiveNativeHookRelayRegistrationHandle;","entrypoint":"agent-harness-runtime","exportName":"registerNativeHookRelay","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"b7cc6c35506dc6955e0359aa5c53c15a4d0db23639da8c1717f8fefda953c119","declaration":"export function requestDeferredPluginToolApproval(params: { deferredApproval: DeferredPluginToolApproval; signal?: AbortSignal; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"requestDeferredPluginToolApproval","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"a2306cba08cb05ff8430c8362c0cc3c821706da5a4e65a06849ad0d0fb007ae3","declaration":"export function resetAgentEventsForTest(options?: { preserveListeners?: boolean; }): void;","entrypoint":"agent-harness-runtime","exportName":"resetAgentEventsForTest","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"f255a91162ece4c239bb8fa745efa14a1054bc024a291e9954f75f239b2b87c3","declaration":"export function resolveActiveEmbeddedRunSessionId(sessionKey: string): string | undefined;","entrypoint":"agent-harness-runtime","exportName":"resolveActiveEmbeddedRunSessionId","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -197,7 +197,7 @@ {"closureHash":"e4784aeda4c24b60cd49b7f5983e70a380a4759d5176c74d30f2900952ba848f","declaration":"export function runAgentHarnessBeforeAgentFinalizeHook(params: { event: PluginHookBeforeAgentFinalizeEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessBeforeAgentFinalizeHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"8fec73ee8c7c9be3335bd6dc1bac9278f0be5beef22a5975eb06e56f504f4bd6","declaration":"export function runAgentHarnessBeforeCompactionHook(params: { sessionFile: string; messages?: AgentMessage[]; ctx: AgentHarnessHookContext; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessBeforeCompactionHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"021b81820bef2e8d54c50a5fc159d6665b23b50a1f5c40dae76a4833839d89c9","declaration":"export function runAgentHarnessBeforeMessageWriteHook(params: { message: AgentMessage; agentId?: string; sessionKey?: string; }): AgentMessage | null;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessBeforeMessageWriteHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"1db94795f83b31208de64722196691d9f91d21f0b92f7878f6dbc0d30c676d64","declaration":"export function runAgentHarnessGatewayQuestion(params: RunAgentHarnessGatewayQuestionParams): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessGatewayQuestion","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"8208fa9bd35c5df9d5169347760ecca5002a9a97cfb2006965e40986dba954a4","declaration":"export function runAgentHarnessGatewayQuestion(params: RunAgentHarnessGatewayQuestionParams): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessGatewayQuestion","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"50a4d7cb20dd8f884abbcb62d77b5b2df183fbfcd058cc7aa76edacd1f7b90d8","declaration":"export function runAgentHarnessLlmInputHook(params: { event: PluginHookLlmInputEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessLlmInputHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"1bd55c141c249b1c04470cafe0cd4d41dce334ea2883ce83235af56d24a15cca","declaration":"export function runAgentHarnessLlmOutputHook(params: { event: PluginHookLlmOutputEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessLlmOutputHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c4c5131ab7065decd8d8e935ac3779e3baa2c52fbbbd95a6ccb624377db09ca1","declaration":"export function runBeforeToolCallHook(args: { toolName: string; params: unknown; toolKind?: PluginHookToolKind; toolInputKind?: PluginHookToolInputKind; toolCallId?: string; ctx?: HookContext; signal?: AbortSignal; approvalMode?: \"request\" | \"report\" | \"deny\" | \"defer\"; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runBeforeToolCallHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -219,13 +219,13 @@ {"closureHash":"0701a22057edc3b733da7e05948db94aa98b337b224a5718efdd85212a8602bf","declaration":"export const TRANSCRIPT_CREDENTIAL_SAFETY_PROMPT: string;","entrypoint":"agent-harness-runtime","exportName":"TRANSCRIPT_CREDENTIAL_SAFETY_PROMPT","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"const","recordType":"export"} {"closureHash":"b5845c99df6c2a834a16678c320e0111bad96a3a7ac245d379aa5e6d2555d29b","declaration":"export const agentHarnessAttemptTerminal: { merge: (current: AgentRunAttemptTerminal, incoming: AgentRunAttemptTerminal) => AgentRunAttemptTerminal; normalize: (input: { aborted?: boolean; externalAbort?: boolean; idleTimedOut?: boolean; promptError?: unknown; promptErrorSource?: AgentRunAttemptFailureSource | null; timedOut?: boolean; timedOutByRunBudget?: boolean; timedOutDuringCompaction?: boolean; timedOutDuringToolExecution?: boolean; }) => AgentRunAttemptTerminal; project: (terminal: AgentRunAttemptTerminal) => { aborted: boolean; cleanupYieldAborted: boolean; externalAbort: boolean; failed: boolean; idleTimedOut: boolean; interrupted: boolean; promptError: unknown; promptErrorSource: AgentRunAttemptFailureSource | null; timedOut: boolean; timedOutByRunBudget: boolean; timedOutDuringCompaction: boolean; timedOutDuringToolExecution: boolean; }; setFailure: (terminal: AgentRunAttemptTerminal, failure: { source: AgentRunAttemptFailureSource; error: unknown; } | null) => AgentRunAttemptTerminal;};","entrypoint":"agent-harness-runtime","exportName":"agentHarnessAttemptTerminal","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"const","recordType":"export"} {"closureHash":"22bcf962aa76c76074c4ed4ad7d6558edbc3588e239263e09af74c1000bbe012","declaration":"export const embeddedAgentLog: SubsystemLogger;","entrypoint":"agent-harness-runtime","exportName":"embeddedAgentLog","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"const","recordType":"export"} -{"closureHash":"5bd0f747ab9a659ac0ad252abf11c24b420decc7842b46c8670099a775571b4a","declaration":"export const nativeHookRelayTesting: { readonly clearNativeHookRelaysForTests: () => void; readonly getNativeHookRelayInvocationsForTests: () => NativeHookRelayInvocation[]; readonly getNativeHookRelayRegistrationForTests: (relayId: string) => NativeHookRelayRegistration | undefined; readonly getNativeHookRelayBridgeDirForTests: () => string; readonly getNativeHookRelayBridgeRegistryPathForTests: (relayId: string) => string; readonly getNativeHookRelayBridgeRecordForTests: (relayId: string) => Record | undefined; readonly isNativeHookRelayBridgeLookupRetryableForTests: (error: unknown, elapsedMs?: number) => boolean; readonly formatPermissionApprovalDescriptionForTests: (request: NativeHookRelayPermissionApprovalRequest) => string; readonly permissionRequestContentFingerprintForTests: (request: NativeHookRelayPermissionApprovalRequest) => string; readonly permissionRequestToolInputKeyFingerprintForTests: (toolInput: Record) => string; readonly setNativeHookRelayPermissionApprovalRequesterForTests: (requester: NativeHookRelayPermissionApprovalRequester) => void; readonly setNativeHookRelayDeferredToolApprovalRequesterForTests: (requester: NativeHookRelayDeferredToolApprovalRequester) => void;};","entrypoint":"agent-harness-runtime","exportName":"nativeHookRelayTesting","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"const","recordType":"export"} +{"closureHash":"2d557ae3f21edf5b81e36ed42915c0b44188ad04730348db803f30fce54fe47a","declaration":"export const nativeHookRelayTesting: { readonly clearNativeHookRelaysForTests: () => void; readonly getNativeHookRelayInvocationsForTests: () => NativeHookRelayInvocation[]; readonly getNativeHookRelayRegistrationForTests: (relayId: string) => NativeHookRelayRegistration | undefined; readonly getNativeHookRelayBridgeDirForTests: () => string; readonly getNativeHookRelayBridgeRegistryPathForTests: (relayId: string) => string; readonly getNativeHookRelayBridgeRecordForTests: (relayId: string) => Record | undefined; readonly isNativeHookRelayBridgeLookupRetryableForTests: (error: unknown, elapsedMs?: number) => boolean; readonly formatPermissionApprovalDescriptionForTests: (request: NativeHookRelayPermissionApprovalRequest) => string; readonly permissionRequestContentFingerprintForTests: (request: NativeHookRelayPermissionApprovalRequest) => string; readonly permissionRequestToolInputKeyFingerprintForTests: (toolInput: Record) => string; readonly setNativeHookRelayPermissionApprovalRequesterForTests: (requester: NativeHookRelayPermissionApprovalRequester) => void; readonly setNativeHookRelayDeferredToolApprovalRequesterForTests: (requester: NativeHookRelayDeferredToolApprovalRequester) => void;};","entrypoint":"agent-harness-runtime","exportName":"nativeHookRelayTesting","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"const","recordType":"export"} {"closureHash":"f237bbc11e1d389679cd4e2ad7aa9055951b3029348e3374b81f769786a51d55","declaration":"export type AbortAndDrainAgentHarnessRunResult = AbortAndDrainEmbeddedAgentRunResult;","entrypoint":"agent-harness-runtime","exportName":"AbortAndDrainAgentHarnessRunResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"6f802f46717d28d260bbcb2cf4790dfed4e9ab28c4fe822d259228189cca4665","declaration":"export type AgentApprovalEventData = AgentApprovalEventData;","entrypoint":"agent-harness-runtime","exportName":"AgentApprovalEventData","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"12aac3a57ce200b0f082002be237625729f84ed7c337f1bac90bcd0688a53319","declaration":"export type AgentEventPayload = AgentEventPayload;","entrypoint":"agent-harness-runtime","exportName":"AgentEventPayload","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"a258a6b4c206e4c8ffffa152bbe499da5e54e3dc5e3880556fb29a887abef00c","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness-runtime","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"a258a6b4c206e4c8ffffa152bbe499da5e54e3dc5e3880556fb29a887abef00c","declaration":"export type AgentHarnessAttemptParams = AgentHarnessAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"f52e74ff880bbb306be7ee97f18aaab548bf08cf37e6b735c6deb212cb2edf8d","declaration":"export type AgentHarnessAttemptParamsV2 = AgentHarnessAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"89d1232faa739ea7bb8b305d5e92ff1057759b833cd9994ef0923634234741e7","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness-runtime","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"89d1232faa739ea7bb8b305d5e92ff1057759b833cd9994ef0923634234741e7","declaration":"export type AgentHarnessAttemptParams = AgentHarnessAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"ee3f133d91eaa071727c7e182f4448cd13fec510ea6b2b575283dc548f60c9cf","declaration":"export type AgentHarnessAttemptParamsV2 = AgentHarnessAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"2dc2a62deea63b316142cc28d40afb88fb0d1e5ce3e048f141420726cda38248","declaration":"export type AgentHarnessAttemptResult = AgentHarnessAttemptResult;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"c7e642234081160830fd9e18a301900f8ee1ea8c88382e5a286f0102de65b714","declaration":"export type AgentHarnessAuthBindingFingerprintParams = AgentHarnessAuthBindingFingerprintParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAuthBindingFingerprintParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"8f496ce75f294f2aa440a49c3c5b065ddff3a4714df775116af5e53f7fd14fe5","declaration":"export type AgentHarnessCompactParams = CompactEmbeddedAgentSessionParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessCompactParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} @@ -239,8 +239,8 @@ {"closureHash":"95741b872a194687696eba4a96d6e887ec6e81922695fa0282cb2f0a46ff9f97","declaration":"export type AgentHarnessSessionForkParams = AgentHarnessSessionForkParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSessionForkParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"f3c46fef2a6c3393b0b6ad09915abcd6f57bb58ddddde1d60ebd113c7a1c5fa6","declaration":"export type AgentHarnessSessionForkResult = AgentHarnessSessionForkResult;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSessionForkResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"4b5a59730309e446f59a8ec1c554c3193aca1959916594cc657347098bd67a35","declaration":"export type AgentHarnessSettledTurnFinalizationResult = AgentHarnessSettledTurnFinalizationResult;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSettledTurnFinalizationResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"26983648c19880d258a8d0da7b8249adb5db4ea2fa269e7f637bb53609f4db8c","declaration":"export type AgentHarnessSideQuestionParams = AgentHarnessSideQuestionParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"7bbb6e9841e98ffab5297489258eacbb5a85ddf7c24ecb4b01e5f43984803f53","declaration":"export type AgentHarnessSideQuestionParamsV2 = AgentHarnessSideQuestionParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"e62cfeeba660873901af9d26f7bb425ddc82063d115fc3f900d272676883b49a","declaration":"export type AgentHarnessSideQuestionParams = AgentHarnessSideQuestionParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"a0037263e721edda60c398822f5db2731f46db96b2922e8e5a00c5e20df67ec4","declaration":"export type AgentHarnessSideQuestionParamsV2 = AgentHarnessSideQuestionParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"e84173055503c40dd0ef1cb67c6d333e9257fcf995252b27c1d58f5c904e8de9","declaration":"export type AgentHarnessSideQuestionResult = AgentHarnessSideQuestionResult;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"50214d08dac98e3c1031ac7bc733b85cb2247d2eef3b6b2045758ae403af7647","declaration":"export type AgentHarnessSupport = AgentHarnessSupport;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSupport","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"50ce26ea22bc225e6064d2e5f37356b6f4ce4a57f8b9fa42baa4c421da48aad5","declaration":"export type AgentHarnessSupportContext = AgentHarnessSupportContext;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSupportContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} @@ -250,7 +250,7 @@ {"closureHash":"20a8a7c9d5ebf425c30d04eea3856c6c889a210f1fa53c99299df24882afbf92","declaration":"export type AgentHarnessUserInputOption = AgentHarnessUserInputOption;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessUserInputOption","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"6224f51b4189f10a642ad7a8f50a902ec9c6a6a4f8dac0c0de5f7bc0271a27e5","declaration":"export type AgentHarnessUserInputPromptOptions = AgentHarnessUserInputPromptOptions;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessUserInputPromptOptions","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"d8f1d0d118e1536d1f442d11aeae5334a1ed7949a6c61824f547e12931278e1d","declaration":"export type AgentHarnessUserInputQuestion = AgentHarnessUserInputQuestion;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessUserInputQuestion","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"da7ca74cf7a80b0e17b14ffd80a59005de2629a28b9267a453333236e4ad55ce","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"795de260f25641a5b8da3aebe153b44e06327ee13bf9a05f7e42c3b38f3c2ce3","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"6f2af683e6a31cde5a473c77e4f03b8f0ec0351a43ea6c0af979d5b394a33f95","declaration":"export type AgentMessage = AgentMessage;","entrypoint":"agent-harness-runtime","exportName":"AgentMessage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"4ad0f830bf11a2db48faefb1439b7fbb08d9f22d22083f5e301327e1696f2310","declaration":"export type AgentToolResultMiddleware = AgentToolResultMiddleware;","entrypoint":"agent-harness-runtime","exportName":"AgentToolResultMiddleware","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"185abd2870d4df65e9f94623061a30167d17ef1279a395201fe429398bf23500","declaration":"export type AgentToolResultMiddlewareContext = AgentToolResultMiddlewareContext;","entrypoint":"agent-harness-runtime","exportName":"AgentToolResultMiddlewareContext","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} @@ -276,8 +276,8 @@ {"closureHash":"f30b66fd82f4cd61c60880c42a3b8f152ca64a2216036c99ab4129648ed329e7","declaration":"export type EmbeddedAgentCompactResult = EmbeddedAgentCompactResult;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedAgentCompactResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"1bbefad0193436f7340f9d0dec50be5d482973325c3c65170b1053dd05566f0a","declaration":"export type EmbeddedContextFile = EmbeddedContextFile;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedContextFile","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"f30b66fd82f4cd61c60880c42a3b8f152ca64a2216036c99ab4129648ed329e7","declaration":"export type EmbeddedPiCompactResult = EmbeddedAgentCompactResult;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedPiCompactResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"180c0c99b663e302776c88d60aba63bd2ba0a5f86d2940988d69c83b90687847","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"fb113638929d54843e4535420afaf821e6fcaf4665820d7fa02c9576ffe2a4fa","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"67d52689459e750067ca4d122d5169a1032fa5a806cdc66b0bf189f702ddbf57","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"3c8261189c5490b5f8938dde6c1fd39e05ad9a3156041fcc8b20df8040147986","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"a6cd2eebe0d06e6578ec8438a207c5acda10ddf01041102d84e4c576a0b6a42f","declaration":"export type EmbeddedRunAttemptResult = EmbeddedRunAttemptResult;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"f6cb2d6411db22cb04220777720d97bcca977351de1cb344ce2ff6ab126a3a08","declaration":"export type ExecApprovalDecision = ExecApprovalDecision;","entrypoint":"agent-harness-runtime","exportName":"ExecApprovalDecision","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"7acb0dffc7bcda6c727e4afc49c955fa8e14f4f8b7b45d197ed794dfa0d73b8e","declaration":"export type ExecAutoReviewDecision = ExecAutoReviewDecision;","entrypoint":"agent-harness-runtime","exportName":"ExecAutoReviewDecision","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} @@ -293,7 +293,7 @@ {"closureHash":"d8a720bf250da8daf4dc6a52087aa8728ec33b650b3ad3906fcb40e184de66a0","declaration":"export type NativeHookRelayEvent = \"pre_tool_use\" | \"post_tool_use\" | \"permission_request\" | \"before_agent_finalize\";","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayEvent","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"cb72ca18e056e52e779d0bf5b67606e1dc160f225225b55937304541105027f4","declaration":"export type NativeHookRelayProcessResponse = NativeHookRelayProcessResponse;","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayProcessResponse","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"6ee390ae4784b987e22255c16884fb4171033bbfaefaef655e3dd2a2513814a5","declaration":"export type NativeHookRelayProvider = \"codex\";","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayProvider","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"dd5194f78d89c3bdeb981e68db77ecd2db33ac774bff194486cb7942b4e73a2e","declaration":"export type NativeHookRelayRegistrationHandle = NativeHookRelayRegistrationHandle;","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayRegistrationHandle","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"3026ea832c52143a13ef1ddfa6428f1f284c07b9d6ca27b4a341f61885b4a171","declaration":"export type NativeHookRelayRegistrationHandle = NativeHookRelayRegistrationHandle;","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayRegistrationHandle","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"90fea3155b5d32c22da90460fdaea94e4fd6895d1ca18613d5036ba9835153f9","declaration":"export type NodeListNode = NodeListNode;","entrypoint":"agent-harness-runtime","exportName":"NodeListNode","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"cefe1325c866f0cf7edbec5dcca2fe420237eedc0da172e54094e365894d205d","declaration":"export type NormalizedUsage = NormalizedUsage;","entrypoint":"agent-harness-runtime","exportName":"NormalizedUsage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} {"closureHash":"25c6985c3bef2c6efc6a96e70af6d66fe073be0b0d311681cfc0dfc186528d9a","declaration":"export type OpenClawAgentToolResult = OpenClawAgentToolResult;","entrypoint":"agent-harness-runtime","exportName":"OpenClawAgentToolResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} @@ -762,7 +762,7 @@ {"closureHash":"9fc7e45343d7bfbc6ed56d05c9f824e2f9cf6dafc3ca4b25437d1f65c2200727","declaration":"export function clearAccountEntryFields(params: { accounts?: Record; accountId: string; fields: string[]; isValueSet?: (value: unknown) => boolean; markClearedOnFieldPresence?: boolean; }): { nextAccounts?: Record; changed: boolean; cleared: boolean; };","entrypoint":"channel-core","exportName":"clearAccountEntryFields","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"f4e084b64b5376268885a73fe507aa5d72bee17a88ec2d7ae1d19b36ea5f1ccb","declaration":"export function createChannelConfigUiHints(params: { channelLabel: string; dmPolicy?: { channelKey: string; includeLegacyNestedPolicy?: boolean; legacyNestedPolicyOrder?: \"before\" | \"after\"; }; configWrites?: boolean; mentionPatterns?: { targetDescription: string; policyTargetDescription?: string; policyNote?: string; denyNote?: string; }; nativeCommands?: boolean; implicitMentions?: boolean; progress?: { includeCommentary?: boolean; commentaryOrder?: \"before-command\" | \"after-command\"; labels?: \"openclaw\"; titleWording?: boolean; }; streaming?: Partial>; retry?: boolean; }): HintMap;","entrypoint":"channel-core","exportName":"createChannelConfigUiHints","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"ed8c322fac76968f7f059b65eaa881098ed918b22705b27101166b052213a9d9","declaration":"export function createChatChannelPlugin(params: { base: ChatChannelPluginBase; security?: ChannelSecurityAdapter | ChatChannelSecurityOptions; pairing?: ChannelPairingAdapter | ChatChannelPairingOptions; threading?: ChannelThreadingAdapter | ChatChannelThreadingOptions; outbound?: ChannelOutboundAdapter | ChatChannelAttachedOutboundOptions; }): ChannelPlugin;","entrypoint":"channel-core","exportName":"createChatChannelPlugin","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} -{"closureHash":"6ea156b9a44762cd214b792982597706be729f18dd6e1e790263b1d8954ca031","declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, registerCapabilities, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"channel-core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} +{"closureHash":"ce9c9e8c168d4f87a32d87b0aba10d5a917d997e2f5e35c4ce6728ba15310dbc","declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, registerCapabilities, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"channel-core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"0e0a9f6b22c433bdb1165e7707b1f9a1ddac1a544a8add00b503048cf157921f","declaration":"export function defineSetupPluginEntry(plugin: TPlugin): { plugin: TPlugin; };","entrypoint":"channel-core","exportName":"defineSetupPluginEntry","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"8895f7af11b994dcd383ebc45d8cfb3c3b1e6d88a64a001b04f604a83f77e517","declaration":"export function parseOptionalDelimitedEntries(value?: string): string[] | undefined;","entrypoint":"channel-core","exportName":"parseOptionalDelimitedEntries","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"3f97534b10d08eda6a556044eaba623b3744b200a2033877e48d2f2ca924d298","declaration":"export function recoverCurrentThreadSessionId(params: { route: ChannelOutboundSessionRoute; currentSessionKey?: string | null; canRecover?: (context: ThreadAwareOutboundSessionRouteRecoveryContext) => boolean; }): string | undefined;","entrypoint":"channel-core","exportName":"recoverCurrentThreadSessionId","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} @@ -774,24 +774,24 @@ {"closureHash":"8126b651a679d5435eaa5d346916792c3600e5f0f75d8492b077dd361854f7dd","declaration":"export type ChannelOutboundSessionRouteParams = { cfg: OpenClawConfig; agentId: string; accountId?: string | null; target: string; currentSessionKey?: string; resolvedTarget?: { to: string; kind: ChannelDirectoryEntryKind | \"channel\"; display?: string; source: \"normalized\" | \"directory\"; }; replyToId?: string | null; threadId?: string | number | null;};","entrypoint":"channel-core","exportName":"ChannelOutboundSessionRouteParams","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"closureHash":"37b373e93fe7f86fdbce119947c9e49b17e71ce50fe47e118c4d078c5cea20ec","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"channel-core","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"closureHash":"8054ffbe71b91afced900ef8a06f5e368ac10c4f99ffc1c6f538a802856f61c6","declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"channel-core","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"closureHash":"86553d1dbbbe0b04d6a233ab33dee847c2cf5f9809032d41c5bff6bec06b78da","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"channel-core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"channel-core","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"category":"channel","entrypoint":"channel-dm-policy","importSpecifier":"openclaw/plugin-sdk/channel-dm-policy","recordType":"module"} {"closureHash":"821fe6ccd0d9323322bf70c4d1ca5697071a0e32032f44c1e14157162c2c729d","declaration":"export function createChannelDmPolicy(params: CreateChannelDmPolicyParams): ChannelSetupDmPolicy & { promptAllowFrom: NonNullable; };","entrypoint":"channel-dm-policy","exportName":"createChannelDmPolicy","importSpecifier":"openclaw/plugin-sdk/channel-dm-policy","kind":"function","recordType":"export"} {"category":null,"entrypoint":"channel-entry-contract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","recordType":"module"} -{"closureHash":"8936f29b5fd796fcd67a164f5976915d13cba9f57b126fe64554500d140e591c","declaration":"export function defineBundledChannelEntry({ id, name, description, importMetaUrl, plugin, outbound, secrets, configSchema, runtime, accountInspect, features, registerCliMetadata, registerFull, registerCapabilities, }: DefineBundledChannelEntryOptions): BundledChannelEntryContract;","entrypoint":"channel-entry-contract","exportName":"defineBundledChannelEntry","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"function","recordType":"export"} -{"closureHash":"2e55f00f056e8eca8f9367833205a180bb4ba1e2d439a554e7975d39288511b9","declaration":"export function defineBundledChannelSetupEntry({ importMetaUrl, plugin, secrets, runtime, legacyStateMigrations, legacySessionSurface, registerSetupRuntime, features, }: DefineBundledChannelSetupEntryOptions): BundledChannelSetupEntryContract;","entrypoint":"channel-entry-contract","exportName":"defineBundledChannelSetupEntry","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"function","recordType":"export"} +{"closureHash":"1d424a5413b9e7f29440f748416ad227ea8a00c33fcea1a039d749c492673289","declaration":"export function defineBundledChannelEntry({ id, name, description, importMetaUrl, plugin, outbound, secrets, configSchema, runtime, accountInspect, features, registerCliMetadata, registerFull, registerCapabilities, }: DefineBundledChannelEntryOptions): BundledChannelEntryContract;","entrypoint":"channel-entry-contract","exportName":"defineBundledChannelEntry","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"function","recordType":"export"} +{"closureHash":"068956e11ec24ed43f2c259ddd62503f71ff39b4c51626f9597274cb62786478","declaration":"export function defineBundledChannelSetupEntry({ importMetaUrl, plugin, secrets, runtime, legacyStateMigrations, legacySessionSurface, registerSetupRuntime, features, }: DefineBundledChannelSetupEntryOptions): BundledChannelSetupEntryContract;","entrypoint":"channel-entry-contract","exportName":"defineBundledChannelSetupEntry","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"function","recordType":"export"} {"closureHash":"cd150287d7e286e7a0d7d6caeb05d0a1efa63b5f351f75f69ba932510a108afd","declaration":"export function loadBundledEntryExportSync(importMetaUrl: string, reference: BundledEntryModuleRef, options?: BundledEntryModuleLoadOptions): T;","entrypoint":"channel-entry-contract","exportName":"loadBundledEntryExportSync","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"function","recordType":"export"} {"closureHash":"7781a3d570d08929af5b3b6cffbb9ef4b9c8e8f1bed55234e0015a681868c812","declaration":"export type AnyAgentTool = AnyAgentTool;","entrypoint":"channel-entry-contract","exportName":"AnyAgentTool","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} -{"closureHash":"8871a982406d41fd1ef69e887ac5c8bc176767d63fd0c42ed46abf0c260a7144","declaration":"export type BundledChannelEntryContract = BundledChannelEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"96a454f6a7accfc5955eca5e31b6554fbaa4b128c74990913b949626037aba74","declaration":"export type BundledChannelEntryContract = BundledChannelEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"f4b82dfd995bd6f08b232984743389d1c854866cb845a8dbb3605acb28818688","declaration":"export type BundledChannelEntryFeatures = BundledChannelEntryFeatures;","entrypoint":"channel-entry-contract","exportName":"BundledChannelEntryFeatures","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"960693591b9bdc974bf3f0097076d90490078db3dceb35349a4f851736cde4fc","declaration":"export type BundledChannelLegacySessionSurface = BundledChannelLegacySessionSurface;","entrypoint":"channel-entry-contract","exportName":"BundledChannelLegacySessionSurface","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"edf79e6a736e5c4977e3b86ef21e7fdf0c0b2bc7deacd8edbee2ca76cb8cef43","declaration":"export type BundledChannelLegacyStateMigrationDetector = BundledChannelLegacyStateMigrationDetector;","entrypoint":"channel-entry-contract","exportName":"BundledChannelLegacyStateMigrationDetector","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} -{"closureHash":"f93b2f17f18ef2892301339b1572ad1e53a535425c9f8c5e607936de2ae779c3","declaration":"export type BundledChannelSetupEntryContract = BundledChannelSetupEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelSetupEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"fd433c4c8cd02dfdf094953efca2f9b8239ea906dd046f40b74e68d6f5bc28b7","declaration":"export type BundledChannelSetupEntryContract = BundledChannelSetupEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelSetupEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"24679ecdf2ff34157b6345a37b58ec1363ec8cb1969b522599d0d92bb7a113b7","declaration":"export type BundledChannelSetupEntryFeatures = BundledChannelSetupEntryFeatures;","entrypoint":"channel-entry-contract","exportName":"BundledChannelSetupEntryFeatures","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"367219c821915e5be4d1ba3a86754475a5f8a4194512f0401de3be11cc649c60","declaration":"export type BundledEntryModuleLoadOptions = BundledEntryModuleLoadOptions;","entrypoint":"channel-entry-contract","exportName":"BundledEntryModuleLoadOptions","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} -{"closureHash":"1628fbd9b07c0dc2aa71f5da0cf356a9ee927669c7305f13e937d80f9b5b7e9f","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-entry-contract","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"a314e825c2d1c948accf7d7b17af39ddfa85c43bccfd545051713bc7ab5b2704","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-entry-contract","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"e54f9b270df967e0f857de804dbe989f2c55b637c449c9948c4baae8eee18c7b","declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"channel-entry-contract","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"closureHash":"568b5ab033b4970cedd3916d948d31bcdd3c19ea8928c7cd7dc7abf7623b8af8","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"channel-entry-contract","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} {"category":null,"entrypoint":"channel-feedback","importSpecifier":"openclaw/plugin-sdk/channel-feedback","recordType":"module"} @@ -1103,7 +1103,7 @@ {"closureHash":"9555a73ba2717bba0bf94888017be4cecef2c51cc3887ed34f8d8ef3c79d6abf","declaration":"export const DEFAULT_INGRESS_RETRY_DEAD_LETTER_MIN_AGE_MS: number;","entrypoint":"channel-message","exportName":"DEFAULT_INGRESS_RETRY_DEAD_LETTER_MIN_AGE_MS","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} {"closureHash":"3a2df3ab656149630c004d2d9f71b8ceda99aa81eb6b72b0cc7b3982ed0ce044","declaration":"export const DEFAULT_INGRESS_RETRY_MAX_ATTEMPTS: 8;","entrypoint":"channel-message","exportName":"DEFAULT_INGRESS_RETRY_MAX_ATTEMPTS","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} {"closureHash":"38c735a14c65067aa7825390d1c5c8876c651d0603e84980dfaf947f5235747a","declaration":"export const INGRESS_CLAIM_PROCESS_ID: string;","entrypoint":"channel-message","exportName":"INGRESS_CLAIM_PROCESS_ID","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} -{"closureHash":"11bc03411c2fd6e4309200de5b4da5225520d564b5f186cd67127a8667310614","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"channel-message","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} +{"closureHash":"4ce46d95ad5a8623c0a3c0621b7d977a25280b4a983d62efdf02bfd140ea8da0","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"channel-message","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} {"closureHash":"2c52eff200a5b9bd2d93ee72209c2626bbe165f59b538591db661b94773023b0","declaration":"export type AgentPlanStep = AgentPlanStep;","entrypoint":"channel-message","exportName":"AgentPlanStep","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"type","recordType":"export"} {"closureHash":"1e8bcb2c8d8f5327f5b81b8c217f722f090dccba21ba3943324010f4f80a5a50","declaration":"export type AgentPlanStepStatus = AgentPlanStepStatus;","entrypoint":"channel-message","exportName":"AgentPlanStepStatus","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"type","recordType":"export"} {"closureHash":"b036fc26e5330dfd7da1af8839bb3c23e85283b9e16e252a659dd4bb0c35cd5e","declaration":"export type ChannelDeliveryStreamingConfig = ChannelDeliveryStreamingConfig;","entrypoint":"channel-message","exportName":"ChannelDeliveryStreamingConfig","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"type","recordType":"export"} @@ -1232,7 +1232,7 @@ {"closureHash":"9555a73ba2717bba0bf94888017be4cecef2c51cc3887ed34f8d8ef3c79d6abf","declaration":"export const DEFAULT_INGRESS_RETRY_DEAD_LETTER_MIN_AGE_MS: number;","entrypoint":"channel-outbound","exportName":"DEFAULT_INGRESS_RETRY_DEAD_LETTER_MIN_AGE_MS","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} {"closureHash":"3a2df3ab656149630c004d2d9f71b8ceda99aa81eb6b72b0cc7b3982ed0ce044","declaration":"export const DEFAULT_INGRESS_RETRY_MAX_ATTEMPTS: 8;","entrypoint":"channel-outbound","exportName":"DEFAULT_INGRESS_RETRY_MAX_ATTEMPTS","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} {"closureHash":"38c735a14c65067aa7825390d1c5c8876c651d0603e84980dfaf947f5235747a","declaration":"export const INGRESS_CLAIM_PROCESS_ID: string;","entrypoint":"channel-outbound","exportName":"INGRESS_CLAIM_PROCESS_ID","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} -{"closureHash":"11bc03411c2fd6e4309200de5b4da5225520d564b5f186cd67127a8667310614","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"channel-outbound","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} +{"closureHash":"4ce46d95ad5a8623c0a3c0621b7d977a25280b4a983d62efdf02bfd140ea8da0","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"channel-outbound","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} {"closureHash":"2c52eff200a5b9bd2d93ee72209c2626bbe165f59b538591db661b94773023b0","declaration":"export type AgentPlanStep = AgentPlanStep;","entrypoint":"channel-outbound","exportName":"AgentPlanStep","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"type","recordType":"export"} {"closureHash":"1e8bcb2c8d8f5327f5b81b8c217f722f090dccba21ba3943324010f4f80a5a50","declaration":"export type AgentPlanStepStatus = AgentPlanStepStatus;","entrypoint":"channel-outbound","exportName":"AgentPlanStepStatus","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"type","recordType":"export"} {"closureHash":"b036fc26e5330dfd7da1af8839bb3c23e85283b9e16e252a659dd4bb0c35cd5e","declaration":"export type ChannelDeliveryStreamingConfig = ChannelDeliveryStreamingConfig;","entrypoint":"channel-outbound","exportName":"ChannelDeliveryStreamingConfig","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"type","recordType":"export"} @@ -1298,7 +1298,7 @@ {"closureHash":"cd6b0d3f962c8cb40d405e92bb06bb8e9285b386200897f550d21036022262c1","declaration":"export const PAIRING_APPROVED_MESSAGE: \"✅ OpenClaw access approved. Send a message to start chatting.\";","entrypoint":"channel-plugin-common","exportName":"PAIRING_APPROVED_MESSAGE","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"const","recordType":"export"} {"closureHash":"712435252d2fe5135542ca6b5a4375a6edea24e83829338011dc6ae7e9802fbb","declaration":"export type ChannelMessageActionContext = ChannelMessageActionContext;","entrypoint":"channel-plugin-common","exportName":"ChannelMessageActionContext","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} {"closureHash":"37b373e93fe7f86fdbce119947c9e49b17e71ce50fe47e118c4d078c5cea20ec","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"channel-plugin-common","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-plugin-common","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-plugin-common","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} {"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"channel-plugin-common","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} {"category":null,"entrypoint":"channel-policy","importSpecifier":"openclaw/plugin-sdk/channel-policy","recordType":"module"} {"closureHash":"017ab29d16d0f3d02d60f3513e65a373868d26496bc93d020d8fc8c17fd875f4","declaration":"export function buildAccountScopedDmSecurityPolicy(params: { cfg: OpenClawConfig; channelKey: string; accountId?: string | null; fallbackAccountId?: string | null; policy?: string | null; allowFrom?: Array | null; defaultPolicy?: string; allowFromPathSuffix?: string; policyPathSuffix?: string; approveChannelId?: string; approveHint?: string; normalizeEntry?: (raw: string) => string; inheritSharedDefaultsFromDefaultAccount?: boolean; }): ChannelSecurityDmPolicy;","entrypoint":"channel-policy","exportName":"buildAccountScopedDmSecurityPolicy","importSpecifier":"openclaw/plugin-sdk/channel-policy","kind":"function","recordType":"export"} @@ -1897,8 +1897,8 @@ {"closureHash":"ed8c322fac76968f7f059b65eaa881098ed918b22705b27101166b052213a9d9","declaration":"export function createChatChannelPlugin(params: { base: ChatChannelPluginBase; security?: ChannelSecurityAdapter | ChatChannelSecurityOptions; pairing?: ChannelPairingAdapter | ChatChannelPairingOptions; threading?: ChannelThreadingAdapter | ChatChannelThreadingOptions; outbound?: ChannelOutboundAdapter | ChatChannelAttachedOutboundOptions; }): ChannelPlugin;","entrypoint":"core","exportName":"createChatChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"785b0f750c5bd20f9f3ca081886a5af79ee0e4d2c38f78f769bf994b234f5076","declaration":"export function createDedupeCache(options: DedupeCacheOptions): DedupeCache;","entrypoint":"core","exportName":"createDedupeCache","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"e2df8d235401aebf58eb71652fbeaedb42ca00aaa5042a76909ff2c48ba6fd54","declaration":"export function createSubsystemLogger(subsystem: string): SubsystemLogger;","entrypoint":"core","exportName":"createSubsystemLogger","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} -{"closureHash":"6ea156b9a44762cd214b792982597706be729f18dd6e1e790263b1d8954ca031","declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, registerCapabilities, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} -{"closureHash":"b7e031e4d95cb97a29f246179c1f24d0800afed2c3c2e9a95d17c0aa69c5ed10","declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, reload, nodeHostCommands, securityAuditCollectors, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"core","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} +{"closureHash":"ce9c9e8c168d4f87a32d87b0aba10d5a917d997e2f5e35c4ce6728ba15310dbc","declaration":"export function defineChannelPluginEntry({ id, name, description, plugin, configSchema, setRuntime, registerCliMetadata, registerFull, registerCapabilities, }: DefineChannelPluginEntryOptions): DefinedChannelPluginEntry;","entrypoint":"core","exportName":"defineChannelPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} +{"closureHash":"e9633b4ca148dc6289c61a1d85b0e34cb244d926badbf4a591302267c691e62a","declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, reload, nodeHostCommands, securityAuditCollectors, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"core","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"0e0a9f6b22c433bdb1165e7707b1f9a1ddac1a544a8add00b503048cf157921f","declaration":"export function defineSetupPluginEntry(plugin: TPlugin): { plugin: TPlugin; };","entrypoint":"core","exportName":"defineSetupPluginEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"3c5ce0c3733cbb038aeb914af1df5d701f362f0521921b8abd0c9214db9cc4b8","declaration":"export function delegateCompactionToRuntime(params: Parameters[0]): Promise;","entrypoint":"core","exportName":"delegateCompactionToRuntime","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"2c282e0e308f9442bca7cdeb8e89a097531b1d54a692c9d86e5f39a8db1c2537","declaration":"export function deleteAccountFromConfigSection(params: { cfg: OpenClawConfig; sectionKey: string; accountId: string; clearBaseFields?: string[]; }): OpenClawConfig;","entrypoint":"core","exportName":"deleteAccountFromConfigSection","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} @@ -1945,7 +1945,7 @@ {"closureHash":"2e6ce1f4c1692270a00dc0cf08e2752a26739c3143f8091cb270063c6034605d","declaration":"export function tryReadSecretFileSync(filePath: string | undefined, label: string, options: CredentialFileReadOptions): string | undefined;\nexport function tryReadSecretFileSync(filePath: string | undefined, label: string, options?: FsSafeSecretFileReadOptions): string | undefined;\nexport function tryReadSecretFileSync(filePath: string, label: string, options: FsSafeSecretFileReadOptions | undefined, diagnostic: { configPath: string; }): ConfiguredCredentialResult;\nexport function tryReadSecretFileSync(filePath: string | undefined, label: string, options: FsSafeSecretFileReadOptions | undefined, diagnostic: { configPath: string; }): CredentialResult;","entrypoint":"core","exportName":"tryReadSecretFileSync","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"b40933a11984425d14a7a479bda0d2cd14cbfa9371164774f39bebbf12861df7","declaration":"export const DEFAULT_ACCOUNT_ID: \"default\";","entrypoint":"core","exportName":"DEFAULT_ACCOUNT_ID","importSpecifier":"openclaw/plugin-sdk/core","kind":"const","recordType":"export"} {"closureHash":null,"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"} -{"closureHash":"a258a6b4c206e4c8ffffa152bbe499da5e54e3dc5e3880556fb29a887abef00c","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"core","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"89d1232faa739ea7bb8b305d5e92ff1057759b833cd9994ef0923634234741e7","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"core","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"d2ff4de9ee3fd111c2cc64a3ee7e557d9f161af1b6b437ee7886bcb16e426317","declaration":"export type AgentPromptGuidance = AgentPromptGuidance;","entrypoint":"core","exportName":"AgentPromptGuidance","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"2841127a90e04467adfea8126cbf03655f44ddb089ad9e0d48833c2beea39cbd","declaration":"export type AgentPromptGuidanceEntry = AgentPromptGuidanceEntry;","entrypoint":"core","exportName":"AgentPromptGuidanceEntry","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"aa0412acefe62caff12e5271ead0545504874e824380dc21cfc0566388a05f33","declaration":"export type AgentPromptSurfaceKind = \"openclaw_main\" | \"pi_main\" | \"codex_app_server\" | \"cli_backend\" | \"acp_backend\" | \"subagent\";","entrypoint":"core","exportName":"AgentPromptSurfaceKind","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} @@ -1977,10 +1977,10 @@ {"closureHash":"54ea426dde51859b572b4c1079d2b70b412096f73da2b8c265f2749d9f01cbb5","declaration":"export type NormalizedLocation = NormalizedLocation;","entrypoint":"core","exportName":"NormalizedLocation","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"8054ffbe71b91afced900ef8a06f5e368ac10c4f99ffc1c6f538a802856f61c6","declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"core","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"5189698d102b8b064eefe1442b008312973c3994fd6b203d2205725d7ee9d118","declaration":"export type OpenClawPluginActiveModelContext = OpenClawPluginActiveModelContext;","entrypoint":"core","exportName":"OpenClawPluginActiveModelContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"c968e96cdb5c97e92d26b7b15fb5255531b45a12e7c5c0a2e7e456d31cc6e358","declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"core","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"365beb5cee974639c2f35fc7a39088721ca8e9c618442830298b98033e9c768c","declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"core","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"fe7b101f5d07e70deb7b77cbb813bf7a063922ad68ad8374693545262221da65","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"9303ba80fdfee2f9fae041231bc7482ae3dffcc8d451f1862aac7fc1c2a8b8f2","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"a7ed83f0924f818b23cecb5a1f3591ff28b9499ccac9667a2b8505c2bc608ea9","declaration":"export type OpenClawPluginGatewayEventScope = OpenClawPluginGatewayEventScope;","entrypoint":"core","exportName":"OpenClawPluginGatewayEventScope","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"f81f224d9b837e6353b7a546c5a76b124bcf568fd1f1fd0c6881fda30c53120a","declaration":"export type OpenClawPluginGatewayEvents = OpenClawPluginGatewayEvents;","entrypoint":"core","exportName":"OpenClawPluginGatewayEvents","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"ddc2738dd0ece94ddde9a7c655f92c15ec6416645ecf932d4aa404c7b7761159","declaration":"export type OpenClawPluginService = OpenClawPluginService;","entrypoint":"core","exportName":"OpenClawPluginService","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} @@ -2215,7 +2215,7 @@ {"closureHash":"0db968dad99d84ecef5202167daadd092e3b4f456270283d3fd61585ac2bbd5a","declaration":"export type DiscordComponentSendResult = DiscordComponentSendResult;","entrypoint":"discord","exportName":"DiscordComponentSendResult","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"084b46d7dd510eb182a4705559251e824220b57dbfa6dc54392507b72ba1815e","declaration":"export type DiscordOutboundTargetResolution = DiscordOutboundTargetResolution;","entrypoint":"discord","exportName":"DiscordOutboundTargetResolution","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"8054ffbe71b91afced900ef8a06f5e368ac10c4f99ffc1c6f538a802856f61c6","declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"discord","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"discord","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"discord","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"discord","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"6b9967e919c1cd420c8356b4f9d40dbc81932b4b15a733eecdcfb2ad84f8e5d8","declaration":"export type ResolvedDiscordAccount = ResolvedDiscordAccount;","entrypoint":"discord","exportName":"ResolvedDiscordAccount","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"6bed5ca896b7034117e4757e2c6b4111dd5293dbad9416e3828dd6afa4e858ce","declaration":"export type ThreadBindingRecord = ThreadBindingRecord;","entrypoint":"discord","exportName":"ThreadBindingRecord","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} @@ -2360,7 +2360,7 @@ {"closureHash":"98e0cc16352b7dfcceb4957f8cd2acfe3c2b3acb223c42a5cfb885e088fcb04c","declaration":"export function resolveInboundReplyDispatchCounts(result: ChannelTurnDispatchResultLike): Record;","entrypoint":"inbound-reply-dispatch","exportName":"resolveInboundReplyDispatchCounts","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"4cd63266d379acc2cdf9aba02f50b8ceb55500cf820787c370fc98d173fb1950","declaration":"export function runChannelInboundEvent(params: RunChannelTurnParams): Promise>;\nexport function runChannelInboundEvent(params: ChannelInboundEventRunnerParams): Promise>;","entrypoint":"inbound-reply-dispatch","exportName":"runChannelInboundEvent","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"2c68496a174872b31aaf1ac8fad2789deb79d490c5ffbcb157325f1c95d1b51f","declaration":"export function runPreparedInboundReply(params: PreparedChannelTurn): Promise>;","entrypoint":"inbound-reply-dispatch","exportName":"runPreparedInboundReply","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} -{"closureHash":"11bc03411c2fd6e4309200de5b4da5225520d564b5f186cd67127a8667310614","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"inbound-reply-dispatch","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"const","recordType":"export"} +{"closureHash":"4ce46d95ad5a8623c0a3c0621b7d977a25280b4a983d62efdf02bfd140ea8da0","declaration":"export const deliverInboundReplyWithMessageSendContext: (params: DurableInboundReplyDeliveryParams) => Promise<{ status: \"not_applicable\"; reason: \"non_final\";} | { status: \"unsupported\"; reason: \"missing_channel\" | \"missing_target\" | \"missing_outbound_handler\" | \"capability_mismatch\"; capability?: DurableFinalDeliveryRequirement;} | { status: \"handled_visible\"; delivery: ChannelDeliveryResult;} | { status: \"handled_no_send\"; reason: \"no_visible_result\"; delivery: ChannelDeliveryResult;} | { status: \"failed\"; error: unknown; sentBeforeError?: true;}>;","entrypoint":"inbound-reply-dispatch","exportName":"deliverInboundReplyWithMessageSendContext","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"const","recordType":"export"} {"closureHash":"ab30d0470348e3af7c18a273afc0d169d91f204fba557c75c4694e8a0ea6c936","declaration":"export type AssembledInboundReply = AssembledChannelTurn;","entrypoint":"inbound-reply-dispatch","exportName":"AssembledInboundReply","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"3de0d6d1bb8f9a83bd1c6e57aa8618e3fea71054236cd530c555e348bd0b7702","declaration":"export type ChannelBotLoopProtectionFacts = ChannelBotLoopProtectionFacts;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelBotLoopProtectionFacts","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"f0da845bbdf49b30f6718a4b7ff012a0536deb98f65418583555dc90825797ca","declaration":"export type ChannelInboundDroppedHistoryOptions = ChannelTurnDroppedHistoryOptions;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelInboundDroppedHistoryOptions","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} @@ -3195,19 +3195,19 @@ {"closureHash":"3362ea0b650933db6db467ef8ae1c82e682e946761647c8dfae401eec1237bd6","declaration":"export function callMeetingBrowserProxyOnNode(params: { runtime: PluginRuntime; adapter: NodeAdapter; nodeId: string; } & MeetingBrowserRequestParams): Promise;","entrypoint":"meeting-runtime","exportName":"callMeetingBrowserProxyOnNode","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"c5fcd1d157edcb4773235adfaf8051e3ec7ca428cb7916b6d55f2511affab56c","declaration":"export function convertMeetingBridgeAudioForStt(audio: Buffer, audioFormat: MeetingRealtimeAudioFormat): Buffer;","entrypoint":"meeting-runtime","exportName":"convertMeetingBridgeAudioForStt","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"aa9063c27c5ff714d3653571c4a2a71e9d2eea5609b161f03e4738e15411358b","declaration":"export function convertMeetingTtsAudioForBridge(audio: Buffer, sampleRate: number, audioFormat: MeetingRealtimeAudioFormat, outputFormat?: string, platformName?: string): Buffer;","entrypoint":"meeting-runtime","exportName":"convertMeetingTtsAudioForBridge","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"55fc2f6310283d13f3315f0e0294e9964f436b1bd8dec6d267f3cb31bcf2e911","declaration":"export function createLocalMeetingRealtimeAudioTransport(params: { inputCommand: string[]; outputCommand: string[]; bargeInInputCommand?: string[]; bargeInRmsThreshold: number; bargeInPeakThreshold: number; bargeInCooldownMs: number; logger: RuntimeLogger; logScope: string; audioFormat?: MeetingRealtimeAudioFormat; spawn?: MeetingRealtimeAudioSpawn; }): MeetingRealtimeAudioTransport;","entrypoint":"meeting-runtime","exportName":"createLocalMeetingRealtimeAudioTransport","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"21c4eeafbcb8b35075e631d13184777bb1f9e1f5cb0d2316ed62d74de48e898a","declaration":"export function createLocalMeetingRealtimeAudioTransport(params: { inputCommand: string[]; outputCommand: string[]; bargeInInputCommand?: string[]; bargeInRmsThreshold: number; bargeInPeakThreshold: number; bargeInCooldownMs: number; logger: RuntimeLogger; logScope: string; audioFormat?: MeetingRealtimeAudioFormat; spawn?: MeetingRealtimeAudioSpawn; }): MeetingRealtimeAudioTransport;","entrypoint":"meeting-runtime","exportName":"createLocalMeetingRealtimeAudioTransport","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"0f81bc377d2158b9c8adb6878e454f34c2e57d53bdef9aa34d567d279800c240","declaration":"export function createMeetingBrowserNodeCaller(params: { runtime: PluginRuntime; adapter: NodeAdapter; nodeId: string; }): MeetingBrowserRequestCaller;","entrypoint":"meeting-runtime","exportName":"createMeetingBrowserNodeCaller","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"f244ca8c47f556c9f388953cf9a7581c7d4d413af93e0dfa1462779e6a687a7c","declaration":"export function createMeetingBrowserNodeInvokePolicy(options: MeetingBrowserNodePolicyOptions): OpenClawPluginNodeInvokePolicy;","entrypoint":"meeting-runtime","exportName":"createMeetingBrowserNodeInvokePolicy","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"1aa4e3ff39a2cbe162421c62b1fa4a362973381d4d9ff15c671249b1ebd566bc","declaration":"export function createMeetingNodeHost(options: MeetingNodeHostOptions): { handleCommand(paramsJSON?: string | null): Promise; };","entrypoint":"meeting-runtime","exportName":"createMeetingNodeHost","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"530dc9609f2cb68ae6df05a85237d0c248dea1a528033e7670f3a1715ad80c0d","declaration":"export function createMeetingRealtimeEngineBindings(params: { platform: MeetingPlatformRuntimeMetadata; config: { realtime: { agentId?: string; toolPolicy: RealtimeVoiceAgentConsultToolPolicy; }; }; fullConfig: OpenClawConfig; runtime: PluginRuntime; logger: RuntimeLogger; }): { platform: MeetingRuntimePlatform; consultAgent: (consult: MeetingAgentConsultParams) => Promise<{ text: string; }>; tools: RealtimeVoiceTool[]; handleToolCall: (call: MeetingRealtimeToolCallParams) => Promise; };","entrypoint":"meeting-runtime","exportName":"createMeetingRealtimeEngineBindings","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"c1ae05a3adf32d70779697f7f268b446587dacdd61492fb577b77d964ec3ea49","declaration":"export function createMeetingRealtimeEngineBindings(params: { platform: MeetingPlatformRuntimeMetadata; config: { realtime: { agentId?: string; toolPolicy: RealtimeVoiceAgentConsultToolPolicy; }; }; fullConfig: OpenClawConfig; runtime: PluginRuntime; logger: RuntimeLogger; }): { platform: MeetingRuntimePlatform; consultAgent: (consult: MeetingAgentConsultParams) => Promise<{ text: string; }>; tools: RealtimeVoiceTool[]; handleToolCall: (call: MeetingRealtimeToolCallParams) => Promise; };","entrypoint":"meeting-runtime","exportName":"createMeetingRealtimeEngineBindings","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"9124db05923060c467edb149bd8abdc8be1d00d00f867cf84600972923a58489","declaration":"export function createMeetingSession(params: { platform: MeetingPlatformRuntimeMetadata; config: { realtime: { provider?: string; voiceProvider?: string; transcriptionProvider?: string; model?: string; toolPolicy: TToolPolicy; }; }; resolved: MeetingResolvedJoin; createdAt: string; }): MeetingSessionRecord;","entrypoint":"meeting-runtime","exportName":"createMeetingSession","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"fb276e07e395ab19177b3d7967fd0a8fcda79130883f15092a4a306b826481b9","declaration":"export function createMeetingSetupStatus(checks: MeetingSetupCheck[]): MeetingSetupStatus;","entrypoint":"meeting-runtime","exportName":"createMeetingSetupStatus","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"0457ac9dc4b0b2d11cdbe2070d75ae2e5c2fe5cee69017e92f849849cd06b0f3","declaration":"export function createMeetingVoiceCallGateway(params: { config: MeetingVoiceCallConfig; runtime: PluginRuntime; surface: MeetingVoiceCallSurface; connectClient: (params: { config: MeetingVoiceCallConfig; surface: MeetingVoiceCallSurface; }) => Promise; }): MeetingVoiceCallGateway;","entrypoint":"meeting-runtime","exportName":"createMeetingVoiceCallGateway","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"0dba087ef16e923319f094ae28c112e63cefce9d8b0c570714afcb1f1b1275b0","declaration":"export function createNodeMeetingRealtimeAudioTransport(params: { runtime: PluginRuntime; nodeId: string; bridgeId: string; logger: RuntimeLogger; commandName: string; logScope: string; logPrefix: string; audioFormat?: MeetingRealtimeAudioFormat; }): MeetingRealtimeAudioTransport;","entrypoint":"meeting-runtime","exportName":"createNodeMeetingRealtimeAudioTransport","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"d15a559cde246e88f545db50addd2146b581642726e9a8a2ddecaa21cc332c71","declaration":"export function createNodeMeetingRealtimeAudioTransport(params: { runtime: PluginRuntime; nodeId: string; bridgeId: string; logger: RuntimeLogger; commandName: string; logScope: string; logPrefix: string; audioFormat?: MeetingRealtimeAudioFormat; }): MeetingRealtimeAudioTransport;","entrypoint":"meeting-runtime","exportName":"createNodeMeetingRealtimeAudioTransport","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"c0987b15a391a92d53d3e4e12b61eb122f9547fcf4f45478cdd3c5a8973a3e52","declaration":"export function endMeetingVoiceCallGatewayCall(params: { gateway: MeetingVoiceCallGateway; callId: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"endMeetingVoiceCallGatewayCall","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"b3ebc10fe7ab372e1317eaa8f78621cf277bba1e33fda57acf2254f6759d1e9d","declaration":"export function getMeetingVoiceCallGatewayCall(params: { gateway: MeetingVoiceCallGateway; callId: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"getMeetingVoiceCallGatewayCall","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"aac088df8e80d9ce89c45feccdb04ace3ae4417b3fcdd0f058410ddf25c96b46","declaration":"export function isMeetingVoiceCallMissingError(error: unknown): boolean;","entrypoint":"meeting-runtime","exportName":"isMeetingVoiceCallMissingError","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"21265bba4d70766a4f3ae3e23886ba22814a452ca607f771dee52648789c30ed","declaration":"export function joinMeetingViaVoiceCallGateway(params: { config: MeetingVoiceCallConfig; gateway: MeetingVoiceCallGateway; surface: MeetingVoiceCallSurface; dialInNumber: string; dtmfSequence?: string; logger?: RuntimeLogger; message?: string; requesterSessionKey?: string; agentId?: string; sessionKey?: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"joinMeetingViaVoiceCallGateway","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"5b913b7a7e1d23c37050fd007a9250109b9b787a0aaffd88008e03e5b7f4aae6","declaration":"export function joinMeetingViaVoiceCallGateway(params: { config: MeetingVoiceCallConfig; gateway: MeetingVoiceCallGateway; surface: MeetingVoiceCallSurface; dialInNumber: string; dtmfSequence?: string; logger?: RuntimeLogger; message?: string; requesterSessionKey?: string; agentId?: string; sessionKey?: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"joinMeetingViaVoiceCallGateway","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"bac9621cd025754fbcd4c21409b06eb0503405db81f35cac993aaf0b881ab3e1","declaration":"export function leaveMeetingWithBrowser(params: { adapter: BrowserAdapter; callBrowser: MeetingBrowserRequestCaller; launch: boolean; meetingSessionId?: string; meetingUrl: string; tab: MeetingBrowserTab; timeoutMs: number; }): Promise<{ left: boolean; note: string; }>;","entrypoint":"meeting-runtime","exportName":"leaveMeetingWithBrowser","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"c7b1aeac134b2070d053adf33026d876998b852ccd65cd2c9667119b1a1abee2","declaration":"export function openMeetingWithBrowser, Mode extends string, Health extends MeetingBrowserHealth & { browserTitle?: string; browserUrl?: string; notes?: string[]; }, Transcript extends MeetingTranscriptSnapshot>(params: { adapter: BrowserAdapter; callBrowser: MeetingBrowserRequestCaller; config: MeetingBrowserControllerConfig; session: Session; }): Promise<{ launched: boolean; browser?: Health; tab?: MeetingBrowserTab; }>;","entrypoint":"meeting-runtime","exportName":"openMeetingWithBrowser","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"34858979bd248799c2215d9c7bdd5d4a6b27660c9173bfca2e50dd4373ac27db","declaration":"export function readMeetingBrowserTab(result: unknown): MeetingBrowserCandidateTab | undefined;","entrypoint":"meeting-runtime","exportName":"readMeetingBrowserTab","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} @@ -3218,8 +3218,8 @@ {"closureHash":"a1c367ec2dd927543d490a1393128d475e10c7bd131ffd789c80d88a2d2d0cb2","declaration":"export function resolveMeetingBrowserNodeInfo(params: { runtime: PluginRuntime; adapter: NodeAdapter; requestedNode?: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"resolveMeetingBrowserNodeInfo","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"f21196c9ea8ab90248ffdcdef3e942f1247ee2b9064ddb9757fffe352362c779","declaration":"export function resolveMeetingRealtimeAudioFormat(audioFormat: MeetingRealtimeAudioFormat): RealtimeVoiceAudioFormat;","entrypoint":"meeting-runtime","exportName":"resolveMeetingRealtimeAudioFormat","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"521dc5c262524a709cdd27cdc88e95004073da8223537bcbc73d5d423172dc2b","declaration":"export function speakMeetingViaVoiceCallGateway(params: { gateway: MeetingVoiceCallGateway; callId: string; message: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"speakMeetingViaVoiceCallGateway","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"8247d2d23a97c8e0bae3b6352b4a31b47a2274b185cbee41ed60a738f56f5f28","declaration":"export function startMeetingAgentRealtimeEngine(params: { config: MeetingRealtimeEngineConfig; fullConfig: OpenClawConfig; runtime: PluginRuntime; platform: MeetingRuntimePlatform; meetingSessionId: string; requesterSessionKey?: string; logPrefix?: \"node\"; transport: MeetingRealtimeAudioTransport; logger: RuntimeLogger; providers?: RealtimeTranscriptionProviderPlugin[]; consultAgent: (params: MeetingAgentConsultParams) => Promise<{ text: string; }>; }): Promise;","entrypoint":"meeting-runtime","exportName":"startMeetingAgentRealtimeEngine","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"2feafa6fed9a57a693655e9ce5b22b1270649161fc19fddb6ce60739b25907a3","declaration":"export function startMeetingRealtimeEngine(params: { config: MeetingRealtimeEngineConfig; fullConfig: OpenClawConfig; runtime: PluginRuntime; platform: MeetingRuntimePlatform; meetingSessionId: string; requesterSessionKey?: string; logPrefix?: \"node\"; talkSessionId?: string; talkContext?: { nodeId: string; bridgeId: string; }; transport: MeetingRealtimeAudioTransport; logger: RuntimeLogger; providers?: RealtimeVoiceProviderPlugin[]; consultAgent: (params: MeetingAgentConsultParams) => Promise<{ text: string; }>; tools: RealtimeVoiceTool[]; handleToolCall: (params: MeetingRealtimeToolCallParams) => Promise; }): Promise;","entrypoint":"meeting-runtime","exportName":"startMeetingRealtimeEngine","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"89fa36fac0b12eafa92caa88fda8625141750a29f0351fd4f2b3b14c458c6e2b","declaration":"export function startMeetingAgentRealtimeEngine(params: { config: MeetingRealtimeEngineConfig; fullConfig: OpenClawConfig; runtime: PluginRuntime; platform: MeetingRuntimePlatform; meetingSessionId: string; requesterSessionKey?: string; logPrefix?: \"node\"; transport: MeetingRealtimeAudioTransport; logger: RuntimeLogger; providers?: RealtimeTranscriptionProviderPlugin[]; consultAgent: (params: MeetingAgentConsultParams) => Promise<{ text: string; }>; }): Promise;","entrypoint":"meeting-runtime","exportName":"startMeetingAgentRealtimeEngine","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"cc9193c9bd57a8a86c439adef3ae5875ddec06f5f272b6b7c7c585560eebad09","declaration":"export function startMeetingRealtimeEngine(params: { config: MeetingRealtimeEngineConfig; fullConfig: OpenClawConfig; runtime: PluginRuntime; platform: MeetingRuntimePlatform; meetingSessionId: string; requesterSessionKey?: string; logPrefix?: \"node\"; talkSessionId?: string; talkContext?: { nodeId: string; bridgeId: string; }; transport: MeetingRealtimeAudioTransport; logger: RuntimeLogger; providers?: RealtimeVoiceProviderPlugin[]; consultAgent: (params: MeetingAgentConsultParams) => Promise<{ text: string; }>; tools: RealtimeVoiceTool[]; handleToolCall: (params: MeetingRealtimeToolCallParams) => Promise; }): Promise;","entrypoint":"meeting-runtime","exportName":"startMeetingRealtimeEngine","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"663b9c77231b21af697efd5042e22d1c33e9ee972adeb312ad86d81a2b2e36f7","declaration":"export type MeetingAgentConsultParams = MeetingAgentConsultParams;","entrypoint":"meeting-runtime","exportName":"MeetingAgentConsultParams","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"adf0745c611bf737fc28978d766fc2a25b7104e71b6b2fed4e9b95e519c7b115","declaration":"export type MeetingBrowserCandidateTab = MeetingBrowserCandidateTab;","entrypoint":"meeting-runtime","exportName":"MeetingBrowserCandidateTab","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"59b1526172b7491b85f14f13c1ee26d8d6726f33093770748580c767b1689a17","declaration":"export type MeetingBrowserControllerConfig = MeetingBrowserControllerConfig;","entrypoint":"meeting-runtime","exportName":"MeetingBrowserControllerConfig","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} @@ -3251,7 +3251,7 @@ {"closureHash":"8244b408803f57cf2004157e96f2ce11bb036cdf864123b15ba2fac7f03b5d43","declaration":"export type MeetingSessionRuntimeHandles = MeetingSessionRuntimeHandles;","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntimeHandles","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"aa8054fc2c442891197e89bdad61e79999ea15d813c4b127fb6150607b9e67e7","declaration":"export type MeetingSessionRuntimeJoinContext, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab> = MeetingSessionRuntimeJoinContext;","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntimeJoinContext","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"325241724edd38da439c5df03d225e2a7cb8e56d817e98ed7c37850656d3744b","declaration":"export type MeetingSessionRuntimeMessages = MeetingSessionRuntimeMessages;","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntimeMessages","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} -{"closureHash":"142d8f32b791d627d12239bb78f9830936e29cef0532338be4f02d13522967c4","declaration":"export type MeetingSessionRuntimeOptions, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> = MeetingSessionRuntimeOptions;","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntimeOptions","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} +{"closureHash":"c1464291329d4b78d23a9fbf815b214ad5edb2adb2584e85707167c25e2c45d5","declaration":"export type MeetingSessionRuntimeOptions, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> = MeetingSessionRuntimeOptions;","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntimeOptions","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"d3c730cba02d30512c4cdae6e2367c662982e2c25671833ecd8701283924c642","declaration":"export type MeetingSessionState = MeetingSessionState;","entrypoint":"meeting-runtime","exportName":"MeetingSessionState","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"2496931157bf64fdb16013172ab9c023e60c5f85b98f46a3ee9532ce58d636d6","declaration":"export type MeetingSetupCheck = MeetingSetupCheck;","entrypoint":"meeting-runtime","exportName":"MeetingSetupCheck","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"f0aed6f7955a43fc387d8bbc072cb6276b0f2d18e7f829441a2ad45974bb3831","declaration":"export type MeetingSetupStatus = MeetingSetupStatus;","entrypoint":"meeting-runtime","exportName":"MeetingSetupStatus","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} @@ -3265,9 +3265,9 @@ {"closureHash":"20c70a94483aeddda4d1500cfcc5e71fab844b474ba4061c55d6c8693d40821b","declaration":"export type MeetingVoiceCallJoinResult = MeetingVoiceCallJoinResult;","entrypoint":"meeting-runtime","exportName":"MeetingVoiceCallJoinResult","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"4fb2c5928aa6f809dd4c604d71c5c99cdfe3e98b6e9c1662601c9b4ad9738162","declaration":"export type MeetingVoiceCallStatusResult = MeetingVoiceCallStatusResult;","entrypoint":"meeting-runtime","exportName":"MeetingVoiceCallStatusResult","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} {"closureHash":"5ef812397b6409a4ca228943dd1080661365959477b42e705a9aaa219757d14f","declaration":"export type MeetingVoiceCallSurface = MeetingVoiceCallSurface;","entrypoint":"meeting-runtime","exportName":"MeetingVoiceCallSurface","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"type","recordType":"export"} -{"closureHash":"d43b1c1511b2bac6d9d8cfaf9d22108659134659784bbc084a151dbb5758e145","declaration":"export interface MeetingPlatformAdapter extends MeetingPlatformAdapterContract {\n}","entrypoint":"meeting-runtime","exportName":"MeetingPlatformAdapter","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"interface","recordType":"export"} +{"closureHash":"3bc9c8a87d4f47b40d630bd37d05960f8263c32dd175ecd568aac283a7ff44f7","declaration":"export interface MeetingPlatformAdapter extends MeetingPlatformAdapterContract {\n}","entrypoint":"meeting-runtime","exportName":"MeetingPlatformAdapter","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"interface","recordType":"export"} {"closureHash":"79884bd1df1ea0d07d5ceb4c62d93c1ee744b75d31c94c988845869c0f3cbd2d","declaration":"export interface MeetingRealtimeAudioTransport {\n onFatal(handler: () => void): void;\n startInput(onAudio: (audio: Buffer) => void): void;\n beginOutput?(): void;\n stop(): Promise;\n writeOutput(audio: Buffer): Promise;\n clearOutput(): Promise;\n dispose(): Promise;\n getHealth?(): MeetingRealtimeAudioTransportHealth;\n startBargeInMonitor?(onBargeIn: (audio: Buffer) => boolean): void;\n}","entrypoint":"meeting-runtime","exportName":"MeetingRealtimeAudioTransport","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"interface","recordType":"export"} -{"closureHash":"8891718c76a41f0fc699df055e578a13c0b4a6049ff834bfe02df5831c6e9768","declaration":"export class MeetingSessionRuntime, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> {\n readonly #sessions: Map;\n readonly #sessionLeaves: Map>>;\n readonly #sessionCleanup: MeetingSessionCleanupTracker;\n readonly #meetingLock: MeetingSessionJoinLock;\n readonly #sessionStops: Map Promise>;\n readonly #sessionSpeakers: Map void>;\n readonly #sessionHealth: Map Partial>;\n readonly #durableTranscripts: MeetingSessionDurableTranscripts;\n readonly #transcriptStore: MeetingSessionTranscriptStore;\n constructor(private readonly options: MeetingSessionRuntimeOptions);\n list(): TSession[];\n getSession(sessionId: string): TSession | undefined;\n async status(sessionId?: string): Promise<{\n found: boolean;\n session?: TSession;\n sessions?: TSession[];\n }>;\n async transcript(sessionId: string, options: {\n sinceIndex?: number;\n }): Promise<{ found: boolean; sessionId?: string; startIndex?: number; nextIndex?: number; droppedLines?: number; evicted?: boolean; lines?: MeetingTranscriptLine[]; }>;\n async startTranscriptSource(request: TranscriptStartRequest): Promise;\n async stopTranscriptSource(request: TranscriptStopRequest): Promise;\n isReusableSession(session: TSession, resolved: MeetingResolvedJoin): boolean;\n async join(request: TRequest): Promise<{\n session: TSession;\n spoken?: boolean;\n }>;\n async leave(sessionId: string, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n async speak(sessionId: string, instructions?: string): Promise<{\n found: boolean;\n spoken: boolean;\n session?: TSession;\n }>;\n async speakWhenReady(session: TSession, instructions: string): Promise;\n hasHealthHandle(sessionId: string): boolean;\n refreshHealth(sessionId?: string): void;\n async refreshBrowserHealth(session: TSession, options: {\n force?: boolean;\n readOnly?: boolean;\n }): Promise;\n async refreshCaptionHealth(session: TSession): Promise;\n refreshSpeechReadiness(session: TSession): {\n ready: boolean;\n reason?: TSpeechBlockedReason;\n message?: string;\n };\n markSessionEnded(session: TSession, reason: string): void;\n async #joinUnlocked(request: TRequest, resolved: MeetingResolvedJoin): Promise<{\n session: TSession;\n spoken?: boolean;\n }>;\n async #leaveUnlocked(sessionId: string, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n async #leaveSession(session: TSession, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n #meetingKey(transport: TTransport, url: string): string;\n #inheritBrowserTabOwnership(params: {\n session: TSession;\n transport: TTransport;\n nodeId?: string;\n meetingUrl: string;\n tab?: TTab;\n }): TTab | undefined;\n async #settleRetainedBrowserTabs(retained: Array<{\n session: TSession;\n tab: TTab;\n }>, adopted?: {\n transport: TTransport;\n nodeId?: string;\n tab: TTab;\n }): Promise;\n async #rollbackFailedJoinSession(session: TSession): Promise;\n async #settleRetainedBrowserTabsAfterFailure(retained: Array<{\n session: TSession;\n tab: TTab;\n }>): Promise;\n #attachRuntimeHandles(session: TSession, handles: MeetingSessionRuntimeHandles): void;\n #dropRuntimeHandles(sessionId: string): void;\n #isManagedBrowserSession(session: TSession): boolean;\n #evaluateSpeechReadiness(session: TSession): {\n ready: boolean;\n reason?: TSpeechBlockedReason;\n message?: string;\n };\n #noteSession(session: TSession, note: string): void;\n}","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntime","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"class","recordType":"export"} +{"closureHash":"641b9b525dbf62fbfffa58409e4358e22ad0832b18e8ef5f286908ef7999c028","declaration":"export class MeetingSessionRuntime, TRequest, TTransport extends string, TMode extends string, THealth extends MeetingBrowserHealth, TTab extends MeetingBrowserTab, TManualReason extends string, TSpeechBlockedReason extends string> {\n readonly #sessions: Map;\n readonly #sessionLeaves: Map>>;\n readonly #sessionCleanup: MeetingSessionCleanupTracker;\n readonly #meetingLock: MeetingSessionJoinLock;\n readonly #sessionStops: Map Promise>;\n readonly #sessionSpeakers: Map void>;\n readonly #sessionHealth: Map Partial>;\n readonly #durableTranscripts: MeetingSessionDurableTranscripts;\n readonly #transcriptStore: MeetingSessionTranscriptStore;\n constructor(private readonly options: MeetingSessionRuntimeOptions);\n list(): TSession[];\n getSession(sessionId: string): TSession | undefined;\n async status(sessionId?: string): Promise<{\n found: boolean;\n session?: TSession;\n sessions?: TSession[];\n }>;\n async transcript(sessionId: string, options: {\n sinceIndex?: number;\n }): Promise<{ found: boolean; sessionId?: string; startIndex?: number; nextIndex?: number; droppedLines?: number; evicted?: boolean; lines?: MeetingTranscriptLine[]; }>;\n async startTranscriptSource(request: TranscriptStartRequest): Promise;\n async stopTranscriptSource(request: TranscriptStopRequest): Promise;\n isReusableSession(session: TSession, resolved: MeetingResolvedJoin): boolean;\n async join(request: TRequest): Promise<{\n session: TSession;\n spoken?: boolean;\n }>;\n async leave(sessionId: string, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n async speak(sessionId: string, instructions?: string): Promise<{\n found: boolean;\n spoken: boolean;\n session?: TSession;\n }>;\n async speakWhenReady(session: TSession, instructions: string): Promise;\n hasHealthHandle(sessionId: string): boolean;\n refreshHealth(sessionId?: string): void;\n async refreshBrowserHealth(session: TSession, options: {\n force?: boolean;\n readOnly?: boolean;\n }): Promise;\n async refreshCaptionHealth(session: TSession): Promise;\n refreshSpeechReadiness(session: TSession): {\n ready: boolean;\n reason?: TSpeechBlockedReason;\n message?: string;\n };\n markSessionEnded(session: TSession, reason: string): void;\n async #joinUnlocked(request: TRequest, resolved: MeetingResolvedJoin): Promise<{\n session: TSession;\n spoken?: boolean;\n }>;\n async #leaveUnlocked(sessionId: string, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n async #leaveSession(session: TSession, options?: {\n keepBrowserTab?: boolean;\n }): Promise>;\n #meetingKey(transport: TTransport, url: string): string;\n #inheritBrowserTabOwnership(params: {\n session: TSession;\n transport: TTransport;\n nodeId?: string;\n meetingUrl: string;\n tab?: TTab;\n }): TTab | undefined;\n async #settleRetainedBrowserTabs(retained: Array<{\n session: TSession;\n tab: TTab;\n }>, adopted?: {\n transport: TTransport;\n nodeId?: string;\n tab: TTab;\n }): Promise;\n async #rollbackFailedJoinSession(session: TSession): Promise;\n async #settleRetainedBrowserTabsAfterFailure(retained: Array<{\n session: TSession;\n tab: TTab;\n }>): Promise;\n #attachRuntimeHandles(session: TSession, handles: MeetingSessionRuntimeHandles): void;\n #dropRuntimeHandles(sessionId: string): void;\n #isManagedBrowserSession(session: TSession): boolean;\n #evaluateSpeechReadiness(session: TSession): {\n ready: boolean;\n reason?: TSpeechBlockedReason;\n message?: string;\n };\n #noteSession(session: TSession, note: string): void;\n}","entrypoint":"meeting-runtime","exportName":"MeetingSessionRuntime","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"class","recordType":"export"} {"category":null,"entrypoint":"memory-core-host-engine-foundation","importSpecifier":"openclaw/plugin-sdk/memory-core-host-engine-foundation","recordType":"module"} {"closureHash":"e2df8d235401aebf58eb71652fbeaedb42ca00aaa5042a76909ff2c48ba6fd54","declaration":"export function createSubsystemLogger(subsystem: string): SubsystemLogger;","entrypoint":"memory-core-host-engine-foundation","exportName":"createSubsystemLogger","importSpecifier":"openclaw/plugin-sdk/memory-core-host-engine-foundation","kind":"function","recordType":"export"} {"closureHash":null,"declaration":"export function isPathInside(root: string, target: string): boolean;","entrypoint":"memory-core-host-engine-foundation","exportName":"isPathInside","importSpecifier":"openclaw/plugin-sdk/memory-core-host-engine-foundation","kind":"function","recordType":"export"} @@ -3403,9 +3403,9 @@ {"category":"core","entrypoint":"plugin-entry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","recordType":"module"} {"closureHash":"3d27406644141af2733cfca6e8c1240fc62327910109f585ce9073cafd7fd89c","declaration":"export function buildJsonPluginConfigSchema(schema: JsonSchemaObject, options?: BuildJsonPluginConfigSchemaOptions): OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"buildJsonPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export"} {"closureHash":"aff66c792d532642afb9c6e5a03c8d220f219250c3a8b49733f32058f22f98ca","declaration":"export function buildPluginConfigSchema(schema: ZodTypeAny, options?: BuildPluginConfigSchemaOptions): OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"buildPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export"} -{"closureHash":"b7e031e4d95cb97a29f246179c1f24d0800afed2c3c2e9a95d17c0aa69c5ed10","declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, reload, nodeHostCommands, securityAuditCollectors, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"plugin-entry","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export"} +{"closureHash":"e9633b4ca148dc6289c61a1d85b0e34cb244d926badbf4a591302267c691e62a","declaration":"export function definePluginEntry({ id, name, description, kind, configSchema, reload, nodeHostCommands, securityAuditCollectors, register, }: DefinePluginEntryOptions): DefinedPluginEntry;","entrypoint":"plugin-entry","exportName":"definePluginEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export"} {"closureHash":"0ef1dfa3b5deeb456480e292c0e835c3cd6d13e7bb7059fc735546507da51594","declaration":"export function emptyPluginConfigSchema(): OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"emptyPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"function","recordType":"export"} -{"closureHash":"a258a6b4c206e4c8ffffa152bbe499da5e54e3dc5e3880556fb29a887abef00c","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"plugin-entry","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"89d1232faa739ea7bb8b305d5e92ff1057759b833cd9994ef0923634234741e7","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"plugin-entry","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"d2ff4de9ee3fd111c2cc64a3ee7e557d9f161af1b6b437ee7886bcb16e426317","declaration":"export type AgentPromptGuidance = AgentPromptGuidance;","entrypoint":"plugin-entry","exportName":"AgentPromptGuidance","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"2841127a90e04467adfea8126cbf03655f44ddb089ad9e0d48833c2beea39cbd","declaration":"export type AgentPromptGuidanceEntry = AgentPromptGuidanceEntry;","entrypoint":"plugin-entry","exportName":"AgentPromptGuidanceEntry","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"aa0412acefe62caff12e5271ead0545504874e824380dc21cfc0566388a05f33","declaration":"export type AgentPromptSurfaceKind = \"openclaw_main\" | \"pi_main\" | \"codex_app_server\" | \"cli_backend\" | \"acp_backend\" | \"subagent\";","entrypoint":"plugin-entry","exportName":"AgentPromptSurfaceKind","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} @@ -3421,10 +3421,10 @@ {"closureHash":"8054ffbe71b91afced900ef8a06f5e368ac10c4f99ffc1c6f538a802856f61c6","declaration":"export type OpenClawConfig = OpenClawConfig;","entrypoint":"plugin-entry","exportName":"OpenClawConfig","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"2f6e368fff73e942044cdf95c7c751b46c741e22ac0d2d4d97f45a3158f758ae","declaration":"export type OpenClawGatewayDiscoveryAdvertiseContext = OpenClawGatewayDiscoveryAdvertiseContext;","entrypoint":"plugin-entry","exportName":"OpenClawGatewayDiscoveryAdvertiseContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"b198058e0065e5c60b729a5bdf568f7e2436a006d8c4a7c63de764c7283f96ba","declaration":"export type OpenClawGatewayDiscoveryService = OpenClawGatewayDiscoveryService;","entrypoint":"plugin-entry","exportName":"OpenClawGatewayDiscoveryService","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-entry","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-entry","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"c968e96cdb5c97e92d26b7b15fb5255531b45a12e7c5c0a2e7e456d31cc6e358","declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"365beb5cee974639c2f35fc7a39088721ca8e9c618442830298b98033e9c768c","declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"plugin-entry","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} -{"closureHash":"fe7b101f5d07e70deb7b77cbb813bf7a063922ad68ad8374693545262221da65","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"9303ba80fdfee2f9fae041231bc7482ae3dffcc8d451f1862aac7fc1c2a8b8f2","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"a7ed83f0924f818b23cecb5a1f3591ff28b9499ccac9667a2b8505c2bc608ea9","declaration":"export type OpenClawPluginGatewayEventScope = OpenClawPluginGatewayEventScope;","entrypoint":"plugin-entry","exportName":"OpenClawPluginGatewayEventScope","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"f81f224d9b837e6353b7a546c5a76b124bcf568fd1f1fd0c6881fda30c53120a","declaration":"export type OpenClawPluginGatewayEvents = OpenClawPluginGatewayEvents;","entrypoint":"plugin-entry","exportName":"OpenClawPluginGatewayEvents","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"7470b211ac4d3449cd0fc353ee2eb48e9fbc2dbc9259d21c680d0203577aa94f","declaration":"export type OpenClawPluginHttpRouteHandler = OpenClawPluginHttpRouteHandler;","entrypoint":"plugin-entry","exportName":"OpenClawPluginHttpRouteHandler","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} @@ -3574,14 +3574,14 @@ {"closureHash":"ad45bb1eb13e99e3217eb7e7e2d29fa456bc1930059dd5e94d7500e05e54c6bc","declaration":"export function executePluginCommand(params: { command: RegisteredPluginCommand; args?: string; senderId?: string; channel: string; channelId?: PluginCommandContext[\"channelId\"]; isAuthorizedSender: boolean; senderIsOwner?: boolean; gatewayClientScopes?: PluginCommandContext[\"gatewayClientScopes\"]; agentId?: string; sessionKey?: PluginCommandContext[\"sessionKey\"]; sessionId?: PluginCommandContext[\"sessionId\"]; sessionTarget?: PluginCommandContext[\"sessionTarget\"]; sessionFile?: PluginCommandContext[\"sessionFile\"]; authProfileId?: string; commandBody: string; config: OpenClawConfig; from?: PluginCommandContext[\"from\"]; to?: PluginCommandContext[\"to\"]; originatingTo?: string; accountId?: PluginCommandContext[\"accountId\"]; messageThreadId?: PluginCommandContext[\"messageThreadId\"]; threadParentId?: PluginCommandContext[\"threadParentId\"]; diagnosticsSessions?: PluginCommandContext[\"diagnosticsSessions\"]; diagnosticsUploadApproved?: PluginCommandContext[\"diagnosticsUploadApproved\"]; diagnosticsPreviewOnly?: PluginCommandContext[\"diagnosticsPreviewOnly\"]; diagnosticsPrivateRouted?: PluginCommandContext[\"diagnosticsPrivateRouted\"]; }): Promise;","entrypoint":"plugin-runtime","exportName":"executePluginCommand","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"7e75fc04d621dc8d12f459d5b5b0c039a39b77c30c2b51af481e123c352f57b8","declaration":"export function getGlobalHookRunner(): HookRunner | null;","entrypoint":"plugin-runtime","exportName":"getGlobalHookRunner","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"db6583607237e4081814e2c5d4f8fb6f216ad3bbfe623bf16fc1a9c09c15f64b","declaration":"export function getPluginCommandSpecs(provider?: string, options?: PluginCommandSpecOptions): Array<{ name: string; description: string; descriptionLocalizations?: Record; acceptsArgs: boolean; }>;","entrypoint":"plugin-runtime","exportName":"getPluginCommandSpecs","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} -{"closureHash":"66783965690864b5d9129f384ce6d7689488071e296c73e61a13998999450fcb","declaration":"export function getPluginRuntimeGatewayRequestScope(): PluginRuntimeGatewayRequestScope | undefined;","entrypoint":"plugin-runtime","exportName":"getPluginRuntimeGatewayRequestScope","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} +{"closureHash":"1b287439685d4de1b6ad946a43783fafa28fb7d66c1c0f71c9dbde0d9eec3698","declaration":"export function getPluginRuntimeGatewayRequestScope(): PluginRuntimeGatewayRequestScope | undefined;","entrypoint":"plugin-runtime","exportName":"getPluginRuntimeGatewayRequestScope","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"cfe277ce6de0c6ed50f1f54b66c889f6c95e91b058e8bcdc27aa37317a93a447","declaration":"export function listRegisteredPluginAgentPromptGuidance(params?: { surface?: AgentPromptSurfaceKind; includeLegacyGlobalGuidance?: boolean; }): string[];","entrypoint":"plugin-runtime","exportName":"listRegisteredPluginAgentPromptGuidance","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"693462c2a5c07646277169ede37b71ed12dc8d56c648b7fed73712900be34dcf","declaration":"export function matchPluginCommand(commandBody: string, options?: { channel?: string; }): { command: RegisteredPluginCommand; args?: string; } | null;","entrypoint":"plugin-runtime","exportName":"matchPluginCommand","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"8d575a525d165780642e70ff1385311c3422429c2e26c479a85baae491d62efe","declaration":"export function registerPluginCommand(pluginId: string, command: OpenClawPluginCommandDefinition, opts?: { pluginName?: string; pluginRoot?: string; allowReservedCommandNames?: boolean; allowOwnerStatusExposure?: boolean; }): CommandRegistrationResult;","entrypoint":"plugin-runtime","exportName":"registerPluginCommand","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"16986e5d431f584c2d5053289eca3d2225bbe47a92cdfbbc2af91b264a165846","declaration":"export function registerPluginInteractiveHandler(pluginId: string, registration: PluginInteractiveHandlerRegistration, opts?: { pluginName?: string; pluginRoot?: string; }): InteractiveRegistrationResult;","entrypoint":"plugin-runtime","exportName":"registerPluginInteractiveHandler","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"f20c07a48e2c949fbc889e7a32760f4e52339d9f6d3eab49e00ff249266e2396","declaration":"export function startLazyPluginServiceModule(params: { skipEnvVar?: string; overrideEnvVar?: string; validateOverrideSpecifier?: (specifier: string) => string; loadDefaultModule: () => Promise; loadOverrideModule?: (specifier: string) => Promise; startExportNames: string[]; stopExportNames?: string[]; }): Promise;","entrypoint":"plugin-runtime","exportName":"startLazyPluginServiceModule","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"bad43ffe69d1d9d6c92c79df4c388b3dda685013a92392daef456f1622ade659","declaration":"export type LazyPluginServiceHandle = LazyPluginServiceHandle;","entrypoint":"plugin-runtime","exportName":"LazyPluginServiceHandle","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} -{"closureHash":"8f41df06718eefabe56b01ab63066fe32d9a21b31e5fcf457ced865028c5bd1d","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-runtime","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} +{"closureHash":"9dc2f147a95856891b1a644b8863a3ae3c45db0c56b28ee7c5954562148cde17","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-runtime","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"closureHash":"365beb5cee974639c2f35fc7a39088721ca8e9c618442830298b98033e9c768c","declaration":"export type OpenClawPluginConfigSchema = OpenClawPluginConfigSchema;","entrypoint":"plugin-runtime","exportName":"OpenClawPluginConfigSchema","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"closureHash":"f06379ada10ce0eca4e66bdf978db2c0035e054a135dc044c6d831ac7797c08f","declaration":"export type PluginConversationBinding = PluginConversationBinding;","entrypoint":"plugin-runtime","exportName":"PluginConversationBinding","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"closureHash":"a1223d674b2b66918a576ae05b04318d7b8cbe9b1d3bc6dd7a08d1a4fa79b291","declaration":"export type PluginConversationBindingRequestParams = PluginConversationBindingRequestParams;","entrypoint":"plugin-runtime","exportName":"PluginConversationBindingRequestParams","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} @@ -3671,10 +3671,10 @@ {"closureHash":"e66adcb55dec79be73a52bc76594b7e9210fd93c69a85b56098fbb58cecbb354","declaration":"export type WriteOAuthCredentialsOptions = WriteOAuthCredentialsOptions;","entrypoint":"provider-auth","exportName":"WriteOAuthCredentialsOptions","importSpecifier":"openclaw/plugin-sdk/provider-auth","kind":"type","recordType":"export"} {"category":null,"entrypoint":"provider-catalog-runtime","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","recordType":"module"} {"closureHash":"b5665596a3f011454a5614681513516acd50b6c749536c43842d811980cf7ad3","declaration":"export function augmentModelCatalogWithProviderPlugins(params: { config?: OpenClawConfig; workspaceDir?: string; env?: NodeJS.ProcessEnv; metadataSnapshot?: PluginMetadataSnapshot; context: ProviderAugmentModelCatalogContext; }): Promise;","entrypoint":"provider-catalog-runtime","exportName":"augmentModelCatalogWithProviderPlugins","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} -{"closureHash":"234d88185b5172d31de57d1e217ef46f193b9405e5472053a93fa05e3e1526b3","declaration":"export function isPluginProvidersLoadInFlight(params: Parameters[0]): boolean;","entrypoint":"provider-catalog-runtime","exportName":"isPluginProvidersLoadInFlight","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} -{"closureHash":"5ec68cf9778d69f02480fb73cc40520257d01242bba0296a44f34c532714df52","declaration":"export function resolveCatalogHookProviderPluginIds(params: { config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; metadataSnapshot?: ProviderManifestLoadParams[\"metadataSnapshot\"]; }): string[];","entrypoint":"provider-catalog-runtime","exportName":"resolveCatalogHookProviderPluginIds","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} -{"closureHash":"971566a9d1e2774a1ad451728ba0146162848621a87557fd8ce161e1920520b0","declaration":"export function resolveOwningPluginIdsForProvider(params: { provider: string; config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; manifestRegistry?: PluginManifestRegistry; metadataSnapshot?: Pick; }): string[] | undefined;","entrypoint":"provider-catalog-runtime","exportName":"resolveOwningPluginIdsForProvider","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} -{"closureHash":"53516b904224cb22a1b9cfe0bd8361e3c6c0def4074f90d72424384c3bec6fbf","declaration":"export function resolvePluginProviders(params: { config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; bundledProviderVitestCompat?: boolean; onlyPluginIds?: string[]; providerRefs?: readonly string[]; modelRefs?: readonly string[]; activate?: boolean; cache?: boolean; applyAutoEnable?: boolean; pluginSdkResolution?: PluginLoadOptions[\"pluginSdkResolution\"]; mode?: \"runtime\" | \"setup\"; includeUntrustedWorkspacePlugins?: boolean; pluginMetadataSnapshot?: PluginMetadataRegistryView; skipIfLoadInFlight?: boolean; }): ProviderPlugin[];","entrypoint":"provider-catalog-runtime","exportName":"resolvePluginProviders","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} +{"closureHash":"d561ea4f471fb702c19f765bb646301a6eb7524149642c1c5e05616fb54e5cdc","declaration":"export function isPluginProvidersLoadInFlight(params: Parameters[0]): boolean;","entrypoint":"provider-catalog-runtime","exportName":"isPluginProvidersLoadInFlight","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} +{"closureHash":"b2a1c23ff9b65dcb5ae03052bbaec7f71d4a156a1e7ba6e5c8ae04e894295771","declaration":"export function resolveCatalogHookProviderPluginIds(params: { config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; metadataSnapshot?: ProviderManifestLoadParams[\"metadataSnapshot\"]; }): string[];","entrypoint":"provider-catalog-runtime","exportName":"resolveCatalogHookProviderPluginIds","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} +{"closureHash":"c759181919675a4c4b158629a51cfab8f40aaba54f8ee64be8a5a063efd3825a","declaration":"export function resolveOwningPluginIdsForProvider(params: { provider: string; config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; manifestRegistry?: PluginManifestRegistry; metadataSnapshot?: Pick; }): string[] | undefined;","entrypoint":"provider-catalog-runtime","exportName":"resolveOwningPluginIdsForProvider","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} +{"closureHash":"ed971738e812ee35a0fb8cdda2972251cd613b40cbcfec6c68c64c7c9a89977c","declaration":"export function resolvePluginProviders(params: { config?: PluginLoadOptions[\"config\"]; workspaceDir?: string; env?: PluginLoadOptions[\"env\"]; bundledProviderVitestCompat?: boolean; onlyPluginIds?: string[]; providerRefs?: readonly string[]; modelRefs?: readonly string[]; activate?: boolean; cache?: boolean; applyAutoEnable?: boolean; pluginSdkResolution?: PluginLoadOptions[\"pluginSdkResolution\"]; mode?: \"runtime\" | \"setup\"; includeUntrustedWorkspacePlugins?: boolean; pluginMetadataSnapshot?: PluginMetadataRegistryView; skipIfLoadInFlight?: boolean; }): ProviderPlugin[];","entrypoint":"provider-catalog-runtime","exportName":"resolvePluginProviders","importSpecifier":"openclaw/plugin-sdk/provider-catalog-runtime","kind":"function","recordType":"export"} {"category":null,"entrypoint":"proxy-capture","importSpecifier":"openclaw/plugin-sdk/proxy-capture","recordType":"module"} {"closureHash":"d0e4e026d736bc00b1758d1089c44c3c5f3a09c7254291584de8cb297365804c","declaration":"export function acquireDebugProxyCaptureStore(dbPath: string, blobDir: string): { store: LegacyDebugProxyCaptureStore; release: () => void; };\nexport function acquireDebugProxyCaptureStore(options?: DebugProxyCaptureStoreOptions): { store: SharedDebugProxyCaptureStore; release: () => void; };","entrypoint":"proxy-capture","exportName":"acquireDebugProxyCaptureStore","importSpecifier":"openclaw/plugin-sdk/proxy-capture","kind":"function","recordType":"export"} {"closureHash":"d41cbb9de51b7aee1c6cf8c713b0bc44f27ac926fbb6422c05726f196d11964e","declaration":"export function captureHttpExchange(params: { url: string; method: string; requestHeaders?: Headers | Record | undefined; requestBody?: BodyInit | Buffer | string | null; response: Response; transport?: \"http\" | \"sse\"; flowId?: string; meta?: Record; }, resolved?: DebugProxySettings, deps?: DebugProxyCaptureRuntimeDeps): void;","entrypoint":"proxy-capture","exportName":"captureHttpExchange","importSpecifier":"openclaw/plugin-sdk/proxy-capture","kind":"function","recordType":"export"} @@ -4636,16 +4636,16 @@ {"closureHash":"e365d7ad911453b5139ba700931b061e560cff80b50d4cbe5e9615b5d7e13a52","declaration":"export type ScopedExpiringIdCache = ScopedExpiringIdCache;","entrypoint":"text-runtime","exportName":"ScopedExpiringIdCache","importSpecifier":"openclaw/plugin-sdk/text-runtime","kind":"type","recordType":"export"} {"closureHash":"af5502c92594c2e9049a4b4994e17c00d3adee3f6d1e68edd818a539c74c8787","declaration":"export interface CodeRegion {\n start: number;\n end: number;\n}","entrypoint":"text-runtime","exportName":"CodeRegion","importSpecifier":"openclaw/plugin-sdk/text-runtime","kind":"interface","recordType":"export"} {"category":null,"entrypoint":"tool-plugin","importSpecifier":"openclaw/plugin-sdk/tool-plugin","recordType":"module"} -{"closureHash":"edd95c5c05e5baaa78632935454b6ce757c245599e0c93e137c0588144e3846f","declaration":"export function defineToolPlugin(definition: DefineToolPluginOptions): DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"defineToolPlugin","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"function","recordType":"export"} +{"closureHash":"9ec5a3e49b3df340966e826f8b460e22a79567fea9c11b358de4d3270501ac9e","declaration":"export function defineToolPlugin(definition: DefineToolPluginOptions): DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"defineToolPlugin","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"function","recordType":"export"} {"closureHash":"36ef907ce20f885b5f3068cbf0475dc442a68da9652579bb5bf8fb83ad34c38b","declaration":"export function getToolPluginMetadata(entry: unknown): ToolPluginMetadata | undefined;","entrypoint":"tool-plugin","exportName":"getToolPluginMetadata","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"function","recordType":"export"} {"closureHash":"bdc58154e36b2625fb3daccca3eab248d981077d04d747f0ad507cb2ff565198","declaration":"export const toolPluginMetadataSymbol: typeof toolPluginMetadataSymbol;","entrypoint":"tool-plugin","exportName":"toolPluginMetadataSymbol","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"const","recordType":"export"} -{"closureHash":"ff94c2f2b685a28a33064e8db93260cf4ffaa72e1b6f5f9db6509968cf5a1a2c","declaration":"export type DefineToolPluginOptions = DefineToolPluginOptions;","entrypoint":"tool-plugin","exportName":"DefineToolPluginOptions","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"118d0cc034979c3d7a57027df0b2868959dedaea75016fbc1c5454aaede1df95","declaration":"export type DefinedToolPluginEntry = DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"DefinedToolPluginEntry","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"8a355fe800b1dd500fe838123458fc3ccfffecf4cd54e566519d9b69fd25cdca","declaration":"export type ToolPluginExecutionContext = ToolPluginExecutionContext;","entrypoint":"tool-plugin","exportName":"ToolPluginExecutionContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"0cef2c929c8bccb2ba5d797f4be43a0fbb58616361c02e24fa81edfc863e7659","declaration":"export type ToolPluginFactoryContext = ToolPluginFactoryContext;","entrypoint":"tool-plugin","exportName":"ToolPluginFactoryContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"0b4ce6957b84279fb94b47176ebec6b77add2f35a18d2173fc8f0d4edb69c215","declaration":"export type DefineToolPluginOptions = DefineToolPluginOptions;","entrypoint":"tool-plugin","exportName":"DefineToolPluginOptions","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"7fa0cb56f407285ecd68a46229a296a5ea4eb23c05beaaa57c8f27f2650a10b9","declaration":"export type DefinedToolPluginEntry = DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"DefinedToolPluginEntry","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"62546d559009261caca328206579908755922bc2f0e5f7af07e20fb763226a8e","declaration":"export type ToolPluginExecutionContext = ToolPluginExecutionContext;","entrypoint":"tool-plugin","exportName":"ToolPluginExecutionContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"ea764b6acc9c66784f615f4eda111d6831df8b7afe51658c589e5dc84fff2057","declaration":"export type ToolPluginFactoryContext = ToolPluginFactoryContext;","entrypoint":"tool-plugin","exportName":"ToolPluginFactoryContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} {"closureHash":"f774bd092f51a31fbb34847213f9583234f585f66918d0af55e81bbbae40463b","declaration":"export type ToolPluginMetadata = ToolPluginMetadata;","entrypoint":"tool-plugin","exportName":"ToolPluginMetadata","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} {"closureHash":"414a89d0c80eaaf682dc25d306e7223c981c6fd25366adb973a106f4268a6a54","declaration":"export type ToolPluginStaticToolMetadata = ToolPluginStaticToolMetadata;","entrypoint":"tool-plugin","exportName":"ToolPluginStaticToolMetadata","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"dd86b52d2ced546c2fb32e703237738c09758fa848cacaf31c8bff8727b93de2","declaration":"export type ToolPluginToolDefinition = ToolPluginToolDefinition;","entrypoint":"tool-plugin","exportName":"ToolPluginToolDefinition","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"4b3f25d036f97031b2b17a813d6e3a250958a085fd4008cf1f21e6bc2ee29bb1","declaration":"export type ToolPluginToolDefinition = ToolPluginToolDefinition;","entrypoint":"tool-plugin","exportName":"ToolPluginToolDefinition","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} {"category":null,"entrypoint":"tool-results","importSpecifier":"openclaw/plugin-sdk/tool-results","recordType":"module"} {"closureHash":"c5b0951c3629834dff78f92317cf1421a6bbc0faf9307be1cabb915055665280","declaration":"export function jsonResult(payload: TDetails): AgentToolResult;","entrypoint":"tool-results","exportName":"jsonResult","importSpecifier":"openclaw/plugin-sdk/tool-results","kind":"function","recordType":"export"} {"closureHash":"b9aefc637a694c74e028e92006004bef18185ed569af48ac43d36b646b0af2f3","declaration":"export function textResult(text: string, details: TDetails): AgentToolResult;","entrypoint":"tool-results","exportName":"textResult","importSpecifier":"openclaw/plugin-sdk/tool-results","kind":"function","recordType":"export"} @@ -4679,9 +4679,9 @@ {"closureHash":"9f9174f1023a8a451232f5d97d1e922b7faa88b76b58cffbfbe246a1488e0ddd","declaration":"export function readJsonWebhookBodyOrReject(params: { req: IncomingMessage; res: ServerResponse; maxBytes?: number; timeoutMs?: number; profile?: WebhookBodyReadProfile; emptyObjectOnEmpty?: boolean; invalidJsonMessage?: string; }): Promise<{ ok: true; value: unknown; } | { ok: false; }>;","entrypoint":"webhook-ingress","exportName":"readJsonWebhookBodyOrReject","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"1bbddd5d1c8297e315275db4d5e1c8748ff09c0be7c37b0cf456db4fc69f8909","declaration":"export function readRequestBodyWithLimit(req: IncomingMessage, options: ReadRequestBodyOptions): Promise;","entrypoint":"webhook-ingress","exportName":"readRequestBodyWithLimit","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"e8a1174cac83ce346a231fd25e82bb5f7618ffb57cdd9af6eaa208411f70646d","declaration":"export function readWebhookBodyOrReject(params: { req: IncomingMessage; res: ServerResponse; maxBytes?: number; timeoutMs?: number; profile?: WebhookBodyReadProfile; invalidBodyMessage?: string; }): Promise<{ ok: true; value: string; } | { ok: false; }>;","entrypoint":"webhook-ingress","exportName":"readWebhookBodyOrReject","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} -{"closureHash":"24c620c669e416d23917d4c7c54cebe7697919fcf4f28beda66c20cadc261fab","declaration":"export function registerPluginHttpRoute(params: { path?: string | null; fallbackPath?: string | null; handler: PluginHttpRouteHandler; auth: PluginHttpRouteRegistration[\"auth\"]; match?: PluginHttpRouteRegistration[\"match\"]; gatewayRuntimeScopeSurface?: PluginHttpRouteRegistration[\"gatewayRuntimeScopeSurface\"]; replaceExisting?: boolean; reuseExistingSameOwner?: boolean; throwOnFailure?: boolean; pluginId?: string; source?: string; accountId?: string; log?: (message: string) => void; registry?: PluginRegistry; }): () => void;","entrypoint":"webhook-ingress","exportName":"registerPluginHttpRoute","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} +{"closureHash":"16f74b7dfedf2874a05eab5305bf87a98e77d4d5e84818f9374b9b5c24031bb0","declaration":"export function registerPluginHttpRoute(params: { path?: string | null; fallbackPath?: string | null; handler: PluginHttpRouteHandler; auth: PluginHttpRouteRegistration[\"auth\"]; match?: PluginHttpRouteRegistration[\"match\"]; gatewayRuntimeScopeSurface?: PluginHttpRouteRegistration[\"gatewayRuntimeScopeSurface\"]; replaceExisting?: boolean; reuseExistingSameOwner?: boolean; throwOnFailure?: boolean; pluginId?: string; source?: string; accountId?: string; log?: (message: string) => void; registry?: PluginRegistry; }): () => void;","entrypoint":"webhook-ingress","exportName":"registerPluginHttpRoute","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"05835f2f66f906f736b82b332a84a9714bc3a6b211890a62d8fc4dbf9258a7d4","declaration":"export function registerWebhookTarget(targetsByPath: Map, target: T, opts?: RegisterWebhookTargetOptions): RegisteredWebhookTarget;","entrypoint":"webhook-ingress","exportName":"registerWebhookTarget","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} -{"closureHash":"1c0691eff7758421711f6d6946ea261b33d6ed520633cb5effb2629fd38a4eb5","declaration":"export function registerWebhookTargetWithPluginRoute(params: { targetsByPath: Map; target: T; route: RegisterWebhookPluginRouteOptions; onLastPathTargetRemoved?: RegisterWebhookTargetOptions[\"onLastPathTargetRemoved\"]; }): RegisteredWebhookTarget;","entrypoint":"webhook-ingress","exportName":"registerWebhookTargetWithPluginRoute","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} +{"closureHash":"c3c217bf6e657834d414a4289eb7b117ab1f8bd105ae1d8e75731d22ab900c9d","declaration":"export function registerWebhookTargetWithPluginRoute(params: { targetsByPath: Map; target: T; route: RegisterWebhookPluginRouteOptions; onLastPathTargetRemoved?: RegisterWebhookTargetOptions[\"onLastPathTargetRemoved\"]; }): RegisteredWebhookTarget;","entrypoint":"webhook-ingress","exportName":"registerWebhookTargetWithPluginRoute","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"ec2f47e9bd7a075a3dd4302ac9e4c0bfe20630445db6735cf803f2d354275841","declaration":"export function requestBodyErrorToText(code: RequestBodyLimitErrorCode): string;","entrypoint":"webhook-ingress","exportName":"requestBodyErrorToText","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"5e1f3b468d56eb0f82104184077fdf4b6bd0c1444aa10b71a65fcaa2ec0298a2","declaration":"export function resolveRequestClientIp(req?: IncomingMessage, trustedProxies?: string[], allowRealIpFallback?: boolean): string | undefined;","entrypoint":"webhook-ingress","exportName":"resolveRequestClientIp","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} {"closureHash":"56c3e9868dfa6ee2a7a128eb02039a16b52696759adadbd3fe0a3bd7a6a07eeb","declaration":"export function resolveSingleWebhookTarget(targets: readonly T[], isMatch: (target: T) => boolean): WebhookTargetMatchResult;","entrypoint":"webhook-ingress","exportName":"resolveSingleWebhookTarget","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"function","recordType":"export"} @@ -4699,7 +4699,7 @@ {"closureHash":"efb74e84339c15d6f607b38d1d477b0504d47d04ae78e77083a1893c756a0b54","declaration":"export const WEBHOOK_RATE_LIMIT_DEFAULTS: Readonly<{ windowMs: 60000; maxRequests: 120; maxTrackedKeys: 4096;}>;","entrypoint":"webhook-ingress","exportName":"WEBHOOK_RATE_LIMIT_DEFAULTS","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"const","recordType":"export"} {"closureHash":"13b28ec9acae43c3bdcd683b9831154f88118dee8142e42b7eebfd59f08c602c","declaration":"export type BoundedCounter = BoundedCounter;","entrypoint":"webhook-ingress","exportName":"BoundedCounter","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} {"closureHash":"9e737ae8c17038ef7becbd2bf1b756cfeaed571e2ded368c0fe3a446ebd1f666","declaration":"export type FixedWindowRateLimiter = FixedWindowRateLimiter;","entrypoint":"webhook-ingress","exportName":"FixedWindowRateLimiter","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} -{"closureHash":"d6154a919b6e879a119d75575154da2e3e0455e94c26f32ecd9a59bd026f6d73","declaration":"export type RegisterWebhookPluginRouteOptions = RegisterWebhookPluginRouteOptions;","entrypoint":"webhook-ingress","exportName":"RegisterWebhookPluginRouteOptions","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} +{"closureHash":"6c4d74ddcfebaa9ed020a15e5076553b08f68c1461af40bb01caca22eed9612a","declaration":"export type RegisterWebhookPluginRouteOptions = RegisterWebhookPluginRouteOptions;","entrypoint":"webhook-ingress","exportName":"RegisterWebhookPluginRouteOptions","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} {"closureHash":"b3e98619854462acfac6538ac9a2d0cefb88704a0eac712563f0996b07364152","declaration":"export type RegisterWebhookTargetOptions = RegisterWebhookTargetOptions;","entrypoint":"webhook-ingress","exportName":"RegisterWebhookTargetOptions","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} {"closureHash":"964c2bfd8f268c411ee7b982c9de02c207f4bec402dd62c9f998a59752bb9d1f","declaration":"export type RegisteredWebhookTarget = RegisteredWebhookTarget;","entrypoint":"webhook-ingress","exportName":"RegisteredWebhookTarget","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} {"closureHash":"aa552e5bdaefc9eb94d3b5a5cdf8c413fad555d9f452c6a2a6af5a3ce695c9d1","declaration":"export type WebhookAnomalyTracker = WebhookAnomalyTracker;","entrypoint":"webhook-ingress","exportName":"WebhookAnomalyTracker","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} diff --git a/packages/ai/src/utils/overflow.test.ts b/packages/ai/src/utils/overflow.test.ts index 3eb1e663327d..67e3db526628 100644 --- a/packages/ai/src/utils/overflow.test.ts +++ b/packages/ai/src/utils/overflow.test.ts @@ -1,6 +1,10 @@ import { describe, expect, it } from "vitest"; import type { AssistantMessage } from "../types.js"; -import { isConfiguredContextSizeOverflowError, isContextOverflow } from "./overflow.js"; +import { + isConfiguredContextSizeOverflowError, + isContextOverflow, + matchesContextOverflowMessage, +} from "./overflow.js"; function errorMessage(message: string): AssistantMessage { return { @@ -64,6 +68,25 @@ describe("provider overflow messages", () => { }); }); +describe("scoped overflow messages", () => { + it("recognizes the provider input-length wording in the strict failover scope", () => { + expect( + matchesContextOverflowMessage( + "input length 14295 tokens exceeds the model limit", + "failover-explicit", + ), + ).toBe(true); + }); + + it.each(["too many tokens per day", "token limit exceeded for your billing plan"])( + "keeps the broad assistant fallback out of strict failover matching: %s", + (message) => { + expect(matchesContextOverflowMessage(message, "assistant-error")).toBe(true); + expect(matchesContextOverflowMessage(message, "failover-explicit")).toBe(false); + }, + ); +}); + describe("bodyless HTTP errors", () => { it("does not treat an ambiguous 400 as context overflow", () => { expect(isContextOverflow(errorMessage("400 status code (no body)"), 262_144)).toBe(false); diff --git a/packages/ai/src/utils/overflow.ts b/packages/ai/src/utils/overflow.ts index 34e9db461c00..4c9f3760087f 100644 --- a/packages/ai/src/utils/overflow.ts +++ b/packages/ai/src/utils/overflow.ts @@ -10,7 +10,7 @@ export function isConfiguredContextSizeOverflowError(errorMessage: string): bool } /** - * Regex patterns to detect context overflow errors from different providers. + * Canonical scoped patterns for context overflow errors from different providers. * * These patterns match error messages returned when the input exceeds * the model's context window. @@ -41,7 +41,7 @@ export function isConfiguredContextSizeOverflowError(errorMessage: string): bool * input filling the context window. * - Ollama: Some deployments truncate silently, others return errors like "prompt too long; exceeded max context length by X tokens" */ -const OVERFLOW_PATTERNS = [ +const ASSISTANT_OVERFLOW_PATTERNS = [ /prompt is too long/i, // Anthropic token overflow /request_too_large/i, // Anthropic request byte-size overflow (HTTP 413) /input is too long for requested model/i, // Amazon Bedrock @@ -70,9 +70,72 @@ const OVERFLOW_PATTERNS = [ /^413\s*(?:status code)?\s*\(no body\)/i, // Cerebras: 413 with no body ]; +const FAILOVER_EXPLICIT_OVERFLOW_PATTERNS = [ + /request_too_large/i, // Anthropic request byte-size overflow + /context_overflow/i, + CONFIGURED_CONTEXT_SIZE_OVERFLOW_RE, // DS4 server + /invalid_argument[\s\S]*maximum number of tokens/i, // Google/Vertex + /request exceeds the maximum size/i, // Anthropic + /context length exceeded/i, + /maximum context length/i, + /prompt is too long/i, + /prompt too long/i, + /exceeds model context window/i, + /model token limit/i, + /input exceeds[\s\S]*maximum number of tokens/i, + /^(?=[\s\S]*context window)(?=[\s\S]*ran out of (?:room|space))/i, // Codex + /request size exceeds[\s\S]*context window/i, + /context overflow:/i, + /exceed context limit/i, + /exceeds the model'?s maximum context/i, + /max_tokens[\s\S]*exceed[\s\S]*context/i, + /input length[\s\S]*exceed[\s\S]*context/i, + /413[\s\S]*too large/i, + /context_window_exceeded/i, + // FIXED(refactor-06): PR 2 removed the embedded-429 false positive; this is provider overflow. + /input length [\d,]+\s+tokens? exceeds the model limit/i, + /上下文过长|上下文超出|上下文长度超|超出最大上下文|请压缩上下文/, +]; + +const PROVIDER_FALLBACK_OVERFLOW_PATTERNS = [ + /\binput token count exceeds the maximum number of input tokens\b/i, // AWS Bedrock + /\binput is too long for this model\b/i, // AWS Bedrock stream errors + /\binput exceeds the maximum number of tokens\b/i, // Google Vertex / Gemini + /\bollama error:\s*context length exceeded(?:,\s*too many tokens)?\b/i, + /\btotal tokens?.*exceeds? (?:the )?(?:model(?:'s)? )?(?:max|maximum|limit)/i, // Cohere + /\b(?:request|prompt) \(\d[\d,]*\s*tokens?\) exceeds (?:the )?available context size\b/i, // llama.cpp + /\binput (?:is )?too long for (?:the )?model\b/i, +]; + +const CONTEXT_OVERFLOW_PATTERN_SCOPES = { + "assistant-error": ASSISTANT_OVERFLOW_PATTERNS, + "failover-explicit": FAILOVER_EXPLICIT_OVERFLOW_PATTERNS, + "provider-fallback": PROVIDER_FALLBACK_OVERFLOW_PATTERNS, + "failover-hint": [ + /context.*overflow|context window.*(too (?:large|long)|exceed|over|limit|max(?:imum)?|requested|sent|tokens)|prompt.*(too (?:large|long)|exceed|over|limit|max(?:imum)?)|(?:request|input).*(?:context|window|length|token).*(too (?:large|long)|exceed|over|limit|max(?:imum)?)/i, + ], + "context-window-too-small": [/context window.*(too small|minimum is)/i], + "tpm-rate-limit-hint": [/\btpm\b|tokens per minute/i], + "rate-limit-hint": [ + /rate limit|too many requests|requests per (?:minute|hour|day)|quota|throttl|429\b|tokens per day/i, + ], +} as const; + +export type ContextOverflowMessageScope = keyof typeof CONTEXT_OVERFLOW_PATTERN_SCOPES; + +/** Match one canonical context-overflow wording scope without applying caller policy. */ +export function matchesContextOverflowMessage( + errorMessage: string, + scope: ContextOverflowMessageScope, +): boolean { + return CONTEXT_OVERFLOW_PATTERN_SCOPES[scope].some((pattern: RegExp) => + pattern.test(errorMessage), + ); +} + /** * Patterns that indicate non-overflow errors (e.g. rate limiting, server errors). - * Error messages matching unknown of these are excluded from overflow detection + * Error messages matching any of these are excluded from overflow detection * even if they also match an OVERFLOW_PATTERN. * * Example: Bedrock formats throttling errors as "ThrottlingException: Too many tokens, @@ -142,7 +205,7 @@ function resolveContextInputTokens(message: AssistantMessage): number | undefine * 1. Send a request that exceeds the model's context window * 2. Check the errorMessage in the response * 3. Create a regex pattern that matches the error - * 4. The pattern should be added to OVERFLOW_PATTERNS in this file, or + * 4. The pattern should be added to the appropriate canonical scope in this file, or * check the errorMessage yourself before calling this function * * @param message - The assistant message to check @@ -156,7 +219,7 @@ export function isContextOverflow(message: AssistantMessage, contextWindow?: num const errorMessage = message.errorMessage; // Skip messages matching known non-overflow patterns (e.g. throttling / rate-limit) const isNonOverflow = NON_OVERFLOW_PATTERNS.some((p) => p.test(errorMessage)); - if (!isNonOverflow && OVERFLOW_PATTERNS.some((p) => p.test(errorMessage))) { + if (!isNonOverflow && matchesContextOverflowMessage(errorMessage, "assistant-error")) { return true; } } diff --git a/src/agents/api-key-rotation.test.ts b/src/agents/api-key-rotation.test.ts index 52f1b38ccf70..336f1f3b0118 100644 --- a/src/agents/api-key-rotation.test.ts +++ b/src/agents/api-key-rotation.test.ts @@ -264,6 +264,26 @@ describe("executeWithApiKeyRotation", () => { expect(sleep).not.toHaveBeenCalled(); }); + it.each(["model gpt-5.5-preview-0429 not found", "429 insufficient_quota"])( + "does not rotate keys for %s", + async (message) => { + const execute = vi.fn(async () => { + throw new Error(message); + }); + + await expect( + executeWithApiKeyRotation({ + provider: "openai", + apiKeys: ["key-1", "key-2"], + execute, + }), + ).rejects.toThrow(message); + + expect(execute).toHaveBeenCalledOnce(); + expect(execute).toHaveBeenCalledWith("key-1"); + }, + ); + it("does not rotate keys for transient 500 after same-key retry exhaustion", async () => { const sleep = vi.fn(async () => undefined); const execute = vi.fn(async () => { diff --git a/src/agents/embedded-agent-runner/compact-reasons.test.ts b/src/agents/embedded-agent-runner/compact-reasons.test.ts index 078192e1c55d..c86607011e45 100644 --- a/src/agents/embedded-agent-runner/compact-reasons.test.ts +++ b/src/agents/embedded-agent-runner/compact-reasons.test.ts @@ -72,6 +72,36 @@ describe("classifyCompactionReason", () => { it("keeps unclassified provider errors in the stable unknown bucket", () => { expect(classifyCompactionReason("No API provider registered for api: ollama")).toBe("unknown"); }); + + it.each([ + ["HTTP 400 invalid request", "provider_error_4xx"], + ["error, status code: 400, message: invalid request", "provider_error_4xx"], + ["Provider API error (429): too many requests", "provider_error_4xx"], + ["OpenAI API error (500): upstream failed", "provider_error_5xx"], + ["503 service unavailable", "provider_error_5xx"], + ])("classifies guarded provider status %s", (reason, expected) => { + expect(classifyCompactionReason(reason)).toBe(expected); + }); + + it.each([402, 404, 408, 413, 501, 521, 524, 529])( + "does not expand the established provider bucket set to HTTP %i", + (status) => { + expect(classifyCompactionReason(`HTTP ${status} provider response`)).toBe("unknown"); + }, + ); + + it.each([ + "request id req-4291 failed", + "input length 14295 tokens exceeds the model limit", + "model model-x-500-preview not found", + ])("ignores embedded status-like numbers: %s", (reason) => { + // FIXED(refactor-06): numeric payload text is not an HTTP status. + expect(classifyCompactionReason(reason)).toBe("unknown"); + }); + + it("preserves timeout precedence over its HTTP status bucket", () => { + expect(classifyCompactionReason("504 Gateway Timeout")).toBe("timeout"); + }); }); describe("isBenignCompactionSkipReason", () => { diff --git a/src/agents/embedded-agent-runner/compact-reasons.ts b/src/agents/embedded-agent-runner/compact-reasons.ts index a0bdca3b0b3e..432dc369a61a 100644 --- a/src/agents/embedded-agent-runner/compact-reasons.ts +++ b/src/agents/embedded-agent-runner/compact-reasons.ts @@ -3,8 +3,11 @@ */ import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; import { sanitizeForLog } from "../../../packages/terminal-core/src/ansi.js"; +import { extractFailoverHttpStatus } from "../failover/retry-evidence.js"; const MAX_COMPACTION_REASON_DETAIL_CHARS = 100; +const COMPACTION_PROVIDER_4XX = new Set([400, 401, 403, 429]); +const COMPACTION_PROVIDER_5XX = new Set([500, 502, 503, 504]); export const DEFERRED_CONTEXT_ENGINE_COMPACTION_REASON = "deferred to background context-engine maintenance"; @@ -60,20 +63,11 @@ export function classifyCompactionReason(reason?: string): string { if (text.includes("timed out") || text.includes("timeout")) { return "timeout"; } - if ( - text.includes("400") || - text.includes("401") || - text.includes("403") || - text.includes("429") - ) { + const status = extractFailoverHttpStatus(reason, { includeLabeledStatus: true }); + if (status !== undefined && COMPACTION_PROVIDER_4XX.has(status)) { return "provider_error_4xx"; } - if ( - text.includes("500") || - text.includes("502") || - text.includes("503") || - text.includes("504") - ) { + if (status !== undefined && COMPACTION_PROVIDER_5XX.has(status)) { return "provider_error_5xx"; } return "unknown"; diff --git a/src/agents/embedded-agent-runner/run.overflow-compaction.harness.ts b/src/agents/embedded-agent-runner/run.overflow-compaction.harness.ts index 4bdba805faa3..582450376efe 100644 --- a/src/agents/embedded-agent-runner/run.overflow-compaction.harness.ts +++ b/src/agents/embedded-agent-runner/run.overflow-compaction.harness.ts @@ -1,7 +1,7 @@ /** * Test harness mocks for embedded-run overflow compaction coverage. */ -import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; +import { matchesContextOverflowMessage } from "@openclaw/ai/internal/runtime"; import { type Mock, vi } from "vitest"; import type { ThinkLevel } from "../../auto-reply/thinking.js"; import type { ContextEngineSessionTarget } from "../../context-engine/types.js"; @@ -20,6 +20,7 @@ import type { } from "../../plugins/types.js"; import { resetCommandQueueStateForTest } from "../../process/command-queue.test-support.js"; import type { AuthProfileStore } from "../auth-profiles/types.js"; +import { extractObservedOverflowTokenCount } from "../embedded-agent-helpers/context-overflow-observation.js"; import type { FailoverReason } from "../failover/signal.js"; import { clearAgentHarnesses, registerAgentHarness } from "../harness/registry.js"; import type { ResolvedProviderAuth } from "../model-auth-runtime-shared.js"; @@ -335,10 +336,7 @@ export const mockedClassifyAssistantFailoverReason = vi.fn( (assistant?: { errorMessage?: string | null }): FailoverReason | null => mockedClassifyFailoverReason(assistant?.errorMessage ?? ""), ); -const mockedExtractObservedOverflowTokenCount = vi.fn((msg?: string) => { - const match = msg?.match(/prompt is too long:\s*([\d,]+)\s+tokens\s*>\s*[\d,]+\s+maximum/i); - return match?.[1] ? Number(match[1].replaceAll(",", "")) : undefined; -}); +const mockedExtractObservedOverflowTokenCount = vi.fn(extractObservedOverflowTokenCount); export const mockedFormatAssistantErrorText = vi.fn(() => ""); const mockedIsAuthAssistantError = vi.fn(() => false); const mockedIsBillingAssistantError = vi.fn(() => false); @@ -348,15 +346,15 @@ const mockedIsFailoverErrorMessage = vi.fn(() => false); const mockedIsGenericUnknownStreamErrorMessage = vi.fn((raw: string) => /^\s*an unknown error occurred\.?\s*$/i.test(raw), ); -export const mockedIsLikelyContextOverflowError = vi.fn((msg?: string) => { - const lower = normalizeLowercaseStringOrEmpty(msg ?? ""); +function matchesCanonicalOverflowFixture(msg?: string): boolean { + const raw = msg ?? ""; return ( - lower.includes("request_too_large") || - lower.includes("context window exceeded") || - (lower.includes("context window") && lower.includes("ran out of room")) || - lower.includes("prompt is too long") + matchesContextOverflowMessage(raw, "failover-explicit") || + matchesContextOverflowMessage(raw, "provider-fallback") || + matchesContextOverflowMessage(raw, "failover-hint") ); -}); +} +export const mockedIsLikelyContextOverflowError = vi.fn(matchesCanonicalOverflowFixture); const mockedParseImageSizeError = vi.fn(() => null); const mockedParseImageDimensionError = vi.fn(() => null); export const mockedIsRateLimitAssistantError = vi.fn(() => false); @@ -574,10 +572,7 @@ function resetRunOverflowCompactionHarnessMocks(): void { mockedIsBillingAssistantError.mockReset(); mockedIsBillingAssistantError.mockReturnValue(false); mockedExtractObservedOverflowTokenCount.mockReset(); - mockedExtractObservedOverflowTokenCount.mockImplementation((msg?: string) => { - const match = msg?.match(/prompt is too long:\s*([\d,]+)\s+tokens\s*>\s*[\d,]+\s+maximum/i); - return match?.[1] ? Number(match[1].replaceAll(",", "")) : undefined; - }); + mockedExtractObservedOverflowTokenCount.mockImplementation(extractObservedOverflowTokenCount); mockedIsCompactionFailureError.mockReset(); mockedIsCompactionFailureError.mockReturnValue(false); mockedIsFailoverAssistantError.mockReset(); @@ -589,15 +584,7 @@ function resetRunOverflowCompactionHarnessMocks(): void { /^\s*an unknown error occurred\.?\s*$/i.test(raw), ); mockedIsLikelyContextOverflowError.mockReset(); - mockedIsLikelyContextOverflowError.mockImplementation((msg?: string) => { - const lower = normalizeLowercaseStringOrEmpty(msg ?? ""); - return ( - lower.includes("request_too_large") || - lower.includes("context window exceeded") || - (lower.includes("context window") && lower.includes("ran out of room")) || - lower.includes("prompt is too long") - ); - }); + mockedIsLikelyContextOverflowError.mockImplementation(matchesCanonicalOverflowFixture); mockedParseImageSizeError.mockReset(); mockedParseImageSizeError.mockReturnValue(null); mockedParseImageDimensionError.mockReset(); @@ -721,15 +708,7 @@ export function resetSharedRunIntegrationHarnessMocks(): void { mockedIsFailoverAssistantError.mockReset(); mockedIsFailoverAssistantError.mockReturnValue(false); mockedIsLikelyContextOverflowError.mockReset(); - mockedIsLikelyContextOverflowError.mockImplementation((msg?: string) => { - const lower = normalizeLowercaseStringOrEmpty(msg ?? ""); - return ( - lower.includes("request_too_large") || - lower.includes("context window exceeded") || - (lower.includes("context window") && lower.includes("ran out of room")) || - lower.includes("prompt is too long") - ); - }); + mockedIsLikelyContextOverflowError.mockImplementation(matchesCanonicalOverflowFixture); mockedIsRateLimitAssistantError.mockReset(); mockedIsRateLimitAssistantError.mockReturnValue(false); mockedResolveAuthProfileOrder.mockReset(); diff --git a/src/agents/embedded-agent-runner/run/assistant-failover.ts b/src/agents/embedded-agent-runner/run/assistant-failover.ts index 96ebfd7fd41f..2da7d02ae01d 100644 --- a/src/agents/embedded-agent-runner/run/assistant-failover.ts +++ b/src/agents/embedded-agent-runner/run/assistant-failover.ts @@ -4,7 +4,6 @@ import { sanitizeForLog } from "../../../../packages/terminal-core/src/ansi.js"; import type { OpenClawConfig } from "../../../config/types.openclaw.js"; import type { AssistantMessage } from "../../../llm/types.js"; -import { classifyRateLimitWindow } from "../../../llm/utils/rate-limit-window.js"; import { projectAgentRunAttemptTerminal, type AgentRunAttemptTerminal, @@ -17,6 +16,7 @@ import { type FailoverReason, } from "../../embedded-agent-helpers.js"; import { FailoverError, resolveFailoverStatus } from "../../failover-error.js"; +import { classifyRateLimitWindow } from "../../failover/retry-evidence.js"; import { mergeRetryFailoverReason, resolveRunFailoverDecision, diff --git a/src/agents/failover/context-overflow.ts b/src/agents/failover/context-overflow.ts index 49b5d7135413..4d33584b3091 100644 --- a/src/agents/failover/context-overflow.ts +++ b/src/agents/failover/context-overflow.ts @@ -1,10 +1,9 @@ -import { isConfiguredContextSizeOverflowError } from "@openclaw/ai/internal/runtime"; +import { matchesContextOverflowMessage } from "@openclaw/ai/internal/runtime"; import { normalizeLowercaseStringOrEmpty } from "@openclaw/normalization-core/string-coerce"; import { isBillingErrorMessage, isRateLimitErrorMessage } from "./message-patterns.js"; import { classifyProviderPluginError, looksLikeProviderContextOverflowCandidate, - matchesLegacyProviderContextOverflow, } from "./provider-patterns.js"; export function isReasoningConstraintErrorMessage(raw: string): boolean { @@ -21,8 +20,7 @@ export function isReasoningConstraintErrorMessage(raw: string): boolean { } function hasRateLimitTpmHint(raw: string): boolean { - const lower = normalizeLowercaseStringOrEmpty(raw); - return /\btpm\b/i.test(lower) || lower.includes("tokens per minute"); + return matchesContextOverflowMessage(raw, "tpm-rate-limit-hint"); } /** Detect explicit context-window overflow without confusing TPM rate limits. */ @@ -30,8 +28,6 @@ export function isContextOverflowErrorFromTables(errorMessage?: string): boolean if (!errorMessage) { return false; } - const lower = normalizeLowercaseStringOrEmpty(errorMessage); - // Groq uses 413 for TPM (tokens per minute) limits, which is a rate limit, not context overflow. if (hasRateLimitTpmHint(errorMessage)) { return false; @@ -41,45 +37,10 @@ export function isContextOverflowErrorFromTables(errorMessage?: string): boolean return false; } - const hasRequestSizeExceeds = lower.includes("request size exceeds"); - const hasContextWindow = - lower.includes("context window") || - lower.includes("context length") || - lower.includes("maximum context length"); - const hasContextWindowOutOfRoom = - hasContextWindow && (lower.includes("ran out of room") || lower.includes("ran out of space")); return ( - lower.includes("request_too_large") || - lower.includes("context_overflow") || - isConfiguredContextSizeOverflowError(errorMessage) || - (lower.includes("invalid_argument") && lower.includes("maximum number of tokens")) || - lower.includes("request exceeds the maximum size") || - lower.includes("context length exceeded") || - lower.includes("maximum context length") || - lower.includes("prompt is too long") || - lower.includes("prompt too long") || - lower.includes("exceeds model context window") || - lower.includes("model token limit") || - (lower.includes("input exceeds") && lower.includes("maximum number of tokens")) || - hasContextWindowOutOfRoom || - (hasRequestSizeExceeds && hasContextWindow) || - lower.includes("context overflow:") || - lower.includes("exceed context limit") || - lower.includes("exceeds the model's maximum context") || - (lower.includes("max_tokens") && lower.includes("exceed") && lower.includes("context")) || - (lower.includes("input length") && lower.includes("exceed") && lower.includes("context")) || - (lower.includes("413") && lower.includes("too large")) || - // Anthropic API and OpenAI-compatible providers (e.g. ZhipuAI/GLM) return this stop reason - // when the context window is exceeded. shared model runtime surfaces it as "Unhandled stop reason: model_context_window_exceeded". - lower.includes("context_window_exceeded") || - // Chinese proxy error messages for context overflow - errorMessage.includes("上下文过长") || - errorMessage.includes("上下文超出") || - errorMessage.includes("上下文长度超") || - errorMessage.includes("超出最大上下文") || - errorMessage.includes("请压缩上下文") || - // Provider-specific patterns (Bedrock, Azure, Ollama, Mistral, Cohere, etc.) - matchesLegacyProviderContextOverflow(errorMessage) + matchesContextOverflowMessage(errorMessage, "failover-explicit") || + (looksLikeProviderContextOverflowCandidate(errorMessage) && + matchesContextOverflowMessage(errorMessage, "provider-fallback")) ); } @@ -88,18 +49,12 @@ export function isContextOverflowError(errorMessage?: string): boolean { return false; } return ( + isContextOverflowErrorFromTables(errorMessage) || (looksLikeProviderContextOverflowCandidate(errorMessage) && - classifyProviderPluginError({ errorMessage }) === "context_overflow") || - isContextOverflowErrorFromTables(errorMessage) + classifyProviderPluginError({ errorMessage }) === "context_overflow") ); } -const CONTEXT_WINDOW_TOO_SMALL_RE = /context window.*(too small|minimum is)/i; -const CONTEXT_OVERFLOW_HINT_RE = - /context.*overflow|context window.*(too (?:large|long)|exceed|over|limit|max(?:imum)?|requested|sent|tokens)|prompt.*(too (?:large|long)|exceed|over|limit|max(?:imum)?)|(?:request|input).*(?:context|window|length|token).*(too (?:large|long)|exceed|over|limit|max(?:imum)?)/i; -const RATE_LIMIT_HINT_RE = - /rate limit|too many requests|requests per (?:minute|hour|day)|quota|throttl|429\b|tokens per day/i; - export function isLikelyContextOverflowError(errorMessage?: string): boolean { if (!errorMessage) { return false; @@ -121,7 +76,7 @@ export function isLikelyContextOverflowError(errorMessage?: string): boolean { return false; } - if (CONTEXT_WINDOW_TOO_SMALL_RE.test(errorMessage)) { + if (matchesContextOverflowMessage(errorMessage, "context-window-too-small")) { return false; } // Rate limit errors can match the broad CONTEXT_OVERFLOW_HINT_RE pattern @@ -136,8 +91,8 @@ export function isLikelyContextOverflowError(errorMessage?: string): boolean { if (normalizeLowercaseStringOrEmpty(errorMessage).includes("prompt template")) { return false; } - if (RATE_LIMIT_HINT_RE.test(errorMessage)) { + if (matchesContextOverflowMessage(errorMessage, "rate-limit-hint")) { return false; } - return CONTEXT_OVERFLOW_HINT_RE.test(errorMessage); + return matchesContextOverflowMessage(errorMessage, "failover-hint"); } diff --git a/src/agents/failover/failover-classification.billing.cases.ts b/src/agents/failover/failover-classification.billing.cases.ts index c655d11e8b08..82d4f14b5dc3 100644 --- a/src/agents/failover/failover-classification.billing.cases.ts +++ b/src/agents/failover/failover-classification.billing.cases.ts @@ -11,6 +11,34 @@ import { } from "./failover-classification.corpus.test-support.js"; export const billingCases = [ // Billing and account entitlement. + { + // FIXED(refactor-06): legacy retry policy recognized this provider limit class as permanent. + id: "retry-go-usage-limit", + source: retrySource, + signal: { message: "GoUsageLimitError: usage is unavailable for this account" }, + expected: reason("billing"), + }, + { + // FIXED(refactor-06): legacy retry policy recognized this provider limit class as permanent. + id: "retry-free-usage-limit", + source: retrySource, + signal: { message: "FreeUsageLimitError: free usage is exhausted" }, + expected: reason("billing"), + }, + { + // FIXED(refactor-06): preserve the retry deny-list's account-balance semantics centrally. + id: "retry-no-available-balance", + source: retrySource, + signal: { message: "Your account has no available balance" }, + expected: reason("billing"), + }, + { + // FIXED(refactor-06): preserve the retry deny-list's provider-budget semantics centrally. + id: "retry-out-of-budget", + source: retrySource, + signal: { message: "Provider account is out of budget" }, + expected: reason("billing"), + }, { id: "billing-anthropic-low-credit", source: billingSource, diff --git a/src/agents/failover/failover-classification.corpus.cases.test-support.ts b/src/agents/failover/failover-classification.corpus.cases.test-support.ts new file mode 100644 index 000000000000..5b9d4991ce00 --- /dev/null +++ b/src/agents/failover/failover-classification.corpus.cases.test-support.ts @@ -0,0 +1,21 @@ +import { authFormatCases } from "./failover-classification.auth-format.cases.js"; +import { billingCases } from "./failover-classification.billing.cases.js"; +import { legacyBillingACases } from "./failover-classification.legacy-billing-a.cases.js"; +import { legacyBillingBCases } from "./failover-classification.legacy-billing-b.cases.js"; +import { legacyProviderMatcherCases } from "./failover-classification.legacy-provider-matchers.cases.js"; +import { overflowServerMiscCases } from "./failover-classification.overflow-server-misc.cases.js"; +import { overflowCases } from "./failover-classification.overflow.cases.js"; +import { rateLimitOverloadCases } from "./failover-classification.rate-limit-overload.cases.js"; +import { structuredMiscCases } from "./failover-classification.structured-misc.cases.js"; + +export const failoverClassificationCorpus = [ + ...overflowCases, + ...billingCases, + ...rateLimitOverloadCases, + ...overflowServerMiscCases, + ...authFormatCases, + ...structuredMiscCases, + ...legacyBillingACases, + ...legacyBillingBCases, + ...legacyProviderMatcherCases, +]; diff --git a/src/agents/failover/failover-classification.corpus.test.ts b/src/agents/failover/failover-classification.corpus.test.ts index 06c1bcc08dcd..d1f3950c94f7 100644 --- a/src/agents/failover/failover-classification.corpus.test.ts +++ b/src/agents/failover/failover-classification.corpus.test.ts @@ -22,15 +22,7 @@ import { isServerErrorMessage, isTimeoutErrorMessage, } from "./classify.js"; -import { authFormatCases } from "./failover-classification.auth-format.cases.js"; -import { billingCases } from "./failover-classification.billing.cases.js"; -import { legacyBillingACases } from "./failover-classification.legacy-billing-a.cases.js"; -import { legacyBillingBCases } from "./failover-classification.legacy-billing-b.cases.js"; -import { legacyProviderMatcherCases } from "./failover-classification.legacy-provider-matchers.cases.js"; -import { overflowServerMiscCases } from "./failover-classification.overflow-server-misc.cases.js"; -import { overflowCases } from "./failover-classification.overflow.cases.js"; -import { rateLimitOverloadCases } from "./failover-classification.rate-limit-overload.cases.js"; -import { structuredMiscCases } from "./failover-classification.structured-misc.cases.js"; +import { failoverClassificationCorpus } from "./failover-classification.corpus.cases.test-support.js"; import { classifyProviderRequestFacets } from "./request-error-facets.js"; import type { FailoverSignal } from "./signal.js"; @@ -38,17 +30,6 @@ afterEach(() => { providerRuntimeMocks.classifyProviderFailoverSignalWithPlugin.mockClear(); }); -const failoverClassificationCorpus = [ - ...overflowCases, - ...billingCases, - ...rateLimitOverloadCases, - ...overflowServerMiscCases, - ...authFormatCases, - ...structuredMiscCases, - ...legacyBillingACases, - ...legacyBillingBCases, - ...legacyProviderMatcherCases, -]; import { renderRateLimitOrOverloadedCopy } from "./user-copy.js"; function classifyReplyRequest(signal: FailoverSignal) { @@ -74,13 +55,10 @@ describe("golden failover classification corpus", () => { }); describe("cross-layer drift (documents current behavior, see refactor-02)", () => { - it.each([ + it("ignores an embedded 429 substring outside a status context", () => { + const message = "request id req-4291 failed"; + // FIXED(refactor-02): was rate_limit, now null - // FOLLOW-UP(refactor-06): reclaim this wording in the canonical overflow table. - "input length 14295 tokens exceeds the model limit", - // FIXED(refactor-02): was rate_limit, now null - "request id req-4291 failed", - ])("ignores an embedded 429 substring outside a status context: %s", (message) => { expect(isRateLimitErrorMessage(message)).toBe(false); expect(classifyFailoverSignal({ message })).toBeNull(); }); diff --git a/src/agents/failover/failover-classification.overflow.cases.ts b/src/agents/failover/failover-classification.overflow.cases.ts index 8d343dfa3581..9cf418cedd71 100644 --- a/src/agents/failover/failover-classification.overflow.cases.ts +++ b/src/agents/failover/failover-classification.overflow.cases.ts @@ -115,6 +115,13 @@ export const overflowCases = [ signal: { message: "input length would exceed context budget for this model" }, expected: contextOverflow, }, + { + // FIXED(refactor-06): PR 2 removed the embedded-429 false positive; the provider wording is overflow. + id: "billing-context-input-length-model-limit", + source: billingSource, + signal: { message: "input length 14295 tokens exceeds the model limit" }, + expected: contextOverflow, + }, { id: "billing-context-stop-reason", source: billingSource, diff --git a/src/agents/failover/failover-classification.rate-limit-overload.cases.ts b/src/agents/failover/failover-classification.rate-limit-overload.cases.ts index 8383d3eebc82..b75d0470f02b 100644 --- a/src/agents/failover/failover-classification.rate-limit-overload.cases.ts +++ b/src/agents/failover/failover-classification.rate-limit-overload.cases.ts @@ -186,7 +186,22 @@ export const rateLimitOverloadCases = [ id: "retry-resource-exhausted-worker", source: retrySource, signal: { message: "ResourceExhausted: Worker local total request limit reached" }, - expected: null, + // FIXED(refactor-06): separator-free provider code now shares the canonical rate-limit path. + expected: reason("rate_limit"), + }, + { + // FIXED(refactor-06): live key rotation already treated the spaced form as rate limiting. + id: "live-auth-resource-exhausted-spaced", + source: "src/agents/live-auth-keys.ts", + signal: { message: "resource exhausted" }, + expected: reason("rate_limit"), + }, + { + // FIXED(refactor-06): preserve the provider-code spelling used by live key rotation. + id: "live-auth-quota-exceeded-code", + source: "src/agents/live-auth-keys.ts", + signal: { message: "quota_exceeded" }, + expected: reason("rate_limit"), }, { id: "retry-resource-exhausted-capacity", diff --git a/src/agents/failover/failover-classification.structured-misc.cases.ts b/src/agents/failover/failover-classification.structured-misc.cases.ts index cd1531901b53..7c7e4945a494 100644 --- a/src/agents/failover/failover-classification.structured-misc.cases.ts +++ b/src/agents/failover/failover-classification.structured-misc.cases.ts @@ -140,6 +140,20 @@ export const structuredMiscCases = [ id: "retry-socket-closed", message: "The socket connection was closed unexpectedly by fetch", }, + { id: "retry-connection-refused", message: "connection refused" }, + { id: "retry-connection-lost", message: "connection lost" }, + { id: "retry-other-side-closed", message: "other side closed" }, + { id: "retry-reset-before-headers", message: "upstream reset before headers" }, + { id: "retry-websocket-closed", message: "WebSocket closed unexpectedly" }, + { id: "retry-websocket-error", message: "WebSocket error" }, + { id: "retry-anthropic-message-stop", message: "stream ended before message_stop" }, + { id: "retry-http2-no-response", message: "HTTP2 request did not get a response" }, + { id: "retry-delay", message: "retry delay 1000ms" }, + { + id: "retry-ended-without-terminal-response", + message: "provider request ended without a terminal response", + }, + { id: "retry-rate-limit-hyphen", message: "rate-limit reached" }, ]), ...messageRows(errorsSource, null, [ { diff --git a/src/agents/failover/failover-retry.expected.test-support.ts b/src/agents/failover/failover-retry.expected.test-support.ts new file mode 100644 index 000000000000..ccd3b5a4fc9f --- /dev/null +++ b/src/agents/failover/failover-retry.expected.test-support.ts @@ -0,0 +1,591 @@ +// Frozen from the pre-refactor-06 assistant retry classifier. +export const failoverRetryExpectations = { + "billing-context-input-length-model-limit": false, + "retry-go-usage-limit": false, + "retry-free-usage-limit": false, + "retry-no-available-balance": false, + "retry-out-of-budget": false, + "live-auth-resource-exhausted-spaced": true, + "live-auth-quota-exceeded-code": false, + "retry-connection-refused": true, + "retry-connection-lost": true, + "retry-other-side-closed": true, + "retry-reset-before-headers": true, + "retry-websocket-closed": true, + "retry-websocket-error": true, + "retry-anthropic-message-stop": true, + "retry-http2-no-response": true, + "retry-delay": true, + "retry-ended-without-terminal-response": true, + "retry-rate-limit-hyphen": true, + "billing-context-request-too-large": false, + "billing-context-maximum-size": false, + "billing-context-length-exceeded": false, + "billing-context-maximum-length": false, + "billing-context-prompt-token-count": false, + "billing-context-compaction-failed": false, + "billing-context-413": false, + "billing-context-anthropic-json": false, + "billing-context-anthropic-400-json": false, + "billing-context-kimi-limit": false, + "billing-context-kimi-status": false, + "billing-context-max-tokens-sum": false, + "billing-context-model-maximum": false, + "billing-context-max-tokens-window": false, + "billing-context-input-budget": false, + "billing-context-stop-reason": false, + "billing-context-chinese-too-long": false, + "billing-context-chinese-compress": false, + "billing-context-404-vertex": false, + "patterns-context-bedrock-validation": false, + "patterns-context-bedrock-token-count": false, + "patterns-context-bedrock-stream": false, + "patterns-context-vertex": false, + "patterns-context-ollama": false, + "patterns-context-mistral": false, + "patterns-context-cohere": false, + "patterns-context-llamacpp-available": false, + "patterns-context-llamacpp-no-the": false, + "patterns-context-llamacpp-prompt": false, + "patterns-context-ds4": false, + "structured-context-raw-invalid-request": false, + "structured-context-typed-invalid-request": false, + "errors-context-codex-prompt-window": false, + "billing-context-model-token-limit-short": false, + "billing-context-window-limit": false, + "billing-context-window-code": false, + "billing-context-chinese-exceeds": false, + "billing-context-chinese-model-max": false, + "billing-context-chinese-maximum": false, + "billing-context-compaction-json": false, + "billing-context-compaction-prompt": false, + "patterns-context-generic-input": false, + "patterns-context-ollama-short": false, + "patterns-context-prompt-token-limit": false, + "billing-anthropic-low-credit": false, + "billing-insufficient-credits": false, + "billing-openrouter-payment-required": false, + "billing-openai-insufficient-quota-json": false, + "billing-together-payment-required": false, + "billing-venice-balance": false, + "billing-more-credits-model": false, + "billing-more-credits-endpoint": false, + "billing-anthropic-extra-usage": false, + "billing-anthropic-extra-usage-required": false, + "billing-anthropic-third-party-extra-usage": false, + "billing-insufficient-balance-code": false, + "billing-mbt-balance": false, + "billing-team-credits-spend": false, + "billing-mbt-flat-json": false, + "billing-poe-points": false, + "billing-proxy-subscription": false, + "billing-upgrade-plan": false, + "billing-chinese-balance": false, + "billing-chinese-account-balance": false, + "billing-chinese-arrears": false, + "matches-zai-1311": false, + "matches-zai-plan-access": false, + "matches-volcengine-subscription": false, + "patterns-xai-spending-limit": false, + "structured-billing-raw-extra-usage": false, + "structured-billing-typed-extra-usage": false, + "structured-billing-openai-details": false, + "http-structured-insufficient-quota": false, + "retry-openai-insufficient-quota": false, + "xai-403-spending-limit": false, + "xai-out-of-credits": false, + "xai-subscription-required": false, + "billing-http-402": false, + "billing-status-402": false, + "billing-error-code-402": false, + "billing-returned-402": false, + "billing-json-status-402": false, + "billing-json-code-402": false, + "billing-json-hard-limit": false, + "billing-plan-billing": false, + "billing-credit-too-low": false, + "billing-plan-limit-exhausted": false, + "billing-periodic-limit-402": false, + "billing-explicit-low-credit-limit": false, + "billing-explicit-credit-org-limit": false, + "billing-api-key-spending-limit": false, + "billing-custom-proxy": false, + "billing-api-error-insufficient": false, + "billing-api-error-payment": false, + "billing-anthropic-extra-usage-json": false, + "billing-anthropic-extra-required-json": false, + "matches-zai-1311-spaced": false, + "matches-volcengine-subscription-lower": false, + "patterns-html-402": false, + "billing-openai-rate-limit": true, + "billing-gemini-resource-exhausted": true, + "billing-groq-too-many-requests": true, + "billing-model-cooldown": false, + "billing-chatgpt-usage-limit": false, + "billing-bedrock-tokens-per-day": false, + "billing-zhipu-periodic-limit": false, + "billing-subscription-quota-refresh": false, + "billing-chinese-too-frequent": false, + "billing-chinese-frequency-limit": false, + "billing-chinese-quota-exhausted": false, + "billing-chinese-top-up": false, + "matches-rate-limit": true, + "matches-zai-1305-429": true, + "patterns-bedrock-throttling": true, + "patterns-bedrock-concurrency": false, + "patterns-concurrency-limit": false, + "patterns-concurrency-limit-breached": false, + "patterns-concurrency-limit-was-reached": false, + "patterns-cloudflare-workers-quota": false, + "patterns-json-rate-limit": true, + "structured-unstructured-rate-limit": false, + "retry-429-temporary": true, + "retry-resource-exhausted-worker": true, + "retry-resource-exhausted-capacity": true, + "retry-daily-limit": false, + "retry-retry-after-hours": false, + "retry-resource-exhausted-quota": true, + "retry-openai-resource-exhausted": true, + "openrouter-stream-rate-limit": true, + "mantle-rate-limit": true, + "mantle-429": true, + "xai-rate-limit-payload": true, + "billing-rate-limit-org-tpd": true, + "billing-rate-limit-too-many": true, + "billing-rate-limit-account": true, + "billing-rate-limit-429-request": true, + "billing-monthly-spend": false, + "billing-weekly-usage": false, + "billing-daily-reset": false, + "billing-org-spend": false, + "billing-workspace-spend": false, + "billing-org-period": false, + "billing-monthly-settings": false, + "billing-http402-rate-limit": true, + "billing-weekly-monthly": false, + "billing-monthly-limit": false, + "billing-daily-limit": false, + "billing-chinese-frequency": false, + "billing-chinese-quota-insufficient": false, + "billing-chinese-credit-exhausted": false, + "retry-monthly-usage-limit": false, + "retry-rate-limit-six-hours": false, + "retry-rate-limit-90-minutes": false, + "retry-429-insufficient-quota-short": false, + "patterns-html-429": true, + "xai-generic-429": true, + "billing-anthropic-overloaded": true, + "billing-together-overloaded": true, + "billing-groq-service-unavailable": true, + "billing-high-demand": false, + "billing-service-capacity": true, + "billing-json-model-overloaded": true, + "billing-529-busy": false, + "billing-chinese-overload": false, + "billing-chinese-high-load": false, + "matches-openai-capacity": false, + "matches-openrouter-high-load": false, + "matches-zhipu-overload-cn": false, + "patterns-bedrock-model-not-ready": false, + "mantle-overloaded": true, + "billing-529-retry": false, + "billing-deadline-exceeded": false, + "billing-no-stream-chunks": true, + "billing-connection-error": true, + "billing-fetch-failed": true, + "billing-econnrefused": true, + "billing-enotfound": false, + "billing-dns-eai-again": false, + "billing-cloudflare-521": false, + "billing-openai-retry-guidance": true, + "billing-shared-runtime-unknown-error": false, + "billing-openrouter-provider-returned": true, + "billing-generic-410": false, + "billing-gemini-malformed-response": false, + "billing-operation-aborted": false, + "billing-stream-aborted": false, + "billing-etimedout": false, + "billing-ehostunreach": false, + "billing-epipe": false, + "billing-provider-network-finish-reason": true, + "billing-undici-socket": true, + "billing-undici-connect-timeout": true, + "billing-request-failed-retries": false, + "billing-google-internal-500": false, + "billing-mini-max-520": false, + "billing-anthropic-unexpected-error": false, + "billing-zhipu-network-1234": false, + "billing-chinese-network-abnormal": false, + "billing-chinese-service-busy": false, + "billing-chinese-system-error": false, + "patterns-cloudflare-html-502": false, + "patterns-cloudflare-html-503": true, + "retry-explicit-retry-guidance": true, + "retry-openai-500": true, + "retry-azure-502": true, + "retry-mistral-503": true, + "retry-provider-504": true, + "http-provider-503": true, + "openrouter-network-finish": true, + "errors-malformed-streaming-fragment": false, + "http-provider-timeout": true, + "billing-status-503": true, + "billing-llm-service-unavailable": true, + "billing-api-error-unavailable": false, + "billing-status-499": false, + "billing-status-500": true, + "billing-status-502": true, + "billing-status-504": true, + "billing-503-database": true, + "billing-stop-abort": false, + "billing-stream-closed": false, + "billing-esockettimedout": false, + "billing-enetunreach": false, + "billing-enetreset": false, + "billing-ehostdown": false, + "billing-zai-network-stop": true, + "billing-provider-abort": false, + "billing-provider-malformed": false, + "billing-undici-terminated": true, + "billing-stream-read-error": false, + "billing-undici-headers-timeout": true, + "billing-undici-body-timeout": true, + "billing-undici-aborted": false, + "billing-undici-content-length": false, + "billing-request-failed": false, + "billing-api-error-internal": true, + "billing-zhipu-network-json": false, + "billing-chinese-connect-timeout": false, + "billing-chinese-request-timeout": false, + "billing-chinese-service-unavailable": false, + "billing-chinese-connection-error": false, + "billing-chinese-internal": false, + "billing-chinese-server": false, + "billing-chinese-server-internal": false, + "billing-chinese-system-busy": false, + "billing-chinese-system-abnormal": false, + "retry-billing-service": true, + "retry-subscription-service": true, + "retry-503-retry-after": true, + "retry-http-500": true, + "retry-503": true, + "retry-524": true, + "patterns-cloudflare-challenge": false, + "patterns-cloudflare-cdn-cgi": false, + "billing-openai-structured-server-error": true, + "billing-provider-finish-error": false, + "matches-provider-finish-error": false, + "openrouter-finish-error": false, + "ollama-incomplete-stream": true, + "patterns-groq-deactivated": false, + "openrouter-missing-model": false, + "retry-mistral-model-not-found": false, + "retry-gpt-preview-not-found": false, + "retry-model-preview-not-found": false, + "billing-session-not-found": false, + "billing-claude-conversation-missing": false, + "billing-no-anthropic-credentials": false, + "billing-no-openai-api-key": false, + "billing-oauth-refresh-failed": false, + "billing-could-not-authenticate-key": false, + "billing-token-account-id": false, + "billing-insufficient-permissions": false, + "billing-missing-scope": false, + "billing-api-key-revoked": false, + "billing-oauth-org-disabled": false, + "billing-chinese-model-denied": false, + "billing-chinese-key-banned": false, + "billing-chinese-ce-011": false, + "billing-chinese-auth-failed": false, + "matches-zai-1113": false, + "matches-google-invalid-key": false, + "matches-google-api-key-invalid-code": false, + "patterns-html-401": false, + "patterns-html-403": false, + "structured-403-quota-without-hook": false, + "structured-403-rate-without-hook": false, + "structured-message-prefix-403": false, + "http-invalid-api-key": false, + "http-invalid-client-secret": false, + "retry-openai-auth": false, + "retry-azure-org-auth": false, + "errors-claude-cli-logged-out": false, + "xai-invalid-api-key": false, + "billing-invalid-api-key-code": false, + "billing-permission-error": false, + "billing-reauthenticate": false, + "billing-validate-credentials": false, + "billing-http401-invalid-key": false, + "billing-http410-authentication": false, + "billing-api-error-invalid-key": false, + "billing-api-error-unauthorized": false, + "billing-api-error-permission": false, + "billing-chinese-no-access": false, + "billing-chinese-authentication": false, + "billing-chinese-key-invalid": false, + "billing-key-disabled": false, + "billing-account-deactivated": false, + "billing-api-error-org-auth": false, + "matches-invalid-api-key-error": false, + "matches-api-key-is-invalid": false, + "matches-api-key-invalid-error-code": false, + "patterns-html-407": false, + "structured-nested-quota-without-hook": false, + "billing-invalid-request-format": false, + "billing-prefill-unsupported": false, + "billing-pattern-string": false, + "matches-harness-provider": false, + "structured-invalid-request-raw": false, + "structured-invalid-request-typed": false, + "structured-invalid-signature": false, + "structured-invalid-signature-carrier": false, + "openrouter-image-input": false, + "bedrock-deprecated-temperature": false, + "billing-context-reasoning-required": false, + "errors-invalid-request-json-syntax": false, + "http-quota-normalized": false, + "http-legacy-bad-request-normalized": false, + "billing-image-dimension": false, + "billing-image-size": false, + "billing-malformed-function-call": false, + "billing-bare-400": false, + "matches-google-invalid-argument": false, + "patterns-bedrock-generic-model-not-ready": false, + "structured-rate-limit-type-without-hook": false, + "structured-api-error-type-without-hook": false, + "structured-non-owner-server-code": false, + "structured-non-owner-insufficient-quota": false, + "http-bad-request": false, + "retry-openai-model-id-400": false, + "ollama-malformed-tool-arguments": false, + "xai-forbidden-generic": false, + "billing-context-compaction-auto": false, + "billing-context-compaction-window": false, + "billing-context-model-window-request": false, + "billing-context-window-requested": false, + "billing-context-prompt-large": false, + "retry-system-unexpected": true, + "retry-temporary-provider": true, + "retry-socket-closed": true, + "errors-json-parse-position": false, + "http-provider-catalog-malformed": false, + "http-provider-json-malformed": false, + "retry-image-dimensions": false, + "retry-image-width": false, + "structured-openai-internal-non-owner": false, + "structured-openai-deadline-non-owner": false, + "structured-anthropic-unavailable-non-owner": false, + "structured-google-api-error-non-owner": false, + "structured-google-rate-limit-error-non-owner": false, + "structured-generic-sdk-type": false, + "anthropic-rate-limit-error-type-core-fallback": false, + "anthropic-api-error-type-core-fallback": false, + "anthropic-rate-limit-code-core-fallback": false, + "anthropic-api-error-code-core-fallback": false, + "openai-server-code-core-fallback": false, + "openai-insufficient-quota-code-core-fallback": false, + "google-unavailable-code-core-fallback": false, + "google-deadline-code-core-fallback": false, + "google-internal-code-core-fallback": false, + "anthropic-claude-cli-rate-limit-type-core-fallback": false, + "anthropic-claude-cli-api-error-type-core-fallback": false, + "anthropic-rate-limit-type-api-code-core-fallback": false, + "anthropic-insufficient-quota-code-core-fallback": false, + "azure-openai-server-code-core-fallback": false, + "azure-openai-insufficient-quota-code-core-fallback": false, + "azure-openai-responses-server-code-core-fallback": false, + "azure-openai-responses-insufficient-quota-code-core-fallback": false, + "openai-api-error-code-core-fallback": false, + "google-gemini-cli-unavailable-core-fallback": false, + "google-insufficient-quota-core-fallback": false, + "ollama-cloud-incomplete-stream": true, + "legacy-billing-a-001": false, + "legacy-billing-a-002": false, + "legacy-billing-a-003": false, + "legacy-billing-a-004": true, + "legacy-billing-a-005": false, + "legacy-billing-a-006": false, + "legacy-billing-a-007": false, + "legacy-billing-a-008": false, + "legacy-billing-a-009": false, + "legacy-billing-a-010": false, + "legacy-billing-a-011": true, + "legacy-billing-a-012": false, + "legacy-billing-a-013": false, + "legacy-billing-a-014": false, + "legacy-billing-a-015": false, + "legacy-billing-a-016": false, + "legacy-billing-a-017": false, + "legacy-billing-a-018": false, + "legacy-billing-a-019": false, + "legacy-billing-a-020": false, + "legacy-billing-a-021": false, + "legacy-billing-a-022": true, + "legacy-billing-a-023": false, + "legacy-billing-a-024": false, + "legacy-billing-a-025": false, + "legacy-billing-a-026": false, + "legacy-billing-a-027": false, + "legacy-billing-a-028": false, + "legacy-billing-a-029": false, + "legacy-billing-a-030": false, + "legacy-billing-a-031": false, + "legacy-billing-a-032": false, + "legacy-billing-a-033": false, + "legacy-billing-a-034": false, + "legacy-billing-a-035": false, + "legacy-billing-a-036": false, + "legacy-billing-a-037": false, + "legacy-billing-a-038": false, + "legacy-billing-a-039": false, + "legacy-billing-a-040": false, + "legacy-billing-a-041": false, + "legacy-billing-a-042": false, + "legacy-billing-a-043": false, + "legacy-billing-a-044": false, + "legacy-billing-a-045": false, + "legacy-billing-a-046": false, + "legacy-billing-a-047": false, + "legacy-billing-a-048": false, + "legacy-billing-a-049": false, + "legacy-billing-a-050": true, + "legacy-billing-a-051": false, + "legacy-billing-a-052": false, + "legacy-billing-a-053": false, + "legacy-billing-a-054": false, + "legacy-billing-a-055": true, + "legacy-billing-a-056": false, + "legacy-billing-a-057": false, + "legacy-billing-a-058": false, + "legacy-billing-a-059": true, + "legacy-billing-a-060": true, + "legacy-billing-a-061": false, + "legacy-billing-a-062": false, + "legacy-billing-a-063": false, + "legacy-billing-a-064": false, + "legacy-billing-a-065": true, + "legacy-billing-a-066": false, + "legacy-billing-a-067": false, + "legacy-billing-a-068": false, + "legacy-billing-a-069": false, + "legacy-billing-a-070": false, + "legacy-billing-a-071": false, + "legacy-billing-a-072": false, + "legacy-billing-a-073": false, + "legacy-billing-a-074": false, + "legacy-billing-a-075": false, + "legacy-billing-a-076": false, + "legacy-billing-a-077": false, + "legacy-billing-a-078": false, + "legacy-billing-a-079": false, + "legacy-billing-a-080": false, + "legacy-billing-a-081": false, + "legacy-billing-a-082": true, + "legacy-billing-a-083": false, + "legacy-billing-b-001": false, + "legacy-billing-b-002": false, + "legacy-billing-b-003": false, + "legacy-billing-b-004": false, + "legacy-billing-b-005": false, + "legacy-billing-b-006": true, + "legacy-billing-b-007": false, + "legacy-billing-b-008": true, + "legacy-billing-b-009": true, + "legacy-billing-b-010": true, + "legacy-billing-b-011": true, + "legacy-billing-b-012": false, + "legacy-billing-b-013": false, + "legacy-billing-b-014": false, + "legacy-billing-b-015": false, + "legacy-billing-b-016": false, + "legacy-billing-b-017": false, + "legacy-billing-b-018": false, + "legacy-billing-b-019": false, + "legacy-billing-b-020": false, + "legacy-billing-b-021": false, + "legacy-billing-b-022": false, + "legacy-billing-b-023": false, + "legacy-billing-b-024": false, + "legacy-billing-b-025": false, + "legacy-billing-b-026": false, + "legacy-billing-b-027": false, + "legacy-billing-b-028": true, + "legacy-billing-b-029": false, + "legacy-billing-b-030": false, + "legacy-billing-b-031": false, + "legacy-billing-b-032": false, + "legacy-billing-b-033": false, + "legacy-billing-b-034": true, + "legacy-billing-b-035": true, + "legacy-billing-b-036": true, + "legacy-billing-b-037": false, + "legacy-billing-b-038": false, + "legacy-billing-b-039": true, + "legacy-billing-b-040": false, + "legacy-billing-b-041": false, + "legacy-billing-b-042": false, + "legacy-billing-b-043": false, + "legacy-billing-b-044": true, + "legacy-billing-b-045": false, + "legacy-billing-b-046": false, + "legacy-billing-b-047": false, + "legacy-billing-b-048": false, + "legacy-billing-b-049": false, + "legacy-billing-b-050": false, + "legacy-billing-b-051": false, + "legacy-billing-b-052": true, + "legacy-billing-b-053": false, + "legacy-billing-b-054": false, + "legacy-billing-b-055": false, + "legacy-billing-b-056": true, + "legacy-billing-b-057": false, + "legacy-billing-b-058": false, + "legacy-billing-b-059": false, + "legacy-billing-b-060": false, + "legacy-billing-b-061": true, + "legacy-billing-b-062": false, + "legacy-billing-b-063": false, + "legacy-billing-b-064": false, + "legacy-billing-b-065": false, + "legacy-billing-b-066": false, + "legacy-billing-b-067": false, + "legacy-billing-b-068": false, + "legacy-billing-b-069": false, + "legacy-billing-b-070": false, + "legacy-billing-b-071": false, + "legacy-billing-b-072": false, + "legacy-billing-b-073": false, + "legacy-billing-b-074": false, + "legacy-billing-b-075": false, + "legacy-billing-b-076": false, + "legacy-billing-b-077": false, + "legacy-billing-b-078": false, + "legacy-billing-b-079": false, + "legacy-billing-b-080": false, + "legacy-billing-b-081": false, + "legacy-billing-b-082": false, + "legacy-provider-matchers-001": false, + "legacy-provider-matchers-002": false, + "legacy-provider-matchers-003": false, + "legacy-provider-matchers-004": false, + "legacy-provider-matchers-005": false, + "legacy-provider-matchers-006": true, + "legacy-provider-matchers-007": true, + "legacy-provider-matchers-008": false, + "legacy-provider-matchers-009": false, + "legacy-provider-matchers-010": false, + "legacy-provider-matchers-011": true, + "legacy-provider-matchers-012": true, + "legacy-provider-matchers-013": false, + "legacy-provider-matchers-014": false, + "legacy-provider-matchers-015": true, + "legacy-provider-matchers-016": false, + "legacy-provider-matchers-017": false, + "legacy-provider-matchers-018": false, + "legacy-provider-matchers-019": false, + "legacy-provider-matchers-020": false, + "legacy-provider-matchers-021": false, + "legacy-provider-matchers-022": false, + "legacy-provider-matchers-023": false, + "legacy-provider-matchers-024": true, +} as const; diff --git a/src/agents/failover/message-patterns.ts b/src/agents/failover/message-patterns.ts index d92c3bfdbcee..25e73df1a158 100644 --- a/src/agents/failover/message-patterns.ts +++ b/src/agents/failover/message-patterns.ts @@ -85,9 +85,8 @@ const ERROR_PATTERNS = { /\bconcurrency limit\b.*\b(?:breached|reached)\b/i, "model_cooldown", "exceeded your current quota", - "resource has been exhausted", - "quota exceeded", - "resource_exhausted", + /\bresource[_ -]?exhausted\b/i, + /\bquota[_ -]?exceeded\b/i, "usage limit", /\btpm\b/i, "tokens per minute", @@ -213,6 +212,9 @@ const ERROR_PATTERNS = { /used\s+all\s+available\s+credits/i, /(?:monthly\s+)?spend(?:ing)?\s+limit/i, /insufficient[_ ]quota/i, + /\b(?:go|free)usagelimiterror\b/i, + "available balance", + "out of budget", "credit balance", "plans & billing", /insufficient[_ ]balance/i, diff --git a/src/agents/failover/provider-patterns.ts b/src/agents/failover/provider-patterns.ts index 545ccd7210dd..6b1e91c057c2 100644 --- a/src/agents/failover/provider-patterns.ts +++ b/src/agents/failover/provider-patterns.ts @@ -1,3 +1,4 @@ +import { matchesContextOverflowMessage } from "@openclaw/ai/internal/runtime"; import { resolveNodeRequireFromMeta } from "../../logging/node-require.js"; import { isRateLimitErrorMessage } from "./message-patterns.js"; import type { FailoverReason } from "./signal.js"; @@ -7,36 +8,6 @@ type ProviderErrorPattern = { /** The failover reason this pattern maps to. */ reason: FailoverReason; }; -/** - * Provider-specific context overflow patterns not covered by the generic - * `isContextOverflowError()` in errors.ts. Called from `isContextOverflowError()` - * to catch provider-specific wording that the generic regex misses. - */ -const PROVIDER_CONTEXT_OVERFLOW_PATTERNS: readonly RegExp[] = [ - // AWS Bedrock validation / stream errors use provider-specific wording. - /\binput token count exceeds the maximum number of input tokens\b/i, - /\binput is too long for this model\b/i, - - // Google Vertex / Gemini REST surfaces this wording. - /\binput exceeds the maximum number of tokens\b/i, - - // Ollama may append a provider prefix and extra token wording. - /\bollama error:\s*context length exceeded(?:,\s*too many tokens)?\b/i, - - // Cohere does not currently ship a bundled provider hook. - /\btotal tokens?.*exceeds? (?:the )?(?:model(?:'s)? )?(?:max|maximum|limit)/i, - - // llama.cpp HTTP server (often used directly or behind an OpenAI-compatible - // shim) returns "request (N tokens) exceeds the available context size - // (M tokens), try increasing it" when the prompt overshoots a slot's - // ctx-size. Wording is from the upstream slot manager and is stable. - // Example: "400 request (66202 tokens) exceeds the available context size (65536 tokens), try increasing it" - /\b(?:request|prompt) \(\d[\d,]*\s*tokens?\) exceeds (?:the )?available context size\b/i, - - // Generic "input too long" pattern that isn't covered by existing checks - /\binput (?:is )?too long for (?:the )?model\b/i, -]; - /** * Provider-specific patterns that map to specific failover reasons. * These handle cases where the generic message tables produce wrong results @@ -120,13 +91,7 @@ export function matchesProviderContextOverflow(errorMessage: string): boolean { return ( looksLikeProviderContextOverflowCandidate(errorMessage) && (classifyProviderPluginError({ errorMessage }) === "context_overflow" || - matchesLegacyProviderContextOverflow(errorMessage)) - ); -} -export function matchesLegacyProviderContextOverflow(errorMessage: string): boolean { - return ( - looksLikeProviderContextOverflowCandidate(errorMessage) && - PROVIDER_CONTEXT_OVERFLOW_PATTERNS.some((pattern) => pattern.test(errorMessage)) + matchesContextOverflowMessage(errorMessage, "provider-fallback")) ); } export function classifyProviderPluginError( diff --git a/src/agents/failover/retry-evidence.ts b/src/agents/failover/retry-evidence.ts new file mode 100644 index 000000000000..2a1758706624 --- /dev/null +++ b/src/agents/failover/retry-evidence.ts @@ -0,0 +1,141 @@ +import { parseRetryAfterHttpDateMs } from "@openclaw/ai/internal/retry-after"; +import milliseconds from "ms"; +import { + extractErrorHttpStatus, + extractLeadingHttpStatus, + extractProviderWrappedHttpStatus, +} from "../../shared/assistant-error-format.js"; +import type { FailoverClassification, FailoverSignal } from "./signal.js"; + +type RateLimitWindow = + | { kind: "short"; retryAfterSeconds?: number } + | { kind: "long" } + | { kind: "unknown" }; + +const RETRYABLE_HTTP_STATUS_CODES = new Set([429, 500, 502, 503, 504, 524]); +const RATE_LIMIT_RETRY_CONTEXT_RE = + /rate.?limit|too many requests|resource[_ -]?exhausted|daily (?:request|usage) limit|requests? per day|tokens? per day|quota[_ -]?exceeded/i; +const TRANSIENT_RETRY_EVIDENCE_RE = + /overloaded|rate.?limit|too many requests|service.?unavailable|server.?error|internal.?error|provider.?returned.?error|network.?error|connection.?error|connection.?refused|connection.?lost|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|socket connection was closed|timed? out|timeout|terminated|websocket.?closed|websocket.?error|ended without|stream ended before message_stop|http2 request did not get a response|retry delay|you can retry your request|try your request again|please retry your request|resource[_ -]?exhausted/i; +const LONG_WINDOW_RATE_LIMIT_RE = + /\b(?:daily|weekly|monthly|tokens per day|requests per day|usage limit|subscription|insufficient[_ -]?quota|current quota|quota[_ -]?exceeded|(?:go|free)usagelimiterror|available balance|out of budget)\b/i; +const SHORT_RATE_LIMIT_UNIT_RE = + /\b(?:requests per minute|tokens per minute|per-minute|rpm|tpm)\b/i; +const SHORT_WINDOW_RATE_LIMIT_RE = + /\b(?:requests per minute|tokens per minute|per-minute|rpm|tpm|model_cooldown)\b|请求过于频繁|调用频率|频率限制/i; +const RETRY_AFTER_VALUE_RE = /\bretry[- ]after\b\s*:?\s*(?:in\s*)?([^\r\n;]+)/i; +const RETRY_AFTER_NUMBER_RE = /^(\d+(?:\.\d+)?)\s*([a-z]+)?\b/i; +const MAX_SHORT_WINDOW_RETRY_AFTER_SECONDS = 60; + +/** Extract guarded HTTP status evidence for retry and diagnostic consumers. */ +export function extractFailoverHttpStatus( + message: string | undefined, + options?: { includeLabeledStatus?: boolean }, +): number | undefined { + if (!message) { + return undefined; + } + const status = options?.includeLabeledStatus + ? extractErrorHttpStatus(message) + : (extractLeadingHttpStatus(message.trim()) ?? + extractProviderWrappedHttpStatus(message.trim())); + return status?.code; +} + +function resolveRetrySignalStatus(signal: Pick) { + return signal.status ?? extractFailoverHttpStatus(signal.message); +} + +/** Narrow evidence that replaying the same assistant request may succeed within this session. */ +export function hasTransientRetryEvidence( + signal: Pick, +): boolean { + const status = resolveRetrySignalStatus(signal); + return ( + (status !== undefined && RETRYABLE_HTTP_STATUS_CODES.has(status)) || + TRANSIENT_RETRY_EVIDENCE_RE.test(signal.message ?? "") + ); +} + +function hasRateLimitRetryContext(signal: Pick): boolean { + return ( + resolveRetrySignalStatus(signal) === 429 || + RATE_LIMIT_RETRY_CONTEXT_RE.test(signal.message ?? "") + ); +} + +function parseRetryAfterSeconds(valueText: string, nowMs: number): number | undefined { + const secondsMatch = RETRY_AFTER_NUMBER_RE.exec(valueText); + if (secondsMatch?.[1]) { + const value = Number(secondsMatch[1]); + if (!Number.isFinite(value) || value < 0) { + return undefined; + } + const unit = secondsMatch[2]?.toLowerCase(); + if ( + unit && + !/^(?:milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d)$/.test( + unit, + ) + ) { + return undefined; + } + const unitMilliseconds = milliseconds(`1${unit ?? "s"}` as Parameters[0]); + return unitMilliseconds === 1 ? value / 1000 : value * (unitMilliseconds / 1000); + } + const retryAtMs = parseRetryAfterHttpDateMs(valueText, nowMs); + return retryAtMs === undefined ? undefined : Math.max(0, (retryAtMs - nowMs) / 1000); +} + +/** Classify provider rate-limit text without deciding a caller's retry policy. */ +export function classifyRateLimitWindow( + message: string | undefined, + nowMs = Date.now(), +): RateLimitWindow { + const raw = message?.trim(); + if (!raw) { + return { kind: "unknown" }; + } + const hasShortRateLimitUnit = SHORT_RATE_LIMIT_UNIT_RE.test(raw); + const retryAfterValue = RETRY_AFTER_VALUE_RE.exec(raw)?.[1]?.trim(); + const retryAfterSeconds = retryAfterValue + ? parseRetryAfterSeconds(retryAfterValue, nowMs) + : undefined; + + if (retryAfterSeconds !== undefined) { + return retryAfterSeconds > MAX_SHORT_WINDOW_RETRY_AFTER_SECONDS + ? { kind: "long" } + : { kind: "short", retryAfterSeconds }; + } + if (retryAfterValue && !hasShortRateLimitUnit) { + return { kind: "long" }; + } + if (LONG_WINDOW_RATE_LIMIT_RE.test(raw) && !hasShortRateLimitUnit) { + return { kind: "long" }; + } + if (SHORT_WINDOW_RATE_LIMIT_RE.test(raw) || extractLeadingHttpStatus(raw)?.code === 429) { + return { kind: "short" }; + } + return { kind: "unknown" }; +} + +/** Apply the intra-attempt replay policy to one already-classified failover signal. */ +export function shouldRetryFailoverSignal(params: { + classification: FailoverClassification | null; + hasTransientEvidence: boolean; + signal: Pick; +}): boolean { + if (!params.hasTransientEvidence) { + return false; + } + const reason = + params.classification?.kind === "reason" ? params.classification.reason : undefined; + const hasLongLimitWindow = classifyRateLimitWindow(params.signal.message).kind === "long"; + if ( + hasLongLimitWindow && + (reason === "billing" || reason === "rate_limit" || hasRateLimitRetryContext(params.signal)) + ) { + return false; + } + return true; +} diff --git a/src/agents/live-auth-keys.test.ts b/src/agents/live-auth-keys.test.ts index b939da0524d2..36f5c72900eb 100644 --- a/src/agents/live-auth-keys.test.ts +++ b/src/agents/live-auth-keys.test.ts @@ -7,11 +7,12 @@ import { beforeAll, describe, expect, it, vi } from "vitest"; vi.unmock("../secrets/provider-env-vars.js"); let collectProviderApiKeys: typeof import("./live-auth-keys.js").collectProviderApiKeys; +let isApiKeyRateLimitError: typeof import("./live-auth-keys.js").isApiKeyRateLimitError; async function loadModulesForTest(): Promise { vi.resetModules(); vi.doUnmock("../secrets/provider-env-vars.js"); - ({ collectProviderApiKeys } = await import("./live-auth-keys.js")); + ({ collectProviderApiKeys, isApiKeyRateLimitError } = await import("./live-auth-keys.js")); } beforeAll(async () => { @@ -41,3 +42,28 @@ describe("collectProviderApiKeys", () => { ).toEqual(["xai-live-key"]); }); }); + +describe("isApiKeyRateLimitError", () => { + it.each([ + "rate_limit", + "rate limit reached", + "HTTP 429 too many requests", + "quota exceeded", + "quota_exceeded", + "resource exhausted", + "resource_exhausted", + "too many requests", + ])("preserves the intentional key-rotation signal %s", (message) => { + expect(isApiKeyRateLimitError(message)).toBe(true); + }); + + it.each([ + "request id req-4291 failed", + "model gpt-5.5-preview-0429 not found", + "input length 14295 tokens exceeds the model limit", + "429 insufficient_quota", + ])("does not rotate keys for the non-rate-limit signal %s", (message) => { + // FIXED(refactor-06): embedded numbers and billing quota failures are not key-local throttles. + expect(isApiKeyRateLimitError(message)).toBe(false); + }); +}); diff --git a/src/agents/live-auth-keys.ts b/src/agents/live-auth-keys.ts index cc1128d2877f..c2ecacc38fca 100644 --- a/src/agents/live-auth-keys.ts +++ b/src/agents/live-auth-keys.ts @@ -3,12 +3,10 @@ * Reads provider-specific and manifest-declared env names without logging or * exposing secret values, with explicit single-key pins for flaky live lanes. */ -import { - normalizeLowercaseStringOrEmpty, - normalizeOptionalString, -} from "@openclaw/normalization-core/string-coerce"; +import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce"; import { normalizeStringEntries } from "@openclaw/normalization-core/string-normalization"; import { getProviderEnvVars } from "../secrets/provider-env-vars.js"; +import { classifyFailoverSignal } from "./failover/classify.js"; import { normalizeProviderId } from "./model-selection.js"; const KEY_SPLIT_RE = /[\s,;]+/g; @@ -170,24 +168,6 @@ export function collectProviderApiKeys( /** Return whether a provider error message indicates API-key rate limiting. */ export function isApiKeyRateLimitError(message: string): boolean { - const lower = normalizeLowercaseStringOrEmpty(message); - if (lower.includes("rate_limit")) { - return true; - } - if (lower.includes("rate limit")) { - return true; - } - if (lower.includes("429")) { - return true; - } - if (lower.includes("quota exceeded") || lower.includes("quota_exceeded")) { - return true; - } - if (lower.includes("resource exhausted") || lower.includes("resource_exhausted")) { - return true; - } - if (lower.includes("too many requests")) { - return true; - } - return false; + const classification = classifyFailoverSignal({ message }); + return classification?.kind === "reason" && classification.reason === "rate_limit"; } diff --git a/src/agents/live-test-provider-drift.ts b/src/agents/live-test-provider-drift.ts index d32ca6713981..919433faa4f0 100644 --- a/src/agents/live-test-provider-drift.ts +++ b/src/agents/live-test-provider-drift.ts @@ -10,7 +10,6 @@ import { isAuthErrorMessage, isBillingErrorMessage, isOverloadedErrorMessage, - isRateLimitErrorMessage, isServerErrorMessage, isTimeoutErrorMessage, } from "./failover/classify.js"; @@ -81,8 +80,7 @@ function isLiveBillingDrift(error: unknown): boolean { /** Returns whether an error is expected live rate-limit drift. */ function isLiveRateLimitDrift(error: unknown): boolean { - const raw = liveProviderErrorText(error); - return isRateLimitErrorMessage(raw) || isApiKeyRateLimitError(raw); + return isApiKeyRateLimitError(liveProviderErrorText(error)); } /** Returns whether an error is expected live timeout drift. */ diff --git a/src/agents/sessions/agent-session-execution.ts b/src/agents/sessions/agent-session-execution.ts index 4b4331325d7b..7206cd14e060 100644 --- a/src/agents/sessions/agent-session-execution.ts +++ b/src/agents/sessions/agent-session-execution.ts @@ -1,8 +1,8 @@ import { isContextOverflow } from "@openclaw/ai/internal/runtime"; import type { AssistantMessage } from "../../llm/types.js"; -import { classifyRateLimitWindow } from "../../llm/utils/rate-limit-window.js"; import { isRetryableAssistantError } from "../../llm/utils/retry.js"; import { sleep } from "../../utils/sleep.js"; +import { classifyRateLimitWindow } from "../failover/retry-evidence.js"; import { AgentSessionExtensions } from "./agent-session-extensions.js"; import { type BashResult, executeBashWithOperations } from "./bash-executor.js"; import type { BashExecutionMessage } from "./messages.js"; diff --git a/src/agents/test-helpers/embedded-agent-runner-e2e-mocks.ts b/src/agents/test-helpers/embedded-agent-runner-e2e-mocks.ts index 6c7b85955c55..a1ab793c1517 100644 --- a/src/agents/test-helpers/embedded-agent-runner-e2e-mocks.ts +++ b/src/agents/test-helpers/embedded-agent-runner-e2e-mocks.ts @@ -166,6 +166,7 @@ export function installEmbeddedRunnerBaseE2eMocks(options?: { }; }); vi.doMock("../../plugins/provider-hook-runtime.js", () => ({ + attachModelProviderRuntimePluginHandle: (model: unknown) => model, prepareProviderExtraParams: vi.fn(() => undefined), resolveProviderExtraParamsForTransport: vi.fn(() => undefined), resolveProviderRuntimePlugin: vi.fn(() => undefined), diff --git a/src/llm/utils/rate-limit-window.ts b/src/llm/utils/rate-limit-window.ts deleted file mode 100644 index 78ec7957d7d0..000000000000 --- a/src/llm/utils/rate-limit-window.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { parseRetryAfterHttpDateMs } from "@openclaw/ai/internal/retry-after"; -import milliseconds from "ms"; -import { extractLeadingHttpStatus } from "../../shared/assistant-error-format.js"; - -type RateLimitWindow = - | { kind: "short"; retryAfterSeconds?: number } - | { kind: "long" } - | { kind: "unknown" }; - -const LONG_WINDOW_RATE_LIMIT_RE = - /\b(?:daily|weekly|monthly|tokens per day|requests per day|usage limit|subscription|insufficient[_ -]?quota|current quota|quota[_ -]?exceeded|quota exceeded)\b/i; -const SHORT_RATE_LIMIT_UNIT_RE = - /\b(?:requests per minute|tokens per minute|per-minute|rpm|tpm)\b/i; -const SHORT_WINDOW_RATE_LIMIT_RE = - /\b(?:requests per minute|tokens per minute|per-minute|rpm|tpm|model_cooldown)\b|请求过于频繁|调用频率|频率限制/i; -const RETRY_AFTER_VALUE_RE = /\bretry[- ]after\b\s*:?\s*(?:in\s*)?([^\r\n;]+)/i; -const RETRY_AFTER_NUMBER_RE = /^(\d+(?:\.\d+)?)\s*([a-z]+)?\b/i; -const MAX_SHORT_WINDOW_RETRY_AFTER_SECONDS = 60; - -function parseRetryAfterSeconds(valueText: string, nowMs: number): number | undefined { - const secondsMatch = RETRY_AFTER_NUMBER_RE.exec(valueText); - if (secondsMatch?.[1]) { - const value = Number(secondsMatch[1]); - if (!Number.isFinite(value) || value < 0) { - return undefined; - } - const unit = secondsMatch[2]?.toLowerCase(); - if ( - unit && - !/^(?:milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d)$/.test( - unit, - ) - ) { - return undefined; - } - const unitMilliseconds = milliseconds(`1${unit ?? "s"}` as Parameters[0]); - // Preserve division for millisecond inputs; multiplying by 0.001 can change IEEE-754 rounding. - return unitMilliseconds === 1 ? value / 1000 : value * (unitMilliseconds / 1000); - } - const retryAtMs = parseRetryAfterHttpDateMs(valueText, nowMs); - return retryAtMs === undefined ? undefined : Math.max(0, (retryAtMs - nowMs) / 1000); -} - -/** Classifies provider rate-limit text without deciding a caller's retry policy. */ -export function classifyRateLimitWindow( - message: string | undefined, - nowMs = Date.now(), -): RateLimitWindow { - const raw = message?.trim(); - if (!raw) { - return { kind: "unknown" }; - } - const hasShortRateLimitUnit = SHORT_RATE_LIMIT_UNIT_RE.test(raw); - const retryAfterValue = RETRY_AFTER_VALUE_RE.exec(raw)?.[1]?.trim(); - const retryAfterSeconds = retryAfterValue - ? parseRetryAfterSeconds(retryAfterValue, nowMs) - : undefined; - - if (retryAfterSeconds !== undefined) { - if (retryAfterSeconds > MAX_SHORT_WINDOW_RETRY_AFTER_SECONDS) { - return { kind: "long" }; - } - return { kind: "short", retryAfterSeconds }; - } - if (retryAfterValue && !hasShortRateLimitUnit) { - return { kind: "long" }; - } - if (LONG_WINDOW_RATE_LIMIT_RE.test(raw) && !hasShortRateLimitUnit) { - return { kind: "long" }; - } - if (SHORT_WINDOW_RATE_LIMIT_RE.test(raw) || extractLeadingHttpStatus(raw)?.code === 429) { - return { kind: "short" }; - } - return { kind: "unknown" }; -} diff --git a/src/llm/utils/retry.test.ts b/src/llm/utils/retry.test.ts index 6f9a804afd06..d81e1d387549 100644 --- a/src/llm/utils/retry.test.ts +++ b/src/llm/utils/retry.test.ts @@ -1,4 +1,6 @@ import { describe, expect, it, vi } from "vitest"; +import { failoverClassificationCorpus } from "../../agents/failover/failover-classification.corpus.cases.test-support.js"; +import { failoverRetryExpectations } from "../../agents/failover/failover-retry.expected.test-support.js"; import { PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE, type AssistantMessage } from "../types.js"; import { isRetryableAssistantError } from "./retry.js"; @@ -24,6 +26,26 @@ function errorMessage(message: string): AssistantMessage { } describe("isRetryableAssistantError", () => { + it("freezes one retry decision for every failover corpus row", () => { + expect(Object.keys(failoverRetryExpectations).toSorted()).toEqual( + failoverClassificationCorpus.map((row) => row.id).toSorted(), + ); + }); + + it.each(failoverClassificationCorpus)( + "preserves the retry decision for $id [$source]", + ({ id, signal }) => { + const message = signal.message + ? errorMessage(signal.message) + : ({ ...errorMessage(""), errorMessage: undefined } as AssistantMessage); + message.provider = ("provider" in signal ? signal.provider : undefined) ?? "test-provider"; + + expect(isRetryableAssistantError(message)).toBe( + failoverRetryExpectations[id as keyof typeof failoverRetryExpectations], + ); + }, + ); + it("does not retry an ambiguous post-dispatch provider outcome", () => { expect( isRetryableAssistantError({ diff --git a/src/llm/utils/retry.ts b/src/llm/utils/retry.ts index 1b930b646647..9f959ad899f5 100644 --- a/src/llm/utils/retry.ts +++ b/src/llm/utils/retry.ts @@ -1,71 +1,14 @@ +import { classifyFailoverSignal } from "../../agents/failover/classify.js"; import { - extractLeadingHttpStatus, - extractProviderWrappedHttpStatus, -} from "../../shared/assistant-error-format.js"; + extractFailoverHttpStatus, + hasTransientRetryEvidence, + shouldRetryFailoverSignal, +} from "../../agents/failover/retry-evidence.js"; import { PROVIDER_FAILURE_WITH_OUTPUT_ERROR_CODE, PROVIDER_POST_DISPATCH_AMBIGUITY_ERROR_CODE, type AssistantMessage, } from "../types.js"; -import { classifyRateLimitWindow } from "./rate-limit-window.js"; - -function buildProviderErrorPattern(patterns: readonly string[]): RegExp { - return new RegExp(patterns.join("|"), "i"); -} - -const NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN = buildProviderErrorPattern([ - "GoUsageLimitError", - "FreeUsageLimitError", - "Monthly usage limit reached", - "available balance", - "insufficient_quota", - "out of budget", -]); - -const RETRYABLE_HTTP_STATUS_CODES = new Set([429, 500, 502, 503, 504, 524]); -const RATE_LIMIT_CONTEXT_PATTERN = buildProviderErrorPattern([ - "rate.?limit", - "too many requests", - "resource[_ -]?exhausted", - "daily (?:request|usage) limit", - "requests? per day", - "tokens? per day", - "quota[_ -]?exceeded", - "quota exceeded", -]); - -const RETRYABLE_PROVIDER_ERROR_PATTERN = buildProviderErrorPattern([ - "overloaded", - "rate.?limit", - "too many requests", - "service.?unavailable", - "server.?error", - "internal.?error", - "provider.?returned.?error", - "network.?error", - "connection.?error", - "connection.?refused", - "connection.?lost", - "other side closed", - "fetch failed", - "upstream.?connect", - "reset before headers", - "socket hang up", - "socket connection was closed", - "timed? out", - "timeout", - "terminated", - "websocket.?closed", - "websocket.?error", - "ended without", - "stream ended before message_stop", - "http2 request did not get a response", - "retry delay", - "you can retry your request", - "try your request again", - "please retry your request", - "resource[_ -]?exhausted", -]); const REPLAY_UNSAFE_ASSISTANT_ERROR_CODES = new Set([ PROVIDER_FAILURE_WITH_OUTPUT_ERROR_CODE, @@ -89,21 +32,13 @@ export function isRetryableAssistantError(message: AssistantMessage): boolean { return false; } const errorMessage = message.errorMessage.trim(); - if (NON_RETRYABLE_PROVIDER_LIMIT_ERROR_PATTERN.test(errorMessage)) { - return false; - } - const status = - extractLeadingHttpStatus(errorMessage)?.code ?? - extractProviderWrappedHttpStatus(errorMessage)?.code; - if (status && status !== 429 && RETRYABLE_HTTP_STATUS_CODES.has(status)) { - return true; - } - const hasRateLimitContext = status === 429 || RATE_LIMIT_CONTEXT_PATTERN.test(errorMessage); - if (hasRateLimitContext && classifyRateLimitWindow(errorMessage).kind === "long") { - return false; - } - if (status === 429) { - return true; - } - return RETRYABLE_PROVIDER_ERROR_PATTERN.test(errorMessage); + const status = extractFailoverHttpStatus(errorMessage); + const signal = { + message: errorMessage, + provider: message.provider, + ...(status === undefined ? {} : { status }), + }; + const classification = classifyFailoverSignal(signal); + const hasTransientEvidence = hasTransientRetryEvidence(signal); + return shouldRetryFailoverSignal({ classification, hasTransientEvidence, signal }); } diff --git a/src/shared/assistant-error-format.test.ts b/src/shared/assistant-error-format.test.ts index 85d8f76a2e14..6093a3664cad 100644 --- a/src/shared/assistant-error-format.test.ts +++ b/src/shared/assistant-error-format.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import { + extractErrorHttpStatus, extractLeadingHttpStatus, extractProviderWrappedHttpStatus, formatRawAssistantErrorForUi, @@ -58,6 +59,27 @@ describe("extractProviderWrappedHttpStatus", () => { }); }); +describe("extractErrorHttpStatus", () => { + it.each([ + ["HTTP 429 too many requests", 429], + ["OpenAI API error (500): upstream failed", 500], + ["error, status code: 400, message: invalid request", 400], + ["unexpected status 503 from upstream", 503], + ["Error: HTTP status: 504, gateway timeout", 504], + ])("extracts guarded status from %s", (message, code) => { + expect(extractErrorHttpStatus(message)?.code).toBe(code); + }); + + it.each([ + "request id req-4291 failed", + "input length 14295 tokens exceeds the model limit", + "model model-x-500-preview not found", + "Image width 500 exceeds the maximum allowed size", + ])("rejects embedded numeric text: %s", (message) => { + expect(extractErrorHttpStatus(message)).toBeNull(); + }); +}); + describe("HTTP status consumers", () => { it("formats only status lines inside the HTTP range", () => { expect(formatRawAssistantErrorForUi("100 Continue")).toBe("HTTP 100: Continue"); diff --git a/src/shared/assistant-error-format.ts b/src/shared/assistant-error-format.ts index 5ed7532a8626..dd1deae82379 100644 --- a/src/shared/assistant-error-format.ts +++ b/src/shared/assistant-error-format.ts @@ -16,6 +16,9 @@ const HTTP_STATUS_CODE_PREFIX_RE = new RegExp( // like model ids or image dimensions never become fake HTTP statuses. const PROVIDER_WRAPPED_HTTP_STATUS_RE = /^(?:[a-z][\w-]*(?:\s+[a-z][\w-]*){0,3}\s+)?api\s*error\s*\((\d{3})\)(?:\s*:\s*([\s\S]*))?$/i; +const LABELED_HTTP_STATUS_RE = + /^(?:status code|unexpected status|http status)\s*[:=]?\s*(\d{3})\b(?:\s*[:,]?\s*(?:message\s*:\s*)?([\s\S]*))?$/i; +const ERROR_STATUS_ENVELOPE_RE = /^error\s*[:,]\s*/i; const HTML_ERROR_PREFIX_RE = /^\s*(?:/i; const CLOUDFLARE_HTML_ERROR_CODES = new Set([521, 522, 523, 524, 525, 526, 530]); @@ -122,6 +125,27 @@ export function extractProviderWrappedHttpStatus( return extractHttpStatusMatch(raw.match(PROVIDER_WRAPPED_HTTP_STATUS_RE)); } +/** Extract an explicitly labeled provider HTTP status without matching embedded numeric text. */ +export function extractErrorHttpStatus(raw: string): { code: number; rest: string } | null { + const trimmed = raw.trim(); + const direct = + extractLeadingHttpStatus(trimmed) ?? + extractProviderWrappedHttpStatus(trimmed) ?? + extractHttpStatusMatch(trimmed.match(LABELED_HTTP_STATUS_RE)); + if (direct) { + return direct; + } + const unwrapped = trimmed.replace(ERROR_STATUS_ENVELOPE_RE, ""); + if (unwrapped === trimmed) { + return null; + } + return ( + extractLeadingHttpStatus(unwrapped) ?? + extractProviderWrappedHttpStatus(unwrapped) ?? + extractHttpStatusMatch(unwrapped.match(LABELED_HTTP_STATUS_RE)) + ); +} + export function isCloudflareOrHtmlErrorPage(raw: string): boolean { const trimmed = raw.trim(); if (!trimmed) {